Как автоматически отключить «hlsearch» после завершения поиска?

19

Мне нравится настройка "hlsearch", но после того, как я закончу поиск, я нахожу это противным. Особенно, если я ищу что-то, что имеет много совпадений. Я знаю, что могу отключить это с

:set nohlsearch

Но это занимает целых 16 нажатий клавиш, и что еще более досадно, я должен снова включить его для следующего поиска с

:set hlsearch    

Есть ли способ, с помощью которого hlsearch может автоматически включаться, когда я начинаю поиск, и выключаться, когда я заканчиваю поиск? Например, если я вхожу в режим вставки или изменяю текст, отключится ли hlsearch без каких-либо дополнительных нажатий клавиш?

DJMcMayhem
источник
3
Определить автоматически.
Антоний
@Antony Как и в случае, если я делаю правки или в режиме вставки, он отключится без необходимости нажимать какие-либо кнопки. Если я начну поиск с помощью /или ?, или если я нажму nили N, он включится без необходимости нажимать больше кнопок.
DJMcMayhem
1
Ох и определите «выполненный» поиск
Кристиан Брабандт
1
:nno <BS> :set hls!\|set hls?<CR>- одна строка, одно нажатие клавиши, обратная связь о состоянии, и не пытайтесь угадать, когда вы можете или не можете выделить. Иногда я хочу выделить подсветку на экране при редактировании. Иногда я этого не делаю, например, использую /как движение с оператором.
Энтони
nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Сато Кацура

Ответы:

26

Есть гораздо более удобный способ. Вместо того, чтобы использовать

:set nohlsearch

который фактически отключает настройку hlsearch, используйте

:nohls

Это отключит только hlsearch до следующего поиска. Из:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

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

nnoremap <esc><esc> :silent! nohls<cr>

Но есть и лучшее решение! haya14busa / incsearch.vim . Это, по крайней мере, на мой взгляд, существенный плагин vim. Основная особенность заключается в том, что все поисковые совпадения подсвечиваются в реальном времени, когда вы вводите свое регулярное выражение. Например:

введите описание изображения здесь

Тем не менее, дополнительная функция, которая также предоставляется - это возможность немедленно включать и выключать hlsearch при запуске / остановке поиска. Чтобы включить эту функцию, вам нужно будет добавить

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

к вашему .vimrc.

Если у вас есть другие nсопоставления, вам придется их отключить. Например, я имел обыкновение

nnoremap n nzz
nnoremap N Nzz

Эти два сопоставления не совместимы друг с другом!

DJMcMayhem
источник
Поскольку вы делаете ответ самостоятельно, я хотел бы предложить вам добавить еще одну проблему set hlsearch. Если он определен в vimrcнем, он будет перезаписываться :nohкаждый раз, когда вы отправляете vimrc. Разбираться в этом я имею if !&hlsearch | set hlsearch | endifв своем vimrc. (И это еще одна проблема, которую плагин решает.)
grochmal
Не знаю, кажется, целая куча кода и конфигурации для меня не много выгоды. Фактически это затрудняет определение цели вашего инкрементального поиска, делая его менее полезным для быстрой навигации.
Энтони
+1 за отличный плагин, отвечающий на вопрос и делающий намного больше!
RichVel
7

Vim-Cool это простой плагин, который делает именно это.

Vim-cool отключает подсветку поиска, когда вы закончите поиск, и снова включает ее при повторном поиске.

Он работает без переназначения пути использованияCursorMoved и InsertEnterавтокоманды.

Джон Париз
источник
Этот метод (с использованием автокоманд) намного лучше моего ответа, и я не могу поверить, что не думал об этом, когда писал свой. Upvote.
Богатое
5

Я использую <Leader><Enter>в качестве ярлыка для :noh. (Мой лидер ,, так что это довольно близко)

Это отключит основные моменты до вашего следующего поиска.

Амит Голд
источник
3

Как вы уже отметили в своем собственном ответе , гораздо эффективнее отключить подсветку с помощью :nohlsearchкоманды (которую можно сократить :noh), чем отключить всю функцию и затем включить ее снова при следующем поиске.

Если вы хотите отключить подсветку каждый раз, когда используете iвход в режим вставки, вы можете создать простое сопоставление для этого:

:nnoremap i :noh<cr>i

Для читателя оставлено упражнение для создания аналогичных сопоставлений для других команд, где они хотят, чтобы подсветка была отключена.

Богатый
источник
2

Это может звучать глупо или наивно, но когда я хочу остановить выделение, я ищу случайную строку, которая (практически наверняка) отсутствует в документе. Что-то вроде этого:

/skljdfhadhfs

Конечно, это занимает несколько нажатий клавиш, но они действительно случайны, поэтому их можно набрать в кратчайшие сроки.

Kostas
источник
1
Но это заставляет nи Nбольше не работать, а также такие вещи, как :%s//somethingили :g//something. Это также загромождает вашу историю поиска
DJMcMayhem
Да, но мое (вероятно, неверное) предположение состоит в том, что, поскольку вам больше не нужно выделять, вам не нужен этот конкретный поиск. Загромождение истории поиска - это реальная проблема, если на нее полагаться.
Костас
1

Я нашел более интуитивно понятным переназначить Ctrl- Lперекрасить, чтобы включить :nohls:

nnoremap <C-L> :nohls<cr><C-L>
Dang
источник
Добро пожаловать в Ви и Вим ! Спасибо, что поделились своими знаниями о том, что по общему признанию является старым вопросом. Высококачественные ответы, как вы могли заметить, обычно приходят с некоторым объяснением того, что делает код (это особенно полезно для новых vimmers, которые могут приземлиться здесь без особых знаний). Это также может быть хорошей идеей для соответствующих :helpразделов!
Д. Бен Кнобл
0

Я использую <Leader><Enter>в качестве ярлыка для :hlsи мой лидер в качестве пробела.

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

После поиска предмет будет подсвечен, чтобы выключить его, нажмите <Space><Esc>. И если вы решите, что хотите снова отобразить результаты поиска, нажмите <Space><Esc>. На hls!средствах карты этого ключа привязки для переключения настройки для hls(сокращения для hlsearch, то есть поиска результата подсвечивания) (так !тумблеров правой настройки перед ним).

Джеймс Аффлек
источник
-1

Добавьте этот макрос в ваш .vimrc

map #h :set hls!<CR>

Это позволит вам переключать подсветку с помощью #h

Даррел Ли
источник
Это ничем не отличается от ответа Джеймса Аффлека.
Jamessan
Мой кажется более кратким.
Даррел Ли
Почему краткость актуальна? Другой пост дает больше информации о том, что означают части команды, и этот пост не содержит дополнительного контента.
Jamessan