这是我相当冗长的答案,应该解决使用xclip从远程(ssh)tmux会话复制缓冲区的两个主要问题:
1.无反应的xclip
对我来说,@ Grauwolf的回答有xclip
没有工作(呈现TMUX窗格完全irresponsive)。我在Arch Wiki的Tmux页面中找到了原因:
xclip也可以用于此目的,这与xsel不同,它在打印不适合当前语言环境的原始位流时效果更好。但是,使用xsel而不是xclip更加巧妙,因为xclip从tmux的缓冲区读取后不会关闭STDOUT。因此,tmux不知道复制任务已经完成,并继续等待xclip终止,从而使tmux无响应。一种解决方法是将xclip的STDOUT重定向到/ dev / null
因此绑定应为:
bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"
现在,如果您的tmux会话是本地的,则可以使用。
2. xclip无法连接到X
如果您在ssh -X上使用tmux,则很有可能无法直接使用。
这是因为shell变量$DISPLAY
需要正确设置。
完整的解决方案
因此,对我来说,完整的可行解决方案是在我的代码中添加以下几行~/.tmux.conf
:
set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null
对于主要的粘贴:
bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"
我不完全理解为什么$DISPLAY
在采购时设置不正确 .tmux.conf
,所以这就是为什么我必须使用tmux show-env
and 提取它的原因sed
。
如果您的tmux> = 1.8,则可以使用以下命令修改该命令copy-pipe
:
bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'