Frage

Ich habe vor kurzem mausgesteuerte, plattformspezifische GUI-Editoren und verpflichten ganz vim aufgegeben. Die bisherigen Erfahrungen war fantastisch, aber ich bin fest, wenn es um Javascript kommt.

Der beliebte taglist Dienstprogramm (mit Exuberant Ctags) hat für alles, aber Javascript groß. Mit der überfreier Form und Struktur der Sprache, könnte taglist nur eine Handvoll Funktionen holen, wenn ich es geöffnet - nur die im Format definiert:

function FUNCNAME (arg1, arg2) {

aber keine Variablen oder Funktionsobjekte definiert wie:

var myFunc = function (arg1, arg2) {

gegoogelt Also habe ich ein wenig und fand das folgende Definition-Set für ctags, die ich in legte meine ~ / .ctags-Datei:

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

Danach wird ausgeführt ctags von der Kommandozeile war fantastisch. Es fand jede Funktion und Aufgabe, dass ich es brauchte zu finden.

Das Problem ist, dass das taglist.vim Plugin diese neuen Ergebnisse nicht zu sehen. Wenn ich meine JavaScript-Datei in vim und Hit öffnen: TlistToggle, erhalte ich die exakt gleiche magere Hand voll Funktionen, die ich vor habe. Ich schlug ‚u‘ die Liste zu aktualisieren, ohne Wirkung.

Digging in taglist.vim, fand ich diese:

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

... was bedeutet, wir sind nur an einer bestimmten Art der Ausgabe vom ctags Dienstprogramm für Javascript suchen. Leider bin ich nicht klug genug mit taglist oder vim im Allgemeinen (noch) zu entdecken, was ich machen ändern können alle diese wunderbaren ctags zu bekommen Kommandozeilen-Ergebnisse in vim zu zeigen.

geschätzt Hilfe!

War es hilfreich?

Lösung

Verstanden! Ich tauchte in den taglist.vim Code für eine Weile, und das ist, was ich gefunden habe:

taglist.vim Kräfte ctags die gleiche Datei des Typs zu verwenden, die vim verwendet. Also auch wenn der ~ / .ctags Snippet ich über Google gefunden wird meine dringend benötigten Definitionen auf den neuen „js“ Sprache zuweisen und es auf Dateien anwenden, dass Ende in Js, taglist zwingt ctags in mit dem „JavaScript“ Dateityp, dass vim ist mit -., die bereits rechts in ctags gebaut

Die Lösung ist, die ~ / .ctags Datei zu ändern, was ich oben geschrieben habe, um diese:

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

die Abspaltungen der vorbestehenden JavaScript Sprachdefinition direkt, anstatt eine neue Sprachdefinition innerhalb ctags zu schaffen. Wenn nun taglib Kräfte vim registrierten Dateityp, die neuen Definitionen verwendet werden. fehlt auch von den zuvor gebuchten ~ / .ctags Linien der „Art“ wurde Brief, dass Al in seiner Antwort erwähnt, so dass diese in meiner aktualisierte Version ebenfalls enthalten sind.

Von dort fallen die folgenden in Ihre ~ / .vimrc die neuen Typen zu aktivieren:

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

All-in-allem die neuen regex Linien sind nicht perfekt - sie werden auf jeden Fall einige Optimierungen müssen eine Menge Fehlalarme zu vermeiden, und es wäre schön, Konstanten zu trennen und so. Aber jetzt, zumindest habe ich die Möglichkeit, das zu tun.)

Edit:. hinzugefügt Anweisungen, wie Typen zu aktivieren, ohne das Plugin zu bearbeiten, und verbessert in beträchtlichem Ausmaß der wichtigste ctags regex funktioniert einige falsch-positive Ergebnisse zu vermeiden

Bearbeiten. 2: hinzugefügt mehr Array und Objektdefinitionen zu dem ctags regex

Andere Tipps

Ich lief in diesem Beitrag auf einer Google-Suche, und obwohl Ihre Ergebnisse sind ausgezeichnet, glaube ich, dass wir sie verbessern können. Dies ist das Ergebnis eines wenig Hacking auf Ihrer Lösung:

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

Dies wird loszuwerden noch ein paar Fehlalarme, und fügt ein paar mehr Features in, als Kompromiss für das Erhalten von einigen des problematischen Regexes befreien. Ich werde die Aktualisierung halten, wenn ich finde, ich brauche mehr.

Bearbeiten : Ich habe alles bekommen wirklich schön jetzt arbeiten; Ich fühle mich wie das Ergebnis fest ist. Der einzige große Mangel ist, dass es funktioniert nicht auf Komma Variablendefinitionen getrennt. Das scheint besonders böse. Vielleicht ein anderes Mal. :)

Beachten Sie auch, dass änderte ich den .vimrc. Dies ist nicht, weil ich ein Freak bin; es ist, weil irgendwie taglist oder ctags oder etwas einige Standardwerte festgelegt hat, und wenn Sie es nicht ändern, dann bekommen Sie eine Menge verdoppelt, wo Funktionen und Vars betroffen sind, was wirklich treibt mich verrückt (ich super Liebe zum Detail. .: P)

Bearbeiten : Mehr zwickt. Es nimmt auf Erklärungen Prototyp Funktion jetzt, und nicht eine andere dummen Sachen tun.

Die Best-Practice-Lösung, die auch sehr neu, sauber und einfach JavaScript-Quellcode-Browsing / Tag-Liste in Vim zu bekommen, wird mit Mozillas DoctorJS (früher bekannt als jsctags ).

meine Antwort auf diese Frage für weitere Informationen .

Genießen. :)

Ich habe Javascript oder taglist nicht viel verwendet, aber durch :help taglist-extend suchen, es sieht aus wie Ihre Definitionen (siehe oben) benennen Sie die Javascript-Ausgabe an js, so dass Sie wahrscheinlich so etwas wie benötigen (in Ihrem vimrc):

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

Dies wird unter der Annahme, dass die ctags ‚Art‘ ist ‚f‘ für die Funktion und ‚m‘ für die Methode. Werfen Sie einen Blick auf Ihre Tags-Datei und sehen, was die ‚Art‘ Spalte aussieht. Beispielsweise enthält meine C-Code-Tags-Datei die folgende Zeile:

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

Dies ist ein #define eines Symbol ADC_CR1_AWDCH_0, die in der angegebenen Datei in Zeile ist 2871. Die ‚d‘ die ctags ist ‚Art‘ für einen definierten Namen. Hoffentlich werden Sie genug geben um Sie gehen.

Als beiseite, ich bin mir nicht sicher, ob die Überschreibung korrekt funktionieren, so dass es sich lohnen könnte Ihre Datei ‚myfile.mjs‘ Namensgebung und die langmap zu js:.mjs ändert, bis er richtig funktioniert hat. Dann mindestens Sie wissen, ob Ihre Probleme mit einem falschen Identifizierung von Dateien oder der eigentlichen Analyse verbunden sind.

Hallo dank Tom Frost für seine Frage und Forschung, ich glaube, es gibt ein kleines Problem mit der 4. Zeile regexp Ihre endgültige Antwort:

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

Ist für mich nicht funktioniert, zog ich es ein wenig und jetzt funktioniert ok:

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

PD. Die anderen Antworten regexps gepostet hier nicht funktioniert überhaupt zumindest für mich: -?

Zur Vermeidung von doppelten Einträgen aus ctags js ‚Sprache wie in Original-Beitrag und Hilfe taglist Verwendung ctags mit ihm gebaut in JavaScript Ich definiere‘. Ich stelle sicher, dass auch Tagnamen von einigen weniger Nutzbits abgezogen werden (zitiert, „dies.“, „.Prototype“). Ich weiß nicht Objekt / array / string / var regexps verwenden, aber es ist leicht, meine regexps mit den anderen Vorschlägen zu kombinieren.

~ / .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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top