Linux 剪贴板小技巧

初步识 vim 剪贴板

对于文本的复制粘贴,系统会提供剪贴板,剪贴板在 vim 中被称为寄存器,并且 vim 有很多寄存器,寄存器使用的语法:"{register},当然了寄存器指令不会单独使用,后面都会跟代表复制的 y 或代表粘贴的 p,执行 "ay 就将选中的内容复制到了 a 寄存器,寄存器都是有自己的名字的,感兴趣的同学,欲知详细内容请参见帮助文档::help registers

那咱们平时执行 yy 或者选中 y 使用的寄存器叫什么名字呢?它叫匿名寄存器 ("")。y 就等于 ""y

比较重要的是,系统剪贴板寄存器 "*。通过 "*p 就可以把系统剪贴板上的内容粘贴到 vim 文件内了。

*p 从系统剪贴板粘贴容易,而要从 vim 复制到系统剪贴板,首先选中文本,然后执行 "*y,这多麻烦,所以我选择:

1
2
" .vimrc
set clipboard=unnamed

这样就让系统剪贴板 ("*) 和匿名剪贴板 ("") 内容保持同步了。y 就同时等效于 ""y"*y ,而 p 等价于 ""p"*p 以及 command+v 或者 Windows 的 ctrl+v

远程剪贴板操作

通过 SSH 连接到了一台远程 Linux 服务器,这时候该任何复制粘贴呢?

Someone said at once: “Stupid! Mac 上当然是鼠标选中然后 command+ccommand+v 了,Windows 上是 ctrl+cctrl+v,虽然 ctrl+v 会和 vim 切换成可视模式冲突,但是我用 ctrl+shift+v 就解决了。”

这方法很便捷,并且我也经常使用,但是在使用过程中主要遇到以下两个问题:

  1. 如果你的 vim 开启了行号,鼠标选中多行的时候,会选中行号,复制下来的内容也会也行号。我的 vim 是默认开启行号的。
  2. 只能复制一个窗口大小的内容。

其实还有一个问题,就是不能完全脱离鼠标,我是三分之二键盘党,所以我认为这不是主要问题。

这些问题不是都已经解决了吗?如果设置了 set clipboard=unnamed,直接选中(注意不是鼠标选中,而是 vim 中的选中 shift+v 上下键)然后 y,然后 p。那你试试 command+vctrl+v 呢?保证不是你刚刚复制的内容。

短路了吧?重新认识一下,你现在同时使用了两个系统,一个是本地,一个是远程服务器,y 复制的内容在远程服务器上呢,还在你公司,在杭州,在北京,还是在海外呢?

那我不用 command+v 可好,有 p,还少按一个键。

漂亮!你已经找到答案了。

剪贴板远程传送

那如果我想将远程服务器的一段字符传送到本地呢?有人说 scp,但在实际操作中,通过 scp 或者 ftp,传送文件还 ok,传送一段文本的即时性就太差了。

找到两种比较好的办法,但是针对的客户端是 Mac 或者 Linux,据了解 Windows 自带有 Linux 子系统,可以开启试试。

方法一:

该方法使用了一个叫 clippergo 语言程序,以及 vim-clipper 插件,两个项目的链接都在下面。但是我没有用过这种方式,一方面配置较多,而且要在本地跑额外的程序,可能功能比较强大但是我用不了这么多,另一方面就是有第二种比较适合我的方式。

For Mac User:

1
2
3
$ brew install clipper
$ brew services start clipper
$ ssh -R localhost:8377:localhost:8377 user@host.example.org

For Linux User:

1
2
3
4
5
6
7
8
9
$ yum install golang
$ git clone git://git.wincent.com/clipper.git
$ cd clipper
$ go build
$ sudo cp clipper /usr/local/bin
$ cp contrib/linux/systemd-service/clipper.service ~/.config/systemd/user
$ systemctl --user daemon-reload
$ systemctl --user enable clipper.service
$ systemctl --user start clipper.service

方法二:
该方式,仅适合使用 MaciTerm.app 的用户。

iTerm->Perferences-> Selection->Application in terminal may access clipboard(选择开启),可能版本更新这个功能的位置会有所变动。

在远程服务器执行如下命令(如果使用的是bashzsh改为bash即可):

1
2
$ cd
$ curl -L https://iterm2.com/shell_integration/install_shell_integration_and_utilities.sh | zsh

命令下载.iterm2_shell_integration.zsh脚本到用户根目录,还有一些小程序到~/.iterm2目录下,
并在.zshrc末尾生成test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
卸载的时候也只需要将这三个部分删除掉即可。

在vim配置文件.vimrc下添加如下代码:

1
2
3
if !empty('~/.iterm2/it2copy')
vmap <silent> <Leader>y :'<,'>:w !~/.iterm2/it2copy<CR><CR>
endif

此时shift+v选中文本,执行 <leader>y,文本就到你本地的剪贴板啦。不信你就command+v