Vim 高级技巧
提升编辑效率的高级技巧和模式
🎯 操作符 + 动作(Operator + Motion)
核心概念
Vim 的强大在于操作符和动作的组合:
操作符 + 动作 = 编辑操作
操作符列表
| 操作符 | 说明 |
|---|---|
d | 删除(delete) |
y | 复制(yank) |
c | 删除并进入插入模式(change) |
> | 向右缩进 |
< | 向左缩进 |
= | 自动缩进 |
g~ | 大小写转换 |
gu | 转小写 |
gU | 转大写 |
动作列表
| 动作 | 说明 |
|---|---|
w | 到下一个单词开头 |
e | 到单词末尾 |
b | 到上一个单词开头 |
$ | 到行尾 |
0 | 到行首 |
} | 到下一段 |
{ | 到上一段 |
G | 到文件末尾 |
gg | 到文件开头 |
组合示例
" 删除操作
dw " 删除一个单词
d$ " 删除到行尾
d} " 删除到下一段
dG " 删除到文件末尾
" 复制操作
yw " 复制一个单词
y$ " 复制到行尾
ygg " 复制到文件开头
" 修改操作
cw " 修改单词(删除并进入插入模式)
c$ " 修改到行尾
ci" " 修改引号内容
ci( " 修改括号内容文本对象(Text Objects)
Vim 支持文本对象,更精确地选择文本:
| 文本对象 | 说明 |
|---|---|
iw | 内部单词(inner word) |
aw | 一个单词(a word,包含空格) |
i" | 引号内部 |
a" | 引号及其内容 |
i( | 括号内部 |
a( | 括号及其内容 |
it | 标签内部 |
at | 标签及其内容 |
示例:
di" " 删除引号内容(保留引号)
da" " 删除引号及其内容
ci( " 修改括号内容
yi[ " 复制方括号内容🎬 宏录制(Macros)
基本使用
宏可以录制一系列操作并重复执行。
| 命令 | 说明 |
|---|---|
q{a-z} | 开始录制宏到寄存器 |
q | 停止录制 |
@{a-z} | 执行宏 |
@@ | 重复执行上次宏 |
{n}@{a-z} | 执行宏 n 次 |
使用示例
场景:在每行开头添加 ”// ”
- 移动到第一行
qa- 开始录制宏到寄存器 aI//- 在行首插入 ”// ”Esc- 返回普通模式j- 移动到下一行q- 停止录制@a- 执行宏(应用到当前行)10@a- 执行宏 10 次
宏技巧
" 查看宏内容
:reg a " 查看寄存器 a 的内容
" 编辑宏
" 1. 将宏粘贴到文件
" 2. 编辑
" 3. 复制回寄存器
" 追加到宏
qA " 追加到寄存器 a(大写 A)🔄 重复操作
点命令(.)
. 命令重复上次的编辑操作。
示例:
" 删除单词
dw " 删除一个单词
. " 重复删除下一个单词
" 修改单词
cw " 修改单词
输入新内容
Esc
. " 重复修改操作数字前缀
在命令前加数字可以重复执行:
5dd " 删除 5 行
3yy " 复制 3 行
10j " 向下移动 10 行
5. " 重复上次操作 5 次📝 多文件编辑
缓冲区(Buffers)
| 命令 | 说明 |
|---|---|
:e file | 打开文件到新缓冲区 |
:bnext 或 :bn | 下一个缓冲区 |
:bprev 或 :bp | 上一个缓冲区 |
:bfirst | 第一个缓冲区 |
:blast | 最后一个缓冲区 |
:bdelete 或 :bd | 删除缓冲区 |
:buffers 或 :ls | 列出所有缓冲区 |
:b {n} | 切换到第 n 个缓冲区 |
窗口(Windows)
| 命令 | 说明 |
|---|---|
:split 或 :sp | 水平分割 |
:vsplit 或 :vs | 垂直分割 |
Ctrl+w s | 水平分割 |
Ctrl+w v | 垂直分割 |
Ctrl+w q | 关闭当前窗口 |
Ctrl+w o | 只保留当前窗口 |
Ctrl+w h/j/k/l | 切换窗口 |
Ctrl+w w | 循环切换窗口 |
Ctrl+w = | 平均分配窗口大小 |
Ctrl+w + | 增加窗口高度 |
Ctrl+w - | 减少窗口高度 |
标签页(Tabs)
| 命令 | 说明 |
|---|---|
:tabnew | 新建标签页 |
:tabclose | 关闭当前标签页 |
:tabonly | 只保留当前标签页 |
gt | 下一个标签页 |
gT | 上一个标签页 |
{n}gt | 切换到第 n 个标签页 |
🔍 高级搜索
搜索选项
" 基本搜索
/pattern " 向下搜索
?pattern " 向上搜索
" 搜索选项
/\cpattern " 忽略大小写(临时)
/\Cpattern " 区分大小写(临时)
/pattern\c " 在模式后加 \c 忽略大小写
" 特殊字符转义
/\<word\> " 精确匹配单词
/^pattern " 行首匹配
/pattern$ " 行尾匹配正则表达式
" 基本元字符
. " 匹配任意字符
* " 匹配前一个字符 0 次或多次
\+ " 匹配前一个字符 1 次或多次
\? " 匹配前一个字符 0 次或 1 次
^ " 行首
$ " 行尾
\< " 单词开头
\> " 单词结尾
" 字符类
[abc] " 匹配 a、b 或 c
[0-9] " 匹配数字
[a-z] " 匹配小写字母
[^abc] " 不匹配 a、b、c
" 分组
\(pattern\) " 分组
\1 " 引用第一个分组搜索历史
/ " 然后按上下箭头浏览搜索历史
:history / " 查看搜索历史🔄 高级替换
替换命令详解
" 基本格式
:[range]s/pattern/replacement/[flags]
" range(范围)
:s/old/new " 当前行
:5s/old/new " 第 5 行
:5,10s/old/new " 第 5-10 行
:%s/old/new " 全文(% 表示所有行)
:.,$s/old/new " 从当前行到文件末尾
:'<,'>s/old/new " 在可视模式下选择的区域
" flags(标志)
g " 替换行内所有匹配(默认只替换第一个)
c " 每次替换前确认
i " 忽略大小写
e " 不显示错误替换示例
" 替换全文
:%s/foo/bar/g
" 替换并确认
:%s/foo/bar/gc
" 使用分组
:%s/\(foo\)bar/\1baz/g " 将 foobar 替换为 foobaz
" 使用特殊字符
:%s/\s\+$//g " 删除行尾空格
:%s/^/\t/g " 在每行开头添加 Tab📋 寄存器(Registers)
寄存器类型
| 寄存器 | 说明 |
|---|---|
" | 默认寄存器 |
0-9 | 数字寄存器(0 是最近复制,1-9 是删除历史) |
a-z | 命名寄存器(小写覆盖,大写追加) |
+ | 系统剪贴板 |
* | 系统选择(X11) |
_ | 黑洞寄存器(删除但不保存) |
/ | 搜索寄存器 |
使用寄存器
" 复制到寄存器
"ayy " 复制当前行到寄存器 a
"Ayy " 追加到寄存器 a
" 从寄存器粘贴
"ap " 粘贴寄存器 a 的内容
" 删除到寄存器
"add " 删除当前行到寄存器 a
" 查看寄存器
:reg " 查看所有寄存器
:reg a " 查看寄存器 a系统剪贴板
" 复制到系统剪贴板
"+yy " 复制到系统剪贴板
"+y$ " 复制到行尾到系统剪贴板
" 从系统剪贴板粘贴
"+p " 从系统剪贴板粘贴
" 删除到系统剪贴板
"+dd " 删除到系统剪贴板🎨 标记(Marks)
本地标记
| 命令 | 说明 |
|---|---|
m{a-z} | 设置标记 |
| “{a-z}` | 跳转到标记 |
'{a-z} | 跳转到标记所在行的行首 |
| “.` | 跳转到上次编辑位置 |
| ““` | 跳转到上次退出位置 |
| “[` | 跳转到上次修改开始 |
| “]` | 跳转到上次修改结束 |
全局标记
| 命令 | 说明 |
|---|---|
m{A-Z} | 设置全局标记(跨文件) |
| “{A-Z}` | 跳转到全局标记 |
查看标记
:marks " 查看所有标记
:marks a " 查看标记 a🔧 命令组合技巧
常见组合
" 删除并进入插入模式
ci" " 修改引号内容
ci( " 修改括号内容
cit " 修改标签内容
ciw " 修改单词
" 删除但不进入插入模式
di" " 删除引号内容
di( " 删除括号内容
dit " 删除标签内容
" 选择并操作
vi"d " 选择引号内容并删除
va"d " 选择引号及其内容并删除快速编辑
" 快速修改
cw " 修改单词
c$ " 修改到行尾
ciw " 修改单词(更精确)
" 快速删除
dw " 删除单词
d$ " 删除到行尾
diw " 删除单词(更精确)
" 快速复制
yw " 复制单词
y$ " 复制到行尾
yi" " 复制引号内容💡 实用技巧
1. 快速跳转
" 跳转到定义
gd " 跳转到局部定义
gD " 跳转到全局定义
" 跳转到匹配
% " 跳转到匹配的括号2. 快速缩进
" 缩进
>> " 向右缩进
<< " 向左缩进
= " 自动缩进
" 可视模式下缩进
V " 选择行
> " 向右缩进(保持选中)
< " 向左缩进(保持选中)3. 快速合并行
J " 合并下一行到当前行(保留空格)
gJ " 合并下一行(不保留空格)4. 快速大小写转换
~ " 切换当前字符大小写
g~w " 切换单词大小写
guw " 转小写
gUw " 转大写
g~~ " 切换整行大小写5. 快速执行外部命令
:!command " 执行 shell 命令
:r !command " 执行命令并将输出插入到文件
:w !command " 将文件内容作为命令输入🎯 实战场景
场景 1:批量添加注释
" 方法1:使用可视块模式
Ctrl+v " 进入块可视模式
jjj " 选择多行
I " 在块前插入
# " 输入注释符号
Esc " 退出,所有行都添加了 #
" 方法2:使用宏
qa " 开始录制
I# " 在行首插入 #
Esc " 返回普通模式
j " 下一行
q " 停止录制
10@a " 执行 10 次场景 2:批量替换
" 替换所有 foo 为 bar
:%s/foo/bar/g
" 替换并确认
:%s/foo/bar/gc
" 只替换特定行
:5,10s/foo/bar/g场景 3:快速格式化
" 格式化整个文件
gg=G " 从文件开头到末尾自动缩进
" 格式化选中区域
V " 选择行
= " 自动缩进场景 4:多文件编辑
" 打开多个文件
vim file1 file2 file3
" 在文件间切换
:bn " 下一个文件
:bp " 上一个文件
:bd " 关闭当前文件📚 学习建议
- 循序渐进:先掌握基础,再学习高级技巧
- 实际应用:在真实场景中练习
- 组合使用:将多个技巧组合使用
- 查看帮助:
:help查看详细文档
相关文档: