2013-06-27 7 views
16

L'extitant Ctags non funziona bene con Ruby, potete vedere che ci sono molti hack nel codice ruby.c e fondamentalmente fallisce nel riconoscere molti casi. Uno dei più importanti è questo bit:Conoscete un generatore di ctags alternativo per Ruby

class SomeModule::SomeClass 
end 

Ctags genera:

SomeModule someclass.rb /^class SomeModule::SomeClass$/;" c 

che è sbagliato. L'entrata corretta e prevista è:

SomeClass someclass.rb /^class SomeModule::SomeClass$/;" c 

Questo è molto limitante. Ci sono alcune patch per i ctag disponibili che non funzionano, ad es. https://github.com/xtao/overlay/blob/master/dev-util/ctags/files/ctags-5.5.4-ruby-classes.patch ma guardando il codice rubt ctags, questo ha davvero bisogno di una completa riscrittura.

Quindi ho giocato con un'altra opzione che è https://github.com/rdoc/rdoc-tags che funziona meglio, ma è lenta. Intendo davvero SLOW. La generazione di tag sul mio progetto è di 2 secondi con ctags ma un'ora con con questo strumento. Veramente.

Ho trovato un vecchio progetto che stava analizzando Ruby su se stesso e generando tag, ma era solo per Ruby 1.8. Era più lento di ctags, ma non così male.

Quindi sto cercando alcune alternative. Sei a conoscenza di altri generatori di rubinetti funzionanti che ti danno corretto output e sono veloci?

Grazie!

Edit: ho trovato molto bello progetto che funziona con Ruby 1.9+ ed è precisa e veloce. Lo consiglio:

https://github.com/tmm1/ripper-tags

+0

O forse, se conosci veloce e funzionante il parser di Ruby | lexer che è facile da usare e quindi posso scrivere il mio generatore di tag. Dovrebbe funzionare con Ruby 1.8-2.0. – lzap

+1

Nota a margine sull'uso di 'classe SomeModule :: SomeClass': non crea un ambito lexcical con' SomeModule' come genitore, dovresti evitarlo - vedi http://stackoverflow.com/questions/15119724/ruby-lexical- scope-vs-inheritance – tight

risposta

14

ctags esuberanti, fuori dalla scatola non fare una serie di cose utili:

  • Essa non tratta:

    module A::B 
    
  • Non codifica (almeno alcuni dei) metodi "operatore" come ‘==’

  • Non supporta tag qualificati, —type=+

  • Non emette tag per costanti o attributi.

Patch disponibile, ma è solo per la versione 5.5 e non funziona più.

Altri progetti:

Source

+0

Sì, ho visto questo, ma non riesco a trovare questa patch particolare. Ho solo quello per la versione 5.5 che non funziona affatto. – lzap

+0

Ho i tag rdoc. Ho aggiunto il link. Controlla. –

+0

Grazie per il collegamento, l'ho già provato ed è lento come l'inferno. Per esempio. parsing "puppet" project = 1 ora. :-( – lzap

15

Ripper-tag sforzo risolve tutto qui descritto. È basato sul parser ufficiale di Ruby che è anche abbastanza veloce. https://github.com/tmm1/ripper-tags

gem install ripper-tags 
cd your_project/ 
ripper-tags -R 

Lo fa anche il supporto Emacs pure.

+2

Ok, aspetto ulteriori raccomandazioni, ma sono abbastanza felice con i tag ripper, accetterò la mia risposta solo per non confondere i lettori. :-D – lzap

+0

anche i tag ripper non indicizzano i moduli nidificati: https://github.com/tmm1/ripper-tags/issues/48 –

+2

Yay! Recentemente i tag ripper hanno aggiunto il supporto per nested/constants https://github.com/tmm1/ripper-tags/pull/44 –

1

Una patch è disponibile a partire dal 2013-02

il generatore di tag RSpec non riconoscerà correttamente describe blocchi che iniziano con semicolor (:some-method), ma a parte questo, è fantastico.

Problemi correlati