Есть ли в Vim / Vi команда для перемещения курсора в конец выделения поиска?


86

Есть ли в Vim / Vi какие-либо команды для перемещения в пределах выбранного сегмента поиска?

Например, если я ищу слово, есть ли какие-нибудь команды для перемещения курсора в конец выделенного сегмента? Скажем, у меня есть слово «FishTaco», и я хочу найти все экземпляры «Fish» и вставить что-нибудь после него. Я знаю, что могу выполнить глобальную замену, но что, если я хочу внести изменения только в паре непоследовательных экземпляров?

Я мог видеть, где было бы удобно переместить курсор в конец текущего выделенного сегмента для выполнения действия.


3
Это не ответ на вопрос, но для достижения вашей конечной цели заменить all Fishна FishTaco, вы могли бы сделать :%s/Fish\(Taco\)\@!/&Taco/, что найдет все, Fishза которыми еще не следуют, Tacoи заменит их на FishTaco. Сочетает поиск с обратным просмотром вперед с заменой, которая включает совпавший термин, за которым следует Taco.
Джим Стюарт

@JimStewart Я понятия не имею, почему в этом комментарии не так много +1, как в ответе. Это vim уровня ниндзя.
Still.Tony 09

Ответы:


135

Сделать это можно так:

/Fish/e

Значок /eв конце помещает ваш курсор в конец области поиска (вместо первого символа по умолчанию.


32
Обратите внимание, что вы можете добавить + n или -n, чтобы поместить курсор на n символов до или после конца.
Натан Феллман

10
Стоит отметить, что после того, как вы уже выполнили /Fishпоиск, вы можете перейти к концу с //eVim 7.4, а затем использовать его gnдля визуального выделения найденного результата.
smathy

Взгляните также на ответ @ghbarratt , больше возможностей для нахождения курсора на выделенном совпадении.
Нима

82

Если вы просто хотите поместить курсор после последнего символа Fish, вы можете использовать

/Fish/e+1

который поместит ваш курсор после h. (Без +1курсора курсор окажется слева от последнего символа.)

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

Вы можете использовать

/FishTaco/s+4

и ваш курсор окажется между рыбой и тако. /s+4Помещает курсор 4 места после начала поиска.

Вы также можете использовать

/FishTaco/e-3

который поместит ваш курсор на 3 позиции слева от последнего (конечного) символа.

Вы также можете использовать

/FishTaco/b+4 

потому что /b+4будет рассматриваться как /s+4.


14
Отличное объяснение, но теперь я просто голоден.
Кенни

28

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


1
номер // e + - это именно то, что я искал! здорово.
arkod

13

/ long-regexp1 \zs long-regexp2 / .. курсор остановится на \ zs , см .: help \ zs


12

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

Вы также можете использовать `<и`> для переключения курсора между началом и концом визуального блока, однако это влияет на сам выбор, поэтому он используется для сброса или настройки границ выделения.

Изменить: Ах, но для выделения поиска это не сработает, потому oчто инициирует вставку строки. Я предполагаю, что выделение поиска - это не то же самое, что визуальное выделение, извините :)


Я этого тоже не знал. Это отличный способ изменить начало выделения, не начиная заново. (например, вы начали выделение на одно слово слишком рано или слишком поздно)
Тимоти Буше

9

На часть вашего вопроса "курсор в конце совпадения" уже дан ответ.

Вы можете это сделать :%s/Fish/FishTaco/c. Это дает вам возможность подтвердить или отклонить каждую замену и пропустить весь бизнес «курсор в конце совпадения».


Отличный совет. Если я введу «y», он выполнит замену только для первого. Как я могу подтвердить это для каждого?
Джордан Пармер

1
Он переходит к следующему совпадению и ждет, пока вы напечатаете yили nи так далее, пока не останется ни одного совпадения. Чтобы принять все дальнейшие замены, введите a, чтобы отклонить их, введите q.
romainl

1
На самом деле, мне не хватало gпослефинала, /поэтому он не продолжался в моей линии. Спасибо за совет.
Джордан Пармер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.