VIM - как я могу сделать «изменить слово», используя текущий буфер вставки

86

У меня есть некоторый текст в моем буфере вставки, например, я сделал yw(yank word) и теперь у меня есть 'foo' в моем буфере.

Теперь я перехожу к слову «bar» и хочу заменить его на мой буфер вставки.

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

Как я могу «изменить слово», но использовать содержимое моего буфера вставки вместо того, чтобы вручную вводить слово замены?

Лучший вариант, который у меня есть сейчас, - это перейти к началу слова, которое я хочу заменить, и выполнить dw(удалить слово), затем перейти в другое место и выполнить yw( восстановить слово), затем вернуться в область замены и выполнить p(вставить), что немного неуклюже, особенно если они не на одном экране.

Майкл Даррант
источник

Ответы:

120

Опция 1

Вы можете использовать регистры, чтобы сделать это и сделать связывание клавиш для процесса.

Дайте слово, которое хотите заменить yw.

Дерганное слово находится в 0регистре, который вы можете увидеть, выдав :registers.

Перейдите к слову, которое вы хотите заменить и сделать cw. Сделайте Ctrl+, rа затем 0вставьте 0регистр.

Карта для этого будет выглядеть примерно так (при условии Ctrl+ в jкачестве нашей ключевой комбинации):

:map <C-j> cw<C-r>0<ESC>

Вариант 2 (проще)

Сорвав слово, наведите курсор на слово, которое хотите заменить, и сделайте viwp. Что визуально выбрать внутреннее слово и вставить.

Предоставлено @tlo в комментариях: вы также можете просто сделать vep. На один символ короче. Нижняя сторона должна позиционировать курсор в начале слова и (как у меня) меняет буфер.

Комментарий (от Майкла):

Это хорошо. Дополнительное примечание: второй метод действительно проще, но, как есть, работает только для ОДНОЙ замены, потому что после каждой замены буфер заменяется на поле, которое было заменено (старый текст). Первый способ немного сложнее в использовании, НО имеет преимущество в том, что буфер 0 остается «как есть», поэтому вы можете использовать этот метод для более чем 1 замены одного и того же текста.

jmathew
источник
14
Вариант 3 (еще проще): удерживая слово, наведите курсор на первый символ слова, которое вы хотите заменить и сделать vep.
'10
Мне нравится вариант 3, когда нужно изменить только 1 слово. Если нужно изменить более одного слова, вариант 1 позволяет мне использовать. оператор, чтобы повторить это ..
typelogic
3
ve"0pбудет работать, чтобы позволить вам повторить ваши изменения
JKillian
Если вы собираетесь сопоставить это с чем-то, его, вероятно, лучше использовать: map <C-j> ciw<C-r>0<ESC>чтобы не имело значения, откуда в слове вы нажимаете ^j.
Пол Паркер
Любой, кто хочет знать, почему CTRL-R делает это волшебно: :help insertтогда ищите CTRL-R /CTRL-R. Для того ve"0p, как работает, посмотрите на:help registers
Пол Паркер
12

ywчтобы восстановить ваше слово, затем переместите курсор к слову, которое вы хотите заменить, и используйте его "_dwдля удаления, отправив текст в нулевой регистр (чтобы он не перезаписывал содержимое "регистра, куда по умолчанию выводится / вырезанный текст ), а затем просто вставьте p.

Вы можете использовать следующее отображение, чтобы сделать вещи немного проще:

nnoremap <leader>d "_d

... так что в обычном режиме вы можете использовать, \dwчтобы удалить слово, не влияя на "регистр.

evilsoup
источник
3

Чтобы сделать это способом VIM, вы намеренно используете янки, удаляете и другие регистры.

Регистрация "0- это регистрация янки. Все, что вы дергаете, будет помещено сюда, но удаляется, никогда не трогайте регистр "0.

Итак, в вашем примере вы только что выдернули слово. Чтобы заменить слово тем, что вы только что вытащили, вы можете использовать удаления, никогда не затрагивающие регистр янки. Итак, перейдите к целевому слову, удалите его с помощью dw, затем вставьте из своего янк-регистра с помощью "0pили, еще лучше, cwзатем ^R0(что повторяется).

Рядом с регистром янки находится регистр небольших удалений "-. Любое небольшое удаление или изменение удаления помещено здесь, но янки никогда не трогают "-. Удаление считается малым, если оно меньше полной строки.

Регистры "1- "9это регистры истории удаления. С "1последним большим удалением или удалением изменений, а также "9самым старым крупным удалением или удалением изменений. Только удаления, которые не малы, т.е. удаляет из одной строки или более, получить толкнули на "1- "9.

Для любой операции, которая изменяет регистр, копия также всегда помещается в регистр по умолчанию, то есть безымянный регистр "". Этот регистр используется, когда вы явно не называете регистр.

Регистр "_- это регистр черной дыры, и он всегда пуст. Если вы удалите его, ничего в любом регистре не изменится вообще, даже ""регистр по умолчанию или сам регистр черной дыры. Удаленный текст полностью исчез, кроме вашей истории отмены. Срывание или вставка из регистра черной дыры практически ничего не делает.

Регистр черной дыры "_позволяет вам выполнять сначала одно небольшое удаление, затем ряд других удалений, "_не изменяя регистр небольших удалений "-, а затем вставлять первое небольшое удаление.

Другие регистры являются последним добавленным регистр "., регистры имен файлов "%и "#, регистр команд ":, регистр поиска "/и выражение регистра "=.

Вы можете получить список всех этих регистров и их содержимое с помощью команды :register. Эта команда очень полезна для экспериментов и изучения того, что и где заканчивается.

00prometheus
источник
2

Мне нужно это так часто, я написал плагин для упрощения и обеспечения максимальной скорости: ReplaceWithRegister .

Этот плагин предлагает grкоманду « два в одном», которая заменяет текст, охватываемый объектом {motion} / text, всей строкой (ами) или текущим выделением, содержимым регистра; старый текст удаляется в регистр черной дыры, т.е. Он прозрачно обрабатывает многие угловые случаи и позволяет быстро повторить с помощью стандартной .команды. Если вам это не нравится, на его странице есть ссылки на альтернативы.

Инго Каркат
источник
2

Чтобы повторить вставку, используйте команду изменения.

cw ^R0ESC (^ R = Control + R; 0 для регистра 0)

заменит слово на содержание из рег. 0 и давайте повторим это с.

Это отлично подходит для cgn(VIM 7.4) для замены шаблонов поиска:

  • Первый поиск с помощью /или*
  • cgn ^R0ESC
  • .повторить в следующем матче или nпропустить
laktak
источник
1

Так как он еще не включен, вы обычно заменяете строки на :%s/.../.../и также можете делать это со словом под курсором.

  1. Вы вводите первую часть команды, что вы ищете: :s/find/
  2. Затем вы нажимаете <ctrl-r>и выбираете курсором слово, которым хотите заменить его.
  3. Затем вы нажимаете <ctrl-w>(маленькое «слово») или <ctrl-a>(большое «слово), чтобы вставить слово под курсором в командную строку
  4. Затем вы заканчиваете команду.

Смотрите ссылку о том, как использовать курсор курсора в командной строке .

erikbwork
источник
1

Я обычно использую это: ywчтобы восстановить foo, затем удалить barс помощью dw, и, в качестве последнего шага, положить fooиз регистра, 0который содержит восстановленный текст, используя "0p. Повторите ввод с точки ( .) по мере необходимости.

Также вместо ywи dwвы можете использовать yiwи diw(обратите внимание на дополнительное i- это значит внутри ). При этом вы можете восстановить или удалить слово из любого места внутри него, а не только в начале слова.

Нино
источник
0

Я использую этот плагин для расширения области выбора: https://github.com/terryma/vim-expand-region

Таким образом, моя комбинация для изменения слова будет: vvpв любом месте слова.

У меня также есть хак для сохранения безымянного содержимого регистра после вставки, чтобы я мог повторить это.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(мой буфер обмена - авто-выбор)

user2656799
источник
0

Я использую приведенное ниже сопоставление клавиш, чтобы заменить текущее слово скопированным словом.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwскопировать слово Перейдите к слову. ,rrзаменить слово.
Ключ лидера - это карта ,.

рыболов
источник
,rwбыло бы больше смысла, и на QWERTY это, вероятно, smidgen проще и быстрее, чтобы пояс. Я выбрал DVORAK, ,rcкоторый, хотя он и не имеет особого смысла, легче и быстрее, чем все они. На ДВОРАК, ,rwэто шоу ужасов;)
Пол Паркер
0

Во-первых, перейдите к началу слова, которое вы хотите нажать. Если вы находитесь в середине слова, просто bвернитесь к началу. Затем сделайте, yeчтобы восстановить все слово без пробелов (от yank до end). Наконец, перейдите к слову, которое вы хотите заменить - возможно, выполнив wнесколько раз, - и выполните команду a, vepчтобы войти в vрежим обычного выбора, выбрать до eслова и pоценить содержимое, которое вы копали последним.

(Если кто-то хочет знать, почему я просто не прокомментировал принятый ответ, для небольшой модификации использования, yeа не ywпотому, что моя репутация в этом стеке все еще слишком низкая.)

аномалия
источник
0
  1. используй, ywчтобы дергать мир, иди в мир, который ты хочешь изменить.
  2. используйте, vчтобы выбрать мир, veили в vwзависимости от вашей ситуации.
  3. введите, pчтобы наклеить мир, который вы скопировали, чтобы заменить выбранный блок
ramwin
источник
0

Добавление к другим лучшим ответам. Слишком очевидно, но вы можете просто вставить перед удалением. 'yw', затем введите слово, которое вы хотите заменить, 'pldw' (вставьте, переместите один символ вправо, удалите слово.

Али Алмуллим
источник