Vim学习笔记 #1 基础操作与配置
本文最后更新于:2024年8月5日 晚上
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
:向上搜索 pattern
- n
:跳到下一个匹配 - 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
、ciw
C
:删除当前光标到行尾的内容并且进入编辑模式
撤销还原
在 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 就可以恢复。