Vim 删除命令完整学习笔记
文章目录
1. 核心概念
Vim 删除命令遵循 d + 动作 的基本结构,这是 Vim 编辑哲学的核心体现。
基本格式:
d{motion}- 删除+动作{count}d{motion}- 数量+删除+动作d{count}{motion}- 删除+数量+动作
核心特点:
- 删除的内容会自动保存到寄存器中,可以用
p粘贴 - 所有删除操作都可以用
u撤销 - 可以与数字前缀结合使用
2. 基础删除命令
2.1 字符级删除
-
x - 删除光标所在字符(等价于dl) -
X - 删除光标左边字符(等价于dh) -
dl - 删除右边字符 -
dh - 删除左边字符
2.2 单词级删除
-
dw - 删除一个单词(不含空格) -
dW - 删除到下一个以空白分隔的大词 -
de - 删除到当前词末(含当前字符) -
diw - 删除当前词(不含空格) -
daw - 删除当前词(含空格)
💡 单词概念区分:小写
w以空格和标点为界,大写W只以空格为界
2.3 行级删除
-
dd - 删除当前行(等价于d_) -
D - 删除至行尾(等价于d$) -
d$ - 删除至行尾(含当前字符) -
d0 - 删除至行首(不含光标所在字符) -
d^ - 删除至第一个非空字符
3. 范围删除命令
3.1 到指定位置删除
-
dj - 删除当前行和下一行(等价于2dd) -
dk - 删除当前行和上一行 -
dG - 删除到文件末尾 -
dgg - 删除到文件开头
3.2 段落和文档级删除
-
d} - 删除到段落结束 -
d{ - 删除到段落开始 -
d] - 删除到下一个段落边界 -
d[ - 删除到上一个段落边界
3.3 查找删除
-
dfx - 删除到字符 x(包括 x) -
dFx - 删除到字符 x(向左查找) -
dtx - 删除到字符 x(不含 x) -
dTx - 删除到字符 x 向左(不含 x) -
d/pattern - 删除直到匹配的 pattern -
d% - 删除匹配括号对
💡 记忆技巧:f = find(查找并包含),t = till(查找但不包含)
4. 文本对象删除
4.1 括号和引号删除
-
di" - 删除引号内内容 -
da" - 删除引号内容及引号 -
di' - 删除单引号内内容 -
da' - 删除单引号内容及引号 -
di) / dib - 删除圆括号内内容 -
da) / dab - 删除圆括号内容及括号 -
di] - 删除方括号内内容 -
da] - 删除方括号内容及括号 -
di} / diB - 删除花括号内内容 -
da} / daB - 删除花括号内容及括号
4.2 单词对象删除
-
diw - 删除当前词(inside word) -
daw - 删除当前词及空格(around word)
💡 记忆技巧:i = inside(内部),a = around(周围)
5. 数字前缀组合
5.1 数字+删除命令
-
3dd - 删除 3 行 -
2dw - 删除 2 个单词 -
5x - 删除 5 个字符
5.2 实用组合示例
| 命令 | 解释 | 数量前缀 | 动作符 | 作用 |
|---|---|---|---|---|
d2j |
删除当前行及下两行 | 2 |
j |
删除当前行及下两行(共三行) |
d3w |
删除当前单词及其后两个单词 | 3 |
w |
删除当前单词及之后的两个单词 |
d5j |
删除当前行及接下来的五行 | 5 |
j |
删除当前行及接下来的五行 |
d3k |
删除当前行及上面三行 | 3 |
k |
删除当前行及上面三行 |
d4f, |
删除到第4个逗号 | 4 |
f, |
删除从当前行到第4个逗号之间的内容 |
6. 高级删除操作(Ex命令模式)
6.1 指定行范围删除
-
:d - 删除当前行 -
:1,10d - 删除第 1 到 10 行 -
:10,$d - 删除第 10 行到文件末尾 -
:.,+5d - 删除当前行及其后 5 行 -
:.-2,.d - 删除当前行前 2 行到当前行
6.2 模式匹配删除
-
:g/pattern/d - 删除包含 pattern 的所有行 -
:v/pattern/d - 删除不包含 pattern 的所有行 -
/pattern/d - 删除第一个匹配 pattern 的行
6.3 条件删除
-
:g/foo/d - 删除包含 “foo” 的所有行 -
:v/foo/d - 删除不包含 “foo” 的行 -
:g/^$/d - 删除所有空行 -
:g/^\s*$/d - 删除空行和只含空白的行
6.4 复杂条件删除
多关键词删除:
-
:g/word1\|word2/d - 删除包含 “word1” 或 “word2” 的行 -
:v/word1\|word2/d - 删除不包含 “word1” 或 “word2” 的行 -
:g/.*word1.*word2/d - 删除同时包含 “word1” 和 “word2” 的行
范围内条件删除:
-
:10,30g/test/d - 删除第 10-30 行内包含 “test” 的行 -
:10,30v/test/d - 删除第 10-30 行内不包含 “test” 的行
不区分大小写删除:
-
:g/\cfoo/d - 删除包含 “foo” 的行(不区分大小写) -
:v/\cfoo/d - 删除不包含 “foo” 的行(不区分大小写)
相邻行删除:
-
:g/word/,+2d - 删除匹配行及其后两行 -
:g/word/-2,d - 删除匹配行及其前两行
7. sed扩展删除
7.1 sed结合Vim使用
-
:%!sed '/pattern/d' - 使用 sed 删除匹配行 -
:%!sed '/pattern/,+2d' - 删除匹配行及其后两行
7.2 高级sed删除技巧
-
:%!sed '/pcie/,+2d' - 删除包含 “pcie” 的行及其后两行 -
:10,30!sed '/word/d' - 在第10-30行范围内使用sed删除
8. 命令速查表
| 命令 | 解释 | 等价形式 | 英文含义 |
|---|---|---|---|
| 基础删除 | |||
d |
删除,后接动作符 | 无 | delete |
dd |
删除当前行 | d_ |
delete line |
D |
删除至行尾 | d$ |
Delete (shortcut) |
x |
删除光标所在字符 | dl |
delete character (right) |
X |
删除光标左边字符 | dh |
delete character (left) |
| 单词删除 | |||
dw |
删除一个单词(不含空格) | daw(包含空格) |
delete word |
dW |
删除到下一个以空白分隔的大词 | - | delete Word |
de |
删除到当前词末(含当前字符) | - | delete to end |
diw |
删除当前词(不含空格) | - | delete inner word |
daw |
删除当前词(含空格) | - | delete a word |
| 位置删除 | |||
d0 |
删除至行首(不含光标所在字符) | - | delete to beginning |
d^ |
删除至第一个非空字符 | - | delete to first non-blank |
d$ |
删除至行尾(含当前字符) | D |
delete to end of line |
dG |
删除到文件末尾 | - | delete to end of file |
dgg |
删除到文件开头 | - | delete to beginning of file |
| 查找删除 | |||
dfx |
删除到字符 x(包括 x) | - | delete to (find x) |
dFx |
删除到字符 x(向左) | - | delete to (Find x) |
dtx |
删除到字符 x(不含 x) | - | delete till (x) |
dTx |
删除到字符 x 向左(不含 x) | - | delete Till (x) |
d/pattern |
删除直到匹配的 pattern | - | delete to search |
d% |
删除匹配括号对 | - | delete to matching paren |
| 文本对象 | |||
di" |
删除引号内内容 | - | delete inside " |
da" |
删除引号内含引号 | - | delete around " |
| 段落删除 | |||
d} |
删除到段落结束 | - | delete to paragraph end |
d{ |
删除到段落开始 | - | delete to paragraph start |
| 命令 | 解释 | 数量前缀 | 动作符 | 作用 |
|---|---|---|---|---|
d2j |
删除当前行及下两行 | 2 |
j |
删除当前行及下两行(共三行) |
d3w |
删除当前单词及其后两个单词 | 3 |
w |
删除当前单词及之后的两个单词 |
d5j |
删除当前行及接下来的五行 | 5 |
j |
删除当前行及接下来的五行 |
d2d |
删除两行 | 2 |
d |
删除当前行及下一个行 |
d3k |
删除当前行及上面三行 | 3 |
k |
删除当前行及上面三行 |
y2j |
复制当前行及下两行 | 2 |
j |
复制当前行及下两行 |
2dw |
删除当前和下一个单词 | 2 |
w |
删除当前和下一个单词 |
c3l |
删除当前光标所在字符及后两个字符,进入插入模式 | 3 |
l |
删除当前光标所在字符及后两个字符,并进入插入模式 |
d4f, |
删除当前行到下一个逗号 | 4 |
f, |
删除从当前行到下一个逗号之间的内容 |
| 类别 | 命令 | 功能描述 | 使用示例 / 备注 |
|---|---|---|---|
| 删除当前行 | :d或dd |
删除当前行 | 在普通模式下,按dd删除当前行;2dd删除两行 |
| 删除指定行范围 | :{start},{end}d |
删除指定行范围 | :1,10d删除第 1 到 10 行 |
| 删除包含 pattern 的行 | :g/{pattern}/d |
删除匹配特定内容的所有行 | :g/foo/d删除包含 “foo” 的所有行 |
| 删除不包含 pattern 的行 | :v/{pattern}/d |
删除不匹配的行 | :v/foo/d删除不包含 “foo” 的行 |
| 删除第一个匹配行 | /pattern/d |
删除第一个匹配的行 | /foo/d删除第一个匹配 “foo” 的行 |
| 删除当前行中所有 pattern | :s/{pattern}//g |
删除当前行中指定内容 | :s/foo//g删除当前行所有 “foo” |
| 替换当前行内容 | :s/{pattern}/{replacement}/g |
替换当前行中的内容 | :s/foo/bar/g把所有 “foo” 替换为 “bar” |
| 删除包含多个关键词的行 | :g/word1|word2/d |
删除包含 “word1” 或 “word2” 的行 | :g/dir|Our/d |
| 删除不包含多个关键词的行 | :v/word1|word2/d |
删除不包含 “word1” 或 “word2” 的行 | :v/dir|Our/d |
| 同时包含两个关键词的行 | :g/.*word1.*word2/d |
删除同时包含 “word1” 和 “word2” 的行 | :g/.*word1.*word2/d |
| 不同时包含两个关键词的行 | :v/.*word1.*word2/d |
删除不同时包含的行 | :v/.*word1.*word2/d |
| 删除第 10 到 30 行内包含 test 的行 | :10,30g/test/d |
删除该范围内包含 “test” 的行 | :10,30g/test/d |
| 删除第 10 到 30 行内不包含 test 的行 | :10,30v/test/d |
删除该范围内不包含 “test” 的行 | :10,30v/test/d |
| 撤销删除操作 | u |
撤销最近删除操作 | 普通模式按u撤销 |
| 删除匹配 word 行及其后两行(Vim) | :g/word/,+2d |
删除匹配行及其后两行 | :g/pcie/,+2d |
| 删除匹配 word 行及其后两行(sed) | :%!sed /word/,+2d或:%!sed '/word/,+2d' |
使用 sed 删除匹配行及其后两行 | :%!sed '/pcie/,+2d' |
| 删除第 10 到 30 行中匹配 word 的行及其后两行(Vim) | :10,30g/word/,+2d |
删除该范围匹配及其后两行 | :10,30g/word/,+2d |
删除包含foo (不区分大小写)行 |
:g/\cfoo/d |
删除包含foo的行,不区分大小写 |
:g/\cfoo/d |
删除不包含foo (不区分大小写)行 |
:v/\cfoo/d |
删除不包含foo的行,不区分大小写 |
:v/\cfoo/d |
删除包含多个关键词foo或bar (不区分大小写)行 |
:g/\cfoo|bar/d |
删除包含foo或bar的行,不区分大小写 |
:g/\cfoo|bar/d |
9. 实用技巧和最佳实践
删除策略
- 精确删除:使用文本对象(
diw、di")进行精确操作 - 范围删除:利用查找命令(
df、dt)快速定位 - 批量删除:使用 Ex 命令进行模式匹配删除
常见使用场景
- 代码重构:删除特定函数或代码块
- 日志清理:删除包含特定关键词的日志行
- 文档编辑:删除空行、重复内容
- 数据处理:删除不符合条件的数据行
配置建议
" 在 .vimrc 中添加有用的映射
nnoremap <leader>dd :g/^$/d<CR> " 删除所有空行
nnoremap <leader>dw :g/^\s*$/d<CR> " 删除空行和空白行
nnoremap <leader>dt :g/TODO/d<CR> " 删除包含TODO的行
安全技巧
- 备份重要数据:删除前先复制重要内容
- 使用撤销:记住
u可以撤销删除操作 - 预览操作:使用
:g/pattern/p先预览要删除的行 - 小范围测试:在小范围内测试复杂删除命令
10. 学习建议
循序渐进的学习路径
第一阶段:掌握基础删除
- 重点练习
dd、dw、x、D - 理解
d + motion的基本概念
- 重点练习
第二阶段:学习文本对象
- 掌握
diw、daw、di"、da"等 - 理解 inside 和 around 的区别
- 掌握
第三阶段:掌握查找删除
- 学会使用
df、dt、d/pattern - 练习与数字前缀的组合
- 学会使用
第四阶段:高级模式匹配
- 掌握
:g/pattern/d和:v/pattern/d - 学习复杂条件的组合使用
- 掌握
练习建议
- 日常编辑:在实际工作中有意识地使用这些命令
- 模拟场景:创建测试文件练习各种删除操作
- 记录总结:记录常用的删除模式,形成个人习惯
避免常见错误
- 不要在不确定的情况下使用
:g//d命令 - 记住大小写的区别(如
wvsW) - 理解
f和t的区别(包含 vs 不包含目标字符) - 学会使用
u撤销误删除的内容
📝 核心提示:删除命令的精髓在于"精确定位+高效删除",掌握好动作命令和文本对象是关键。记住,任何删除操作都可以撤销,大胆练习!