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

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

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

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

16 ответов

Решение

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

"куу

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

"куу

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

"кп

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

"+ Р

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

"*п

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

: р

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

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

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

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

EEa%<ESC>j0

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

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

EEa!<ESC>j0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

echo @a
echo @0
echo @+

Установите их в команде:

let @a = 'abc'

Сейчас "ap будет вставлять abc,

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

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

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

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

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

Моя любимая функция - это возможность добавлять в регистры заглавными буквами. Например, предположим, что вы хотите переместить подмножество импорта из буфера X в буфер Y.

  1. Перейти к строке x1 в буфере X.
  2. Тип "ayy заменить регистр a с содержанием строки x1.
  3. Перейти к строке x5.
  4. Тип "Ayy (заглавная A), чтобы добавить строку x5 в конце реестра a.
  5. Перейдите в буфер Y и введите "ap вставить
<content of line x1>
<content of line x5>
Другие вопросы по тегам