Skopiuj zaznaczenie do schowka w tmux

24

Jeśli zaznaczę tekst za pomocą myszy w tmux w iTerm2 na macOS, zaznaczony tekst zostanie skopiowany do mojego schowka. Nie muszę klikać żadnych dodatkowych przycisków - wystarczy wybrać żądany tekst i gotowe.

Testowałem tmux w terminal.app na macOS, ale to tam nie działa - muszę nacisnąć, yaby skopiować zaznaczenie do mojego schowka.

Myślałem, że istnieje powiązanie myszy (coś MouseOnSelectionpodobnego do MouseDown1Pane), ale nie znalazłem nic przydatnego w Internecie i man tmux.

Zastanawiam się, czy istnieje sposób, aby mieć podobne zachowanie na Ubuntu 16.10 - najlepiej w terminalu Gnome.

Moje pliki tmux są dostępne tutaj (link) .

Mateusz Piotrowski
źródło

Odpowiedzi:

46

Tmux 2.4+ z powiązaniami trybu kopiowania vi i xclip :

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

W przypadku starszych wersji tmux, powiązań trybu kopiowania emacsa (domyślnie) lub platform innych niż X (tj. Bez xclip), zobacz wyjaśnienie poniżej.


Objaśnienie: Najpierw musimy włączyć opcję myszy, aby tmux przechwycił mysz i pozwolił nam powiązać zdarzenia myszy:

set-option -g mouse on

Gnome-terminal nie obsługuje ustawiania schowka przy użyciu sekwencji specjalnych xterm, więc powinniśmy upewnić się, że set-clipboardopcja jest wyłączona:

set-option -s set-clipboard off

Ta opcja może być obsługiwana i domyślnie włączona w iTerm2 (patrz set-clipboardinstrukcja tmux), co wyjaśniałoby zachowanie się na niej.

Następnie możemy powiązać MouseDragEnd1Pane„klucz” trybu kopiowania , tzn. Gdy pierwszy przycisk myszy zostanie zwolniony po kliknięciu i przeciągnięciu w okienku, do polecenia tmux, które pobiera bieżący wybór trybu kopiowania (domyślnie ustawiony dla MouseDrag1Pane) i przesyła potoki do polecenia powłoki. Ta komenda tmux była copy-pipewcześniejsza niż tmux 2.4 i od tego czasu zmieniła się na send-keys -X copy-pipe[-and-cancel]. Jeśli chodzi o polecenie powłoki, po prostu potrzebujemy czegoś, co ustawi zawartość schowka systemowego na cokolwiek, co jest do niego przesyłane; xclip służy do tego w następujących poleceniach. Niektóre równoważne zamienniki "xclip -selection clipboard -i"poniżej na platformach innych niż X to "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) i "cat /dev/clipboard"(Cygwin, MinGW).

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux od 2.2 do 2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

Przed tmux 2.2:

Kopiuj po tym, jak pierwotnie dodano obsługę przeciągania myszą w Tmux 1.3 poprzez ustawienie nowej mode-mouseopcji na on. Tmux 2.1 zmienił obsługę myszy na znane powiązania klawiszy myszy, ale nie miał DragEndpowiązań, które zostały wprowadzone w 2.2. Dlatego przed wersją 2.2 uważam, że jedyną metodą ustawienia schowka systemowego na przeciąganie myszą było wbudowane użycie sekwencji ucieczki xterm ( set-clipboardopcja). Oznacza to, że konieczna jest aktualizacja do wersji co najmniej tmux 2.2, aby uzyskać zachowanie przeciągania i kopiowania dla terminali, które nie obsługują set-clipboard, takich jak GNOME Terminal.

Josh Brobst
źródło
3
Ta wysokiej jakości odpowiedź sprawiła, że ​​w końcu wszystko kliknęło dla mnie .. dzięki!
cjauvin
2
Dla każdego, kto próbuje to zrobić na mac, bo już zmienili terminala funkcjonalność i domyślnej metody określonej przez OP nie działa (używam Byobu który ma swój własny bufor kopiowania): zastąpienie xclip...oświadczenie z prostym pbcopyrobi sztuczka.
Darrel Holt
Żadne z rozwiązań w tym wątku nie działa dla mnie.
Yankee
1
Cześć Josh, kiedy I plik źródłowy ~ / .tmux.conf, okazało się:Unknown key: MouseDragEnd1Pane
Xifeng Li
@XifengLi Jakiej wersji i systemu operacyjnego używasz? Uważam, że potrzebujesz przynajmniej tmux 2.2 dla DragEndkluczy.
Josh Brobst,
8

Jako rozszerzenie przyjętej odpowiedzi, ludzie często uważają to za niepokojące po zwolnieniu przycisku myszy z trybu kopiowania (tak się dzieje copy-pipe-and-cancel). Zobacz: https://github.com/tmux/tmux/issues/140 . Dlatego w nowszym tmuxie (używam 2.6) możemy używać copy-piperazem z, clear selectionaby skopiować do zaznaczenia, ale nie wychodź z trybu kopiowania:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection
Gabor Marton
źródło
2

Rozszerzając obie odpowiedzi do skopiowania z msys2 do schowka Windows (i wyczyść zaznaczenie):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
Shawn Hoover
źródło
Słuszna uwaga. Sam korzystam z trybu kopiowania (styl emacsa), więc po testowaniu wkleiłem własną konfigurację. Zaktualizowałem odpowiedź, aby uwzględnić oba, jak w zaakceptowanej odpowiedzi.
Shawn Hoover
0

Jeszcze inne rozszerzenie dotyczy używania Shiftklucza.

Przytrzymaj Shiftpodczas zaznaczania tekstu za pomocą myszy. Teraz masz standardowe menu kliknięcia prawym przyciskiem myszy (przytrzymuj lub naciśnij Shiftponownie) i możesz używać Ctrl+Shift+Coraz Ctrl+Shift+Vdo kopiowania i wklejania. Skopiowany tekst będzie również dostępny w schowku systemowym .

Testowane na Ubuntu 18.04.1z tmux 2.6.

Źródło: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208 .

Dušan Maďar
źródło