¿Cómo puedo hacer taglist de Vim plugin de mostrar información útil para JavaScript?

StackOverflow https://stackoverflow.com/questions/1790623

  •  22-09-2019
  •  | 
  •  

Pregunta

He abandonado recientemente, editores GUI específicas de la plataforma a través del ratón y comprometido por completo a vim. La experiencia hasta ahora ha sido fantástico, pero estoy atascado cuando se trata de Javascript.

La utilidad taglist cada vez más popular (usando exuberante Ctags) ha sido muy bueno para todo, pero Javascript. Con la forma y estructura excesivamente libre de la lengua, taglist sólo pudo recoger un puñado de funciones cuando lo abrí - solamente los definidos en el formato:

function FUNCNAME (arg1, arg2) {

pero no variables o función de los objetos definidos como:

var myFunc = function (arg1, arg2) {

Así que busqué en Google un poco y encontró el siguiente conjunto definición para ctags, que puse en mi ~ / .ctags archivo:

--langdef=js
--langmap=js:.js
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/
--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*([^])])/\1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/,string/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/,string/

Después de eso, ctags ejecutan desde la línea de comandos fue fantástico. Se encontró cada función y objeto que lo necesitaba encontrar.

El problema es que el plugin taglist.vim no está viendo los nuevos resultados. Cuando abro mi archivo javascript en vim y acertar: TlistToggle, consigo el magro exactamente el mismo puñado de funciones llegué antes. Golpeé 'u' para actualizar la lista, sin ningún efecto.

Excavando en taglist.vim, he encontrado esto:

" java language
let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' .
                               \ 'f:field;m:method'

" javascript language
let s:tlist_def_javascript_settings = 'javascript;f:function'

... lo que implica que sólo estamos mirando a un tipo específico de la salida de la utilidad ctags JavaScript. Por desgracia, no soy lo suficientemente inteligente con taglist o vim en general (aún) para descubrir qué cambio que pueda hacer para conseguir todos esos maravillosos ctags resultados de línea de comandos para aparecer en vim.

Ayuda apreciada!

¿Fue útil?

Solución

Lo tienes! Yo se sumergió en el código taglist.vim por un tiempo, y esto es lo que encontré:

taglist.vim fuerzas ctags que utilizan el mismo tipo de archivo que está utilizando vim. Así que, aunque los ~ / .ctags snippet He encontrado a través de Google es la asignación de mis definiciones muy necesarios a los nuevos "js" lenguaje y su aplicación a los archivos que terminan en Js, taglist está forzando ctags en usar el tipo de archivo "JavaScript" que vim es usar -. que está integrada en ctags ya

La solución es cambiar el archivo ~ / .ctags por lo que he publicado anteriormente a esto:

--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Object\(/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/f,function/
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Array\(/\1/a,array/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/s,string/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/s,string/

que altera la definición del lenguaje JavaScript preexistente directamente, en lugar de crear una nueva definición del lenguaje dentro de ctags. Ahora, cuando el tipo de archivo registrado taglib fuerzas de vim, se utilizan las nuevas definiciones. También ausente de las líneas ~ / .ctags enviadas anteriormente era el "tipo" carta que Al menciona en su respuesta, por lo que aquellos están incluidos en mi versión actualizada también.

A partir de ahí, la caída de lo siguiente en su ~ / .vimrc para activar los nuevos tipos:

let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function'

Todo-en-todo, las nuevas líneas de expresiones regulares no son perfectos - que definitivamente necesitan algunos ajustes para evitar una gran cantidad de falsos positivos, y que podría ser bueno para separar constantes y tal. Pero ahora, al menos, tengo la capacidad de hacer lo siguiente:.)

Editar:. Añadido instrucciones sobre cómo activar los tipos sin editar el plugin, y mejoraron enormemente las principales ctags funcionan expresión regular para evitar algunos falsos positivos

Editar 2:. añadido más de objeto y matriz definiciones para los ctags regex

Otros consejos

me encontré con este post en una búsqueda en Google, y aunque sus resultados son excelentes, creo que podemos mejorarlos. Este es el resultado de un poco de piratería en su solución:

.ctags

--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \[/\1/a,array/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \{/\1/o,object/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = (^{^[)+/\1/r,var/
--regex-JavaScript=/^[ \t]*(this\.)?([A-Za-z0-9_$()]+)[ \t]*[:=][ \t]*function[ \t]*\(\)/\2/u,function/
--regex-JavaScript=/^[ \t]*function ([a-z0-9]+[A-Za-z0-9_]*)/\1/u,function/
--regex-JavaScript=/^[ \t]*([A-Za-z0-9]+)\.prototype\.([a-z0-9]+[A-Za-z0-9_]*)/\1 : \2/u,function/
--regex-JavaScript=/^[ \t]*function ([A-Z]+[A-Za-z0-9_]*)/\1/o,object/

.vimrc

let g:tlist_javascript_settings = 'javascript;r:var;s:string;a:array;o:object;u:function'

Esto se deshace de unos pocos más falsos positivos, y añade algunas características más adentro, como una solución de compromiso para deshacerse de algunas de las expresiones regulares más problemáticas. Voy a mantener la actualización si encuentro que necesito más.

Editar : He conseguido todo funcionando muy bien ahora; Siento que este resultado es sólido. La única deficiencia importante es que no funciona en las definiciones de variables separadas por comas. Este hecho es bastante desagradable. Tal vez otro día. :)

Tenga en cuenta también que cambió el .vimrc. Esto no es porque yo soy un loco; es porque de alguna manera taglist o ctags o algo tiene algunos valores por defecto establecidos, y si no lo cambia, entonces usted obtener una gran cantidad de dobles cuando se trate de funciones y VARs, lo que realmente me vuelve loco (yo pago súper atención al detalle. .: P)

Editar : Más ajustes. Se recoge en la declaración de funciones prototipo ahora, y no hace otra cosa estúpida.

La solución de mejores prácticas, que también es muy nuevo, limpio y fácil de conseguir JavaScript de código fuente de navegación / tag-lista en Vim, está utilizando Mozilla DoctorJS (anteriormente conocido como jsctags ).

Véase mi respuesta para esta pregunta para obtener más información .

Disfruta. :)

No he utilizado javascript o taglist mucho, pero mirando a través de :help taglist-extend, parece que sus definiciones (mencionados anteriormente) cambiar el nombre de la salida javascript para js, por lo que probablemente necesitará algo así como (en su vimrc):

let tlist_js_settings = 'js;f:function;m:method'

Esto es suponiendo que los ctags 'tipo' es 'f' para la función y 'm' para el método. Echar un vistazo a su archivo de etiquetas y ver lo que las miradas de la columna 'clase' similares. A modo de ejemplo, mi archivo de etiquetas de código C incluye esta línea:

ADC_CR1_AWDCH_0 .\LibraryModules\CMSIS\Headers\stm32f10x.h  2871;"  d

Este es un #define de un ADC_CR1_AWDCH_0 símbolo, que se encuentra en el archivo que aparece en la línea 2871. La 'd' es el tipo ctags '' para un nombre definido. Es de esperar que le dará lo suficiente para que te va.

Como acotación al margen, no estoy seguro de si el aumento de presupuesto que funcione correctamente, por lo que podría valer la pena nombrar a su archivo 'myfile.mjs' y cambiar su langmap a js:.mjs hasta que esté funcionando correctamente. Entonces por lo menos usted sabrá si tus problemas están asociados con la identificación errónea de archivos o el análisis real.

Hola gracias a Tom Frost para su pregunta y la investigación, creo que hay un pequeño problema con la expresión regular cuarta línea de la respuesta final:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/

No trabajado para mí, me tiró un poco y ahora funciona bien:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\)]*\)/\1/f,function/

PD. las expresiones regulares de las otras respuestas publicados aquí no funciona en absoluto, al menos para mí: -?

Para evitar entradas duplicadas de ctags' construidos en el soporte javascript defino 'lenguaje' js como en el post original y Ayuda El uso taglist ctags con él. También me aseguro de que identificadores son despojados de algunos bits menos útiles (citas, "esto.", ".prototype"). No consumo regexps objeto / array / cuerda / var, pero es fácil de combinar mis expresiones regulares con las otras sugerencias.

~ / .ctags:

--langdef=js
--langmap=js:.js
--regex-js=/["']?(this\.)?([A-Za-z0-9_$]+)["']?((\.prototype)?(\.[A-Za-z0-9_$]+))?[ \t]*[:=][ \t]*function/\2\5/f,function/
--regex-js=/function[ \t]+([A-Za-z0-9_$]+)/\1/f,function/

~ / .vimrc:

let g:tlist_javascript_settings = 'js;f:function'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top