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

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

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

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


person Community    schedule 30.09.2009    source источник
comment
Я дал длинный ответ там на использование регистров   -  person Benoit    schedule 22.10.2011


Ответы (17)


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

"kyy

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

"Kyy

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

"kp

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

"+p

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

"*p

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

:reg
person FModa3    schedule 30.09.2009
comment
И "+ - это специальный регистр, который относится к системному буферу обмена. - person Aaron McDaid; 13.02.2013
comment
В Windows к буферу обмена можно получить доступ с помощью "*; поэтому команда для копирования до конца файла становится "*yG. - person Aditya M P; 14.03.2013
comment
Можете ли вы добавить в числовые регистры? - person ruffin; 05.06.2013
comment
В X (Linux, возможно, также OS-X) * - это буфер обмена выделения мыши, а + - буфер обмена Ctrl-XCV. - person dotancohen; 13.06.2013
comment
Есть ли способ добавить в регистр буфера обмена (поскольку там нет заглавной буквы +)? - person naitsirhc; 13.08.2013
comment
@dotancohen Технически это называется ПЕРВИЧНЫМ выбором, но я думаю, что людям легче выделить выделение мышью :) - person remmy; 26.11.2013
comment
@AaronMcDaid Я не могу использовать + для своего vim, а буфер обмена + включен. Какие-либо предложения? - person hiveer; 11.02.2015
comment
Как вы копируете / перемещаете содержимое из одного регистра в другой? Я не хочу возиться с текстовой областью. - person Loves Probability; 23.04.2017
comment
что такое системный буфер обмена? - person kapil; 16.06.2017
comment
В терминале Vim (то есть в среде без окон) нет буфера обмена или буфера копирования / вставки. Таким образом, регистр + (по сути) всегда будет пустым (в том смысле, что вы не можете копировать в или из другого приложения / окна / редактора). Однако можно помещать материал в буфер +. То же самое с буфером *. Но они менее полезны без оконной среды. - person JDS; 12.10.2017
comment
@naitsirhc: Я не думаю, что есть какой-либо способ сделать это с помощью команды ", но вы можете запустить let @+ .= @", чтобы добавить содержимое безымянного регистра в регистр буфера обмена. Если вы сопоставите это, скажем, с <Leader>+, то вы можете сделать, например, yy<Leader>+, чтобы добавить текущую строку в регистр буфера обмена. - person Soren Bjornstad; 24.11.2018
comment
Как выдернуть текстовый диапазон в файле и вставить его в другой файл (другой bash / терминал)? (1) От строки 10 до строки 20 (2) От текущей строки до конца файла - person Kok How Teh; 17.10.2019
comment
Чтобы прочитать содержимое определенного регистра, попробуйте :reg <register_character>. Итак, для чтения регистра 9 вы должны сделать :reg 9. Вы также можете просмотреть несколько вариантов, например :reg 0,9,=,c и т. Д. - person Ambareesh; 19.04.2020
comment
Другие экземпляры vim не распознают, что что-либо было внесено в реестр. - person Myridium; 30.06.2020
comment
Как пройти из определенного регистра в режиме вставки? Обычно вы можете выполнить вставку из регистра восстановления по умолчанию в режиме вставки с помощью ctrl-r ". - person MattCochrane; 02.07.2020

Я был доволен, когда обнаружил регистр 0. Если вы восстанавливаете текст, не назначая его конкретному регистру, он будет назначен регистру 0, а также будет сохранен в регистре " по умолчанию. Разница между регистрами 0 и " заключается в том, что 0 заполняется только восстановленным текстом, тогда как регистр по умолчанию также заполняется текстом, удаленным с помощью команд _7 _ / _ 8 _ / _ 9 _ / _ 10 _ / _ 11 _ / _ 12 _ / _ 13 _ / _ 14_.

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

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

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

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

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

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

person Community    schedule 01.10.2009
comment
Как вы вставляете из реестра по умолчанию? - person vehomzzz; 01.10.2009
comment
p или P вставляет из регистра по умолчанию. Полный эквивалент будет ""p (или ""P). - person nelstrom; 02.10.2009
comment
Между прочим, точно так же, как 0 содержит последнее восстановление, 1 - последнее удаление или изменение. - person FireAphis; 02.06.2011
comment
Регистры " и 0 отличаются от "0? Можете ли вы вставить с помощью 0p, "0p и "p? - person user202448; 11.08.2011
comment
" - это команда для использования регистра для следующей команды. Таким образом, ""p будет использовать регистр " для команды вставки, а "0p будет использовать регистр 0. - person Ramon Marco L. Navarro; 18.08.2011
comment
0p будет означать переход к первому символу текущей строки и вставку из содержимого регистра по умолчанию ("). "p будет неполной командой, так как вам нужно указать, для какой команды использовать регистр p. - person Ramon Marco L. Navarro; 18.08.2011
comment
Таким же образом 1 содержит последнее удаление, 2 - второе последнее удаление, 3 - третье последнее и т. Д. До 9 - person James; 06.12.2011
comment
В последних версиях vim удаления размером меньше одной строки попадают в регистр небольших удалений, а не в пронумерованные регистры. Ссылки: Vi и Vim, Vi и Vim, Reddit - person Christian Long; 28.01.2016

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

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

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 в строке наших данных, используя _23 _....

Он добавил !.

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

person Community    schedule 10.08.2011
comment
Это ключевой момент. До сих пор я не замечал, что регистры такие же, как макробуферы. Это означает, что вы можете просто хранить все свои макросы в тексте, извлекать их и запускать. Довольно круто и немного странно. Очень Вим. - person naught101; 11.04.2012
comment
Вы можете использовать + вместо j0, чтобы перейти к первому непустому символу в следующей строке. - person Gokul; 02.05.2020
comment
Это великолепно. @ naught101, поначалу это кажется странным, но он позволяет вам записывать макрос и редактировать его без необходимости делать это правильно, пока Vim записывает. Это как написание кода перед его запуском, его отладка и повторный запуск, пока он не станет правильным. - person mindthief; 16.07.2020

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

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

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

": - последняя команда командной строки.

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

person Community    schedule 30.09.2009
comment
Vim по умолчанию в OSX не включает * интеграцию. Вы можете установить версию из homebrew-alt, которая делает это. Проверить с vim --version - -clipboard означает, что у вас его нет, +clipboard означает, что есть. - person Xavier Shay; 11.08.2011
comment
В X11 "* и "+ еще круче: "+ вставляет последний текст, скопированный с помощью ctrl+c (буфер копирования) или любого другого ярлыка, который вы используете (или right-click>copy). "* вставляет последний текст, выделенный мышью (буфер выделения). Итак, если вы скопируете что-то с помощью ctrl+c, а затем выделите что-то еще с помощью мыши, вы можете выбрать, что вставить. Это не работает в Windows, где эти два регистра являются синонимами. - person naught101; 11.04.2012
comment
Благослови вас, я много лет искал "* и "+! Я думал, что только gvim имеет доступ к системным буферам обмена, но, видимо, обычный vim тоже имеет доступ! - person Tarrasch; 29.08.2012
comment
@Tarrasch Если вы используете консоль vim вместо gvim, вы откроете для себя гораздо больше. Думаю. посетите также #vim на freenode! - person trusktr; 06.10.2013
comment
Как включить если у кого -xterm_clipboard на vim --version. Любой простой пакет для установки? (дебиан / apt-get). Спасибо. - person DrBeco; 25.08.2014
comment
@DrBeco: есть ли у Debian пакет vim-full или, возможно, даже gvim-full? Попробуйте установить вариант gvim, если он существует. Также должна быть консольная версия. - person mike3996; 21.10.2014

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

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

noremap x "_x

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

vnoremap p "_dP
person Community    schedule 10.08.2011
comment
Второе отображение тоже очень полезно. См. Объяснение здесь: marcorucci.com/blog/#visualModePaste - person mrucci; 05.09.2011
comment
отображение для x становится менее удобным для транспонирования символов. - person skeept; 05.10.2011
comment
Нажатие x не стирает последнее, что вы выдернули, которое вы найдете в регистре 0. Нажмите x несколько раз, затем 0p, чтобы вставить то, что вы выдернули. - person trusktr; 06.10.2013
comment
Чтобы расширить замечание skeept выше: с этим x сопоставлением вы больше не можете выполнять команду xp для переключения текущего на следующий символ. Очень полезно для исправления опечаток. У нас также есть Xp для переключения тока на предыдущий символ. - person Daniel Andersson; 16.08.2014

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

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

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

person Community    schedule 10.08.2011
comment
Вставка текста в командную строку : - лучшее, что я узнал сегодня - person Shahbaz; 07.06.2012
comment
Вы также можете использовать ‹C-R› ‹registerletter› в режиме вставки - person Floegipoky; 17.08.2016
comment
Мне нравится писать регулярные выражения для поиска / замены сначала просто /[write out your regex]<cr>, а затем заменять только s/<C-R>//replacement/. Таким образом, вы получите обратную связь с вашим регулярным выражением в реальном времени перед запуском замены. - person GabeIsman; 29.03.2017

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

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

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

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

<c-r>=35+7<cr>
person Community    schedule 01.10.2009
comment
Посмотрите [видео Дерека Вятта об использовании регистра выражений] (derekwyatt.org/vim/vim-tutorial-videos/) - person Jeromy Anglim; 31.01.2011
comment
Ссылка от @JeromyAnglim теперь здесь: derekwyatt.org/vim/tutorials/advanced/ # выражение-регистр - person Djizeus; 03.07.2016

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

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

person Community    schedule 11.04.2012
comment
ага, это фантастика. Чего я действительно хочу, так это того же поведения для янки. - person RyanM; 10.11.2018

Со страницы справки 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...>
person Community    schedule 10.08.2011

  • q5 записывает изменения в регистр 5 (следующий q останавливает запись)
  • : reg показать все регистры и любое их содержимое
  • @ 5 выполнить макрос регистра 5 (записанные правки)
person fpmurphy    schedule 30.09.2009
comment
Мне не нравится клавиша @ для запуска макросов (три нажатия клавиши). Итак, я назначил F2 для запуска макроса, хранящегося в регистре q: nmap <F2> @q Я использую регистр q, потому что затем, чтобы сохранить макрос для F2 для воспроизведения, я просто нажимаю qq. быстрое сохранение и воспроизведение макросов. - person Andrej Panjkov; 11.08.2011

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

  1. выдернуть текст
  2. :!grep "<CTRL-R>0"<CR>
person Community    schedule 11.08.2011

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

echo @a
echo @0
echo @+

Задайте их в команде:

let @a = 'abc'

Теперь "ap вставит abc.

person Community    schedule 11.06.2014

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

 :reg .
 :%s/fred/<C-R>./
person Community    schedule 18.11.2015
comment
Приятно, я думаю, что естественно думать о редактировании на основе команд иначе, чем о фактически набранном тексте, поэтому использование регистра "., чтобы избежать затирающих вставок, кажется полезным. - person mindthief; 16.07.2020

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

person Community    schedule 29.08.2014

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

Единственное исключение - регистр черной дыры. Vim doc говорит:

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

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

person Community    schedule 04.01.2013

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

person Community    schedule 07.08.2018

Моя любимая функция - это возможность добавлять в регистры заглавными буквами. Например, предположим, что вы хотите переместить подмножество импорта из буфера 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>
person Community    schedule 14.10.2020