Come copiare da / negli appunti tmux con shell shell?


17

Quando lavoro in un ambiente shell, incontro abbastanza spesso la necessità di copiare "output di pipe intermedio" (ad es. Da / verso editor già in esecuzione, su altre shell, altre macchine, ecc.).

Quando ci si trova in un ambiente con finestre, un metodo semplice (e generico) per risolverlo è spesso tramite gli appunti di sistema, ad es .:

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

Come posso ottenere un comportamento altrettanto conveniente usando la funzione di copia / incolla di tmux?

Risposte:


20

tl; dr

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

Spiegazione e contesto

In tmux, tutte le attività di copia / incolla passano attraverso lo stack di buffer in cui la parte superiore (indice 0) è il testo copiato più di recente e verrà utilizzata per incollare quando non viene fornito esplicitamente alcun indice di buffer -b. È possibile controllare i buffer correnti con tmux list-bufferso il collegamento predefinito tmux-prefix+ #.

Esistono due modi per eseguire il piping in un nuovo buffer tmux nella parte superiore dello stack, set-bufferprendendo un argomento stringa e load-bufferprendendo un argomento file. Per eseguire il pipe in un buffer, di solito si desidera utilizzare load-buffercon stdin, ad es .:

print -l **/* | tmux loadb -

Incollarlo nuovamente negli editor e questo è abbastanza ovvio ( tmux-prefix+ ]o qualunque cosa tu abbia legato paste-buffer), tuttavia, l'accesso alla pasta dall'interno della shell non lo è, perché invocando paste-bufferscriverà la pasta in stdin, che finisce nella modifica del tuo terminale buffer, e qualsiasi newline nella pasta farà eseguire alla shell tutto ciò che è stato incollato finora (potenzialmente un ottimo modo per rovinare la giornata).

Ci sono un paio di modi per affrontarlo:

  1. tmux pasteb -s ' ': -ssostituisce tutte le terminazioni di linea (separatori) con qualsiasi separatore fornito. Tuttavia, ottieni comunque il comportamento, il paste-bufferche significa che la pasta finisce nel tuo buffer di modifica del terminale, che può essere quello che vuoi, ma di solito non lo è.
  2. tmux showb | ...: show-bufferstampa il buffer su stdout ed è quasi ciò che è richiesto, ma come menziona Chris Johnsen nei commenti , show-bufferesegue la codifica ottale di caratteri ASCII non stampabili e caratteri non ASCII. Questo sfortunatamente si rompe abbastanza spesso da essere fastidioso, con cose anche semplici come stringhe nulle o caratteri latini accentati (ad es. (In zsh) print -N á | tmux loadb - ; tmux showbstampe \303\241\000).
  3. tmux saveb - | ...: save-bufferfa semplicemente il contrario di load-buffere scrive i byte grezzi non modificati in stdin, che è ciò che si desidera nella maggior parte dei casi. È quindi possibile continuare a assemblare un altro tubo, ad es. passare attraverso la | xargs -n1 -I{} ...linea di processo saggia, ecc.

1
tmux show-buffereseguirà la codifica ottale di caratteri di controllo C0 e byte non ASCII (ad esempio caratteri latini accentati, ecc.). Puoi usarlo tmux save-buffer -se vuoi i byte grezzi (di solito è quello che vuoi).
Chris Johnsen,

@ChrisJohnsen Mille grazie per averlo colto, ho aggiornato la risposta di conseguenza.
impensato il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.