我已经使用 Homebrew 在我的 Mac 上安装了 Haskell,即 brew install ghc haskell-platform
。
我正在寻找一种方法来生成标准 Haskell 平台库(模块)的 ctags 文件,以便我可以在 Vim 中编码时浏览源代码。我特别需要 Prelude
和其他最流行的模块,例如 Data.List
等。
我知道the source is available on the web via Hoogle ,但是出于学习目的,我可以在需要时更轻松地跳转到源代码。
- 安装 Haskell 平台时源位于哪里?
- 在安装 Haskell 平台时是否安装了源代码,或者只是编译的二进制文件或类似的东西?
- 如何使源代码可在 Vim 中浏览?就像将生成的
tags
文件放在某处并告诉 Vim 从中读取。我还知道不需要重新生成tags
文件,因为这些模块几乎是静态的并且不会经常更新。
最佳答案
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
运行gitbranch-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
中。
关于haskell - 为 Haskell Platform(标准库)生成 ctag,专门用于 prelude,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045118/