it-swarm.com.ru

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

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

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

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

878
vehomzzz

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

"куу

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

"куу

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

"кп

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

"+ Р

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

"*п

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

: р

1107
FModa3

Мне было приятно, когда я обнаружил регистр 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 .

740
nelstrom

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

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

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: остановить запись макроса

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

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

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

EEa%<ESC>j0

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

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

EEa!<ESC>j0

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

Боже мой, он добавил !

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

314
Francisco

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

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

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

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

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

96
Anthony Roy

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

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

noremap x "_x

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

vnoremap p "_dP
72
mrucci

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

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

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

51
agscala

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

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

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

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

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

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

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

36
naught101

Со страницы помощи 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...>
18
Brian
  • q5 записывает изменения в регистр 5 (следующий q останавливает запись)
  • : reg показать все регистры и любое содержимое в них
  • @ 5 выполнить регистр 5 макрос (записанные правки)
16
fpmurphy

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

  1. дергать текст
  2. :!grep "<CTRL-R>0"<CR>
14
Matt Mendell

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

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), регистр малого удаления ("-) или любой другой регистр, который использовался для удаления или восстановления.

Единственным исключением является регистр черной дыры. Вим док говорит:

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

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

8
Catalin Ciurea

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

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

Мой любимый регистр - регистр ':'. Запуск @: в обычном режиме позволяет мне повторить ранее выполненную команду ex.

4
siu

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

1
Madis Nõmme