Vim学习笔记 #1 基础操作与配置
本文最后更新于:2024年12月14日 晚上
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<char>:快速移动到上面 F<char>:快速移动到上面,从行尾开始搜索 t<char>:快速移动到的前一个字符 T<char>:快速移动到的后一个字符,从行尾开始搜索 - 如果一行中有多个
:可以用 ;继续搜索该行下一个,或用 ,继续搜索该行上一个
快速移动到一行的行首或行尾:
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<char>:从光标位置剪切到之前的字符
搭配数字可以多次执行:
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/\<num\>/digit/g:支持正则,只匹配 num 并替换为 digit
复制粘贴
在 Normal 模式下,复制(称为 yank)和剪贴(称为 delete)的基本命令分别是 y 和 d,而粘贴命令是 p。这些命令都可以配合文本对象使用,以实现更灵活的操作。
复制操作(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。
以下是一些常用的基础配置:
1 | |
按键映射
Vim 的按键映射是将一个操作映射到另一个操作上,常用于设置一些方便的快捷键。按键映射可以分为几种模式:Normal 模式、Visual 模式和 Insert 模式。在不同模式下定义映射的方法:
nmap:只在 Normal 模式下有效。vmap:只在 Visual 模式下有效。imap:只在 Insert 模式下有效。
以下是一些用法举例:
1 | |
小技巧
- 不小心按了 Ctrl + S 后编辑器假死,其实只是 Vim 停止向终端输出了,只要按下 Ctrl + Q 就可以恢复。