`
ibluebox
  • 浏览: 2677 次
  • 性别: Icon_minigender_2
  • 来自: 无锡
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

vim笔记-常用命令和技巧

阅读更多

    如果在linux/unix上做系统维护或者开发,vim是最常用的编辑器之一,特别是在远程登录,没有图形界面的情况下,几乎是唯一选择。vim入门很简单,易于上手。深入使用,会逐步发现有很多快捷方式可以有效提高工作效率,值得学习。俗话说磨刀不误砍柴工。

     vim及其前身vi历史悠久,值得信赖。狂热者认为vi远胜UltraEdit,notePad之类的图形界面编辑器,不过我想这种说法仅限于开发或者系统维护人员。在ubuntu上做密集开发时,经常需要进行编辑配置文件,查看日志,更喜欢vi的简单,快速,高效。

 

  1976年左右Bill Joy开发了vi,技术不断进步,vi的各种变种也不断涌现,其中移植性最好、特性最多、使用最广的当属VIM,VIM主要是Bram Moolenaar开发的。vi是“Visual Interface”的缩写,而vim则表示 vi improved。通常也不用搞那么清楚,在ubuntu上vi命令就是指向vim的一个软链接。vim即vi,vi即vim,为了方便,统称vi。

 

 

vim的模式      

 

     Vim中有三类模式,正常模式(normal),插入模式(insert)和可视模式(visual)。

 

正常模式中可以执行命令,很多人也把这种模式称为命令模式。默认情况下,Vim启动后会进入这个模式。

插入模式中可以插入/编辑文本。

可视模式中可以可视化地选择一段文本,然后仅针对这段文本执行命令或操作。

 

    在模式中切换

         默认情况下,启动vim后进入到normal模式,Normal下输入i到insert模式,按<esc>返回normal模式。normal模式下按v进入visual模式。上面是最简单的切换方式。更多的切换方式有高人做了如下这个图:

 

               +---------+  i,I,a,A,o,O,r,R,s,S  +----------+
               | Normal  +---------->------------+ Insert   |
               | mode    |                       | mode     |
               |         +----------<------------+          |
               +-+---+---+        <Esc>          +----------+
                 |   |
                 |   |
                 |   |
                 |   |
                 |   |
           v,V   V   ^  <Esc>
                 |   |
                 |   |
                 |   |
                 |   |
             +---+---+----+
             | Visual     |
             | mode       |
             +------------+
(这张图是使用Vim和 Dr.Chip's DrawIt plugin制作的)

 

 

 

进入,退出

进入:vi(新文件)或者vi filename
退出:
:wq! --强制保存退出
:wq  -- 保存退出
:x   -- 作用和:wq 一样
ZZ  -- 作用和:wq一样,(注意Z是大写的,并且不是在命令模式)
:q  -- 退出,如果有修改会提示保存
:q! --  不保存而退出

插入命令

i:在当前字符之前插入
I:在当前行首插入
a:在当前字符之后插入
A:在当前行末插入
o:  在当前行下面打开一个新行进行插入
O:在当前行上面打开一个新行进行插入

编辑

x -- 删除当前字符,5x,删除从当前关闭位置开始向后的5个字符
cw -- 删除当前一个字,并进入编辑模式
dw -- 删除当前一个字,但仍处于命令模式
d0 --  删除当前光标到本行行首的所有内容
d$ --  删除当前光标到本行行尾的所有内容

D -- 同d$,更方便

dd -- 删除当前行
dgg -- 删除当前行至文件头的内容。
dG   删除当前行到文件末尾的所有内容。

ddp -- 上下两行掉换位置,实际上这个命令是由两个命令先后执行的结果,先dd,将当前行删除并copy到寄存器中,然后使用p命令将这行的内容paste到下一行(一个实用的命令组合)

:#,#d -- 例如,:12,37d 将删除第12~37行之间的所有文本,包括第12和37行 

J(大写字母)表示,其功能是把光标所在行与下面一行合并为一行
  nJ (大写字母)表示,其功能是把光标所在行与下面n行合并为一行

 

copy/paste

yy 拷贝当前行到缓存区
dd  删除当前行并拷贝到缓存区,相当于剪切

p:将缓存区的内容拷贝到下一行
P:拷贝到上一行

nyy:例如5yy,拷贝5行内容到缓存区。5dd类推

ab命令-快捷输入

:ab 简写 原始信息

示例:用ibluebox来替代完整的邮箱地址
:ab ibluebox ibluebox@gmail.com
(注意要按回车执行,如果按ESC,则没有起作用)
之后,在插入模式下,输入ibluebox后再按空格,就出现完整的"ibluebox@gmail.com",非常实用

 

移动光标

:n -- 跳到n行,如:5,跳到第5行
:$ --  将光标定位到最后一行
0  --  将光标定位到本行的行首
$   -- 将光标定位到本行的行尾
G  -- 将光标定位到本文章的最后一行,与:   $功能相同。

w,b -- 向后/者向前移动一个单词


- 将光标定位到上一行的行首 

+ 将光标定位到下一行的行首 

fb 将光标向前移到当前行上的下一个字母b(或者其他的任意指定的字符) 

Fb 将光标向后移到当前行上的上一个字母b(或指定的字符)

{ -- 段首 

}  -- 段尾
( -- 句首

) -- 句尾 (还没搞清楚段和句的分别

% -- 跳至匹配括号,支持原括号-(),大括号{},方括号[],但不支持尖括号<>(为什么?)


查找替换

查找
set ic------搜索(忽略大小写)
set noic----搜索(区分大小写)


/str -- 向下搜索str
?str-- 向上搜索
n -- 向前重复搜索
N -- 向后重复搜索

 

 

*  -- 向后查找光标下词(整词匹配,从使用习惯上来说,向后查找更自然,因此记住 * 就差不多可以了
# -- 向前查找光标下词(整词匹配)
g* -- 向后查找光标下字符串(不必是整词)
g# -- 向前查找光标下字符串(不必是整词)

 

 


替换
:%s/regexp/replacement/g替换文件中所有匹配式样

:%s/^/### 在所有行开头增加###

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
 
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
 
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
 
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky,n 为数字,若 n 为 .,表示从当前行开始到最后一行
 
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
 
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
 
  可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
 
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
 
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

 

撤销和重做(undo/redo)

撤销 --- u: 撤销上一次的更改

 

重做--- ctrl+r (可以进行多次undo和redo)

翻页

ctrl+f:  向下翻页
ctrl+b:向上翻页
ctrl+U和ctrl+D分别是向上和向下滚动半屏。
ctrl+E和ctrl+Y分别是向上和向下滚动一行。


排序

用外部的sort 程式協助排序

 

:1,12!sort -r -n -k4.1,5
-r 是降序排序
-n 是按数字大小排序
-k,表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束
-t 后面跟分隔符,缺省是空格

 

:1,$!sort -k 3
表示從第1列開始, 以第3 欄資料進行排序


:1,$!sort -k 4 -t"."
表示從第1列開始, 以第8 欄資料進行排序, 分欄字元是 "."
結果會如下 :
192.168.1.20
192.168.1.218
192.168.1.22
218 竟然排在 22 的前面? 是因為以"文字順序"排序的關係

:1,$!sort -k 4 -t"." -n

以数字大小排序

 

乱码/文件编码 相关设置

 

在大多数的linux系统上默认编码格式为UTF-8,而windows下默认的编码为GBK,所以在linux上用vi打开gbk编码的文件时就产生乱码。通过在~/.vimrc中增加如下设置,就可以正常打开显示中文:
  set fileencodings=utf-8,gb2312,gbk,gb18030
vim笔记-常用命令和技巧
 set fileencodings=utf-8,gb2312,gbk,gb18030
 
有些网上资料上说要增加下面的配置,但在我的ubuntu10.10上只需要增加上面一行配置就可以了。(另外prc不知何意)
termencoding表示终端编码
  set fileencodings=utf-8,gb2312,gbk,gb18030
  set termencoding=utf-8
  set encoding=prc
 
附:查看文件编码可以通过enca命令来看(ubuntu默认没有安装,通过sudo apt-get install enca 安装一下即可
enca /mnt/dshare/1.txt
显示如:
Simplified Chinese National Standard; GB2312  CRLF line terminators
关于编码方面的东东说起来很繁琐,有些细节问题本人也不大清楚,这里有篇文章介绍的还不错:

令人讨厌的vim打开文件时乱码,交给fencview搞定吧:http://blog.myspace.cn/e/402619135.htm

 


同时编辑多个文件

有时候经常在编辑一个文件的时候打开另一个文件来做查看。这时如果掌握了同时编辑多个文件的技巧,就不要反复退出,打开,再退出,再打开的看起来傻傻的步骤了

 

要分割屏幕显示多个不同文件,在vi命令提示符后输入:

  :split 2.txt -- 简写:sp 2.txt 水平切分新窗口,打开2.txt进行编辑
  :vsplit 2.txt -- 简写:vsp 2.txt,,垂直方向切分窗口

vi -o a b c /vi -O a b c  多窗口打开abc三个文件

窗口间的切换:

    ctrl + 两次按 w或者ctrl+w +上下左右方向键(或者hjkl)在窗口间切换

:qall -- 退出所有文件
:wall  -- 保存所有窗口口的修改

其他

 

:set 显示设置的所有选项 

:set all 显示所有可以设置的选项 

 

:set nu/set nonu:显示或者取消行号(nu-number的简写)

 

view filename -- 有时只需要查看而不需要修改,为了避免误写文件,可以使用这个命令来打开而不编辑。(使用w!还是可以强制保存内容的)

 

vim键盘图和思维导图

最后,来一张vim键盘快捷键图

vim键盘图

 

参考

 

中文在线手册

            http://vimcdoc.sourceforge.net/doc/usr_toc.html

            http://vimcdoc.sourceforge.net/doc/intro.html

 

vimdoc -- http://vimdoc.sourceforge.net/ englisth

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics