Skopiuj / wklej zaznaczone teksty między tmux a schowkiem

15

Korzystam z najnowszej wersji tmux (z repozytorium git) i xclip (0.12), i chciałbym móc używać powiązań klawiatury podobnych do Emacsa do poruszania się po tekście copy-mode, kopiowania ( M-w) do schowka i paste ( C-y) z / do bufora kopiowania do schowka.

Do tej pory byłem w stanie wkleić tekst C-yi poruszać się po nim, korzystając copy-modez powiązań klawiatury podobnych do Emacsa, ale nadal nie mogę skopiować tekstu z bufora tmux (np. W copy-mode)

Znalazłem ten wątek do kopiowania całego bufora do schowka (i viceversa), ale wydaje się, że nie działa dla mnie.

Ponadto na tmux-usersliście mailowej powiedziano mi, że najnowsze wersje tmux (tylko w repozytorium git) zawierają polecenie o nazwie copy-pipe. Strona podręcznika mówi o tym poleceniu:

Jedno polecenie akceptuje argument kopiuj potok, który kopiuje zaznaczenie i potokuje go do polecenia. Na przykład, następujące polecenie powiąże „C-q”, aby skopiować zaznaczenie do / tmp, a także do bufora wklejania:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Wygląda na copy-pipeto, że ma być częściowo użyty do potokowania zaznaczenia do innego polecenia. Wydaje się, że w tym opisie i poleceniu są też literówki (co to jest temacs-copy?)

Tak czy inaczej, chciałbym to zrobić:

Biurowy:

  1. Wejdź w tryb kopiowania
  2. Przenieś do tekstu Chcę skopiować za pomocą poleceń nawigacyjnych Emacsa (czyli C-f, C-b, M-f, M-b, C-a, C-eitd., Aby przesunąć kursor). Brak przedrostka dla któregokolwiek z nich.
  3. Skopiuj zaznaczony tekst do schowka za pomocą: M-w( bez prefiksu )

Wklejanie:

  1. Chciałbym móc pisać C-y( bez konieczności wprowadzania copy-mode), aby wkleić tekst w terminalu ( bez prefiksu )

Próbowałem skopiować następujące elementy bez powodzenia:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

Jednak wklejanie działa świetnie:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Dziwne jest to, że wiem, że xclip -i -selection clipboardpowyższa część polecenia kopiowania działa dobrze, ponieważ mogę kopiować rzeczy do schowka w wierszu poleceń, np .:

echo "Hello world. How are you?" | xclip -i -selection clipboard

W związku z tym, jak mogę skopiować zaznaczenie z trybu kopiowania do schowka?

Amelio Vazquez-Reina
źródło

Odpowiedzi:

19

Użyj następującego tmux.confze copy-pipew nowych wersjach tmux (1.8+):

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ w tryb kopiowania
  2. wybierz zawartość za pomocą myszy (przytrzymaj)
  3. M-w aby skopiować tę część do schowka systemowego
  4. C-ywklej go do tmux, C-vaby wkleić go do innej zwykłej aplikacji, takiej jak przeglądarka internetowa.
Josh
źródło
Ta odpowiedź zasługuje na więcej pozytywnych opinii, jest najlepsza dla konfiguracji opartych na Linuksie.
Louis Kottmann
W tmuxie 2.0 to run-shellzamiastrun
roign
@LouisKottmann: dlaczego tylko oparty na systemie Linux?
schaiba
Nie mogę komentować innych systemów, ale uważam, że Mac zwykle używa bpaste zamiast xclip
Louis Kottmann
W tmux 2.8 musiałem je zmienić bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" zgodnie z tym zatwierdzeniem sugerowanym przez starfry
azzamsa
6

Zauważ, że w Tmux 2.4 (od tego zatwierdzenia ) składnia wiązania uległa zmianie. Parafrazuję ten komentarz Github, aby krótko podsumować zmianę:

  1. wymienić -tz-T
  2. wymienić vi-<name>z<name>-mode-vi
  3. przedrostek polecenia za pomocą send-keys -X

Miałem:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

który musiałem zmienić na:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

Z dziennika zmian :

Kluczowe tabele przeszły poważne zmiany. Tabele kluczy trybu nie są już oddzielone od głównych tabel kluczy. Wszystkie tabele kluczy trybu zostały usunięte, wraz z flagą -t do bind-key i unbind-key.

Tabele emacs-edit, vi-edit, emacs-select i vi-choose zostały zastąpione przez stałe powiązania klawiszy w wierszu polecenia i trybach. Pozostają opcje klawiszy trybu i klawiszy statusu.

Tabele emacs-copy i vi-copy zostały zastąpione tabelami trybu kopiowania i trybu kopiowania vi. Polecenia są wysyłane za pomocą flag -X i -N do kluczy send. Więc następujące:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

Staje się:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Zmiany te pozwalają na użycie pełnego parsera poleceń (w tym sekwencji poleceń) i zestawu poleceń - na przykład do wyszukiwania, przeskakiwania itd. Zamiast zwykłego służy teraz zwykły wiersz polecenia z edycją i historią. Domyślne wiązanie Cr to teraz:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

Istnieją również nowe polecenia dostępne w send -X, takie jak kopiowanie potoków i anulowanie.

rozgwiazdy
źródło
2

To -temacs-copynie jest literówka. Wiodący myślnik oznacza, że ​​jest to opcja dla bind-keyspolecenia (wraz z argumentem dla opcji). Jest to równoważne -t emacs-copy, jeśli bardziej ci się to podoba.

Tryb kopiowania używa innego zestawu powiązań i poleceń 1 niż „tryb normalny”. copy-pipePolecenie jest dostępne tylko w trybie „alternate” wiązań tabelach. Kiedy mode-keysjest emacs, tryb kopiowania użyje emacs-copytabeli, więc musisz powiązać Mw copy-pipez tą tabelą.

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

Bądź ostrożny, tworząc zbyt wiele powiązań „bez prefiksu”. Utrudniają wpisywanie tych powiązanych kluczy do programu działającego w tmux (np. Gdy chcesz wpisać Cy do instancji Emacsa działającej w tmux w trybie tty ). Zawsze możesz (przedrostek) powiązać jakiś klucz, który to robi send-keys C-y, ale może to utrudnić pisanie, jeśli będziesz go potrzebować wystarczająco często.


1 Dostępne są tylko polecenia ruchu i edycji. Z wyjątkiem copy-pipetych poleceń nie przyjmują żadnych argumentów (to znaczy, że strona podręcznika oznacza, że ​​„Jedno polecenie akceptuje argument”; „in” jest prawdopodobnie literówką lub błędem edycyjnym).

Chris Johnsen
źródło
2

Podczas gdy inne odpowiedzi mogą pomóc, oto jak robię to samo:

  • Shift + zaznacz tekst kursorem.
  • Ctrl + Shift + C, aby skopiować tekst do schowka.
Rishabh Agrahari
źródło
To uczciwa odpowiedź, ale problemy zaczynają się, gdy masz dwa lub więcej paneli ułożonych poziomo.
cjauvin
Rozumiem, daj mi znać, jeśli znajdziesz coś przydatnego do tego.
Rishabh Agrahari
prefix+ zpowiększa wybrany panel, aby poziome podziały nie stanowiły problemu przy pomijaniu wyboru kopii tmux przez przytrzymanie shift.
joelostblom