Как предотвратить выделение результатов поиска при выполнении сопоставления - PullRequest
0 голосов
/ 25 января 2019

При написании отображений в nvim я иногда использую поиск / замену, например, в этом отображении для создания заголовков, которые имеют ту же длину, что и текущая строка (для уценки и т. Д.):

nnoremap <leader>= 0Vyp0v$:s/./=/g<cr>:nohls<cr>

Хотя это очищает подсветку поиска с помощью :nohls, она все равно создает «вспышку» поиска / замены.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Исходя из вашего собственного ответа, я бы предложил следующее:

nnoremap <leader>= :set nohlsearch<cr>0Vyp0v$:s/./=/g<cr>:let @/=''<cr>:set hlsearch<cr>

Это просто устанавливает регистр поиска в пустую строку.Так что без выделения.Вы даже можете сбросить его до предыдущей строки поиска:

nnoremap <leader>= :let olds=@/<cr>0Vyp0v$:s/./=/g<cr>:let @/=olds<cr>

И кстати: не будет yyp:s/./=/g проще.


У меня лично hlsearch по умолчанию отключенои включайте его только тогда, когда мне это нужно.Для переключения у меня есть следующее отображение в моем vimrc:

" Switch on/off higlighting of search string
noremap  <F8>   :set invhlsearch hlsearch?<CR>
0 голосов
/ 25 января 2019

Общее решение

Я бы использовал :help function-search-undo и извлекал бы команды в :function. Это не сожжет текущий шаблон поиска и, следовательно, не повлияет на подсветку поиска. Чтобы быть полностью нейтральным, вам просто нужно удалить использованный шаблон замещения из истории поиска (через histdel()):

function! MakeHeading()
    normal! Vyp
    s/./=/g
    call histdel('search', -1)
endfunction
nnoremap <leader>= :call MakeHeading()<CR>

Обратите внимание, что я также упростил обработку визуального выделения: поскольку V всегда выделяет всю строку, вам не нужно переходить к первому столбцу (^), также не требуется повторный выбор; мы можем просто позволить :substitute работать с текущей (вставленной) строкой.

Альтернативная реализация

Это напоминает мне, что каноническая реализация этой функции использует команду :help v_r, и это действительно требует повторного выбора:

nnoremap <leader>= Vyp0v$r=

Поскольку здесь нет паттерна, подсветка поиска не зависит от него: -)

0 голосов
/ 25 января 2019

Во время исследования :h :s и: h s_flags`, а также при осмотре всего вокруг здесь часть ответа @ Ein обращалась ко мне:

всякий раз, когда вы запускаетеУ команды :set hlsearch есть два эффекта: она устанавливает опцию И заставляет vim забыть, если вы когда-либо набирали :nohlsearch.Другими словами, изменение 'hlsearch' (вкл. Или выкл.) Приведет к логическому совпадению текущего "highlight visibility".

С комбинацией использования :set nohls и флага e (:h s_e), я закончил с:

nnoremap <leader>= :set nohlsearch<cr>0Vyp0v$:s/./=/g<cr>:s/thanks@Ein//e<cr>:set hlsearch<cr>

" Broken out
" Turn off highlighting
:set nohlsearch

" Yank the whole line, duplicate it, and replace `.` with `=`
0Vyp0v$:s/./=/g

" Do a replace with something I'll never find in a document (probably), with `/e` to suppress errors.
:s/thanks@Ein//e

" Finally, reenable highlighting
:set hlsearch

Любые более элегантные решения приветствуются.Я думаю, что по крайней мере скоро я буду преобразовывать некоторые из них в функцию, чтобы можно было использовать другие символы, такие как - для подзаголовков.

...