2010-09-22 15 views
6

Estoy escribiendo un script en el que quiero controlar las búsquedas mediante programación y obtenerlas resaltadas. Los resultados de la función de búsqueda() no están resaltados (creo), así que usar esa función no me sirve.Control de búsqueda y resaltado de Vim desde un script

Lo que quiero hacer es usar el comando 'normal /' para buscar una variable, pero eso no parece ser sencillo. Me puede script el comando:

execute 'normal /' . my_variable . '\<CR>' 

(u otras variaciones como se sugiere en la punta vim aquí: http://vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching)

pero no hace nada. Puedo ver el término de búsqueda correcto en la línea de comandos después de la ejecución de la línea de script, pero el foco está en el documento, el registro de búsqueda no se ha modificado y el cursor no ha realizado ninguna búsqueda. (Parece que el < CR> no se ingresa, aunque no se produce ningún error, y sí, he intentado utilizar el literal^M también).

Al menos puedo controlar el registro de búsqueda haciendo esto:

execute 'let @/ ="' . a:term .'"' 

y luego la cosa obvia parece ser la de hacer un:

normal n 

Pero eso normal n 'no hace nada si me quedo en un script. Establecer el registro de búsqueda funciona, si presiono 'n' manualmente después de que el script finaliza, la búsqueda ocurre (y aparece el resaltado, ya que hlsearch está activado). Ni siquiera me importa si el cursor está posicionado, solo quiero que se resalte el patrón de registro. Pero varias combinaciones de 'set hlsearch' en el script tampoco funcionan.

Sé que podría usar 'match()', pero quiero que funcione con el resaltado de búsqueda regular, y me pregunto qué estoy haciendo mal. Debe ser algo simple pero no lo estoy viendo. Gracias por cualquier ayuda.

+0

He intentado mi comando de búsqueda. 'execute" normal/^ --- \ "' funciona. Pero 'ejecutar' normal/^ --- \ '' no. – ppan

Respuesta

3

Si el script está utilizando funciones, a continuación, esta cita de :help function-search-undo es relevante:

La última utilización de patrón de búsqueda y rehacer el comando "" no será modificado por la función. Esto también implica que el efecto de: nohlsearch se deshace cuando la función retorna.

Vim lo general trata de restablecer el patrón de búsqueda (y algunas otras cosas) cuando se termina una función, a menudo se puede evitar esto mediante la adición de la n (búsqueda siguiente) al final de una asignación, o el uso de :map <expr> y al tener su función, se devuelve la secuencia de teclas que se ejecutará.

1

En una inspección más cercana, parece que \<CR> no se recoge dentro de comillas simples.Trate de usar esto en su lugar:

execute 'normal /' . my_variable . "\<CR>" 
+0

Gracias. Estoy bastante seguro de que fue lo primero que intenté, y no funcionó. Creo que obtienes el problema en tu otra respuesta donde identificas un problema con la modificación del patrón de búsqueda en una función. Todos los comandos con los que estoy teniendo el problema están dentro de una función, así que lo verificaré para confirmar. –

3

de ejecución:

dejó @/= a: searchStr

por dentro de su función a continuación, ejecute

normal n

desde afuera de su función (dentro no hace nada) ej.

command -nargs = * Hs call MySearch() | normal n

o puede utilizar:

conjunto hlsearch

en lugar de lo normal n si no desea que el cursor se mueva

(no puedo hacer ejercicio otra forma de hacerlo sin tener algo fuera de la función.)

+0

Estaba buscando esto por mucho tiempo. Qué cosa tan difícil para Google. ¡Tu respuesta funcionó perfectamente y hace exactamente lo que yo quiero! – Dan

Cuestiones relacionadas