Перейти к следующему появлению слова, которое я только что изменил

12

Если у меня есть следующее:

function foo(bar) {
    return bar + 1;
}

И я использую, cwчтобы изменить первое barна baz, как я могу перейти к следующему соответствию bar, чтобы я мог использовать, .чтобы сделать то же самое изменение?

Я не могу использовать *, потому что это ищет текущее слово под курсором, и я глупо не искать barв первый раз, поэтому nне будет работать.

Есть ли простой способ поиска следующего вхождения слова, которое было до того, как я его изменил?

Я не хочу выполнять поиск и замену, потому что или barв моем файле есть другие вхождения, которые я не хочу менять, или потому что было только два экземпляра bar, и я забыл, :%s/bar/baz/прежде чем начал, и это слишком много усилий, чтобы изменить единственный оставшийся экземпляр.

Роджер Липскомб
источник
2
Это не совсем соответствует описанному вами рабочему процессу, но vim-oblique улучшает *поиск. Особенно это заставляет *визуально выбирать текущее слово без перемещения курсора. После того, как оно установлено, вы можете *ciwвнести старое слово в регистр поиска и изменить его. Тогда вы можете использовать nи ..
statox
Нажатие n переместит вас к следующему появлению последнего найденного шаблона. Почему ты не попробовал это?
SibiCoder
... потому что я не искал, чтобы добраться до первого случая, поэтому nне сработает.
Роджер Липскомб

Ответы:

14

Текст, который вы только что изменили, cwбыл вырезан в безымянный регистр, поэтому вы можете использовать его с:

/<C-r>"<CR>

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

romainl
источник
5

Чтобы расширить Romainl как полный рабочий процесс ...

Если вам больше нравится выполнять редактирование такого рода, а затем понимаете, что вам необходимо применить те же правки к абзацу / функции, которые вы можете использовать "и в .регистрах.

В вашем примере вы можете выполнить первоначальное редактирование аргумента. Если вы войдете в визуальный режим (я бы использовал Visual Line просто для того, чтобы убедиться, что вы все правильно выбрали), а затем применили поиск и замену.

V]] - Визуальная строка, до конца абзаца / функции.

  • : - Поскольку вы находитесь в визуальном режиме, это становится :'<,'>
  • s/ - Найти
  • CTRL+ "- последний рывок / удаление элемента (бар в примере)
  • / - и заменить
  • CTRL+ .- последняя вставка (база в примере)

Этот шаблон требует некоторого времени, чтобы привыкнуть, так как вы должны использовать. Большую часть времени вам нужно просто применить поиск и замену ко всей функции, включая аргумент, но это хороший способ не выполнять анти-шаблон: «Работай, понимай, что ты должен был сделать это лучше, отменить и повторить». правильно."

jecxjo
источник
2

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

nmap <leader>a "1yiw:let @/=@1^Mciw

в вашем .vimrcфайле. Обратите внимание, что ^M это захват ключа возврата, а не символы ^и M. Вы получите это, нажав Ctrl+ Vв режиме вставки, а затем Enter. Теперь, с этим определением, нажатие <leader>aбудет выполнять то же самое cw, но теперь слово (до изменения) будет в вашем «последнем регистре поиска» (то есть в /регистре), поэтому нажатие nпосле того, как вы внесли изменение и вернули в нормальном режиме приведет вас к следующему появлению. Аналогично, нажатие Nвернет вас к предыдущему событию.

Ярлык Конечно, вы можете выбрать другой ярлык, чем другой <leader>a, но я просто нахожу, что это очень доступный ярлык. Лично я поставил , <leader>чтобы ,так , что мне просто нужно нажимать ,следует a, но это потому , что я не использую американскую клавиатуру, так что мой \спрятано несколько (я считаю , \по умолчанию <leader>).

Пояснение Идея действительно проста. Наберите слово под курсором в регистр поиска /и затем выполните cw. Это nmap <leader>a "/yciwбыло то, к чему я стремился, но, к сожалению, я не думаю, что вы можете восстановить регистр поиска, поэтому обходной путь состоит в том, чтобы вернуть слово под курсором в 1регистр, затем установить /регистр равным этому и затем сделать cw. Так "1yiwже и та часть, которая возвращает внутреннее слово под курсором в регистр 1. Если вы не знаете о внутренних словах, вы можете проверить :help iw. После этого :let @/=@1следует захват Enterсодержимого 1регистра в /. На данный момент nиNработает как следующее и предыдущее вхождение слова под курсором, а затем ciwделается так, что слово под курсором удаляется и Vim переводится в режим вставки.

Слово против внутреннего слова Я только что понял, что я предполагал, что вы хотите, чтобы все слово находилось под курсором, а не только с точки зрения курсора и так далее. Вот почему я использовал iwвместо wвезде. Если это не так, то вы должны использовать

nmap <leader>a "1yw:let @/=@1^Mcw

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

отказ от ответственности Это решение, вероятно , не очень хорошо работает , если вы пытаетесь использовать его на то , что содержит вещи , отличные от букв, например, имея курсор стоять на \или путем замены iwна iW, ib, isили ipили что - то (хотя я не знаю , почему вы бы хочу эту функцию с целыми предложениями)

Kristian
источник