¿Cómo copiar desde / al 'portapapeles' de tmux con tubos de shell?

17

Cuando trabajo en un entorno de shell, a menudo me encuentro con la necesidad de copiar 'salida de tubería intermedia' (por ejemplo, de / a editores que ya se están ejecutando, a otros shells, otras máquinas, etc.).

Cuando está en un entorno de ventanas, un método fácil (y genérico) para resolver esto a menudo es a través del portapapeles del sistema, por ejemplo:

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

¿Cómo puedo obtener un comportamiento igualmente conveniente usando la función de copiar / pegar tmux?

sin pensar
fuente

Respuestas:

20

tl; dr

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

Explicación y antecedentes

En tmux, toda la actividad de copiar / pegar pasa por la pila del búfer, donde la parte superior (índice 0) es el texto copiado más recientemente y se usará para pegar cuando no se proporcione explícitamente ningún índice del búfer -b. Puede inspeccionar los búferes actuales con tmux list-bufferso el acceso directo predeterminado tmux-prefix+ #.

Hay dos formas de conectar un nuevo búfer tmux en la parte superior de la pila, set-buffertomando un argumento de cadena y load-buffertomando un argumento de archivo. Para canalizar en un búfer, generalmente desea usar load-buffercon stdin, por ejemplo:

print -l **/* | tmux loadb -

Pegar esto de nuevo en los editores y tal es bastante obvio ( tmux-prefix+ ]o lo que sea que haya vinculado paste-buffer), sin embargo, acceder a la pasta desde el interior del shell no lo es, ya que invocarla paste-bufferpegará en stdin, que termina en la edición de su terminal buffer, y cualquier nueva línea en el pegado hará que el shell ejecute lo que se haya pegado hasta ahora (potencialmente una excelente manera de arruinar su día).

Hay un par de formas de abordar esto:

  1. tmux pasteb -s ' ': -sreemplaza todas las terminaciones de línea (separadores) con cualquier separador que proporcione. Sin embargo, aún obtienes el comportamiento paste-bufferque significa que la pasta termina en el búfer de edición de tu terminal, que puede ser lo que deseas, pero generalmente no lo es.
  2. tmux showb | ...: show-bufferimprime el búfer en stdout, y es casi lo que se requiere, pero como Chris Johnsen menciona en los comentarios , show-bufferrealiza la codificación octal de caracteres ASCII no imprimibles y caracteres no ASCII. Desafortunadamente, esto se rompe con la frecuencia suficiente para ser molesto, incluso con cosas simples como cadenas terminadas en nulo o caracteres latinos acentuados (por ejemplo, (en zsh) print -N á | tmux loadb - ; tmux showbimpresiones \303\241\000).
  3. tmux saveb - | ...: save-buffersimplemente hace el reverso load-buffery escribe los bytes sin modificar en stdin, que es lo que se desea en la mayoría de los casos. Entonces podría continuar ensamblando otra tubería, y por ejemplo. pasar a través | xargs -n1 -I{} ...de la línea de proceso sabio, etc.
sin pensar
fuente
1
tmux show-bufferrealizará la codificación octal de caracteres de control C0 y bytes no ASCII (por ejemplo, caracteres latinos acentuados, etc.). Puede usarlo tmux save-buffer -si desea los bytes sin procesar (esto suele ser lo que desea).
Chris Johnsen
@ChrisJohnsen Muchas gracias por captar eso, actualicé la respuesta en consecuencia.
pensado