it-swarm.it

Ottenere tmux per copiare un buffer negli Appunti

Sto cercando di trovare un modo decente per copiare ciò che ho in un buffer tmux nei miei appunti. Ho provato un paio di cose diverse come

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

che mi avvicina abbastanza, tutto quello che devo fare è premere control-d dopo aver fatto prefisso-p.

Ho provato a risolverlo facendo

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

Ma questo non funziona. In effetti se lo associo a solo

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

non fa nulla, quindi presumo che a split-window non piaccia << in un comando Shell.

Qualche idea?

Modifica: puoi saltare il select-pane -t 2 se vuoi, non è molto importante. Uso solo un layout specifico e il riquadro 2 è quello che preferisco dividere quando faccio qualcos'altro in modo che vada nei miei binding che coinvolgono le divisioni per impostazione predefinita.

121
Digital Powers

Qui i documenti hanno bisogno di nuove righe. Ad esempio, in uno script Shell, è possibile scrivere

cat <<EOF >somefile; echo  done
file contents
EOF

Non credo che tmux ti permetta di mettere nuove linee lì, e anche se lo facesse, questo non sarebbe un buon approccio. Cosa succede se i dati stessi contengono HERE da solo su una riga (ad es. Perché stai copiando il tuo .tmux.conf)?

Suggerisco di scrivere il contenuto del buffer in un file temporaneo. Non testato:

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

C'è una condizione di competizione se si utilizza questo comando in due istanze separate di tmux. Non so come risolverlo.

Questo dovrebbe funzionare:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

Una soluzione più semplice per Mac OS-X

Questo si basa sulla risposta di Alex e utilizza cose che al momento non esistevano.

Se stai usando homebrew (e se non lo sei, perché non lo sei?) Allora puoi semplicemente fare questo:

brew install reattach-to-user-namespace

Quindi nel tuo ~/.tmux.conf:

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

Per copiare il buffer da tmux (dovresti aver già copiato qualcosa usando tmux) nel Macboard, usa <tmux-key> Control-c. Ora sarà disponibile per Command-v o pbpaste

Per incollare qualcosa dal pannello di controllo del Mac, usa <tmux-key> Control-v.

41
docwhat

Il comando copy-pipe È stato aggiunto dalla versione 1.8. Copia una selezione nel buffer tmux e la invia a un comando. Ora non è necessario un legame prefisso. Ecco un esempio:

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Ora, quando hai selezionato del testo in copy-modey copierà quel testo nel buffer tmux e negli appunti del sistema operativo. Tuttavia, non aiuta se si desidera ottenere testo dagli Appunti nel buffer tmux.

40
Tyler Holien

Potresti provare plugin tmux-yank . Consente di copiare direttamente negli appunti di sistema (OS X e Linux) e alcuni altri gadget come strappare l'attuale linea Shell.

16
user80379

Ecco un tentativo di risposta esaustiva.

Prima un po 'di storia

Quando questa domanda è stata posta per la prima volta (giugno 2011), copiare il testo da Tmux negli Appunti doveva essere un processo in due passaggi, prima copiare il testo selezionato nel buffer di Tmux, quindi copiare il testo dal buffer di Tmux negli Appunti di sistema.

In 1.8 (marzo 2013) è stato aggiunto il comando copy-pipe Che consente di copiare il testo selezionato direttamente negli Appunti di sistema (o altra destinazione).

Quindi in 2.4 (aprile 2017) le tabelle chiave sono state modificate in modo significativo rendendo obsolete molte delle risposte in questa pagina.

Rispondere alla domanda originale

Linux :

bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac :

Se si utilizza homebrew , è necessario installare reattach-to-user-namespace Eseguendo il seguente comando in un terminale:

brew install reattach-to-user-namespace

Quindi nel tuo ~/.tmux.conf:

bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

Il metodo più breve (copia e incolla una selezione direttamente da e negli appunti per tmux> 2.4)

Nota: ci sono due versioni per Linux perché Linux ha un blocco appunti principale e secondario (noto anche come selezione).

Linux :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

Personalizzare questi comandi

  • Se non vuoi che il comando ti dica cosa ha fatto nella riga di stato, rimuovi semplicemente display-message (Così come il \; Che precede).

  • Se stai usando la modalità di copia in stile Emacs invece di vi, sostituisci qualsiasi istanza di copy-mode-vi Con solo copy-mode

  • Se usi Linux e vuoi usare xsel invece di xclip sostituisci xclip -r Con xsel -i -p E xclip -o Con xsel -o -p

  • -r In xclip -r È facoltativo, rimuove l'ultima riga. È utile per copiare i comandi, quindi quando li incolli non verranno immediatamente eseguiti.

  • Se si esegue il tunneling su SSH, è necessario consultare https://unix.stackexchange.com/a/354581/14252

Riferimenti:

10
Jason Axelson

Dopo aver provato una soluzione diversa, ecco la mia configurazione finale:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

l'uso di save-buffer anziché show-buffer fornisce i dati reali senza i dati, come mostrato con le interruzioni di riga quando si è suddivisi.

Lo uso anche per iniziare la selezione/copia in modalità copia tmux:

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

Suppongo che potrebbe essere possibile unire la selezione della copia con il tasto 'y' E spostarla negli appunti x.

9
Ownatik

Non mi piace premere i tasti in più, quindi volevo qualcosa di più ambizioso. Accedere alla modalità di copia con [ evidenziare il testo giusto, quindi premere] per copiare il testo negli Appunti.

Inoltre, a tmux piace includere le nuove righe nelle espressioni che avvolgono (e stranamente quelle nuove righe sono nel posto sbagliato! Non sono dove l'espressione è racchiusa sullo schermo). Quindi volevo che C-] copiasse l'espressione rimuovendo le nuove righe.

Su tmux 1.6 ho provato questo:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

ma ciò non ha funzionato perché tmux non sembra felice di associare cose complesse alla tabella vi-copy. Quindi ho finito per fare questo invece:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

Questo porta a cose strane (] o C-] funzionerà in modo divertente la prossima volta che le usi, ma solo una volta) se esci dalla modalità di copia in un altro modo oltre a] o C-]. Questo potrebbe essere risolto con alcuni altri collegamenti che immagino, ma questo fa quello che voglio la maggior parte del tempo.

7
Leif

Una soluzione per Mac OS X. Segui questi 2 passaggi:

  1. Usa la soluzione alternativa a Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. Aggiungi questo codice al tuo tmux config (~/.tmux.conf)

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

Questa è la mia risposta piuttosto lunga che dovrebbe risolvere due problemi principali con l'uso di xclip per copiare il buffer da una sessione tmux remota (ssh):

1. Xclip non rispondente

Per me @ Grauwolf's risposta con xclip non ha funzionato (rende il riquadro di tmux totalmente irresponsabile). Ho scoperto perché nella pagina Tmux della wiki Arch :

xclip potrebbe anche essere usato a tale scopo, a differenza di xsel funziona meglio sulla stampa di bitstream grezzi che non si adattano alla locale corrente. Tuttavia, è meglio usare xsel invece di xclip, perché xclip non chiude STDOUT dopo aver letto dal buffer di tmux. Pertanto, tmux non sa che l'attività di copia è stata completata e continua ad attendere la chiusura di xclip, rendendo in tal modo tmux non rispondente. Una soluzione alternativa consiste nel reindirizzare STDOUT di xclip a/dev/null

Quindi l'associazione dovrebbe essere:

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

Ora funzionerà se la tua sessione tmux è locale.

2. xclip non è in grado di connettersi a X

Se stai usando tmux su ssh -X , ci sono grandi probabilità che questo non funzioni direttamente.

Questo perché la variabile Shell $DISPLAY deve essere impostato correttamente.

Soluzione completa

Quindi per me, la soluzione di lavoro completa è quella di inserire le seguenti righe nel mio ~/.tmux.conf:

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null

Per incollare dal primario:

bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"

Non capisco perfettamente perché $DISPLAY non è impostato correttamente durante l'approvvigionamento .tmux.conf, quindi è per questo che devo estrarlo con tmux show-env e sed.

Se hai tmux> = 1.8, puoi adattare questo comando con copy-pipe:

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'
4
PlasmaBinturong

Una variante leggermente modificata della risposta accettata, che ho preparato.

Preferisco anche usare gli Appunti di sistema (Ctrl-C, Ctrl-V) oltre agli Appunti predefiniti primary di xclip (quello che ottieni con la selezione del mouse e il clic centrale del mouse). Per scegliere gli appunti di sistema devi passare -selection clipboard argomento su xclip.

Inoltre, durante la copia di un buffer negli Appunti, mi piace la possibilità di scegliere quale buffer voglio copiare. Si fa usando choose-buffer e quindi passando l'argomento buffer a save-buffer utilizzando -b %%.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

PDATE: In qualche modo con tmux 1.8 e due delle mie installazioni di openSUSE 12.2, vedo un blocco quando tmux run-Shell viene richiamato con xclip che legge da stdin su una pipe. Invece ho deciso di provare xsel e sembra funzionare. Queste sono le combinazioni di tasti equivalenti usando xsel. Ho anche usato && per concatenare i comandi in incolla per una maggiore robustezza.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

C'è una soluzione su Arch Wiki usando xclip:

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

Molte di queste risposte non hanno funzionato per Ubuntu 14.04 su zsh così com'è. Non sono sicuro che la mia Shell abbia qualcosa a che fare con esso, ma ecco la mia versione funzionante dell'utilizzo di questa strategia per la copia e questa strategia per la copia.

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

Alcune note:

  • per copy-pipe, dovevo specificare i miei appunti con -sel clip -i. Quella linea combina il buffer yank to tmux e lo invia a xclip.
  • per effettivamente incollarlo, avevo bisogno di specificare di nuovo quale appunti con -sel clip -o

Funziona magnificamente ora per la mia configurazione di vim/zsh/tmux.

3
brianclements

Sto cercando di trovare un modo decente per copiare ciò che ho in un buffer tmux nei miei appunti. Ho provato un paio di cose diverse come

Per le associazioni in stile emacs ci sono alcune opzioni diverse. (Lo stile Vi dovrebbe essere simile?) Il legame tipico per fare "selezione-copia" in emacs è M-w, quindi sarebbe molto conveniente avere lo stesso legame in tmux.

1 - Sarebbe l'ideale, ma non funziona (a causa della limitazione di tmux?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2 - Compromesso che funziona bene per me: accetta di utilizzare un diverso keybinding per emacs-copy in tmux. Utilizzare ad esempio C-M-w. (Questa associazione che sarà definita "a livello globale" - non solo in modalità copia - ma utile solo in modalità copia)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

E la versione migliorata della risposta @Leif potrebbe essere:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

In questo modo non ci sono conseguenze se si esce dalla modalità di copia in un altro modo oltre], il codice sopra è racchiuso in tundle/tmux-yank un plug-in tmux per copiare il testo di tmux negli appunti di sistema, ha come target tmux> = 1.6 su OS X e Linux.

1
Javier López

Su OS-X con tmux versione 2.2 o successive funzionerà:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

Uso copyq un gestore di appunti multilinea. (Funziona con Windows, OSX, Linux.)

  • Aggiungi le seguenti righe in ~/.tmux.conf:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwin richiede copyq.exe posizione in ~/.bashrc:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1