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 次

使用示例

场景:在每行开头添加 ”// ”

  1. 移动到第一行
  2. qa - 开始录制宏到寄存器 a
  3. I// - 在行首插入 ”// ”
  4. Esc - 返回普通模式
  5. j - 移动到下一行
  6. q - 停止录制
  7. @a - 执行宏(应用到当前行)
  8. 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               " 关闭当前文件

📚 学习建议

  1. 循序渐进:先掌握基础,再学习高级技巧
  2. 实际应用:在真实场景中练习
  3. 组合使用:将多个技巧组合使用
  4. 查看帮助:help 查看详细文档

相关文档