VIM Заменить слово содержимым буфера вставки? - PullRequest
108 голосов
/ 18 марта 2010

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

Ответы [ 9 ]

122 голосов
/ 18 марта 2010

Я думаю, под "вставить" вы имеете в виду безымянный (yank / put / change / delete / substitute) регистр, верно? (Так как это тот, который будет перезаписан командой изменения.)

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

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

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

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

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

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

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

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

47 голосов
/ 18 марта 2011

Используя информацию в этом посте, я сформировал это полезное отображение. Я выбрал «cp», потому что это означает «изменить пасту»

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

EDIT:

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

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

"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
27 голосов
/ 02 августа 2010

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

20 голосов
/ 24 января 2014

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

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

5 голосов
/ 18 марта 2010

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

cw<CTRL-R>a<esc>

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

2 голосов
/ 18 марта 2010

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

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

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

1 голос
/ 13 декабря 2014

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

0 голосов
/ 22 декабря 2011

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

0 голосов
/ 18 марта 2010

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

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

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

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

ve"ap

...