vim实用技巧
这篇文章记录一些日常写代码、改配置、远程机器排障时高频用到的 Vim 技巧。先记住少量命令,再逐步把它们组合起来,效率会提升得很明显。
Vim 模式
Vim 的核心是“模式”。不用一开始记太多,先掌握下面几种就够日常使用。
- 普通模式:移动光标、复制、删除、搜索、执行命令。按
Esc回到普通模式。 - 插入模式:输入文本。常用
i、a、o进入。 - 可视模式:选择文本。常用
v、V、Ctrl + v进入。 - 命令模式:保存、退出、替换、打开文件。普通模式下输入
:进入。
Vim 基础操作
进入插入模式
i 在光标前插入
a 在光标后插入
I 在当前行行首插入
A 在当前行行尾插入
o 在下一行新建一行并插入
O 在上一行新建一行并插入
保存和退出
:w 保存文件
:q 退出
:wq 保存并退出
:q! 不保存强制退出
:x 保存并退出,只有文件发生变化时才写入
ZZ 保存并退出
ZQ 不保存退出
光标移动
基础移动
h 向左移动
j 向下移动
k 向上移动
l 向右移动
w 移动到下一个单词开头
e 移动到当前或下一个单词结尾
b 移动到当前或上一个单词开头
0 移动到当前行行首
^ 移动到当前行第一个非空字符
$ 移动到当前行行尾
页面移动
gg 跳转到文件开头
G 跳转到文件末尾
10G 跳转到第 10 行
Ctrl + f 向下翻一页
Ctrl + b 向上翻一页
Ctrl + d 向下翻半页
Ctrl + u 向上翻半页
zt 将当前行移动到屏幕顶部
zz 将当前行移动到屏幕中间
zb 将当前行移动到屏幕底部
编辑文本
删除、复制、粘贴
x 删除当前字符
dd 删除当前行
D 删除光标到行尾的内容
dw 删除一个单词
d$ 删除光标到行尾
yy 复制当前行
yw 复制一个单词
p 粘贴到光标后
P 粘贴到光标前
u 撤销
Ctrl + r 重做
修改文本
r 替换当前字符
R 进入替换模式
cw 修改一个单词
ciw 修改当前单词
C 修改光标到行尾的内容
cc 修改整行
s 删除当前字符并进入插入模式
S 删除当前行并进入插入模式
常用组合
Vim 很多命令都遵循“操作 + 范围”的组合方式。
d2w 删除后 面两个单词
y3j 复制当前行和下面三行
c$ 修改光标到行尾的内容
d} 删除到下一个段落
ci" 修改双引号里面的内容
ci' 修改单引号里面的内容
ci( 修改小括号里面的内容
ci{ 修改大括号里面的内容
di[ 删除中括号里面的内容
查找和替换
查找
/keyword 向下搜索 keyword
?keyword 向上搜索 keyword
n 跳转到下一个匹配结果
N 跳转到上一个匹配结果
* 搜索当前光标所在单词
# 反向搜索当前光标所在单词
替换
:s/old/new 替换当前行第一个匹配项
:s/old/new/g 替换当前行所有匹配项
:%s/old/new/g 替换整个文件所有匹配项
:%s/old/new/gc 替换整个文件所有匹配项,并逐个确认
:10,20s/old/new/g 替换第 10 行到第 20 行的匹配项
如果替换内容中包含 /,可以换成其他分隔符:
:%s#https://old.example.com#https://new.example.com#g
可视模式
v 进入字符选择模式
V 进入行选择模式
Ctrl + v 进入块选择模式
选中文本后可以继续执行:
d 删除选区
y 复制选区
> 向右缩进
< 向左缩进
= 自动格式化缩进
块选择模式适合批量编辑多行。例如给多行前面加注释:
Ctrl + v进入块选择模式- 用
j或k选择多行 - 按
I在行首插入 - 输入注释符号,例如
// - 按
Esc应用到所有选中的行
多文件和缓冲区
:e fileName 打开文件
:ls 查看缓冲区列表
:bnext 切换到下一个缓冲区
:bprev 切换到上一个缓冲区
:b 2 切换到编号为 2 的缓冲区
:bd 关闭当前缓冲区
:tabnew fileName 在新 tab 中打开文件
gt 切换到下一个 tab
gT 切换到上一个 tab
分屏操作
:sp 水平分屏
:vsp 垂直分屏
:sp fileName 水平分屏打开文件
:vsp fileName 垂直分屏打开文件
Ctrl + w + h 切换到左侧窗口
Ctrl + w + j 切换到下方窗口
Ctrl + w + k 切换到上方窗口
Ctrl + w + l 切换到右侧窗口
Ctrl + w + = 平均分配窗口大小
Ctrl + w + q 关闭当前窗口
寄存器
Vim 的复制、删除会进入寄存器。最常用的是系统剪贴板寄存器和黑洞寄存器。
"ayy 复制当前行到寄存器 a
"ap 粘贴寄存器 a 的内容
"+y 复制选中内容到系统剪贴板
"+p 从系统剪贴板粘贴
"_d 删除内容但不污染默认寄存器
例如想删除一段文本,但不影响刚才复制的内容,可以选中后执行:
"_d
宏
宏适合处理“重复但又不完全适合搜索替换”的编辑任务。
qa 开始录制宏到寄存器 a
执行一组操作
q 停止录制
@a 执行寄存器 a 中的宏
10@a 连续执行 10 次宏
一个常见场景是批量给每行末尾加逗号:
- 将光标放到第一行
- 输入
qa - 输入
A, - 按
Esc - 输入
j - 输入
q - 输入
10@a
标记和跳转
ma 在当前位置设置标记 a
`a 跳转到标记 a 的精确位置
'a 跳转到标记 a 所在行
Ctrl + o 跳转到上一个位置
Ctrl + i 跳转到下一个位置
% 在成对括号之间跳转
折叠代码
zf 创建折叠,需要先选中范围
zo 打开当前折叠
zc 关闭当前折叠
za 切换当前折叠状态
zR 打开所有折叠
zM 关闭所有折叠