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?

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.

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.


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).


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.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.