在 tmux 中以 vi-copy 模式使用系统剪贴板

Naf*_*Kay 80 tmux xclip

我正在运行 tmux 1.6,并尝试将其配置为使用 vi 样式的键绑定以及在交互模式下复制时使用系统剪贴板:

set-window-option -g mode-keys vi

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' "copy-selection && run \"tmux save-buffer | xclip -selection clipboard\""
Run Code Online (Sandbox Code Playgroud)

简而言之,我希望能够执行C+[然后使用v开始选择要复制的文本,然后在y推送时,将选择复制到 tmux 选择,然后使用xclip.

不幸的是,当我尝试这样做时,我看到以下内容:

.tmux.conf: 14: unknown command: copy-selection && run "tmux save-buffer | xclip -selection clipboard"
Run Code Online (Sandbox Code Playgroud)

有没有办法在 tmux 配置中做到这一点?

Ben*_*vis 121

这也在这里回答,但我花了一段时间才理解如何使用它,所以我会为其他任何感到困惑的人解释。

这基本上是您要进行的设置:

(对于 tmux版本 <2.5

bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard'
Run Code Online (Sandbox Code Playgroud)

(对于 tmux版本 >=2.5

bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
Run Code Online (Sandbox Code Playgroud)

然后点击Ctrl+b [进入复制模式。然后Space按任意 vi 移动键进行选择。然后,而不是Enterhit , hity并且选择将被复制到剪贴板。

注意:这假设您使用 tmux 的默认绑定与 vi 键。

Tmux 针对不同的模式有不同的键绑定表。因此,在复制模式下bind-key -t vi-copy y设置y密钥的操作。最初,我很困惑,因为我习惯Enter了选择后击球。Enter实际上只是copy-selection命令的默认键绑定(在复制模式下)。该copy-pipe命令允许我们绑定一个新键以将选择通过管道传递给一个命令,在本例中为xclip.

您可以通过运行查看复制模式的所有键绑定list-keys -t vi-copy

  • 如果它不起作用,只需仔细检查您的系统中是否实际安装了 `xclip`(默认情况下它没有安装在 Ubuntu 上,您需要使用 `sudo apt-get install xclip` 来获取它) (8认同)
  • [此博客条目](https://medium.com/@alexeysamoshkin/tmux-in-practice-integration-with-system-clipboard-bcd72c62ff7b) 中的以下绑定在 Tmux 2.6 上也很有效,并且没有缺点复制时在屏幕上放置看似随机的字符:`bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard" ` (6认同)
  • 对于 OSX,将 `xclip` 替换为 `pbcopy`。对于 Windows 上的 Cygwin,将其替换为 `putclip`(来自 `cygutils-extra` 包)。 (4认同)
  • 这对我不起作用,直到我从 .tmux.conf 中删除了这一行:`set -g mouse on`。这应该启用*“鼠标模式”*,但即使将其删除后,有关我的鼠标的所有内容都可以正常工作(滚轮有效,鼠标选择有效)... (2认同)

小智 15

本戴维斯回答的更新版本

与 tmux 2.4 兼容

bind -T copy-mode-vi y send -X copy-pipe "xclip -selection c"
Run Code Online (Sandbox Code Playgroud)

  • 我发现使用“copy-pipe-and-cancel”而不是“copy-pipe”效果更好。这是在 tmux 2.5 上 (6认同)

小智 7

查看 tmux 的 tmux-yank 插件。 https://github.com/tmux-plugins/tmux-yank

它提供了一种从 tmux 复制/粘贴到系统剪贴板的自动化方法。它适用于 OSX/Linux/Cygwin 系统。


小智 7

我在这里和那里尝试了很多东西,但这就是我在我的~/.tmux.conf文件中使用的方法我使用的是 Ubuntu 20 LTS 和 tmux3.0a

#for copying to sys clipboard
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard"
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard"
bind -T copy-mode-vi C-j send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard"

#general other stuff
set -g default-terminal "xterm-256color"
set -g mouse on
set-window-option -g mode-keys vi
                                         
Run Code Online (Sandbox Code Playgroud)


Chr*_*sen 6

您遇到了几个技术问题:
“特殊模式”绑定(例如vi-copy)……

  1. 使用不同的命令集(即run-shellakarun不可用),以及
  2. 没有绑定多个命令的能力(通常可以用;——shell 的&&命令分隔符不可用来分隔)。

tmux 1.8 有copy-pipe,这可能会有所帮助:

bind-key -t vi-copy y copy-pipe 'xclip -selection clipboard >/dev/null'
Run Code Online (Sandbox Code Playgroud)

常见问题解答中列出了这样的绑定。)


Fel*_*lix 6

xclip在 Wayland 上,最好使用wl-clipboard 包的wl-copy/来代替。wl-paste这对我有用:

set-window-option -g mode-keys vi
bind-key -T copy-mode-vi 'v' send-keys -X begin-selection
bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "wl-copy"
bind C-p run "wl-paste --no-newline | tmux load-buffer - ; tmux paste-buffer"
Run Code Online (Sandbox Code Playgroud)

更新:由于我在 X11、Wayland 和 Cygwin 上使用相同的tmux.conf,所以我最终得到了以下配置:

bind-key -T copy-mode-vi v send -X begin-selection

if-shell -b 'echo $XDG_SESSION_TYPE | grep -q x11' "\
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard > /dev/null'; \
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard > /dev/null'; \
    bind-key C-p run 'xclip -out -selection clipboard | tmux load-buffer - ; tmux paste-buffer'"

if-shell -b 'echo $XDG_SESSION_TYPE | grep -q wayland' "\
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'wl-copy'; \
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'wl-copy'; \
    bind-key C-p run 'wl-paste --no-newline | tmux load-buffer - ; tmux paste-buffer'" "\
    \
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'cat - >/dev/clipboard'; \
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'cat - >/dev/clipboard'; \
    bind-key C-p run 'cat /dev/clipboard | tmux load-buffer - ; tmux paste-buffer'"
Run Code Online (Sandbox Code Playgroud)