J'utilise la dernière version de tmux (à partir du référentiel git) et xclip (0.12), et je voudrais pouvoir utiliser des liaisons de clavier de type Emacs pour se déplacer dans le texte copy-mode
, copier ( M-w
) les sélections dans le presse-papiers, et coller ( C-y
) de / vers le tampon de copie dans le presse-papiers.
Jusqu'à présent, j'ai pu coller du texte avec C-y
et me déplacer copy-mode
avec des liaisons de clavier de type Emacs, mais je ne suis toujours pas en mesure de copier du texte à partir d'un tampon tmux (par exemple dans copy-mode
)
J'ai trouvé ce fil pour copier la totalité du tampon dans le presse-papiers (et vice versa), mais il ne semble pas fonctionner pour moi.
De plus, dans la tmux-users
liste de diffusion, on m'a dit que les versions récentes de tmux (uniquement dans le dépôt git) fournissent une commande appelée copy-pipe
. La page de manuel indique ce qui suit à propos de cette commande:
Une commande dans accepte un argument, copy-pipe, qui copie la sélection et la redirige vers une commande. Par exemple, ce qui suit liera 'C-q' pour copier la sélection dans / tmp ainsi que le tampon de collage:
bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"
Il semble qu'il copy-pipe
soit destiné à être utilisé en partie pour diriger la sélection vers une autre commande. Il semble également y avoir des fautes de frappe dans cette description et dans la commande (qu'est-ce que c'est temacs-copy
?)
Quoi qu'il en soit, ce que je voudrais faire, c'est:
Copier:
- Entrer en mode copie
- Déplacer vers le texte que je veux copier à l' aide des commandes de navigation Emacs (c. -à
C-f
,C-b
,M-f
,M-b
,C-a
,C-e
etc. pour déplacer le curseur). Aucun préfixe pour aucun d'entre eux. - Copiez le texte sélectionné dans le presse-papiers avec:
M-w
( pas de préfixe non plus)
Collage:
- J'aimerais pouvoir taper
C-y
( sans avoir à entrercopy-mode
) pour coller du texte dans le terminal ( pas de préfixe non plus)
J'ai essayé ce qui suit pour copier sans chance:
bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard"
Cependant, le collage fonctionne très bien:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
La chose étrange est que je sais que la xclip -i -selection clipboard
partie " " de la commande de copie ci-dessus fonctionne bien, car je peux copier des choses dans le presse-papiers dans la ligne de commande, par exemple:
echo "Hello world. How are you?" | xclip -i -selection clipboard
Avec tout cela, comment puis-je copier une sélection du mode copie dans le presse-papiers?
run-shell
lieu derun
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"
selon cet engagement suggéré par starfryVeuillez noter qu'avec Tmux 2.4 (depuis ce commit ), la syntaxe de liaison a changé. Je paraphrase ce commentaire Github pour résumer brièvement le changement:
-t
par-T
vi-<name>
par<name>-mode-vi
send-keys -X
J'ai eu:
que je devais changer pour:
Depuis le journal des modifications :
la source
Ce
-temacs-copy
n'est pas une faute de frappe. Le tiret de tête signifie qu'il s'agit d'une option pour labind-keys
commande (avec un argument pour l'option). C'est équivalent à-t emacs-copy
, si vous préférez ça.Le mode copie utilise un ensemble de liaisons et de commandes 1 différent du «mode normal». La
copy-pipe
commande n'est disponible que dans les autres tables de liaisons «mode». Quandmode-keys
estemacs
, le mode copie utilisera laemacs-copy
table, vous devez donc lier Mw àcopy-pipe
dans cette table.Soyez prudent en faisant trop de liaisons «sans préfixe». Ils rendront difficile la saisie de ces clés liées à un programme exécuté à l'intérieur de tmux (par exemple, lorsque vous voulez taper Cy dans une instance en mode tty d' Emacs s'exécutant à l'intérieur de tmux ). Vous pouvez toujours (préfixer) lier une clé qui le fait
send-keys C-y
, mais cela pourrait rendre la saisie plus difficile si vous en avez besoin assez souvent.1 Seules les commandes de mouvement et d'édition sont disponibles. À l'exception de
copy-pipe
, ces commandes ne prennent aucun argument (c'est ce que la page de manuel signifie avec elle "Une commande in accepte un argument"; le "in" est probablement une faute de frappe ou une erreur d'édition).la source
Alors que d'autres réponses peuvent aider, voici comment je fais de même:
la source