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

Ame*_*ina 18 terminal tmux clipboard

我运行的是最新版本的TMUX的(从git仓库)和XCLIP(0.12),并且我希望能够使用类Emacs键盘绑定在文本内到处移动copy-mode,复制(M-w)选择到剪贴板,将 ( C-y) 从/到复制缓冲区粘贴到剪贴板。

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

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

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

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

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"
Run Code Online (Sandbox Code Playgroud)

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

但是,粘贴效果很好:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
Run Code Online (Sandbox Code Playgroud)

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

echo "Hello world. How are you?" | xclip -i -selection clipboard
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*osh 22

使用以下 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"
Run Code Online (Sandbox Code Playgroud)
  1. prefix+[ 进入复制模式
  2. 用鼠标选择内容(按住)
  3. M-w 将该部分复制到系统剪贴板中
  4. C-y将其粘贴到 tmux 中,C-v将其粘贴到其他常规应用程序(如 Web 浏览器)中。

  • 在 tmux 2.8 中,我必须将它们更改为 ```bind -Tcopy-mode Mw send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c "``` 。```bind-key -n Cy run-shell "xclip -o | tmux load-buffer - ; tmux Paste-buffer"``` 根据[此提交](https://github.com/tmux/tmux/ commit/76d6d3641f271be1756e41494960d96714e7ee58)由[starfry]建议(https://unix.stackexchange.com/a/363191/141936) (2认同)

sta*_*fry 10

请注意,使用 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'
Run Code Online (Sandbox Code Playgroud)

我需要更改为:

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

变更日志

关键表发生了重大变化。模式键表不再与主键表分开。所有模式密钥表都已被删除,以及用于 bind-key 和 unbind-key 的 -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
Run Code Online (Sandbox Code Playgroud)

变成:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up
Run Code Online (Sandbox Code Playgroud)

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

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"
Run Code Online (Sandbox Code Playgroud)

还有一些新命令可用于 send -X,例如 copy-pipe-and-cancel。


Ris*_*ari 7

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

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

  • 这是我发现的在 tmux 和 firefox 之间复制和粘贴的最简单和最一致的解决方案。我一直在寻找这样的东西 3 年了。 (3认同)
  • `prefix` + `z` 会放大所选窗格,这样在按住 `shift` 绕过 tmux 复制选择时,水平分割就不会成为问题。 (2认同)