Как заменить более одного символа без входа в режим вставки

12

У меня есть файл со строкой, которая выглядит так:

foofoo.xy.barbar

Я хочу , чтобы изменить xyTo gh. Я пытался сделать 2r-> gh, но очевидно , что не работает, как он заменил xyс , ggа затем переместил курсор на одно место влево.

Есть ли способ сделать это, не входя в режим вставки, или не используя намного больше нажатий клавиш (например :s/xy/gh/)?

durron597
источник
2
Rвходит в режим замены. :help replace-modeза дополнительной информацией.
alxndr
Я попробовал vt.rgh. Но результат был таким же, как у вас, за исключением положения курсора.
Гонсалу Рибейру
2
Почему вы не хотите войти в режим вставки? Нечто подобное cwgh<esc>будет работать нормально.
дверная ручка
1
@ durron597 Я не уверен , если minimize-keystrokesэто хороший тег, обычно это не совсем то , что речь идет о , как таковой. (Я отклонил предложенные вами изменения) ... Возможно, вам следует обсудить в мета?
Мартин Турной

Ответы:

19

Если новый текст имеет ту же длину, что и старый текст, опция замены Vim является опцией. Из обычного режима R(это заглавная "r") вы переходите в режим замены. Это похоже на «перезапись» в некоторых других текстовых редакторах: вместо вставки новых символов, как в режиме вставки, ввод текста заменит курсор под курсором, а затем перейдет к следующему курсору. (Думайте об этом как о нижнем регистре r, но не только по одному символу за раз.) Найдите документацию для режима замены на :help replace-mode.

В вашем случае: с курсором между .и x, войдите в режим замены, нажав R. Теперь, когда вы печатаете, gон заменяет «x» и переходит к следующему символу, поэтому вы можете печатать, hчтобы заменить «y». Ваше редактирование завершено, поэтому Escapeвернитесь в обычный режим.

(Это работает, когда ваш текст замены имеет ту же длину, что и старый текст, но если ваша замена длиннее или короче, вам cможет понадобиться все: она заменит 1 текст внутри движения на текст, который вы затем напечатаете. много способов сделать использование c, например: с курсором между .и x, ct.ABCEscapeговорят гр висящего текста (до ' т иль следующий .) с „ABC“).


1 Он будет перетаскивать текст в движении в безымянный / "регистр, а затем переключаться в режим вставки, так что вы можете набрать что-то, чтобы заменить его, а затем Escapeвернуться в нормальный режим.

alxndr
источник
2
Это работает для этого случая. Что если вы захотите заменить эти 2 символа, скажем, 3?
Гонсалу Рибейру
1
Хороший вопрос; исправлено, чтобы включить способ обработки текста различной длины.
alxndr
Да, я знаю это. Но так вы входите в режим вставки, и мне было любопытно посмотреть, есть ли способ не использовать режим вставки в этом случае. Не то чтобы я думаю, что это очень полезно (и все же я могу ошибаться).
Гонсалу Рибейру
1
Префикс с цифрой nдля замены до-го nвхождения целевого символа. Это полезно для замены частей меток форматом w_x_y_zи a-b-c-d. Используйте fвместо того, tчтобы удалить ограничивающий символ.
пкфм
5

Есть несколько способов сделать это, но я думаю о простейшем:

TL; DR

fxcw<REPLACEMENT TEXT>

объяснение

  • fxподскакивает к х (см. help *f*)
  • cwговорит, чтобы изменить слово (см. :h *c*, :help *w*и :help cwдля получения дополнительной информации), удалив текст «xy» и войдя в режим вставки, позволяя вам положить все, что вы хотите прямо там.
  • <REPLACEMENT TEXT> - это то, что вы хотите заменить на - «gh» в вашем примере.

Одним из преимуществ этого подхода является то, что он использует очень часто используемые команды для работы с текстом и навигации. Другое - это то, что «xy» может быть любой длины, и это все равно будет работать.

В cwработах , потому что ваш текстовый объект окружены точками ( .), которые выступают в качестве границы к слову.

Если ваш курсор уже находится на символе «y» (или любом символе в тексте, который нужно заменить), вы можете использовать ciw<REPLACEMENT TEXT>. Это говорит vim изменить слово, в котором вы находитесь, даже если вы не в начале. Смотрите :help text-objectsдля получения дополнительной информации ciwи текстовых объектов в целом.

Коди Полл
источник
не переведет ли это его в режим вставки?
еляшив
1
Ах - не уловил эту часть своего вопроса. В таком случае, да - R является наиболее подходящим решением.
опрос Коди
3

Заменить режим:

Rgh<Esc>

является наиболее очевидным решением, если замена имеет ту же длину, что и оригинал, но вы также можете сделать:

2sgh<Esc>

или:

cegh<Esc>
romainl
источник