VIM заменить слово с содержимым буфера вставки?
мне нужно сделать кучу замен слов в файле и хочу сделать это с помощью команды vi, а не команды EX, такой как :%s///g
. Я знаю, что это типичный способ заменить слово в текущей позиции курсора:cw<text><esc>
но есть ли способ сделать это с содержимым безымянного регистра в качестве заменяющего текста и без перезаписи регистра?
9 ответов:
я думаю, что под "вставить" вы имеете в виду безымянный (yank/put/change/delete/substitute) регистр, верно? (Поскольку это тот, который будет перезаписан командой change.)
регистры обычно задаются путем ввода
"
затем имя (один символ) регистра, например"ay
затем"ap
дергать в реестрa
, затем поместите содержимое регистраa
. То же самое касается команды изменения. В этом случае, если вы не хотите, чтобы текст был удален с помощью изменить команду, чтобы пойти куда угодно, вы можете использовать регистр черной дыры"_
:"_cw
. Затем, как только в режиме вставки, вы можете нажать ctrl-R, а затем регистр, который вы хотите (вероятно,"
), чтобы поместить содержимое этого регистра.
"*
- регистр выбора (вставка средней кнопки)"+
- регистр буфера обмена (вероятно, также доступен с помощью ctrl-shift-v через терминал)""
- Vim по умолчанию (без имени) Янк/поставить/изменить/удалить/заменить зарегистрироваться.короткий ответ:
"_cw^R"
Edit: как предлагают другие, вы можете, конечно, использовать другой регистр для Янка (или что-то еще), который получил ваш текст в регистр по умолчанию. Однако вы не всегда думаете об этом в первую очередь, поэтому приятно сделать одну команду изменения, не сдувая ее. Хотя он не совсем сдулся. Есть нумерованные регистры
"0
через"9
:Vim заполняет эти регистры текстом из команд yank и delete.
нумерованный регистр 0 содержит текст из последней команды yank, если команда не указала другой регистр с помощью ["x].
нумерованный Регистр 1 содержит текст, удаленный самой последней командой delete или change, если команда не указала другой регистр или текст меньше одной строки (тогда используется малый регистр delete). Исключение сделано для удалить оператор с помощью следующих команд перемещения:
%
,(
,)
,`
,/
,?
,n
,N
,{
и}
. Регистр " 1 всегда используется тогда (это совместимо с Vi). "- Регистр также используется, если удаление находится в пределах строки.при каждом последующем удалении или изменении Vim перемещает предыдущее содержимое регистра 1 в регистр 2, 2 в 3 и т. д., теряя предыдущее содержание регистра 9.
используя информацию в этом посте, я сформировал это полезное отображение. Я выбрал 'cp', потому что это означает "изменить пасту"
nmap <silent> cp "_cw<C-R>"<Esc>
EDIT:
также я сделал этот шаг дальше и поддержал любое движение.
чтобы получить эквивалент команды выше будет
cpw
"смена вставить слово""This allows for change paste motion cp{motion} nmap <silent> cp :set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c" silent exe "normal! p" endfunction
для этого можно использовать визуальный режим vim. например, скопируйте слово:
ye
а затем перезаписать другой с скопированным словом:vep
если ваш курсор находится на слове, которое вы хотите заменить содержимым безымянного регистра, вы можете использовать
viwp
.v
переключение в визуальный режим,iw
выбирает внутреннее слово, аp
помещает содержимое регистра на свои места.на практике, когда мне нужно заменить одно слово (имя функции и т. д.) с другой, я перейду к тому, чтобы использовать в качестве замены,
yiw
чтобы дернуть внутреннее слово в безымянный регистр, затем перейдите к слову, которое я заменяю, иviwp
заменить его. Довольно быстрый способ замены одного слова на другое. Если вы искали (/
) для Слова, которое вы заменяете, чтобы добраться до него, вы можете просто нажатьn
чтобы добраться до следующего появления нужно заменить. Очевидно, нет замены для использования:%s/find/replace/g
, но на пару быстрых замен, это может быть удобно, особенно если у вас уже есть новое слово в регистр.
если вы используете именованный регистр (т. е. используйте
"ay
или"ad
и т. д., чтобы заполнить свой регистр вставки), вы можете сделать что-то вроде
cw<CTRL-R>a<esc>
который заменит слово с содержанием регистра
a
. Насколько я могу судить, Вы не можете использовать регистр по умолчанию, потому что когда выcw
он будет заполнен словом, которое было вырезано этой командой.
вы имеете в виду системный буфер вставки или регистр vi?
если вы хотите использовать системный буфер вставки, то вы в порядке и могли бы сделать
dw"+P
-"
выбирает регистр, и"+
- это системный буфер вставки.в противном случае скопируйте в регистр не по умолчанию с помощью say
"ay
скопировать в реестрa
а потом на замену что-то сделатьdw"aP
можно использовать
yw
, чтобы вставить слово, то вы можете изменить слово с рывком словоvipw
чтобы дернуть Слово и вставить ранее дернутое слово.