Vim efface la mise en évidence de la dernière recherche

1904

Après avoir effectué une recherche dans Vim, j'obtiens toutes les occurrences en surbrillance. Comment puis-je désactiver cela? Je fais maintenant une autre recherche pour quelque chose de charabia qui ne peut pas être trouvé.

Existe-t-il un moyen de désactiver temporairement la surbrillance et de la réactiver en cas de besoin?

Gabriel Solomon
la source
197
Je pense que la solution "nnoremap <esc>: noh <return> <esc>" est une réponse plus complète à la question. de la recherche précédente (mais ne désactivez pas la mise en évidence pour de bon).
Stewart Johnson
5
: set invhlsearch désactivera la surbrillance si elle est déjà en surbrillance et l'activer si ce n'est pas le cas. Vous pouvez le cartographier pour dire Shift-H.
puffadder
1
@StewartJohnson faisant cela dans mes fichiers .vimrc semble interférer / rompre avec: set mouse = a. Des idées pourquoi? Cette erreur ne se produit que dans iTerm2
Charlie Parker
20
@StewartJohnson Soyez prudent! Votre commentaire le mieux noté avec le mappage provoque des erreurs et un comportement inattendu comme décrit dans les commentaires ci-dessous à stackoverflow.com/a/1037182/1698467
skywinder
3
La nnoremap <esc> :noh<return><esc>solution suggérée par @StewartJohnson fonctionne bien dans GUI vim, mais pose des problèmes avec les touches fléchées et autres clés codées ESC lors de l'exécution de vim dans un terminal. Ne pas le mettre dans votre ~/.vimrc sans elle dans l' emballage if has('gui_running')... end.
jbyler

Réponses:

1588

Pour désactiver la mise en surbrillance jusqu'à la prochaine recherche:

:noh

Ou désactivez complètement la mise en surbrillance:

set nohlsearch

Ou, pour le basculer:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>
Mykola Golubyev
la source
14
En faisant set nohlsearch, la surbrillance revient lorsque vim est redémarré. :nohfonctionne mieux.
Dharmit
21
il est ennuyeux de trouver une chaîne de charabia: / oajf3w9 aussi rapide que de taper: noh. J'aime la solution de @ avocade de mappage de la clé d'espace à: noh
nnyby
160
Cela ne ressort pas clairement de cette réponse et de ces commentaires: notez que set nohlsearchcela désactivera également la mise en évidence pour les prochaines recherches. Le comportement de :nohest très différent: la mise en surbrillance sera automatiquement réactivée lorsque vous effectuez une nouvelle recherche ou même lorsque vous effectuez quelque chose en rapport avec la recherche en cours (par exemple lorsque vous tapez npour passer à l'élément suivant).
Skippy le Grand Gourou
10
Aucune explication de ce que cela fait réellement et des conséquences. Merci à @SkippyleGrandGourou pour en avoir expliqué une partie.
Jason S
3
Pour ce que ça vaut, je mappe ceci à '\/'(ou quel que soit votre chef):map <Leader>/ :nohlsearch<CR>
brianmearns
689

De la documentation VIM

Pour effacer le dernier modèle de recherche utilisé:

:let @/ = ""

Cela ne définira pas le modèle sur une chaîne vide, car cela correspondrait partout. Le motif est vraiment effacé, comme lors du démarrage de Vim.

Shaun Bouckaert
la source
129
... ce qui serait une meilleure solution à son problème si je comprends bien.
Shaun Bouckaert
8
C'est ce que je cherchais! Je l'ai voté, la question est un peu vague. Cela m'a amené à penser que c'est ce qu'il voulait: "Je fais maintenant une autre recherche pour quelque chose de charabia qui ne peut pas être trouvé". Parce que c'est ce que je faisais pour effacer la recherche, mais pas la désactiver pour que la prochaine recherche soit à nouveau mise en évidence.
claytron
50
Voici ce que je pensais que la question concernait ... voici une commande que j'ai faite pour accélérer l'effacement de la chaîne de recherche (et donc supprimer tous les surlignages): L' :command C let @/=""utilisation de ceci vous permet de taper :Cpour effacer la chaîne de recherche ... très rapidement et n'affecte pas la recherche ou la mise en évidence futures.
Jason
12
@ jcreamer898, voir l'aide de vim sur "registres" ( :he registers). Vim a plusieurs registres intégrés différents qui contiennent du texte, parfois pour les données extraites, parfois pour la dernière recherche, etc. Lorsque vous effectuez une recherche, vim place le modèle dans le registre "/", que vous référencez à l'aide @/. Vous pouvez également affecter des valeurs aux registres en utilisant @regname=valueregnameest le est le nom du registre. Donc, il @/=""suffit de définir le registre "/" sur une chaîne vide (sauf que pour le registre "/", vim effacera la dernière recherche s'il contient une chaîne vide).
Ben Davis
3
Ajoutez ceci à votre .vimrc pour obtenir Ctrl + / pour effacer la dernière recherche: noremap <silent> <c-_> :let @/ = ""<CR>
angrydust
583

Tu peux faire

:noh

ou :nohlsearchpour désactiver temporairement la mise en évidence de la recherche jusqu'à la prochaine recherche.

Matt McMinn
la source
3
merci, cela a été utile ... une commande pour retourner le point culminant?
Gabriel Solomon
17
: nohs coupe simplement la surbrillance actuelle. Si vous avez: défini hlsearch, il continuera à mettre en évidence vos recherches.
greyfade
6
Je pense que c'est ce que le PO recherchait (bien que la réponse de Shaun fonctionne aussi). Je vote pour être plus petit. Je sais qu'il a accepté la réponse de nohls, mais la définir désactivera tous les surlignages de recherche, même si une autre recherche est tentée par la suite.
Thiago Arrais
5
C'est probablement ce que le PO voulait en premier lieu et c'est la réponse la plus courte et la meilleure à mon humble avis.
La perfection est réalisable même dans ce domaine mortel! Je vais utiliser cela plus que: aide, et je ne veux pas polluer <esc>: nnoremap <F1>: noh <CR>
Sam Watkins
305

J'ai trouvé cette réponse il y a des années sur vim.org:

Ajoutez ce qui suit à votre .vimrc:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

Ainsi, après votre recherche, appuyez à nouveau sur retour en mode commande et la mise en surbrillance disparaît.


la source
36
Je pense que c'est une bien meilleure solution que celle qui a été réellement acceptée - celle-ci ou l'autre où elle est mappée à <ESC> à la place.
Stewart Johnson
20
C'est une bien meilleure réponse à "nnoremap <esc>: noh <return> <esc>" car elle ne provoque pas de comportement étrange.
Dennis
19
Une chose importante à noter, assurez-vous de ne pas mettre de commentaires sur le côté droit d'un remappage. Ils seront interprétés comme des commandes de remappage par opposition à des commentaires.
codybuell
13
Le commentaire est faux; la commande ne désactive pas le dernier motif de recherche mais désactive simplement la mise en évidence des résultats actuels; vous pouvez appuyer sur npour trouver l'occurrence suivante (qui sera à nouveau mise en évidence). BTW, lors de l'écriture de scripts, j'évitais la forme abrégée et j'écrivais à la place :nohlsearch.
Tobias
28
Ajoutez <silent> pour éviter que l'affichage ne clignote et ne laisse noh dans la ligne de commande -: nnoremap <silent> <CR>: nohlsearch <CR> <CR>
Peter N Lewis
137

Depuis http://twitter.com/jonbho/status/2194406821

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[

La deuxième ligne est nécessaire pour le mappage à la clé d'échappement, car Vim utilise en interne d'échappement pour représenter les clés spéciales.

Baruch Even
la source
12
Juste pour être clair, cela vous permet d'effacer la surbrillance de recherche en appuyant sur la touche Échap
Gavin Miller
7
Pour une raison quelconque, cela fait que mon terminal vim démarre comme si "c" était pressé. Des idées?
Jacob
31
Cela a provoqué un comportement très étrange lorsque je l'ai essayé: au démarrage, les mouvements réguliers de Vim (par exemple j, k) entraînaient la suppression des lignes. nnoremap <CR>: noh <CR> <CR> n'a pas causé ces problèmes. Je n'ai pas pu retrouver la cause profonde.
oasisbob
9
hmm, j'ai eu le même problème que ceux ci-dessus. N'utilisez pas cela tel quel sans tester, sauf si vous aimez supprimer votre texte au hasard ...
Derek Litz
8
l'utilisation de "nnoremap <esc>: noh <return> <esc>" fait que vim démarre toujours en mode "REMPLACEMENT".
user1850133
38

Ma solution d'origine (ci-dessous) était sale et inutile. J'utilise maintenant:noh

Comme de nombreuses fonctionnalités de Vim, la bonne façon n'est souvent pas facilement détectable.

-

(NE FAITES PAS CELA)

Recherchez une séquence de caractères improbable (écrasez les touches sur la ligne d'accueil):

/;alskdjf;

Cela fonctionne dans vim et moins, et il est plus facile de se rappeler / taper que la solution logiquement plus propre de @ ShaunBouckaert "pour effacer le dernier motif de recherche utilisé":

:let @/ = ""

Un inconvénient potentiel est qu'il ajoute de la malbouffe à votre historique de recherche.

Millerdev
la source
17
Non seulement c'est une sale solution (que j'ai moi-même utilisée jusqu'à présent, pas d'infraction), un autre inconvénient est qu'elle ajoute une bannière rouge laide disant "motif introuvable" au bas de la fenêtre, ce qui est presque aussi ennuyeux que la mise en évidence lui-même et nécessite que d'autres actions soient rejetées (par exemple, "recherche + retour arrière").
Skippy le Grand Gourou
5
Cela peut également prendre quelques secondes, car il recherche en fait tout le reste du fichier. C'est vraiment ennuyeux si le fichier est volumineux. Bien sûr, vous pouvez marquer votre position actuelle, sauter au début et rechercher un personnage en arrière, mais c'est tout aussi sale.
Blacklight Shining
5
C'est la solution que la plupart auront utilisée avant de découvrir la :nohlcommande. Une fois que j'ai entendu parler de ce dernier, je me suis immédiatement arrêté pour faire ces recherches.
Tobias
7
Ce n'est pas une réponse; il recommande simplement de faire ce que OP fait déjà: "Je fais maintenant une autre recherche pour quelque chose de charabia qui ne peut pas être trouvé."
Reinstate Monica - notmaynard
2
Si vous voulez un motif à toute épreuve et court, utilisez-le /$4. Il est non seulement improbable de correspondre à quelque chose, mais en fait complètement IMPOSSIBLE. $doit toujours être suivi d'une nouvelle ligne ou être la fin du fichier, et 4 n'est ni une nouvelle ligne ni la fin du fichier. (La raison de 4 en particulier est simplement qu'il est sur la même touche, il est donc très facile de taper rapidement)
point
32

Remappé dans mon fichier .vimrc.local, rapide et sale mais très fonctionnel:

" Clear last search highlighting
map <Space> :noh<cr>
avocat
la source
32
nnoremap <cr> :noh<CR><CR>:<backspace>

De cette façon, je me débarrasse de :nohla ligne de commande lorsque je frappe enteraprès la recherche.

:c'est comme commencer à saisir une nouvelle commande, l' Backspaceeffacer et remettre le focus dans la fenêtre de l'éditeur.

sjas
la source
6
Je vous remercie. Le ": noh" apparaissant en bas à gauche me rendait fou, putain de TOC.
andrewtweber
J'essayais de le mapper sur cr décalé en faisant nnoremap <S-cr>: noh <CR> <CR> mais cela n'a pas fonctionné, savez-vous pourquoi cela pourrait ne pas fonctionner?
Charlie Parker
Je soupçonne que vous ne pouvez pas combiner quart de travail et retour, mais honnêtement, je n'en ai aucune idée.
sjas
@CharlieParker IIRC, vous ne pouvez utiliser que shift on [a-z]et ces caractères.
sjas
7
Au lieu de faire :<Backspace>, vous pouvez simplement ajouter <silent>après le nnoremapdire Vim pour ne pas afficher une sortie dans la zone de commande: nnoremap <silent> <cr> :noh<CR><CR>.
Soren Bjornstad
31

Les réponses proposant :nohou :nohlsearch(par exemple, Matt McMinn) sont correctes pour désactiver temporairement la mise en évidence de la recherche - comme demandé dans la question d'origine.

J'ai pensé apporter une cartographie que je trouve utile en mode Normal:

nnoremap <C-L> :nohlsearch<CR><C-L>

Par défaut, CtrlLdans Vim efface et redessine l'écran. Un certain nombre de programmes en ligne de commande (principalement ceux utilisant la bibliothèque GNU Readline , tels que Bash) utilisent la même combinaison de touches pour effacer l'écran. Cette fonctionnalité est utile dans le cas où un processus exécuté en arrière-plan s'imprime sur le terminal, écrasant des parties du processus de premier plan.

Ce mappage en mode Normal efface également la mise en évidence du terme de recherche le plus récent avant de redessiner l'écran. Je trouve que les deux fonctionnalités se complètent et il est pratique d'en utiliser une CtrlLpour les deux actions ensemble plutôt que de créer un mappage distinct pour désactiver la mise en évidence de la recherche.

NB: noremap est utilisé plutôt mapqu'autrement, le mapping serait récursif.

Astuce: En général , je remap Caps Lockpour Ctrlle rendre plus facile à saisir ces combinaisons de touches; les détails pour ce faire dépendent de votre choix de système d'exploitation / de fenêtrage (et sont hors sujet pour cette réponse). Les deux conseils suivants contiennent des informations sur la cartographie Caps Lockà Ctrlainsi que Esc:

Anthony Geoghegan
la source
26

Je mappe généralement :nohà la touche barre oblique inverse. Pour réactiver la mise en surbrillance, appuyez simplement sur n, et elle sera à nouveau mise en surbrillance.

Homme des cavernes
la source
24

Désactiver la mise en évidence de la recherche de façon permanente

Les correspondances ne seront pas mises en évidence lorsque vous effectuez une recherche à l'aide de /

:set nohlsearch

Effacer la surbrillance jusqu'à la prochaine recherche

:noh

ou :nohlsearch(efface jusqu'à ce que nou Nsoit appuyé)


Effacer la surbrillance en appuyant sur ESC

nnoremap <esc> :noh<return><esc>

Effacer la surbrillance en appuyant sur une autre touche ou une carte personnalisée

  • Effacer les reflets en appuyant sur \(barre oblique inverse)

    nnoremap \ :noh<return>
    
  • Faits saillants clairs en frappant ESCdeux fois

    nnoremap <esc><esc> :noh<return>
    
Sheharyar
la source
2
La nnoremap <silent> <esc> :noh<return><esc>solution fonctionne bien dans GUI vim, mais provoque de graves problèmes avec les touches fléchées et autres clés codées ESC lors de l'exécution de vim dans un terminal. Ne pas le mettre dans votre ~/.vimrc sans elle dans l' emballage if has('gui_running')... end. Pensez également à ajouter le <silent>qui évite de flasher la :nohcommande dans la barre d'état.
jbyler
17

Voici ce que j'utilise (extrait d'un grand nombre de questions / réponses différentes):

nnoremap <silent> <Esc><Esc> :let @/=""<CR>

Avec "double" Escvous supprimez la surbrillance, mais dès que vous effectuez une nouvelle recherche, la surbrillance réapparaît.


Une autre alternative:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>

Selon la documentation de vim:

clearmatches ()

    Clears all matches previously defined by |matchadd()| and the

    |:match| commands.
Pablo Olmos de Aguilera C.
la source
J'ai rencontré quelques bugs dans les meilleures solutions, donc pour gagner du temps en essayant toutes les réponses. Utilisez cette solution! Modifiez votre .vimrcet mettez-y l'entrée suivante:nnoremap <silent> <Esc><Esc> :let @/=""<CR>
ani627
Mais c'est ce que ça dit Oo Peut-être que tu pourrais voter?
Pablo Olmos de Aguilera C.
Je soutiens votre solution ... C'est la meilleure que je connaisse ... Et j'ai également voté pour elle .. :)
ani627
1
Effacer le registre de recherche avec @/=""a pour effet secondaire de nne pas fonctionner pour récupérer votre recherche. Je préfère :nohqui conserve la recherche précédente dans le registre pour une réutilisation.
jbyler
11

Pour désactiver la surbrillance jusqu'à la prochaine recherche

:noh

Illustration visuelle

arcseldon
la source
10

Si le plugin incsearch.vim est installé, il existe un paramètre pour effacer automatiquement la surbrillance après la recherche:

let g:incsearch#auto_nohlsearch = 1

entrez la description de l'image ici

Deqing
la source
8

Janus pour VIM et GVIM a un certain nombre de choses préparées pour les newbs comme moi, y compris

<leader>hs - toggles highlight search

c'est exactement ce dont vous avez besoin. Tapez simplement \hsen mode normal. (La clé de repère est mappée \par défaut.)

HTH.

Paul-Sebastian Manole
la source
7

Il existe deux plugins indispensables pour cela:

  1. sensible - Ctrl-lpour nohlsearch et redraw screen.
  2. unimpared - [oh, ]ohet cohpour contrôler hlsearch.
dkiyatkin
la source
cohfonctionne toujours, bien qu'il y ait un message suggérant d'utiliser yohsi vous utilisezcoh
avinashkrsharma
7

Désactivez la mise en surbrillance dès que vous déplacez le curseur:

Installez vim-cool . Il a été créé pour résoudre ce problème spécifique. Il désactive la mise en surbrillance dès que vous déplacez le curseur. Attention cependant, cela nécessite une version récente de vim!

00prometheus
la source
6

Cela effacera la surbrillance de la recherche après des updatetimemillisecondes d'inactivité.

updatetimepar défaut à 4000ms ou 4s mais j'ai mis le mien à 10s. Il est important de noter que cela updatetimefait plus que cela, alors lisez les documents avant de le modifier.

function! SearchHlClear()
    let @/ = ''
endfunction
augroup searchhighlight
    autocmd!
    autocmd CursorHold,CursorHoldI * call SearchHlClear()
augroup END
Kevin Cox
la source
6

Si vous souhaitez pouvoir activer / désactiver la mise en surbrillance rapidement , vous pouvez mapper une clé sur

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

Mettez simplement l'extrait ci-dessus dans votre fichier .vimrc.

C'est le moyen le plus pratique pour moi d'afficher et de masquer la surbrillance de recherche avec un coup de touche

Pour plus d'informations, consultez la documentation http://vim.wikia.com/wiki/Highlight_all_search_pattern_matches

Amaynut
la source
5

Encore une solution en combinant 2 réponses principales:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>
skywinder
la source
Effacer le registre de recherche avec @/=""a pour effet secondaire de nne pas fonctionner pour récupérer votre recherche. Je préfère :nohqui conserve la recherche précédente dans le registre pour une réutilisation. Vous pouvez vous y lier <F3>avecnnoremap <F3> :noh<CR>
jbyler
4

J'utilise simplement le nohl simple ci-dessous et aucun plugin n'est nécessaire.

:nohl

Stryker
la source
4

Je suppose que la question initiale concernait la non désactivation mise en surbrillance de la recherche, mais simplement la suppression de la mise en surbrillance de la dernière recherche. La solution de la recherche d'une chaîne de charabia, mentionnée par l'affiche originale, est celle que j'utilise depuis un certain temps pour effacer la mise en évidence d'une recherche précédente, mais c'est moche et encombrant.

Plusieurs suggestions que j'ai trouvées à ajouter nnoremap ...à ~ / .vimrc ont pour effet ici de mettre vim en mode de remplacement au démarrage, ce qui n'est pas du tout ce que je veux. La solution la plus simple que j'ai trouvée est d'ajouter la ligne

nmap <esc><esc> :noh<return>

à mon ~ / .vimrc. Cela tient compte du principe KISS et n'interfère pas avec les touches fléchées, ce que fait en utilisant un seul <esc>. Un double- <esc> est requis en mode commande (ou un triple- <esc> en mode insertion ou remplacement) pour effacer la surbrillance d'une recherche précédente, mais du point de vue de l'interface utilisateur, cela rend l'opération à peu près aussi simple que possible.

Lindsay Haisley
la source
Que voulez-vous dire par le simple <esc> interférant avec les touches fléchées?
hansmosh
1
@hansmosh Voir unix.stackexchange.com/questions/28713/… J'utilise deux lignes dans mon .vimrc comme suit nmap <esc><esc> :noh<return> - to turn off search highlighting and nmap <esc>` :set hlsearch<return> - to turn on search highlighting
Lindsay Haisley
4

J'utilise ce qui suit dans mon ~/.vimrc

nnoremap <Leader><space> :noh<Enter>

Cela rend très facile et rapide l'effacement de la recherche en surbrillance actuelle. Ma touche de repère est mappée à \ce qui rend l'action très facile à effectuer avec mon doigt et mon pouce pinky droit.

John Slavick
la source
3

Je pense que mélanger @ShaunBouckaert et les réponses du 19 mars 2009 à 16:22 est un bon compromis:

" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

Appuyez sur Enteret le texte en surbrillance n'est plus en surbrillance, tandis que la mise en surbrillance de la recherche est toujours activée.

Ekans
la source
3

vous pouvez utiliser : noremap pour activer / désactiver le résultat de la recherche, comme ceci

:noremap <F3> :set hls! hls?<CR>

caopeng
la source
3

Sur la base de la réponse @ baruch-even, vous pouvez supprimer le terme de recherche en appuyant ESCdeux fois en mode normal avec:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[
dinigo
la source
Je pense que la deuxième reliure est OK, mais la première est dangereuse. Le remappage <esc>fonctionne bien dans GUI vim, mais provoque de graves problèmes avec les touches fléchées et autres clés codées ESC lors de l'exécution de vim dans un terminal. Ne pas le mettre dans votre ~/.vimrc sans elle dans l' emballage if has('gui_running')... end. Pensez également à ajouter le <silent>qui évite de flasher la :nohcommande dans la barre d'état.
jbyler
1

Je n'aime pas ça non plus. Je trouvais fastidieux d'entrer :nohltout le temps ... alors j'ai mis la cartographie suivante dans mon.vimrc

noremap <C-_> :nohl<cr>:<backspace>

Le premier bit ( :nohl<cr>) efface la surbrillance; le deuxième bit ( :<backspace>) est une astuce pour nettoyer la ligne de commande. La recherche est toujours là en arrière-plan, donc si vous appuyez simplement ndessus, elle sera re-surlignée et vous amènera à l'occurrence suivante.

ricardo
la source
1

J'ai ajouté ceci à mon vimrcdossier.

command! H let @/=""

Après avoir fait une recherche et que vous souhaitez effacer les faits saillants de votre recherche, faites :H

pixel 67
la source
1

Vous pouvez également ajouter un mappage sur votre fichier .vimrc comme,

nmap <C-N>: nohlsearch

puis vous pouvez appuyer sur

Ctrl + N

à tout moment pour effacer le texte en surbrillance

Leo
la source
Veuillez modifier votre réponse pour vous assurer qu'elle améliore les autres réponses déjà présentes dans cette question.
Hongsy