不同于 Emacs,Vim 确实是一个编辑器。那么编辑器能不能复制粘贴呢?肯定是可以的。不过要在 vim 中完成复制粘贴是需要敲键盘的,虽然略复杂但是功能也更强。

这篇文章来详细介绍 Vim 中复制粘贴的设置和使用方法。 包括复制当前字符/当前词/当前行,复制整个文件内容,粘贴刚才复制/剪切的内容;在插入模式/命令行模式粘贴;复制到 Windows/Mac 系统剪切板。

复制粘贴

  1. 进入 normal/正常模式(刚进入 vim 的默认模式),如果你在 insert 模式,按下若干次 Esc 可以进入 normal 模式。
  2. 把光标移动到开始复制的位置。
  3. 按下 v 来选择字符。(也可以用 V 来选择整行,Ctrl-v 来选择矩形块)
  4. 光标移动 到结束复制的位置。
  5. 按下 y 来复制。
  6. 光标移动到想要粘贴的位置,按下 p 粘贴。(或者 P 粘贴在当前光标位置之前)。

p 换成 gp 可以在粘贴完成时,把光标移动到粘贴内容结束的位置。gP 同样适用。

剪切粘贴

  1. 进入 normal 模式(刚进入 vim 的默认模式),如果你在 insert 模式,按下若干次 Esc 可以进入 normal 模式。
  2. 光标移动 到开始复制的位置。
  3. 按下 v 来选择字符。(也可以用 V 来选择整行,Ctrl-v 来选择矩形块)
  4. 光标移动到结束复制的位置。
  5. 按下 d 来剪切。
  6. 光标移动到想要粘贴的位置,按下 p 粘贴。(或者 P 粘贴在当前光标位置之前)。

配合光标移动来复制

yd 分别用于复制和剪切,但除了 v 还有很多更方便的选区方式。事实上所有光标移动命令都可以用来选区,比如:

  • yyY 复制当前行。
  • yw 用来复制往后一个词,y3w 复制往后三个词。
  • yiw 复制当前词。
  • y$ 复制到行尾,y^ 复制到行首。
  • yf. 复制直到下一个 . 字符。
  • ggyG:%y 复制整个文件。

以上 y 改成 d 就可以用于剪切,更多光标移动方式可以参考 Vim 中如何快速移动光标?

在 insert/插入模式粘贴

在 normal 模式按下 i 或者 a 可以进入插入模式,也就是键入内容的模式。p 快捷键不可用于插入模式,但是插入模式可以通过 Ctrl+r 来访问所有的寄存器,插入寄存器里的内容。所有剪切、拷贝、删除的内容都会存在不同的 Vim 寄存器里。比如:

  • Ctrl+r " 插入最近一次复制/剪切/删除的内容。" 是 Vim 的匿名寄存器。
  • Ctrl+r 0 插入最近一次复制的内容。其中 0 属于 Vim 的编号寄存器,保存最近一次拷贝的内容。

此外寄存器还保存有当前文件名、最近一次执行的命令、最近一次搜索内容、最近一次插入文本等。可以参考 Vim 寄存器完全手册

在 command-line/命令行模式粘贴

在 normal 模式按下 : 可以进入命令行模式,用来执行比如切换文件,保存关闭等操作。这个模式下仍然可以使用 Ctrl-r,但还可以编辑每一条命令:

  • Ctrl+r " 插入最近一次复制/剪切/删除的内容。" 是 Vim 的匿名寄存器。
  • Ctrl+r 0 插入最近一次复制的内容。其中 0 属于 Vim 的编号寄存器,保存最近一次拷贝的内容。
  • Ctrl+f 选择一条历史命令(包括当前正在键入的命令)来编辑。然后就进入了 normal 模式,编辑完成后回车来执行命令。

复制多项内容/复制历史

复制内容是没有历史的,但删除历史保存在编号寄存器 1-9 中(以行为单位的删除或者超过一行的删除才会进入编号寄存器):

  • "1 保存上一次删除的内容。
  • "2 保存上上次删除的内容。
  • "3 保存上上上次删除的内容。
  • 以此类推……

Vim 有 26 个命名寄存器("a-"z),可以在删除或复制之前加寄存器名字,来保存在某个寄存器中,这样可以同时保存很多拷贝的内容。比如:

  • 按下 v 选则需要复制的区域。
  • "ay 把选区复制到 "a 寄存器中。
  • "ap 把寄存器 "a 的内容粘贴出来。

复制到系统剪切板/从系统剪切版粘贴

寄存器 "*"+ 在 Mac 和 Windows 中,都是指系统剪切板(clipboard),例如 "*yy 即可复制当前行到系统剪切板。 其他程序中复制的内容也会被存储到这两个寄存器中。 在 X11 系统中(绝大多数带有桌面环境的 Linux 发行版),二者是有区别的:

  • "* 指 X11 中的 PRIMARY 选区,即鼠标选中区域。在桌面系统中可按鼠标中键粘贴。
  • "+ 指 X11 中的 CLIPBOARD 选区,即系统剪切板。在桌面系统中可按 Ctrl+V 粘贴。

通常 set clipboard=unnamed 即可和系统共享剪切板,但也和你的具体环境有关,可以参考:

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2022/03/19/vim-copy-paste.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。