1、基本知识
1.vim模式介绍
2.三种经常使用模式的切换
2、Vim文档编辑
1.vim重复命令
2.游标的快速跳转
3.复制粘贴和剪切
4.删除文本
5.字符的替换及撤销(Undo操做)
6.快速缩进
7.查找
3、高级功能
1.多文件编辑
2.可视模式
3.视窗操做
4.文档加密
5.帮助系统
6.功能设定
4、实用技巧
1.中文支持
2.鼠标支持
3.空格、制表符和缩进
4.模式行
5.寄存器
6.搜索、替换和正则表达式
7.自动完成和路径设定
8.文件跳转和 Tags
9.Make 和 grep
10.执行外部命令
11.定宽文本排版
12.其它小技巧
5、经常使用命令集合
6、C编程IDE的打造 && C语言编程插件 && 经常使用快捷键的支持html
如下介绍内容来自维基百科Vimjava
从vi演生出来的Vim具备多种模式,这种独特的设计容易使初学者产生混淆。几乎全部的编辑器都会有插入和执行命令两种模式,而且大多数的编辑器使用了与Vim大相径庭的方式:命令目录(鼠标或者键盘驱动),组合键(一般经过control键(CTRL)和alt键(ALT)组成)或者鼠标输入。Vim和vi同样,仅仅经过键盘来在这些模式之中切换。这就使得Vim能够不用进行菜单或者鼠标操做,而且最小化组合键的操做。对文字录入员或者程序员能够大大加强速度和效率。
Vim具备6种基本模式和5种派生模式,咱们这里只简单介绍下6种基本模式:linux
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模式前,能够一次执行多条命令。c++
这其中咱们经常使用到就是普通模式、插入模式和命令行模式。程序员
vim启动进入普通模式,处于插入模式或命令行模式时只须要按Esc或者Ctrl+[(这在vim课程环境中无论用)便可进入普通模式。普通模式中按i(插入)或a(附加)键均可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车后保存并退出vim。正则表达式
1.使用vim命令进入vim界面chrome
vim后面加上你要打开的已存在的文件名或者不存在(则做为新建文件)的文件名。 打开Xfce终端,输入如下命令shell
$ 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 文件名能够将文档另存为其余文件名或存到其它路径下
1.命令行模式下退出vim
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
如下为其它几种退出方式:
命令 说明 :q! 强制退出,不保存 :q 退出 :wq! 强制保存并退出 :w <文件路径> 另存为 :saveas 文件路径 另存为 :x 保存并退出 :wq 保存并退出
2.普通模式下退出vim
普通模式下输入Shift+zz便可保存退出vim
1.重复执行上次命令
在普通模式下.(小数点)表示重复上一次的命令操做
拷贝测试文件到本地目录
$ cp /etc/protocols .
打开文件进行编辑
$ vim protocols
普通模式下输入x,删除第一个字符,输入.(小数点)会再次删除一个字符,除此以外也能够重复dd的删除操做
2.执行指定次数相同的命令
进入普通模式输入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行
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就会要求你输入密码
在命令行模式中输入!能够执行外部的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 特性的话),与中文相关的有 gb23十二、gbk、gb18030、hz-gb-23十二、iso-2022-cn、big五、cp93六、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;此处也能够根据须要以 gb23十二、gbk 或 gb18030 等编码替代)。须要注意的是,该顺序不能颠倒,而且在后面再添加其它编码如 big五、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”。
没人愿意每次都手工输入一大堆的 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 将自动产生一个对“<test>”(参见“: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”)可返回到原先的文件中。
你们通常都知道,在 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 [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, 会按照你的颜色配置来转
Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。好比,tags文件就是Taglist和OmniCppComplete工做的基础。
1.首先要在你的 ~/.vimrc 文件中增长下面几句话:
syntax enable syntax on
2.再从新启动vim, 并打开一个c程序文件, 是否是以为眼前忽然色彩缤纷了起来。
1.进入咱们的项目代码根目录,执行如下命令:(咱们也能够进入代码根目录后,打开Vim,按下Ctrl-F12快捷键自动生成tags文件。)
2.命令执行完后,会在源代码目录生成tags文件。Vim默认会自动读取当前目录下的tags文件,因此不须要修改~/.vimrc文件。
如下两组快捷键是最经常使用的经常使用命令
Ctrl-] 跳转到光标所在符号的定义。 Ctrl-t 回到上次跳转前的位置。
经过命令man ctags或在Vim命令行下运行help ctags查询。
help ctags帮助(或者man ctags)
3.向vim注册索引文件tags的路径
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文件
2.写好后末行模式输入w保存好(不要退出vi),按Esc回到指令模式,把光标停留在printf上。而后按 Ctrl+W + ],vi会自动跳到Linux系统函数printf()处,这时咱们能查看printf()的原形。
3.查看完了,按Ctrl+o(回到上一个标签) 就回到原来的地方。
1.系统中已有的vim-scripts中包含的插件及其状态
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++标准库的源代码
5.在/usr/include/c++下就能够找到标准库的头文件了
在此文件夹下生成能与OmniCppComplete配合运做的tags文件
6.在vim的配置文件中以下内容,而后在编程的时候就能够使用自动补全功能了
用vi打开前面的Test.c文件,在printf("Hello World!\n")下一行中,输入pri,而后按下Ctrl+X Ctrl+O
当自动补全下拉窗口弹出后,一些可用的快捷键:
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
1.echofunc能够在命令行中提示当前输入函数的原型。
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
3.进入vim后用命令":Tlist"打开/关闭taglist窗口。
帮助文档:help taglist.txt
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
MiniBufferExplorer用于浏览和管理buffer,若是只打开一个文件,是不会显示在屏幕上的,而打开多个文件以后,会自动出如今屏幕上。
vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令
Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。
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
折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。
折叠的好处是,经过把多行的一节折叠成带有折叠提示的一行,会使你更好地了解对文本
的宏观结构。
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
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等)
1.在vim配置文件/home/user/.vimrc中加入以下的配置
"-- 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]!”命令)
1.安装Cscope
2.在vim配置文件/home/user/.vimrc中加入以下的配置:
"-- 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>
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 查找包含这个文件的文件
% 跳转到配对的括号去 [[ 跳转到当前或者上一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行) ][ 跳转到当前代码块(函数定义、类定义等)的结尾去(但要求代码块中'{'必须单独占一行) ]] 跳转到下一代码块(函数定义、类定义等)的开头去(但要求代码块中'{'必须单独占一行) [/ 跳到注释开头(只对/* */注释有效) ]/ 跳到注释结尾(只对/* */注释有效) 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