Vim 常常因其极高的学习门槛劝退很多新手,但在在一些特殊的场景中,你可能不得不抛弃图形文本编辑器,例如:实验室的服务器、公司的安全域主机(物理隔绝网络)等。
本文将介绍 Vim 自带的基础操作,以及如何配置文件来实现更高级的操作。Vim 在大多数 Unix 系统下都可以使用,本文的版本为 vim8,使用 vim --version 即可查看。
速查表Normal 模式下:
w:移动到下一个单词的开头b:移动到前一个单词的开头u:撤销上一步操作Ctrl + r:重做撤销的操作y:复制(yank)yy:复制当前行yw:复制当前单词p:粘贴(put)p:在光标后粘贴P:在光标前粘贴d:删除(delete)dd:删除当前行dw:删除当前单词ggdG:删除全部内容x:删除(剪切)光标所在字符/pattern:向下搜索 pattern?pattern:向上搜索 patternn:跳到下一个匹配N:跳到上一个匹配基础操作打开与退出输入 vim 即可进入 Vim 编辑器并打开空文件;输入 vim <文件名>,即可用 Vim 去编辑对应文件,如果文件不存在则会新建文件。
进入 Vim 之后是 Normal 模式,此时无法输入任何东西,使用 :q 可以退出 Vim 编辑器,使用 :w 可以保存文件,使用 :wq 可以保存文件并退出。
Insert 模式要编辑文件,必须进入编辑模式,在 Normal 模式下输入 i、a、o 即可进入:
i:在当前光标的位置插入(insert)a:在当前光标后的位置插入(append)o:在当前光标的下一行插入(open a line below)Vim 的开发人员为了提高编辑效率,大写字母 I、A、O 也可以进入编辑模式:
I:从该行最前面开始编辑A:从从该行最后面开始编辑O:从光标所在行的上面另起一行开始编辑在编辑模式下,按 Esc 键即可退回到 Normal 模式,通常建议将 Esc 键映射到键盘的 CapsLock 键,下文将介绍如何映射。
光标移动键盘自带的上、下、左、右方向键可以在任何模式使用。此外,在 Normal 模式下,还可以使用 hjkl 来代替方向键,分别代表左、下、上、右,这样就可以在手不离开键盘的情况下移动光标。
在 Normal 模式下,可以按 gi 键以跳动到从编辑模式退出时光标所在的位置,并进入编辑模式。
此外 Normal 模式还支持更多光标移动的快捷键:
以单词为单位移动,其中小写字母的表示以非字母为分割单位(标点符号、空白符都是分割单位),大写字母仅以空白符为分割的单位:
w/W:移动到下一个单词的开头
e/E:移动到下一个单词的结尾
b/B:移动到上一个单词的开头
行间单个字符搜索移动:
f
0:快速移动到行首$:快速移动到行尾^:快速移动到非空白字符行首g_:快速移动到非空白字符行尾快速垂直移动:
():在句子间移动(粒度更细){}:在段落之间移动快速页面移动:
gg:移动到文件第一行G:移动到文件最后一行H:移动到屏幕的开头M:移动到屏幕的中间L:移动到屏幕的结尾zz:把当前行设置为屏幕中间ctrl + u:上翻页ctrl + f:下翻页删除修改在 Normal 模式下,按 x 可以快速剪切一个字符,剪切后可以粘贴,如果不粘贴即当删除使用。
同时,使用 d 配合文本对象可以快速剪切一个单词,比如:
dw:剪切光标后面的单词(delete word)daw:剪切光标所在的单词及旁边的空格(delete around word)diw:剪切光标所在的单词,但不包括单词旁边的空格配合快速移动光标,可以:
d0:剪切当前光标到行首的内容d$:剪切当前光标到行尾的内容dd:剪切当前行dt
5dd:剪切当前开始的 5 行5x:剪切 5 个字符在 Normal 模式下,支持多种快速修改方式:
r:替换一个字符,直接输入需要替换的字符即可R:持续替换,后续的输入都会替换光标所在字符s:删除当前字符并且进入编辑模式S:删除当前行并且进入编辑模式c:快速删除一个单词并且进入编辑模式,也支持三种文本对象:cw、caw、ciwC:删除当前光标到行尾的内容并且进入编辑模式撤销还原在 Normal 模式下:
u:撤销上次操作ctrl + r:还原上次撤销(撤销上一个 u)高级操作View 模式Vim 有三种视图模式,在此模式下,用命令移动光标,光标起始位置和当前位置之间的文本将会以高亮显示。这时就可以对这些高亮显示的文本进行整体的操作。
在此模式下也支持 hjkl 移动光标,推荐配合数字键快速移动。移动的单位分为字符、行、列:
v:激活面向字符的视图模式V:激活面向行的视图模式ctrl + v:激活面向列块的视图模式gv:重选上次的高亮选区o:切换到高亮选区的起始段,从而选择另一侧O:在块模式下,切换到当前行的另一侧针对高亮显示的文本块,我们可以用命令 ~ 进行大小写转换。用命令 > 增加缩进,或用命令 < 减少缩进。用命令 d 删除全部,或用命令 y 复制全部。
当我们想要退出可视化模式时,可以按 ESC 键或 Ctrl + c 键。
多文件操作Vim 中有以下概念:
buffer:指打开的一个文件的内存缓冲区,每个打开的文件对应一个 buffer,之后的修改都是针对内存中的缓冲区,并不会直接保存到文件中。你可以在不同 buffer 之间切换,从而在多个文件之间操作。当我们在命令行输入 :w 的时候,才会将缓冲区中的内容写到文件中。window:是 buffer 的可视化的分割区域。一个 window 可以显示一个 buffer 的内容,通过分割窗口可以同时查看和编辑多个文件。tab:多个 window 组成的一个工作区。一个 tab 页面可以包含多个分割窗口,每个窗口可以显示不同的 buffer,从而提供一个更加灵活的多文件编辑环境。管理 Buffer:
:e filename:打开文件 filename,并将其加载到新的 buffer 中。:ls 或 :buffers:列出所有已加载的 buffer。:bnext 或 :bn:切换到下一个 buffer。:bprev 或 :bp:切换到上一个 buffer。:b #:切换到上一个使用的 buffer。:bd:关闭当前 buffer。:bd [n]:关闭编号为 [n] 的 buffer。注意:直接关闭一个 buffer (:bd 或 :bd [n]) 时,其内容不会自动保存。如果 buffer 有未保存的更改,Vim 会提示保存更改。你可以选择保存 (:w),放弃更改 (:bd!),或者取消关闭操作。
管理 Window:
:split 或 :sp:水平分割窗口,并打开当前 buffer,默认显示同一个文件。:vsplit 或 :vsp:垂直分割窗口,并打开当前 buffer,默认显示同一个文件。Ctrl + w, w:切换窗口焦点,循环。Ctrl + w, q:关闭当前窗口。Ctrl + w, s:水平分割窗口。Ctrl + w, v:垂直分割窗口。Ctrl + w, h:移动到左边的窗口。Ctrl + w, j:移动到下边的窗口。Ctrl + w, k:移动到上边的窗口。Ctrl + w, l:移动到右边的窗口。分割窗口:使用 :sp 或 :vsp 命令分割窗口后,两个界面默认显示相同的 buffer 的内容。可以可以使用 :e 或 :bn 等操作切换窗口内的 buffer。窗口的大小可以用鼠标进行拖拽。
管理 Tab:
:tabnew 或 :tabnew filename:打开新的 tab 页,并在其中打开文件 filename。:tabc 或 :tabclose:关闭当前 tab 页。:tabo 或 :tabonly:关闭所有其他 tab 页,只保留当前 tab 页。:tabn 或 :tabnext:切换到下一个 tab 页。:tabp 或 :tabprevious:切换到上一个 tab 页。:tabs:列出所有 tab 页及其编号。查找替换查询(Normal 模式下):
/<内容> 向下查找内容?<内容> 向上查找内容n 查找之后,按 n 跳转到下一个匹配N 查找之后,按 N 跳转到上一个匹配* 查找之后,再对当前光标所在单词进行向下查找# 查找之后,再对当前光标所在单词进行向上查找替换(Normal 模式下)则相对比较复杂,整体格式为:[range]s/{string1}/{string2}/[flags],其中:
range:要替换的范围,比如 10,20: 10-20 行,%:全部string1:要替换的字符串,string2:替换成为的字符串flags:标志,常用的有 g(表示全局范围内执行),没有 g 的话,每一行只会替换该行中第一个匹配成功的。c:确认,在进行替换时可以选择是否进行替换。n:匹配的次数,但不进行替换。例如:
s/s1/s2:替换当前行第一个 s1 为 s2s/s1/s2/g:替换当前行中所有 s1 为 s2%s/s1/s2/g:替换文件中所有 s1 为 s2%s/\
复制操作(yank)
yy:复制当前行。
yw:复制当前单词。
y$:复制从光标位置到行尾的内容。
y0:复制从光标位置到行首的内容。
剪切操作(delete)
dd:剪切当前行。
dw:剪切当前单词。
d$:剪切从光标位置到行尾的内容。
d0:剪切从光标位置到行首的内容。
粘贴操作(put)
p:在光标后粘贴。
P:在光标前粘贴。
进入 Visual 模式后,可以选择要复制的部分,然后使用相应命令进行复制或剪切:
v:进入 Visual 模式,选择字符。V:进入 Visual Line 模式,选择整行。Ctrl + v:进入 Visual Block 模式,选择矩形块。在选择文本后,可以使用以下命令:
y:复制选中的文本。d:剪切选中的文本。p:粘贴文本。Vim 的复制粘贴功能非常复杂且强大,但随着时间的推移,一些功能更强大、更加方便的插件已经取代了内置的复制粘贴功能。这些插件提供了更直观和高级的文本操作方式,使得用户可以更加高效地处理文本。
由于插件的多样性和功能强大,本文不再深入探讨 Vim 内置的复杂复制粘贴功能。推荐使用插件来增强 Vim 的复制粘贴体验,例如 vim-easymotion 和 vim-surround 等。
代码补全现在 Vim 的补全功能已经由插件实现了,Vim 自带的补全功能基本不再使用了,这个将在插件篇进行详解。
配置文件基础配置在 Vim 中有非常多的设置,例如 set number 用于显示行号。但是,每次打开 Vim 都要手动进行这些操作非常麻烦。我们可以将这些设置写在 Vim 的配置文件中,每次启动 Vim 时,它会自动读取配置文件中的内容。这个配置文件位于 ~/.vimrc。
以下是一些常用的基础配置:
1234567891011121314151617181920" 显示行号set nu" 设置主题colorscheme hybrid" 开启语法高亮syntax on" 保持上一行的缩进set autoindent" 设置缩进单位为 4 个空格set shiftwidth=4" 设置 Tab 键的宽度为 4 个空格set tabstop=4" 将 Tab 键自动转换为空格set expandtab按键映射Vim 的按键映射是将一个操作映射到另一个操作上,常用于设置一些方便的快捷键。按键映射可以分为几种模式:Normal 模式、Visual 模式和 Insert 模式。在不同模式下定义映射的方法:
nmap:只在 Normal 模式下有效。vmap:只在 Visual 模式下有效。imap:只在 Insert 模式下有效。以下是一些用法举例:
1234567891011121314" 在 Normal 模式下,按下空格选择整个单词nmap