Совет 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 года.