我是通过 ssh 在远程的 linux 中开发,我想将远程的内容复制到本地的 windows 剪切板。在我搞明白这个问题之前,在网上找了很多的资料博客,但是最终都没有效果。直到有一天我突然过来,vim 是跑在远程的 linux 系统中的,网上介绍的 “复制到系统剪切板” 一类方法都是复制到了 linux 的系统剪切板,再怎么倒腾,和 windows 没有任何关系。
复制到系统剪切板
首先使用 vim --version | grep clipboard
命令查看 vim 是否支持剪切板。
+clipboard +jumplist +persistent_undo +virtualedit
-ebcdic +mouseshape +statusline +xterm_clipboard
clipboard
前面如果是-
则表示不支持,需要安装支持剪切板的 vim。方法有很多,可以安装 vim-gtk
。vim-gtk
是带有 GTK 支持的 vim 版本,它可以与图形界面(如 GNOME)集成,并包括对剪贴板的支持。
sudo apt-get install vim-gtk
然后应该就可以复制到 linux 的系统剪切板了。
复制到本地剪切板
想要复制到 windows 的剪切板,那就直接使用鼠标左键选中,然后使用:Ctrl C
-> Ctrl V
。
- 设置鼠标左键为选中模式
在 vim 中,输入如下命令即可:
: set mouse=
这种操作只会在当次 vim 中生效,可以将这条命令写入 vim 的配置文件中,即可永久有效。
vim 中 复制 a - 删除 - 粘贴 a
vim 中不区分删除和剪切操作,因此,如果在执行 y
复制某个内容 a 后,又多次执行 d
做删除操作后,还需要执行 p
粘贴最开始复制的内容 a,可以使用字母寄存器实现:
yy
dd (可以多次操作)
"0p
当在 vim 中使用 yy
(或其他复制命令,如 y$
、yw
等)复制某些内容时,这些内容不仅会被存储在默认的无名寄存器中,还会被存储在寄存器 0
中。而当使用 dd
(或其他的删除命令)删除内容时,被删除的内容会被放入无名寄存器,但是寄存器 0
的内容保持不变。
所以,如果使用 yy
复制了一行,然后进行了若干次的删除操作,之后使用 "0p
,仍然会粘贴出你最初使用 yy
复制的那一行。
当然,如果有更多需求,可以使用字母寄存器 a
到 z
的任意一个命名寄存器来存储复制或删除的文本。
:3y a
dd
"ap
这里还有一个相关技巧。vim 有一个特殊的数字寄存器组,1
到 9
,它们用于保存最近删除或改变的文本。当删除或改变文本时,这个文本会被保存到 1
寄存器,而 1
寄存器的内容会被移到 2
寄存器,以此类推。这样就能够访问到最近 9 次的操作内容。