Quelle est la différence fonctionnelle entre: nohlsearch et: set nohlsearch?

13

J'ai remarqué que lorsque j'utilise :nohlsearchcela, cela ne fait pas la même chose que :set nohlsearch.

En particulier, le hlsearchréglage n'est pas réellement désactivé (ce qui est le cas :set hlsearch).

Pour démontrer ce que je veux dire:

:set hlsearch
:nohlsearch
:echo &hlsearch

Cela s'imprime 1( hlsearch est toujours défini! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Cela s'imprime 0car nous avons désactivé hlsearch en utilisant la méthode standard pour désactiver un paramètre dans vim.

Je me demande donc en quelque sorte parce qu'il doit y avoir une raison réelle pour que la :nohlsearchcommande ex existe.

La raison pour laquelle je m'inquiète est que j'ai maintenant besoin dans mes scripts vim de tester si la mise en évidence de la recherche est active, et puisque j'utilisais à la :nohlsearchplace de ": set nohlsearch" dans mes autres scripts, mon &hlsearchtest revient toujours 1. Je me demande donc ce que je change en n'utilisant plus la nohlsearchcommande ex.

Steven Lu
la source

Réponses:

15

De :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Arrêtez la mise en évidence de l'option 'hlsearch'. Il
                        est automatiquement réactivé lors de l'utilisation d'une recherche
                        ou en définissant l'option 'hlsearch'.
                        Cette commande ne fonctionne pas dans une autocommande, car
                        l'état de surbrillance est enregistré et restauré lorsque
                        exécution des autocommandes autocmd-searchpat.
                        Même chose pour l'invocation d'une fonction utilisateur.

Le point clé est qu'il active automatiquement la surbrillance lorsque vous lancez une nouvelle recherche. :set nohlsearchs'éteint en fait hlsearch, ce qui signifie que la prochaine fois que vous rechercherez quelque chose, aucune surbrillance ne se produira.

Exemple: Supposons que la fonction hlsearchest activée . Si vous recherchez actuellement "bonjour" dans un tampon, tous les "bonjour" seront mis en surbrillance. Si vous n'utilisez :nohlsearchrien sera mis en évidence. Mais si vous recherchez ensuite "monde", tous les "mondes" seront mis en surbrillance. Si vous aviez utilisé à la set nohlsearchplace "world" ne serait pas mis en évidence.


Notez également que cette commande ne fait pratiquement rien à l'intérieur d'une fonction utilisateur. Par exemple,

function! NoHlsearch()
    nohlsearch
endfunction

n'a aucun effet visible lors de l'exécution.


Pour voir si hlsearch est réellement actif, vous voulez vérifier la variable v:hlsearch. Lorsque la v:hlsearch = 0mise en surbrillance est désactivée et lorsque la v:hlsearch = 1mise en surbrillance est activée. Vous devriez probablement vous assurer que le &hlsearch = 1avant de vérifier v:hlsearch.

De :h v:hlsearch

                                        v: hlsearch variable-hlsearch
v: hlsearch Variable qui détermine si la mise en surbrillance de la recherche est activée.
                N'a de sens que si «hlsearch» est activé, ce qui nécessite
                + extra_search. Mettre cette variable à zéro agit de la même manière
                : commande nohlsearch, le définir sur un agit comme
                        let & hlsearch = & hlsearch
FDinoff
la source
Pouvez-vous clarifier ce que vous entendez par «essentiellement rien» de l'intérieur d'une fonction? Il fait la chose standard (il arrête temporairement de surligner la recherche jusqu'à ce que la prochaine recherche soit invoquée).
Steven Lu
J'espère également trouver un moyen d'accéder au drapeau qui contrôle si le transitoire :nohlsearchest en vigueur ou non ... Je pense qu'en son absence, je dois recourir au suivi de tous les :nohlsearchappels avec une variable.
Steven Lu
@StevenLu voir les modifications.
FDinoff
Merci. On dirait que le code que j'ai utilisé des hacks autour de l'aspect "ne rien faire" en faisant ceci: nnoremap <silent> <expr> <boundkey> SearchHighlight()SearchHighlight()peut retourner une chaîne ":silent nohlsearch\<CR>". Merci aussi pour l' v:hlsearchastuce, juste ce dont j'avais besoin.
Steven Lu
1

Votre script requiert-il que l'état actuel de la mise en évidence soit connu?

Pour désactiver hlsearchuniquement la recherche en cours, j'utilise Ctrl-l, avec ceci dans mon .vimrc:

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

La mise en surbrillance de la recherche revient à la recherche suivante lorsque vous utilisez la commande ci-dessus. Ctrl-lest pratique car son utilisation normale consiste à effacer et à redessiner l'écran.

Pour modifier l'état de mise en surbrillance de la recherche de manière permanente ou désactivée, j'utilise F3 comme bascule:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
thisoldman
la source