如何在多个 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
但是这种方法还是有问题:
- 它忽略限定名称,因此尝试导航到
List.map
的定义将提供 Dict.map
、Set.map
、Random.map
等的所有定义。
- 它扫描我所有目录中的所有
*.elm
文件,包括测试和旧依赖项。
基本上我想要一个解决方案:
- 可以按照限定名称☨ 来定义它们:导航到
List.map
应该更喜欢名为 List.elm
的文件中 map
的定义。
- 扫描每个项目
source-directories
中的所有 *.elm
文件
- 忽略每个项目的
tests
目录中的所有内容
- 忽略所有内置的
*.js
文件
- 可选地扫描每个项目
elm-stuff/packages
目录 中库源的最新版本☨
使用 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
。
我使用 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
但是这种方法还是有问题:
- 它忽略限定名称,因此尝试导航到
List.map
的定义将提供Dict.map
、Set.map
、Random.map
等的所有定义。 - 它扫描我所有目录中的所有
*.elm
文件,包括测试和旧依赖项。
基本上我想要一个解决方案:
- 可以按照限定名称☨ 来定义它们:导航到
List.map
应该更喜欢名为List.elm
的文件中map
的定义。 - 扫描每个项目
source-directories
中的所有 - 忽略每个项目的
tests
目录中的所有内容 - 忽略所有内置的
*.js
文件 - 可选地扫描每个项目
elm-stuff/packages
目录 中库源的最新版本☨
*.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
。