¿Cómo evito que vim resalte las coincidencias después de un reemplazo?


13

Tengo set hlsearchen mi ~/.vimrc. Esto normalmente es muy útil, pero es molesto tener que hacerlo :nohdespués de hacer un reemplazo como '<,'>s/$/',/(lo que resalta el final de cada línea después de ejecutarlo). ¿Cómo puedo vimno resaltar después de reemplazar de esta manera?

Estoy en Ubuntu 9.04 con vim7.2. Tengo el mismo problema en OS X 10.6 (también vim7.2). Algo que funcionaría en ambos sería deseable.

ACTUALIZACIÓN: Todas las respuestas que recibí solo están agregando una asignación de teclas para hacer :noh(o un equivalente). Realmente trato de evitar comportamientos clave personalizados a los que realmente me acostumbraría, pero luego me hago fallar miserablemente sin ellos (por ejemplo, en la computadora de un amigo, etc.). Me gustaría vimhacer automáticamente :nohdespués de hacer un reemplazo. Es decir, solo quiero hlsearchcuando uso /o *(tal vez algunos otros casos), pero no en otras ocasiones.

Respuestas:


7

Si no desea deshabilitar permanentemente, puede vincular una tecla para alternar el resaltado como se sugiere en esta respuesta a una pregunta similar sobre stackoverflow.

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

Si desea deshabilitar permanentemente el resaltado:

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

(de las preguntas frecuentes de VIM )


2
Estaba al tanto de esta opción. El problema es que generalmente no estoy buscando lo que quiero reemplazar, por lo que no tiene sentido resaltar en la mayoría de los casos que reemplazo. Sin embargo, es muy útil para cuando estoy buscando algo, por lo que no quiero que desaparezca por completo .
Benjamin Oakes

@Benjamin: Lo buscaste implícitamente. Eso es lo que hace. Busca un patrón y luego realiza una transformación en las coincidencias. Usar: nohl es la solución correcta, ya que desactiva el resaltado del patrón de búsqueda actual hasta que se realice la siguiente búsqueda. Lo hace sin cambiar el estado de la opción 'hlsearch' o sin afectar el valor almacenado del término de búsqueda anterior.
jamessan 02 de

2
@jamessan: Entiendo que es una búsqueda y reemplazo. Es solo que no lo necesito resaltado entonces. Sobre todo una molestia más que nada.
Benjamin Oakes

Hace un tiempo, comencé a desactivar el resaltado de forma predeterminada y a activarlo cuando lo desee, como sugirió. Todavía no es perfecto, pero es mejor.
Benjamin Oakes

9

Tengo dos soluciones diferentes, ambas bastante buenas, cada una con un comportamiento diferente y matizado. Mi favorita es la opción 2:

  1. Tengo las siguientes 2 líneas en mi .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    El primero espera un tiempo de espera (no configurable) si el cursor no se mueve y apaga hlsearch. El segundo lo vuelve a encender si el cursor se mueve nuevamente.

    No es una solución perfecta, pero funciona para mí (y será casi perfecto cuando el tiempo de espera sea configurable; por ahora, el tiempo de espera está vinculado a un temporizador incorporado para vim).

  2. O puedes probar estas líneas:

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

Esto apaga hlsearch después de un breve tiempo de espera sin movimiento del cursor y lo vuelve a encender para los comandos de búsqueda estándar. No cubre todas las posibilidades de volver a activar hlsearch, pero es suficiente como iniciador como prueba de concepto.


Gracias por la actualización, no la vi hasta ahora. (¿Parece que tú también lo agregaste? Es curioso). Este es un concepto genial; Tendré que jugar con eso.
Benjamin Oakes

La advertencia de 2. es que hace que la búsqueda con modo visual Vno funcione
Bryce Guinta

Modifiqué la primera línea en la opción 1 con lo siguiente autocmd cursorhold * set nohlsearch | let @/ = "" Esto borrará el registro de búsqueda y eliminará el resaltado. No he pasado mucho tiempo con esta configuración, pero quería publicarla para aquellos que terminan aquí.
Berkeley Martinez

2

Simplemente escribo "/ asdf" (suponiendo que "asdf" no está en el archivo) para eliminar el resaltado. Sé que es bastante simplista, pero funciona para mí.


2
Esa es la misma idea que :noh, pero no siempre funciona. :) Es curioso que lo menciones, sin embargo: solía tener un amigo que siempre escribía su nombre porque aparecía con menos frecuencia que algo como "asdf" en lo que escribió. (Un poco gracioso, creo.)
Benjamin Oakes

Cierto. Quizás lo recuerde: no, la próxima vez.
Greg Graham el

1

Ponga lo siguiente en su archivo .vimrc:

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

Esto ocultará en silencio el término de búsqueda resaltado pero no deshabilitará la :set hlsearchfunción. Se activa nuevamente en la próxima búsqueda.


Es mejor simplemente usar el comando incorporado diseñado para este propósito: nohl. Entonces no soplar a los contenidos de su búsqueda de registro, que se utiliza para cosas como saltar a la siguiente coincidencia, el valor predeterminado de un patrón cuando no se especifica ninguno, etc.
jamessan

Sí, pero me molestó que mi próxima búsqueda no estuviera resaltada como se suponía. Entonces se me ocurrió esta solución rápida. También puede estar sucio pero funciona. Creo que esto es aceptable para vim, incluso si no usaría cosas "sucias" en un código fuente de un gran proyecto real.
Gregor Müllegger

1

Otra posibilidad es restablecer el @/registro (que en realidad es un registro de lectura y escritura) después de realizar la sustitución. Esto restaura el punto culminante anterior:

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

Sin embargo, esto todavía tiene algunos problemas:
- en lugar de modificar :s, define un nuevo comando. Si bien es posible utilizar cabbrevpara mapear :sa :S, sé que no hay manera de atrapar todas las construcciones tales como :<range>s.
- si solía :nohlocultar solo una búsqueda, esto volverá a resaltar la búsqueda anterior. No sé cómo encontrar si :nohlse llamó anteriormente. (Podría ser posible evitar esto y también anular el :nohlcomando, pero esto también requeriría anular todos los comandos de búsqueda, lo que podría ser demasiado ...).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.