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

How can I use ctags with multiple Elm projects?

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

有一个现有的开放 issue from January 2016 with various suggestions, including a link to ctags-elm 提供:

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

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

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

但是这种方法还是有问题:

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

使用 ctags 或解析每个项目的 elm-packages.json 文件的 ctags 包装器是否可行?


[☨] 关于限定名称: 我知道有些人会缩写限定词,例如:

import Math.Vector3 as V3

我不希望 ctags 正则表达式在 Math/Vector3 中寻找 V3.add。 长期的解决方案是一个理解 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

我无法回答特定于 Elm 的问题,但是……

Ignores everything in each project's tests directory

将此添加到 ~/.ctags:

--exclude=tests

Ignores all the built *.js files

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

--exclude=\*.js

或排除编译它们的directory/directories。

Optionally scans the latest versions of library sources in each project's elm-stuff/packages directory

如何定义"latest"?

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

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

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

$ man ctags