Destacar un término de búsqueda sin mover el cursor

15

Usando Vim, a veces me encuentro mirando una sección del código fuente por un tiempo y de repente quiero que aparezca alguna variable en la pantalla. Eso es fácil: lo /<var>que los destaca a todos. Mi problema es que la mayoría de las veces la búsqueda cambia mi ventana, así que no estoy mirando el código fuente desde el mismo lugar. Incluso si solo ha cambiado algunas líneas, todavía me desconcierta, ya que necesito tomar unos segundos para averiguar a dónde se han movido las cosas.

¿Es posible resaltar un término de búsqueda sin mover el cursor a la siguiente coincidencia?

Andrew Wood
fuente
2
No es exactamente una respuesta, pero solo uso dos teclas de retroceso (``) para saltar a donde estaba antes.
Izkata

Respuestas:

1

http://vim.wikia.com/wiki/VimTip1572

Si usó este complemento, simplemente puede habilitar la funcionalidad

\metro

luego use una tecla NumPad para asignar un color a esa palabra en todas partes sin mover el cursor.

1

Puede usar muchos aspectos destacados diferentes a la vez para muchas palabras diferentes, o patrones de búsqueda más complejos si lo desea.

lestanánide
fuente
¡Me encanta este complemento!
Andrew Wood
15

La respuesta de skyblue muestra el núcleo de la idea de cómo usar el resaltado de búsqueda normal para lograr lo que desea.

Extendí esa técnica haciendo una combinación de teclas que funciona de manera similar al *comando , pero sin pasar realmente a la siguiente coincidencia.

Agradezco a garyjohn por señalar el expand()equivalente a *la selección de palabras de (para evitar usarlo *y restaurar la vista). Esto simplifica el código lo suficiente como para que pueda ir directamente a la asignación (se evita usar una función). También he agregado una asignación que coincide con palabras parciales (como g*).

:" The leader defaults to backslash, so (by default) this
:" maps \* and \g* (see :help Leader).
:" These work like * and g*, but do not move the cursor and always set hls.
:map <Leader>* :let @/ = '\<'.expand('<cword>').'\>'\|set hlsearch<C-M>
:map <Leader>g* :let @/ = expand('<cword>')\|set hlsearch<C-M>
Chris Johnsen
fuente
1
Puede evitar las llamadas a winsaveview (), winrestview () y normal *reemplazando let @/ = @/con let @/ = expand("<cword>").
garyjohn
@garyjohn: Sí, eso es mejor. No estaba seguro de que hubiera algo equivalente a la selección de "palabras" realizada por *, pero <cword>es así.
Chris Johnsen
13

También puede establecer el registro de búsqueda en la variable que desea hacer coincidir.

Primero, asegúrese de que el resaltado de búsqueda esté activado:

:set hlsearch

Luego, puede configurar el registro de búsqueda con:

:let @/="variable"

Esto resaltará todas las apariciones de variables sin saltar al próximo partido.

Para más información, ver :help @/


fuente
7

Una forma es usar el :matchcomando, por ejemplo,

:match Question '^R^W'

Eso resaltará la palabra debajo del cursor usando el grupo resaltado Pregunta. A menudo uso el grupo de preguntas porque en mi terminal es un bonito color verde. Para ver los grupos de resaltado disponibles, ejecute

:hi

Los ^Ry ^Wson Ctrl-R y Ctrl-W, respectivamente, y se reemplazan por la palabra debajo del cursor. Ver

:help c_CTRL-R_CTRL-W

para más sobre eso. Ver

:help :match

para más sobre el :matchcomando. Para borrar ese resaltado, simplemente ejecute

:match

sin argumentos

garyjohn
fuente
1

Además de:

 :set hlsearch

Es posible que desee:

 : set noincsearch
Therube
fuente
0

Similar a *tenemos:

[I ............................. it show where the word under the cursor appears

Vale la pena echarle un vistazo :h [I. Allí encontramos algunas cosas interesantes relacionadas con sus necesidades.

Hay una pregunta similar en stackoverflow donde pongo mi respuesta (un poco más completa)

SergioAraujo
fuente