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

926

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

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

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

vehomzzz
источник
22
Я дал длинный ответ там об использовании регистров
Бенуа

Ответы:

1187

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

"kyy

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

"Kyy

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

"kp

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

"+p

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

"*p

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

:reg
FModa3
источник
165
И "+это специальный регистр, который ссылается на системный буфер обмена.
Аарон МакДейд
17
В Windows к буферу обмена можно получить доступ "*; поэтому команда копировать до конца файла становится "*yG.
депутат Адитья,
44
В X (Linux, возможно, также OS-X) *это буфер обмена «выделение мыши» и буфер обмена +Ctrl-XCV.
dotancohen
20
Есть ли способ добавить в реестр буфера обмена (так как нет заглавной буквы +)?
naitsirhc
8
@dotancohen Технически это называется ПЕРВИЧНЫМ отбором, но я думаю, что "выделение мышью" людям легче получить :)
kyrias
784

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

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

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

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

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

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

Для получения дополнительной информации см :help registers.

nelstrom
источник
17
pили Pвставляет из регистра по умолчанию. Длинный эквивалент будет ""p(или ""P).
nelstrom
186
Кстати, так же, как «0 держит последний рывок», 1 - последнее удаление или изменение.
FireAphis
6
"это команда для использования регистра для следующей команды. Так ""pчто использовал бы "регистр для команды вставки и "0pиспользовал бы 0регистр.
Рамон Марко Л. Наварро
5
0pбудет означать переход к первому символу текущей строки и вставку из содержимого регистра по умолчанию ( "). "pбудет неполной командой, так как вам нужно указать, для какой команды использовать регистр p.
Рамон Марко Л. Наварро
15
Точно так же, как «1 удерживает последнее удаление», 2 удерживает второе последнее удаление, «3 удерживает третье последнее удаление и т. Д. До» 9
Джеймс
331

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

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

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этот макрос для текущей строки. Кроме того, мы можем напечатать @@повторить или 100@mсделать это 100 раз! Жизнь выглядит довольно хорошо.

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

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

EEa%<ESC>j0

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

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

EEa!<ESC>j0

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

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

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

Francisco
источник
65
Это абсолютно ключ. До сих пор я не заметил, что регистры такие же, как макробуферы. Это означает, что вы можете просто сохранить все свои макросы в тексте, восстановить их и запустить. Довольно круто и немного странно. Очень Вим.
naught101
1
Это небольшая редакционная заметка, но жирный шрифт ... Это можно было исправить. Это довольно неприятно в данный момент.
ашрасмун
1
Вы можете использовать +вместо, j0чтобы перейти к первому непустому символу на следующей строке.
Гокул
100

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

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

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

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

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

Энтони Рой
источник
6
Vim по умолчанию в OSX не включает "* интеграцию. Вы можете установить версию из homebrew-alt, которая имеет. Проверьте с помощью vim --version- -clipboardозначает, что у вас ее нет, +clipboardзначит, у вас есть.
Ксавьер Шэй,
15
В X11 "*и "+даже круче: "+вставляется последний скопированный текст ctrl+c(буфер копирования) или какой бы то ни было ярлык, который вы используете (или right-click>copy). "*вставляет последний текст, выделенный мышью (буфер выбора). Поэтому, если вы копируете что- ctrl+cто с помощью мыши, а затем выделяете что-то еще с помощью мыши, вы можете выбрать, какой из них вставить. Это не работает в Windows, где эти два регистра являются синонимами.
naught101
1
Благослови вас, я искал "*и в "+течение многих лет! Я думал, что только gvim имеет доступ к системным буферам обмена, но, очевидно, обычный vim тоже имеет доступ!
Tarrasch
@Tarrasch Если вы используете консоль vim вместо gvim, вы обнаружите много других вещей. Я думаю. посетите #vim на freenode тоже!
trusktr
1
Как включить если есть -xterm_clipboardна vim --version. Какой-нибудь простой пакет для установки? (Debian / кв-получить). Спасибо.
Доктор Беко
77

Черная дыра регистр _ является /dev/nullрегистры.

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

noremap x "_x

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

vnoremap p "_dP
mrucci
источник
Второе отображение также очень полезно. Смотрите объяснение здесь: marcorucci.com/blog/#visualModePaste
mrucci
21
отображение для xстановится менее удобным для транспонирования символов.
Скипет
Нажатие x не стирает последнее, что вы дернули, что вы найдете в регистре 0. Нажмите xa несколько раз, затем «0p, чтобы вставить материал, который вы
дернули
2
Чтобы расширить замечание Skeept выше: с этим xотображением вы больше не можете выполнять xp«команду» для переключения тока со следующим символом. Очень полезно для исправления опечаток. Мы также должны Xpпереключать ток с предыдущего символа.
Даниэль Андерссон
56

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

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

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

agscala
источник
6
Вставка текста в :командной строке - лучшее, что я узнал сегодня
Шахбаз
1
Вы также можете использовать <CR> <registerletter> в режиме вставки
Floegipoky
1
Мне нравится писать регулярные выражения поиска / замены сначала просто, /[write out your regex]<cr>а затем заменить просто s/<C-R>//replacement/. Таким образом, вы сможете получить обратную связь в реальном времени о своем регулярном выражении перед выполнением замены.
GabeIsman
44

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

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

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

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

<c-r>=35+7<cr>
майкл
источник
3
Посмотрите видео Дерека Уайетта об использовании регистра выражений ( derekwyatt.org/vim/vim-tutorial-videos/… )
Джером Энглим,
1
Ссылка от @JeromyAnglim теперь здесь: derekwyatt.org/vim/tutorials/advanced/#expression-register
Джизей
39

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

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

оборота ноль101
источник
ага это фантастика. Что я действительно хочу, это то же самое поведение для янки
RyanM
18

Со страницы помощи 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...>
Брайан
источник
17
  • q5 записывает изменения в регистр 5 (следующий q останавливает запись)
  • : reg показать все регистры и любое содержимое в них
  • @ 5 выполнить регистр 5 макрос (записанные правки)
fpmurphy
источник
15
Мне не нравится клавиша @ для запуска макросов (три нажатия). Поэтому я сопоставил F2 для запуска макроса, хранящегося в регистре q: nmap <F2> @q я использую регистр q, потому что затем, чтобы сохранить макрос для F2 для воспроизведения, я просто нажму qq. быстрое сохранение макросов и воспроизведение.
Андрей Паньков
16

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

  1. дергать текст
  2. :!grep "<CTRL-R>0"<CR>
Мэтт Менделл
источник
12

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

echo @a
echo @0
echo @+

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

let @a = 'abc'

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

Сиро Сантилли
источник
8

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

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

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

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

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

Catalin Ciurea
источник
8

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

 :reg .
 :%s/fred/<C-R>./
оборота zzapper
источник
7

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

Сиу
источник