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

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

我正在运行 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\""

简而言之,我希望能够执行C+操作[,然后使用v开始选择要复制的文本,然后在y按下 时,将选择内容复制到 tmux 选择,然后使用 将其导出到系统剪贴板xclip

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

.tmux.conf: 14: unknown command: copy-selection && run "tmux save-buffer | xclip -selection clipboard"

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

答案1

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

这基本上就是您想要的设置:

(对于 tmux版本 <2.5

bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard'

(对于 tmux版本 >=2.5

bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'

然后点击Ctrl+b [进入复制模式。然后Space按任意 vi 移动键进行选择。然后,不要点击Enter,而是点击y,所选内容将被复制到剪贴板。

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

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

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

答案2

更新版本为本·戴维斯回答

兼容 tmux 2.4

bind -T copy-mode-vi y send -X copy-pipe "xclip -selection c"

答案3

我到处尝试了很多东西,但这就是我在我的~/.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
                                         

答案4

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"

更新:因为我用同样的tmux.conf在 X11、Wayland 和 Cygwin 上,我最终得到了以下配置:

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

相关内容