¿Cómo desactivar automáticamente "hlsearch" después de que termine de buscar?

19

Me encanta la configuración de "hlsearch", pero después de terminar de buscar, me resulta desagradable. Especialmente si busco algo que tenga muchas coincidencias. Sé que puedo apagar esto con

:set nohlsearch

Pero esto requiere un total de 16 pulsaciones de teclas, y aún más molesto, tengo que volver a encenderlo para mi próxima búsqueda con

:set hlsearch    

¿Hay alguna manera de que hlsearch se active automáticamente cuando empiece a buscar y se apague cuando termine de buscar? Por ejemplo, si entro en el modo de inserción o modifico el texto, ¿hlsearch se apaga sin presionar ninguna tecla adicional?

DJMcMayhem
fuente
3
Definir automáticamente.
Antony
@Antony Como en, si estoy haciendo ediciones, o en modo de inserción, se apagará sin necesidad de presionar ningún botón. Si comienzo a buscar con /o ?, o si presiono no N, se encenderá sin que necesite presionar más botones.
DJMcMayhem
1
Ah, y define la búsqueda "terminada"
Christian Brabandt
1
:nno <BS> :set hls!\|set hls?<CR>- una línea, una pulsación de tecla, retroalimentación de estado y no intenta adivinar cuándo puede o no querer resaltar. A veces quiero que quede resaltado en la pantalla al editar. A veces no lo hago, por ejemplo, usar /como movimiento con un operador.
Antony
nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

Respuestas:

26

Hay una forma mucho más conveniente. En lugar de usar

:set nohlsearch

que en realidad desactiva la configuración de hlsearch, usa

:nohls

Esto solo desactivará hlsearch hasta que vuelva a buscar. Desde:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

Sin embargo, esta solución no es perfecta, ya que aún tiene que escribir :nohlsqué es difícil de hacer después de cada búsqueda. Puede solucionar esto con un mapeo, por ejemplo

nnoremap <esc><esc> :silent! nohls<cr>

¡Pero hay una solución aún mejor ! haya14busa / incsearch.vim . Esto es, al menos en mi opinión, un complemento vim esencial . La característica principal es que todas las coincidencias de búsqueda se resaltan en tiempo real, a medida que escribe su expresión regular. Por ejemplo:

ingrese la descripción de la imagen aquí

Sin embargo, una característica secundaria que también se proporciona es la opción de activar y desactivar hlsearch inmediatamente cuando comienza / detiene la búsqueda. Para habilitar esta función, deberá agregar

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

a tu .vimrc.

Si tiene otras nasignaciones, deberá desactivarlas. Por ejemplo, solía tener

nnoremap n nzz
nnoremap N Nzz

¡Estas dos asignaciones no son compatibles entre sí!

DJMcMayhem
fuente
Como estás respondiendo por tu cuenta, me gustaría sugerirte que también agregues otro problema set hlsearch. Si lo tiene definido vimrc, se sobrescribirá :nohcada vez que obtenga el vimrc. Para solucionar esto tengo if !&hlsearch | set hlsearch | endifen mi vimrc. (Y este es otro problema que resuelve el complemento.)
grochmal
No sé, parece un montón de código y configuración sin mucha ganancia para mí. De hecho, hace que el objetivo de su búsqueda incremental sea más difícil de detectar, lo que lo hace menos útil para una navegación rápida.
Antony
¡+1 para un gran complemento respondiendo preguntas y haciendo mucho más!
RichVel
7

vim-cool es un complemento simple que hace justamente esto.

Vim-cool deshabilita el resaltado de búsqueda cuando termina de buscar y lo vuelve a habilitar cuando vuelve a buscar.

Funciona sin reasignar mediante el uso de los comandos automáticos CursorMovedy InsertEnter.

Jon Parise
fuente
Esta técnica (usando comandos automáticos) es mucho mejor que mi respuesta, y no puedo creer que no lo pensé cuando escribí la mía. Voto a favor.
Rico
5

Yo uso <Leader><Enter>como atajo para :noh. (Mi líder es ,, así que está bastante cerca)

Esto desactivará los resaltados hasta su próxima búsqueda.

Amit Gold
fuente
3

Como ya ha notado en su propia respuesta , es mucho más eficiente desactivar el resaltado con el :nohlsearchcomando (que se puede abreviar :noh) en lugar de desactivar toda la función y luego volver a activarla la próxima vez que busque.

Si desea desactivar el resaltado cada vez que usa ipara ingresar al modo de inserción, puede crear una asignación simple para hacerlo:

:nnoremap i :noh<cr>i

Se deja como un ejercicio para que el lector cree mapeos similares para otros comandos donde desean que el resaltado esté desactivado.

Rico
fuente
1

Puede sonar estúpido o ingenuo, pero lo que hago cuando quiero detener el resaltado es buscar una cadena aleatoria que (casi con certeza) no está presente en el documento. Algo como esto:

/skljdfhadhfs

De acuerdo, requiere algunos golpes de tecla, pero son realmente aleatorios, por lo que se pueden escribir en poco tiempo.

Kostas
fuente
1
Pero esto hace ny Nya no funcionan, y también cosas como :%s//somethingo :g//something. También satura tu historial de búsqueda
DJMcMayhem
Sí, pero mi suposición (probablemente incorrecta) es que dado que ya no necesita resaltar, tampoco le importa esa búsqueda en particular. El desorden en el historial de búsqueda es un problema real, si uno confía en él.
Kostas
1

He encontrado que es más intuitivo para reasignar el Ctrl- Lrepinte para incluir :nohls:

nnoremap <C-L> :nohls<cr><C-L>
DanG
fuente
¡Bienvenidos a Vi y Vim ! Gracias por compartir su conocimiento sobre lo que ciertamente es una vieja pregunta. Las respuestas de alta calidad, como habrás notado, generalmente vienen con alguna explicación de lo que está haciendo el código (esto es especialmente útil para los nuevos vimmers que podrían aterrizar aquí sin mucho conocimiento). ¡También puede ser una buena idea para las :helpsecciones relevantes !
D. Ben Knoble
0

Lo uso <Leader><Enter>como atajo :hlsy tengo a mi líder establecido como espacio.

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

Después de buscar un elemento se resaltará, para apagarlo, presione <Space><Esc>. Y si decide que desea volver a mostrar los resultados de la búsqueda, presione <Space><Esc>. Los hls!medios asignan este enlace de teclas para alternar la configuración de hls(abreviatura de hlsearch, es decir, resaltado de resultados de búsqueda) (por lo que !alterna la configuración justo antes).

James Affleck
fuente
-1

Agregue esta macro a su .vimrc

map #h :set hls!<CR>

Esto te permitirá alternar la iluminación con #h

Darrel Lee
fuente
Esto no es diferente a la respuesta de James Affleck.
jamessan el
La mía parece más concisa.
Darrel Lee
¿Por qué es relevante la concisión? La otra publicación brinda más información sobre el significado de las partes del comando y esta publicación no proporciona contenido adicional.
jamessan el