Совет 87: поиск текущего визуального выбора

Отрывок из «Practical Vim», второе издание Дрю Нила

В обычном режиме команда * позволяет нам искать слово под курсором. Используя небольшое количество скрипта Vim, мы можем переопределить команду * в визуальном режиме, чтобы вместо поиска текущего слова она искала текущий выбор.

Поиск текущего слова в визуальном режиме

В визуальном режиме команда * ищет слово под курсором:

+--------------+---------------------------------------------+
|  Keystrokes  |  Buffer Contents                            |
+--------------+---------------------------------------------+
|  {start}     |  \n​ She sells sea shells by the sea shore.  |
|  *           |  \n​ She sells sea shells by the sea shore.  |
+--------------+---------------------------------------------+

Мы начинаем в визуальном режиме, выбирая первые три слова и помещая курсор на слово «море». Когда мы вызываем команду *, она ищет следующее вхождение слова «море», расширяя диапазон визуального выбора. Хотя такое поведение согласуется с командой * нормального режима, я редко нахожу ее полезной.

Прежде чем я подсел на Vim, я использовал другой текстовый редактор, в котором была команда «Использовать выделение для поиска». У меня была комбинация клавиш для этого, выжженная на моих пальцах, и я использовал ее все время. Когда я перешел на Vim, то с удивлением обнаружил, что в нем нет такой функции. Мне всегда казалось, что запуск команды * из визуального режима должен искать текущий выбор, а не текущее слово. С небольшим количеством скрипта Vim мы можем добавить эту функцию в Vim.

Поиск текущего выбора (уровень техники)

Если вы наберете visual-search , вы найдете следующее предложение:

Вот идея сопоставления, которое позволяет выполнять поиск выделенного текста:

​ :vmap X y/<C-R>"<CR>

Обратите внимание, что использование специальных символов (таких как «.» и «*») вызовет проблемы.

Команда y восстанавливает текущий визуальный выбор, и /‹C-r›»‹CR› вызывает запрос на поиск, вставляет содержимое регистра по умолчанию, а затем выполняет поиск. Это простое решение, но, как говорится в предостережениях в документации Vim, у него есть ограничения.

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

Поиск текущего выбора (Redux)

Этот фрагмент скрипта Vim делает свое дело:

​ xnoremap * :<C-​u​>​call​ <SID>VSetSearch(​'/'​)<CR>​/<C-R>=@/​<CR><CR>
​ xnoremap # :<C-​u​>​call​ <SID>VSetSearch(​'?'​)<CR>?<C-R>=@/<CR><CR>
​ 
​ ​function​! s:VSetSearch(cmdtype)
​   ​let​ temp = @s
​   norm! gv"​sy​
​   ​let​ @/ = ​'\V'​ . substitute(escape(@s, a:cmdtype.​'\'), '​\​n​​', '​\\​n​​', '​​g​')
​   ​let​ @s = temp
​ ​endfunction​

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

Помимо переопределения команды *, мы настроили команду #, которая выполняет поиск выделенного текста в обратном направлении. Ключевое слово xnoremap указывает, что сопоставления должны применяться к визуальному режиму, но не к режиму выбора (см. mapmode-x ).

Надеемся, вам понравился этот отрывок. Вы можете приобрести электронную книгу прямо на The Pragmatic Bookshelf. Во время весенней распродажи вы можете сэкономить 50 % с кодом TOOLS2023 до полуночи по восточному времени 16 мая 2023 года.