将选择内容复制到tmux中的剪贴板


22

如果在macOS的iTerm2中的tmux中用鼠标选择文本,则会将所选文本复制到剪贴板中。我不必单击任何其他按钮-只需选择所需的文本即可。

我已经在macOS上的terminal.app中测试了tmux,但在那里不起作用-我必须点击y将所选内容复制到剪贴板。

我以为有一个鼠标绑定(MouseOnSelection类似MouseDown1Pane),但是我在Web和上找不到任何有用的东西man tmux

我想知道是否有办法在Ubuntu 16.10上具有类似的行为-最好在Gnome终端中。

我的tmux dotfiles在这里可用(链接)

Answers:


44

带有vi复制模式绑定和xclip的Tmux 2.4+

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

对于较旧的tmux版本,emacs复制模式绑定(默认设置)或非X平台(即,没有xclip),请参见以下说明。


说明:首先,我们需要启用mouse选项,以便tmux捕获鼠标并让我们绑定鼠标事件:

set-option -g mouse on

Gnome-terminal不支持使用xterm转义序列设置剪贴板,因此我们应确保set-clipboard关闭该选项:

set-option -s set-clipboard off

默认情况下,iTerm2上可能支持并启用了此选项(请参阅set-clipboardtmux手册),这将解释该行为。

然后,我们可以将复制模式MouseDragEnd1Pane“键” 绑定到tmux命令,该复制模式“键”是在单击并在窗格中拖动并释放后释放第一个鼠标键时使用的,该命令获取当前的复制模式选择(默认绑定为MouseDrag1Pane)并将其通过管道传输到shell命令。此tmux命令copy-pipe在tmux 2.4之前,并且已更改send-keys -X copy-pipe[-and-cancel]。对于shell命令,我们只需要一些东西即可将系统剪贴板的内容设置为通过管道传递给它的内容。xclip在以下命令中用于执行此操作。"xclip -selection clipboard -i"在非X平台上,以下等价的替代品是"wl-copy"(Wayland),"pbcopy"(macOS),"clip.exe"(Windows,WSL)和"cat /dev/clipboard"(Cygwin,MinGW)。

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux 2.2至2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

在tmux 2.2之前:

通过将新mode-mouse选项设置为,鼠标拖动支持后复制最初是在Tmux 1.3中添加的on。Tmux 2.1将鼠标支持更改为熟悉的鼠标键绑定,但是没有DragEnd绑定(在2.2中引入了绑定)。因此,在2.2之前,我相信在鼠标拖动时设置系统剪贴板的唯一方法是通过内置使用xterm转义序列(该set-clipboard选项)。这意味着必须至少更新到tmux 2.2才能获得不支持的终端set-clipboard(例如GNOME Terminal)的拖放行为。


3
这个高质量的答案终于使我为之点击。.谢谢!
cjauvin

2
对于任何想,因为他们已经改变了他们的终端功能,并且由OP表示默认的方式做到这一点在Mac上不再作品(我用屏风有其自身复制缓冲区):替换xclip...用简单的语句pbcopy呢诀窍。
Darrel Holt

此线程中的任何解决方案都不适合我。
Yankee

1
约什-嗨,当我的源文件〜/ .tmux.conf,事实证明:Unknown key: MouseDragEnd1Pane
西峰李

@XifengLi您正在使用哪个tmux版本和OS?我相信您至少需要tmux 2.2的DragEnd密钥。
Josh Brobst

8

作为对已接受答案的扩展,人们通常会发现,释放鼠标按钮时出现干扰会退出复制模式(这就是发生的情况copy-pipe-and-cancel)。请参阅:https://github.com/tmux/tmux/issues/140。因此,在较新的tmux(我使用2.6)中,我们可以将和copy-pipe一起使用clear selection来复制到选择内容,但不退出复制模式:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection

2

扩展两个答案以将其从msys2复制到Windows剪贴板(并清除选择):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection

好点子。我本人使用复制模式(emacs样式),因此在测试后粘贴了自己的配置。我已经更新了答案,将两者都包括在接受的答案中。
肖恩·胡佛

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.