从普通模式进入插入模式有如下数个键位可选:
a:往后挪一个字符插入文本。
A:移动到当前行尾插入文本。
i:在光标当前位置插入文本。
I:移动到当前行头插入文本。
o:在当前行的下一行新建一行,并插入文本。
O:在当前行的上一行新建一行,并插入文本。
返回普通模式的键位是Esc键;亦可使用快捷键Ctrl+[。
有的时候用户只是需要进入普通模式下按一次小命令,按两次快捷键来回切换又略显浪费时间。Vim 提供了「插入 - 普通模式」来解决这个问题。在插入模式下,按Ctrl+o即可进入此模式,执行完一次操作后又会自动回到插入模式。
w 可以跳到下个单词的开头;e 可以跳到当前单词结尾;0 可以跳至行首;$ 可以跳至行尾。w、e、0、$ 还可以与其他命令组合,比如 de、dw、d0 和 d& 分别对应删至单词尾、删至下个单词头、删至行首和删至行尾。
普通模式下按/,下方即会出现查找框,输入需要查找的字符,按回车后就能查看搜索结果。如果有多个查找结果,按n即可跳至下一个查找结果;按N可跳至上一个。
:e filename 可以打开当前目录下的指定文件。
:s 命令是替换,如
" 把当前行第一个匹配的 str1 替换成 str2
:s/str1/str2/
" 把当前行所有的 str1 替换成 str2
:s/str1/str2/g
" 把第 x1 行至 x2 行中,每一行第一个匹配的 str1 替换成 str2
:x1,x2 s/str1/str2/
" 把第 x1 行至 x2 行中所有的 str1 替换成 str2
:x1,x2 s/str1/str2/g
" 把所有行第一个匹配的 str1 替换成 str2
:%s/str1/str2/
" 把全文件所有的 str1 替换成 str2
:%s/str1/str2/g
查找这一行的关键字:
光标往下查找:f +[char]
光标往前查找:F + [char]
翻页/翻半页:ctrl + u/b/d/f
用Ctrl+h代替Backspace(甚至可以在终端里这样用)。
用Ctrl+m代替回车(甚至可以在终端里这样用)。
在绝大多数的情况下,不要去按右边的Ctrl和Shift,用左边的代替。
Vim 中,用于重复执行指令的方式有.命令,简单的录制与重复宏与 normal 命令。
. 命令
Vim 的使用者不可避免地会抗拒重复的文本修改,因为 Vim 注定比其他编辑器会多出两次按键——Esc与i。但是,Vim 其实提供了重复命令 .,它适用于重复的添加、修改、删除文本操作。
. 命令可以重复上次执行的命令。但是这个「命令」并不只限于单一的命令,它也可以是 数字 + 命令 的组合;进入插入模式 + 输入文本 + Esc 也是命令的一种。所以,适当使用 . 命令才能达到最高的效率。
例如,如下代码的每一行末尾都少了分号:
int a, b
cin >> a >> b
cout << a + b
return 0
将 . 与搭配移动到行尾插入命令 A 使用,就能高效地补上末尾的分号。
A;
" 重复下面的命令
j.
再例如,如下代码中,后面五个赋值语句的数组名全部写错了:
int check() {
book[1] = 1, book[2] = 1, book[3] = 1, bok[1] = 1, bok[2] = 1, bok[3] = 1,
bok[4] = 1, bok[5] = 1;
return 0;
}
一个个改过于麻烦,而命令行模式的 s 命令又会全部改掉。
第一种改法是搭配普通模式下的 s 命令(删除光标处字符并进入插入模式)使用。来到第一个错误的数组名首字母处,按下 3s/cw,输入正确的数组名并退出。之后把光标一个个移过去,再使用 . 命令。
第二种比较节省时间的改法是利用查找模式修改。键入 /bok,接着按下回车,并使用 n 键来到第一个错误的数组名首字母处,键入 3s 新数组名
第三种改法是简易查找命令 f。在一行中普通模式下,f + 单个字符 即可查找此行中出现的这个字符并将光标移至字符处;按 ; 查找下一个,, 查找上一个。所以对于上面的代码,只需键入 fb;;; 之后进入插入模式修改,然后 ;. 即可。这种改法适用于只需行内移动的情况。
宏
Vim 的宏功能可以重复任意长的命令。
使用宏之前要先“录制”,即把一串按键操作录下来再回放,这样就达到了重复的效果。录制的方法很简单,普通模式下键入 q 开始录制。下一步,为录制的宏指定一个执行的命令键,可以按下 26 个字母中的任意一个来指定。这时左下方会显示 记录中 @刚刚选择的字母。然后就可以开始录制命令了。同理,普通模式下按 q 暂停录制。
使用方法为按下 : 进入命令行模式,键入 @选择的记录字母,然后之前录制的命令就被调用了。
将 . 和宏组合,即录制宏 → 调用宏 →. 重复命令 → 数字 +.,可以达到非常高的效率。
normal 命令
该命令与普通模式有关,效果是在指定行重复命令。
按 : 进入命令行模式,输入如下命令:
:a,b normal command
这行命令的意思是在普通模式下,对 a~b 行执行 command 命令。
由于 normal 命令可以被 . 命令重复调用,且其易于理解,它的使用频率甚至更高于宏。
数字 +.+ 宏 + normal
单个命令并不能完全体现出它们的强大,命令组合使用的时候才是它们最强大的时侯。
例如:
我下载了一本书,我需要它的每一个章节都变成「标题」,以方便转换成 mobi 之类的格式,或者方便生成 TOC 目录跳转,怎么办呢?几千个章节哪里好处理哇。
以下是用 Vim 处理的过程:
按下/调出查找框,输入正则表达式进行查找;
用 q 命令开始录制宏;
键入 I# 命令,然后按下ESC;
用 q 进行修改操作并结束宏录制;
键入 normal n@字母 转到下一处并重复上一步操作;
键入 数字 + . 多次重复。
小方便性插件
vim-commentary:快捷键 gc 注释选中行,gcu 撤销上次注释。
ale::w 保存时提示语法错误,并且可以开启与 airline 的携同,状态栏上也会显示 Error 和 Warning。
easymotion:快速跳转。
rainbow:彩虹括号,使具有包含关系的括号显现出不同的颜色,增强多括号代码的可读性……
delimitMate:括号补全功能。考试中可用配置实现部分功能,见配置篇。
vimcdoc:汉化 Vim 在线文档。
gundo:这个插件能够像 git 一样显示文件修改树。Vim 中键入 :GundoToggle 即可在左侧打开时光机。使用前需要在 Vim 里开启 Python 支持。
vimim:相当于给 Vim 安装中文输入法。安装方法为在 .vim 文件夹中创建文件夹 plugin,然后点击 vimim 下载链接 下载文件,最后放入此文件夹中。使用方法为打开 Vim 并进入插入模式,按下Ctrl+/即可启用。但是该插件使用的是云词库,若没网就会卡死。所以建议下载 本地超大词库,与插件一并放入 plugin 文件夹中,与插件脚本同目录即可启用。
vim-instant-markdown:一个即时预览 Markdown 文件的插件。打开 Markdown 文件时会自动在浏览器中打开一个标签页,实时预览 Vim 中正在编辑的 Markdown 文件的内容。