Comment désactiver automatiquement «hlsearch» après avoir terminé la recherche?

19

J'adore le paramètre "hlsearch", mais une fois la recherche terminée, je le trouve désagréable. Surtout si je recherche quelque chose qui a beaucoup de correspondances. Je sais que je peux désactiver cela avec

:set nohlsearch

Mais cela prend 16 touches, et encore plus ennuyeux, je dois le réactiver pour ma prochaine recherche avec

:set hlsearch    

Existe-t-il un moyen d'activer ou de désactiver automatiquement hlsearch lorsque je commence la recherche, et de le désactiver une fois la recherche terminée? Par exemple, si j'entre en mode insertion ou modifie le texte, la recherche hls est-elle désactivée sans aucune touche supplémentaire?

DJMcMayhem
la source
3
Définissez automatiquement.
Antony
@Antony Comme dans, si je fais des modifications, ou en mode insertion, il s'éteindra sans que j'aie besoin d'appuyer sur aucun bouton. Si je commence la recherche avec /ou ?, ou si j'appuie sur nou N, il s'allumera sans que j'aie besoin d'appuyer sur d'autres boutons.
DJMcMayhem
1
Oh et définissez la recherche "terminée"
Christian Brabandt
1
:nno <BS> :set hls!\|set hls?<CR>- une ligne, une pression sur une touche, un retour d'état et n'essaie pas de deviner quand vous voulez ou non mettre en surbrillance. Parfois, je veux mettre en surbrillance à gauche lors de l'édition. Parfois, je ne le fais pas, par exemple en utilisant /comme mouvement avec un opérateur.
Antony
nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

Réponses:

26

Il existe un moyen beaucoup plus pratique. Plutôt que d'utiliser

:set nohlsearch

qui désactive en fait le paramètre hlsearch, utilisez

:nohls

Cela désactivera uniquement la recherche jusqu'à ce que vous effectuiez une nouvelle recherche. 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.

Cependant, cette solution n'est pas parfaite, car vous devez toujours taper ce :nohlsqui est pénible à faire après chaque recherche. Vous pouvez contourner cela avec une cartographie, par exemple

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

Mais il existe une solution encore meilleure ! haya14busa / incsearch.vim . C'est, au moins à mon avis, un plugin vim essentiel . La caractéristique principale est que toutes les correspondances de recherche sont mises en évidence en temps réel, lorsque vous tapez votre expression régulière. Par exemple:

entrez la description de l'image ici

Cependant, une fonctionnalité secondaire également fournie est l'option d' activer et de désactiver immédiatement hlsearch lorsque vous démarrez / arrêtez la recherche. Pour activer cette fonction, vous devrez ajouter

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

à votre .vimrc.

Si vous avez d'autres nmappages, vous devrez les désactiver. Par exemple, j’avais

nnoremap n nzz
nnoremap N Nzz

Ces deux mappages ne sont pas compatibles l'un avec l'autre!

DJMcMayhem
la source
Puisque vous faites une auto-réponse, je voudrais suggérer que vous ajoutiez également un autre problème set hlsearch. Si vous l'avez défini, vimrcil sera écrasé à :nohchaque fois que vous sourcez le fichier vimrc. Pour régler ce problème, je l'ai if !&hlsearch | set hlsearch | endifdans mon vimrc. (Et c'est un autre problème que le plugin résout.)
grochmal
Ne sais pas, semble être un tas de code et de configuration pour pas beaucoup de gain pour moi. En fait, cela rend la cible de votre recherche incrémentielle plus difficile à repérer, ce qui la rend moins utile pour une navigation rapide.
Antony
+1 pour un excellent plugin répondant à une question et en faisant beaucoup plus!
RichVel
7

vim-cool est un plugin simple qui fait exactement cela.

Vim-cool désactive la mise en évidence de la recherche lorsque vous avez terminé la recherche et la réactive lorsque vous effectuez une nouvelle recherche.

Il fonctionne sans remappage en utilisant les commandes automatiques CursorMovedet InsertEnter.

Jon Parise
la source
Cette technique (utilisant des autocommandes) est bien meilleure que ma réponse, et je ne peux pas croire que je n'y ai pas pensé quand j'ai écrit la mienne. Upvote.
Rich
5

J'utilise <Leader><Enter>comme raccourci vers :noh. (Mon chef est ,, donc c'est assez proche)

Cela désactivera les surbrillances jusqu'à votre prochaine recherche.

Amit Gold
la source
3

Comme vous l'avez déjà noté dans votre propre réponse , il est beaucoup plus efficace de désactiver la mise en surbrillance avec la :nohlsearchcommande (qui peut être abrégée en :noh) plutôt que de désactiver l'intégralité de la fonctionnalité, puis de la réactiver lors de votre prochaine recherche.

Si vous souhaitez désactiver la mise en surbrillance à chaque fois que vous utilisez pour passer en imode insertion, vous pouvez créer un mappage simple pour ce faire:

:nnoremap i :noh<cr>i

Il s'agit d'un exercice pour le lecteur de créer des mappages similaires pour d'autres commandes où il souhaite désactiver la mise en surbrillance.

Riches
la source
2

Cela peut sembler stupide ou naïf, mais ce que je fais quand je veux arrêter la mise en évidence, c'est que je recherche une chaîne aléatoire qui (pratiquement certainement) n'est pas présente dans le document. Quelque chose comme ça:

/skljdfhadhfs

Certes, cela prend quelques touches, mais elles sont vraiment aléatoires, elles peuvent donc être tapées en un rien de temps.

Kostas
la source
1
Mais cela fait net Nne fonctionne plus, et aussi des choses comme :%s//somethingou :g//something. Il encombre également votre historique de recherche
DJMcMayhem
Oui, mais mon hypothèse (probablement incorrecte) est que puisque vous n'avez plus besoin de surligner, vous ne vous souciez pas non plus de cette recherche particulière. L'encombrement de l'historique des recherches est un vrai problème, si l'on se fie à lui.
Kostas
1

J'ai trouvé plus intuitif de remapper le Ctrl- Lrepeindre pour inclure :nohls:

nnoremap <C-L> :nohls<cr><C-L>
DanG
la source
Bienvenue chez Vi et Vim ! Merci de partager vos connaissances sur ce qui est certes une vieille question. Les réponses de haute qualité, comme vous l'avez peut-être remarqué, sont généralement accompagnées d'une explication de ce que fait le code (cela est particulièrement utile pour les nouveaux vimmers qui pourraient atterrir ici sans beaucoup de connaissances). Cela peut aussi être une bonne idée pour les :helpsections pertinentes !
D. Ben Knoble
0

J'utilise <Leader><Enter>comme raccourci :hlset mon leader est défini comme espace.

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

Après avoir recherché un élément sera mis en surbrillance, pour le désactiver, appuyez sur <Space><Esc>. Et si vous décidez de réafficher les résultats de la recherche, appuyez sur <Space><Esc>. Les hls!moyens mappent cette liaison de clé pour basculer le paramètre pour hls(raccourci pour hlsearch, c'est-à-dire surligner les résultats de la recherche) (donc le !bascule le paramètre juste avant).

James Affleck
la source
-1

Ajoutez cette macro à votre .vimrc

map #h :set hls!<CR>

Cela vous permettra de basculer le hilighting avec #h

Darrel Lee
la source
Ce n'est pas différent de la réponse de James Affleck.
jamessan
Le mien semble plus concis.
Darrel Lee
Pourquoi la concision est-elle pertinente? L'autre article donne plus d'informations sur la signification des parties de la commande et cet article ne fournit aucun contenu supplémentaire.
jamessan