问题

通常, 我的工作会在 tmux 里面的 vim 完成, 有时还会 ssh 到远端服务器之后这么做. 最困扰的问题就是, 将这几个软件, 以及系统的剪切板整合起来. 并且我不接受鼠标方案.

环境

Ubuntu 16.04. Unity. 使用 gnome-terminal.

gnome-terminal 下复制粘贴

vim 和系统剪切板的整合

我希望能在 vim 中使用 Ctrl+C 和 Ctrl+V 来完成复制粘贴, 并且和系统集成 – 可以从 chrome 中选中代码 Ctrl+C 然后到 vim 中 Ctrl+V.

需要在 .vimrc 中加入

vmap <C-c> "+Y
nmap <C-v> "+p

注意这个只有当 vim 支持 x11 粘贴板的时候才能用, 具体需要 :version 然后检查是否有 +clipboard. 参见 :help :yank. 如果发现 vim 没有粘贴板支持, 也很简单, 直接

$ sudo apt install vim-gnome

当然, 如果系统 GUI 都没有, 你再怎么搞, 上面的 x11 粘贴板也不能用.

其实也可以用 * 来代替 + 寄存器, 区别就是使用 x11 的 PRIMARY 还是 CLIPBOARD. 参见 :help x11-selection.

tmux 和系统剪切板的整合

针对 tmux 版本: 2.1.

首先, tmux 中当然是使用 vim 键位, 加入

set-window-option -g mode-keys vi

.tmux.conf 中, 用来设置 tmux 处于粘贴模式的键位.

之后可以查看 tmux 的键位

$ tmux list-keys -t vi-copy

或者 <prefix>:list-keys -t vi-copy 来执行 tmux 命令, 其中 <prefix> 是 tmux 激活键通常为 <C-B>.

这样的 tmux 能够复制粘贴, 但是它没有和系统整合起来, tmux 复制的只能用 tmux 粘贴, 不能用 vim 粘贴, 更不提粘贴到 chrome 中了. 为此需要安装一个 tmux 插件: tmux-yank, 安装 tmux 插件之后还需要安装 xsel

$ sudo apt install xsel

之后的键位基本上就是 (假定没有其他键位重定)

如果希望使用 C-c/v 完成复制粘贴, 可以修改 tmux-yank/scripts/helper.sh

diff --git a/scripts/helpers.sh b/scripts/helpers.sh
index 9871e92..f711d37 100644
--- a/scripts/helpers.sh
+++ b/scripts/helpers.sh
@@ -6, 13 +6, 13 @@
 yank_pane_pwd="Y"
 yank_pane_pwd_option="@yank_pane_pwd"

-yank_default="y"
+yank_default="C-c"
 yank_option="@copy_mode_yank"

 put_default="Y"
 put_option="@copy_mode_put"

-yank_put_default="M-y"
+yank_put_default="C-v"
 yank_put_option="@copy_mode_yank_put"

 yank_wo_newline_default="!"

ssh 集成

有一个问题就是, 这样复制的东西都在本地 – 如果我希望在 ssh 里面复制服务器的代码, 然后拷贝到本地怎么做?

其实很简单… 打开 x11 forwarding 即可, 参见 ssh 的男人. 具体只需要加上 -X 参数即可.

$ ssh user@remote -X