服务端阅读 05月27日 15:07
Vim 中删除、复制、粘贴、撤销和替换命令怎么用?
Vim 的编辑效率几乎全部来自普通模式下的单键命令——删、复、粘、撤、换,五个动词覆盖了日常文本操作的大半场景。下面逐类拆解,每条命令都给出真实用法,不省略边界情况。删除:x / dd / D / dw / d$ / db删除是 Vim 里最频繁的操作,也是理解 Vim「动词+名词」语法的入口。| 命令 | 作用 | 注意 ||------|------|------|| x | 删除光标所在字符 | 等价于 dl,不进入插入模式 || dd | 删除整行 | 最常用的行删除,删后下方行上移 || D | 删除到行尾 | 等价于 d$,保留行首到光标前的内容 || dw | 删除到下一个词首 | 如果光标在词首,整个词加尾部空格一起删 || d$ | 删除到行尾 | 与 D 等价,但更显式 || db | 删除到上一个词首 | 向左删除到当前词或前一词的开头 |一个容易踩的坑:dw 在光标位于词尾时,会删到下一个词首,连同中间空格一并删除。如果你只想删当前词而不管光标在哪,用文本对象 diw 或 daw 更可靠——后面会讲。删除的内容不会消失,而是进入无名寄存器 "",随时可以粘贴回来。如果你想删除但不污染寄存器,用黑洞寄存器:"_dd,这行删了就彻底没了。复制:yy / Y / yw / y$Vim 把复制叫 yank,对应的动词是 y。它的用法和 d 完全对称——d 能接的 motion,y 都能接。yy:复制整行,最常用。yy 后按 p 就能在下一行粘贴出同样的内容。Y:在 Vim 中等同于 yy(复制整行),和 D 不删到行尾的对称关系不同,这里容易误解。如果你想让 Y 行为变成 y$,可以在 vimrc 里加 nnoremap Y y$。yw:从光标位置复制到下一个词首。y$:从光标位置复制到行尾。复制的文本同样进入无名寄存器。此外,最近一次 yank 的内容还会存入寄存器 "0。这意味着即使你之后做了删除操作覆盖了无名寄存器,"0p 仍然能粘贴之前 yank 的内容——这个技巧在实际编辑中非常实用。粘贴:p / P粘贴只有两个键,但行为取决于你复制/删除的是行还是字符:p:粘贴到光标之后。如果寄存器内容是整行,粘贴到当前行下方;如果是字符片段,粘贴到光标右侧。P:粘贴到光标之前。行内容贴到上方,字符内容贴到左侧。一个经典用法:先用 yy 复制一行,再把光标移到目标位置按 p,新行就出现在下方。如果想替换已有行,先 dd 删掉目标行再 p。可视模式下的粘贴行为略有不同:选中一段文本后按 p,选中的内容会被寄存器内容替换,而被替换掉的文本又进入寄存器——可以用来做文本交换。撤销与重做:u / U / Ctrl-r编辑出错就要撤回,Vim 提供了三个层级的撤销:u:撤销最近一次修改。连续按 u 会依次往前撤,直到文件打开时的状态。U:撤销当前行的所有修改,把这一行恢复到最近一次进入时的样子。注意 U 本身也是一个修改,可以用 u 再撤销掉。Ctrl-r:重做被 u 撤销的操作,往前推进。一个实际建议:如果你不确定撤销到了哪一步,可以按 g- 跳到更早的文件状态,按 g+ 跳到更晚的状态。Vim 用撤销树而非线性撤销,g-/g+ 按时间遍历,u/Ctrl-r 按分支遍历,两者适用场景不同。替换:r / R / s / S / ~替换命令让你在不离开普通模式的情况下修改文本:r{char}:用 {char} 替换光标下的单个字符。比如光标在 a 上,按 rx 就变成 x,然后光标停原地,仍在普通模式。R:进入替换模式(Replace mode),逐字替换,每输入一个字符就覆盖光标下的字符,直到按 Esc 退出。s:删除光标下的字符并进入插入模式。等价于 cl,适合只改一个字符的场景。S:删除当前行内容(保留缩进)并进入插入模式。等价于 ^C,适合重写一行但保留缩进层级。~:切换光标下字符的大小写,并自动右移。连续按 ~~~ 可以翻转三个字符。~ 在可视模式下尤其好用:选中一段文本后按 ~,整块内容的大小写全部翻转。与文本对象结合:diw / daw / ciw文本对象是 Vim 区别于其他编辑器的核心特性。它的语法是「操作符 + i/a + 对象」,i 表示 inner(不含周围空格),a 表示 around(含周围空格)。以 word 对象为例:diw:删除光标所在词,不管光标在词的哪个位置。删完后留下空格。daw:删除光标所在词及其相邻空格,删完后前后词紧邻。ciw:删除光标所在词并进入插入模式,可以直接输入新词替换。和 dw 的关键区别:dw 是从光标位置删到下一个词首,如果光标在词中间,只会删掉半个词;而 diw / daw 总是删掉完整词,不依赖光标的精确位置。文本对象不限于词。di" 删除双引号内的内容,ci( 删除括号内内容并进入插入模式,yi' 复制单引号内的文本——这些组合在日常编码中极其高频。与计数结合:3dd / 5xVim 的几乎所有命令都可以在前面加数字表示重复次数:3dd:删除 3 行(从当前行开始)。5x:删除 5 个字符。2yy:复制 2 行。3p:粘贴 3 次。5r-:用 - 替换光标及后面共 5 个字符,变成 -----,画分隔线很好用。计数也可以和文本对象组合:d3w 删除 3 个词,y2iw 复制 2 个词(注意 2iw 把两个词当作一个对象)。实际使用中,3dd 和 2yy 这类整行操作最常见,字符级计数用得相对少——毕竟你可以用可视模式更直观地选择范围。寄存器指定:"ay / "apVim 有超过 20 个寄存器,默认操作都走无名寄存器。当你需要保留多段文本时,命名寄存器就派上用场了:"ayy:把当前行复制到寄存器 a 中。"ap:粘贴寄存器 a 的内容。"bdd:把当前行删除并存入寄存器 b。"bp:粘贴寄存器 b 的内容。命名寄存器用小写字母 a-z,共 26 个。如果用大写字母 "Ayy,则是追加到寄存器 a 而非覆盖。几个特殊寄存器也值得了解:"0:最近一次 yank 的内容,不会被删除操作覆盖。"+:系统剪贴板,"+yy 复制行到系统剪贴板,"+p 从系统剪贴板粘贴。"_:黑洞寄存器,"_dd 删除且不存入任何寄存器。可视模式下的操作可视模式让你先选中、再操作,对于不规则范围的编辑非常直观:按 v 进入字符可视化,用方向键或 w/b/e 扩展选择范围。按 V 进入行可视化,整行整行地选。按 Ctrl-v 进入块可视化,可以选中矩形区域。选中后可以执行:d:删除选中内容。y:复制选中内容。p:用寄存器内容替换选中内容。r{char}:把选中区域每个字符都替换为 {char},批量注释代码时用 r# 非常方便。~ / U / u:翻转选中内容的大小写。块可视化还有一个隐藏技巧:选中列后按 I(大写 i)输入文本,再按两次 Esc,输入的内容会出现在选中列的每一行——这是批量在行首加缩进或注释标记的标准做法。以上命令全部在普通模式下执行(可视模式的选中阶段除外)。记住一个核心规律:Vim 的命令遵循「计数 + 操作符 + 范围/对象」的语法,掌握了 d/y/c/r 这几个操作符,配合 motion 和文本对象,就能组合出绝大多数编辑操作。不需要死记,用两周肌肉记忆就会形成。