本节所用命令的帮助入口:php
:help usr_03.txt :help motion.txt :help usr_29.txt :help scroll.txt :help folding
上一篇文章中咱们介绍了一些经常使用的移动命令,本篇将继续介绍更多的命令,使你在文档中自由穿梭。html
[ 利用跳转表 ]程序员
在vim中,不少命令能够引发跳转,vim会记住把跳转前光标的位置记录到跳转表中,并提供了一些命令来根据跳转表进行跳转。要知道哪些命令引发跳转,参见”:help jump-motions“。vim
使用命令””“(两个单引号)和”““(两个反引号,在键盘上和”~”共用一个键)能够返回到最后跳转的位置。例如,当前光标位于文件中第1234行,而后我使用”4321G“命令跳转到第4321行;这时若是我按””“或”““,就会跳回到1234行。session
由于这两个命令也属于跳转命令,因此第4321行也被记入跳转表,若是你再次使用这两个命令,就会发现本身又跳回第4321行了。wordpress
这两个命令有一点不一样,”““在跳转时会精确到列,而””“不会回到跳转时光标所在的那一列,而是把光标放在第一个非空白字符上。函数
若是想回到更老的跳转位置,使用命令”CTRL-O“;与它相对应的,是”CTRL-I“,它跳转到更新的跳转位置(:help CTRL-O和:help CTRL-I)。这两个命令前面能够加数字来表示倍数。post
使用命令”:jumps“能够查看跳转表(:help :jumps)。ui
[ 使用标记 ]url
标记(mark)是vim提供的精肯定位技术,其功能至关于GPS技术,只要你知道标记的名字,就可使用命令直接跳转到该标记所在的位置。
vim中的标记都有一个名字,这个名字用单一的字符表示。大写和小写字母(A-Za-z)均可以作为标记的名字,这些标志的位置能够由用户来设置;而数字标记0-9,以及一些标点符号标记,用户不能进行设置,由vim来自动设置。
咱们主要讲述字母标记的使用,对于数字标记和标点符号标记,请自行参阅帮助手册(:help mark-motions)。
小写字母标记局限于缓冲区,也就是说,每一个缓冲区均可以定义本身的小写字母标记,各缓冲区间的小写字母标记彼此不干扰。若是我在文件A中设置一个标记t,而后在文件B中也能够设置一个标记t。那么在文件A中,能够用”‘t“命令跳到文件A的标记t位置 ;在文件B中,能够用”‘t“命令跳到文件B的标记t位置。若是文件在缓冲区列表中被删除,小写字母标记就丢失了。
大写字母标记是全局的,它在文件间都有效。若是在文件A中定义一个标记T,那么当使用命令”‘T“时,就会跳到文件A的标记T位置,无论你当前处于哪一个文件中。
设定一个标记很简单,使用命令”m{a-zA-Z}“就能够了。例如,命令”mt“在把当前光标位置设定为标记t;命令”mT“把当前光标位置设定为标记T。(:help m)
要跳转到指定的标记,使用命令”‘{a-zA-Z}“或”{a-zA-Z}“。例如,命令”‘t“会跳转到标记t;命令”‘T“会跳转到标记T。( :help ‘)
单引号和反引号的区别和上面所讲的同样,”`“在跳转时会精确到列,而”‘“不会回到跳转时光标所在的那一列,而是把光标放在第一个非空白字符上。
标记也能够被删除,使用命令”:delmarks“能够删除指定标记。命令”:marks“列出全部的标记。
关于标记,有两个很是有用的插件,一个是ShowMarks,另一个叫marks browser。
ShowMarks是我最经常使用的插件之一,它使用vim提供的sign功能以及高亮功能显示出标记的位置。这样,你在设定了一个标记后,它就会在你的vim窗口中显示出标记的名字,并高亮这一行。
在你的$HOME/.vim目录把它解压,而后进行简单设置。 在个人vimrc中,对ShowMarks进行了以下配置:
"""""""""""""""""""""""""""""" " showmarks setting """""""""""""""""""""""""""""" " Enable ShowMarks let showmarks_enable = 1 " Show which marks let showmarks_include = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" " Ignore help, quickfix, non-modifiable buffers let showmarks_ignore_type = "hqm" " Hilight lower & upper marks let showmarks_hlline_lower = 1 let showmarks_hlline_upper = 1
首先,使能showmarks插件,而后定义showmarks只显示所有的大写标记和小写,并高亮这两种标记;对文件类型为help、quickfix和不可修改的缓冲区,则不显示标记的位置。
你能够定义本身的颜色来高亮标记所在的行,下面是个人定义,我把它放在我本身的colorscheme文件中:
" For showmarks plugin hi ShowMarksHLl ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black hi ShowMarksHLu ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black
ShowMarks插件中已经定义了一些快捷键:
<Leader>mt - 打开/关闭ShowMarks插件
<Leader>mo - 强制打开ShowMarks插件 <Leader>mh - 清除当前行的标记 <Leader>ma - 清除当前缓冲区中全部的标记 <Leader>mm - 在当前行打一个标记,使用下一个可用的标记名
我最常使用的是”<Leader>mm“和”<Leader>mh“,用起来很是方便。在个人vimrc中,把Leader定义为”,“,因此每次都使用”,mm“和”,mh“来设置和删除mark。
在vim 7.0中,若是大写的标记被定义了,那么函数line()不管在哪一个缓冲区里都会返回该标记的行号,致使showmarks在每一个缓冲区里都会把这个大写标记显示出来。所以我为这个插件打了个补丁来修正此问题。
vim 7.0中也能够真正的删除一个mark标记,因此也改了showmarks插件的删除标记功能。原来的功能在删除标记时,并未真正删除它,只是把这个标记指向缓冲区的第一行;如今则是真正删除此标记。
若是想使用我为showmarks打的补丁,请点击这里下载showmarks补丁。
用法:
Marks Browser插件能够显示出当前缓冲区中定义的小写标记的位置,在你没法对应上标记的名字和其位置时,很是有用。
下载后把它放到你的$HOME/.vim/plugin目录便可,我为其定义了一个快捷键:
"""""""""""""""""""""""""""""" " markbrowser setting """""""""""""""""""""""""""""" nmap <silent> <leader>mk :MarksBrowser<cr>
这样,直接使用”,mk“就能够打开Mark Browser窗口了。
下图显示这两个插件工做时的效果。我在文件中定义了三个标记,一个大写标记A,两个小写标记a和t。最上面的窗口是Mark Browser窗口,主编辑窗口中的高亮行及sign标记是ShowMarks插件放置的。
[ 折行 ]
在文件比较大时,在文件中移动也许会比较费力。这个时候,你能够根据本身的须要把暂时不会访问的文本折叠起来,既减小了对空间的占用,移动速度也会快不少。
vim提供了多种方法来进行折叠,既能够手动折叠,也能够根据缩进、语法,或使用表达式来进行折叠。
程序文件通常都具备良好的结构,因此根据语法进行折叠是一个不错的选择。
要启用折叠,首先要使能’foldenable‘选项,这个选项是局部于窗口的选项,所以能够为每一个窗口定义不一样的折叠。
接下来,设置’foldmethod‘选项,对于程序,咱们能够选择根据语法高亮进行折叠。需注意的,要根据语法高亮进行折叠,必须打开文件类型检测和语法高亮功能,请参见我前面的文章。
下面是个人vimrc中的设置,它使用了自动命令,若是发现文件类型为c或cpp,就启用折叠功能,并按语法进行折叠:
autocmd FileType c,cpp setl fdm=syntax | setl fen
注意,vim的不少命令、选项名都有简写形式,在帮助手册中能够看到简写形式,也能够按简写形式来help,例如,要查看’foldmethod‘选项的帮助,能够只输入”:help ‘fdm’“。
折叠后的效果见下图:
图中以黑色背景显示的行就是被折叠起来的行,vim会显示这个fold中被折叠了多少行,以及起始行的内容。留意一下左下方的”__Tag_List__”窗口,在这个窗口中也存在着折叠,我把macro, typedef, variable几项折叠起来了,而把function的折叠打开。从该窗口最左边的折叠栏(:help fold-foldcolumn)也能够看出不一样:被折叠的文本前显示了”+“,打开的折叠前显示的是”|“。
折叠的背景色及显示文字等均可以修改,参阅帮助手册(:help folding)。
下面的命令用来打开和关闭折叠:
zo – 打开光标下的折叠
zO – 循环打开光标下的折叠,也就是说,若是存在多级折叠,每一级都会被打开 zc – 关闭光标下的折叠 zC – 循环关闭光标下的折叠
更多的命令,请参阅手册(:help folding)。
vim提供了一些命令在折叠间快速移动:
[z – 到当前打开折叠的开始
]z – 到当前打开折叠的结束 zj – 向下移动到下一个折叠的开始处 zk – 向上移动到上一个折叠的结束处
我一般不喜欢把文本折叠起来,由于我更喜欢一目了然的看到所有文本。你能够根据本身的喜爱来决定是否启用折叠。
多说一点,手动建立的折叠是能够保存在session文件中的,这样下次进入vim时能够载入以前建立的折叠,参见:help ‘sessionoptions’。
[ 在程序中移动 ]
vim的做者是一个程序员,这就不难理解为何vim提供了众多在程序中移动的命令。这里面既包括咱们前面的文章中介绍过的利用tag文件及cscope在标签间跳转,也包括众多在函数、注释、预处理指令、程序段,及其它程序元素中移动的命令。
本文再也不详细介绍这些命令,做为程序员,必定要熟读usr_29.txt!这些命令,能够帮助你在程序中驾轻就熟的移动。
在这里介绍两个插件,加强了在程序中移动的功能,一个是a.vim,另一个是matchit。
a.vim的功能很是简单,它帮助你在源文件和头文件间进行切换,这个简单的功能,却很是实用,至少它为我节省了不少时间。
下载a.vim后,把它放到你的.vim/plugin目录就能够了。
假设你正在浏览C语言的源文件,这时想修改它对应的头文件,只须要输入”:A“命令,就切换到头文件了(须要源文件和头文件在同一目录中)。a.vim插件还定义了其它一些命令和快捷键,参见它的帮助手册。
在vim中,”%“命令跳转到与当前项目相匹配的项目。例如,当光标位置在”{“时,按下%,光标就跳转到对应的”}“( :help %)。
但vim提供的%命令,只能在括号,或者C注释的开始和结束( /* */),或者C编译预处理指令间进行跳转。对于其它程序结构,例如HTML,%命令不能从<html>标记,跳转到对应的</html>标记。
Matchit插件则扩展了%命令的功能,使%命令能够对其它程序语言的开始和结束标记间进行跳转。
下载后,把这个插件放到你的.vim/plugin目录,你就能够用%在各类开始/结束标记间跳转了,目前,它能够支持Ada, ASP with VBS, Csh, DTD, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal, SGML, Shell, Tcsh, Vim, XML等语言。
[ 插入模式下的移动 ]
上面介绍的移动命令,都是在normal模式下使用的,若是想在insert模式下移动,阅读:help ins-special-special。
你真的须要在插入模式下移动吗?我几乎不会!一般我会先按ESC返回Normal模式,而后再移动,当你习惯了之后,你会发现效率会更高。
[ 小结 ]
你会发现,本文的内容,和usr_03.txt帮助文档很类似。是的,只要你学会了usr_03.txt中列出的命令,你就掌握了最经常使用最实用的vim移动命令(:help usr_03.txt)。
若是你想了解更多的移动命令,请通篇阅读motion.txt,记住你最有可能用到的那些键。当你的手指可以不假思索的使用这些命令后,你在vim中就能作到指随意动、移动如飞了。
[参考文档]
原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]
本文连接地址: http://easwy.com/blog/archives/advanced-vim-skills-advanced-move-method/
文章的脚注信息由WordPress的wp-posturl插件自动生成