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

25

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

Допустим, у меня есть этот текст:

foo bar buzz

И я хочу дернуть fooи заменить barтем, что я дергал раньше.

После дергания fooя вижу следующие варианты:

Опция 1

  1. Поместите курсор на barсw

  2. Положите fooперед barсP

  3. Наведите курсор на bоставшееся barи удалите слово с помощьюde

Вариант 2

  1. Поместите курсор на панель с w

  2. Используйте, deчтобы стеретьbar

  3. Поместить содержимое регистра 0 с "0P(так как я стер bar, fooбольше не доступен с простым p)

Оба способа кажутся мне слишком сложными, и я уверен, что есть более эффективный способ добиться этого, но я не могу найти, как это сделать. Эта идея состояла бы в том, чтобы объединить действия удаления и ввода только в одном или, по крайней мере, избежать сохранения удаленного слова в регистре янки, чтобы я мог поместить желаемое слово простым p.

Также я знаю режим замены, вызванный, Rно он не позволяет поставить то, что было выдернуто.

TL; DR : Как заменить слово содержимым янки?

statox
источник

Ответы:

31

Предполагая , что вы уже рванул fooс yeили что - то подобное, и что курсор находится где - то на foo, вы можете использовать Wvep:

  • Wперейти к bar(это, очевидно, необязательно и будет зависеть от текущей позиции курсора);
  • v запустить визуальный режим;
  • eперейти к концу слова (вы также можете использовать другие движения здесь, например iw);
  • pвставить foo; это заменит текущий визуальный выбор (который помещен в безымянный регистр "").
Мартин Турной
источник
2
Возможно, вас заинтересуют следующие эпизоды vimcast : вставка из визуального режима и свопирование двух областей текста с помощью exchange.vim
Питер Ринкер
6

Я нашел другой способ сделать это, он немного похож на вариант 2, но имеет то преимущество, что не портит состояние регистров.

Идея состоит в том, чтобы использовать « регистр черной дыры »: этот регистр доступен через "_и имеет особенности, которые вы можете записывать в него, но не читать из него, поэтому, подобно черной дыре, этот регистр полностью пропускает все, что попадает в него. Здесь мы можем использовать его, чтобы fooоставаться в реестре янки даже после barудаления.

При таком решении рабочий поток после восстановления fooбудет:

  • Переходя barс W(или любое нужное слово, конечно)
  • Использование «черные дыры реестра» для удаления barс"_de
  • Выкладываю fooиз янки, регистрируюсь с P. Регистр янки все еще содержит, fooтак как barвошел в черную дыру.

Я не уверен, что это лучшее решение, чем у @ Carpersmoker ( с точки зрения победы vimgolf @Carpetsmoker ), но я не знал о регистре черной дыры, и я подумал, что некоторые могут быть заинтересованы в этом.

statox
источник
3
  1. Перейти к началу "Foo". Нажмите yiw. Это дергает внутреннее слово.

  2. Идем в «бар» нажатием на букву w. Затем выберите его и верните назад:viw"0p

Я пользуюсь ciwи yiwмного.

Xabierrek
источник
4
Использование текстовых объектов наподобие iwинтересного, но ваше решение на самом деле такое же, как у @ CarpetSmoker: визуально выберите второе слово и поместите первое. Я также думаю, что ваше решение будет работать с простым pвместо использования "0регистра.
statox
1
  • Когда курсор находится в любом месте слова,

    • yiw- восстановить слово и сохранить его в 0реестре.
  • Перейти к целевому слову для замены

    • ciw удалит слово и переведет вас в режим вставки.
    • ctrl-r, "Появится попросив регистр , который будет вызван.
    • 0 вставит дерганное слово.

Набранные слова (обычно!) Хранятся в 0регистре. Смотрите, :registersчтобы просмотреть сохраненные буферы. Это может показаться длительной процедурой, ИМХО это открывает путь к гораздо более сложным приемам регистрации.

Сб ям
источник