VIM заменить слово с содержимым буфера вставки?


мне нужно сделать кучу замен слов в файле и хочу сделать это с помощью команды vi, а не команды EX, такой как :%s///g. Я знаю, что это типичный способ заменить слово в текущей позиции курсора:cw<text><esc> но есть ли способ сделать это с содержимым безымянного регистра в качестве заменяющего текста и без перезаписи регистра?

9 108

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 чтобы дернуть Слово и вставить ранее дернутое слово.

вы можете использовать регистры для этого:

текст замены первого места в регистре <mark some text>"ay

здесь a зарегистрировать имя

затем вы можете использовать этот регистр в Замена

ve"ap

или Shift+v -p (выделите всю строку и вставьте на ее место)