Comment copier depuis / vers le 'presse-papiers' de tmux avec des pipes shell?

17

Lorsque je travaille dans un environnement de shell, je rencontre assez souvent le besoin de copier la «sortie de tuyau intermédiaire» (par exemple depuis / vers des éditeurs déjà en cours d'exécution, vers d'autres shells, d'autres machines, etc.).

Dans un environnement de fenêtrage, une méthode simple (et générique) pour résoudre ce problème est souvent via le presse-papiers du système, par exemple:

  • X11: ... | xsel -i/xsel -o | ...
  • OS X: ... | pbcopy /pbpaste | ...

Comment puis-je obtenir un comportement similaire en utilisant la fonction de copier / coller de tmux?

impensé
la source

Réponses:

20

tl; dr

  • ... | tmux loadb -
  • tmux saveb - | ...

Explication et contexte

Dans tmux, toute activité de copier / coller passe par la pile de tampons où le haut (index 0) est le texte le plus récemment copié et sera utilisé pour le collage quand aucun index de tampon n'est explicitement fourni -b. Vous pouvez inspecter les tampons actuels avec tmux list-buffersou le raccourci par défaut tmux-prefix+# .

Il y a deux façons de diriger vers un nouveau tampon tmux en haut de la pile, en set-bufferprenant un argument de chaîne et en load-bufferprenant un argument de fichier. Pour diriger vers un tampon que vous souhaitez généralement utiliser load-bufferavec stdin, par exemple:

print -l **/* | tmux loadb -

Coller cela dans les éditeurs et tout cela est assez évident ( tmux-prefix+ ]ou ce que vous avez lié paste-buffer), cependant, accéder à la pâte depuis l'intérieur du shell ne l'est pas, car l'invocation paste-bufferécrira la pâte dans stdin, qui finira dans l'édition de votre terminal tampon, et toute nouvelle ligne dans la pâte entraînera le shell à exécuter tout ce qui a été collé jusqu'à présent (potentiellement un excellent moyen de gâcher votre journée).

Il y a deux façons d'aborder cela:

  1. tmux pasteb -s ' ': -sremplace toutes les fins de ligne (séparateurs) par le séparateur que vous fournissez. Cependant, vous obtenez toujours le comportement paste-bufferqui signifie que le collage se retrouve dans votre tampon d'édition de terminal, ce qui peut être ce que vous voulez, mais ce n'est généralement pas le cas.
  2. tmux showb | ...: show-bufferimprime le tampon sur stdout, et est presque ce qui est requis, mais comme Chris Johnsen le mentionne dans les commentaires , show-buffereffectue le codage octal des caractères ASCII non imprimables et des caractères non ASCII. Malheureusement, cela casse assez souvent pour être ennuyeux, avec des choses même simples comme des chaînes terminées par zéro ou des caractères latins accentués (par exemple (en zsh) print -N á | tmux loadb - ; tmux showbimprime \303\241\000).
  3. tmux saveb - | ...: save-bufferfait simplement l'inverse de load-bufferet écrit les octets bruts non modifiés dans stdin, ce qui est souhaité dans la plupart des cas. Vous pouvez ensuite continuer à assembler un autre tuyau, et par exemple. passer | xargs -n1 -I{} ...pour traiter la ligne sage, etc.
impensé
la source
1
tmux show-bufferfera l'encodage octal des caractères de contrôle C0 et des octets non-ASCII (par exemple les caractères latins accentués, etc.). Vous pouvez utiliser tmux save-buffer -si vous voulez les octets bruts (c'est généralement ce que vous voulez).
Chris Johnsen
@ChrisJohnsen Merci beaucoup d'avoir attrapé cela, j'ai mis à jour la réponse en conséquence.
impensé