Comment empêcher Vim de mettre en surbrillance les correspondances après un remplacement?


13

J'ai set hlsearchdans mon ~/.vimrc. Ceci est normalement très utile, mais c'est ennuyeux à faire :nohaprès avoir fait un remplacement comme '<,'>s/$/',/(qui met en évidence la fin de chaque ligne après l'avoir exécutée). Comment puis-je ne vimpas surligner après avoir remplacé comme ça?

Je suis sur Ubuntu 9.04 avec vim7.2. J'ai le même problème sur OS X 10.6 (également vim7.2). Quelque chose qui fonctionnerait sur les deux serait souhaitable.

MISE À JOUR: Toutes les réponses que j'ai reçues ne font qu'ajouter un mappage de clés à faire :noh(ou un équivalent). J'essaie vraiment d'éviter les comportements de touches personnalisés auxquels je m'habituerais vraiment, mais je me fais lamentablement échouer sans eux (par exemple sur l'ordinateur d'un ami, etc.). Je voudrais le vimfaire automatiquement :nohaprès avoir fait un remplacement. Autrement dit, je ne veux que hlsearchlorsque vous utilisez /ou *(peut-être quelques autres cas), mais pas à d'autres moments.

Réponses:


7

Si vous ne souhaitez pas désactiver définitivement, vous pouvez lier une clé pour basculer la surbrillance comme suggéré dans cette réponse à une question similaire sur stackoverflow.

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

Si vous souhaitez désactiver définitivement la surbrillance:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(à partir de la FAQ VIM )


2
J'étais au courant de cette option. Le problème est que je ne recherche généralement pas ce que je veux remplacer, il est donc inutile de souligner dans la plupart des cas que je remplace. Cependant, il est très utile quand je suis cherche quelque chose, donc je ne veux pas qu'il aille complètement loin.
Benjamin Oakes

@Benjamin: Vous l'avez implicitement recherché. C'est ce que: fait. Recherche un modèle, puis effectue une transformation sur la ou les correspondances. Utiliser: nohl est la bonne solution car il désactive la surbrillance du modèle de recherche actuel jusqu'à ce que la prochaine recherche soit effectuée. Il le fait sans changer l'état de l'option 'hlsearch' ni affecter la valeur stockée du terme de recherche précédent.
jamessan

2
@jamessan: Je comprends que c'est une recherche et un remplacement. C'est juste que je n'en ai pas besoin alors mis en évidence. Surtout un ennui plus que tout.
Benjamin Oakes

Il y a peu de temps, j'ai commencé à désactiver la surbrillance par défaut et à l'activer quand je le voulais, comme vous l'avez suggéré. Toujours pas parfait, mais c'est mieux.
Benjamin Oakes

9

J'ai deux solutions différentes, toutes deux assez bonnes, chacune avec un comportement différent nuancé. Mon préféré est l'option 2:

  1. J'ai les 2 lignes suivantes dans mon .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Le premier attend un timeout (non configurable) si le curseur ne bouge pas et désactive hlsearch. Le second le rallume si le curseur se déplace à nouveau.

    Ce n'est pas une solution parfaite, mais cela fonctionne pour moi (et sera presque parfait lorsque le délai est configurable - pour l'instant, le délai est lié à une minuterie intégrée pour vim.)

  2. Ou vous pouvez essayer ces lignes:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

Cela désactive hlsearch après un bref délai sans mouvement du curseur et le rallume pour les commandes de recherche standard. Il ne couvre pas toutes les possibilités de réactiver la recherche, mais il suffit d'un démarreur pour la preuve de concept.


Merci pour la mise à jour - je ne l'ai pas vue jusqu'à présent. (On dirait que vous venez de l'ajouter aussi? C'est drôle.) C'est un concept génial; Je vais devoir jouer avec.
Benjamin Oakes

La mise en garde de 2. est que la recherche en mode visuel Vne fonctionne pas
Bryce Guinta

J'ai modifié la première ligne de l'option 1 avec ce qui suit autocmd cursorhold * set nohlsearch | let @/ = "" Cela effacera le registre de recherche et supprimera la surbrillance. Je n'ai pas passé beaucoup de temps avec cette configuration mais je voulais la mettre là-bas pour ceux qui finissent ici.
Berkeley Martinez

2

Je tape simplement "/ asdf" (en supposant que "asdf" n'est pas dans le fichier) pour se débarrasser de la surbrillance. Je sais que c'est assez simpliste, mais ça marche pour moi.


2
C'est la même idée que :noh, mais cela ne fonctionne pas toujours. :) C'est drôle, vous le mentionnez cependant: j'avais un ami qui tapait toujours son nom car il revenait moins souvent que quelque chose comme "asdf" dans ce qu'il écrivait. (Un peu drôle, je pense.)
Benjamin Oakes

Vrai. Peut-être que je me souviendrai: non la prochaine fois.
Greg Graham

1

Mettez ce qui suit dans votre fichier .vimrc:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

Cela masquera silencieusement le terme de recherche en surbrillance mais ne désactivera pas la :set hlsearchfonctionnalité. Il est réactivé lors de la prochaine recherche.


Il est préférable d'utiliser simplement la commande intégrée conçue à cet effet -: nohl. Ensuite, vous ne soufflez pas le contenu de votre registre de recherche, qui est utilisé pour des choses comme passer à la correspondance suivante, la valeur par défaut d'un modèle quand aucun n'est spécifié, etc.
jamessan

Oui, mais cela m'a ennuyé que ma prochaine recherche n'ait pas été mise en évidence comme supposé. Je viens donc avec cette solution rapide. C'est peut-être aussi sale mais ça marche. Je pense que c'est acceptable pour vim - même si je n'utiliserais pas de choses "sales" dans le code source d'un vrai, gros projet.
Gregor Müllegger

1

Une autre possibilité consiste à réinitialiser le @/registre (qui est en fait un registre de lecture-écriture) après avoir effectué la substitution. Cela restaure le point culminant précédent:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

Cependant, cela pose encore quelques problèmes:
- au lieu de le modifier :s, il définit une nouvelle commande. Bien qu'il soit possible d'utiliser cabbrevla carte :spour :S, je ne connais pas moyen d'attraper toutes les constructions telles que :<range>s.
- si vous avez utilisé :nohlprécédemment pour masquer une seule recherche, cela mettra en évidence la recherche précédente. Je ne connais aucun moyen de savoir si a :nohlété appelé précédemment. (Il pourrait être possible de contourner cela et de remplacer la :nohlcommande, mais cela nécessiterait également de remplacer toutes les commandes de recherche, ce qui pourrait être trop ...).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.