Как использовать регистры vim?

Я знаю только один экземпляр, использующий регистры, через CtrlR* при этом я вставляю текст из буфера обмена.

каковы другие виды использования регистров? Как ими пользоваться?

все, что вы знаете о регистрах VI (давайте сосредоточимся на vi 7.2) -- поделитесь с нами.

16 ответов


регистры в Vim позволяют запускать действия или команды по тексту, хранящемуся в них. Чтобы получить доступ к регистру, введите "a перед командой, где a - имя регистра. Если вы хотите скопировать текущую строку в реестр k, вы можете типа

" kyy

или добавить в регистр с помощью буквы

" Kyy

затем вы можете перемещаться по документу и вставьте его в другое место, используя

"КП

вставить из системного буфера обмена в Linux

" +p

вставить из системного буфера обмена в Windows (или из буфера обмена" выделение мыши " в Linux)

" *p

для доступа ко всем в настоящее время определенным типам регистров

:reg


я был доволен, когда обнаружил 0 зарегистрироваться. Если вы дергаете текст, не назначая его определенному регистру, он будет назначен 0 регистрация, а также сохранение по умолчанию " зарегистрироваться. Разница между 0 и " регистров заключается в том, что 0 заполняется только выдернутым текстом, тогда как регистр по умолчанию также заполняется текстом, удаленным с помощью d/D/x/X/c/C/s/S команды.

я нахожу это полезным, когда я хочу Скопировать текст, удалить что-то и заменить его на скопированный текст. Следующие шаги иллюстрируют пример:

  • вставить текст, который вы хотите скопировать с y[motion] - этот текст сохраняется в " и 0 регистры
  • удалить текст, который вы хотите заменить на d[motion] - этот текст сохраняется в " зарегистрироваться
  • вставьте выдернутый текст с "0p

здесь " - это команда для использования регистра для следующей команды.

на последнем шаге, если вы должны были вставить в регистр по умолчанию (с p), он будет использовать текст, который вы только что удалили (наверное, не то, что вы задумали).

обратите внимание, что p или P паст из регистра по умолчанию. Длинноручный эквивалент будет ""p (или ""P) и "0 держит последний рывок,"1держит в прошлом удалить или изменить.

подробнее::help registers.


одна из моих любимых частей о регистрах, используя их в качестве макросов!

предположим, вы имеете дело с файлом значений с разделителями табуляции как таковым:

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

теперь вы решили, что вам нужно добавить знак процента в конце поля %Dev (начиная со 2-й строки). Мы сделаем простой макрос в (произвольно выбранном)m зарегистрировать следующим образом:

  1. нажмите: qm: чтобы начать запись макроса под m реестр.

  2. EE: перейти к концу 3-й колонки.

  3. a: режим вставки для добавления в конец этого столбца.

  4. %: введите знак процента, который мы хотим добавить.

  5. <ESC>: вернуться в командный режим.

  6. j0: переход к началу следующей строки.

  7. q: остановить запись макро!--25-->

теперь мы можем просто наберите @m для запуска этого макроса в текущей строке. Кроме того, мы можем ввести @@ повторить, или 100@m сделать это 100 раз! Жизнь выглядит довольно хорошо.

в этот момент Вы должны сказать:"НО ПОДОЖДИТЕ, КАКОЕ ЭТО ИМЕЕТ ОТНОШЕНИЕ К РЕГИСТРАМ?"

отличный момент. Давайте исследуем, что находится в содержимом m Регистрация путем ввода "mp. Затем мы получаем следующий:

EEa%<ESC>j0

сначала это выглядит так, как будто вы случайно открыли двоичный файл в блокноте, но на второй взгляд,это точная последовательность символов, в нашем макро!

вы любопытный человек, поэтому давайте сделаем что-то интересное и отредактируем эту строку текста, чтобы вставить ! вместо скучного старого %.

EEa!<ESC>j0

тогда давайте дергать это в n Регистрация путем ввода B"nyE. Тогда, просто для удовольствия, давай запустите n макрос в строке наших данных с помощью @n....

OMG, ОН ДОБАВИЛ !

по сути, запуск макроса нажать последовательность клавиш в макросе прописать. Если это не классный трюк с регистрацией, я съем свою шляпу.


другие полезные регистров:

"* или "+ - содержимое системного буфера обмена

"/ - последняя команда поиска

": - последняя команда.

Примечание с макросами vim вы можете редактировать их, так как они представляют собой всего лишь список нажатий клавиш, используемых при записи макроса. Таким образом, вы можете записать в текстовый файл макрос (используя "ap написать макрос a) и редактировать их и загружать их в реестр с "ay$. Хороший способ хранения полезных макросов.


на Регистрация черной дыры _ - это /dev/null регистров.

Я использую его в своем vimrc, чтобы разрешить удаление отдельных символов без обновления регистра по умолчанию:

noremap x "_x

и вставить в визуальном режиме без обновления регистра по умолчанию:

vnoremap p "_dP

Если вы когда-нибудь захотите вставить содержимое регистра в команду ex-mode, нажмите <C-r><registerletter>.

почему вы используете это? Я хотел выполнить поиск и заменить длинную строку, поэтому я выбрал ее в визуальном режиме, начал печатать выражение поиска/замены :%s/[PASTE YANKED PHRASE]//g и пошел на мой день.

Если вы хотите вставить только одно слово в режиме ex, убедитесь, что курсор находится на нем перед входом в режим ex, а затем нажмите <C-r><C-w> когда в ex режиме вставить слово.


Я думаю, что секретный регистр гуру-это выражение = регистр. Его можно использовать для творческих сопоставлений.

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

Вы можете использовать его в сочетании с вашей системой, как указано выше, или получать ответы от пользовательских функций VimL и т. д.

или просто специальные вещи, такие как

<c-r>=35+7<cr>

классный трюк-использовать "1p чтобы вставить последнее удаление / изменение (, а затем использовать . чтобы повторно вставить последующие удаления. Другими словами,"1p... в основном эквивалентно "1p"2p"3p"4p.

вы можете использовать это для обратного порядка нескольких строк: dddddddddd"1p....


  • записи q5 редактируются в регистр 5 (следующий q останавливает запись)
  • : reg показать все регистры и любое содержимое в них
  • @5 выполнить макрос регистра 5 (записанные изменения)

со страницы справки vim:

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

Я использую регистр по умолчанию для grep для текста в моем окне vim без необходимости тянуться к мыши.

  1. Янк текст
  2. :!grep "<CTRL-R>0"<CR>

использовать регистры в командах С @. Например:

echo @a
echo @0
echo @+

набор в команду:

let @a = 'abc'

теперь "ap будет вставить abc.


большим источником путаницы является регистр по умолчанию ". Важно знать, как это работает. Гораздо лучше, если регистр по умолчанию избегается большую часть времени. Объяснение из документации 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.

таким образом, регистр по умолчанию фактически является указателем на последний используемый регистр. Когда вы удаляете или дергаете что-то, этот регистр будет указывать на другие регистры. Вы можете проверить это, проверив регистры. Всегда есть другой регистр, который точно такой же, как регистр по умолчанию: регистр Янка ("0), первый регистр удаления ("1), малый регистр удаления ("-) или любой другой регистр, который использовался для удаления или выдергивания.

единственным исключением является регистр черных дыр. ВИМ док говорит:--10-->

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

обычно вы гораздо лучше использовать напрямую: "0, "- и "1-"9 регистры по умолчанию или именованные регистры.


один пропущенный регистр-это '."точечный регистр, который содержит последний вставленный текст независимо от того, как он был вставлен, например, ct] (изменить до ]). Затем вы понимаете, что вам нужно вставить его в другое место, но не можете использовать метод повтора точек.

 :reg .
 :%s/fred/<C-R>./

мой любимый регистр-это ':' зарегистрироваться. Бег!--1--> в обычном режиме позволяет мне повторить ранее выполненную команду ex.


мой друг Брайан написал исчерпывающую статью об этом. Я думаю, что это отличное введение в использование темы. https://www.brianstorti.com/vim-registers/