tmux copy mode - seleziona il blocco di testo


39

Sto usando tmux con i tasti vi, e copia / incolla funziona bene fintanto che selezioni una riga di testo o se hai solo una finestra. Quando voglio selezionare un blocco di testo (più righe, ma non a larghezza intera), allora ho dei problemi. Se avessi più finestre di VIM aperte, selezionerei il testo da tutte, e ciò di cui ho bisogno è selezionare il testo da una sola finestra. Cioè, proprio come una selezione visiva in vim.

È possibile farlo?


Come si attivano le combinazioni di tasti Vi in tmux?
romainl

aggiungi "set-window-option -g mode-keys vi" al tuo ~ / .tmux.conf
Srećko Toroman

1
Sembra che le risposte non arrivino alla tua domanda sull'utilizzo della modalità blocco visivo: "più righe, ma non larghezza intera" è anche quello che sto cercando. Hai trovato la tua soluzione?
Dmonopoli

No, ancora nessuna soluzione.
Srećko Toroman,

In realtà, c'è una soluzione.
Srećko Toroman,

Risposte:


46

Assicurati di controllare in fondo a questo post per i collegamenti necessari che devono andare nel tuo file .tmux.conf.

Presumo che il tuo prefisso sia Ca:

  • Ca significa: premere Ctrl+A
  • Ca [significa: premere Ctrl+ Aquindi premere[

Per fare una selezione rettangolare di testo da (1,1) a (2,2) in tmux:

  • Vai alla modalità di copia: Ca [
  • Sposta il centro di una linea
  • Premi Cv
  • Premi spazio
  • Sposta la selezione con jkhl
  • Una volta che sei soddisfatto della tua selezione, premi Invio (oppure y se hai il binding nel tuo file conf).
  • È possibile incollare il buffer di copia più recente tramite: Ca]

Si noti che spaceè necessario premere per selezionare il rettangolo.

Per selezionare le linee come faresti normalmente, vai in modalità copia e premi v, seleziona con i tasti jkhl e premi y.

Ho questi collegamenti nel mio .tmux.conf:

Prima della versione 2.4 (20 aprile 2017) :

setw -g mode-keys vi
bind-key -t vi-copy 'v' begin-selection     # Begin selection in copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle  # Begin selection in copy mode.
bind-key -t vi-copy 'y' copy-selection      # Yank selection in copy mode.

Dopo la versione 2.4 :

setw -g mode-keys vi
bind-key -T copy-mode-vi 'v' send -X begin-selection     # Begin selection in copy mode.
bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle  # Begin selection in copy mode.
bind-key -T copy-mode-vi 'y' send -X copy-selection      # Yank selection in copy mode.

È importante separare l'associazione di default da rettangolo a levetta:

unbind-key -t vi-copy v  # Prior to version 2.4
unbind-key -T copy-mode-vi v

Altrimenti la nuova associazione "Cv" non funziona.

Nota: per avere un singolo .tmux.confche funzioni su più versioni, vedi questa domanda .


1
Grazie mille. L'enfasi è su tmux.conf: è possibile modificare la risposta per includere bind-key -t vi-copy 'Cv' rectangle-toggle all'inizio.
Srećko Toroman,

La domanda originale chiede come far funzionare la selezione rettangolare con "mode-keys vi". Non è necessario ricollegare le chiavi per rispondere a questa domanda. Vedi le altre risposte; è solo "v" e "spazio" dalla modalità di selezione.
Lqueryvg,

questo funziona oltre al fatto che jkhl non funziona, devo usare i tasti freccia per spostarmi, c'è un modo per cambiarlo?
Max

Qual è la differenza tra sende send-keys. Vedo in superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key utilizzato. Anche le virgolette sono importanti?
user2442366,

15

È possibile selezionare un blocco visivo proprio come nel tipo vi vprima di iniziare la selezione. Nella manpage, questo si chiama "Rectangle toggle".


2
È esattamente quello che sto usando. Ma questo ha un problema che ho descritto sopra. Il rettangolo è sempre a tutta larghezza. Ho bisogno di un rettangolo simile a VIM (x1, y1) - (x2, y2) :)
Srećko Toroman

1
@ Srećko Toroman cosa intendi esattamente a tutta larghezza?
Gitaarik,

9

Come sottolinea Lars, in vrealtà fa quello che stai chiedendo alternando tra la modalità rettangolo e la modalità di selezione a linea intera. spacee entervengono utilizzati rispettivamente per iniziare una nuova selezione e copiarla. Entra nella modalità copia usando il tuo prefisso seguito da [e incolla la selezione copiata in qualsiasi finestra di tmux usando]

Questo mi ha confuso anche dal momento che vfunziona in vim come spacein tmux, per iniziare la selezione.

L'emissione :list-keys -t vi-copyin tmux mostrerà la tabella completa dei comandi in modalità copia.

bind-key -t vi-copy    C-b page-up                                                      
bind-key -t vi-copy    C-c cancel
bind-key -t vi-copy    C-e scroll-down
bind-key -t vi-copy    C-f page-down
bind-key -t vi-copy    C-h cursor-left
bind-key -t vi-copy  Enter copy-selection
bind-key -t vi-copy    C-y scroll-up
bind-key -t vi-copy Escape clear-selection
bind-key -t vi-copy  Space begin-selection
bind-key -t vi-copy      $ end-of-line
bind-key -t vi-copy      , jump-reverse
bind-key -t vi-copy      / search-forward
bind-key -t vi-copy      0 start-of-line
bind-key -t vi-copy      1 start-number-prefix
bind-key -t vi-copy      2 start-number-prefix
bind-key -t vi-copy      3 start-number-prefix
bind-key -t vi-copy      4 start-number-prefix
bind-key -t vi-copy      5 start-number-prefix
bind-key -t vi-copy      6 start-number-prefix
bind-key -t vi-copy      7 start-number-prefix
bind-key -t vi-copy      8 start-number-prefix
bind-key -t vi-copy      9 start-number-prefix
bind-key -t vi-copy      : goto-line
bind-key -t vi-copy      ; jump-again
bind-key -t vi-copy      ? search-backward
bind-key -t vi-copy      B previous-space
bind-key -t vi-copy      D copy-end-of-line
bind-key -t vi-copy      E next-space-end
bind-key -t vi-copy      F jump-backward
bind-key -t vi-copy      G history-bottom
bind-key -t vi-copy      H top-line
bind-key -t vi-copy      J scroll-down
bind-key -t vi-copy      K scroll-up
bind-key -t vi-copy      L bottom-line
bind-key -t vi-copy      M middle-line
bind-key -t vi-copy      N search-reverse
bind-key -t vi-copy      T jump-to-backward
bind-key -t vi-copy      W next-space
bind-key -t vi-copy      ^ back-to-indentation
bind-key -t vi-copy      b previous-word
bind-key -t vi-copy      e next-word-end
bind-key -t vi-copy      f jump-forward
bind-key -t vi-copy      g history-top
bind-key -t vi-copy      h cursor-left
bind-key -t vi-copy      j cursor-down
bind-key -t vi-copy      k cursor-up
bind-key -t vi-copy      l cursor-right
bind-key -t vi-copy      n search-again
bind-key -t vi-copy      q cancel
bind-key -t vi-copy      t jump-to-forward
bind-key -t vi-copy      v rectangle-toggle
bind-key -t vi-copy      w next-word
bind-key -t vi-copy BSpace cursor-left
bind-key -t vi-copy  NPage page-down
bind-key -t vi-copy  PPage page-up
bind-key -t vi-copy     Up cursor-up
bind-key -t vi-copy   Down cursor-down
bind-key -t vi-copy   Left cursor-left
bind-key -t vi-copy  Right cursor-right
bind-key -t vi-copy   C-Up scroll-up
bind-key -t vi-copy C-Down scroll-down

Non capisco di nuovo. Data una finestra di Vim con una divisione verticale, come si seleziona un rettangolo solo nella prima divisione? Qui, il rettangolo multilinea avvolgerà sempre l'intero riquadro Tmux. Non è come una selezione di blocchi Vim. Sto usando tmux 1.5, forse è diverso nella tua versione?
Srećko Toroman,

Sì, qui, v è mappato per iniziare la selezione. Il rettangolo-toggle non è definito. Quindi credo che entrambi abbiate ragione, devo solo aggiornare il mio client?
Srećko Toroman,

Se hai una finestra divisa vim aperta in un singolo riquadro di tmux, non puoi usare l'abilità yank and paste di vim? Se invece hai due riquadri tmux, ognuno con la sua finestra vim, tmux select / copy dovrebbe essere in grado di avvolgere i bordi del riquadro. Sto usando tmux 1.7
qui il

6

Poiché nessuna delle altre risposte offre una soluzione ottimale al problema, non sono al di sopra della negromanzia.

C'è un modo per far funzionare la selezione dei blocchi nello stesso modo in cui funziona in Vim, senza dover premere spazio. Solo un semplice Ctrl-V, radicato nella tua memoria muscolare.
Richiede la modifica di .tmux.conf (ma l'utilizzo di vi-mode lo fa già) e non sono sicuro che funzioni per tmux <2.4.

Aggiungi questo al tuo .tmux.conf per replicare la selezione di Vim e i collegamenti yank:

# set vi-mode
set-window-option -g mode-keys vi
# keybindings
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle \; send -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# comment the preceding line and uncomment the following to yank to X clipboard
# bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"

Accedi alla modalità di selezione e vai al punto in cui desideri iniziare la selezione. Ora vinizia la selezione regolare (carattere per carattere, per linea), <C-v>avvia la selezione del blocco e V(shift-v) avvia la selezione della linea. Indipendentemente dal tipo di selezione, yesegue il tmux paste buffer (o appunti X; vedere i commenti sul codice sopra).

Lo stesso di Vim.


Ha funzionato per me, ho un voto verso la tua negligenza 👏👏👏
mahemoff,

2

EDIT: dopo aver verificato il codice sorgente, ho riscritto completamente la mia risposta.

Inizialmente pensavo che ciò non fosse possibile perché non riuscivo a farlo funzionare, ma le altre risposte sono corrette vsull'essere la chiave corretta per questo, ma non è ovvio come usarlo, specialmente se sei abituato a vim.

Inoltre, non avrebbe funzionato per me perché ero vtenuto a begin-selection- penso di aver copiato ciecamente questa idea da qualche altra parte per imitare il modo migliore per iniziare una saggia selezione di personaggi, non sapendo che avrebbe causato problemi più in là con selezioni di blocco.

$ tmux -V
tmux 1.9a
$ tmux list-keys -t vi-copy  | grep " v "
bind-key -t vi-copy      v begin-selection     # suppressed my block selection mode

Una volta ho .tmux.confrimosso questo legame (commentando la riga nel mio e riavviando tmux), ha iniziato a funzionare, ma è ancora piuttosto confuso perché non è affatto lo stesso di VIM.

Con i collegamenti predefiniti, dovrebbe funzionare come segue:

  1. Assicurati di avere tmux in disaccordo con setw -g mode-keys vinel tuo .tmux.conf.
  2. digitare C-a [per avviare la modalità di copia
  3. spostare il cursore nel punto in cui si desidera iniziare la selezione
  4. genere v
  5. digitare Spaceper iniziare la selezione
  6. sposta il cursore e vedrai una selezione rettangolare
  7. puoi premere di vnuovo per riportare la selezione in una selezione saggia o viceversa.

Non è necessario digitare il vprima di premere Space. È possibile avviare prima la selezione basata sui caratteri Spacee premere vsuccessivamente per passare alla modalità di selezione rettangolare.

È abbastanza diverso da Vim in quanto in tmux devi digitare due caratteri: Spacee ventrare in modalità di selezione rettangolare. In vim devi solo digitare Ctrl-V.

Anche in vim vinizia una selezione saggia del personaggio, non un blocco.

Purtroppo, in tmux ( Shift-vin vim) non sembra esserci una modalità di selezione in linea .
EDIT: Sembra che Tmux versione 2.0 fornisca una modalità di selezione in linea con Shift-v(non l'ho ancora provato!)


Premi "v" e puoi selezionare le linee. Non c'è bisogno di spazio.
Amir H. Sadoughi,

1
@ AmirH.Sadoughi, questo perché (come da tua risposta) hai modificato le impostazioni predefinite e associato "v" per iniziare la selezione anziché "spazio". Se inizi con un .tmux.conf vuoto dovresti trovare il comportamento che descrivo sia corretto; devi premere "spazio" per iniziare la selezione.
Lqueryvg,

1
Grazie per avermi corretto. Per indirizzare la tua ultima frase (sulla selezione della linea), stavo cercando di dire che con la mia configurazione, posso fare una selezione di blocchi con cv-spazio e posso fare una selezione di linea con v. Quindi, premendo "prefisso v "mi permette di selezionare le linee.
Amir H. Sadoughi,

Trovo molto difficile da credere perché la selezione saggia è stata aggiunta a Tmux solo di recente ( Shift-vnella versione 2.0 marzo 2015), sicuramente dopo la mia risposta e molto dopo la tua risposta originale. Forse tu ed io stiamo parlando di due cose diverse quando parliamo di selezione saggia. Si prega di confrontare con le 3 modalità di selezione in VIM (con v, Shift-ve Ctrl-v).
Lqueryvg,

Hai ragione, l'ho appena provato. La mia vselezione è saggia. Sono sulla versione 1.9a e non ho la selezione line-sise vim-like. Quindi, con la versione 2.0, le esatte tre modalità di vim sono possibili anche in tmux, giusto?
Amir H. Sadoughi,
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.