Domanda

Recentemente ho abbandonato del mouse-driven, specifiche della piattaforma editori GUI e impegnato interamente a vim. L'esperienza finora è stato fantastico, ma mi sono bloccato quando si tratta di Javascript.

L'utilità sempre popolare taglist (usando esuberante Ctags) è stato grande per tutto, ma Javascript. Con modulo eccessivamente libera del linguaggio e la struttura, taglist poteva scegliere solo una manciata di funzioni, quando ho aperto - solo quelli definiti nel formato:

function FUNCNAME (arg1, arg2) {

, ma non variabili o oggetti funzione definiti come:

var myFunc = function (arg1, arg2) {

Così ho googled un po 'e ho trovato il seguente set definizione per ctags, che ho messo nel mio file ~ / .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/

Dopo di che, in esecuzione ctags dalla riga di comando è stato fantastico. Ha trovato ogni funzione e l'oggetto che avevo bisogno di trovare.

Il problema è che il plugin taglist.vim non vede quei nuovi risultati. Quando ho aperto il mio file javascript in vim e ha colpito: TlistToggle, ottengo la stessa manciata esiguo di funzioni che ho avuto prima. Mi ha colpito 'u' per aggiornare l'elenco, senza alcun effetto.

Scavando nel taglist.vim, ho trovato questo:

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

... che implica stiamo solo guardando uno specifico tipo di uscita dal programma di utilità ctags per javascript. Purtroppo, non sono abbastanza abili con taglist o vim in generale (ancora) per scoprire ciò che il cambiamento che posso fare per ottenere tutti quei meravigliosi ctags risultati della riga di comando di presentarsi in vim.

Aiuto apprezzato!

È stato utile?

Soluzione

Ci sono! Mi sono tuffato nel codice taglist.vim per un po ', e questo è quello che ho trovato:

forze taglist.vim ctags di utilizzare lo stesso tipo di file che vim sta usando. Così, anche se i ~ / .ctags snippet ho trovato tramite Google sta assegnando le mie definizioni tanto necessari alla nuova lingua "js" e la sua applicazione ai file che terminano in .js, taglist è costringendo ctags nel usando il tipo di file "JavaScript" che vim è usando -. che è costruito a destra in ctags già

La soluzione è quella di modificare il file ~ / .ctags di file da quello che ho postato sopra a questo:

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

che altera la definizione del linguaggio JavaScript preesistente direttamente, piuttosto che la creazione di una nuova definizione del linguaggio all'interno di ctags. Ora, quando filetype registrato forze taglib di vim, vengono utilizzate le nuove definizioni. Manca anche dalle precedentemente pubblicati linee ~ / .ctags è stata la lettera "tipo" che Al menzionato nella sua risposta, così quelli sono inclusi nella mia versione aggiornata pure.

Da lì, cadere quanto segue nel tuo ~ / .vimrc per attivare i nuovi tipi:

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

All-in-tutto, le nuove linee di espressione regolare non sono perfetti - faranno sicuramente bisogno di qualche ritocco per evitare un sacco di falsi positivi, e potrebbe essere bello per separare le costanti e così via. Ma ora, almeno, ho la possibilità di farlo:.)

Modifica:. Istruzioni aggiunti su come attivare i tipi senza modificare il plugin, e notevolmente migliorato la funzione principale ctags regex per evitare alcuni falsi positivi

Modifica 2:. Aggiunta di più di array di oggetti e definizioni al ctags regex

Altri suggerimenti

Mi sono imbattuto in questo post su una ricerca su google, e anche se i vostri risultati sono eccellenti, penso che possiamo migliorarle. Questo è il risultato di un po 'di incisione sulla soluzione:

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

Questo si libera di un paio di falsi positivi, e aggiunge alcune caratteristiche in, come un compromesso per sbarazzarsi di alcune delle regex più problematici. Terrò l'aggiornamento se trovo ho bisogno di più.

Modifica : tutto quello che ho ottenuto lavorando davvero bene oggi; Mi sento come se questo risultato è solido. L'unica mancanza principale è che non funziona in virgola separati definizioni di variabili. Che sembra particolarmente pericoloso. Magari un altro giorno. :)

Si noti anche che ho cambiato il .vimrc. Questo non è perché io sono un mostro; è perché in qualche modo taglist o ctags o qualcosa ha alcune impostare i valori predefiniti, e se non si cambia, allora si ottiene un sacco di doppie allorché si tratta di funzioni e VAR, che in realtà mi spinge folle (pago eccellente attenzione ai dettagli. .: P)

Modifica : più tweaks. Si riprende dichiarazioni di funzione prototipo ora, e non fa altre cose stupide.

La soluzione best-practice, che è anche molto nuovo, pulito e modo semplice per ottenere JavaScript codice sorgente navigazione / tag-list in Vim, sta utilizzando Mozilla DoctorJS (precedentemente noto come jsctags ).

Vedere la mia risposta per questa domanda per ulteriori informazioni .

Enjoy. :)

non ho usato javascript o taglist molto, ma guardando attraverso :help taglist-extend, sembra che il tuo definizioni (di cui sopra) rinominare l'uscita javascript per js, quindi avrete probabilmente bisogno di qualcosa di simile (nel vostro vimrc):

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

Ciò presuppone che i ctags 'tipo' è 'f' per la funzione e 'm' per il metodo. Date un'occhiata al vostro file di tag e vedere che cosa la colonna 'tipo' assomiglia. A titolo di esempio, il mio C file di tag codice include questa riga:

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

Questa è una #define di un ADC_CR1_AWDCH_0 simbolo, che si trova nel file quotata alla linea 2871. Il 'd' è il ctags 'tipo' per un nome definito. Speriamo che vi darà abbastanza per farti andare.

Per inciso, io non sono sicuro se la sostituzione funziona correttamente, quindi potrebbe essere la pena di nominare i tuoi 'myfile.mjs' di file e cambiare il vostro langmap per js:.mjs fino a quando non sta funzionando correttamente. Poi almeno saprete se i vostri problemi sono associati a errori di identificazione dei file o l'analisi vera e propria.

Ciao grazie a Tom Frost per la sua domanda e la ricerca, penso che ci sia un piccolo problema con la linea 4 ° regexp della tua risposta definitiva:

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

non ha funzionato per me, ho tirato un po 'e ora funziona bene:

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

PD. espressioni regolari Le altre risposte postato qui non funziona affatto, almeno per me: -?

Per evitare voci duplicate da ctags' costruito nel supporto javascript io definisco 'la lingua js' come nel post originale e contribuire uso ctags taglist con esso. Ho anche fare in modo che tagnames sono spogliati da alcuni bit meno utili (citazioni, "questo.", ".Prototype"). Non faccio uso di espressioni regolari oggetto / array / stringa / var, ma è facile combinare le mie espressioni regolari con gli altri suggerimenti.

~ / .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'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top