Jak wkleić szarpany tekst do wiersza poleceń Vima

Odpowiedzi:

1157

Tak. Hit Ctrl- Rwtedy ". Jeśli masz dosłownych znaków sterujących, co masz szarpnął, zastosowanie Ctrl- R, Ctrl- O, ".

Oto wyjaśnienie, co można zrobić z rejestrami. To, co możesz zrobić z rejestrami, jest niezwykłe, a kiedy już wiesz, jak z nich korzystać, nie możesz bez nich żyć.

Rejestry to zasadniczo miejsca przechowywania ciągów znaków. Vim ma wiele rejestrów, które działają na różne sposoby:

  • 0(rejestr yszarpnięcia : gdy używasz w trybie normalnym, bez określania rejestru, szarpany tekst trafia tam, a także do rejestru domyślnego),
  • 1do 9(przesunięcie kasowania rejestrów, gdy używasz poleceń takich jak club d, co zostało usunięte, trafia do rejestru 1, co było w rejestrze 1, przechodzi do rejestru 2 itd. ),
  • "(rejestr domyślny, znany również jako rejestr nienazwany. W tym miejscu "pojawia się Ctrl- R, "),
  • ado zużytku własnego (kapitalizowane Ado Zsą do dołączania do odpowiednich rejestrów).
  • _(działa jak /dev/null(Unix) lub NUL(Windows), możesz do niego pisać, ale jest on odrzucany, a kiedy czytasz z niego, zawsze jest pusty),
  • - (mały rejestr usuwający),
  • /(Szukaj Rejestracja wzór, zaktualizowane, jeśli spojrzeć na tekst z /, ?, *lub #, na przykład, można też napisać do niego dynamicznie zmieniać wzorzec wyszukiwania),
  • :(przechowuje ostatnie polecenie VimL wpisane za pomocą Qlub :, tylko do odczytu),
  • +i *(rejestry schowka systemowego, możesz do nich pisać, aby ustawić schowek i odczytać z nich zawartość schowka)

Zobacz :help registerspełne odniesienie.

Możesz w dowolnym momencie użyć :registersdo wyświetlenia zawartości wszystkich rejestrów. Synonimy i skróty dla tego polecenia to :display, :regi :di.

W trybie wstawiania lub wiersza poleceń Ctrl- Rplus nazwa rejestru wstawia zawartość tego rejestru. Jeśli chcesz wstawić je dosłownie (bez automatycznego wcięcia, bez konwersji znaków kontrolnych, takich jak 0x08backspace itp.), Możesz użyć Ctrl- R, Ctrl- O, zarejestrować nazwę. Więcej informacji można znaleźć w :help i_CTRL-Rkolejnych akapitach.

Ale możesz również wykonać następujące czynności (i prawdopodobnie zapomniałem wiele zastosowań rejestrów).

  • W trybie normalnym naciśnij ":p. Ostatnie polecenie użyte w vimie jest wklejone do bufora.
    Dekomponujmy: "to polecenie trybu normalnego, które pozwala wybrać rejestr, który ma być używany podczas następnej operacji szarpania, usuwania lub wklejania. ":Wybiera więc rejestr dwukropka (przechowujący ostatnie polecenie). Wtedy pto komenda już wiesz, że wkleja zawartość rejestru.

    por. :help ",:help quote_:

  • Ty edytujesz plik VimL (na przykład swoimi .vimrc) i chciałby, aby wykonać kilka kolejnych liniach teraz: yj:@"Enter.
    Tutaj yjciągnie bieżącą i następną linię (to dlatego, że j jest ruchem liniowym, ale jest to poza zakresem tej odpowiedzi) do rejestru domyślnego (znanego również jako rejestr nienazwany). Następnie :@polecenie Ex odtwarza polecenia Ex zapisane w rejestrze podanym jako argument i "jest to sposób odwoływania się do rejestru bez nazwy. Zobacz także początek tej odpowiedzi, która jest powiązana.

    Nie należy mylić "użytego tutaj (który jest nazwą rejestru) z "poprzednim przykładem, który był poleceniem w trybie normalnym.

    por. :help :@i:help quote_quote

  • Włóż ostatniego wyszukiwania wzorca do pliku w trybie Insert, lub w linii komend, z Ctrl- R, /.

    por. :help quote_/,help i_CTRL-R

    Następstwem: Trzymaj wzorzec wyszukiwania, ale dodać alternatywę: / Ctrl- R, / \|alternative.

  • W trybie wizualnym wybrałeś dwa słowa na środku linii, pociągnąłeś je y, są w rejestrze bez nazwy. Teraz chcesz, aby otworzyć nową linię tuż poniżej gdzie jesteś, z tymi dwoma słowami: :pu. To jest skrót od :put ". :putPolecenia, podobnie jak wielu poleceń Ex, działa tylko linewise.

    por. :help :put

    Mógłbyś także zrobić: :call setreg('"', @", 'V')wtedy p. setregFunkcja ustawia rejestr, którego nazwa jest podana jako pierwszy argument (jako ciąg), inicjuje go z treścią drugiego argumentu (i można korzystać z rejestrów jako zmienne o nazwie @xgdzie xjest nazwą rejestr w VimL) oraz zamienia go w tryb określony w trzecim argumencie, Vdla linii, nic dla znaków i dosłownie ^Vdla bloku.

    por. :help setreg(). Funkcjami odwrotnymi są getreg()i getregtype().

  • Jeśli nagrałeś makro za pomocą qa... q, to :echo @apowie ci, co wpisałeś, i @aodtworzy makro (prawdopodobnie wiedziałeś, że to jedno, bardzo przydatne w celu uniknięcia powtarzających się zadań)

    por. :help q,help @

    Następstwo z poprzedniego przykładu: Jeśli masz 8gow schowku, @+odtworzy zawartość schowka jako makro, a tym samym przejdzie do 8 bajtu pliku. W rzeczywistości będzie to działać z prawie każdym rejestrem. Jeśli ostatni wstawiony ciąg był ddw trybie wstawiania, wówczas @.(ponieważ .rejestr zawiera ostatni wstawiony ciąg) usunie wiersz. (Dokumentacja Vim jest złego w tym względzie, ponieważ twierdzi, że rejestry #, %, :i .będzie tylko praca z p, P, :puti Ctrl- R).

    por. :help @

    Nie mylić :@(polecenie odtwarzające polecenia Vima z rejestru) i @(polecenie trybu normalnego, które odtwarza polecenia trybu normalnego z rejestru).

    Godnym uwagi wyjątkiem jest @:. Rejestr poleceń nie zawiera początkowego dwukropka ani ostatecznego powrotu karetki. Jednak w trybie normalnym @:zrobi to, czego oczekujesz, interpretując rejestr jako polecenie Ex, nie próbując odtwarzać go w trybie normalnym. Więc jeśli twoje ostatnie polecenie było :e, rejestr zawiera, eale @:przeładuje plik, a nie do końca słowa.

    por. :help @:

  • Pokaż, co będziesz robił w normalnym trybie przed uruchomieniem go: @='dd' Enter. Gdy tylko naciśniesz =klawisz, Vim przechodzi do oceny wyrażenia: gdy wprowadzasz wyrażenie i naciskasz Enter, Vim oblicza je, a wynik działa jak zawartość rejestru. Oczywiście rejestr =jest tylko do odczytu i jednorazowy. Za każdym razem, gdy zaczniesz go używać, będziesz musiał wprowadzić nowe wyrażenie.

    por. :help quote_=

    Następstwo: Jeśli edytujesz polecenie i zdajesz sobie sprawę, że musisz wstawić do linii poleceń jakiś wiersz z bieżącego bufora: nie naciskaj Esc! Użyj Ctrl- R =getline(58) Enter. Następnie wrócisz do edycji wiersza poleceń, ale wstawił on zawartość 58-tej linii.

  • Zdefiniuj ręcznie wzór wyszukiwania: :let @/ = 'foo'

    por. :help :let

    Zauważ, że robiąc to, nie musisz uciekać /we wzór. Oczywiście musisz podwoić wszystkie pojedyncze cytaty.

  • Skopiować wszystkie linie rozpoczynające się foo, a potem wszystkie linie zawierające bardo schowka, łańcuch tych poleceń: qaq(zeruje rejestru przechowywania pusty makro wewnątrz niego) , , .:g/^foo/y A:g/bar/y A:let @+ = @a

    Użycie nazwy rejestru kapitałowego powoduje, że rejestr działa w trybie dołączania

    Lepiej, jeśli Qnie został ponownie odwzorowany mswin.vim, uruchom tryb Ex z Q, połącz te „polecenia dwukropka”, które w rzeczywistości są lepiej nazywane „poleceniami Ex”, i wróć do trybu normalnego, pisząc visual.

    por. :help :g, :help :y,:help Q

  • Dwukrotnie przestrzeń plik: :g/^/put _. Powoduje to umieszczenie zawartości rejestru czarnej dziury (pustego podczas czytania, ale zapisywalnego, zachowującego się jak /dev/null) linii po każdej linii (ponieważ każda linia ma początek!).

  • Dodaj linię zawierającą fooprzed każdym wierszu: :g/^/-put ='foo'. To sprytne użycie rejestru wyrażeń. Tutaj -jest synonimem .-1(por :help :range.). Ponieważ :putumieszcza tekst po wierszu, musisz wyraźnie powiedzieć mu, aby działał na poprzednim.

  • Skopiuj cały bufor do schowka systemowego: :%y+.

    por. :help :range(dla %części) i :help :y.

  • Jeśli źle zapisałeś makro, możesz wpisać :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'i edytować je. Spowoduje to modyfikację zawartości makra przechowywanego w rejestrze a, a tutaj pokazano, jak można to zrobić za pomocą rejestru wyrażeń.

  • Jeśli tak dddd, możesz to zrobić uu, aby cofnąć. Dzięki pmożesz uzyskać ostatnią usuniętą linię. Ale rzeczywiście można również odzyskać maksymalnie 9 usuwaniem z rejestrów @1poprzez @9.

    Nawet lepiej, jeśli tak "1P, to .w trybie normalnym będzie grać "2Pi tak dalej.

    por. :help .i:help quote_number

  • Jeśli chcesz wstawić bieżącą datę w trybie wstawiania: Ctrl- R=strftime('%y%m%d')Enter.

    por. :help strftime()

Jeszcze raz, co może być mylące:

  • :@ to polecenie wiersza polecenia, które interpretuje zawartość rejestru jako vimscript i źródle go
  • @ w trybie normalnym, który interpretuje zawartość rejestru jako naciśnięcia klawiszy w trybie normalnym (z wyjątkiem sytuacji, gdy używasz :rejestru, który zawiera ostatnio odtwarzane polecenie bez początkowego dwukropka: w tym przypadku odtwarza polecenie tak, jakbyś ponownie wpisał dwukropek i ostatni klawisz powrotu).

  • " w trybie normalnym polecenie, które pomaga wybrać rejestr dla szarpnięcia, wklejania, usuwania, poprawiania itp.

  • " jest również prawidłową nazwą rejestru (domyślny lub nienazwany rejestr) i dlatego może być przekazywany jako argument dla poleceń oczekujących nazw rejestrów
Benoit
źródło
205
Czy nie ma znaczka „Stosunek długości 100/1 między odpowiedzią a pytaniem?” :)
Benoit,
8
To świetna odpowiedź, ale około 900 słów to mniej niż 1400. :)
19
Ta odpowiedź zmieniła sposób, w jaki używam vima. Dzięki Benoit
P. Myer Nore
11
Nie zapomnij: reg, który wyświetli wszystkie rejestry wraz z ich zawartością
eugenevd
3
W najnowszych wersjach vima, usunięcia mniejsze niż jedna linia przechodzą do „rejestru małych usunięć” zamiast do rejestrów numerowanych. Odniesienia: Vi i Vim , Vi i Vim , Reddit
Christian Long
48

Do wklejenia czegoś, co jest schowkiem systemowym, którego możesz po prostu użyć SHIFT- INS.

Działa w systemie Windows, ale myślę, że działa również dobrze w systemie Linux.

skeept
źródło
7
Tak, działa również w systemie Linux. Testowane pod GNOME w Vimie i GVimie.
Teoulas
3
To faktycznie przekazuje tablicę do Vima jako wejścia klawiatury, więc jeśli jesteś w trybie normalnym i wklej :!rm -rf /<cr>, wykona to. Zamiast tego używaj rejestrów!
lericson
4
@lericson Czy w mojej odpowiedzi nie powiedziałem, że jest to przydatne w przypadku klawiatury systemowej? Nie rozumiem opinii. A dla ciebie poważnie? Naprawdę masz to w schowku? I nie uważasz, że pisanie shift-insjest łatwiejsze niż ctrl-R+*? Dzieje się tak oczywiście, jeśli jesteś w gvim. Jeśli jesteś w terminalu podłączonym do innej maszyny i chcesz wkleić coś ze schowka, czy znasz coś lepszego niż shift-ins? ponieważ rejestry nie działają w tej sytuacji. Zastanów się, zanim skomentujesz i zrobisz inne rzeczy (np. Głosowanie w dół).
skeept
Myślę, że to dezinformacja i działałem na podstawie tego wyroku.
lericson
1
Nie działa dla mnie. Po prostu dostaję „<S-Insert>” dodany do mojego wiersza poleceń. Być może coś mi brakuje. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman
39

„Chciałbym wkleić szarpany tekst do wiersza poleceń Vima.”

Chociaż najczęściej głosowana odpowiedź jest bardzo kompletna, wolę edytować historię poleceń.

W trybie normalnym, należy wpisać: q:. To da ci listę ostatnich poleceń, które można edytować i przeszukiwać za pomocą normalnych poleceń vima. Zaczniesz od pustego wiersza poleceń na dole.

Dokładnie o co pyta artykuł, wklejanie szarpanej linii (lub szarpanie czegokolwiek) do linii poleceń, przeciągnij tekst, a następnie: q:p( przejdź do trybu edycji historii poleceń, a następnie (p) ut swój szarpany tekst w nowe polecenie linia. Edytuj do woli, enteraby wykonać.

Aby wyjść z trybu historii poleceń, jest odwrotnie. W trybie normalnym w historii poleceń wpisz: :q+enter

Wandspiegel
źródło
1
jeśli już modyfikujesz istniejące polecenie i nie nacisnąłeś „q:” naciśnij ctrl + f, a to zwiększy możliwość edycji historii poleceń.
Clay
14

Aby wkleić coś ze schowka systemowego do wiersza poleceń Vima („tryb poleceń”), użyj Ctrl+, Ra następnie +. Dla mnie przynajmniej na Ubuntu Shift+ Insnie działa.

PS: Nie jestem pewien, dlaczego Ctrl+, Rpo *którym następuje + , co teoretycznie jest takie samo jak Ctrl+, Rpo którym +nie wydaje się zawsze działać. Przeszukałem i odkryłem +wersję i wydaje się, że zawsze działa, przynajmniej na moim pudełku.

Proto
źródło
2
Różnica między Ctrl-r + i Ctrl-r * polega na tym, że ten pierwszy jest zwykłym schowkiem, ale w Linuksie istnieje drugi typ schowka o nazwie „podstawowy”, który reprezentuje ostatnio wybrany tekst (z niego wklej środkowy przycisk myszy) . Nie jest to jednak dostępne w systemach Windows ani MAC
Matias Thayer,
13

Warto również zauważyć, że rejestry Yank są takie same jak bufory makr. Innymi słowy, możesz po prostu napisać całe polecenie w swoim dokumencie (w tym wklejony fragment), a następnie "byprzeciągnąć je do brejestru, a następnie uruchomić @b.

naught101
źródło
1

Miałem podobny problem. Chciałem, aby zaznaczony tekst skończył się w poleceniu, ale nie polegałem na wklejeniu go. Oto polecenie, dla którego próbowałem napisać mapowanie:

:call VimuxRunCommand("python")

Dokumenty tej wtyczki są wyświetlane tylko przy użyciu literałów łańcuchowych. Następujące elementy ulegną awarii, jeśli spróbujesz zaznaczyć tekst zawierający podwójne cudzysłowy:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Aby obejść ten problem, wystarczy odwołać się do zawartości makra, używając @:

vnoremap y:call VimuxRunCommand(@")<cr>

Przechowuje zawartość nienazwanego rejestru i działa z moimi podwójnymi cytatami i wielowierszowymi edgecases.

Conrad.Dean
źródło
Myślę, że twój ostatni przykład nie zawiera znaku „. Być może miałeś na myśli VimuxRunCommand („ @ ”).
kd8azz
To @wysłałoby znak do komendy vimux. pomyśl o @ucieczce od następującego podwójnego cudzysłowu i jest traktowany jako rejestr zamiast zwykłego znaku. vnoremapI zostały zdefiniowane działa w trybie wizualnym, a więc wstawia wybrany tekst, a następnie wkleja się do polecenia vimux, wysyłając je do uruchomionej interpretera w sąsiednim panelu. naprawdę świetny do pracy nad skryptem i testowania jego niewielkich fragmentów za pomocą kilku naciśnięć klawiszy.
Conrad.Dean
1

OS X

Jeśli używasz Vima w Mac OS X, niestety jest on dostarczany ze starszą wersją i nie jest zgodny z opcjami schowka. Na szczęście Homebrew może łatwo rozwiązać ten problem.

Zainstaluj Vima:

brew install vim --with-lua --with-override-system-vi

Zainstaluj wersję GUI Vima:

brew install macvim --with-lua --with-override-system-vi

Uruchom ponownie terminal, aby zadziałał.


Dodaj następujący wiersz do ~/.vimrc
set clipboard=unnamed

Teraz możesz skopiować linię w Vimie yyi wkleić ją w całym systemie.

anonimowy
źródło
1

Dla kontekstu, ta informacja pochodzi z gotowego zestawu, bez wtyczek, bez zachowania .vimrc Vim 7.4 w Linux Mint z domyślnymi opcjami.

Zawsze możesz zaznaczyć tekst za pomocą myszy (lub używając Vlub vi umieszczając zaznaczenie w rejestrze „*) i wkleić go w wierszu polecenia za pomocą Shift+ Ctrl+v .

Wpisanie Ctrl+ rw wierszu polecenia spowoduje wyświetlenie monitu o nazwę rejestru. więc wpisanie :CTRL-r*umieści rejestr zawartości * w wierszu poleceń. Wklei każdy rejestr, nie tylko „*. Zobacz:help c_CTRL-R .

Ponadto środkowy przycisk myszy wklei się do wiersza poleceń.

Widzieć :help->quote-plus opis, w jaki sposób X Window radzi sobie z wyborem. Nawet w zwykłym, gotowym do użycia Vimie (ponownie, w każdym razie w Vimie 7.4 w Linux Mint), każdy wybór dokonany lewym przyciskiem myszy można wkleić w linii poleceń środkowym przyciskiem myszy.

Ponadto środkowy przycisk myszy wklei również tekst zaznaczony w Vimie do wielu innych aplikacji X Window, nawet GUI (na przykład Firefox i Thunderbird ) i wklejenie tekstu do wiersza poleceń jest również możliwe tam, gdzie tekst został wybrany z innych aplikacji .

Zobacz: pomoc-> wybór x11, aby uzyskać dodatkowe informacje.

tl; dr

Spróbuj najpierw: CTRL-r, a następnie użyj Shift+ Ctrl+ vlub środkowego przycisku myszy, jeśli potrzebujesz czegoś innego.

Przyznaje się, że może to być mylące.

wmmso
źródło
0
  1. "[a-z]y: Skopiuj tekst do rejestru [az]

  2. Użyj, :!aby przejść do polecenia edycji

  3. Ctrl+ R: Postępuj zgodnie z tożsamością rejestru, aby wkleić to, co kopiujesz.

Kiedyś w CentOS 7.

Yang
źródło
Co należy rozumieć przez „Kiedyś w CentOS 7.” ?
Peter Mortensen
0

Jeśli masz dwie wartości połączone w dwa różne rejestry (na przykład rejestr ai rejestr b), możesz po prostu ustawić zmienną ci wykonać na niej operację.

Na przykład, :set c = str2float(@a) + str2float(@b)a następnie możesz wkleić zawartość w cdowolnym miejscu.

Na przykład w trybie WSTAW, CTRL + Rwpisz, =aby wejść do rejestru wyrażeń i po prostu wpisz cznak równości i naciśnij ENTER. Zrobione, powinieneś teraz mieć łącznie aib rejestry.

Wszystko to można zapisać w makrze i powtórzyć!

str2floatFunkcja jest używana, jeśli pracujesz z pływaków, jeśli tego nie zrobisz, dostaniesz zamiast liczb całkowitych.

Nie jestem pewien, czy to idiomatyczne, ale zadziałało w moim przypadku, w którym musiałem dodać 2 liczby z rzędu i powtórzyć to dla 500 kolejnych wierszy.

Rafael
źródło