Jak korzystać z rejestrów vim?

925

Wiem tylko o jednym wystąpieniu, w którym za pomocą rejestrów CtrlR*wklejam tekst ze schowka.

Jakie są inne zastosowania rejestrów? Jak z nich korzystać?

Wszystko, co wiesz o rejestrach VI (skupmy się na vi 7.2) - podziel się z nami.

pojazd
źródło
22
Dałem długą odpowiedź nie na wykorzystaniu rejestrów
Benoit

Odpowiedzi:

1185

Rejestry w Vimie pozwalają uruchamiać akcje lub polecenia na zapisanym w nich tekście. Aby uzyskać dostęp do rejestru, należy wpisać "aprzed poleceniem, gdzie ajest nazwa rejestru. Jeśli chcesz skopiować bieżącą linię do rejestru k, możesz wpisać

"kyy

Lub możesz dołączyć do rejestru, używając dużej litery

"Kyy

Następnie możesz poruszać się po dokumencie i wklejać go w innym miejscu za pomocą

"kp

Aby wkleić ze schowka systemowego w systemie Linux

"+p

Aby wkleić ze schowka systemowego w systemie Windows (lub ze schowka „podświetlenia myszy” w systemie Linux)

"*p

Aby uzyskać dostęp do wszystkich aktualnie zdefiniowanych rejestrów, wpisz

:reg
FModa3
źródło
165
I "+jest specjalny rejestr, który odnosi się do schowka systemowego.
Aaron McDaid,
17
W Windows dostęp do schowka można uzyskać za pomocą "*; więc polecenie kopiowania do końca pliku staje się "*yG.
Aditya MP
44
W X (Linux, być może także OS-X) *jest schowek „podświetlenia myszy” i +jest to schowek Ctrl-XCV.
dotancohen
20
Czy istnieje sposób na dołączenie do rejestru schowka (ponieważ nie ma kapitału +)?
naitsirhc,
8
@dotancohen Technicznie nazywa się to WYBIERANIEM PIERWOTNYM, ale myślę, że „podświetlanie myszy” jest łatwiejsze dla ludzi :)
kyrias
783

Byłem zadowolony, kiedy odkryłem 0rejestr. Jeśli szarpniesz tekst bez przypisywania go do określonego rejestru, zostanie on przypisany do 0rejestru, a także zapisany w "rejestrze domyślnym . Różnica między rejestrami 0i "polega na tym, że 0wypełniony jest tylko tekstem zszarpanym, podczas gdy rejestr domyślny jest również wypełniany tekstem usuwanym za pomocą poleceń d/ D/ x/ X/ c/ C/ s/ S.

Uważam to za przydatne, gdy chcę skopiować jakiś tekst, coś usunąć i zastąpić skopiowanym tekstem. Poniższe kroki ilustrują przykład:

  • Wybierz tekst, który chcesz skopiować y[motion]- ten tekst zostanie zapisany "i 0zarejestrowany
  • Usuń tekst, który chcesz zastąpić d[motion]- ten tekst zostanie zapisany w "rejestrze
  • Wklej szarpany tekst za pomocą "0p

gdzie " jest polecenie użycia rejestru dla następnego polecenia.

W ostatnim kroku, jeśli chcesz wkleić z rejestru domyślnego (za pomocą p ), użyje on właśnie usuniętego tekstu (prawdopodobnie nie tego, co zamierzałeś).

Zauważ, że plub Pwkleja się z rejestru domyślnego. Ekwiwalent długiej ręki byłby ""p(lub ""P) i "0utrzymuje ostatnią szarpnięcie,"1 przechowuje ostatnie usunięcie lub zmianę.

Aby uzyskać więcej informacji, zobacz :help registers.

nelstrom
źródło
17
plub Pwkleja z rejestru domyślnego. Odpowiednikiem długodystansowym byłoby ""p(lub ""P).
nelstrom
186
Nawiasem mówiąc, w ten sam sposób, w jaki „0 trzyma ostatnie szarpnięcie”, 1 ma ostatnie usunięcie lub zmianę.
FireAphis
6
"to polecenie użycia rejestru dla następnego polecenia. Więc ""pużyłby "rejestru dla polecenia wklejania i "0pużyłby 0rejestru.
Ramon Marco L. Navarro,
5
0poznaczałoby przejście do pierwszego znaku bieżącego wiersza i wklejenie z zawartości rejestru domyślnego ( "). "pbyłoby niepełnym poleceniem, ponieważ musisz podać polecenie, dla którego chcesz użyć rejestru p.
Ramon Marco L. Navarro,
15
W ten sam sposób „1 przechowuje ostatnie usunięcie”, 2 przechowuje drugie ostatnie usunięcie, „3 przechowuje trzecie ostatnie itd. Do„ 9
James
330

Jedną z moich ulubionych części na temat rejestrów jest używanie ich jako makr!

Załóżmy, że masz do czynienia z plikiem wartości rozdzielanym tabulatorami jako takim:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Teraz decydujesz, że musisz dodać znak procentu na końcu pola% Dev (zaczynając od 2. linii). Zrobimy proste makro w (arbitralnie wybranym) mrejestrze w następujący sposób:

  1. Naciśnij:: qmAby rozpocząć rejestrowanie makra pod mrejestrem.

  2. EE: Przejdź na koniec trzeciej kolumny.

  3. a: Tryb wstawiania, aby dołączyć na końcu tej kolumny.

  4. %: Wpisz znak procentu, który chcemy dodać.

  5. <ESC>: Wróć do trybu poleceń.

  6. j0: Przejdź do początku następnej linii.

  7. q: Zatrzymaj rejestrowanie makra

Teraz możemy po prostu wpisać, @maby uruchomić to makro w bieżącym wierszu. Co więcej, możemy @@napisać, aby powtórzyć lub 100@mzrobić to 100 razy! Życie wygląda całkiem nieźle.

W tym miejscu powinieneś powiedzieć: „ ALE CZEKAJ, CO, DO TYCH CHCESZ, MUSI ZROBIĆ Z REJESTRAMI ?”

Doskonały punkt Sprawdźmy, co jest w mrejestrze, pisząc "mp. Następnie otrzymujemy:

EEa%<ESC>j0

Na początku wygląda na to, że przypadkowo otworzyłeś plik binarny w notatniku, ale na drugi rzut oka jest to dokładna sekwencja znaków w naszym makrze!

Jesteś ciekawską osobą, więc zróbmy coś ciekawego i edytuj ten wiersz tekstu, aby wstawić !zamiast nudnego starego %.

EEa!<ESC>j0

Następnie wpiszmy to do nrejestru, pisząc B"nyE. Następnie, tylko dla kopnięć, uruchommy nmakro w wierszu naszych danych, używając @n....

OMG, DODANO A !

Zasadniczo uruchamianie makra jest jak naciśnięcie dokładnej sekwencji klawiszy w rejestrze tego makra. Jeśli to nie jest fajna sztuczka z rejestracją, zjem kapelusz.

Francisco
źródło
65
To jest całkowicie kluczowe. Do tej pory nie zauważyłem, że rejestry są takie same jak bufory makr. Oznacza to, że możesz po prostu przechowywać wszystkie swoje makra w tekście, szarpać je i uruchamiać. Całkiem fajnie i trochę dziwnie. Very Vim.
naught101
1
To drobna notatka redakcyjna, ale ten piorunujący pogrubienie ... Można to naprawić. W tej chwili jest to dość nieznośne.
ashrasmun
1
Można użyć +zamiast j0iść do pierwszej nieprzestrzegania znaku pustego w następnym wierszu.
Gokul
100

Inne przydatne rejestry:

"*lub "+- zawartość schowka systemowego

"/ - ostatnie polecenie wyszukiwania

": - ostatnie polecenie.

Uwaga w przypadku makr vima można je edytować, ponieważ są one tylko listą naciśnięć klawiszy używanych podczas rejestrowania makra. Możesz więc zapisać do pliku tekstowego makro (używając "apmakra a ), edytować je i załadować do rejestru za pomocą "ay$. Fajny sposób przechowywania przydatnych makr.

Anthony Roy
źródło
6
Domyślny vim w OSX nie obejmuje integracji „*. Możesz zainstalować wersję z homebrew-alt, która to robi. Sprawdź za pomocą vim --version- -clipboardoznacza, że ​​go nie masz, +clipboardoznacza , że masz.
Xavier Shay
15
X11, "*a "+są jeszcze chłodniej: "+wkleja ostatni tekst skopiowany z ctrl+c(bufor kopiowania), czy co tam skrót używają (lub right-click>copy). "*wkleja ostatni zaznaczony tekst myszą (bufor wyboru). Jeśli więc skopiujesz coś za ctrl+cpomocą myszy, a następnie podświetlisz coś innego za pomocą myszy, możesz wybrać, który chcesz wkleić. Nie działa to w systemie Windows, w którym te dwa rejestry są synonimami.
naught101
1
Na zdrowie, szukałem "*i "+od lat! Myślałem, że tylko gvim ma dostęp do schowków systemowych, ale najwyraźniej również zwykły vim!
Tarrasch
@Tarrasch Jeśli użyjesz vim konsoli zamiast gvim, odkryjesz wiele innych rzeczy. Myślę. odwiedź #vim też na freenode!
trusktr
1
Jak włączyć, jeśli jest -xterm_clipboardwłączony vim --version. Jakikolwiek prosty pakiet do zainstalowania? (debian / apt-get). Dzięki.
Dr Beco
77

Czarną dziurę rejestr _ jest /dev/nullrejestrów.

Używam go w moim vimrc, aby umożliwić usuwanie pojedynczych znaków bez aktualizacji rejestru domyślnego:

noremap x "_x

i wkleić w trybie wizualnym bez aktualizacji rejestru domyślnego:

vnoremap p "_dP
mrucci
źródło
Drugie mapowanie jest również bardzo przydatne. Zobacz wyjaśnienie tutaj: marcorucci.com/blog/#visualModePaste
mrucci
21
mapowanie dla xstaje się mniej wygodne do transponowania znaków.
skeept
Naciśnięcie x nie usuwa ostatniej szarpanej rzeczy, którą znajdziesz w rejestrze 0. Naciśnij xa kilka razy, a następnie „0p, aby wkleić
szarpane
2
Aby rozwinąć uwagę powyższego skeepta: dzięki temu xmapowaniu nie można już wykonać xp„polecenia”, aby przełączyć prąd na następny znak. Całkiem przydatne w przypadku poprawek literówek. Musimy także Xpzmienić prąd na poprzedni znak.
Daniel Andersson,
56

Jeśli kiedykolwiek chcesz wkleić zawartość rejestru do polecenia trybu ex, naciśnij <C-r><registerletter>.

Dlaczego miałbyś to wykorzystać? Chciałem przeprowadzić wyszukiwanie i zastąpić długi ciąg, więc wybrałem go w trybie wizualnym, zacząłem wpisywać wyrażenie wyszukiwania / zamiany :%s/[PASTE YANKED PHRASE]//gi zacząłem dzień.

Jeśli chcesz wkleić tylko jedno słowo w trybie ex, możesz upewnić się, że znajduje się na nim kursor przed przejściem do trybu ex, a następnie naciśnij <C-r><C-w>w trybie ex, aby wkleić słowo.

agscala
źródło
6
Wklejanie tekstu w :wierszu poleceń to najlepsza rzecz, jakiej się dzisiaj nauczyłem
Shahbaz,
1
Możesz także użyć <CR> <rejestratora> w trybie wstawiania
Floegipoky
1
Lubię pisać znajdź / zamień wyrażenia regularne na just, /[write out your regex]<cr>a potem na just s/<C-R>//replacement/. W ten sposób zyskujesz informację zwrotną na temat wyrażenia regularnego przed uruchomieniem zamiany.
GabeIsman
44

Myślę, że sekretnym rejestrem guru jest wyrażenie = rejestr. Można go wykorzystać do kreatywnych mapowań.

:inoremap  \d The current date <c-r>=system("date")<cr>

Możesz używać go w połączeniu z systemem jak wyżej lub otrzymywać odpowiedzi z niestandardowych funkcji VimL itp.

lub po prostu takie rzeczy ad hoc

<c-r>=35+7<cr>
Michał
źródło
3
Sprawdź [wideo Dereka Wyatta na temat korzystania z rejestru wyrażeń] ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim
1
Link z @JeromyAnglim jest teraz tutaj: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus
39

Fajną sztuczką jest "1pwklejenie ostatniego skasowania / zmiany (a następnie .kilkakrotne wklejenie kolejnych skasowań. Innymi słowy, "1p...jest to w zasadzie odpowiednik"1p"2p"3p"4p .

Możesz użyć tego do odwrotnego zamówienia kilku linii: dddddddddd"1p....

naught101
źródło
aha to jest fantastyczne. To, czego naprawdę chcę, to takie samo zachowanie dla
yanków
18

Ze strony pomocy vima:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>
Brian
źródło
17
  • q5 zapisuje zmiany w rejestrze 5 (następne q zatrzymuje nagrywanie)
  • : reg pokazuje wszystkie rejestry i zawartą w nich zawartość
  • @ 5 wykonaj rejestr 5 makro (nagrane zmiany)
fpmurphy
źródło
15
Nie lubię klawisza @ do uruchamiania makr (trzy naciśnięcia klawiszy). Więc zmapowałem F2, aby uruchomić makro zapisane w rejestrze q: nmap <F2> @q używam rejestru q, ponieważ wtedy, aby zapisać makro do F2 do odtwarzania, po prostu nacisnąłem qq. szybkie zapisywanie i odtwarzanie makr.
Andrej Panjkov,
16

Używam domyślnego rejestru do grepowania tekstu w oknie vima bez konieczności sięgania po mysz.

  1. szarpnięcie tekstu
  2. :!grep "<CTRL-R>0"<CR>
Matt Mendell
źródło
12

Używaj rejestrów w poleceniach z @. Na przykład:

echo @a
echo @0
echo @+

Ustaw je w poleceniu:

let @a = 'abc'

Teraz "apwklei się abc.

Ciro Santilli
źródło
8

Dużym źródłem nieporozumień jest rejestr domyślny ". Ważne jest, aby wiedzieć, jak to działa. O wiele lepiej jest unikać rejestru domyślnego przez większość czasu. Wyjaśnienie z dokumentacji Vima:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Rejestr domyślny jest tak naprawdę wskaźnikiem do ostatnio używanego rejestru. Kiedy usuniesz lub szarpniesz coś, ten rejestr będzie wskazywał na inne rejestry. Możesz to sprawdzić, sprawdzając rejestry. Zawsze istnieje inny rejestr, który jest dokładnie taki sam jak rejestr domyślny: rejestr szarpnięcia ( "0), pierwszy rejestr kasowania ( "1), mały rejestr kasowania ("- ) lub inny rejestr, który został użyty do usunięcia lub szarpnięcia.

Jedynym wyjątkiem jest rejestr czarnej dziury. Vim doc mówi:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Zazwyczaj są znacznie lepiej przy użyciu bezpośrednio: "0, "-a "1-"9rejestry domyślne lub nazwane rejestry.

Catalin Ciurea
źródło
8

Jednym z pomijanych rejestrów jest „.” rejestr kropkowy, który zawiera ostatni wstawiony tekst bez względu na to, jak został wstawiony, np. ct] (zmień do]). Wtedy zdajesz sobie sprawę, że musisz wstawić go w inne miejsce, ale nie możesz użyć metody powtarzania kropek.

 :reg .
 :%s/fred/<C-R>./
zzapper
źródło
7

Mój ulubiony rejestr to ':' rejestr. Praca @:w trybie normalnym pozwala mi powtórzyć poprzednio uruchomioną komendę ex.

siu
źródło