21 04月
2678

Vim 基础操作快速入门

vim 号称辑器之神,与 Emacs, 其他编辑器三分天下。很多人都经历了从入门到放弃的痛苦过程。

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

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/<CR>。这里的:让 vim 切换到命令模式,s表示替换,/vi/vim/表示将 vi 替换为 vim。<CR>表示回车。命令模式在执行完成之后会自动切换回普通模式。

vim 默认只会替换查找到的第一个 vi。如果要替换行内所有的 vim,则需要输入:s/vi/vim/g<CR>,注意最后的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;会删除光标所在位置到行内下一个分号间的所有内容。