Qual é a diferença funcional entre: nohlsearch e: set nohlsearch?

13

Percebi que, quando eu uso, :nohlsearchele realmente não faz a mesma coisa que :set nohlsearch.

Em particular, a hlsearchconfiguração não é realmente desativada (que é o que :set hlsearch) realiza.

Para demonstrar o que quero dizer:

:set hlsearch
:nohlsearch
:echo &hlsearch

Isso é impresso 1( hlsearch ainda está definido! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Isso é impresso 0porque desativamos o hlsearch usando a maneira padrão de desativar uma configuração no vim.

Então, eu meio que me pergunto, porque deve haver alguma razão real para o :nohlsearchcomando ex existir.

A razão pela qual me preocupo é que agora tenho uma necessidade no script do vim para testar se o destaque da pesquisa está ativo e, como eu estava usando, em :nohlsearchvez de ": set nohlsearch", nos meus outros scripts, meu &hlsearchteste sempre retorna 1. Então, eu estou querendo saber o que estou mudando por não usar mais o nohlsearchcomando ex.

Steven Lu
fonte

Respostas:

15

A partir de :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Interrompa o realce da opção 'hlsearch'. isto
                        é reativado automaticamente ao usar uma pesquisa
                        comando ou definir a opção 'hlsearch'.
                        Este comando não funciona em um comando automático, porque
                        o estado de destaque é salvo e restaurado quando
                        executando comandos automáticos autocmd-searchpat.
                        O mesmo vale para quando invocar uma função de usuário.

O ponto principal é que ele volta a realçar automaticamente quando você inicia uma nova pesquisa. :set nohlsearchna verdade, é hlsearchdesativado, o que significa que na próxima vez que você procurar por algo, nenhum destaque ocorrerá.

Exemplo: Suponha que hlsearchesteja ativado . Se você estiver pesquisando "olá" em um buffer, todos os "olá" serão destacados. Se você usar :nohlsearchnada será destacado. Mas se você procurar "mundo", todos os "mundos" serão destacados. Se você tivesse usado set nohlsearch"mundo", não seria destacado.


Observe também que este comando basicamente não faz nada dentro de uma função do usuário. Por exemplo,

function! NoHlsearch()
    nohlsearch
endfunction

não tem efeito visível quando executado.


Para verificar se o hlsearch está realmente ativo, você deseja verificar a variável v:hlsearch. Quando o v:hlsearch = 0destaque está desativado e quando o v:hlsearch = 1destaque está ativado. Você provavelmente deve se certificar &hlsearch = 1antes de verificar v:hlsearch.

A partir de :h v:hlsearch

                                        v: hlsearch hlsearch-variable
v: hlsearch Variável que determina se o realce da pesquisa está ativado.
                Faz sentido apenas se 'hlsearch' estiver ativado, o que requer
                + extra_search. Definir esta variável como zero age como
                : nohlsearch, configurá-lo para um atua como
                        deixe & hlsearch = & hlsearch
FDinoff
fonte
Você pode esclarecer o que você quer dizer com "basicamente nada" de dentro de uma função? Ele faz o que é padrão (para de destacar temporariamente a pesquisa até a próxima vez que a pesquisa for invocada).
Steven Lu
Também estou esperando encontrar uma maneira de acessar a flag que controla se o transitório :nohlsearchestá em efeito ou não ... Acho que, na ausência dele, tenho que recorrer ao rastreamento de todas as :nohlsearchchamadas com uma variável.
Steven Lu
@StevenLu ver edições.
FDinoff
Obrigado. Parece que o código que eu tenho usado hacks em torno do aspecto "basicamente não faço nada", fazendo o seguinte: nnoremap <silent> <expr> <boundkey> SearchHighlight()where SearchHighlight()pode retornar uma string ":silent nohlsearch\<CR>". Também obrigado pela v:hlsearchdica, exatamente o que eu precisava.
Steven Lu
1

Seu script exige que o estado atual de destaque seja conhecido?

Para desativar hlsearchapenas a pesquisa atual, eu uso Ctrl-lisso no meu .vimrc:

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

O realce da pesquisa retorna com a próxima pesquisa ao usar o comando acima. Ctrl-lé conveniente, porque o uso normal é limpar e redesenhar a tela.

Para alterar o estado de destaque da pesquisa ativada ou desativada persistentemente, eu uso F3 como minha alternância:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
thisoldman
fonte