我使用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.map
,Set.map
,Random.map
等的所有定义。*.elm
文件,包括测试和旧依赖项。基本上我想要一个解决方案:
List.map
应该更喜欢名为map
的文件中List.elm
的定义。 *.elm
source-directories
个文件
tests
目录*.js
个文件elm-stuff/packages
目录这可以用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
答案 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
。