Como desativar automaticamente o "hlsearch" depois que eu terminar de pesquisar?

19

Adoro a configuração "hlsearch", mas depois de terminar a pesquisa, acho desagradável. Especialmente se eu procurar algo que tenha muitas correspondências. Eu sei que posso desligar isso com

:set nohlsearch

Mas são necessárias 16 teclas pressionadas e, ainda mais irritante, eu preciso ativá-lo novamente para minha próxima pesquisa com

:set hlsearch    

Existe uma maneira em que o hlsearch ative automaticamente quando inicio a pesquisa e desative quando terminar a pesquisa? Por exemplo, se eu entrar no modo de inserção ou modificar o texto, o hlsearch será desativado sem pressionar as teclas adicionais?

DJMcMayhem
fonte
3
Defina automaticamente.
Antony
@Antony Como se estivesse fazendo edições, ou no modo de inserção, ele será desativado sem que eu precise pressionar nenhum botão. Se eu começar a pesquisar com /ou ?, ou se eu pressionar nou N, ele será ativado sem que eu precise pressionar mais nenhum botão.
DJMcMayhem
1
Ah e defina a pesquisa "concluída" #
Christian Brabandt
1
:nno <BS> :set hls!\|set hls?<CR>- uma linha, uma tecla pressionada, feedback de estado e não tenta adivinhar quando você pode ou não querer destacar. Às vezes, quero destacar à esquerda na tela ao editar. Às vezes não, por exemplo, usando /um movimento com um operador.
Antony
nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

Respostas:

25

Existe uma maneira muito mais conveniente. Em vez de usar

:set nohlsearch

que realmente desativa a configuração hlsearch, use

:nohls

Isso só desativará o hlsearch até você pesquisar novamente. A partir de: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.

No entanto, essa solução não é perfeita, pois você ainda precisa digitar o :nohlsque é doloroso fazer após cada pesquisa. Você pode contornar isso com um mapeamento, por exemplo

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

Mas existe uma solução ainda melhor ! haya14busa / incsearch.vim . Este é, pelo menos na minha opinião, um plugin essencial do vim. A principal característica é que todas as correspondências de pesquisa são destacadas em tempo real, enquanto você digita sua regex. Por exemplo:

insira a descrição da imagem aqui

No entanto, um recurso secundário que também é fornecido é a opção de ativar e desativar o hlsearch imediatamente quando você inicia / para a pesquisa. Para habilitar esse recurso, você precisará adicionar

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#)

para o seu .vimrc.

Se você tiver outros nmapeamentos, precisará desativá-los. Por exemplo, eu costumava ter

nnoremap n nzz
nnoremap N Nzz

Esses dois mapeamentos não são compatíveis um com o outro!

DJMcMayhem
fonte
Como você está fazendo uma resposta automática, gostaria de sugerir que você também adicione outro problema set hlsearch. Se você o tiver definido, vimrcele sobrescreverá :nohtoda vez que você for buscar o arquivo vimrc. Para resolver isso eu tenho if !&hlsearch | set hlsearch | endifno meu vimrc. (E isso é outro problema que os resolve plugin.)
grochmal
Não sei, parece um monte de código e configuração, sem muito ganho para mim. De fato, torna mais difícil localizar o alvo de sua pesquisa incremental, tornando-o menos útil para navegação rápida.
Antony
+1 para obter uma ótima resposta de plug-in e fazer muito mais!
RichVel 02/02
7

O vim-cool é um plugin simples que faz exatamente isso.

O Vim-cool desativa o destaque da pesquisa quando você termina a pesquisa e o reativa quando você pesquisa novamente.

Ele funciona sem remapeamento por usando o CursorMovede InsertEnterautocomandos.

Jon Parise
fonte
Essa técnica (usando comandos automáticos) é muito melhor do que minha resposta, e não acredito que não pensei nisso quando escrevi a minha. Voto a favor.
Rich
5

Eu uso <Leader><Enter>como um atalho para :noh. (Meu líder é ,, por isso é muito perto)

Isso desativará os destaques até sua próxima pesquisa.

Amit Gold
fonte
3

Como você já observou em sua própria resposta , é muito mais eficiente desativar o destaque com o :nohlsearchcomando (que pode ser abreviado para :noh), em vez de desativar o recurso inteiro e ligá-lo novamente na próxima vez que você pesquisar.

Se você deseja desativar o destaque sempre que usar ipara entrar no modo de inserção, é possível criar um mapeamento simples para fazer isso:

:nnoremap i :noh<cr>i

É um exercício para o leitor criar mapeamentos semelhantes para outros comandos nos quais eles desejam desativar o destaque.

Rico
fonte
1

Pode parecer estúpido ou ingênuo, mas o que faço quando quero interromper o realce é procurar uma sequência aleatória que (praticamente certamente) não esteja presente no documento. Algo assim:

/skljdfhadhfs

É verdade que são necessárias algumas teclas, mas elas são realmente aleatórias, para que possam ser digitadas rapidamente.

Kostas
fonte
1
Mas isso faz ne Nnão funciona mais, e também coisas como :%s//somethingou :g//something. Isso também atrapalha seu histórico de pesquisa
DJMcMayhem
Sim, mas minha suposição (provavelmente incorreta) é que, como você não precisa mais realçar, também não se importa com essa pesquisa específica. Organizar o histórico de pesquisas é um problema real, se alguém confiar nele.
Kostas
1

Eu achei mais intuitivo remapear o Ctrl- Lrepintar para incluir :nohls:

nnoremap <C-L> :nohls<cr><C-L>
DanG
fonte
Bem-vindo ao Vi e Vim ! Obrigado por compartilhar seu conhecimento sobre o que é reconhecidamente uma pergunta antiga. Respostas de alta qualidade, como você deve ter notado, geralmente vêm com algumas explicações sobre o que o código está fazendo (isso é especialmente útil para os vimmers mais recentes que podem chegar aqui sem muito conhecimento). Também pode ser uma boa ideia para as :helpseções relevantes !
D. Ben Knoble 19/12
0

Eu uso <Leader><Enter>como atalho :hlse tenho meu líder definido como espaço.

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

Depois de pesquisar, um item será destacado; para desativá-lo, pressione <Space><Esc>. E se você decidir exibir novamente os resultados da pesquisa, pressione <Space><Esc>. Os hls!meios mapeiam essa ligação de tecla para alternar a configuração para hls(abreviação para hlsearch, ou seja, realce do resultado da pesquisa) (portanto, !alterna a configuração logo antes).

James Affleck
fonte
-1

Adicione essa macro ao seu .vimrc

map #h :set hls!<CR>

Isso permitirá que você alterne o crepúsculo com #h

Darrel Lee
fonte
Isso não é diferente da resposta de James Affleck.
jamessan 01/11
O meu parece mais conciso.
Darrel Lee
Por que a concisão é relevante? A outra publicação fornece mais informações sobre o significado das partes do comando e esta publicação não fornece conteúdo adicional.
jamessan 8/11