为Haskell平台(标准库)生成ctags,专门用于前奏

时间:2012-08-20 21:02:19

标签: haskell vim ctags exuberant-ctags

我使用 Homebrew 在我的Mac上安装了Haskell,即brew install ghc haskell-platform

我正在寻找一种方法来生成标准Haskell平台库(模块)的 ctags 文件,这样我就可以在 Vim 中进行编码时浏览源代码。我特别需要Prelude和其他最受欢迎的模块,例如Data.List等。

我知道the source is available on the web via Hoogle,但是出于学习目的,每当我需要时,跳转到源会更容易。

  1. 安装Haskell平台时源位于何处?
  2. 安装Haskell平台时是否安装了源代码,或者只是编译后的二进制文件或类似的东西?
  3. 如何让源可用于在Vim中浏览?就像把生成的tags文件放在某处并告诉Vim从中读取它一样。我也明白没有必要重新生成tags文件,因为这些模块非常静态,不经常更新。

1 个答案:

答案 0 :(得分:10)

在评论中, permeakra 回答了

1)和2)。我将通过描述类似于我使用的设置来尝试覆盖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

我们可以选择切换到特定分支。 E.g:

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解释,请参阅此示例blog post

现在我们需要让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或专用于Haskell文件类型的Vim文件):

" 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