tmux xclip复制不再起作用


8

在mu Ubuntu 12.04设置上,我的tmux剪贴板复制和粘贴命令的设置如下:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

在一个月左右之前,这在最长的时间内效果很好,当时我怀疑进行了一些配置更改或程序包更改而使以上内容无效。在GNOME终端中,使用prefix+ ctrl-v和粘贴仍然可以正常工作ctrl-shift-v

但是xclip无论我做什么,复制命令都不再起作用,并且我尝试使用-select而不是-sel,而不是使用clipboardetc 删除上面的自定义前缀绑定。这对于像我这样的GVim用户来说几乎是一个制止者,因为我不ctrl-shift-c使用tmux接管外壳甚至可以解决GNOME终端问题。我进入复制模式,使用space+ 选择文本,movement执行prefix+时ctrl-c绝对没有任何反应。在此之前,tmux会在底部的通知部分显示确认消息。

有人对如何调试它有建议吗?这对生产力产生了很大的影响。我现在可能可以使用临时文件的解决方法,但是知道发生了什么很高兴xclip


xclip实际可用吗?输出是type xclip什么?
克里斯·

输出为:“ xclip是/ usr / bin / xclip”。正如我提到的,无论出于何种原因,通过xclip粘贴都可以正常工作。
亚历山大·库里林

1
您有同样的问题xsel -b吗?
吉尔斯(Gilles)'“ SO-不要邪恶”

@Gilles,xsel -i -b确实可以解决问题!
亚历山大·库里林

h 我不知道为什么会起作用,我想xsel -b并且xclip -selection clipboard会做同样的事情!
吉尔(Gilles)'所以

Answers:


9

xsel实用程序类似于xclip,但实现方式略有不同。通常,我希望它们的行为方式相同,但是它们不会进行完全相同的X库调用,因此在某些特殊情况下xsel可能会起作用,但不起作用xclip,反之亦然。尝试:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

相同的结果-对我不起作用-可以作为独立命令使用,但是从这种绑定中返回空字符串;Ubuntu 14.04,xsel 1.2.0,tmux 1.8-5
Vitaly Zdanevich

6

添加-brun-shell(或run)命令可解决此问题。使用-bshell命令在后台运行。

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"


2

尽管我无法再复制它,但以下是技术解答,您的情况可能会发生什么。

首先,您需要了解X11剪贴板的工作方式。您可能会阅读jwz的文章:http ://www.jwz.org/doc/x-cut-and-paste.html

简而言之,保存剪贴板内容的应用程序需要运行,直到其他应用程序声明所有权为止。因此,当您运行时,xclip -i <<< test您可以看到xclip在后台运行,直到您进行其他选择:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

现在一切都很好,但是当您退出此Shell时,默认情况下,通过向它们发送HUP信号来杀死属于该会话的所有进程。这意味着xclip将被杀死,您将无法再访问剪贴板内容。

因此,建议的解决方法(以防您没有xsel)是通过使用以下绑定忽略HUP信号:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xsel不受此问题的影响,因为在fork()之后,它要做的第一件事就是将自己与控制终端解除关联,这样它在退出外壳时就不会收到HUP信号(您甚至在上面的ps中都看不到它)输出,但仅当您执行ps -e | grep xsel)时。


1

我遇到了类似的问题,在这种特殊情况下,临时文件对您没有帮助。这是因为xclip,由tmux生成的行为似乎与“交互运行”并等待另一个应用程序拥有剪贴板区域所有权时的行为不同。尝试使用xclip -l 1使它立即退出(有关详细信息,请参见手册页)。


似乎无法完成这项工作。绑定看起来应该是这样吗:bind Cc运行“ tmux save-buffer-| xclip -l 1 -i -sel剪贴板”?
亚历山大·库里林

您能否发布适合您的解决方法?那也将非常有帮助!
亚历山大·库里林

我正在使用bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i"
彼得

是的,不幸的是仍然没有。Tmux不会报告任何内容,xclip也不会报告。
亚历山大·库里林

对我来说,它也没有报告任何东西,但它可以工作。xclip当您尝试复制缓冲区时,请检查正在做什么。如果它挂在那儿等着,杀死它有帮助吗?同样,在尝试将缓冲区复制到X剪贴板之前,您必须通过按Enter(然后将其存储到缓冲区)退出选择模式。
彼得

1

这是一个老问题,但是我怀疑我有解决方案,取自Arch WikiTmux页面

xclip也可以用于该目的,这与xsel不同,它在打印不适合当前语言环境的原始位流时效果更好。但是,使用xsel而不是xclip更加巧妙,因为xclip从tmux的缓冲区读取后不会关闭STDOUT。因此,tmux不知道复制任务已完成,并继续等待xclip终止,从而使tmux无响应。一种解决方法是将xclip的STDOUT重定向到/ dev / null

因此,您的命令应变为:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"

0

这是我使用的工作配置:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.