Jak korzystać z rejestrów vim?

Znam tylko jedną instancję używającą rejestrów poprzez 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.

 836
Author: vehomzzz, 2009-09-30

16 answers

Rejestry w Vimie pozwalają na uruchamianie akcji lub poleceń na przechowywanym w nich tekście. Aby uzyskać dostęp do rejestru, należy wpisać "a przed poleceniem, gdzie a jest nazwą 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

Możesz następnie przejść przez dokument i wkleić go w inne miejsce za pomocą

"kp

Do wklejenia ze schowka systemowego na Linuksa

" + p

Aby wkleić ze schowka systemowego w systemie Windows (lub ze schowka "podświetlenie myszy" w systemie Linux)

"*p

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

:reg

 1046
Author: FModa3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-25 12:52:03

Byłem zadowolony, gdy odkryłem 0 rejestr. Jeśli nie przypisujesz tekstu do konkretnego rejestru, zostanie on przypisany do rejestru 0, a także zostanie zapisany w domyślnym rejestrze ". Różnica między rejestrami 0 i " polega na tym, że 0 jest wypełniany tylko tekstem, podczas gdy rejestr domyślny jest wypełniany również tekstem usuniętym za pomocą d/D/x/X/c/C/s/S polecenia.

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

  • zaznacz tekst, który chcesz skopiować za pomocą y[motion] - tekst ten jest zapisany w " i 0 rejestrach
  • Usuń tekst, który chcesz zastąpić d[motion] - ten tekst jest zapisany w " register
  • wklej tekst z "0p

Gdzie " jest poleceniem do użycia rejestru dla następnego polecenia.

W finale krok, jeśli miałbyś wkleić z domyślnego rejestru (z p), użyłby on tekstu, który właśnie usunąłeś (prawdopodobnie nie tego, co zamierzałeś).

Zauważ, że p lub P wkleja się z domyślnego rejestru. Odpowiednikiem longhandu jest ""p (lub ""P) i "0 przechowuje ostatni yank, "1 przechowuje Ostatnie usunięcie lub zmianę.

Po Więcej informacji zobacz :help registers.

 709
Author: nelstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-04 11:48:37

Jedną z moich ulubionych części o rejestrach jest używanie ich jako makr!

Załóżmy, że masz do czynienia z plikiem wartości rozdzielanych 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 procentowy na końcu pola % Dev(zaczynając od 2. linii). Wykonamy proste makro w (dowolnie wybranym) rejestrze m w następujący sposób:

  1. Naciśnij: qm: Aby rozpocząć nagrywanie makra pod m register.

  2. EE: Idź do końca 3.kolumna.

  3. a: tryb wstawiania, aby dołączyć do końca tej kolumny.

  4. %: wpisz znak procentowy, który chcemy dodać.

  5. <ESC>: wróć do trybu dowodzenia.

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

  7. q: Stop recording makro

Możemy teraz po prostu wpisać @m, aby uruchomić to makro w bieżącej linii. Ponadto możemy wpisać @@ aby powtórzyć, lub 100@m aby to zrobić 100 razy! Życie wygląda całkiem nieźle.

W tym momencie powinieneś powiedzieć: " ale czekaj, co to ma wspólnego z rejestrami?"

Doskonała Uwaga. Zbadajmy, co znajduje się w treści rejestru m wpisując "mp. Następnie otrzymujemy:

EEa%<ESC>j0

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

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

EEa!<ESC>j0

Wpiszmy to do rejestru n wpisując B"nyE. Następnie, dla Zabawy, uruchomimy makro n na linii naszych danych za pomocą @n....

OMG, DODAŁO A !

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

 303
Author: Francisco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-18 00:10:21

Inne przydatne rejestry:

"* LUB "+ - zawartość schowka systemowego

"/ - last search command

": - ostatni rozkaz.

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

 94
Author: Anthony Roy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-18 13:28:25

Rejestr czarnej dziury _ jest /dev/null rejestrów.

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

noremap x "_x

I do wklejenia w trybie wizualnym bez aktualizacji rejestru domyślnego:

vnoremap p "_dP
 67
Author: mrucci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-10 23:13:50

Jeśli chcesz wkleić zawartość rejestru w poleceniu ex-mode, naciśnij <C-r><registerletter>.

Po co ci to? Chciałem wyszukać i zastąpić długi ciąg znaków, więc wybrałem go w trybie wizualnym, zacząłem wpisywać wyrażenie search / replace :%s/[PASTE YANKED PHRASE]//g i poszedłem na mój dzień.

Jeśli chcesz wkleić tylko jedno słowo w trybie ex, upewnij się, że kursor jest na nim przed wejściem w tryb ex, a następnie naciśnij <C-r><C-w>, gdy w trybie ex, aby wkleić słowo.

 45
Author: agscala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 12:55:34

Myślę, że sekretny rejestr guru to wyrażenie = register. Może być używany do kreatywnych mapowań.

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

Można go używać w połączeniu z systemem jak powyżej lub uzyskać odpowiedzi z niestandardowych funkcji VimL itp.

Lub po prostu doraźne rzeczy jak

<c-r>=35+7<cr>
 41
Author: michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-03 04:51:45

Fajną sztuczką jest użycie "1p do wklejenia ostatniego delete/change (, a następnie użycie . do wielokrotnego wklejania kolejnych usunięć. Innymi słowy, {[2] } jest zasadniczo równoważne "1p"2p"3p"4p.

Możesz użyć tego do odwrócenia kolejności kilku linii: dddddddddd"1p....

 32
Author: naught101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-05 12:25:06
  • q5 zapisuje edycje do rejestru 5 (następne q zatrzymuje nagrywanie)
  • :reg pokazuje wszystkie rejestry i zawartość w nich
  • @ 5 wykonaj rejestr 5 makro (zarejestrowane edycje)
 16
Author: fpmurphy1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-30 13:17:12

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...>
 16
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-10 22:07:18

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

  1. yank text
  2. :!grep "<CTRL-R>0"<CR>
 14
Author: Matt Mendell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 01:09:36

Użyj rejestrów w poleceniach z @. Np.:

echo @a
echo @0
echo @+

Ustaw je w Komendzie:

let @a = 'abc'

Teraz "ap wklei abc.

 9
Author: Ciro Santilli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-11 15:35:19

Dużym źródłem nieporozumień jest rejestr domyślny ". Ważne jest, aby wiedzieć, jak to działa. Znacznie lepiej jest, jeśli rejestr domyślny jest unikany przez większość czasu. Wyjaśnienie z dokumentacji Vim:

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.

Więc domyślny rejestr jest w rzeczywistości wskaźnikiem do ostatnio używanego rejestru. Kiedy usuniesz, albo coś wyciągniesz, ten rejestr będzie wskazywał na inne rejestry. Możesz to sprawdzić, sprawdzając rejestry. Zawsze jest inny rejestr, który jest dokładnie taki sam jak domyślny rejestr: rejestr yank ("0), pierwszy rejestr delete ("1), mały rejestr delete("-) lub jakikolwiek inny rejestr, który został użyty do usunięcia lub yank.

Jedynym wyjątkiem jest rejestr czarnej dziury. Vim doc says:
An exception is the '_' register: "_dd does not store the deleted text in any
register.

Zazwyczaj znacznie lepiej jest używać bezpośrednio: "0, "- i "1-"9 domyślne rejestry lub nazwane rejestry.

 8
Author: Catalin Ciurea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-10 11:27:47

Jednym z przeoczonych rejestrów jest'."rejestr kropek, który zawiera ostatnio wstawiony tekst bez względu na to jak został wstawiony np. ct] (zmień na]). Następnie zdajesz sobie sprawę, że musisz wstawić go gdzie indziej, ale nie możesz użyć metody dot repeat.

 :reg .
 :%s/fred/<C-R>./
 4
Author: zzapper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-18 12:26:18

Mój ulubiony rejestr to ':' rejestr. Uruchomienie @: w trybie normalnym pozwala mi na powtórzenie poprzednio wykonanego polecenia Ex.

 2
Author: siu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 20:17:15

Mój przyjaciel Brian napisał obszerny artykuł na ten temat. Myślę, że jest to świetne wprowadzenie do korzystania z tematów. https://www.brianstorti.com/vim-registers/

 0
Author: Madis Nõmme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 13:52:10