2012-04-07 4 views
13

Sto cercando un ctags equivalente a Haskell. Ho provato hasktags, ma hanno alcuni problemi:Come generare TAGS per i progetti Haskell?

nella cartella di origine di enumerator, eseguire hasktags . dà:

hasktags: tags: openFile: resource busy (file is locked) 

E quando corro vim -t enumFile, si verifica un errore:

E431: Format error in tags file "tags" 
Before byte 4085 
E426: tag not found: enumFile 

I ha anche provato gasbag, ma non si compila su ghc-7.0.4.

risposta

8

hasktags ha alcuni bug, uno dei quali è che utilizza IO pigro, che tende a dare quegli errori occupati di risorse.

Si dà il caso, ho appena scritto un programma di tag, a http://hackage.haskell.org/package/fast-tags

Altre opzioni sono hothasktags, il che rende i tag modulo.funzione qualificati, e lushtags, che è stato progettato per integrarsi con una fantasia IDE-come vim Tagbar thingy. Nella mia esperienza, hothasktags genera file di tag giganti e crash di lushtags non appena non è in grado di analizzare un file. Entrambi utilizzano haskell-src-exts, il che significa che sono precisi, ma si arrestano in modo anomalo se non riescono ad analizzare il file e non riescono a gestire i file .hsc. i tag veloci hanno il proprio parser, il che significa che non ha quei problemi, ma è anche più vulnerabile ai bug di analisi che mancano i tag o danno tag fasulli.

Come avrete notato, gasbag (e htags) usare Haskell-src che significa che funzionano solo su Haskell 98.

Esonero di responsabilità: se per TAGS intendi Emacs tag, fast-tag non fa quelli ancora, anche se a qualcuno interessasse sarebbe facile aggiungere.

+0

wow, i tag veloci sono veramente veloci e funzionano! Grazie – fqsxr

13

Si sta utilizzando Mac OS X (o Windows, vedi sotto), vero? In tal caso, hasktags -c (che crea solo tag in formato Vi) risolverebbe il tuo problema.

Questo non è l'unica spiegazione, ma qui è ciò che accade su un sistema OS X:

  • per impostazione predefinita, hasktags presuppone che si desidera entrambi i tag per vi ed Emacs.
  • quindi, cerca di creare sia tags (per Vi) e TAGS (per Emacs)
  • tuttavia, OS X, a differenza di Unix, è per caso di default insensitive. Quindi non è possibile avere entrambi i file lì.
  • invece di sovrascrivere un file con l'altro, per qualche motivo hasktags viene eseguito in un conflitto, probabilmente perché apre un file prima di chiudere "altro". Mi aspetto che ciò avvenga in virtù di I/O pigro, come spiegato da Evan Laforge.

Aggiornamento: come ha sottolineato un commento, Windows è anche caso potrebbero sorgere insensibili, problemi così simili.

+1

Questa spiegazione che coinvolge insensibilità alle maiuscole e minuscole è anche vera su MS Windows, secondo la mia esperienza. Sto usando Emacs, quindi uso -e, che funziona bene pure. Ma omettere l'opzione comporta l'errore. Questo è come hasktags-0.68.2.Non sembra un IO pigro o un problema di bug come l'altra risposta suggerita – tinlyx

+0

@TingL: Penso che IO pigro spieghi perché si ottiene quel messaggio di errore specifico ("risorsa occupata"); altrimenti non otterresti nessun errore e un file 'tag' (quello creato successivamente) e funzionerebbe solo con un editor e non con l'altro. – Blaisorblade