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
.hs
. - person Ory Band   schedule 21.08.2012