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

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

Ответ 1

Я думаю, что "paste" означает "unnamed" (yank/put/change/delete/substitute), верно? (С тех пор тот, который будет перезаписан командой изменения.)

Регистры обычно задаются, введя ", затем имя (единственный символ) регистра, например "ay, затем "ap, чтобы вынуть в регистр a, затем поместите содержимое регистра a. То же самое касается команды изменения. В этом случае, если вы не хотите, чтобы текст, который вы удаляли, с командой изменения, чтобы идти в любом месте, вы можете использовать регистр черных дыр "_: "_cw. Затем один раз в режиме вставки вы можете нажать ctrl-R, а затем регистр, который вы хотите (возможно, "), чтобы вставить содержимое этого регистра.

  • "* - регистр выбора (средняя кнопка)
  • "+ - регистр буфера обмена (возможно, также доступный с помощью ctrl-shift-v через терминал)
  • "" - vim default (unnamed) yank/put/change/delete/substitute register.

Короткий ответ: "_cw^R"

Изменить: как утверждают другие, вы можете, конечно, использовать другой регистр для yank (или любого другого), который получил ваш текст в регистр по умолчанию. Вы не всегда думаете об этом сначала, так что приятно делать одну команду изменения, не сдувая ее. Хотя это не полностью сдулось. Имеются нумерованные регистры "0 через "9:

Vim заполняет эти регистры текстом из команд yank и delete.

Нумерованный регистр 0 содержит текст из последней команды yank, если только команда не указала другой регистр с [ "x].

Нумерованный регистр 1 содержит текст, удаленный последней командой удаления или изменения, если только команда не указала другой регистр или текст меньше одной строки (тогда используется небольшой регистр удаления). Исключение делается для оператора удаления с этими командами перемещения: %, (, ), `, /, ?, n, n, { и }. Регистр" 1 всегда используется (это совместимо с Vi). "Регистр" также используется, если удаление находится внутри строки.

С каждым последующим удалением или изменением Vim сдвигает предыдущее содержимое регистра 1 в регистр 2, 2 на 3 и т.д., теряя предыдущий содержимое регистра 9.

Ответ 2

Используя информацию в этом сообщении, я создал это полезное сопоставление. Я выбрал "cp", потому что он означает "change paste"

nmap <silent> cp "_cw<C-R>"<Esc>

EDIT:

Также я сделал еще один шаг и поддержал любое движение.

Чтобы получить эквивалент команды выше, будет cpw для "изменить слово вставки"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>[email protected]
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

Ответ 3

Для этого вы можете использовать визуальный режим vim. например скопируйте слово: ye, а затем перезапишите другое с помощью скопированного слова: vep

Ответ 4

Если ваш курсор находится над словом, которое вы хотите заменить содержимым неназванного регистра, вы можете использовать viwp. v переключается в визуальный режим, iw выбирает внутреннее слово, а p помещает содержимое регистра на свое место.

На практике, когда мне нужно заменить одно слово (имя функции и т.д.) на другое, я перейду к тому, который будет использоваться в качестве замены, yiw, чтобы вытащить внутреннее слово в неназванный регистр, затем перейдите к заменяемому слову и viwp, чтобы заменить его. Довольно быстрый способ заменить одно слово другим. Если вы искали (/) для слова, которое вы заменяете, чтобы перейти к нему, вы можете просто нажать n, чтобы перейти к следующему вхождению, которое вам нужно заменить. Очевидно, что нет замены для использования :%s/find/replace/g, но для пары быстрых подстановок это может быть удобно, особенно если у вас уже есть новое слово в регистре.

Ответ 5

Если вы используете именованный регистр (например, используйте "ay или "ad и т.д., чтобы заполнить свой регистр вставки), вы можете сделать что-то вроде

cw<CTRL-R>a<esc>

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

Ответ 6

Вы имеете в виду буфер системной вставки или регистр vi?

Если вы хотите использовать буфер системной пасты, тогда вы в порядке и можете делать dw"+P - " выбирает регистр, а "+ - буфер системной пасты.

В противном случае скопируйте в регистр не по умолчанию, скажем "ay, чтобы скопировать в регистр a, а затем заменить что-нибудь dw"aP

Ответ 7

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

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

где a - имя регистра

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

ve"ap

Ответ 8

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

Ответ 9

Вы можете использовать yw, чтобы вырвать слово, затем вы можете изменить слово с дернутым словом на vipw, чтобы вырвать слово и вставить ранее дернутое слово.