Tmux 终端复用 中介绍过 Tmux 的使用, 当你同时有系统剪切板、Tmux Clipboard、Vim Yank Buffer 时互相拷贝是不是很困难? 本文介绍如何让它们共用一个剪切板。

Vim 与 Tmux Buffer 共享

vim-tmux-clipboard 提供了 Vim 和 Tmux 的剪切板共享, 它有一个依赖的插件 vim-tmux-focus-events 需要一起安装。 在 ~/.vimrc 中加入:

Plugin 'tmux-plugins/vim-tmux-focus-events'
Plugin 'roxma/vim-tmux-clipboard'

~/.tmux.conf 加入对应配置:

set -g focus-events on

使用 Vundle 安装插件,如果你还不了解 Vundle,这是官网

vim +PluginInstall

Tmux 与系统剪切板共享

最新版本的 Tmux(其实只要支持 -C 参数)可以把操作上交给 iTerm2,这时剪切板和操作系统是互通的,甚至 Tmux 运行在 ssh 中。

但远程的 Vim 与本地剪切板仍不互通,即使使用 vim-tmux-clipboard 也不能。 本小节给出远程与本地(以 Mac 为例)公用剪切板的通用方案

首先,在连接 SSH 时指定反向隧道(需要在 Mac 设置中允许远程访问):

ssh -R 8234:localhost:22 yangjvn@126.com

上述 Reverse Tunnel 在配置文件中对应 RemoteForward 参数:RemoteForward 8234 localhost:22

其中 yangjvn@126.com 是目标服务器的用户名和主机名,远端的 8234 连接到本地的 localhost:22 端口。

然后,在远程执行如下命令将当前 Tmux Buffer 发给本地的 pbcopy(系统剪切板):

tmux save-buffer - | ssh -p 8234 localhost pbcopy

快捷方式

如果上述 tmux save-buffer 命令好使的话,事实上可以把任何东西发送给本地剪切板。

比如把上述命令设为 Tmux 快捷键(Ctrl+C),在 ~/.tmux.conf 中:

bind C-c run "tmux save-buffer - | ssh -p 8234 localhost pbcopy"

比如把上述命令设为 Vim 快捷键(<leader>cp),在 ~/.vimrc 中:

map <leader>cp :redir! > /tmp/vimbuffer \| echo @" \| redir END \| !cat /tmp/vimbuffer \| ssh -p 8234 localhost 2>/dev/null<cr>

上述代码大意如下:将剪切板寄存器写入 /tmp/vimbuffer,将该文件读出,重定向到 ssh,由 SSH 发送到 Mac。这里谁有更好的写法。。。求教。

安全考虑

上述两个 ssh 命令可能会询问 SSH 密码,可以 配置 SSH 自动登录 来避免重复输入(注意如果当前用户不同需要在 ssh 命令中添加用户字段)。

这其实会允许服务器在本地执行任何命令,为了限制这一点可以在对应的 Public Key 中配置默认命令,以及禁止端口转发等功能。

command="pbcopy",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa XXXXXX(你的 SSH Key)

由于 pbcopy 被设为默认命令,远程执行的命令中就不必写 pbcopy 了:

tmux save-buffer - | ssh -p 8234 localhost

本地/远程共享剪切板一般都通过远程调用本地 pbcopy 来完成。 在本地起一个服务来执行 pbcopy 会比远程调用更加安全, 可参考:https://seancoates.com/blogs/remote-pbcopy/

Vim 与系统剪切板共享

Vim 寄存器 中介绍过系统剪切板映射在 Vim 中称为寄存器,包括主选区 "* 寄存器和剪切板 "+ 寄存器(这是 X11 中的概念, 在 Mac 和 Windows 中这两个没有区别)。为使 Vim 与系统剪切板同步,可以简单地设置:

set clipboard=unnamed

注意:如果没有生效,可能是你的 vim 编译时没有加入剪切板支持。 MacOS 下可以直接用 brew 安装 macvim 是支持剪切板的。 可以通过下面的命令来检测,如果输出 +clipboard 就是支持,如果输出 -clipboard 就是不支持:

vim --version | grep clipboard

更详细的配置和调试方式可以参考这篇文章:Vim 使用系统剪切板

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2017/06/23/vim-tmux-clipboard.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。