我正在运行最新版本的 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
?)
不管怎样,我想做的是:
复印:
- 进入复印模式
- 使用 Emacs 导航命令移至我要复制的文本(即
C-f
、C-b
、M-f
、M-b
、C-a
等C-e
移动光标)。无前缀对于其中任何一个。 - 使用以下命令将选定的文本复制到剪贴板
M-w
:(无前缀任何一个)
粘贴:
- 我希望能够输入
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.conf
:copy-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"
prefix+[
进入复制模式- 用鼠标选择内容(按住)
M-w
将该部分复制到系统剪贴板中C-y
将其粘贴到 tmux 中,C-v
将其粘贴到其他常规应用程序(如网络浏览器)中。
答案2
请注意,对于 Tmux 2.4(自这次提交),绑定语法已更改。我转述一下这个 Github 评论简要总结一下变化:
-t
用。。。来代替-T
vi-<name>
用。。。来代替<name>-mode-vi
- 命令前缀为
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”可能是拼写错误或编辑错误)。