4

在 Vim 中复制、剪切和粘贴

 2 years ago
source link: https://harttle.land/2022/03/19/vim-copy-paste.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在 Vim 中复制、剪切和粘贴

Vim

剪切板

寄存器

快捷键

03/19 2022

不同于 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。如有疏漏、谬误、侵权请通过评论或 邮件 指出。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK