Tryb kopiowania tmux - wybierz blok tekstu

39

Używam tmux z klawiszami vi, a kopiowanie / wklejanie działa dobrze, dopóki wybierasz jeden wiersz tekstu lub jeśli masz tylko jedno okno. Kiedy chcę wybrać blok tekstu (wiele wierszy, ale nie pełnej szerokości), mam kłopoty. Jeśli mam otwartych wiele okien vim, wówczas zaznacza tekst ze wszystkich, a potrzebuję tylko zaznaczać tekst z jednego okna. To znaczy, podobnie jak wizualny wybór w vimie.

Czy to się da zrobić?

Srećko Toroman
źródło
Jak aktywować skróty klawiszowe Vi w tmux?
romainl
dodaj „set-window-option -g mode-keys vi” do swojego ~ / .tmux.conf
Srećko Toroman
1
Wygląda na to, że odpowiedzi nie dotyczą twojego pytania o użycie trybu blokowania wizualnego - szukam również „wielu linii, ale nie pełnej szerokości”. Znalazłeś własne rozwiązanie?
dmonopoly
Nie, wciąż nie ma rozwiązania.
Srećko Toroman
W rzeczywistości istnieje rozwiązanie.
Srećko Toroman

Odpowiedzi:

46

Pamiętaj, aby sprawdzić na dole tego postu niezbędne powiązania, które muszą przejść do pliku .tmux.conf.

Zakładam, że twój klucz prefiksu to Ca:

  • Ca oznacza: naciśnij Ctrl+A
  • Ca [oznacza: naciśnij Ctrl+, Aa następnie naciśnij[

Aby zaznaczyć prostokątnie tekst od (1,1) do (2,2) w tmux:

  • Przejdź do trybu kopiowania: Ca [
  • Przesuń środek linii
  • Naciśnij Cv
  • Naciśnij spację
  • Przenieś zaznaczenie za pomocą jkhl
  • Gdy jesteś zadowolony ze swojego wyboru, naciśnij Enter (lub y, jeśli masz powiązanie w pliku conf).
  • Możesz wkleić najnowszy bufor kopiowania przez: Ca]

Zauważ, że naciśnięcie spacejest konieczne do wyboru prostokąta.

Aby wybrać linie tak jak zwykle, przejdź do trybu kopiowania i naciśnij v, wybierz za pomocą klawiszy jkhl i naciśnij y.

Mam te wiązania w moim pliku .tmux.conf:

Przed wersją 2.4 (20 kwietnia 2017 r.) :

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.

Po wersji 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.

Ważne jest, aby odznaczyć domyślne wiązanie przełączania prostokąta:

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

W przeciwnym razie nowe wiązanie „Cv” nie będzie działać.

Uwaga: aby mieć taki, .tmux.confktóry działa w różnych wersjach, zobacz to pytanie .

Amir H. Sadoughi
źródło
1
Dziękuję bardzo. Nacisk kładziony jest na twój tmux.conf - możesz edytować odpowiedź, aby na początku włączyć klucz bind-t vi-skopiować „Cv” prostokąt-przełącznik.
Srećko Toroman
Pierwotne pytanie dotyczy tego, jak uzyskać prostokątny wybór za pomocą „klawiszy trybu vi”. Aby odpowiedzieć na to pytanie, nie trzeba ponownie wiązać kluczy. Zobacz inne odpowiedzi; to tylko „v” i „spacja” z trybu wyboru.
Lqueryvg
to działa inaczej niż fakt, że jkhl nie działa, muszę używać klawiszy strzałek, aby się poruszać, czy jest jakiś sposób, aby to zmienić?
Maks.
Jaka jest różnica między sendi send-keys. Widzę w superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key jest używany. Czy ważne są również cudzysłowy?
user2442366,
15

Możesz wybrać blok wizualny tak jak w vi - type vprzed rozpoczęciem wyboru. Na stronie podręcznej nazywa się to „Przełączaniem prostokąta”.

Lars Kotthoff
źródło
2
Właśnie tego używam. Ale to ma problem, który opisałem powyżej. Prostokąt ma zawsze pełną szerokość. Potrzebuję prostokąta podobnego do VIM (x1, y1) - (x2, y2) :)
Srećko Toroman
1
@ Srećko Toroman, co masz na myśli dokładnie przy pełnej szerokości?
gitaarik
9

Jak zauważa Lars, vfaktycznie robi to, o co prosisz, przełączając między trybem prostokąta a trybem zaznaczania pełnej linii. spacei entersłużą odpowiednio do rozpoczęcia nowego wyboru i skopiowania go. Wejdź do trybu kopiowania za pomocą prefiksu, a następnie [wklej skopiowany wybór do dowolnego okna tmux za pomocą]

Zdezorientowało mnie to również, ponieważ vdziała w vimie, podobnie spacejak w tmuxie, aby rozpocząć selekcję.

Wydanie :list-keys -t vi-copyw tmux wyświetli pełną tabelę poleceń w trybie kopiowania.

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
tutaj
źródło
Nie rozumiem tego ponownie. Biorąc pod uwagę okno Vima z podziałem pionowym, jak wybrać prostokąt tylko w pierwszym podziale? W tym przypadku wieloliniowy prostokąt zawsze zawija pełny panel Tmux. To nie jest wybór bloku Vima. Używam Tmux 1.5, może różni się w twojej wersji?
Srećko Toroman
Tak, tutaj v jest zamapowane na wybór początkowy. Przełączanie prostokąta jest niezdefiniowane. Więc myślę, że oboje macie rację, muszę tylko zaktualizować mojego klienta?
Srećko Toroman
Jeśli masz podzielone okno vima otwarte w jednym panelu tmux, czy nie możesz użyć zdolności szarpania i wklejania vima? Jeśli z drugiej strony masz dwa panele tmux, każde z własnym oknem vim, tmux select / copy powinien móc owijać się na krawędziach panelu. Korzystam z Tmux 1.7
tutaj
6

Ponieważ żadna z pozostałych odpowiedzi nie daje optymalnego rozwiązania problemu, nie jestem ponad nekromancją.

Istnieje sposób, aby wybór bloku działał tak samo jak w Vimie, bez konieczności naciskania spacji. Po prostu prosty Ctrl-V, zakorzeniony w pamięci mięśni.
Wymaga edycji .tmux.conf (ale już to robi w trybie vi) i nie jestem pewien, czy to działa dla tmux <2.4.

Dodaj to do swojego .tmux.conf, aby zreplikować wybór Vima i powiązania 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"

Wejdź do trybu wyboru i przejdź do miejsca, w którym chcesz rozpocząć wybór. Teraz vrozpoczyna regularne zaznaczanie (znak po znaku, wiersz), <C-v>rozpoczyna blokowanie i V(shift-v) rozpoczyna wiersz. Niezależnie od rodzaju wyboru, yszarpa do bufora wklejania tmux (lub schowka X; patrz komentarze do kodu powyżej).

Taki sam jak Vim.

andrejr
źródło
Pracował dla mnie, poproś o twoją nekromancję 👏👏👏
mahemoff
2

EDYCJA: Po sprawdzeniu kodu źródłowego całkowicie ponownie napisałem swoją odpowiedź.

Początkowo myślałem, że to nie jest możliwe, ponieważ nie mogłem tego uruchomić, ale inne odpowiedzi są poprawne, jeśli chodzi o vbycie odpowiednim kluczem do tego, ale nie jest oczywiste, jak tego użyć, szczególnie jeśli jesteś przyzwyczajony do vim.

Nie zadziałałoby to również dla mnie, ponieważ vzobowiązałem się do tego begin-selection- myślę, że musiałem ślepo skopiować ten pomysł z innego miejsca, aby naśladować sposób vimów, aby rozpocząć mądry wybór postaci, nie wiedząc, że spowoduje to problemy na dalszych etapach blokuj wybory.

$ 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

Kiedy .tmux.confusunąłem to wiązanie (komentując linię w moim i ponownie uruchamiając tmux), zaczęło działać, ale nadal jest dość mylące, ponieważ wcale nie jest takie samo jak vim.

W przypadku domyślnych powiązań powinno ono działać w następujący sposób:

  1. Upewnij się, że tmux unning ze setw -g mode-keys viw twojej .tmux.conf.
  2. wpisz, C-a [aby rozpocząć tryb kopiowania
  3. przesuń kursor do miejsca, w którym chcesz rozpocząć zaznaczanie
  4. rodzaj v
  5. wpisz, Spaceaby rozpocząć wybór
  6. przesuń kursor, a zobaczysz prostokątny wybór
  7. możesz nacisnąć vponownie, aby przełączyć wybór z powrotem na wybór znakowy lub odwrotnie.

Nie musisz pisać vprzed naciśnięciem Space. Możesz rozpocząć wybór znakowy od Spacepierwszego, a vnastępnie nacisnąć, aby przełączyć do trybu wyboru prostokątnego.

Zupełnie różni się od vima tym, że w tmux musisz wpisać dwa znaki: Spacei vprzejść do trybu selekcji prostokątnej. W vimie musisz tylko pisać Ctrl-V.

Również w vim vrozpoczyna się wybór znakowy, a nie blokowy.

Niestety, tmux ( Shift-vin vim) nie wydaje się być liniowym trybem selekcji .
EDYCJA: Wygląda na to, że Tmux wersja 2.0 zapewnia liniowy tryb wyboru z Shift-v(chociaż jeszcze tego nie próbowałem!)

Lqueryvg
źródło
Naciśnij „v” i możesz wybrać linie. Nie potrzeba miejsca.
Amir H. Sadoughi
1
@ AmirH.Sadoughi, to dlatego, że (zgodnie z odpowiedzią) zmieniłeś wartości domyślne i przypisałeś „v”, aby rozpocząć wybór zamiast „spacji”. Jeśli zaczynasz od pustego pliku .tmux.conf, powinieneś znaleźć zachowanie, które opisuję, jest poprawne; musisz nacisnąć „spację”, aby rozpocząć wybór.
Lqueryvg
1
Dzięki za poprawienie mnie. Aby odpowiedzieć na twoje ostatnie zdanie (o zaznaczeniu liniowym), próbowałem powiedzieć, że za pomocą mojej konfiguracji mogę dokonać wyboru bloku za pomocą cv-space i mogę dokonać wyboru linii za pomocą v. Więc naciskając „przedrostek v „pozwala mi wybierać linie.
Amir H. Sadoughi
Bardzo trudno mi w to uwierzyć, ponieważ wybór liniowy został dodany do Tmux dopiero niedawno ( Shift-vw wersji 2.0 marca 2015), z pewnością po mojej odpowiedzi i długo po twojej oryginalnej odpowiedzi. Być może ty i ja mówimy o dwóch różnych rzeczach, kiedy mówimy o selekcji liniowej. Porównaj z 3 trybami wyboru w VIM (z v, Shift-vi Ctrl-v).
Lqueryvg
Masz rację, właśnie to przetestowałem. Mój vwybór jest mądry. Jestem w wersji 1.9a i nie mam wyboru podobnego do vima. Tak więc, w wersji 2.0, dokładnie trzy tryby, które ma vim, są również możliwe w tmux, prawda?
Amir H. Sadoughi