Генерация ctags для платформы Haskell (стандартная библиотека), специально для prelude

Я установил Haskell на свой Mac с помощью Homebrew, то есть brew install ghc haskell-platform.

Я ищу способ создать файл ctags из стандартных библиотек (модулей) платформы Haskell, чтобы я мог просматривать исходный код во время кодирования в Vim. Мне особенно нужен Prelude и другие самые популярные модули, такие как Data.List и подобные.

Я знаю, что исходный код доступен в Интернете через Hoogle, но мне будет проще переходить к источнику всякий раз, когда мне нужно, в учебных целях.

  1. Где находится исходный код при установке платформы Haskell?
  2. Установлен ли исходный код при установке платформы Haskell или только скомпилированные двоичные файлы или что-то в этом роде?
  3. Как я могу сделать исходный код доступным для просмотра в Vim? Например, поместите куда-нибудь сгенерированный файл tags и скажите Vim, чтобы он прочитал его. Я также понимаю, что нет необходимости повторно генерировать файл tags, так как эти модули в значительной степени статичны и не очень часто обновляются.

person Ory Band    schedule 20.08.2012    source источник
comment
Вы читали этот документ?   -  person romainl    schedule 21.08.2012
comment
@romainl да, но в этом документе не объясняется, как генерировать теги для стандартных библиотек или даже где они расположены. Он просто говорит, как генерировать один файл .hs.   -  person Ory Band    schedule 21.08.2012
comment
потому что исходники не устанавливаются как часть бинарного дистрибутива. GHC является компилятором. Загрузочные библиотеки доступны как часть пакета с исходным кодом ghc, но другие необходимо загрузить отдельно для взлома.   -  person permeakra    schedule 21.08.2012
comment
Может быть полезен пакет scion-browser   -  person permeakra    schedule 21.08.2012


Ответы (1)


1) и 2) ответил permeakra в комментариях. Я попытаюсь охватить 3), описав настройку, аналогичную той, которую я использую. Сначала простое решение для базовых библиотек, затем более универсальное решение для любого исходного пакета Haskell в целом.

В качестве предварительных условий нам понадобится инструмент, который генерирует файл тегов для Haskell:

cabal install hothasktags

Вместо hothasktags вы можете использовать свой любимый. См., например, страницу https://github.com/bitc/lushtags, на которой перечислены некоторые из них.

Затем нам нужно иметь исходники для базовых библиотек. Здесь я использую те, что с GitHub:

cd /space/haskell/sources/ # tweak to your personal taste
git clone https://github.com/ghc/packages-base.git

При желании мы можем переключиться на конкретную ветку. Например.:

git checkout ghc-7.4

Запустите git branch -a, чтобы увидеть все возможности.

Теперь давайте сгенерируем теги для базовых библиотек (у меня нет Mac, и поэтому я должен предположить, что команда там работает, или вы можете настроить ее соответствующим образом):

cd packages-base
export LC_ALL=C # needed for case-sensitive searching
find -type f | egrep \.hs$\|\.lhs$ | xargs -Ii hothasktags i | sort > tags

(Примечание о сортировке: мой Vim жалуется, когда я не использую сортировку. LC_ALL объяснение см., например, в этом запись в блоге)

Теперь нам нужно сообщить Vim о сгенерированных тегах. Самый простой способ, вероятно, поместить следующую строку в ваш $HOME/.vimrc:

autocmd FileType haskell setlocal tags+=/space/haskell/sources/packages-base/tags

Таким образом, теги для базовых библиотек будут установлены для каждого открываемого нами файла Haskell. Если это нежелательно, мы можем поместить следующую команду Vim в .vimrc:

autocmd FileType haskell command! SetGHCTags
    \ setlocal tags+=/space/haskell/sources/packages-base/tags

и позвоните :SetGHCTags по запросу.

Для более общего решения, которое работает со всеми пакетами исходного кода Haskell, мы можем использовать следующую функцию (поместить в .vimrc или в файл Vim, предназначенный для типа файла Haskell):

" Add 'tags' of the given package to the current tag stack. The package sources
" must be available in "/space/haskell/sources/<package>" and the tags must be
" generated for it.
fun! s:SetHaskellTags(pathInHaskellSrcDir) "{{{
  let tagFile = "/space/haskell/sources/" . a:pathInHaskellSrcDir . "/tags"
  if filereadable(tagFile)
    exe "setlocal tags+=" . tagFile
  else
    echoerr "File does not exist or is not readable: " . tagFile
  endif
endfunction "}}}
command! -nargs=1 SetHaskellTags call <SID>SetHaskellTags(<args>)

Используя его, например, для библиотеки Shelly.hs:

cd /space/haskell/sources/
git clone https://github.com/yesodweb/Shelly.hs.git
cd Shelly.hs
regenerate-haskell-tags # [1]

В Vim просто вызовите:

:SetHaskellTags "Shelly.hs"

Есть место для улучшения - SetHaskellTags может генерировать теги, если они не существуют, или может даже извлекать исходный код, настраиваемое хранилище исходного кода Haskell, завершение каталога и т. д. Но для меня сейчас работает достаточно хорошо. Так что, по крайней мере, поделитесь решением, которое у меня есть. Вернусь сюда, если я сделаю некоторые из этих улучшений.

[1]: лучше хранить regenerate-haskell-tags в вашем $PAHT.

person Martin Krauskopf    schedule 08.09.2012