Linux 剪贴板小技巧
初步识 vim 剪贴板
对于文本的复制粘贴,系统会提供剪贴板,剪贴板在 vim 中被称为寄存器,并且 vim 有很多寄存器,寄存器使用的语法:"{register}
,当然了寄存器指令不会单独使用,后面都会跟代表复制的 y
或代表粘贴的 p
,执行 "ay
就将选中的内容复制到了 a
寄存器,寄存器都是有自己的名字的,感兴趣的同学,欲知详细内容请参见帮助文档::help registers
。
那咱们平时执行 yy
或者选中 y
使用的寄存器叫什么名字呢?它叫匿名寄存器 (""
)。y
就等于 ""y
。
比较重要的是,系统剪贴板寄存器 "*
。通过 "*p
就可以把系统剪贴板上的内容粘贴到 vim 文件内了。
*p
从系统剪贴板粘贴容易,而要从 vim 复制到系统剪贴板,首先选中文本,然后执行 "*y
,这多麻烦,所以我选择:
1 | " .vimrc |
这样就让系统剪贴板 ("*
) 和匿名剪贴板 (""
) 内容保持同步了。y
就同时等效于 ""y
、 "*y
,而 p
等价于 ""p
、"*p
以及 command+v
或者 Windows 的 ctrl+v
。
远程剪贴板操作
通过 SSH 连接到了一台远程 Linux 服务器,这时候该任何复制粘贴呢?
Someone said at once: “Stupid! Mac 上当然是鼠标选中然后 command+c
、command+v
了,Windows 上是 ctrl+c
、ctrl+v
,虽然 ctrl+v
会和 vim 切换成可视模式冲突,但是我用 ctrl+shift+v
就解决了。”
这方法很便捷,并且我也经常使用,但是在使用过程中主要遇到以下两个问题:
- 如果你的 vim 开启了行号,鼠标选中多行的时候,会选中行号,复制下来的内容也会也行号。我的 vim 是默认开启行号的。
- 只能复制一个窗口大小的内容。
其实还有一个问题,就是不能完全脱离鼠标,我是三分之二键盘党,所以我认为这不是主要问题。
这些问题不是都已经解决了吗?如果设置了 set clipboard=unnamed
,直接选中(注意不是鼠标选中,而是 vim 中的选中 shift+v
上下键)然后 y
,然后 p
。那你试试 command+v
或 ctrl+v
呢?保证不是你刚刚复制的内容。
短路了吧?重新认识一下,你现在同时使用了两个系统,一个是本地,一个是远程服务器,y
复制的内容在远程服务器上呢,还在你公司,在杭州,在北京,还是在海外呢?
那我不用 command+v
可好,有 p
,还少按一个键。
漂亮!你已经找到答案了。
剪贴板远程传送
那如果我想将远程服务器的一段字符传送到本地呢?有人说 scp,但在实际操作中,通过 scp 或者 ftp,传送文件还 ok,传送一段文本的即时性就太差了。
找到两种比较好的办法,但是针对的客户端是 Mac 或者 Linux,据了解 Windows 自带有 Linux 子系统,可以开启试试。
方法一:
该方法使用了一个叫 clipper 的 go 语言程序,以及 vim-clipper 插件,两个项目的链接都在下面。但是我没有用过这种方式,一方面配置较多,而且要在本地跑额外的程序,可能功能比较强大但是我用不了这么多,另一方面就是有第二种比较适合我的方式。
- wincent/clipper: ✂️ Clipboard access for local and remote tmux sessions
- wincent/vim-clipper: Clipper integration for Vim
For Mac User:
1 | brew install clipper |
For Linux User:
1 | yum install golang |
方法二:
该方式,仅适合使用 Mac 及 iTerm.app 的用户。
iTerm->Perferences-> Selection->Application in terminal may access clipboard
(选择开启),可能版本更新这个功能的位置会有所变动。
在远程服务器执行如下命令(如果使用的是bash将zsh改为bash即可):
1 | $ cd |
命令下载.iterm2_shell_integration.zsh
脚本到用户根目录,还有一些小程序到~/.iterm2
目录下,
并在.zshrc
末尾生成test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
卸载的时候也只需要将这三个部分删除掉即可。
在vim配置文件.vimrc
下添加如下代码:
1 | if !empty('~/.iterm2/it2copy') |
此时shift+v
选中文本,执行 <leader>y
,文本就到你本地的剪贴板啦。不信你就command+v
。