Чи є команда у Vim / Vi для переміщення курсору до кінця виділення пошуку?


84

Чи є в Vim / Vi команди для переміщення у вибраному сегменті пошуку?

Наприклад, якщо я шукаю слово, чи є команди для переміщення курсору до кінця виділеного сегмента? Скажімо, у мене є слово "FishTaco", і я хочу знайти всі екземпляри "Fish" і вставити щось після нього. Я знаю, що міг би зробити глобальну заміну, але що, якщо я хочу внести зміни лише в декількох послідовних екземплярах?

Я міг зрозуміти, де було б зручно мати можливість перемістити курсор до кінця поточного виділеного сегмента, щоб виконати дію.


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

@JimStewart Я не уявляю, чому цей коментар не має принаймні стільки оцінок +1, скільки відповідь. Це vim рівня ніндзя.
Тим не менше, Тоні

Відповіді:


133

Ви можете зробити це за допомогою цього:

/Fish/e

В /eкінці курсор приземляється в кінець області пошуку (за замовчуванням замість першого символу.


32
Зверніть увагу, що ви можете додати + n або -n, щоб поставити курсор n символів до або після кінця.
Натан Феллман,

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

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

81

Якщо ви просто хочете розмістити курсор після останнього символу Риби, тоді ви можете використовувати

/Fish/e+1

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

Якщо ви особливо зацікавлені в розміщенні курсора після Fish, але лише тоді, коли він з'являється у "FishTaco", ви можете спробувати один із наступних варіантів:

Можна використовувати

/FishTaco/s+4

і курсор опиниться між Рибою та Така. /s+4Поміщає курсор 4 місця після початку пошуку.

Ви також можете використовувати

/FishTaco/e-3

який помістить курсор на 3 місця ліворуч від останнього (кінцевого) символу.

Ви також можете використовувати

/FishTaco/b+4 

тому що /b+4буде розглядатися як /s+4.


13
Чудове пояснення, але зараз я просто голодний.
kenny

27

Якщо ви вже шукали /Fish, ви можете швидко змінити пошук, щоб перейти до кінця збігу //e, який повторює останній пошук, але додає eмодифікатор, який вже пояснено.


1
// е + число - саме те, що я шукав! дивовижний.
Аркод

12

/ long-regexp1 \zs long-regexp2 / .. курсор зупиниться на \ zs , див .: довідка \ zs


11

Отримавши візуальний вибір, ви можете використовувати oдля перемикання положення курсору між початком і кінцем вибраного блоку. Коли виділення є лінійним, це змінює положення рядка , тобто курсор рухається до початкового та кінцевого рядка виділення, але не до початкового чи кінцевого символу. Коли виділення відбувається за характером, тоді рух також має характер.

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

Редагувати: Ах, але для підсвічування пошуку це не спрацює, оскільки oініціює вставку рядка. Думаю, виділення пошуку - це не те саме, що візуальне виділення, вибачте :)


Я цього теж не знав. Це чудово, щоб змінити початок виділення, не починаючи спочатку. (наприклад, ви почали відбір одного слова занадто рано чи пізно)
Timothée Boucher

8

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

Ви можете зробити :%s/Fish/FishTaco/c. Це дає вам можливість підтвердити або відхилити кожну заміну та пропустити весь бізнес "курсор в кінці матчу".


Чудова порада. Якщо я вводжу "y", він виконує заміну лише з першого. Як зробити так, щоб він підтверджувався для кожного?
Джордан Пармер,

1
Він йде до наступного матчу і чекає вас , щоб надрукувати yабо nі так далі до тих пір, поки не залишилося матчів. Щоб прийняти всі подальші заміни, введіть a, щоб відхилити їх, введіть q.
romainl

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