Comment puis-je faire le plugin de liste de balises de vim afficher des informations utiles pour javascript?

J'ai récemment abandonné les éditeurs de GUI spécifiques à la plate-forme et à la souris et je me suis entièrement engagé dans vim. Jusqu'à présent, l'expérience a été fantastique, mais je suis bloqué en ce qui concerne le Javascript.

L'utilitaire de liste de balle toujours populaire (utilisant Exuberant Ctags) a été idéal pour tout sauf Javascript. Avec la forme et la structure excessivement libres de la langue, la liste de balises ne pouvait que prendre une poignée de fonctions lorsque je l'ai ouvert – uniquement celles définies dans le format:

function FUNCNAME (arg1, arg2) { 

Mais aucune variable ou objet fonction défini comme:

 var myFunc = function (arg1, arg2) { 

Alors j'ai googlé un peu et j'ai trouvé le jeu de définition suivant pour les ctags, que j'ai mis dans mon fichier ~ / .ctags:

 --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/ 

Après cela, l'exécution de ctags à partir de la ligne de commande était fantastique. Il a trouvé toutes les fonctions et les objets dont j'avais besoin pour trouver.

Le problème est que le plugin taglist.vim ne voit pas ces nouveaux résultats. Lorsque j'ouvre mon fichier javascript dans vim et appuyez sur: TlistToggle, j'ai exactement la même poignée de fonctions que j'ai reçues auparavant. Je t'ai frappé pour mettre à jour la liste, sans effet.

Creusant dans taglist.vim, j'ai trouvé ceci:

 " 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' 

… ce qui implique que nous examinons uniquement un type spécifique de sortie de l'utilitaire ctags pour javascript. Malheureusement, je ne suis pas assez informé avec la liste de balises ou vim en général (pour le moment) pour découvrir ce que je peux faire pour obtenir tous ces merveilleux résultats de ligne de commande ctags à apparaître dans vim.

Aide appréciée!

Je l'ai! Je me suis introduit dans le code taglist.vim pendant un certain temps, et c'est ce que j'ai trouvé:

Taglist.vim oblige les ctags à utiliser le même type de fichier que vim utilise. Donc, bien que l'extrait de ~ / .ctags que j'ai trouvé via google affecte mes définitions nécessaires à la nouvelle langue "js" et l'applique à des fichiers qui se terminent par .js, la liste de balises oblige les ctags à utiliser le type de fichier "JavaScript" qui Vim utilise – qui est déjà construit dans ctags.

La solution consiste à modifier le fichier ~ / .ctags de ce que j'ai posté ci-dessus à ceci:

 --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/ 

Qui modifie directement la définition de langage JavaScript existante, plutôt que de créer une nouvelle définition de langue au sein de ctags. Maintenant, lorsque taglib force le type de fichier enregistré de vim, les nouvelles définitions sont utilisées. En outre, les lignes précédentes de ~ / .ctags précédentes étaient la lettre "aimable" que Al a mentionnée dans sa réponse, de sorte que celles-ci sont également incluses dans ma version mise à jour.

De là, déposez le suivant dans votre ~ / .vimrc pour activer les nouveaux types:

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

Dans l'ensemble, les nouvelles lignes regex ne sont pas parfaites; elles devront certainement être modifiées pour éviter de nombreux faux positifs, et il se peut qu'il contienne quelques imprécisions par rapport à l'utilisation. Mais maintenant, au moins, j'ai la capacité de le faire :).

Modifier: Ajout d'instructions sur la façon d'activer les types sans éditer le plugin, et a considérablement amélioré la fonction principale de ctags regex pour éviter certains faux positifs.

Edition 2: Ajout de plus de définitions de tableau et d'objet à la regex ctags.

J'ai rencontré ce post sur une recherche Google, et bien que vos résultats soient excellents, je pense que nous pouvons les améliorer. Ceci est le résultat d'un peu de piratage sur votre solution:

.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 ([AZ]+[A-Za-z0-9_]*)/\1/o,object/ 

.vimrc

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

Cela se débarrasse de quelques autres faux positifs, et ajoute quelques fonctionnalités supplémentaires, en tant que compromis pour éliminer certaines des règles plus problématiques. Je vais continuer à mettre à jour si je trouve que j'ai besoin de plus.

Edit : J'ai tout bien fonctionné très bien maintenant; Je pense que ce résultat est solide. La seule lacune majeure est que cela ne fonctionne pas sur les définitions de variables séparées par des virgules. Cela semble particulièrement méchant. Peut-être un autre jour. 🙂

Notez également que j'ai changé le .vimrc. Ce n'est pas parce que je suis un freak; C'est parce que, en quelque sorte, les listes de balises ou les ctags ou quelque chose ont des valeurs par défaut définies, et si vous ne le modifiez pas, vous obtenez beaucoup de doubles où les fonctions et les vars sont concernés, ce qui me rend vraiment fou (je prête une grande attention aux détails. .: P)

Modifier : Plus de réglages. Il reprend les déclarations de la fonction prototype maintenant, et ne fait pas d'autres choses stupides.

La solution de meilleure pratique, qui est également un moyen très nouveau, soigné et facile d'accéder à la navigation par code source JavaScript / liste de balises dans Vim, utilise le DoctorJS de Mozilla (anciennement connu sous le nom de jsctags ).

Voir ma réponse pour cette question pour plus d'informations .

Prendre plaisir. 🙂

Je n'ai pas utilisé beaucoup de javascript ou de taglist, mais en regardant :help taglist-extend , il semble que vos définitions (listées ci-dessus) renvoient la sortie javascript à js, donc vous aurez probablement besoin de quelque chose comme (dans votre vimrc):

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

Ceci suppose que le type de ctags est 'f' pour la fonction et 'm' pour la méthode. Jetez un oeil sur votre fichier de tags et voyez à quoi ressemble la colonne 'kind'. À titre d'exemple, mon fichier de codes de code C comprend cette ligne:

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

Il s'agit d'un #define d'un symbole ADC_CR1_AWDCH_0 , qui se trouve dans le fichier répertorié à la ligne 2871. Le 'd' est le type de ctags pour un nom défini. J'espère que cela vous donnera assez pour vous aider.

A part ça, je ne suis pas sûr de savoir si la substitution fonctionnera correctement, il est donc utile de nommer votre fichier 'myfile.mjs' et de changer votre langmap en js:.mjs jusqu'à ce qu'il fonctionne correctement. Ensuite, au moins, vous saurez si vos problèmes sont associés à une mauvaise identification des fichiers ou à l'analyse réelle.

Bonjour, merci à Tom Frost pour sa question et sa recherche, je pense qu'il y a un petit problème avec la regexp de 4ème ligne de votre réponse finale:

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

Ne fonctionne pas pour moi, je l'ai tiré un peu et fonctionne maintenant, ok:

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

PD. Les autres répondent que les "regexps" affichées ici ne fonctionnent pas du tout pour moi: -?

Pour éviter les entrées en double du support javascript intégré de ctags, je définis la langue 'js' comme dans la publication d'origine et la liste de contacts d'aide utilisent des ctags avec elle. Je m'assure également que les étiquettes sont retirées de quelques bits moins utiles (citations, "ceci". ".prototype"). Je n'utilise pas object / array / string / var regexps, mais il est facile de combiner mes regexps avec les autres suggestions.

~ / .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'