2012-02-19 19 views
54

Algo que podría tomar prestado de los IDEs. Entonces, la idea sería resaltar los argumentos de funciones (y tal vez los nombres de variables de alcance) dentro de los cuerpos de funciones. Este es el comportamiento por defecto para algunos C:Resalte los argumentos en el cuerpo de la función en vim

plain vim highlighting

Bueno, si tuviera que colocar el cursor dentro func Me gustaría ver los argumentos foo y bar resaltados a seguir la lógica algoritmo mejor. Tenga en cuenta que el nombre similar foo en func2 no se iluminará. Este lujoso podría omitirse sin embargo ...

func hilighted

Utilizando las variables de ámbito local, me gustaría variables que también han inicializado localmente highlit:

highlight <code>i</code> inside for

último a redemonstrate el lujo:

luxury again

No es tan trivial para escribe esto. Usé la C para dar una idea general. Realmente pude utilizar esto para la programación Scheme/Clojure mejor:

for clojure too inside let construct

Esto debería reconocer let, loop, for, doseq fijaciones por ejemplo.

Mi vimscript-fu no es tan fuerte; Sospecho que necesitaríamos

  • Parse (no regexply?) Los argumentos de la definición de la función bajo el cursor. Esto sería específico del lenguaje, por supuesto. Mi prioridad sería Clojure.
  • definir una región sintaxis para cubrir la función/alcance dado sólo
  • dan la sintaxis requerida coincide

Como una función de esto podría ser asignada a una tecla (si es muy intensivo en recursos) o CursorMoved si no es asi lento.

Bien, ahora. ¿Alguien ha escrito/encontrado algo como esto? ¿Los gurús de vimscript tienen una idea sobre cómo comenzar realmente a escribir un guión de este tipo?

Disculpa la discrepancia leve y el mal formateo. Siéntase libre de editar/formatear. O vota para cerrar.

+2

supercool topic. este resaltado realmente mejora la legibilidad del algoritmo. algunas noticias sobre eso? – nkint

+0

Es totalmente factible para C/C++/Obj-C. Sé que es posible usar Python/Clang para obtener el alcance del cursor actual y la firma de la función actual. Fuente: http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/. No debería ser difícil escribir un plugin vim con esto. –

+8

Estaba tan cerca de votarte por publicar imágenes de código en lugar de texto ... pero luego leí la pregunta. ;) –

Respuesta

1

Una posible solución se puede encontrar here. No es la mejor manera porque resalta cada ocurrencia en todo el archivo y tiene que dar el comando cada vez (probablemente se puede evitar el segundo, no se conoce el primero). Dale un vistazo sin embargo.

+0

Buen truco! Pero esto no es consciente de la sintaxis. – viebel

+0

No hace las cosas lo suficientemente automáticamente. – progo

5

Esto es mucho más difícil de lo que parece, y casi imposible con la API de vimscript tal como está, porque no solo necesita analizar el archivo; si desea que funcione bien, debe analizar el archivo incrementalmente.Es por eso que los archivos de sintaxis regulares están limitados a lo que puedes hacer con expresiones regulares: cuando cambias unos pocos caracteres, vim puede averiguar qué ha cambiado en el resaltado de sintaxis, sin volver a hacer todo el archivo.

El resaltador de sintaxis vim se limita a tratar con expresiones regulares, pero si está empeñado en hacerlo, puede pasar su propio analizador en vimscript y hacer que genere una sintaxis local de búfer que haga referencia a tokens en el archivo por línea y columna, usando los átomos \% l y \% c en una expresión regular. Esto debería volver a ejecutarse después de cada cambio. Lamentablemente, no hay autocmd para "archivo modificado", pero existe el CursorHold autocmd, que se ejecuta cuando has estado inactivo durante un tiempo configurable.

+0

Estoy de acuerdo ... es un poco loco. Pero hay enlaces de python/ruby ​​/ scheme por ahí. Y esos idiomas tienen bibliotecas de terceros. Tal vez debería haber hecho hincapié en no tener que ser VimL en su totalidad. – progo

Cuestiones relacionadas