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


15

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

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

我发现此线程可将整个缓冲区复制到剪贴板(反之亦然),但似乎不适用于我。

另外,在tmux-users邮件列表中,我被告知,最新版本的tmux(仅在git repo中)提供了一个名为的命令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

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

Answers:


19

使用以下 tmux.confcopy-pipe在TMUX(1.8+)的新版本:

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以将其粘贴到其他常规应用程序(如Web浏览器)中。

这个答案值得更多的赞同,这是基于Linux的安装的最佳选择。
Louis Kottmann 2014年

在tmux 2.0中,它run-shell代替了run
roign

@LouisKottmann:为什么仅基于Linux?
schaiba

我无法在其他系统上发表评论,但我相信mac通常会使用bpaste而不是xclip
Louis Kottmann

在tmux 2.8中,我不得不将它们更改为 bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c "bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" 根据这次提交的建议starfry
azzamsa

5

请注意,对于Tmux 2.4(自此commit以来),绑定语法已更改。我解释一下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标志一起的bind-key和unbind-key都已被删除。

emacs-edit,vi-edit,emacs-choose和vi-choose表已替换为命令提示符和选择模式下的固定键绑定。模式键和状态键选项保留。

emacs-copy和vi-copy表已由copy-mode和copy-mode-vi表取代。使用-X和-N标志将命令发送到send-key。因此,以下内容:

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还提供了一些新命令,例如复制管道和取消。


2

-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"

进行过多的“无前缀”绑定时要小心。它们将使得很难在运行于tmux的程序中键入这些绑定键(例如,当您要将Cy键入至在tmuxEmacs的tty模式实例中键入时)。您始终可以(前缀)绑定可以执行操作的某些键,但是如果您经常需要的话,这可能会使键入变得更加麻烦。send-keys C-y


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


2

尽管其他答案可能会有所帮助,但我还是这样做的:

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

这是一个不错的答案,但是当您有两个或多个水平放置的窗格时,问题就开始了。
cjauvin

我知道了,如果您发现有用的信息,请告诉我。
Rishabh Agrahari,
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.