开场白
Vim是一个十分强大的文本编辑器,被誉为”编辑器之神”,熟练地使用Vim会使你处理文本、编辑代码的效率提升n个数量级!如果你现在还在使用gedit甚至是”记事本”的话,我奉劝你赶快把它扔到垃圾桶,马上开始你的Vim之旅。这里列出一些我经常使用的基本的Vim命令和技巧,Vim的使用是一个长期的学习、实践、再学习、再实践的过程。Here we go.
安装Vim/Gvim
如果你现在没使用过Vim/Gvim,你首先需要安装它们,当前的版本为7.2。Debian/Ubuntu下面,sudo apt-get install vim-gnome即可。其他系统也有相应的包管理程序来直接安装。对于Windows,你需要到Vim的官方网站来下载安装。安装时记得选中”设置Vim环境变量”的选项,这样你就可以直接在cmd下使用vim了。
在正式开始之前,最好在终端(cmd)里运行vimtutor,一步步按照提示操作,以对vim的操作有一个初步的了解。
快速的移动
别在总在插入模式里呆着
除了敲代码,不要总在插入模式里呆着,因为这样的Vim就和诸如gedit等普通的编辑器就没什么区别了。这就是为什么一些新手总是在插入模式的原因了,”好用”或者说”友好”。但是,Vim真正的威力却在于其命令模式,你将会发现,随着你对Vim的了解和熟练,你用插入模式的时间会越来越少。
使用h, j, k, l
为了有效的编辑文件,你首先应该做的就是戒掉那些个方向键 ←↓↑→,代以h, j, k, l,即左、下、上、右。这样的好处是很明显的,你的手不用再不停地在字母键和方向键之间来回挪动了,这会为你节省相当可观的时间,但或许你需要一定的时间来适应这种转变。
在使用中你可能会遇到这样的文件,每一行(这里行以\n, \r标识)的文字都很长,以至于需要用视觉上的多行来显示,这时候使用j或者k会跳过若干行,以至于你不得不使用h或者l来在行内移动。当然,你可以不这么做,方法就是在j, k前面加g即可在视觉行间移动。
使用motion在当前行内高效地移动
许多其他的编辑器仅仅提供少量的命令来移动光标(左,上,右,下,行首/末等等)。Vim有很多强大的命令来高效地移动,它们被成为motion,motion都通常都有一个开始点(通常就是当前光标处)和一个目标点。下面列出一些有用的motion:
- fx :向右移动至字母x在当前行内下一次出现的位置f指forward,x可以是任一个字母。你还可以用;来重复执行刚才的fx操作,这两个命令的结合是极其有用的。
- tx :同fx,区别在于光标会停留到x的右侧。
- Fx :同fx,只是向左移动。
- w :向右移动一个单词,光标停留在下一个单词的首字母,同样地,b向左移动。类似的还有一个命令e也是想右移动一个单词,只是光标会停留在单词的末尾。
- 0 :移动到行首,注意:这是零而不是O!
- $ :移动到行末。
- ^ :移动到当前行的第一个字符。
- ( :移动到下一个句子。
- ) :移动到上一个句子。注:这两个命令在编写代码是较少用到,但在编辑普通的文本文章时比较有用。
- zz、z.、z-、zt:重画当前屏幕,使当前行显示在屏幕的中间、中间、底部、顶部,具体请:help cmd。
在整个文件域内高效地移动
下面的一些命令可以让你在整个文件范围内移动,从而摆脱掉鼠标滚轮。
- <C-f> :向下滚动一屏。
- <C-b> :向上滚动一屏。
- G :即<S-g>,移动到文件末尾。
- nG :移动到第n行。注:几乎所有可重复性操作都可以使用前缀数字执行n次。
- gg :移动到文件开头。
- H :移动到屏幕的最上方。
- M :移动到屏幕正中间。
- L :移动到屏幕最下方。
- * :这个命令比较强大,它记录当前光标处的单词,并移动到该单词下次出现的位置。
- # :和*相同,但方向相反。
- g* and g#:同上,但匹配包含当前单词的单词,而不是完全匹配。
- /pattern :向下查找模式pattern指定的字符串,pattern可以是一个正则表达式,当然也可以仅仅是一个单词。
- ?pattern :同上,但方向相反。
- mb :在当前光标处设定一个书签bookmark,虽然你看不到,但它确实存在。注:此处b可以是任何一个字母或者数字。
- `b :即ESC下面的”反引号”,移动到一个已经设定的书签处b。注:是`而不是’,不过’也是可以的,但只能移动到书签b所在的行,你可以根据自己的需要来使用。
- `. :这个更牛叉,可以移动到你最近一次修改过的地方。
高效地输入
关键字自动补全
Vim还有关键字自动补全的功能,这意味着:如果你已经定义了一个很长的变量,比如iAmALongLongVariableName,下次就不必在这个名字再完整地敲一遍,而只需要输入iAmA然后按下<C-n>,Vim就会为你自动补全这个变量名,如果前面不止一个类似的变量()那么Vim会弹出一个列表供你选择,在这个列表中你可以用<C-p>和<C-n>上下移动,空格会选择当前高亮的变量名。
选择适当的进入插入模式的方法
很多新手,总是先移动至指定位置,然后再用i进入到插入模式。这确实能够达到目的,但有时却并不合适。比如你现在在行末,需要在行首插入,如果一顿h或者聪明点的用nh或者nb,始终还是不够高效。下面有几个命令可供使用:
- i :在当前光标左侧插入。
- I(大小i) :在行首插入。
- a :在当前光标右侧插入。
- A :在行末插入。
- o :在当前行下面新建一行并进入插入模式。
- O :同o,但在当前行的上面新建一行。
- c{motion} :删除和移动的复合,其中motion是上文中提到过的。比如cfx,会从当前光标处开始删除至字母x(不包括x)并进入插入模式。被删除的字符被保存到剪切板,可以被稍候粘贴到其他地方。
- d{motion} :同上,当并不进入插入模式。
高效地移动文本块
可视化选择
不同于Vim的前身vi,Vim允许你高亮(即Visual可视化模式)某个文本块并对它执行某些操作。选择文本块的方式有三种:
- v 进入可视化模式,此时可以使用前面的移动命令在选取高亮区域。
- V 进入行可视化模式,按行选择,即正行地选择。
- <C-V> 这个很有特色,它可以允许你在文本的任意地方选出一块矩形区域!当然,前提是那里确实有字符,很少有编辑器有这个功能。
按上述方法进入可视化模式后,你可以使用前面的移动命令在选取高亮区域,比如vwww会高亮接下来的三个单词,vjj会选择下面的两行,etc.
剪切和复制
- d :剪切,即删除并放入剪切板。
- y :复制。
- c :同d,但还会进入插入模式。
- d{motion} :和c{motion}类似。
- dd :剪切当前行。
- yy :复制当前行。
- cc :修改当前行。
- D :剪切至行尾。
- Y :同yy。
- C :类似D。
- x:剪切光标处字符。
- s :同x,但进入插入模式。
- p :粘贴。
- n”+yy :这个稍显复杂,它从当前行开始向下复制n行,但和nyy不同的是,文本会被复制到系统剪切板,而不是Vim的剪切板,这样你就能在其他程序比如浏览器中进行Ctrl+V。
- ”+p :从系统剪切板粘贴。
- d’a, y’a:剪切和复制从当前到书签a之间各行。
- ”+y’a:这个看起来有些复杂,它是前面几个命令的整合,和上一个命令功能相同,只是将当前行至书签a所在行复制到系统剪切板。
- ”+ynumG:从当前行一直复制到第num行,相比上面的,这个选择性更大一点。
减少重复性操作
使用.
好吧,我为它单独开了一个章节,.功能实用使用简单,但使用频率却十分的高。一个.可以重复你刚刚执行过的编辑操作,比如删除、粘贴等。
使用宏记录
有时候,你会发现你自己在文章的每段或者每行都重复相同的一系列动作。VIM 允许你记录一个宏来完成你的特殊需要。
- qregister:记录宏到寄存器 register,这里 register 是任意的你的寄存器的名字。比如 qa,将会记录并且把宏存在寄存器 a 里面。
- q:结束宏的记录。
- @register:使用存在寄存器 register 的宏。比如 @a,将会使用存在寄存器 a 里面的宏。
写代码的时候
VIM 是一个用来写代码的绝好编辑器,因为它有一些特性是专门为程序员而设计的。这里是一些常用的基本命令:
- ]p:和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!
- %:匹配花括号、方括号、括号等。在一个括号的上面,然后按 %,鼠标就会出现在匹配的另外一半括号处。
- [{:光标移动至当前块(block)起始处,即上文最近的一个{处。再次[{移动到当前块所在的块起始处。
- ]}:同上,移动至块末尾。
- [/:用于注释块(comment block)中,移动至块起始。
- ]/:移动至注释块末尾。
- »:缩进所有选择的代码
- «:和上面类似,但是反缩进
- gd:到达光标所在处函数或者变量的定义处。
- <C-]>:同上。
- <C-o>:返回<C-]>操作前的位置。操作前的位置
键绑定
发挥你想象力的时候到了。如你所见,Vim本身已经提供了大量的命令供你调遣,但不是所有的命令或者命令组合都适合所有的人。为此,Vim同学给了你根据个人习惯绑定命令的自由。vimrc中的一个简单的map命令即可做到,譬如
“ <cr>标示回车(Enter) map ,w :w<cr> |
列出常用的一些特殊按键的代号,
- <cr>, <Cr>, or <CR>:回车;
- <Space>:空格;
- <Esc>:Esc;
- <c-x> or <C-x>:Ctrl + x;
- <a-x>:Alt + x;
- <m-x>:Meta + x;
- <Left>, <Right>, <Up>, <Down>:方向键;
- <BS>:Backspace;
- <F10>:功能键F10;
- <cword>:当前单词(类似a-b_c2);
- <cWORD>:当前单词(不含空白符的字符串);
- <cfile>:当前单词为名的文件;
- <Home>:Home,不是所有键盘都有的;
- Last but not the least, 所有的字母键都以