如果你想在没有 GUI 支持的 Unix 系统中使用 VIM 的 'clipboard'
选项,则需要 +clipboard
以及可选的 +xterm_clipboard
两个特性支持。帮助文档:
:h 'clipboard'
:h gui-clipboard
:h gui-selections
另外请参考: 持续粘贴(为什么我每次都要设置 paste 模式
剪贴板的使用(Windows, OSX)
Windows 自带了剪贴板,OSX 则带了一个粘贴板。在这两个系统中都可以用大家习惯用的 ctrl+c / cmd+c
复制选择的文本,然后在另外一个应用中用 ctrl+v / cmd+v
进行粘贴。需要注意的是复制的文本已经被发送到了剪贴板,所以你在粘贴复制的内容之前关闭这个应用是没有任何问题的。每次复制的时候,都会向剪贴板寄存器 *
中写入数据。 而在 VIM 中分别使用 "*y
和 "*p
来进行复制(yank) 和 粘贴(paste)。如果你不想每次操作都要指定 *
寄存器,可以在你的 vimrc 中添加如下配置:
set clipboard=unnamed
通常情况下复制/删除/放入操作会往 "
寄存器中写入数据,而加上了上面的配置之后 *
寄存器也会被写入同样数据,因此简单的使用 y
和 p
就可以复制粘贴了。
我再说一遍:使用上面的选项意味着每一次的复制/粘贴,即使在同一个 VIM 窗口里,都会修改剪贴板的内容。你自己决定上面的选项是否适合。
如果你觉得输入 y
还是太麻烦的话,可以使用下面的设置把在可视模式下选择的内容发送到剪贴板:
set clipboard=unnamed,autoselect
set guioptions+=a
帮助文档:
:h clipboard-unnamed
:h autoselect
:h 'go_a'
剪贴板的使用(Linux, BSD, ...)
如果你的系统使用了 X 图形界面,事情会变得有一点不同。X 图形界面实现了 X 窗口系统协议, 这个协议在 1987 年发布的主版本 11,因此 X 也通常被称为 X11。在 X10 版本中,剪贴缓冲区被用来实现像 clipboard 一样由 X 来复制文本,并且可以被所有的程序访问。现在这个机制在 X 中还存在,但是已经过时了,很多程序都不再使用这一机制。近年来数据在程序之间是通过选择进行传递的。一共有三种选择,经常用到的有两种:PRIMARY 和 CLIPBOARD。选择的工作工模大致是这样的:
Program A:<ctrl+c>
Program A:声称对 CLIPBOARD 的所有权
Program B:<ctrl+v>
Program B:发现CLIPBOARD的所有权被Program A持有
Program B:从Program A请求数据
Program A:响应这个请求并发送数据给Program B
Program B:从Program A接收数据并插入到窗口中
选择 | 何时使用 | 如何粘贴 | 如何在 VIM 中访问 |
---|---|---|---|
PRIMARY | 选择文本 | 鼠标中键, shift+insert | * 寄存器 |
CLIPBOARD | 选择文本并按ctrl+c |
ctrl+v |
+ 寄存器 |
注意 :X 服务器并不会保存选择(不仅仅是 CLIPBOARD 选择)!因此在关闭了相应的程序后,你用
ctrl+c
复制的内容将丢失。
使用 "*p
来贴粘 PRIMARY 选择中的内容,或者使用 "+y1G
来将整个文件的内容复制到 CLIPBOARD 选择。如果你需要经常访问这两个寄存器,可以考虑使用如下配置:
set clipboard^=unnamed " * 寄存器
" 或者
set clipboard^=unnamedplus " + 寄存器
(^=
用来将设置的值加到默认值之前,详见::h :set^=
)
这会使得所有复制/删除/放入操作使用 *
或 +
寄存器代替默认的未命令寄存器 "
。之后你就可以直接使用 y
或 p
访问你的 X 选择了。
帮助文档:
:h clipboard-unnamed
:h clipboard-unnamedplus