Comment puis-je faire de plug-in taglist vim Afficher les informations utiles pour le javascript?

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

  •  22-09-2019
  •  | 
  •  

Question

J'ai récemment abandonné à la souris, les éditeurs de GUI spécifiques à la plateforme et engagé entièrement à vim. L'expérience à ce jour a été fantastique, mais je suis coincé quand il s'agit de Javascript.

Le très populaire utilitaire taglist (en utilisant Exubérant Ctags) a été super pour tout, mais Javascript. Avec la forme trop libre et la structure de la langue, taglist ne pouvait ramasser une poignée de fonctions quand je l'ai ouvert - que ceux définis dans le format suivant:

function FUNCNAME (arg1, arg2) {

mais pas de variables ou objets de fonction définis comme:

var myFunc = function (arg1, arg2) {

Je googlé un peu et trouvé l'ensemble de définition suivante pour ctags, que je mets 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, ctags en cours d'exécution de la ligne de commande était fantastique. Il a trouvé toutes les fonctions et l'objet que je avais besoin de trouver.

Le problème est que le plugin taglist.vim ne voit pas ces nouveaux résultats. Quand j'ouvre mon fichier javascript vim et frappé: TlistToggle, je reçois exactement le même maigre poignée de fonctions que j'ai eu avant. Je frappe « u » de mettre à jour la liste, sans effet.

Creuser dans taglist.vim, je trouve 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 sommes à la recherche qu'à un type spécifique de sortie de l'utilitaire ctags pour javascript. Malheureusement, je ne suis pas assez avertis avec taglist ou vim en général (encore) pour découvrir ce changement que je peux faire pour obtenir tous ces merveilleux résultats ctags ligne de commande pour afficher dans vim.

Aide apprécié!

Était-ce utile?

La solution

Je l'ai! Je me suis plongé dans le code taglist.vim pendant un certain temps, et voici ce que je trouve:

Les forces de taglist.vim ctags d'utiliser le même type de fichier que vim utilise. Ainsi, même si les .ctags ~ / snippet j'ai trouvé via google est d'attribuer mes définitions indispensables à la nouvelle langue « js » et l'appliquer aux fichiers qui se terminent par .js, taglist est forçant ctags en utilisant le type de fichier « JavaScript » que vim est en utilisant -. qui est construit à droite dans ctags déjà

La solution est de changer le ~ / .ctags fichier 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 la définition du langage JavaScript préexistant directement, plutôt que de créer une nouvelle définition linguistique au sein ctags. Maintenant, quand filetype enregistré de forces taglib vim, les nouvelles définitions sont utilisées. Il manque aussi des lignes tition ~ / .ctags de la lettre a été « aimable » que Al mentionné dans sa réponse, si ceux-ci sont inclus dans ma version mis à jour.

A partir de là, déposez ce qui suit dans votre ~ / .vimrc pour activer les nouveaux types:

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

Tout-en-tout, les nouvelles lignes de regex ne sont pas parfaits - ils auront besoin certainement quelques ajustements afin d'éviter un grand nombre de faux positifs, et il pourrait être agréable de séparer les constantes et autres. Mais maintenant, au moins, je suis capable de le faire.)

Edit:. Ajout d'instructions sur la façon d'activer les types sans modifier le plug-in, et grandement amélioré la fonction principale ctags regex pour éviter des faux positifs

Edit 2:. a ajouté plus de définitions de tableau et l'objet à ctags regex

Autres conseils

Je suis tombé sur ce post sur une recherche google, et bien que vos résultats sont excellents, je pense que nous pouvons les améliorer. Ce sont les résultats d'un peu de piratage de 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 ([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'

Cela se débarrasse de quelques plus de faux positifs, et ajoute quelques fonctionnalités supplémentaires dans, comme un compromis entre pour se débarrasser de certaines des expressions rationnelles plus problématiques. Je vais continuer à mettre à jour si je trouve que je besoin de plus.

Modifier : Je l'ai obtenu tout ce travail vraiment bien maintenant; Je me sens comme ce résultat est solide. Le seul défaut majeur est qu'il ne fonctionne pas sur les définitions de variables séparées par des virgules. Cela semble particulièrement agressif. Peut-être un autre jour. :)

Notez également que j'ai changé le Vimrc. Ce n'est pas parce que je suis un monstre; c'est parce que d'une certaine manière taglist ou ctags ou quelque chose a des valeurs par défaut définies, et si vous ne changez pas, alors vous obtenez beaucoup de doubles où les fonctions et vars sont concernés, ce qui me pousse vraiment fou (je fais attention super aux détails. .: P)

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

La meilleure solution pratique, ce qui est très nouveau, propre et moyen facile d'obtenir la navigation code source / tag-list JavaScript dans vim, utilise Mozilla DoctorJS (anciennement connu sous le nom jsctags ).

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

Profitez. :)

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

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

Ceci suppose que les ctags « genre » est « f » pour la fonction et « m » pour la méthode. Jetez un oeil à votre fichier balises et voir ce que la colonne « genre » ressemble. A titre d'exemple, mon fichier balises de code C comprend cette ligne:

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

Ceci est un #define d'un ADC_CR1_AWDCH_0 symbole, qui est dans le fichier indiqué à la ligne 2871. Le « d » est le « genre » ctags un nom défini. Espérons que cela vous donnera assez pour vous y aller.

En aparté, je ne suis pas sûr que l'override fonctionne correctement, il pourrait être utile de nommer votre fichier « myfile.mjs » et changer votre langmap à js:.mjs jusqu'à ce qu'il fonctionne correctement. Au moins, vous saurez si vos problèmes sont associés à une mauvaise identification des fichiers ou l'analyse réelle.

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

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

Ne pas travaillé pour moi, je tire un peu et fonctionne maintenant ok:

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

PD. affiché ici les regexps des réponses des autres ne fonctionne pas du tout au moins pour moi: -?

Pour éviter les doublons de ctags' construit en javascript soutien 'je définis la langue js comme dans le post original et aider taglist utiliser ctags avec elle. Je fais également que tagnames sont dépouillés de quelques bits moins utiles (citations, « cela. », « .Prototype »). Je n'utilise pas objet / tableau / string / var regexps, mais il est facile de combiner mes expressions régulières 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'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top