Vim поиск без перезаписи "/ регистрация - PullRequest
0 голосов
/ 29 августа 2018

Я хотел бы использовать косую черту (/) для поиска во время vimscript, но я не хочу перезаписывать регистр "/. Как мне это сделать?

В моем конкретном примере я работаю над пользовательским текстовым объектом vim для LaTeX, a$, чтобы указать область между включающими предыдущий и следующий знаки доллара (включая символы $, которые ограничивают математический режим в LaTeX), включая его. , Я следую руководству, найденному здесь , в котором предлагается использовать vnoremap и команду omap, что является достаточно простым подходом. Я хотел бы написать следующее:

vnoremap a$ :<C-U> execute "normal! ?\\$\rvN"<CR>
omap a$ :normal va$<CR>

Однако у этой реализации есть фатальный недостаток: регистр "/ перезаписывается поиском символа знака доллара, очищая любой предыдущий поиск и вызывая путаницу и неэффективность при попытке использовать n или N затем.

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

My Плагин SearchAsQuickJump обеспечивает реализацию этого. Вы можете использовать обычный поиск (/{pattern}), но завершить его (в GVIM) через <S-CR> вместо <CR>. Это будет искать, но сохранить первоначальный шаблон поиска. Также имеются команды, соответствующие встроенным поискам * и #.

0 голосов
/ 29 августа 2018

Могу ли я предложить рассмотреть команду keeppatterns

Поскольку :h keeppatterns говорит "Выполнить {команду}, не добавляя ничего в историю поиска", это может помочь вам построить ваше отображение

0 голосов
/ 29 августа 2018

Если $ всегда в одной строке, то часто лучше использовать f & t для создания пользовательских текстовых объектов.

xnoremap a$ :<c-u>normal! F$vf$"<cr>
onoremap a$ :normal va$<cr>

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

xnoremap a$ :<c-u>call search('\$', 'bcW')<cr>m<:call search('\$', 'W')<cr>m>gv
onoremap a$ :normal va$<cr>

Как сказал @ViVeteran, вы также можете использовать :keeppatterns с / или ?, чтобы избежать изменений в регистре поиска и истории.

xnoremap :<c-u>execute "keeppatterns normal! ?\\$\<cr>v/\\$"<cr>
onoremap a$ :normal va$<cr>

Примечание: :keeppatterns требуется Vim 7.4.083 +

Для более сложных пользовательских текстовых объектов есть vim-textobj-user . Возможно, вы захотите взглянуть на vim-textobj-latex , который использует vim-textobject-user для создания ассортимента текстовых объектов, специфичных для латекса.

Для получения дополнительной помощи см .:

:h Operator-pending
:h :map-modes
:h c_CTRL-U
:h search()
:h :keeppatterns
0 голосов
/ 29 августа 2018

Сохранить @/. Поиск. Восстановить @/. Возможно, вы не сможете сжать все это в отображении, поэтому я бы порекомендовал функцию вместо этого:

function! VisualAroundDollar()
    let search = @/
    execute "normal! ?\\$\rvN"
    let @/ = search
endfunction

vnoremap a$ :<C-U>call VisualAroundDollar()<CR>
omap a$ :normal va$<CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...