Vim 快速入门

2018-04-14

vim 号称辑器之神,与 Emacs, 其他编辑器三分天下。很多人都经历了从入门到放弃的痛苦过程。我在大二的时候首次接触 vim,先后放弃了三次,最终掌握了 vim 的使用技巧。算下来,我也是有超过 5 年经验的 vim 老人了。使用 vim 极大地提升了我的工作效率,我也在研究 vim 的过程中获得了很多的乐趣。我希望 vim 能够帮助到更多的朋友,我也希望有更多的朋友能够体会到我的乐趣。

大家最早接触的电脑基本都是 Windows 系统,有文本框、有鼠标、有键盘,甚至还有软键盘。大家一开始就知道在文本框输入文本,用鼠标选中文本等操作。于是,大家习惯成自然。当大家打开 vim 的时候,发现无法选中、无法使用鼠标,甚至无法退出,大家就认为 vim 的作者脑子有毛病,然后『弃之如敝屐』。

vim 的作者在设计 vim 的时候选择了一条少有人走的路。这导致 vim 的使用方式不符合大家的直觉,所以大家觉得 vim 难用。本文就为大家说说这条少有人走的路。

vim 模式

vim 一打开,就会进入所谓的普通模式(Normal)。在这个模式下,大家输入的所有内容都会被 vim 解析成相应的指令并执行。如果要输入内容,必须键入字母i来命令 vim 切换到所谓的插入模式(Insert)。在插入模式下,大家就可以像在其他普通编辑器下那样输入文字了。输入完毕,需要通过按Esc返回普通模式。那这个普通模式到底有什么用呢?在普通模式下,大家可以快速地查找、定位、修改和删除代码。在插入模式下,相应的操作会低效不少。作为程序员都有体会,大家大部分时间是在查代码、看代码、改代码,而写代码所占的比重并不大。为了提升整体的工作效率,vim 将普通模式作为默认模式。代价则是大家需要在输入文本的时候切换一次模式。

vim 还有一个可视模式(Visual),『可视』是直译,翻译成『选中』比较合适。可视模式跟普通编辑器的选中有点像,都会选中一片文字,然后可以对选中的文字做一些操作。但 vim 的可视模式分三种,分别是:普通选中、按行选中和按列选中。使用v开始普通选中,使用V开始行选中,使用ctrl+v开始列选中。选中之后可以执行其他操作,返回普通模式直接按Esc。

vim 共有 7 种基本模式,外加 7 种附加模式,可以通过 :h vim-modes 查看详情。初学者掌握普通、插入和可视三种模式就足够了。

移动光标

vim 使用 hjkl 四个键来控制光标向左下上右四个方向移动,一次移动一行或者一列。至于为什么要先这个四个键,大家可以参考这篇文章。你的右手不用离开原位键就能按到 hjkl 这四个键。稍加练习就能灵活地控制光标。

vim 还针对行内移动提供了一些快捷键,加快移动速度。如^表示移到行首、$表示移到行尾。用过正则的朋友应该熟悉这两个字母。vim 还支持按单词移动,如w表示跳到下一个单词的开头,e表示跳到下一个单词的结尾。这些命令很有用,但初学 vim 不用记那么多,知道有这些功能就够了。

vim 行内移动的大杀器则是行内查找。大家可以通过键入f;跳转到当前行的下一个;上。这个f表示向前(行尾)查找;如果要向后查找,则需使用F。注意,行内查找仅支持单个字母。

向上翻页用ctrl+b,向下用ctrl+f。跳到文件的第一行用gg,最后一行用G。

vim 还有很多移动快捷键,相对不那么常用,这里不多介绍,初学者不用纠结。

如果只看 hjkl,大家不觉得 vim 在光标移动上有什么优势,甚至会认为还不如使用上下左右键方便。但再看行内查找,大家应该就能体会到普通模式(Normal)的威力。普通模式并不普通!

查找替换

向下(文章末尾)查找使用/,例如/vim会跳转到下一个 vim 所在的位置。向上则使用?。还有一个常用的功能就是查找光标所在的单词,向下用*, 向上用#。普通编辑器的查找下一个功能 vim 也是支持的,快捷键为n。

替换相对麻烦一点,需要使用所谓的命令模式(Command)。只替换当前行:s/vi/vim/。这里的:让 vim 切换到命令模式,s表示替换,/vi/vim/表示将 vim 替换为 vim。表示回车。命令模式在执行完成之后会自动切换回普通模式。

vim 默认只会替换查找到的第一个 vi。如果要替换行内所有的 vim,则需要输入:s/vi/vim/g,注意最后的g。如果要全文替换,可以输入:%s/vi/vim/g。大家可以通过:h :s查看更多高级用法。

删除修改

初学者一般会先切换到插入模式,使用退格键删除已有内容,再输新内容。这不但效率低下,还会挫伤初学者的积极性。正解如下:

删除当前行用dd。删除光标所在的字母用x,修改用r+新字母。也可以选中之后按x或者d删除整片文字。大家选中之后还可以按c,vim 会删除选中内容,并切换到插入模式,大家可以继续输入新内容。

vim 还有一个所谓的替换模式(Replace),通过R开启,开启后光标所在的内容会被新输入的内容替换。结束用esc返回普通模式。

复制粘贴

复制当前行用yy。也可以选中内容后按y复制。

粘贴使用p。如果之前是整行复制,按p会将复制的内容粘贴到当前行的下一行,粘贴到上一行用P;如果之前是选中复制,按p会将复制内容粘贴到光标当前位置的后面,粘贴到前面用P。

撤销重做

撤销上次操作用u,反撤销用ctrl+r。

保存退出

保存退出都要在命令模式下完成。保存用:w path.txt,退出用:q。如果是编辑已经存在的文件可以直接用:wq退出。

vim 范式

改动+重复可以使用.。如:先是cawhello esc将当前单词那成 hello,按w跳到下一个单词,再按.就会重复上次的改动将单词改成 hello。

数字+操作可以重复执行多次相同的操作。如:j表示向下移动一行,10j表示向下移动 10 行。 p表示粘贴一次,10p表示粘贴 10 次。

动作+范围可以显著提升效率。如:y$会复制从光标当前位置到行尾的所有内容;df;会删除光标所在位置到行内下一个分号间的所有内容。

结语

本文介绍了 vim 的设计宗旨和基本使用方法。按照文中所述稍加练习就能够使用 vim 应对日常编辑。大家在熟练掌握本文内容以后,可以进一步学习《Vim 实用技巧》这本书。

「taoshu」微信公众号