¿Cuál es la diferencia funcional entre: nohlsearch y: set nohlsearch?

13

Me di cuenta de que cuando lo uso, :nohlsearchen realidad no hace lo mismo que :set nohlsearch.

En particular, la hlsearchconfiguración no está realmente desactivada (que es lo que :set hlsearch) logra.

Para demostrar lo que quiero decir:

:set hlsearch
:nohlsearch
:echo &hlsearch

Esto imprime 1hlsearch todavía está configurado! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Esto se imprime 0porque desactivamos hlsearch usando la forma estándar para desactivar una configuración en vim.

Entonces me pregunto porque tiene que haber alguna razón real para :nohlsearchque exista el comando ex.

La razón por la que me importa es que ahora tengo una necesidad en mi secuencia de comandos vim para probar si el resaltado de búsqueda está activo, y dado que estaba usando en :nohlsearchlugar de ": set nohlsearch" en mi otra secuencia de comandos, mi &hlsearchprueba siempre regresa 1. Así que me pregunto qué estoy cambiando al dejar de usar el nohlsearchcomando ex.

Steven Lu
fuente

Respuestas:

15

Desde :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Detenga el resaltado de la opción 'hlsearch'. Eso
                        se vuelve a encender automáticamente cuando se usa una búsqueda
                        comando o establecer la opción 'hlsearch'.
                        Este comando no funciona en un autocomando, porque
                        el estado de resaltado se guarda y restaura cuando
                        ejecutando autocomandos autocmd-searchpat.
                        Lo mismo para cuando se invoca una función de usuario.

El punto clave es que activa automáticamente el resaltado cuando comienza una nueva búsqueda. :set nohlsearchen realidad se hlsearchapaga, lo que significa que la próxima vez que busque algo no se resaltará.

Ejemplo: Suponga que hlsearchestá activado . Si actualmente está buscando "hola" en un búfer, se resaltarán todos los "hola". Si usa :nohlsearchnada, se resaltará. Pero si busca "mundo", se resaltarán todos los "mundos". Si hubiera utilizado en su set nohlsearchlugar, "mundo" no estaría resaltado.


También tenga en cuenta que este comando básicamente no hace nada dentro de una función de usuario. Por ejemplo,

function! NoHlsearch()
    nohlsearch
endfunction

no tiene efecto visible cuando se ejecuta.


Para ver si hlsearch está realmente activo, desea verificar la variable v:hlsearch. Cuando el v:hlsearch = 0resaltado está desactivado y cuando el v:hlsearch = 1resaltado está activado . Probablemente deberías asegurarte &hlsearch = 1antes de verificar v:hlsearch.

Desde :h v:hlsearch

                                        v: hlsearch hlsearch-variable
v: hlsearch Variable que determina si el resaltado de búsqueda está activado.
                Tiene sentido solo si 'hlsearch' está habilitado, lo que requiere
                + extra_search. Establecer esta variable en cero actúa de la misma manera
                : comando nohlsearch, establecerlo en uno actúa como
                        let & hlsearch = & hlsearch
FDinoff
fuente
¿Puedes aclarar lo que quieres decir con "básicamente nada" desde dentro de una función? Hace lo normal (deja de resaltar temporalmente la búsqueda hasta la próxima vez que se invoque la búsqueda).
Steven Lu
También estoy esperando encontrar una manera de acceder a la bandera que controla si el transitorio :nohlsearchestá vigente o no ... Creo que en su ausencia tengo que recurrir al seguimiento de todas las :nohlsearchllamadas con una variable.
Steven Lu
@StevenLu ver ediciones.
FDinoff
Gracias. Parece que el código que he estado usando hacks alrededor del aspecto "básicamente no hacer nada" al hacer esto: nnoremap <silent> <expr> <boundkey> SearchHighlight()donde SearchHighlight()puede devolver una cadena ":silent nohlsearch\<CR>". También gracias por el v:hlsearchconsejo, justo lo que necesitaba.
Steven Lu
1

¿Su script requiere que se conozca el estado actual de resaltado?

Para desactivar hlsearchsolo la búsqueda actual, uso Ctrl-l, con esto en mi .vimrc:

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

El resaltado de búsqueda regresa con la siguiente búsqueda cuando se usa el comando anterior. Ctrl-les conveniente porque su uso normal es borrar y volver a dibujar la pantalla.

Para activar o desactivar el estado de resaltado de búsqueda de forma persistente, utilizo F3 como alternar:

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