8

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

我正在寻找一种方法来生成标准 Haskell 平台库(模块)的ctags文件,以便在使用Vim编码时浏览源代码。我特别需要Prelude和其他最流行的模块,比如Data.List等等。

我知道可以通过 Hoogle 在网络上获得源代码,但是为了学习目的,我可以更轻松地随时跳转到源代码。

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

1 回答 1

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

或者,我们可能会切换到特定的分支。例如:

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或放入专用于 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.

于 2012-09-08T10:37:17.283 回答