在 tmux 和剪贴板之间复制/粘贴文本选择

在 tmux 和剪贴板之间复制/粘贴文本选择

我正在运行最新版本的 tmux(来自 git 存储库)和 xclip (0.12),并且我希望能够使用类似 Emacs 的键盘绑定来移动 中的文本copy-mode,将 ( M-w) 选择内容复制到剪贴板,以及将 ( ) 从复制缓冲区粘贴 ( C-y) 到剪贴板。

到目前为止,我已经能够使用 粘贴文本,并使用类似 Emacs 的键盘绑定C-y来移动,但是copy-mode我仍然无法复制文本来自 tmux 缓冲区(例如 in copy-mode

我发现这个线程用于将整个缓冲区复制到剪贴板(反之亦然),但它似乎对我不起作用。

另外,在tmux-users邮件列表中我被告知最新版本的 tmux(仅在 git 存储库中)提供了一个名为copy-pipe.手册页对此命令的说明如下:

其中的一个命令接受一个参数,copy-pipe,它复制选择并将其通过管道传递给命令。例如,以下命令将绑定“C-q”以将选择内容复制到 /tmp 以及粘贴缓冲区中:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

它看起来像是copy-pipe部分用于将选择通过管道传输到另一个命令。此描述和命令中似乎也存在一些拼写错误(什么是temacs-copy?)

不管怎样,我想做的是:

复印:

  1. 进入复印模式
  2. 使用 Emacs 导航命令移至我要复制的文本(即C-fC-bM-fM-bC-aC-e移动光标)。无前缀对于其中任何一个。
  3. 使用以下命令将选定的文本复制到剪贴板M-w:(无前缀任何一个)

粘贴:

  1. 我希望能够输入C-y没有必须输入copy-mode) 才能在终端中粘贴文本 (无前缀任何一个)

我尝试了以下复制方法,但没有成功:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

然而,粘贴效果很好:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

奇怪的是,我知道xclip -i -selection clipboard上面复制命令的“”部分效果很好,因为我可以在命令行中将内容复制到剪贴板,例如:

echo "Hello world. How are you?" | xclip -i -selection clipboard

有了这一切,如何将所选内容从复制模式复制到剪贴板?

答案1

在新版本的 tmux (1.8+) 中使用以下命令 tmux.confcopy-pipe

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[进入复制模式
  2. 用鼠标选择内容(按住)
  3. M-w将该部分复制到系统剪贴板中
  4. C-y将其粘贴到 tmux 中,C-v将其粘贴到其他常规应用程序(如网络浏览器)中。

答案2

请注意,对于 Tmux 2.4(自这次提交),绑定语法已更改。我转述一下这个 Github 评论简要总结一下变化:

  1. -t用。。。来代替-T
  2. vi-<name>用。。。来代替<name>-mode-vi
  3. 命令前缀为send-keys -X

我有:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

我需要将其更改为:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

来自变更日志:

关键表发生了重大变化。模式键表不再与主键表分开。所有模式密钥表以及绑定密钥和取消绑定密钥的 -t 标志都已被删除。

emacs-edit、vi-edit、emacs-choose 和 vi-choose 表已被命令提示符和选择模式中的固定键绑定所取代。模式键和状态键选项保留。

emacs-copy 和 vi-copy 表已被 copy-mode 和 copy-mode-vi 表取代。使用 -X 和 -N 标志发送命令到发送键。所以如下:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

变成:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

这些更改允许使用完整的命令解析器(包括命令序列)和命令集 - 例如,带有编辑和历史记录的普通命令提示符现在用于搜索、跳转等,而不是自定义命令提示符。现在默认的 Cr 绑定是:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

send -X 还提供了一些新命令,例如 copy-pipe-and-cancel。

答案3

虽然其他答案可能有帮助,但我是这样做的:

  • 按住 Shift 键并用光标选择文本。
  • Ctrl + Shift + C 将文本复制到剪贴板。

答案4

-temacs-copy不是一个错字。前导破折号意味着这是该bind-keys命令的一个选项(以及该选项的参数)。如果您更喜欢的话,它相当于-t emacs-copy

复制模式使用与“正常模式”不同的一组绑定和命令1 。该copy-pipe命令仅在备用“模式”绑定表中可用。当mode-keys是 时emacs,复制模式将使用该emacs-copy表,因此您需要将 Mw 绑定到copy-pipe该表中。

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

请小心创建过多的“无前缀”绑定。它们将使在内部运行的程序中键入这些绑定键变得困难多路复用器(例如,当您想在 tty 模式实例中键入 Cy 时Emacs跑里面多路复用器)。您始终可以(前缀)绑定一些具有 的键send-keys C-y,但是如果您经常需要它,这可能会使键入变得更加麻烦。


1仅移动和编辑命令可用。除了 之外copy-pipe,这些命令不接受任何参数(这就是手册页的含义,它说“一个命令 in 接受参数”;“in”可能是拼写错误或编辑错误)。

相关内容