Как создать TAGS для проектов Haskell?
Я ищу ctags, эквивалентный Haskell. Я попробовал hasktags, но у него есть некоторые проблемы:
В исходной папке enumerator запустите hasktags .
:
hasktags: tags: openFile: resource busy (file is locked)
И когда я запускаю vim -t enumFile
, возникает ошибка:
E431: Format error in tags file "tags"
Before byte 4085
E426: tag not found: enumFile
Я также пробовал gasbag, но он не компилируется на ghc-7.0.4.
Ответы
Ответ 1
hasktags имеет некоторые ошибки, один из которых заключается в том, что он использует ленивый IO, который имеет тенденцию давать эти ошибки занятости.
Как это бывает, я просто написал программу тегов, http://hackage.haskell.org/package/fast-tags
Другими параметрами являются hothasktags, которые делают квалифицированные теги Module.function и lushtags, которые предназначены для интеграции с причудливым IDE-подобным vim tagbar thingy. По моему опыту hothasktags генерирует огромные файлы тегов и аватары lushtags, как только он не может разобрать файл. Оба используют haskell-src-exts, что означает, что они точны, но сбой, если они не могут проанализировать ваш файл и не могут обрабатывать файлы .hsc. У быстрых тегов есть свой собственный синтаксический анализатор, что означает, что у него нет этих проблем, но он также более уязвим для анализа ошибок, которые пропускают теги или дают фиктивные теги.
Как вы заметили, в gasbag (и htags) используется haskell-src, что означает, что они работают только на Haskell 98.
Отказ от ответственности: если по TAGS вы имеете в виду теги emacs, fast-tags еще не делают этого, хотя, если кому-то это понравится, было бы легко добавить.
Ответ 2
Вы используете Mac OS X (или Windows, см. ниже), не так ли?
В этом случае hasktags -c
(который создает только теги Vi-формата) устранит вашу проблему.
Это не единственное объяснение, но вот что происходит в системе OS X:
- по умолчанию, hasktags предполагает, что вы хотите использовать оба тега для vi и Emacs.
- он пытается создать как
tags
(для Vi), так и tags
(для Emacs)
- однако OS X, в отличие от Unix, по умолчанию нечувствительна к регистру. Следовательно, у вас не может быть обоих файлов.
- вместо того, чтобы переписывать один файл другим, по какой-то причине hasktags запускается в конфликт, вероятно, потому, что он открывает один файл перед закрытием "другого". Я ожидал бы этого в силу ленивого ввода-вывода, как объяснил Эван Лафордж.
Обновление: как указано в комментарии, Windows также нечувствительна к регистру, поэтому могут возникнуть подобные проблемы.