tmux xclip copy non funziona più


8

Sulle configurazioni di Ubuntu 12.04 i miei comandi di copia e incolla di tmux appunti sono impostati come segue:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Questo ha funzionato benissimo per il tempo più lungo fino a circa un mese fa, quando sospetto che siano state apportate alcune modifiche alla configurazione o alla modifica del pacchetto che hanno rotto quanto sopra. Nel terminale GNOME, incollare funziona ancora bene con prefix+ ctrl-ve ctrl-shift-v.

Tuttavia, il xclipcomando di copia non funziona più, non importa quello che faccio, e ho provato a rimuovere il prefisso personalizzato sopra, usando -selectinvece di -sel, non usando clipboardecc. Questo è praticamente un blocco dello spettacolo per un utente GVim come me, dal momento che non ho anche una soluzione al terminale GNOME ctrl-shift-ccon tmux che prende il controllo della shell. Vado in modalità copia, seleziono il testo con space+ movemente quando eseguo prefix+ ctrl-cnon succede assolutamente nulla. Prima di questo, tmux visualizzava un messaggio di conferma nella sezione di notifica in fondo.

Qualcuno ha suggerimenti su come si potrebbe eseguire il debug di questo? Questo è un grande successo di produttività. Probabilmente posso usare il trucco temporaneo per risolvere il problema con i file per ora , ma sarebbe bello sapere cosa è successo xclip.


Xclip è effettivamente disponibile? Qual è l'output di type xclip?
Chris Down,

L'output è: "xclip è / usr / bin / xclip". Come ho già detto, incollare xclip funziona perfettamente per qualsiasi motivo.
Alexandr Kurilin,

1
Hai lo stesso problema con xsel -b?
Gilles 'SO- smetti di essere malvagio'

@Gilles, xsel -i -bsembra fare il trucco!
Alexandr Kurilin,

Eh. Non ho idea del perché funzioni, ho pensato xsel -be xclip -selection clipboardfarei la stessa cosa!
Gilles 'SO- smetti di essere malvagio'

Risposte:


9

L' xselutilità è simile xclip, ma implementata in modo leggermente diverso. Normalmente mi aspetto che si comportino allo stesso modo, ma non effettuano esattamente la stessa chiamata alla libreria X, quindi è possibile che in alcuni casi i casi xselfunzionino ma non xclip, o viceversa. Provare:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

Lo stesso risultato - non funziona per me - funziona come comando autonomo ma restituisce una stringa vuota da tale bind; Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Vitaly Zdanevich

6

L'aggiunta -bal comando run-shell(o run) ha risolto il problema. Con -bil comando shell viene eseguito in background.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"


2

Anche se non riesco più a riprodurlo, ma ecco la risposta tecnica che cosa potrebbe essere successo nel tuo caso.

Per prima cosa, devi capire come funzionano gli Appunti X11. Puoi leggere il saggio di jwz su questo: http://www.jwz.org/doc/x-cut-and-paste.html

In breve, l'applicazione che contiene il contenuto degli Appunti deve essere eseguita fino a quando un'altra applicazione non ne asserisce la proprietà. Quindi quando corri xclip -i <<< testpuoi vedere xclip in esecuzione in background fino a quando non fai un'altra selezione:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

Ora va tutto bene, ma quando si esce da questa shell, tutti i processi appartenenti a questa sessione vengono uccisi per impostazione predefinita inviando loro un segnale HUP. Ciò significa che xclip verrà ucciso e non potrai più accedere ai contenuti degli appunti.

Quindi la soluzione suggerita (nel caso in cui non si abbia xsel) è di ignorare il segnale HUP usando il seguente bind:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xselnon è interessato da questo problema perché la prima cosa che fa dopo il fork () è dissociarsi dal terminale di controllo in modo che non riceva il segnale HUP quando esce il suo guscio (non lo vedrai nemmeno nella ps precedente output ma solo quando si esegue un ps -e | grep xsel).


1

Sto riscontrando un problema simile e il file temporaneo non aiuta in questo caso particolare, temo. Questo perché xclipsembra comportarsi in modo diverso quando generato da tmux rispetto a quando viene eseguito "in modo interattivo" e attende che un'altra applicazione diventi proprietaria dell'area degli Appunti. Prova a usarlo xclip -l 1per uscire immediatamente (vedi la pagina man per i dettagli).


Non riesco a far funzionare quel lavoro. È come dovrebbe apparire quel legame: bind Cc run "tmux save-buffer - | xclip -l 1 -i -sel appunti"?
Alexandr Kurilin,

Potresti forse pubblicare quale soluzione alternativa ha funzionato per te? Sarebbe anche molto utile!
Alexandr Kurilin,

Sto usando bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
peterph

Sì, purtroppo ancora niente. Tmux non segnala nulla, né xclip.
Alexandr Kurilin,

Anche per me non sta segnalando nulla, ma funziona. Controlla cosa xclipsta facendo quando provi a copiare il buffer. Se rimane appeso lì in attesa di qualcosa, ucciderlo aiuta? Inoltre, devi uscire dalla modalità di selezione premendo Invio (e quindi memorizzandolo nel buffer) prima di provare a copiare il buffer negli Appunti X.
peterph

1

Questa è una vecchia domanda, ma sospetto di avere la soluzione, presa dalla pagina Tmux della wiki di 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 è reindirizzare STDOUT di xclip su / dev / null

Quindi il tuo comando dovrebbe diventare:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"

0

Questa è una configurazione funzionante che utilizzo:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
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.