Skopiuj tekst z jednego panelu tmux do drugiego (używając vima)

133

Mam dwa pliki otwarte w vimie, każdy w jednym okienku tmux. Chciałbym skopiować powiedzmy 10 linii z jednego pliku do drugiego.

Jak mogę to zrobić, nie używając myszy Copy-> Paste?

Patryk
źródło
2
Możesz zaangażować tmux , ale są na ogół prostsze sposoby. Czy oba wystąpienia Vima są na tej samej (lokalnej?) Maszynie? Zwykle używałbym do tego pliku tymczasowego (tj. Wizualnie wybrałem linie :w /tmp/lines, a następnie :r /tmp/linesw innym przypadku). Lub, jeśli twój Vim umie rozmawiać ze schowkiem systemowym, możesz użyć rejestrów +lub, *aby uniknąć pliku tymczasowego.
Chris Johnsen,

Odpowiedzi:

193

Będziesz musiał użyć skrótów Tmux. Zakładając, że skrót polecenia tmux jest domyślny: Ctrl+ b, a następnie:

  1. Ctrl+ b, [Wejdź w tryb kopiowania (?).

  2. Przejdź do początku / końca tekstu, aby go podświetlić.

  3. Ctrlspace

    Rozpocznij zaznaczanie tekstu (w Arch Linux). Kiedy skompilowałem tmux ze źródła na OSX i innych Linuksach, po prostu Spacesam działa. Wybrany tekst zmienia kolory, więc będziesz wiedział, czy polecenie zadziałało.

  4. Przejdź na przeciwny koniec tekstu, aby skopiować.

  5. Alt+ wKopiuje zaznaczony tekst do schowka tmux. (Na Macu użyj Esc+ w.)

  6. Przesuń kursor do przeciwnego panelu tmux lub zupełnie innego okna tmux. Ustaw kursor w miejscu, w którym chcesz wkleić właśnie skopiowany tekst.

  7. Ctrl+ b, ]Wklej skopiowany tekst ze schowka tmux.

tmux jest całkiem dobry w mapowaniu poleceń na niestandardowe skróty klawiaturowe.

Zobacz Ctrl+ b, ?aby zobaczyć pełną listę ustawionych skrótów klawiaturowych.

Alex Leach
źródło
4
Dzięki. Po prostu sidenode: Alt + w nie działał na Macu. Alt został domyślnie zamapowany na Esc. Dlatego jest to Esc + w.
Karan
11
jeśli używasz screenskrótów: Ctrl + A [(wejdź w tryb kopiowania), Space(rozpocznij podświetlanie), Enter(zakończ podświetlanie), Ctrl + A ](wklej).
jfs
11
Warto zauważyć, że „enter” działa dla mnie, podczas gdy alt + w nie.
Elijah Lynn
3
Jak zauważono w awhan.wordpress.com/2010/06/20/copy-paste-in-tmux , jeśli masz powiązania klawiszy vi, krok 5 należy zastąpić Enterkluczem.
Ying Xiong,
2
co jeśli muszę skopiować i wkleić do edytora tekstu? Z jakiegoś powodu wydaje się, że nie wybiera tego zaznaczonego tekstu nawet po naciśnięciu „enter” po zaznaczeniu tekstu.
uday,
33

Niestety nie mogę jeszcze dodać komentarza do odpowiedzi Alexa Leacha, dlatego dołączę tutaj załącznik dla użytkowników systemu Mac OS X:

  1. Enter Kopiuje zaznaczony tekst
Mieczysław Daniel Dyba
źródło
1
dzięki! Jestem na Ubuntu Xenial, używam byobu/ tmuxze wszystkimi ustawieniami domyślnymi, to działało, Alt + W nie działało.
Andrea Zonca
1
To nie działa w systemie OS X Yosemite z tmux 2.0, ani nie działa alt + w, ani esc + w :(
weberc2
Działa również dla mnie w systemie Windows przy użyciu terminala Zoc.
jdhao
15

Jeśli używasz vim i tmux na macOS (Testowane na macOS 10.12.2, tmux 2.3):

(Załóżmy, że kombinacja klucza prefiksu tmux to prefix. Prefiks ma wartość domyślną ctrl+ b).

  • Kopiuj:
    1. Naciśnij prefix+, [aby przejść do trybu kopiowania.
    2. Użyj klawiszy strzałek, aby przejść do początku / końca zaznaczania tekstu.
    3. Naciśnij ctrl+ space(Jeśli ustawiłeś ctrl+ spacejako przedrostek, naciśnij ctrl+ space+ spacezamiast)
    4. Użyj klawiszy strzałek, aby przejść na drugą stronę zaznaczenia.
    5. Naciśnij ctrl+ w.
  • Pasta:
    1. Naciśnij prefix+ ]w trybie wstawiania.
Hamid Rohani
źródło
8

Łączę się z moim serwerem CentOS na komputerze z systemem Windows za pomocą klienta ssh terminala ZOC. Oto, co działa dla mnie:

  • Wejdź w tryb kopiowania: <prefix>+[
  • Rozpocznij kopiowanie: <Space>
  • Skopiuj tekst: <Enter>
  • Wklej tekst: <prefix>+]
jdhao
źródło
2

Możesz użyć systemowej tablicy ze znakami „* y” i „* p” zamiast zwykłych y i p.

Johan
źródło
1
Aby skorzystać ze schowka systemowego, musisz użyć "+2yy- skopiuj dwie linie do schowka X11 "+dd- wytnij linię do schowka X11 "+p- wklej schowek X11
Patryk
Czy muszę coś pisać przed użyciem tych poleceń?
Thomas Ahle,
@ThomasAhle, no .. jej dosłownie podwójne cudzysłowy ( "), a następnie plus (+), a następnie 2ys (Y). Upewnij się, że jesteś w trybie normalnym. Jeśli jesteś w trybie normalnym, należy być w stanie wykorzystać h,j,k,ldo przenieś. Czasami widziałem też na mojej maszynie wirtualnej Ubuntu, rejestr „+” znika z niewiadomego powodu. Aby sprawdzić, czy masz +rejestr, możesz wpisać :regi sprawdzić, czy "+w pierwszej kolumnie jest ciąg znaków
alpha_989
Tak, to jest to, to jest odpowiedź. Znacznie prostsze niż inne sugerowane (przy użyciu kopiowania / wklejania tmux) i nie powoduje to bałaganu w numerach linii. Czy spowodowałoby to jakiekolwiek problemy, jeśli zmieniłeś mapowanie standardowe yi pna "+yi "+p?
ryan
1

Jeśli masz vimotwarte, lepiej użyć wklej kopiowania vim, aby skopiować tekst.

Wklej kopiowanie Tmux będzie działać, jednak istnieje kilka wad.

Po pierwsze, podczas kopiowania wielu wierszy tekstu będziesz musiał wybrać wiele wierszy. Pasta kopiująca Tmux zwykle nie rozumie, że vimma numery wierszy lub są znaki w rynnie vima (takie jak liczby względne / liczby bezwzględne). W rezultacie również je skopiuje.

Po drugie, odkryłem, że jeśli tekst ma określone formatowanie specyficzne dla języka, a ty bezpośrednio próbujesz skopiować wklej za pomocą tmux do vima, to popsuje formatowanie. Można tego uniknąć, używając set paste!. Wymaga to jednak dużo więcej pracy.

Służy "+ydo kopiowania i "+pwklejania

Vimnatywnie zapewnia metodę kopiowania wklejania między buforem vim a schowkiem systemowym za pomocą jednego "+ylub dwóch "*y. Następnie wklejanie za pomocą "+plub "*p. Pozwoli to uniknąć kopiowania względnych liczb w rynnie lub innych losowych znakach, które nie są istotne dla vim

alpha_989
źródło
0

Kilka opcji użycia vima, ponieważ sekwencja skrótów tmux jest nieco długa i trudno mi ją zapamiętać

Podobnie jak powyżej wspomnianej odpowiedzi można używać "+yi "*yskopiować, a następnie "+pi "*podpowiednio do wklejenia. Jeśli chcesz, aby vim domyślnie używał schowka, możesz go użyć y/pbezpośrednio wtedy.

set clipboard=unamed "sets the default copy register to be *
set clipboard=unamedplus "sets the default copy register to be +

źródło polecenia schowka: https://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim

Avi Areman
źródło