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

Mat*_*ski 40 tmux clipboard

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

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

我认为有一个鼠标绑定(MouseOnSelection类似于MouseDown1Pane),但我在网络和man tmux.

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

Jos*_*bst 64

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

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 -selection clipboard -i"
Run Code Online (Sandbox Code Playgroud)

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


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

set-option -g mouse on
Run Code Online (Sandbox Code Playgroud)

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

set-option -s set-clipboard off
Run Code Online (Sandbox Code Playgroud)

默认情况下,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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

在 tmux 2.2 之前:

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

  • 这个高质量的答案终于让我点击了..谢谢! (4认同)
  • 对于试图在 Mac 上执行此操作的任何人,因为他们更改了终端功能并且 OP 所述的默认方法不再有效(我正在使用具有自己的复制缓冲区的 Byobu):替换`xclip ...带有简单的 `pbcopy` 的 ` 语句就可以解决问题。 (3认同)

Gab*_*ton 11

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

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection
Run Code Online (Sandbox Code Playgroud)


小智 11

另一个扩展是关于使用Shift密钥。

按住Shift鼠标选择文本。现在您将获得一个标准的右键单击菜单(按住或Shift再次按下),您可以使用Ctrl+Shift+CCtrl+Shift+V进行复制和粘贴。复制的文本也将在系统剪贴板中可用。

测试在Ubuntu 18.04.1tmux 2.6

来源:https : //forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208

  • 这是最简单的,而且很有魅力。正是我所缺少的。 (2认同)
  • 这救了我!! (2认同)