问题
通常, 我的工作会在 tmux 里面的 vim 完成, 有时还会 ssh 到远端服务器之后这么做. 最困扰的问题就是, 将这几个软件, 以及系统的剪切板整合起来. 并且我不接受鼠标方案.
环境
Ubuntu 16.04. Unity. 使用 gnome-terminal.
gnome-terminal 下复制粘贴
- 选中需要使用鼠标.
- 使用
<C-S-C>
以及<C-S-V>
来复制粘贴到 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
之后的键位基本上就是 (假定没有其他键位重定)
<prefix>[
: 进入 tmux 复制模式. 以后的键位, 若非特殊指定, 都是复制模式下的.q
: 退出复制模式V
: 选取行h
,j
,k
,l
,b
,w
: 移动光标<Space>
: 开始选择V
: 选择行v
: 切换 block selectiony
: 复制选中内容到系统剪切板<Enter>
: 复制选中内容到 tmux 剪切板<prefix>]
: 粘贴 tmux 剪切板内容Y
复制当前 pane 的工作目录 粘贴系统剪切板还是老方法, chrome 和 vim 中是<C-V>
, 直接在 gnome-terminal 里时<C-S-V>
.
如果希望使用 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