实践:VIM深入研究(20135301 && 20135337)

目录

一、基本知识
1.vim模式介绍
2.三种常用模式的切换
二、Vim文档编辑
1.vim重复命令
2.游标的快速跳转
3.复制粘贴和剪切
4.删除文本
5.字符的替换及撤销(Undo操作)
6.快速缩进
7.查找
三、高级功能
1.多文件编辑
2.可视模式
3.视窗操作
4.文档加密
5.帮助系统
6.功能设定
四、实用技巧
1.中文支持
2.鼠标支持
3.空格、制表符和缩进
4.模式行
5.寄存器
6.搜索、替换和正则表达式
7.自动完成和路径设定
8.文件跳转和 Tags
9.Make 和 grep
10.执行外部命令
11.定宽文本排版
12.其它小技巧
五、常用命令集合
六、C编程IDE的打造 && C语言编程插件 && 常用快捷键的支持

基本知识

vim模式介绍

以下介绍内容来自维基百科Vim

从vi演生出来的Vim具有多种模式,这种独特的设计容易使初学者产生混淆。几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数的编辑器使用了与Vim截然不同的方式:命令目录(鼠标或者键盘驱动),组合键(通常通过control键(CTRL)和alt键(ALT)组成)或者鼠标输入。Vim和vi一样,仅仅通过键盘来在这些模式之中切换。这就使得Vim可以不用进行菜单或者鼠标操作,并且最小化组合键的操作。对文字录入员或者程序员可以大大增强速度和效率。

Vim具有6种基本模式和5种派生模式,我们这里只简单介绍下6种基本模式:

1.普通模式(Normal mode)
在普通模式中,用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反(大多数编辑器默认模式为插入模式)。
Vim强大的编辑能来自于其普通模式命令。普通模式命令往往需要一个操作符结尾。例如普通模式命令dd删除当前行,但是第一个"d"的后面可以跟另外的移动命令来代替第二个d,比如用移动到下一行的"j"键就可以删除当前行和下一行。另外还可以指定命令重复次数,2dd(重复dd两次),和dj的效果是一样的。用户学习了各种各样的文本间移动/跳转的命令和其他的普通模式的编辑命令,并且能够灵活组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。
在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按a(append/追加)键或者i(insert/插入)键。
2.插入模式(Insert mode)
在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
在插入模式中,可以按ESC键回到普通模式。
3.可视模式(Visual mode)
这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。Vim的"文本对象"也能和移动命令一样用在这个模式中。
4.选择模式(Select mode)
这个模式和无模式编辑器的行为比较相似(Windows标准文本控件的方式)。这个模式中,可以用鼠标或者光标键高亮选择文本,不过输入任何字符的话,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
5.命令行模式(Command line mode)
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
6.Ex模式(Ex mode)
这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。

这其中我们常用到就是普通模式、插入模式和命令行模式。

三种常用模式的切换

vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车后保存并退出vim。

进入vim

1.使用vim命令进入vim界面

vim后面加上你要打开的已存在的文件名或者不存在(则作为新建文件)的文件名。 打开Xfce终端,输入以下命令

$ vim practice_1.txt
直接使用vim也可以打开vim编辑器,但是不会打开任何文件。

$ vim
进入命令行模式后输入:e 文件路径 同样可以打开相应文件。

2.游标移动

在进入vim后,按下i键进入插入模式。
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。

按键  说明
h   左
l   右(小写L)
j   下
k   上
w   移动到下一个单词
b   移动到上一个单词

进入插入模式

在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入

命令  说明
i   在当前光标处进行编辑
I   在行首插入
A   在行末插入
a   在光标后插入编辑
o   在当前行后插入一个新行
O   在当前行前插入一个新行
cw  替换从光标所在位置后到一个单词结尾的字符

保存文档

命令行模式下保存文档

从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下

退出vim

1.命令行模式下退出vim

从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑

以下为其它几种退出方式:

命令  说明
:q! 强制退出,不保存
:q  退出
:wq!    强制保存并退出
:w <文件路径>   另存为
:saveas 文件路径    另存为
:x  保存并退出
:wq 保存并退出

2.普通模式下退出vim

普通模式下输入Shift+zz即可保存退出vim

文档编辑

vim重复命令

1.重复执行上次命令

在普通模式下.(小数点)表示重复上一次的命令操作

拷贝测试文件到本地目录

$ cp /etc/protocols .
打开文件进行编辑

$ vim protocols
普通模式下输入x,删除第一个字符,输入.(小数点)会再次删除一个字符,除此之外也可以重复dd的删除操作

2.执行指定次数相同的命令

进入普通模式输入N,N表示重复后面的次数,下面来练习以下:

打开文件文件进行编辑

$ vim protocols
下面你可以依次进行如下操作练习:

输入10x,删除10个连续字符
输入3dd,将会删除3行文本
在普通模式下,你还可以使用dw或者daw(delete a word)删除一个单词,所以你可以很容易的联想到dnw(n替换为相应数字)表示删除n个单词

游标的快速跳转

普通模式下,下列命令可以让光标快速调转到指定位置,我们分别讨论快速实现行间跳转和行内跳转

1.行间跳转

命令 说明
nG(n Shift+g) 游标移动到第 n 行(如果默认没有显示行号,请先进入命令模式,输入:set nu以显示行号)
gg 游标移动到到第一行
G(Shift+g) 到最后一行
还是来练习一下吧:

使用vim打开练习文档

$ vim protocols
依次进行如下操作练习:

快速跳转到第9行,然后将其该行删除
回到第一行,向下删除8行
跳转到文档末,然后删除该行
小技巧:你在完成依次跳转后,可以使用Ctrl+o快速回到上一次(跳转前)光标所在位置,这个技巧很实用,比如当你在写代码时,忽然想起有个bug,需要修改,这时候你跳过去改好了,只需要按下Ctrl+o就可以回到你之前的位置。vim中会用很多类似的小技巧就等着你去发掘。

2.行内跳转

普通模式下使用下列命令在行内按照单词为单位进行跳转

命令  说明
w   到下一个单词的开头
e   到下一个单词的结尾
b   到前一个单词的开头
ge  到前一个单词的结尾
0或^ 到行头
$   到行尾
f<字母>   向后搜索<字母>并跳转到第一个匹配的位置(非常实用)
F<字母>   向前搜索<字母>并跳转到第一个匹配的位置
t<字母>   向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用)
T<字母>   向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)

复制粘贴和剪切

1.复制及粘贴文本

普通模式中使用y复制

普通模式中,yy复制游标所在的整行(3yy表示复制3行)
普通模式中,y^ 复制至行首,或y0。不含光标所在处字符。
普通模式中,y$ 复制至行尾。含光所在处字符。
普通模式中,yw 复制一个单词。
普通模式中,y2w 复制两个单词。
普通模式中,yG 复制至文本末。
普通模式中,y1G 复制至文本开头。
普通模式中使用p粘贴

普通模式中,p(小写)代表粘贴至光标后(下)
普通模式中,P(大写)代表粘贴至光标前(上)
打开文件进入普通模式练习上述命令,这会儿你就可以随意yy了,一 一+

$ vim protocols
2.剪切及粘贴

其实前面讲得dd删除命令就是剪切,你每次dd删除文档内容后,便可以使用p来粘贴,也这一点可以让我们实现一个很爽快的功能——交换上下行:

ddp,就这么简单,即实现了快速交换光标所在行与它下面的行

删除文本

普通模式下删除vim文本信息

进入普通模式,使用下列命令可以进行文本快速删除:

命令  说明
x   删除游标所在的字符
X   删除游标所在前一个字符
Delete  同x
dd  删除整行
dw  删除一个单词(不适用中文)
d$或D    删除至行尾
d^  删除至行首
dG  删除到文档结尾处
d1G 删至文档首部

除此之外,你还可以在命令之前加上数字,表示一次删除多行,如:

2dd表示一次删除2行

字符的替换及撤销(Undo操作)

1.替换和撤销(Undo)命令

替换和Undo命令都是针对普通模式下的操作

命令  说明
r+<待替换字母>   将游标所在字母替换为指定字母
R   连续替换,直到按下Esc
cc  替换整行,即删除游标所在行,并进入插入模式
cw  替换一个单词,即删除一个单词,并进入插入模式
C(大写)   替换游标以后至行末
~   反转游标所在字母大小写
u{n}    撤销一次或n次操作
U(大写)   撤销当前行的所有修改
Ctrl+r  redo,即撤销undo的操作

快速缩进

1.使用命令进行快速调整缩进操作

这一小节学习如何在vim中进行快速缩进,缩进操作均在普通模式下有效

打开文件进行编辑

$ vim protocols
普通模式下输入15G,跳转到15行
普通模式下输入>> 整行将向右缩进(使用,用于格式化代码超爽)
普通模式下输入<< 整行向左回退
普通模式下输入:进入命令行模式下对shiftwidth值进行设置可以控制缩进和回退的字符数

2.shiftwidth命令

shiftwidth命令是指上一节>>命令产生的缩进(可以简写成sw) 普通模式下输入:进入命令行模式下对shiftwidth值进行设置可以控制缩进和回退的字符数 获取目前的设定值

:set shiftwidth?
设置缩进为10个字符

:set shiftwidth=10
输入ESC回到普通模式,再次尝试>>看缩进量是否变化

3.调整文本位置

命令行模式下输入:ce(center)命令使本行内容居中

:ce
命令行模式下输入:ri(right)命令使本行文本靠右

:ri
命令行模式下输入:le(left)命令使本行内容靠左

:le

查找

1.快速查找

普通模式下输入/然后键入需要查找的字符串 按回车后就会进行查找。 ?与/功能相同,只不过?是向上而/是向下查找。 进入查找之后,输入n和N可以继续查找 n表示继续查找,N反向查找

2.快速查找练习

使用vim打开文件进行编辑

$ vim protocols
普通模式下输入/icmp查找字符串icmp
普通模式下输入n查找下一个icmp
普通模式下输入?tcp向上查找字符串tcp
普通模式下输入N查找上一个出现的tcp
3.高级查找

普通模式下输入*寻找游标所在处的单词
普通模式下输入#同上,但 * 是向前(上)找,#则是向后(下)找
普通模式下输入g*同* ,但部分符合该单词即可
普通模式下输入g#同# ,但部分符合该单词即可
以上查找n,N 的继续查找命令依然可以用

高级功能

多文件编辑

1.使用vim编辑多个文件

编辑多个文件有两种形式,一种是在进入vim前使用的参数就是多个文件。另一种就是进入vim后再编辑其他的文件。 同时创建两个新文件并编辑

$ vim 1.txt 2.txt
默认进入1.txt文件的编辑界面

命令行模式下输入:n编辑2.txt文件,可以加!即:n!强制切换,之前一个文件的输入没有保存,仅仅切换到另一个文件
命令行模式下输入:N编辑1.txt文件,可以加!即:N!强制切换,之前文件内的输入没有保存,仅仅是切换到另一个文件
2.进入vim后打开新文件

命令行模式下输入:e 3.txt 打开新文件3.txt
命令行模式下输入:e# 回到前一个文件
命令行模式下输入:ls可以列出以前编辑过的文档
命令行模式下输入:b 2.txt(或者编号)可以直接进入文件2.txt编辑
命令行模式下输入:bd 2.txt(或者编号)可以删除以前编辑过的列表中的文件项目
命令行模式下输入:e! 4.txt,新打开文件4.txt,放弃正在编辑的文件
命令行模式下输入:f 显示正在编辑的文件名
命令行模式下输入:f new.txt,改变正在编辑的文件名字为new.txt
3.恢复文件

如果因为断电等原因造成文档没有保存,可以采用恢复方式,vim -r进入文档后,输入:ewcover 1.txt来恢复

$ vim -r 1.txt

可视模式

1.可视模式命令简介

在普通模式下输入v(小写),进入字符选择模式,就可以移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。
在普通模式下输入Shift+v(小写),进���行选择模式,按下V之后就会把整行选取,您可以上下移动光标选更多的行,同样,再按一次Shift+v就可以取消选取。
在普通模式下输入 Ctrl+v(小写),这是区域选择模式,可以进行矩形区域选择,再按一次Ctrl+v取消选取。
在普通模式下输入d删除选取区域内容
在普通模式下输入y复制选取区域内容
2.可视模式命令练习

拷贝练习文件到当前目录

$ cp /etc/protocols .
打开练习文件

$ vim protocols
在普通模式下9G跳转到第9行,输入Shift+v(小写V),进入可视模式进行行选择,选中5行,按下>>缩进,将5行整体缩进一个shiftwidth
在普通模式下输入 Ctrl+v(小写v),进入可视模式进行矩形区域选择,选中第一列字符然后x删除整列

视窗操作

1.视窗操作简介

vim可以在一个界面里打开多个窗口进行编辑,这些编辑窗口称为vim的视窗。 打开方法有很多种,例如可以使用在命令行模式下输入:new 打开一个新的vim视窗,并进入视窗编辑一个新文件(普通模式下输入Ctrl+w也可以,但是Ctrl+w在chrome下会与chrome关闭标签页的快捷键冲突,所以使用该快捷键你可以在IE或其它浏览器进行练习),除了:new命令,下述列举的多种方法也可以在命令模式或普通模式下打开新的视窗:

命令行模式下输入:sp 1.txt 打开新的横向视窗来编辑1.txt
命令行模式下输入:vsp 2.txt 打开新的纵向视窗来编辑1.txt
普通模式下Ctrl-w s 将当前窗口分割成两个水平的窗口
普通模式下Ctrl-w v 将当前窗口分割成两个垂直的窗口
普通模式下Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
普通模式下Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗
普通模式下Ctrl-w j 移至下面视窗
普通模式下Ctrl-w k 移至上面视窗
普通模式下Ctrl-w h 移至左边视窗
普通模式下Ctrl-w l 移至右边视窗
普通模式下Ctrl-w J 将当前视窗移至下面
普通模式下Ctrl-w K 将当前视窗移至上面
普通模式下Ctrl-w H 将当前视窗移至左边
普通模式下Ctrl-w L 将当前视窗移至右边
普通模式下Ctrl-w - 减小视窗的高度
普通模式下Ctrl-w + 增加视窗的高度
2.视窗操作练习

打开练习文件

$ vim 1.txt
命令行模式下输入:new 打开一个新的vim视窗
命令行模式下输入:sp 2.txt 打开新的横向视窗来编辑2.txt
命令行模式下输入:vsp 3.txt 打开新的横向视窗来编辑3.txt
如果使用非chrome浏览器可以使用Ctrl+w进行视窗间的跳转
分别在不同视窗的命令行模式下输入:q!退出多视窗编辑

文档加密

创建加密文档

$ vim -x file1
输入您的密码 确认密码 这样在下一次打开时,vim就会要求你输入密码

在vim执行外部命令

在命令行模式中输入!可以执行外部的shell命令

:!ls 用于显示当前目录的内容
:!rm FILENAME用于删除名为 FILENAME 的文件
:w FILENAME可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件

帮助系统

vim中的查看帮助

普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
命令行模式下输入:ver 显示版本及参数

功能设定

1.vim的功能设定

可以在编辑文件的时候进行功能设定,如命令行模式下输入:set nu(显示行数),设定值退出vim后不会保存。要永久保存配置需要修改vim配置文件。 vim的配置文件~/.vimrc,可以打开文件进行修改,不过务必小心不要影响vim正常使用

2.获取目前的设定

命令行模式下输入:set或者:se显示所有修改过的配置
命令行模式下输入:set all 显示所有的设定值
命令行模式下输入:set option? 显示option的设定值
命令行模式下输入:set nooption 取消当期设定值

3.set功能的说明

命令行模式下输入:set autoindent(ai) 设置自动缩进
命令行模式下输入:set autowrite(aw) 设置自动存档,默认未打开
命令行模式下输入:set background=dark或light,设置背景风格
命令行模式下输入:set backup(bk) 设置自动备份,默认未打开
命令行模式下输入: set cindent(cin) 设置C语言风格缩进

实用技巧

中文支持

Vim 支持世界上的主要语言,当然也包括中文。如果你用 Vim 编辑中文,而中文不能正确显示,那有两种可能性:一是使用的 Vim 不完整,不含多字节语言支持(multi_byte 特性);二是某个配置出了问题。

说到多语言支持,最基本的概念有两个:一是文件的语言编码,而是环境的内部编码。在较老的操作系统中,不管 Linux 还是 Windows,这两个编码都是一样的,也就意味着,一次只能处理一种编码的文件:要么只能处理西文编码(Latin1,即 ISO-8859-1 [5]),要么只能处理中文编码(GB2312 [2])。而在新的操作系统中,这两者可以是不一样的。在 Linux 上,常见的情况是环境的内部编码使用 UTF-8 [6],而 UTF-8 可以同任何一种语言编码作无损转换,这就保证了系统的多语言处理能力。Vim 这方面秉承了 Unix/Linux 的传统,在内部编码使 UTF-8 的时候,可以同时处理不同意语言编码的文件。

以下列出了和语言编码的相关的设置:

●环境变量 LANG(使用的语言);
●环境变量 LC_CTYPE(使用的内部编码);
●Vim 选项 encoding(Vim 的内部编码);
●Vim 选项 termencoding(Vim 在与屏幕/键盘交互时使用的编码);
●Vim 选项 fileencoding(Vim 当前编辑的文件在存储时的编码);
●Vim 选项 fileencodings(Vim 打开文件时的尝试使用的编码);
●Vim 选项 ambiwidth(对“不明宽度”字符的处理方式;Vim 6.1.455 后引入)

如果你的环境只需要处理简体中文的话,那么,最简单的方式就是所有的设定全部使用简体中文。只需要:设定 LANG=zh_CN.GB2312,不设定 LC_CTYPE(默认跟 LANG 一样),不设定与编码相关的 Vim 选项(默认由 LANG 和 LC_CTYPE 决定),也无需设定 Vim 选项 ambiwidth。也就是说,我们把语言设定为中国(CN)使用的中文(zh),编码为 GB2312(注意:Vim 内部并不识别国标 GB18030 [3],所以此处只能设 GB2312;参看下面关于 UTF-8 的讨论)。

不过,如果按照目前 Linux 下的惯例,内部编码一律使用 UTF-8 的话,会有一些额外的好处,其中之一就是在这种情况下 Vim 支持同时编辑多种不同编码的文件,如简体中文和繁体中文(参见图 2);另外,此时 Vim 也可以通过编码转换支持 GBK [4] 和 GB18030了。这样,众多关于语言编码的 Vim 选项就有了用武之地了。下面进一步说明一下这些选项和推荐设定(如果适用的话):

●encoding=utf-8:不管文件的编码如何,不管如何显示和输入,Vim 内部使用的编码是 UTF-8;这是国际化支持的基础。    
●termencoding:取决于实际的终端或 X Window 的设定。举例来说,如果选择语言简体中文登录到 X Window,或者正在使用 CXTERM [10] 的话,那么该选项应被设为 GB2312;如果使用缺省的语言(LANG=en_US.UTF-8)登录到 X Window,或者使用 PuTTY [11] 远程访问 Linux 机器、并且设定里的字符编码(配置中 Window-Translation)设为 UTF-8 的话,该选项就应该设为 utf-8。从 Windows 下使用 PuTTY 远程连接 Linux 的请特别注意,测试表明,仅在使用 UTF-8 的情况下,PuTTY 才能可靠地支持中文的显示和输入(显示字体必须设成中文字体)。    
●fileencoding:文件载入时,该选项被置为 Vim 认定的文件编码,因此,存储时文件的编码不会改变。此处和下面 fileencodings 可使用的编码为 libiconv 支持的所有几百种编码(如果编译时包含了 iconv 特性的话),与中文相关的有 gb2312、gbk、gb18030、hz-gb-2312、iso-2022-cn、big5、cp936、cp950 等。如果创建新文件,你又不希望使用 UTF-8 作为文件编码时,那么,你可能需要手工设定该选项,如“:set fileencoding=gb2312”。需要注意的一点是,使用“set”来设定该选项的话会改变以后新建文件的缺省编码,而使用 “setlocal”的话则只影响当前文件(参考“:help setlocal”)。   
●fileencodings=ucs-bom,utf-8,chinese:Vim 会首先判断文件的开头是否是一个 Unicode [7] 的 BOM(byte order mark)字符 [8],是的话则把文件的其余内容解释成相应的 Unicode 序列;否的话再试图把文件内容解释成 UTF-8 的序列;再失败的话,则把文件解释为简体中文(chinese 是一个跨平台的简体中文字符集的别名,Linux 下相当于 gb2312 和 euc-cn;此处也可以根据需要以 gb2312、gbk 或 gb18030 等编码替代)。需要注意的是,该顺序不能颠倒,并且在后面再添加其它编码如 big5、latin1 也是没有意义的,因为 Vim 不能识别 8 比特编码中的错误,因此这些编码后列的编码永远不会被用到。    
●ambiwidth=double:把所有的“不明宽度”字符 [9]——指的是在 Unicode 字符集中某些同时在东西方语言中使用的字符,如省略号、破折号、书名号和全角引号,在西方文字中通常字符宽度等同于普通 ASCII 字符,而在东方文字中通常字符宽度等同于两倍的普通 ASCII 字符,因而其宽度“不明”——的宽度置为双倍字符宽度(中文字符宽度)。此数值只在 encoding 设为 utf-8 或某一 Unicode 编码时才有效。需要额外注意的是,如果你通过终端使用 Vim 的话,需要令终端也将这些字符显示为双宽度。比如,XTERM [12] 的情况下应该使用选项“-cjk”,即使用命令“uxterm -cjk”来启动使用双宽度显示这些字符的 Unicode X 终端;使用 PuTTY 远程连接的话则应在配置的 Window-Translation 中选中“Treat CJK ambiguous characters as wide”(参见图 3)。

需要设定的选项通常放在用户的 Vim 资源配置文件中,即在 ~/.vimrc 文件中加入:

 set encoding=utf-8
 set fileencoding=chinese
 set fileencodings=ucs-bom,utf-8,chinese
 set ambiwidth=double

如果想进一步了解这些选项的话,可以使用“:help ‘选项’”查看帮助文档中的相关(英文)信息。帮助中也可以查到这些选项(以及命令)的缩写:本文中为方便理解,除一些极少有人使用完整拼写的命令如 “:e(dit)”、“:s(ubstitute)”等之外,一般使用完整拼写而不说明或使用缩写。关于配置文件 .vimrc,可以使用“:help .vimrc”查看相关信息。

在使用内部编码 UTF-8 的情况下,如需编辑 fileencodings 之外(其不能自动识别)的文件,则可以使用以下命令:“:e ++enc=编码 文件名”。详情可参考“:help ++enc”。

鼠标支持

不管是文本界面还是图形界面的 Vim,都支持鼠标。不过,在文本界面中,鼠标支持缺省没有被激活;这就意味着,在终端上使用鼠标,所有的功能仍和没有使用 Vim 时相同,并不受 Vim 影响。要激活文本界面中的鼠标支持也很容易,只需要执行一句“:set mouse=a”即可。

启用了鼠标支持之后,Vim 主要支持的鼠标操作有:

●单击移动光标到点击的位置;

●在帮助的关键字上双击显示该关键字相关的帮助信息;

●在普通文本上双击选中点击位置的单词;

●拖动鼠标选中文本;

●使用鼠标滚轮滚动当前缓冲区中的文本;

●多窗口编辑时可以拖动窗口分栏的位置。

进一步的信息可参看“:help ‘mouse’”、“:help mouse-using”和“:help scroll-mouse-wheel”。

特别需要值得一提的是,在远程访问 Linux 系统时也是可以使用鼠标的。如果使用 X Window 系统,自然不必说;而使用 SSH 远程连接时,大部分 Linux 下的终端客户程序,如 XTERM、GNOME-Terminal [13]、较新版本的 Konsole [14],以及 Windows 下的 PuTTY,支持鼠标的使用:你只需简单地启动 Vim、执行一句“:set mouse=a”就可以了(当然,也可以把上面的语句去掉起始的冒号放到 .vimrc 文件中)。

空格、制表符和缩进

对于编写代码,缩进是最基本的概念之一。至于缩进是使用空格还是制表符(Tab),或者缩进是否正好使用一个制表符来表示,很多程序员,特别是 Windows 开发出身的程序员,很容易混淆。幸好,Vim 对于这些概念有非常完整的支持,足以应付各种复杂的情况。以下是相关的主要 Vim 选项:

●shiftwidth(缩进的空格数);

●tabstop(制表符的宽度);

●expandtab(是否在缩进和遇到 Tab 键时使用空格替代;使用 noexpandtab 取消设置);

●softtabstop(软制表符宽度,设置为非零数值后使用 Tab 键和 Backspace 时光标移动的格数等于该数值,但实际插入的字符仍受 tabstop 和 expandtab 控制);

●autoindent(自动缩进,即每行的缩进值与上一行相等;使用 noautoindent 取消设置);

●cindent(使用 C 语言的缩进方式,根据特殊字符如“{”、“}”、“:”和语句是否结束等信息自动调整缩进;在编辑 C/C++ 等类型文件时会自动设定;使用 nocindent 取消设置);

●cinoptions(C 语言缩进的具体方式,请参考“:help cinoptions-values”);

●paste(粘贴模式,会取消所有上述选项的影响来保证后面的操作——通常是从剪贴板粘贴代码——保持原有代码的风格;使用 nopaste 取消设置)。

下面给出一些常用的组合:

●shiftwidth=4 tabstop=4:很多 Windows 出身的程序员会习惯这样的设置,让缩进等于制表符宽度。

●shiftwidth=4 tabstop=8:很多 Unix 程序员的设置,仍使用较常用的 4 格缩进,但制表符宽度为标准的 8。

●cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:标准的 GNU 编码风格的设置,对 Vim 缺省的 C 缩进风格作了很多微调,比如,if 语句下的“{”、“}”要在“if”后缩进两格,但函数定义部分“{”、“}”仍和函数名一行对齐。开源软件经常使用该种缩进风格。

在编辑代码时一个很有用的命令是调整代码缩进,可以很方便地增加(或减少)若干级缩进,并自动根据选项设定使用正确的空格或制表符。只需要使用 “V”选中你要调整的代码行,然后键入“<”(或“>”)即可增加(或减少)一级缩进;在键入“<”(或“>”)之前键入数字则 可以指定增加(或减少)的缩进级数。

我们要讨论的最后一个相关的命令是“:retab”。在设定了 expandtab 选项时,该选项会把所有的制表符转换成空格。在没有设定 expandtab 选项时,使用“:retab!”可把空白字符转换成制表符(可能误转换,慎用),使用“:retab n”可以把 tabstop 重置为 n,并转换含制表符的连续空白字符为适当的制表符和空格的组合以保证含制表符的行看起来没有任何变化。详细信息请参看“:help :retab”。

模式行(modeline)

没人愿意每次都手工输入一大堆的 Tab 和缩进设定。可是,放在 .vimrc 文件中似乎也不是个好主意:如果我编辑的代码不止一种风格呢?——考虑一下,如果你参加开源软件项目,你能保证你参加的所有项目,还有你公司里的软件项 目,代码风格都一样吗?——Vim 是我用过的第一个支持在文件中记录代码风格设定的编辑器。这个特性在 Vim 中叫做模式行,实际上,它所做的是在打开文件时根据文件中的 Vim 指令设定相关的 Vim 选项。下面就是一个嵌在 C 源代码中的模式行:

/* vim: set tabstop=4 shiftwidth=4 expandtab: /
模式行有好几种形式。本文只介绍上面的这种形式(其它形式类似,请自行参考“:help modeline”):行首的“/
”和尾部的“*/”告诉 C 编译器这是一行注释,不是代码的一部分;而 Vim 可通过后面的“vim:”识别出模式行的开始(必须出现在行首或前面有一个空白字符);后面则是“set”和空格间隔开的一串 Vim 选项;“:”表示模式行结束。

这种方式非常简单,功能也非常强大。另外请注意,出于安全的考虑,模式行中的选项只影响当前文件(“:help modeline-local”),也不能做任何设置选项以外的工作。

寄存器

通常的编辑器有一个剪贴板,以存储复制和剪切的内容。Vim 中的类似概念叫做寄存器(register)。除了有一个无名寄存器外,Vim 还有一大堆有名的寄存器,可以通过“””(参见“:help “”)或“Ctrl-R”(参见“:help i_CTRL-R”和“:help c_CTRL-R”)加寄存器名(字母、数字和某些特殊字符,参见“:help registers”;“无名”寄存器的名字是“””)来访问。比如,你先使用“”ayy”复制了一行,然后使用“dd”删掉了一行,然后移动光标到要复 制到的位置,就可以使用“”aP”把先前复制的内容粘贴上去了。手工编辑是有名寄存器的作用还不是很大,但当你想让 Vim 通过类似于宏的方式自动完成工作时,有名寄存器就变成不可缺少的重要功能了。下面我们还会用到。

在使用 X Window 系统时,有两个特殊的寄存器是需要注意一下的:“”*”访问的寄存器是 X 的主选择区域(primary selection),“”+”访问的寄存器是 X 的剪贴板(clipboard)。如果你要在 Vim 和其它的 X 应用程序之间复制文本内容,你可以试一下这两个寄存器。

还有一个很特殊的“寄存器”:“=”。在插入模式或命令模式中,键入“Ctrl-R=”,Vim 会提示你输入一个表达式,普通的整数运算在此完全有效。如果想要进行浮点运算,请参见第 3.2 节中的技巧。

搜索、替换和正则表达式

大家应该都已经知道 Vim 里使用“/模式”(或“?模式”)进行搜索,使用“:s/模式/字符串/标志”进行替换,其中的“模式”是一个正则表达式。关于正则表达式,不熟悉的话可 以边用边学,本节也不打算对 Vim 的正则表达式作完整的阐述(那可能可以专门写一本小册子了),而只抛砖引玉式地给出一些有用的例子加以说明,以及一些实用技巧。

先说一点点搜索。搜索里最最有用的一个快捷方式是“”(向下完整匹配光标下的单词)。把光标移动到你要搜索的词(变量名、函数名等)上,比如 “test”,然后按“”,Vim 将自动产生一个对“\ ”(参见“:help /\<”和“:help />”)的搜索,也就是说,搜索完整的单词“test”。不要小看这个技巧,它经常可以大幅度地提高搜索的速度。事实上,这是 Vim 网站上公布的第 1 号技巧,也是被评价最高的技巧。相似的技巧还有“#”(向上完整匹配光标下的单词)、“g*”(向下部分匹配光标下的单词)等,请自行查看(“:help #”等)。

Vim 在搜索和替换时会对匹配成功的文本进行加亮,在已经完成搜索和替换任务后,这种加亮有时反而会妨碍显示。Vim 专门提供一个命令取消这种加亮(直到用户再一次使用搜索或替换命令):“:nohlsearch”。建议用户创建一个键盘映射(key mapping)加入到 .vimrc 中,如:

nmap:nohlsearch
以上命令表示,在正常模式下按 F2 键相当于输入“:nohlsearch”后面跟一个回车,即取消搜索加亮显示。

再看几个搜索替换的实用例子。

●去掉所有的行尾空格:“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对 前面的字符匹配一次或多次(越多越好),“$”匹配行尾(使用“\$”表示单纯的“$”字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊 标志。这个还是比较简单的。

●去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。这回多了“\(???\)”、“\n”、“\r”和“*”。“*”代表对前 面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回车符,“\(??? \)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为 一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是历史造成的,详情如 果有兴趣的话可以查看“:help NL-used-for-Nul”。

●去掉所有的“//”注释:“:%s!\s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/” 字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒 是相当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。

●去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的 字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。

希望上面的这些简单的例子能够引起你使用 Vim 的正则表达式高效完成任务的兴趣。进一步的信息可参考“:help regexp”。

自动完成和路径设定

Vim 支持单词的自动完成。比如,你前面使用了一个很长的变量名,叫 aLongVariable,下面你在输入时,就不用完整键入了。很可能,你只需要键入“aL”,然后按下“Ctrl-P”(向前搜索可匹配的单词并完 成)就可以得到完整的变量名(没有得到想要的结果的话,多按几下“Ctrl-P”;或者前面多输入几个字符,如“aLongV”)。类似的命令还有 “Ctrl-N”(向后搜索可匹配的单词并完成)、“Ctrl-X Ctrl-L”(搜索可匹配的行并完成)、“Ctrl-X Ctrl-F”(搜索可匹配的文件名并完成)等,具体可参看“:help ins-completion”。

如果你并不熟悉这些功能,但也并不觉得这有什么稀奇的话,下面这个例子可能会让你觉得吃惊。请尝试打开一个空白的 C 文件(vim test.c),并输入:

 #include
 int main()
 {
 pri

最后一行不要回车,直接在“pri”后面输入“Ctrl-P”,你将看到“printf”出现。是的,虽然文件里没有“printf”,但 Vim 知道到哪里去寻找它!在作关键字匹配完成时,如果当前文件和其它打开的文件中没有想要的结果,Vim 会自动到“#include”的文件中进行进一步的搜索(为什么是“#include”呢?请查阅“:help ‘include’”),搜寻的目录则由选项 path 决定,其缺省值在 Unix(含 Linux)下为“.,/usr/include,,”,代表搜索的目录依次是文件所在目录、/usr/include 和当前目录。根据实际情况,你可能需要在 .vimrc 文件中设置该选项,加入项目相关的包含目录,注意一般要保留最后的“,,”,除非你不需要在当前目录下搜索。

设置了合适的 path 后,另外带来的一个便利就是可以使用“gf”命令方便地跳转到光标下的文件名所代表的文件中。在上面的例子中,把光标移到“stdio.h”的任一字符 上,键入“gf”,则 Vim 会自动打开 /usr/include/stdio.h 文件。使用“Ctrl-O”(参见“:help CTRL-O”)可返回到原先的文件中。

文件跳转和 Tags

大家一般都知道,在 Vim 的帮助窗口中的关键字上双击鼠标或者键入“Ctrl-]”即可跳转至该关键字相关的帮助主题。不过,“跳转至匹配的关键字”这一功能并不仅仅局限于帮助文 件。只要有合适的 tags 文件(参见“:help tags-file-format”),我们同样可以在源代码中使用这个方便的功能,跳转到与关键字匹配的“标记”处(通常是源代码中某一函数、类型、变 量或宏的定义位置)。

要产生 tags 文件,通常我们使用 Exuberant Ctags [15]。一般的 Linux 发布版中均带有这一工具。Ctags 带有的选项数量极多,此处我们仅简单介绍如何在一个典型的多文件、多层目录的项目中使用其基本功能:我们只需在项目的根目录处键入“ctags -R .”,Ctags 即可自动在文件中查找、识别支持的文件格式、生成 tags 文件。目前 Exuberant Ctags 支持多达 33 种编程语言 [16],包括了 Linux 下常用的 C、C++、Java、Perl、PHP 等。有了 tags 文件,以下的 Vim 命令就可以方便使用了(进一步的信息可参考“:help tags-and-searches”):

●:tag 关键字(跳转到与“关键字”匹配的标记处)

●:tselect [关键字](显示与“关键字”匹配的标记列表,输入数字跳转到指定的标记)

●:tjump [关键字](类似于“:tselect”,但当匹配项只有一个时直接跳转至标记处而不再显示列表)

●:tn(跳转到下一个匹配的标记处)

●:tp(跳转到上一个匹配的标记处)

●Ctrl-](跳转到与光标下的关键字匹配的标记处;除“关键字”直接从光标位置自动获得外,功能与“:tags”相同

●g](与“Ctrl-]”功能类似,但使用的命令是“:tselect”)

●g Ctrl-](与“Ctrl-]”功能类似,但使用的命令是“:tjump”)

●Ctrl-T(跳转回上次使用以上命令跳转前的位置)

当我们在项目的根目录下工作时,上面这些命令工作得很好。但如果我们进到多层目录的里层再运行 Vim 打开文件时,这些命令的执行结果通常就变成了错误信息“E433: No tags file”。这是因为缺省 Vim 只在文件所在目录和当前目录下寻找 tags 文件,而我们前面只在项目的根目录下生成了 tags 文件,Vim 无法找到该文件。解决方法有好几种,我认为一般较简单的做法是对每个项目都在 .vimrc 文件中增加一个路径相关设定。假设我们有两个项目,位置分别是 /home/my/proj1 和 /home/my/proj2,那我们可以使用:

 au BufEnter /home/my/proj1/* setlocal tags+=/home/my/proj1/tags
 au BufEnter /home/my/proj2/* setlocal tags+=/home/my/proj2/tags

Vim 选项 tags 用于控制检查的 tags 文件,缺省值为“./tags,tags”,即前面所说的文件所在目录下和当前目录下的 tags 文件。上面两行自动命令告诉 Vim,在打开项目目录下的文件时,tags 选项中的内容要增加项目的 tags 文件的路径。进一步信息可参看“:help ‘tags’”。

Make 和 grep

Make [17] 和grep [18] 应当算是 Unix 世界里无人不晓的基本工具了吧。很自然的,Vim 对它们有着特殊的支持。该支持主要通过访问一个特殊的快速修订窗口(quickfix window)来实现。直接在 Vim 的命令模式里输入相应的 make 或 grep 命令(如“:grep foo *.c”)即可将命令的执行结果放入该窗口,同时根据返回的结果跳转到第一个错误(make 的情况;在使用 grep 时是匹配成功之处)。以下是常用的“快速修订”命令:

●:cn(显示下一个错误)

●:cp(显示上一个错误)

●cl(列出所有的错误及其编号)

●:cc(跳转到指定编号的错误)

●:copen(打开快速修订窗口,在其中显示所有错误,可在错误上双击鼠标或按回车键跳转至该错误;示例参见图 4)

●:cclose(关闭快速修订窗口)

Vim 的这个特性也可以与 make 和 grep 以外的程序一起工作(事实上,在 Windows XP 上,“:grep”命令一般调起的是“findstr /n”)。具体调用那个程序由选项 makeprg(Linux 下缺省为“make”)和 grepprg(Linux 下缺省为“grep -n $* /dev/null”)控制,而如何解析返回的内容则由选项 errorformat 和 grepformat 控制。鉴于在 Unix/Linux 下一般不需更改这些选项的内容,此处不再详述。

执行外部命令

在“:make”这样的命令中,Vim 会自动调用外部的程序。用户当然也可以自己执行外部的程序:估计很多的人都已经知道了用“:!命令”可以在 Vim 中执行一个外部命令。不过,估计大部分人都不知道,还有其它一些命令可以执行外部命令,并且,即使“:!”命令里面也有一些技巧可以使用。

最正规的执行外部命令的方法,如前所述,就是“:!”。比如,我们想要显示当前目录下的所有文件,就可以直接执行:“:!ls”。Vim 会在一个终端窗口中进行文件列表,然后提示我们按键返回 Vim 中。事实上,这种方式对于“cp”、“rm”这样基本不需要输出的命令比较实用,而对于“ls”这样关注于输出的命令并不太适用。

如果想把外部命令执行的结果插入到当前编辑的缓冲区中,可以考虑使用“:r!”。比如,我们使用“:r!ls”,就可以把“ls”命令的执行结果插入到缓冲区中光标所在行下面。在使用宏时,这可能会特别有用。

Vim 的“:!”命令还有一个特别强大的技巧可以使用。拿一个实际例子,我们需要对在一个文件的每一行之前插入一个编号,该怎么做呢?——用 Vim 的宏或者脚本可以完成这一工作,但这不是最高效、最灵活的工作方式。Linux 下一般带有的 GNU 的 nl,可以用非常灵活的方式来完成这一任务——要对所有的非空行进行编号,只需要“:%!nl”;要对包含空行的所有行进行编号?OK,“:%!nl -ba”。

稍作一点解释。当使用可视模式选中文本行后然后键入“:!”(命令行上将出现“:’<,’>!”,表示命令的范围是选定的文本),或者 使用“:%!”(表示命令的范围是整个缓冲区中的文本),Vim 在执行后面的命令时,将把命令范围里的文本行作为后面执行的命令标准输入,并用命令执行后的标准输出替换当前缓冲区中的这些文本行。这就是上面的命令行的 工作原理。

定宽文本排版

在传统的 Unix 环境下,文本文件的定义是具有一定长度限制的文本行的组合 [19]。虽然 Vim 本身对行的长度没有任何实际的限制,但有一些工具有这样的限制。为了最大程度的兼容性,也为了在显示、打印等处理上比较方便,一般推荐在邮件和源代码中一 般不要超出 72 列(最多不超出 80 列)。Vim 在处理定宽的文本方面具有特殊的支持能力。下面是一个在 Vim 中把行宽(使用选项 textwidth)设为 40 后输入 Harry Potter and the Half-Blood Prince 的第一句话的结果:

It was nearing midnight and the Prime
Minister was sitting alone in his
office, reading a long memo that was
slipping through his brain without
leaving the slightest trace of meaning
behind.

输入时我只使用了英文字母和空格,换行符都是 Vim 自动插入的。如果在某一行加入或删除了一些字符后行不就不齐了吗,该如何处理?很简单,把光标移到要重新格式化的文本开头,使用“gq”命令后面跟一个光 标移动命令确定重新格式化的范围。比如“gq}”(格式化一段),“gq5j”(格式化 5 行),“gqG”(格式化至文件末尾)。

除了选项 textwidth 外,选项 formatoptions 确定了跟文本格式化有关的基本选项,常用的数值有:

●t:根据 textwidth 自动折行;

●c:在(程序源代码中的)注释中自动折行,插入合适的注释起始字符;

●r:插入模式下在注释中键入回车时,插入合适的注释起始字符;

●q:允许使用“gq”命令对注释进行格式化;

●n:识别编号列表,编号行的下一行的缩进由数字后的空白决定(与“2”冲突,需要“autoindent”);

●2:使用一段的第二行的缩进来格式化文本;

●l:在当前行长度超过 textwidth 时,不自动重新格式化;

●m:在多字节字符处可以折行,对中文特别有效(否则只在空白字符处折行);

●M:在拼接两行时(重新格式化,或者是手工使用“J”命令),如果前一行的结尾或后一行的开头是多字节字符,则不插入空格,非常适合中文

上面提到的注释,可以是 C/C++ 中的“//”和“/*”,也可以是邮件中引用原文使用的“>”等字符(具体由 comments 选项控制;参见“:help ‘comments’”)。Vim 在遇到这些字符时,能够相当智能地进行处理,足以完成日常编辑源代码和邮件的需要。在使用一些处理纯文本不够强大的邮件客户端时,我通常使用 Vim 编辑邮件(特别是英文邮件),然后把结果贴回到邮件编辑窗口中进行发送。

Vim 中 formatoptions 的缺���值是“tcq”,一般我会在 .vimrc 文件中加入一行“set formatoptions+=mM”来确保 Vim 能在中文字符之间折行而不要求空格的存在,并且在大部分情况下可以正确地处理中文重新格式化。

其它小技巧

窗口命令

= ctrl+w
:split 文件名 同时在一个页面显示多个文件的内容,类似多窗口,用切换当前窗口
f 切分显示光标在处的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #include 语句中的文件
_ 当同时打开几个文件时,按 _ 使当前窗口最大化
用Ctrl-W命令指定光标移动:

  Ctrl-W +       扩大窗口
  Ctrl-W -       缩小窗口
  Ctrl-W h       移动到窗口左边
  Ctrl-W j       移动到窗口下边
  Ctrl-W k       移动到窗口上边
  Ctrl-W l       移动到窗口右边

等于是按下后,松开键盘,再按下一个命令就可以了.
如果要关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。
多窗口是split,像用e打开多个文件是将文件放在缓冲区中。

折叠代码

可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)

缓冲区跳转

:n 编辑下一个文件。
:2n 编辑下二个文件。
:N 编辑前一个文件。注意,这种用法只能用于 argument list 的情形。
:rew 回到首文件
:args 查看当前编辑缓冲文件状态
:e# 或 Ctrl-^ 编辑前一个档案,用于两文件互相编辑时相当好用。这种用法不管是 argument list 或buffer list 档案间皆可使用。 使用Ctrl-^ 命令更便捷,但如终端类型不正确该功能将无效。
用:ls来显示缓冲区中的文件,编号后边有#的代表是前一个文件,可以通过:e#来进入,有%a的代表是当前文件,什么也没有的可以通过:bn来进入,这里的n代表文件编号。
:b文件名或编号 移至该文件。
在 :ls 中就会出示各文件的编号,这个编号在未离开 vim 前是不会变的。这个指令 elvis 也是可以使用。当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。
在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,不必担心,载入相当快速的。加号 + 表示这个 buffer 已经修改过了。
:bn buffer next。这里的n代表字母n
:bl buffer last。
以上两个指令 elvis 不适用。
如果您是使用 vim 的 GUI,那就在菜单上就会有 Buffers 这个选项,可以很容易的知道及移动各buffer 间。

移除缓冲区

:bd(elete) buffer 在未离开 vim 前是不会移除的,可使用这个指令移除。其实移除它干什么呢?vim是您在叫用时才会载入的,因此这些 buffers 并不是像 cache 一般要占内存的。
自动完成

i   向上搜索,补全一个词
i   向下搜索,补全一个词
i 补全一行。
比如你写过一行 for (int i = 0; i 即可。如果补全出来的不是你想要的那一行,你可以按  或  选择上一个或下一个匹配行i   在文件系统中搜索,补全一个文件名
如果按  或  补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件,而文件的位置将在 path 中搜索。
i   把上一行对应列的字符抄下来
i   把下一行对应列的字符抄上来,这两个都可以一直按下去,到了行尾自己会停的.

注释整块内容

注释块的方法:
选定要注释掉的行 I // Esc
I之后输入的东西就是插入到选定的行前边的,直至Esc.
要去掉注释的办法:选定注释符//,然后d
列块选定后I是在前边都插入,A是在后边都插入
是按列块模式的选定,是行选定,v是普通选定

重新编辑

放弃一修改过的文件,重新编辑。
(1)使用命令 :q!强行退出后再vi flname重新进入。
(2)使用命令 :e!强行重编辑更便捷。这样也是会打开文件,但会放弃目前编辑文件的改变,否则如果文件已有变动,vim 预设是不让您随便离开的。:e! 后不接什么的话,代表舍弃一切修改,重新载入编辑中文件。

也许你会觉得这些很有用:

●%(跳转到与之匹配的括号处)
●.(重复上次的修改命令)
●`.(跳转到最近修改过的位置)
●ZQ(无条件退出
●ZZ(存盘退出)
●ga(显示光标下的字符在当前使用的 encoding 下的内码)
●guw(光标下的单词变为小写)
●gUw(光标下的单词变为大写)
●:TOhtml(根据 Vim 的语法加亮的方式生成 HTML 代码;在图形界面中也可以使用菜单“Syntax—Convert to HTML”达到同样效果)
无聊的时候,还可以试试:
●:help!
●:help 42
●:help holy-grail
●:files 或 :buffers 或 :ls   会列出目前 buffer 中的所有文件。
●在 elvis 中可使用 :b 来叫出 buffers。 
●:f 或 Ctrl-g   显示目前编辑的文件名、是否经过修改及目前光标所在之位置。
●:f 文件名   改变编辑中的文件名。(file)
●:r 文件名   在光标所在处插入一个文件的内容。(read)
●:35 r 文件名   将文件插入至 35 行之后。
●gf   这是 vim 的特殊打开文件的方法,会打开光标所在处的 word 为名的文件,当然,这个文件要在当前目录内,否则会创建新文件。

常用命令集合

1.查找

   /xxx(?xxx)   表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
                向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.
                一般来说是区分大小写的, 要想不区分大小写, 那得先输入
   :set ignorecase
                查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
                *(#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
                下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
                向查找.
   g*(g#)       此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
                是匹配包含该单词的所有字符串.
   gd           本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
                注释段中第一次出现这个单词的地方.
                 %本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
   f(F)x        本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.
                找到后:
                输入 ; 表示继续往下找
                输入 , 表示反方向查找

2.快速移动光标
在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定位和编辑. 因此能更快一点移动光标是很有用的.

   w(e)         移动光标到下一个单词.
   b            移动光标到上一个单词.
   0            移动光标到本行最开头.
   ^            移动光标到本行最开头的字符处.
   $            移动光标到本行结尾处.
   H            移动光标到屏幕的首行.
   M            移动光标到屏幕的中间一行.
   L            移动光标到屏幕的尾行.
   gg           移动光标到文档首行.
   G            移动光标到文档尾行.
   c-f              (即 ctrl 键与 f 键一同按下) 本命令即 page down.
   c-b              (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up.
   ''           此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
                找到某个单词后, 再输入此命令则回到上次停留的位置.
   '.           此命令相当好使, 它移动光标到上一次的修改行.
   `.           此命令相当强大, 它移动光标到上一次的修改点.

3.拷贝, 删除与粘贴
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.

   yw   表示拷贝从当前光标到光标所在单词结尾的内容.
   dw   表示删除从当前光标到光标所在单词结尾的内容.
   y0   表示拷贝从当前光标到光标所在行首的内容.
   d0   表示删除从当前光标到光标所在行首的内容.
   y$   表示拷贝从当前光标到光标所在行尾的内容.
   d$   表示删除从当前光标到光标所在行尾的内容.
   yfa  表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
   dfa  表示删���从当前光标到光标后面的第一个a字符之间的内容.
   特殊地:
   yy   表示拷贝光标所在行.
   dd   表示删除光标所在行.
   D表示删除从当前光标到光标所在行尾的内容.

关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.
4.数字与命令
在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:

   5fx      表示查找光标后第 5 个 x 字符.
   5w(e)    移动光标到下五个单词.
   5yy      表示拷贝光标以下 5 行.
   5dd      表示删除光标以下 5 行.
   y2fa     表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
   :12,24y  表示拷贝第12行到第24行之间的内容.
   :12,y    表示拷贝第12行到光标所在行之间的内容.
   :,24y    表示拷贝光标所在行到第24行之间的内容. 删除类似.

5.快速输入字符
在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符.
使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来. 这就是著名的命令
补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.

   c-p(c-n)         在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
                索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
                会在所有在这个 vim 程序中打开的文件中进行匹配.
   c-x-l            在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
                文档中进行匹配.
   c-x-f            在编辑模式中, 这个命令表示补齐文件名. 如输入:
                /usr/local/tom 后再输入此命令则它会自动匹配出:
                /usr/local/tomcat/
   abbr         即缩写. 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
                字符串. 比如编写java文件的常常输入 System.out.println, 这很
                是麻烦, 所以应该用缩写来减少敲字. 可以这么做:
   :abbr sprt System.out.println
                以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.
                out.println

6.替换
替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.

   :s/aa/bb/g   将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :s/\/bb/g    将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
   :%s/aa/bb/g  将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/^/#/ 将从12行到23行的行首加入 # 字符
   :%s= *$==    将所有行尾多余的空格删除
   :g/^\s*$/d   将所有不包含字符(空格也不包含)的空行删除.

7.多文件编辑
在一个 vim 程序中打开很多文件进行编辑是挺方便的.

   :sp(:vsp)    文件名 vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
                从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
                把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
                开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
                到帮助信息.
   :e           文件名vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
   c-w-wvim         分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
                到各个窗口之中.
   :ls          此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
                会显示出如下数据:
                1%a   "usevim.html"  行 162
                2#"xxxxxx.html"  行 0
                其中:
                1表示打开的文件序号, 这个序号很有用处.
                %a   表示文件代号, % 表示当前编辑的文件,
                #表示上次编辑的文件
                "usevim.html"表示文件名.
                行 162   表示光标位置.
   :b           序号(代号)此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
                就是用 :ls 命令看到的.
   :set diff    此命令用于比较两个文件, 可以用
   :vsp filename命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
                到效果了.

8.宏替换
vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,
因此我把它们定义到 - 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.

   :nmap  :nohls   取消被搜索字串的高亮
   :nmap  w   命令模式下转移光标到不同窗口
   :imap  输入模式下运行
   :nmap  :%s= *$==   删除所有行尾多余的空格.
   :imap同上
   :java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
          会说到如何实现这一点)
   :nmap  :comp javac:mak -d . %
          此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
          义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
   setlocal makeprg=javac
   setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
   :nmap  :comp ant:mak
          此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
          vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
          在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
   :nmap  :cl  此命令用于查看所有的编译错误.
   :imap  
   :nmap  :cc  此命令用于查看当前的编译错误.
   :imap  
   :nmap  :cn  此命令用于跳到下一个出错位置.
   :imap  
   :nmap  :cp  此命令用于跳到上一个出错位置.
   :imap  
   :nmap  :JavaBrowser
          此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
          本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
          在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.
   :imap  

9.TAB

TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
>                   输入此命令则光标所在行向右移动一个 tab.
5>>                  输入此命令则光标后 5 行向右移动一个 tab.
:12,24>              此命令将12行到14行的数据都向右移动一个 tab.
:12,24>>             此命令将12行到14行的数据都向右移动两个 tab.
那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.
:set shiftwidth=4    设置自动缩进 4 个空格, 当然要设自动缩进先.
:set sts=4           即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
:set tabstop=4       实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
:set expandtab       在输入 tab 后, vim 用恰当的空格来填充这个 tab.

10.autocmd
这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置; 可以
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件
里面. 由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.

   :autocmd!删除所有之前的自动命令.
   autocmd FileType java   source ~/.vim/files/java.vim
   autocmd FileType java   source ~/.vim/files/jcommenter.vim
 以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.
   autocmd BufNewFile   *.java   0r ~/.vim/files/skeletons/java.skel
 以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
   autocmd BufNewFile   *.java   normal gnp
 以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
 处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.

11.常用脚本

在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.
我常用的有:

 jcommenter.vim         自动加入 javadoc 风格的注释.
 JBrowser.vim           类资源浏览. C, C++ 等可以用 Tlist
 还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
 反编译 .class 文件等等.

12.常用配置

在~/.vimrc 配置文件中你常常需要一些个性化配置. 比如上面写的一些宏定义, 一些
autocmd 定义等等. 比如:

 set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
     这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.
 set nu           显示行号
 set ai           设置自动缩进
 map Y y$         让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.

13.其他
还有许多有意思的命令, 记录在这里免得忘记.

 .                                                重复上次编辑命令.
 :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)    在行首插入行号
 :runtime! syntax/2html.vim                       转换 txt 成 html, 会按照你的颜色配置来转 

六、C编程IDE的打造 && C语言编程插件 && 常用快捷键的支持

(一)Ctags

Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。比如,tags文件就是Taglist和OmniCppComplete工作的基础。

文字高亮

1.首先要在你的 ~/.vimrc 文件中增加下面几句话:

syntax enable
syntax on

2.再重新启动vim, 并打开一个c程序文件, 是不是觉得眼前突然色彩缤纷了起来。

实践:VIM深入研究(20135301 && 20135337)_第1张图片

ctags的下载安装和配置过程

实践:VIM深入研究(20135301 && 20135337)_第2张图片

使用Ctags

1.进入我们的项目代码根目录,执行以下命令:(我们也可以进入代码根目录后,打开Vim,按下Ctrl-F12快捷键自动生成tags文件。)
实践:VIM深入研究(20135301 && 20135337)_第3张图片

实践:VIM深入研究(20135301 && 20135337)_第4张图片

2.命令执行完后,会在源代码目录生成tags文件。Vim默认会自动读取当前目录下的tags文件,所以不需要修改~/.vimrc文件。

以下两组快捷键是最常用的常用命令

Ctrl-]    跳转到光标所在符号的定义。
Ctrl-t    回到上次跳转前的位置。

通过命令man ctags或在Vim命令行下运行help ctags查询。

help ctags帮助(或者man ctags)

实践:VIM深入研究(20135301 && 20135337)_第5张图片

3.向vim注册索引文件tags的路径

实践:VIM深入研究(20135301 && 20135337)_第6张图片

4.打开文件的最后添加如下内容

"--ctags setting--
" 按下F5重新生成tag文件,并更新taglist
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags "add current directory's generated tags file
set tags+=~/arm/linux-2.6.24.7/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)

set tags+=./tags表示在当前工作目录下搜索tags文件
set tags+=~/arm/linux-2.6.24.7/tags表示在搜寻tags文件的时候,也要搜寻~/arm/linux-2.6.24.7/文件夹下的tags文件。

5.保存并退出vi。这样,你就可以用vim在任意地方查看有关Linux的函数原形

6.tag命令用法:
常用命令

(在当前窗口显示标签)
Ctrl+]  跳到当前光标下单词的标签
Ctrl+O  返回上一个标签
Ctrl+T  返回上一个标签
:tag TagName 跳到TagName标签

(不希望在当前窗口显示标签)
:stag TagName 新窗口显示TagName标签,光标跳到标签处
Ctrl+W + ]  新窗口显示当前光标下单词的标签,光标跳到标签处

当一个标签有多个匹配项时,":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。

(在各匹配的标签间移动命令)
:tfirst    到第一个匹配
:[count]tprevious 向前 [count] 个匹配
:[count]tnext  向后 [count] 个匹配
:tlast    到最后一个匹配

(以下命令选择要跳转到哪一个)
 :tselect TagName

(在预览窗口显示标签)
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + }  预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose   关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。

举例

1.用vi在任意目录写一个Test.c文件
实践:VIM深入研究(20135301 && 20135337)_第7张图片

2.写好后末行模式输入w保存好(不要退出vi),按Esc回到指令模式,把光标���留在printf上。然后按 Ctrl+W + ],vi会自动跳到Linux系统函数printf()处,这时我们能查看printf()的原形。
实践:VIM深入研究(20135301 && 20135337)_第8张图片

3.查看完了,按Ctrl+o(回到上一个标签) 就回到原来的地方。

(二)管理vim插件——vim-addons

1.系统中已有的vim-scripts中包含的插件及其状态
实践:VIM深入研究(20135301 && 20135337)_第9张图片

vim自动补全——OmniCppComplete

1.安装OmniCppComplete

2.配置OmniCppComplete

"-- omnicppcomplete setting --
" 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
imap <F3> <C-X><C-O>
" 按下F2根据头文件内关键字补全
imap <F2> <C-X><C-I>
set completeopt=menu,menuone " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1

3.使用下列命令生成tags文件,就可以与OmniCppComplete配合运作:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q 

 --c++-kinds=+p  :为C++文件增加函数原型的标签
 --fields=+iaS :在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
 --extra=+q    :为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全

4.为了测试自动补全功能,我们先下载C++一份C++标准库的源代码
实践:VIM深入研究(20135301 && 20135337)_第10张图片

5.在/usr/include/c++下就可以找到标准库的头文件了

在此文件夹下生成能与OmniCppComplete配合运作的tags文件

6.在vim的配置文件中如下内容,然后在编程的时候就可以使用自动补全功能了

举例

用vi打开前面的Test.c文件,在printf("Hello World!\n")下一行中,输入pri,然后按下Ctrl+X Ctrl+O
实践:VIM深入研究(20135301 && 20135337)_第11张图片

当自动补全下拉窗口弹出后,一些可用的快捷键:

Ctrl+P  向前切换成员
Ctrl+N  向后切换成员
Ctrl+E  表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y  表示退出下拉窗口, 并接受当前选项

其他补全方式:
Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N  根据当前文件里关键字补全
Ctrl+X Ctrl+K  根据字典补全
Ctrl+X Ctrl+T  根据同义词字典补全
Ctrl+X Ctrl+I  根据头文件内关键字补全
Ctrl+X Ctrl+]  根据标签补全
Ctrl+X Ctrl+F  补全文件名
Ctrl+X Ctrl+D  补全宏定义
Ctrl+X Ctrl+V  补全vim命令
Ctrl+X Ctrl+U  用户自定义补全方式
Ctrl+X Ctrl+S  拼写建议
帮助文档:help omnicppcomplete

(三)提示函数原型echofunc

1.echofunc可以在命令行中提示当前输入函数的原型。

  1. 整个创建tags文件的命令如下:$ ctags -R --fields=+lS

标签浏览器Taglist

Taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)

1.安装Taglist

2.配置Taglist

"-- Taglist setting --
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以���接执行
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
"是否一直处理tags.1:处理;0:不处理
let Tlist_Process_File_Always=1 "实时更新tags
let Tlist_Inc_Winwidth=0

实践:VIM深入研究(20135301 && 20135337)_第12张图片

3.进入vim后用命令":Tlist"打开/关闭taglist窗口。
帮助文档:help taglist.txt
实践:VIM深入研究(20135301 && 20135337)_第13张图片

(四)文件浏览器和缓冲区管理器WinManager

WinManager用于管理文件浏览器和缓冲区(buffer)

1.安装WinManager

2.配置WinManager

"-- WinManager setting --
let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件
"let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
nmap wm :WMToggle<cr>

3.常用命令

:WMToggle 打开/关闭WinManage,不过我们在配置文件.vimrc中做了快捷键映射,所以直接按wm就可以打开/关闭WinManage

文件浏览器命令(在文件浏览器窗口中使用)
<enter>或双击  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
<tab>   如果光标下是目录, 则进入该目录; 如果光标下文件, 则在新窗口打开该文件
<F5> 刷新列表
 -  返回上一层目录
c  使浏览目录成为vim当前工作目录
d  创建目录
D  删除当前光标下的目录或文件
i  切换显示方式
R  文件或目录重命名
s  选择排序方式
r  反向排序列表
x  定制浏览方式, 使用你指定的程序打开该文件
winmanager帮助文档:help winmanager
netrw帮助文档:help netrw

(五)buffer管理器MiniBufferExplorer

  • MiniBufferExplorer用于浏览和管理buffer,如果只打开一个文件,是不会显示在屏幕上的,而打开多个文件之后,会自动出现在屏幕上。

  • vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令

  • Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。
    实践:VIM深入研究(20135301 && 20135337)_第14张图片

1.安装MiniBufferExplorer

2.配置MiniBufferExplorer

" -- MiniBufferExplorer --
let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持
"let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持
let g:miniBufExplModSelTarget = 1 " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer

3.常用命令

<Tab>  移到上一个buffer
<Shift-Tab> 移到下一个buffer
<Enter>  打开光标所在的buffer
d   删除光标所在的buffer

(六)代码折叠fold

  • 折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。
    实践:VIM深入研究(20135301 && 20135337)_第15张图片

  • 折叠的好处是,通过把多行的一节折叠成带有折叠提示的一行,会使你更好地了解对文本
    的宏观结构。

  • 折叠方式foldmethod
  • vim提供以下6种方法来选定折叠方式:

    manual 手工定义折叠
    indent 更多的缩进表示更高级别的折叠
    expr 用表达式来定义折叠
    syntax 用语法高亮来定义折叠
    diff 对没有更改的文本进行折叠
    marker 对文中的标志折叠

  • 折叠级别foldlevel

    'foldlevel' 是个数值选项:数字越大则打开的折叠更多。
    当 'foldlevel' 为 0 时,所有的折叠关闭。
    当 'foldlevel' 为正数时,一些折叠关闭。
    当 'foldlevel' 很大时,所有的折叠打开。

  • 折叠栏foldcolumn

    'foldcolumn' 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折叠栏。最大是12。
    一个打开的折叠由一栏来表示,顶端是 '-',其下方是 '|'。这栏在折叠结束的地方结束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。
    一个关闭的折叠由 '+' 表示。

1.在vim配置文件/home/user/.vimrc中加入如下的配置

"--fold setting--
set foldmethod=syntax " 用语法高亮来定义折叠
set foldlevel=100 " 启动vim时不要自动折叠代码
set foldcolumn=5 " 设置折叠栏宽度

2.常用命令

za  打开/关闭在光标下的折叠
zA  循环地打开/关闭光标下的折叠
zo  打开 (open) 在光标下的折叠
zO  循环打开 (Open) 光标下的折叠
zc  关闭 (close) 在光标下的折叠
zC  循环关闭 (Close) 在光标下的所有折叠
zM  关闭所有折叠
zR  打开所有的折叠
帮助文档
:help usr_28.txt
:help fold.txt

(七)项目目录数管理器Project

  • Project插件是用来显示项目的目录树的,这个目录树是默认保存在~/.vimprojects文件中。

1.安装Project

2.Project目录树可以通过下面的步骤生成

1)打开vim在命令模式下输入 :Project,在屏幕的最左边就会出现一个project框。不过因为没有初始化暂时是空的
2)在命令模式下(不是插入模式)输入\C (大写的C),会出现下面这些信息:
(但是我敲击“\C”之后变成了插入模式)
Enter the Name of the Entry: xxxx (输入项目名称)
Enter the Absolute Directory to Load: /xxx/xxx/xxx (输入项目根目录的绝对路径)
Enter the CD parameter: . (“.”为当前目录)或者和项目根目录一致
Enter the File Filter: *.* (符合条件的源文件,可以是*.cpp/*.h等)

实践:VIM深入研究(20135301 && 20135337)_第16张图片

(八)quickfix命令集

  • 通过quickfix命令集,你可在 Vim 内编译程序并直接跳转到出错位置进行修正。你可以接着重新编译并做修正,直到不再出错为止。

1.在vim配置文件/home/user/.vimrc中加入如下的配置
实践:VIM深入研究(20135301 && 20135337)_第17张图片

"-- QuickFix setting --
" 按下F6,执行make clean
map <F6> :make clean<CR><CR><CR>
" 按下F7,执行make编译程序,并打开quickfix窗口,显示编译信息
map <F7> :make<CR><CR><CR> :copen<CR><CR>
" 按下F8,光标移到上一个错误所在的行
map <F8> :cp<CR>
" 按下F9,光标移到下一个错误所在的行
map <F9> :cn<CR>
" 以上的映射是使上面的快捷键在插入模式下也能用
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>

2.常用命令

帮助文档
:help usr_30
:help quickfix

下面的命令运行 "make" (包括你所给出的参数) 程序并捕捉其运行结果: >
 :make {arguments}
如果编译时出现错误,按 <Enter>,回到vim界面,看不到出错信息了!这时,可以运行以下命令
:cw[indow]
打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。然后,你可以双击出错某一条出错信 息,vim就会自动跳转到相应的出错位置
:cn[ext]  光标移到下一个错误所在的行
:cp[revious] 光标移到上一个错误所在的行
:cfirst  到第一处错误
:clast  到最后一处错误
:cc   空间不够时,Vim 会缩短出错信息。如果你想查看详细信息,可以使用此命令
:cl[ist] 列出所有出错信息的概览(只有那些含有文件名或行数的错误信息会被显示,需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令)

(九)Cscope

  • Cscope是一个类似于ctags的工具

1.安装Cscope
实践:VIM深入研究(20135301 && 20135337)_第18张图片

2.在vim配置文件/home/user/.vimrc中加入如下的配置:
实践:VIM深入研究(20135301 && 20135337)_第19张图片

"-- Cscope setting --
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope               数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
" 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下    c)
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>

cscope find用法

  • cscope的主要功能是通过其"find"子命令来实现的

cs find c|d|e|f|g|i|s|t name
0 或 s  查找这个 C 符号(可以跳过注释)
1 或 g  查找这个定义
2 或 d  查找这个函数调用的函数
3 或 c  查找调用过这个函数的函数
4 或 t  查找这个字符串
6 或 e  查找这个 egrep 模式
7 或 f  查找这个文件
8 或 i  查找包含这个文件的文件

(十)vim常用快捷键

%  跳转到配对的括号去
[[  跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
][  跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中'{'必须单独占一行)
]]  跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行)
[/  跳到注释开头(只对/* */注释有效)
]/ 跳到注释结尾(只对/* */注释有效)
gD  跳转到当前文件内标识符首次出现的位置,可用于跳转到全部变量的定义处;查找局部变量时,要是多   个函数中定义了该局部变量,使用gD进行查找,找到的变量定义可能不是你需要的
gd 跳转到当前函数内标识符首次出现的位置,可用于跳转到局部变量的定义处
''  跳转到光标上次停靠的地方, 是两个', 而不是一个"
mx  设置书签,x只能是a-z的26个字母
`x  跳转到书签处("`"是1左边的键)
>  增加缩进,"x>"表示增加以下x行的缩进
<  减少缩进,"x<"表示减少以下x行的缩进

总结体会

看到vim手册100页,发现真心很强大,如果能够记清楚那些命令,应该说速度可以提升的很快,至少,可以到达脑子思考的速度,不会因为敲的很慢而减慢速度。原来鼠标也是一种落后了,但是记清楚那些命令不是一件容易的事情,只有不断的使用,不断的巩固,才可以熟练掌握。
通过这次实践vim一共花费了两周,前期看到实践标准那些插件该做什么,于是按照教程去尝试,其实开始的时候也不知道自己做得对不对,就是在实践中慢慢摸索。
虽然现在也不能说已经对VIM研究透彻,但通过安装插件、修改配置,我们了解了文字高亮、自动补全、函数原型等功能,同时也学会了是如何添加配置、如何实现功能、如何让vim变得强大。

参考资料

http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html

http://www.oschina.net/news/43167/130-essential-vim-commands

http://www.zhihu.com/question/19870551?utm_campaign=rss&utm_medium=rss&utm_source=rss&utm_content=title

http://xbeta.info/vim-tutorials.htm

http://ju.outofmemory.cn/entry/79671

你可能感兴趣的:(实践:VIM深入研究(20135301 && 20135337))