web-dev-qa-db-fra.com

Utiliser le presse-papiers du système en mode vi-copy dans tmux

J'utilise tmux 1.6 et j'essaie de le configurer pour utiliser les raccourcis clavier de style vi ainsi que le presse-papiers du système lors de la copie en mode interactif:

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

Autrement dit, j'aimerais pouvoir faire C+[ puis utiliser v pour commencer à sélectionner le texte à copier, puis lorsque y est poussé, copiez la sélection dans la sélection tmux puis exportez-la dans le presse-papiers du système à l'aide de xclip.

Malheureusement, lorsque j'essaie de le faire, je vois ce qui suit:

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

Existe-t-il un moyen de le faire dans la configuration tmux?

57
Naftuli Kay

Cela a également été répondu ici , mais il m'a fallu un certain temps pour comprendre comment l'utiliser, donc je vais expliquer à quiconque était confus.

C'est essentiellement le paramètre que vous recherchez:

(pour tmux versions <2.5 )

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

(pour les versions tmux > = 2.5 )

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

Appuyez ensuite sur Ctrl+b[ Pour passer en mode copie. Appuyez ensuite sur Space suivi des touches de mouvement vi pour effectuer une sélection. Ensuite, au lieu d'appuyer sur Enter, appuyez sur y et la sélection sera copiée dans le presse-papiers.

Remarque: cela suppose que vous utilisez les liaisons par défaut de tmux avec les clés vi.

Tmux a différentes tables de liaison de clés pour différents modes. Ainsi, bind-key -t vi-copy y Définit l'action de la touche y en mode copie. Au début, j'étais confus parce que j'avais l'habitude de frapper Enter après avoir fait une sélection. Enter n'est en fait que la liaison de touches par défaut pour la commande copy-selection (en mode copie). La commande copy-pipe Nous permet de lier une nouvelle clé pour diriger la sélection vers une commande, qui dans ce cas est xclip.

Vous pouvez voir toutes les liaisons de touches pour le mode copie en exécutant list-keys -t vi-copy.

96
Ben Davis

La version mise à jour pour réponse Ben Davis

compatible avec tmux 2.4

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

Vous rencontrez quelques problèmes techniques:
Les liaisons en "mode spécial" (par exemple vi-copy)…

  1. utilisez un ensemble de commandes différent (c'est-à-dire run-Shell a.k.a. run n'est pas disponible), et
  2. n'ont pas la possibilité de lier plusieurs commandes (qui peuvent normalement être séparées par ;— le Shell && le séparateur de commandes n'est pas disponible).

tmux 1.8 a copy-pipe, ce qui pourrait aider:

bind-key -t vi-copy y copy-pipe 'xclip -selection clipboard >/dev/null'

(Il existe une liaison comme celle-ci dans la FAQ .)

6
Chris Johnsen

Jetez un œil au plugin tmux-yank pour tmux. https://github.com/tmux-plugins/tmux-yank

Il fournit un moyen automatisé de copier/coller de tmux dans le presse-papiers du système. Il fonctionne sur les systèmes OSX/Linux/Cygwin.

6
bergercookie

Pour macOS, vous pouvez ajouter cette ligne à .tmux.conf

bind -t vi-copy y copy-pipe 'pbcopy'

2
bumaociyuan

C'est ce qui a fini par fonctionner pour moi en utilisant tmux 2.2 et en ayant installé xclip. Pour la copie de style Vim, ajoutez ce qui suit à .tmux.conf

bind Escape copy-mode
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
# Vim style copy to clipboard
bind-key -t vi-copy y copy-pipe "xclip -selection c > /dev/null"
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

Ici, en mode copie, PREFIX v démarre la sélection et PREFIX y copie dans le presse-papiers. PREFIX p peut être utilisé pour coller dans le terminal.

1
OrigamiEye

Sur Wayland, au lieu de xclip, mieux vaut utiliser wl-copy/wl-paste du paquet wl-clipboard. Cela fonctionne pour moi:

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"

mise à jour: puisque j'utilise le même tmux.conf sur X11, Wayland et Cygwin, je me suis retrouvé avec cette configuration:

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