Vim 删除命令完整学习笔记
Vim 删除命令完整学习笔记
文章目录
- Vim 删除命令完整学习笔记
- 1. 核心概念
- 2. 基础删除命令
- 2.1 字符级删除
- 2.2 单词级删除
- 2.3 行级删除
- 3. 范围删除命令
- 3.1 到指定位置删除
- 3.2 段落和文档级删除
- 3.3 查找删除
- 4. 文本对象删除
- 4.1 括号和引号删除
- 4.2 单词对象删除
- 5. 数字前缀组合
- 5.1 数字+删除命令
- 5.2 实用组合示例
- 6. 高级删除操作(Ex命令模式)
- 6.1 指定行范围删除
- 6.2 模式匹配删除
- 6.3 条件删除
- 6.4 复杂条件删除
- 7. sed扩展删除
- 7.1 sed结合Vim使用
- 7.2 高级sed删除技巧
- 8. 命令速查表
- 9. 实用技巧和最佳实践
- 删除策略
- 常见使用场景
- 配置建议
- 安全技巧
- 10. 学习建议
- 循序渐进的学习路径
- 练习建议
- 避免常见错误
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
命令 - 记住大小写的区别(如
w
vsW
) - 理解
f
和t
的区别(包含 vs 不包含目标字符) - 学会使用
u
撤销误删除的内容
📝 核心提示:删除命令的精髓在于"精确定位+高效删除",掌握好动作命令和文本对象是关键。记住,任何删除操作都可以撤销,大胆练习!