haskell - 为 Haskell Platform(标准库)生成 ctag,专门用于 prelude

标签 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) 和 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/

相关文章:

bash - Vim 从 bash 脚本运行命令并退出而不会使 shell 处于错误状态

c++ - 在 Vim 中注释 C++ 代码

go - ctags 识别 go 中的 const 变量

haskell - 在 Haskell 中实现 "findM"?

function - Haskell 中函数类型的差异

haskell - 如何将 RTS 选项传递给 runghc?

comments - 如何让 vim 为新文件添加标题注释?

c - 如何将函数指针映射到其定义?

vim - 如何修复重复的 cscope ?这是更好的方法吗?

haskell - 在 Haskell 中实现类型类时的任意类约束