Ответ 1
Да. Нажмите Ctrl - R, затем ". Если у вас есть буквальные управляющие символы в том, что вы дернули, используйте Ctrl - R, Ctrl - O, ".
Вот объяснение того, что вы можете делать с регистрами. То, что вы можете делать с регистрами, необычно, и как только вы знаете, как их использовать, вы не можете жить без них.
Регистры - это в основном места хранения строк. У Vim есть много регистров, которые работают по-разному:
-
0
(регистр yank: когда вы используетеy
в нормальном режиме, без указания регистра, туда держится трясущийся текст, а также регистр по умолчанию), -
1
to9
(сдвигая регистры удаления, когда вы используете команды, такие какc
илиd
, то, что было удалено, переходит в регистр 1, то, что было в регистре 1, переходит в регистр 2 и т.д.), -
"
(регистр по умолчанию, также известный как ненаписанный регистр. Здесь " входит Ctrl - R, "), -
a
доz
для вашего собственного использования (с заглавной буквыa
доz
для добавления в соответствующие регистры). -
_
(действует как/dev/null
(Unix) илиNUL
(Windows), вы можете писать ему, но он отбрасывается, а когда вы читаете его, он всегда пуст), -
-
(небольшой регистр удаления), -
/
(регистр шаблона поиска, обновляется, если вы ищете текст с/
,?
,*
или#
например, вы также можете записать для него динамическое изменение шаблона поиска) -
:
(сохраняет последнюю введенную команду VimL черезQ
или:
, только для чтения), -
+
и*
(регистры системного буфера обмена, вы можете написать им, чтобы установить буфер обмена и прочитать содержимое буфера обмена из них)
См. :help registers
для полной справки.
В любой момент вы можете использовать :registers
для отображения содержимого всех регистров. Синонимы и сокращения для этой команды: :display
, :reg
и :di
.
В режиме "Вставка" или "Командная строка" Ctrl - R плюс имя регистра вставляет содержимое этого регистра. Если вы хотите вставить их буквально (без автоматического отступа, без преобразования управляющих символов, таких как 0x08
в backspace и т.д.), Вы можете использовать Ctrl - R, Ctrl - O, имя регистра.
См. :help i_CTRL-R
и последующие параграфы для дополнительной справки.
Но вы также можете сделать следующее (и я, вероятно, забыл много применений для регистров).
-
В нормальном режиме нажмите " : p. Последняя команда, которую вы использовали в vim, вставлена в ваш буфер.
Пусть разлагается:"
- это команда Normal mode, которая позволяет вам выбрать, какой регистр будет использоваться во время следующего yank, удалить или вставить операцию. Поэтому " : выбирает регистр двоеточия (сохраняя последнюю команду). Тогда p - это команда, которую вы уже знаете, она вставляет содержимое регистра.ср.
:help "
,:help quote_:
-
Вы редактируете файл VimL (например, ваш
.vimrc
) и хотели бы выполнить пару последовательных строк прямо сейчас: y j : @ " Enter.
Здесь y j yanks current и next line (это потому, что j является движением линии, но это выходит за рамки этого ответа) в регистр по умолчанию (также известный как неназванный регистр). Затем команда:@
Ex воспроизводит команды Ex, хранящиеся в регистре, заданном как аргумент, а"
- это то, как вы ссылаетесь на неназванный регистр. Также см. Верхнюю часть этого ответа, которая связана.Не путайте
"
здесь (это имя регистра) с"
из предыдущего примера, который был командой Нормального режима.ср.
:help :@
и:help quote_quote
-
Вставьте последний шаблон поиска в свой файл в режиме Вставки или в командной строке с помощью Ctrl - R, /.
ср.
:help quote_/
,help i_CTRL-R
Следствие. Сохраните шаблон поиска, но добавьте альтернативу:
/
Ctrl - R, /\|alternative
. -
Вы выбрали два слова в середине строки в визуальном режиме, дернули их с помощью
y
, они находятся в неназванном регистре. Теперь вы хотите открыть новую строку чуть ниже, где находитесь, с этими двумя словами::pu
. Это сокращение для:put "
. Команда:put
, как и многие команды Ex, работает только linewise.ср.
:help :put
Вы также могли бы сделать:
:call setreg('"', @", 'V')
, затемp
. Функцияsetreg
задает регистр, имя которого задано как первый аргумент (как строка), инициализирует его содержимым второго аргумента (и вы можете использовать регистры в качестве переменных с именем@x
, гдеx
это имя регистра в VimL) и превращает его в режим, указанный в третьем аргументе,V
для linewise, ничего для символьного и литерального^V
для blockwise.ср.
:help setreg()
. Обратные функции:getreg()
иgetregtype()
. -
Если вы записали макрос с
qa
...Q
, тогда:echo @a
сообщит вам, что вы набрали, а@a
воспроизведет макрос (возможно, вы знали, что он, очень полезно во избежание повторяющихся задач)ср.
:help q
,help @
Следствие из предыдущего примера: если в буфере обмена есть
8go
, то@+
будет воспроизводить содержимое буфера обмена в виде макроса и, следовательно, перейти к восьмому байту вашего файла. На самом деле это будет работать почти с каждым регистром. Если ваша последняя вставленная строка былаdd
в режиме Вставки, тогда@.
будет (потому что в регистре.
содержится последняя вставленная строка) удалите строку. (Документация Vim ошибочна в этом отношении, поскольку она заявляет, что регистры#
,%
,:
и.
будут работать только сp
,p
,:put
и Ctrl - R).ср.
:help @
Не путайте
:@
(команда, которая воспроизводит команды Vim из регистра) и@
(команда нормального режима, которая воспроизводит команды нормального режима из регистра).Известное исключение -
@:
. Регистр команд не содержит начальную двоеточие и не содержит окончательный возврат каретки. Однако в нормальном режиме@:
будет делать то, что вы ожидаете, интерпретируя регистр как команду Ex, не пытаясь воспроизвести его в обычном режиме. Поэтому, если ваша последняя команда была:e
, регистр содержитe
, но@:
перезагрузит файл, а не перейдет к концу слова.ср.
:help @:
-
Покажите, что вы будете делать в обычном режиме перед запуском:
@='dd'
Enter. Как только вы нажмете клавишу=
, Vim переключится на оценку выражения: когда вы введете выражение и нажмите Enter, Vim его вычислит, а результат будет действовать как содержимое регистра. Конечно, регистр=
доступен только для чтения и одноразовый. Каждый раз, когда вы начинаете использовать его, вам нужно будет ввести новое выражение.ср.
:help quote_=
Следствие. Если вы редактируете команду и понимаете, что вам нужно будет вставить в свою командную строку некоторую строку из текущего буфера: не нажимайте Esc! Используйте Ctrl - R
=getline(58)
Enter. После этого вы вернетесь к редактированию командной строки, но он вставил содержимое 58-й строки. -
Определите шаблон поиска вручную:
:let @/ = 'foo'
ср.
:help :let
Обратите внимание, что при этом вам не нужно выходить из
/
в шаблоне. Однако вам, разумеется, нужно удвоить все одинарные кавычки. -
Скопируйте все строки, начинающиеся с
foo
, а затем все строки, содержащиеbar
в буфер обмена, соедините эти команды:qaq
(сбрасывает регистр, в котором хранится пустой макрос),:g/^foo/y A
,:g/bar/y A
,:let @+ = @a
.Использование имени регистра капитала делает работу регистра в режиме добавления
Лучше, если
Q
не был переназначенmswin.vim
, запустите режим Ex с помощьюQ
, соедините эти "команды двоеточия", которые на самом деле лучше называются "Ex-командами", и вернитесь в обычный режим, набравvisual
.ср.
:help :g
,:help :y
,:help q
-
Двойное пространство вашего файла:
:g/^/put _
. Это помещает содержимое регистра черной дыры (пустое при чтении, но записываемое, действующее как/dev/null
) linewise, после каждой строки (потому что каждая строка имеет начало!). -
Добавьте строку, содержащую
foo
перед каждой строкой::g/^/-put ='foo'
. Это умное использование регистра экспрессии. Здесь-
является синонимом.-1
(см.:help :range
). Поскольку:put
помещает текст после строки, вы должны явно указать ему, чтобы он воздействовал на предыдущий. -
Скопируйте весь буфер в системный буфер обмена:
:%y+
.ср.
:help :range
(для части%
) и:help :y
. -
Если вы неверно зарегистрировали макрос, вы можете ввести
:let @a='
Ctrl - R=replace(@a,"'","''",'g')
Enter'
и отредактировать его. Это изменит содержимое макроса, сохраненного в регистреa
, и здесь показано, как вы можете использовать регистр выражений для этого. -
Если вы сделали
dddd
, вы можете сделатьuu
, чтобы отменить. С помощьюp
вы можете получить последнюю удаленную строку. Но на самом деле вы также можете восстановить до 9 удалений с помощью регистров@1
через@9
.Еще лучше, если вы выполняете
"1P
, тогда.
в нормальном режиме будет воспроизводиться"2P
и т.д.ср.
:help .
и:help quote_number
-
Если вы хотите вставить текущую дату в режим вставки: Ctrl - R
=strftime('%y%m%d')
Enter.ср.
:help strftime()
Еще раз, что может сбивать с толку:
-
:@
- команда командной строки, которая интерпретирует содержимое регистра как vimscript и передает его -
@
в команде обычного режима, которая интерпретирует содержимое регистра как нажатия клавиш в нормальном режиме (кроме случаев, когда вы используете регистр:
, который содержит последнюю проигранную команду без начального двоеточия: в этом случае он повторяет команда, как если бы вы снова набрали двоеточие и окончательный ключ возврата). -
"
в команде обычного режима, которая поможет вам выбрать регистр для yank, paste, delete, correct и т.д. -
"
также является допустимым именем регистра (по умолчанию или без имени) и поэтому может быть передан в качестве аргументов для команд, которые ожидают имена регистров