如何在多个Elm项目中使用ctags?

时间:2017-09-13 07:13:10

标签: vim elm ctags

我使用vim,我希望能够导航到跨多个Elm项目的功能和类型定义。我的理解是,最简单的方法是使用ctags。

自2016年1月起,现有开放issue提供了各种建议,其中包含指向ctags-elm的链接:

--langdef=Elm
--langmap=Elm:.elm
--regex-Elm=/^ *([[:lower:]][[:alnum:]_]+)[[:blank:]]*:[^:].*->.*/\1/f,function,functions/
--regex-Elm=/^ *([[:lower:]][[:alnum:]_]+)[[:blank:]]*:[^:][^-]+$/\1/c,constant,constants/
--regex-Elm=/^port +([[:lower:]][[:alnum:]_]+)[[:blank:]]*:[^:]/\1/p,port,ports/
--regex-Elm=/^type +([[:upper:]][[:alnum:]_]+)/\1/t,type,types/
--regex-Elm=/^type[[:blank:]]+alias[[:blank:]]+([[:upper:]][[:alnum:]_]+)/\1/a,type-alias,type-aliases/

如果您在~/.ctags中安装,则可以扫描所有来源:

$ ctags -R --languages=-all,+Elm

然而这种做法仍有问题:

  • 它忽略了限定名称,因此尝试导航到List.map的定义将提供Dict.mapSet.mapRandom.map等的所有定义。
  • 它扫描我所有目录中的所有*.elm文件,包括测试和旧依赖项。

基本上我想要一个解决方案:

  • 可以遵循限定名称☨的定义:导航到List.map应该更喜欢名为map的文件中List.elm的定义。
  • 扫描每个项目*.elm
  • 中的所有source-directories个文件
  • 忽略每个项目的tests目录
  • 中的所有内容
  • 忽略所有已构建的*.js个文件
  • 可选择扫描每个项目的elm-stuff/packages目录
  • 中的最新版本 library库源

这可以用ctags,还是用ctags包装器来解析每个项目的elm-packages.json文件?

[☨] 关于合格的名字:我知道有些人缩写限定符,例如:

import Math.Vector3 as V3

并且我不希望ctags正则表达式在V3.add中查找Math/Vector3。 长期解决方案是一个了解Elm模块和导入的工具,就像hasktags对Haskell一样。现在我可以忍受不理解缩写限定符的ctags。

[☨] 关于最新版本:依赖项的来源被下载到elm-stuff/packages/GITHUB-USERNAME/GITHUB-PROJECTNAME/VERSION-TAG,随着时间的推移,可以累积多个版本,例如:

elm-stuff/packages/kfish/elm-gamepad/3.0.0
elm-stuff/packages/kfish/elm-gamepad/3.1.0
elm-stuff/packages/kfish/elm-gamepad/3.2.0
elm-stuff/packages/kfish/elm-gamepad/3.4.0

1 个答案:

答案 0 :(得分:3)

我无法回答有关榆树的具体观点,但......

  

忽略每个项目的tests目录

中的所有内容

将此添加到~/.ctags

--exclude=tests
  

忽略所有已构建的*.js个文件

如果未在特定目录中编译,请将其添加到~/.ctags

--exclude=\*.js

或排除编译它们的目录/目录。

  

(可选)扫描每个项目的elm-stuff/packages目录中的最新版本库源

如何定义“最新”?

我能想到实现这一目标的唯一方法是预先编制要查看的地点列表,并通过ctags标志将其提供给-L

$ ctags -R -L list-of-files.txt .

实际上,编写一个shell脚本来生成一个合适的list-of-files.txt可能会解决你所有的痛点。也许有人已经考虑过这个......

请参阅$ man ctags