tmux copy mode - Textblock auswählen

39

Ich verwende tmux mit vi-Tasten und das Kopieren / Einfügen funktioniert einwandfrei, solange Sie eine Textzeile auswählen oder nur ein Fenster haben. Wenn ich einen Textblock auswählen möchte (mehrzeilig, aber nicht in voller Breite), treten Probleme auf. Wenn ich mehrere vim-Fenster geöffnet habe, wird Text aus allen Fenstern ausgewählt, und ich muss nur Text aus einem Fenster auswählen. Das heißt, genau wie eine visuelle Auswahl in vim.

Ist das möglich zu tun?

Srećko Toroman
quelle
Wie aktiviere ich Vi Keybindings in tmux?
Romainl
füge "set-window-option -g mode-keys vi" zu deiner ~ / .tmux.conf hinzu
Srećko Toroman
1
Es sieht so aus, als würden die Antworten Ihre Frage nach der Verwendung des visuellen Blockmodus nicht beantworten. "Mehrzeilig, aber nicht in voller Breite" ist auch das, wonach ich suche. Haben Sie eine eigene Lösung gefunden?
Dmonopol
Nein, immer noch keine Lösung.
Srećko Toroman
Eigentlich gibt es eine Lösung.
Srećko Toroman

Antworten:

46

Stellen Sie sicher, dass Sie unten in diesem Beitrag nach den erforderlichen Bindungen suchen, die in Ihre .tmux.conf-Datei aufgenommen werden müssen.

Ich gehe davon aus, dass Ihr Präfixschlüssel Ca lautet:

  • Ca bedeutet: Ctrl+ drückenA
  • Ca [bedeutet: Ctrl+ Adrücken, dann drücken[

So wählen Sie in tmux einen rechteckigen Text aus (1,1) bis (2,2):

  • Gehen Sie in den Kopiermodus: Ca [
  • Bewegen Sie die Mitte einer Linie
  • Drücken Sie Cv
  • Leertaste drücken
  • Bewegen Sie die Auswahl mit jkhl
  • Wenn Sie mit Ihrer Auswahl zufrieden sind, drücken Sie die Eingabetaste (oder y, wenn Sie die Bindung in Ihrer Konfigurationsdatei haben).
  • Sie können den neuesten Kopierpuffer einfügen, indem Sie: Ca]

Beachten Sie, dass spacefür die Rechteckauswahl die Taste gedrückt werden muss.

Um wie gewohnt Linien auszuwählen, gehen Sie in den Kopiermodus und drücken Sie v, wählen Sie mit den Tasten jkhl aus und drücken Sie y.

Ich habe diese Bindungen in meiner .tmux.conf:

Vor Version 2.4 (20. April 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.

Nach Version 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.

Es ist wichtig, die Standardbindung zwischen Rechteck und Umschalter aufzuheben:

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

Andernfalls funktioniert die neue CV-Bindung nicht.

Hinweis: Um eine Single zu haben, .tmux.confdie versionsübergreifend funktioniert, lesen Sie diese Frage .

Amir H. Sadoughi
quelle
1
Ich danke dir sehr. Die Betonung liegt auf Ihrer tmux.conf - Sie können die Antwort so bearbeiten, dass am Anfang die Bindetaste -t ​​vi-copy 'Cv' Rectangle-Toggle angezeigt wird.
Srećko Toroman
In der ursprünglichen Frage wird gefragt, wie mit "mode-keys vi" eine rechteckige Auswahl erzielt werden kann. Es ist nicht erforderlich, die Schlüssel erneut zu binden, um diese Frage zu beantworten. Siehe die anderen Antworten; Es ist nur "v" und "Leerzeichen" aus dem Auswahlmodus.
Lqueryvg
Das funktioniert, außer dass JKHL nicht funktioniert. Ich muss die Pfeiltasten verwenden, um mich zu bewegen. Gibt es eine Möglichkeit, dies zu ändern?
Max
Was ist der Unterschied zwischen sendund send-keys. Ich sehe in superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key wird verwendet. Sind auch die Anführungszeichen wichtig?
user2442366
15

Sie können einen visuellen Block wie in vi - type auswählen, vbevor Sie mit der Auswahl beginnen. In der Manpage heißt dies "Rechteck umschalten".

Lars Kotthoff
quelle
2
Genau das verwende ich. Aber das hat ein Problem, das ich oben beschrieben habe. Das Rechteck hat immer die volle Breite. Ich brauche ein VIM-ähnliches Rechteck (x1, y1) - (x2, y2) :)
Srećko Toroman
1
@ Srećko Toroman was meinst du genau mit voller Breite?
Gitaarik
9

Wie Lars betont, wird vtatsächlich das getan , wonach Sie gefragt haben, indem Sie zwischen dem Rechteckmodus und dem Vollzeilenauswahlmodus umschalten. spaceund enterdienen jeweils dazu, eine neue Auswahl zu starten und zu kopieren. [Rufen Sie den Kopiermodus mit Ihrem Präfix gefolgt von auf und fügen Sie Ihre kopierte Auswahl mit in ein beliebiges tmux-Fenster ein]

Das hat mich auch verwirrt, da vin vim wie spacein tmux funktioniert, mit der Auswahl zu beginnen.

Bei der Ausgabe :list-keys -t vi-copyin tmux wird die vollständige Befehlstabelle im Kopiermodus angezeigt.

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
Hier
quelle
Ich verstehe es nicht wieder. Wie wählt man bei einem Vim-Fenster mit vertikaler Teilung ein Rechteck nur in der ersten Teilung aus? Hier umschließt das mehrzeilige Rechteck immer das gesamte Tmux-Fenster. Es ist nicht wie eine Vim-Blockauswahl. Ich verwende tmux 1.5, vielleicht ist es in deiner Version anders?
Srećko Toroman
Ja, hier ist v dem Beginn der Auswahl zugeordnet. Der Rechteck-Umschalter ist undefiniert. Ich denke, ihr beide habt Recht, ich muss nur meinen Client aktualisieren.
Srećko Toroman
Wenn Sie ein geteiltes VIM-Fenster in einem einzigen TMUX-Fenster geöffnet haben, können Sie dann nicht die Yank- und Paste-Funktion von VIM verwenden? Wenn Sie andererseits zwei tmux-Fenster haben, von denen jedes ein eigenes vim-Fenster hat, sollte tmux select / copy in der Lage sein, an den Fensterrändern einen Zeilenumbruch vorzunehmen. Ich benutze tmux 1.7
hier
6

Da keine der anderen Antworten eine optimale Lösung für das Problem bietet, stehe ich nicht über der Nekromantie.

Die Blockauswahl funktioniert auf die gleiche Weise wie in Vim, ohne dass Sie die Leertaste drücken müssen. Nur eine einfache Strg-V-Taste, die in Ihrem Muskelgedächtnis verankert ist.
Es erfordert die Bearbeitung Ihrer .tmux.conf (aber im vi-Modus ist dies bereits der Fall) und ich bin mir nicht sicher, ob es für tmux <2.4 funktioniert.

Fügen Sie dies zu Ihrer .tmux.conf hinzu, um die Vim-Auswahl und die Yank-Bindungen zu replizieren:

# 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"

Rufen Sie den Auswahlmodus auf und navigieren Sie zu der Stelle, an der Sie mit der Auswahl beginnen möchten. vBeginnt nun mit der regulären <C-v>Auswahl V(zeichenweise , zeilenweise), startet die Blockauswahl und (Umschalt-v) startet die Zeilenauswahl. Unabhängig von der Art der Auswahl,y Sie tmux paste buffer (oder die X-Zwischenablage; siehe oben stehende Codekommentare) verwenden.

Gleich wie Vim.

andrejr
quelle
Haben Sie für mich gearbeitet, haben Sie eine Gegenstimme für Ihre Nekomantie 👏👏👏
Mahemoff
2

EDIT: Nachdem ich den Quellcode überprüft habe, habe ich meine Antwort komplett neu geschrieben.

Ich dachte ursprünglich, dass dies nicht möglich wäre, weil ich es nicht zum Laufen bringen könnte, aber die anderen Antworten sind korrekt, da vsie der richtige Schlüssel dafür sind, aber es ist nicht klar, wie man das benutzt, besonders wenn man an Vim gewöhnt ist.

Außerdem würde es für mich nicht funktionieren, weil ich vgezwungen war begin-selection- ich denke, ich muss diese Idee blind kopiert haben, um die vim-Methode nachzuahmen, mit der ich eine charakterbezogene Auswahl starten wollte, ohne zu wissen, dass dies später Probleme verursachen würde Blockauswahl.

$ 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

Nachdem ich diese Bindung entfernt hatte (indem ich die Zeile in meinem .tmux.confauskommentierte und tmux neu startete), fing es an zu funktionieren, aber es ist immer noch ziemlich verwirrend, weil es überhaupt nicht dasselbe ist wie vim.

Mit Standardbindungen sollte es wie folgt funktionieren:

  1. Stellen Sie sicher, dass Sie tmux setw -g mode-keys viin Ihrem Browser haben .tmux.conf.
  2. Geben Sie ein C-a [, um den Kopiermodus zu starten
  3. Bewegen Sie den Cursor an die Stelle, an der Sie mit der Auswahl beginnen möchten
  4. Art v
  5. Geben Sie ein Space, um die Auswahl zu starten
  6. Bewegen Sie den Cursor und Sie sehen eine rechteckige Auswahl
  7. Sie können verneut drücken , um die Auswahl auf Zeichenweise zurückzusetzen oder umgekehrt.

Sie müssen das nicht eingeben, vbevor Sie drücken Space. Sie können die zeichenweise Auswahl mit Spacezuerst starten und anschließend drücken, vum in den rechteckigen Auswahlmodus zu wechseln.

Es unterscheidet sich von vim darin, dass Sie in tmux zwei Zeichen eingeben müssen: Spaceund vum in den rechteckigen Auswahlmodus zu gelangen. In vim musst du nur tippen Ctrl-V.

Auch in vim vstartet eine zeichenweise Auswahl, nicht sperren.

Leider scheint es in tmux ( Shift-vin vim) keinen zeilenweisen Auswahlmodus zu geben .
BEARBEITEN: Es sieht so aus, als ob Tmux Version 2.0 einen zeilenweisen Auswahlmodus bietet Shift-v(ich habe es aber noch nicht ausprobiert!)

Lqueryvg
quelle
Drücken Sie "v" und Sie können Linien auswählen. Kein Platzbedarf.
Amir H. Sadoughi
1
@ AmirH.Sadoughi, das liegt daran, dass Sie (gemäß Ihrer Antwort) die Standardeinstellungen geändert und "v" gebunden haben, um die Auswahl anstelle von "Leerzeichen" zu beginnen. Wenn Sie mit einer leeren .tmux.conf beginnen, sollten Sie feststellen, dass das von mir beschriebene Verhalten korrekt ist. Sie müssen die Leertaste drücken, um die Auswahl zu starten.
Lqueryvg
1
Danke, dass du mich verbessert hast. Um Ihren letzten Satz (über die zeilenweise Auswahl) anzusprechen, habe ich versucht zu sagen, dass ich mit meiner Konfiguration eine Blockauswahl mit cv-space und mit v eine Zeilenauswahl machen kann. Drücken Sie also "Präfix v" "erlaubt mir Zeilen auszuwählen.
Amir H. Sadoughi
Ich kann das kaum glauben, da Tmux erst kürzlich ( Shift-vin Release 2.0, März 2015) um eine Auswahl in Zeilenrichtung erweitert wurde , sicherlich nach meiner Antwort und lange nach Ihrer ursprünglichen Antwort. Vielleicht sprechen Sie und ich über zwei verschiedene Dinge, wenn wir über die zeilenweise Auswahl sprechen. Bitte vergleichen Sie mit den 3 Auswahlmodi in VIM (mit v, Shift-vund Ctrl-v).
Lqueryvg
Du hast recht, ich habe es gerade getestet. Meine vAuswahl ist charakterbezogen. Ich bin in der Version 1.9a und habe nicht die vim-artige zeilenweise Auswahl. Mit der Version 2.0 sind genau die drei Modi, die vim hat, auch in tmux möglich, oder?
Amir H. Sadoughi