尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Hydra Shell Tab 补全:一条命令为配置命令行接入自动补全

Hydra Shell Tab 补全:一条命令为配置命令行接入自动补全 Hydra Shell Tab 补全一条命令为配置命令行接入自动补全【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra导读Hydra 的配置文件体系配置组、配置节点、嵌套键值命令众多手敲容易出错。本指南以website/versioned_docs/version-0.11/tutorial/7_tab_completion.md为基础讲解如何为 Hydra 应用启用 Shell TAB 自动补全并深入当前仓库源码剖析-sc/--shell-completion的子命令分发、CompletionPlugin插件化架构以及配置组、配置节点/值、文件路径三类补全的底层实现。读完你可以在一分钟内为自己的 Hydra 应用接入 Bash以及当前仓库已支持的 Fish、Zsh补全并理解补全结果的生成逻辑与调试方法。一句话启用补全原教程给出的启用方式是执行一条eval命令让 Shell 加载 Hydra 生成的补全脚本eval $(python my_app.py -sc installSHELL_NAME)其中my_app.py是使用了hydra.main装饰器的应用入口脚本-sc是--shell-completion的简写参见 utils.py 中的参数定义SHELL_NAME替换为你的 Shell 名称即bash在 version-0.11 时代文档明确说明仅支持 Bash并呼吁社区为其他 Shell 实现补全插件而当前仓库已内置 Bash、Fish、Zsh 三个官方插件见下文「插件化架构」一节。如果你不确定当前环境该用哪条命令可以直接查看 Hydra 自身的帮助python my_app.py --hydra-help--hydra-help会输出 Hydra 专属帮助其中就包含Install or Uninstall shell completion一节列出每个已发现补全插件的安装/卸载命令。该帮助文本由 utils.py 中的_get_completion_help()动态生成它遍历所有已发现的CompletionPlugin子类依次拼接provides()的 Shell 名、命令类型install/uninstall以及help(cmd)返回的具体命令模板因此你看到的就是针对当前安装环境的精确命令直接复制即可。底层机制-sc的三个子命令eval $(python my_app.py -sc installbash)之所以有效是因为 Hydra 在解析命令行参数时拦截了-sc/--shell-completion并转入专门的补全处理流程。主流程见 utils.py--run、--multirun、--cfg、--info与--shell-completion互斥一次只能指定其一当指定了--shell-completion时会调用hydra.shell_completion(...)。真正的分发逻辑在 hydra.py 的shell_completion()方法中子命令校验支持install、uninstall、query三个子命令通过OmegaConf.from_dotlist(overrides)解析且必须恰好指定其中一个否则抛出ValueError。插件查找调用get_shell_to_plugin_map()建立shell 名 → CompletionPlugin 实例的映射若两个插件声称支持同一 Shell 会报错找不到对应插件时会列出当前可用的全部 Shell 名。按子命令执行install输出一段 Shell 脚本由eval加载例如 Bash 的补全函数与complete注册语句uninstall输出卸载脚本清理补全函数并恢复被保存的旧补全规则query由 Shell 补全函数在用户按下 TAB 时调用程序读取环境变量COMP_LINE解析当前输入行并输出候选列表。补全能完成什么原文档指出Hydra 的 TAB 补全可以补全三类内容配置组config groups例如输入db后补全db输入db后列出该组下所有配置选项配置节点与值configuration nodes and values例如server.之后列出该节点下的所有键键之后补全可选值以.或/开头的路径此时切换为文件系统路径补全。这些行为在当前仓库的测试 test_completion.py 中有大量精确断言可以直接作为行为规范。以hydra/test_utils/configs/completion_test配置目录为测试底座base_completion_list展示了空输入时补全出的完整候选dict. dict_prefix group hydra hydra. list. list_prefix test_hydra/更细粒度地看输入补全结果类型dictdict.、dict_prefix配置节点 / 新键dict.dict.key1、dict.key2、dict.key3节点内键dict.key1dict.key1val1键的可选值test_hydra/lautest_hydra/launcher嵌套配置组test_hydra/launchertest_hydra/launcherfairtask组内配置选项hydra/hydra/env、hydra/help、hydra/launcher等Hydra 内置配置组从中可以观察到三条规则字典节点以.结尾提示继续深入配置组以结尾提示选择选项嵌套组以/结尾提示进入子组。当某个值缺失测试中dict.key3是???时补全会给出dict.key3本身但不再提供值候选避免给出错误建议。插件化架构一个 Shell 一个插件补全功能是 Hydra 插件体系的一部分。抽象基类定义在 completion_plugin.py每个插件必须实现四个方法install()输出安装补全所需的 Shell 脚本uninstall()输出卸载脚本provides()返回该插件服务的 Shell 名称如bash、fishquery(config_name)基于环境变量中的命令行内容输出补全候选help(command)返回供--hydra-help展示的安装/卸载命令模板。version-0.11 文档说目前仅支持 Bash这一点与当时仓库状态一致当前仓库则已经内置了三个官方实现位于 hydra/_internal/core_pluginsbash_completion.pyprovides()返回bash是功能最完整的实现fish_completion.pyprovides()返回fish通过 fish 的complete -c注册补全函数zsh_completion.pyprovides()返回zsh内部直接委托给BashCompletion——因为 Zsh 与 Bash 补全函数兼容安装命令实际是eval $(python my_app.py -sc installbash)见 zsh_completion.py 的帮助文本。如果你希望为其他 Shell 提供补全遵循同一插件接口实现并在hydra_plugins包中注册即可Plugins.instance().discover()会自动发现它--hydra-help也会自动列出它的命令。Bash 补全的安装脚本与 query 调用链以 Bash 为例install生成的脚本bash_completion.py做了这几件事把当前已有的complete -p exec规则保存到环境变量_HYDRA_OLD_COMP供卸载时恢复定义hydra_bash_completion()函数解析$COMP_LINE当命令形如python 脚本.py时校验脚本文件存在且包含hydra.main标记避免对非 Hydra 脚本触发补全测试 test_completion.py 专门验证了这一点调用$helper -sc querybash同时透传COMP_POINT与COMP_LINE环境变量用compgen -o nospace -o default -W $choices过滤出与当前单词匹配的候选写入COMPREPLY。query子命令的处理在 bash_completion.py从环境变量读取COMP_LINE调用基类的strip_python_or_app_name()剥掉python 脚本.py或已安装应用名正则见 completion_plugin.py然后进入基类_query()生成候选。Fish 插件的query同样基于COMP_LINE只是候选输出用换行分隔fish_completion.py。候选生成的三个层次_query()completion_plugin.py是补全的核心按优先级处理三类请求1. 文件路径补全。当当前单词或其之后的部分以.、/、\、./、.\\等前缀开头时Windows 还包含盘符如c:走complete_files()列出目录内容并过滤前缀。这就是原文档所说以.或/开头的路径的补全。2. 配置组补全。_query_config_groups()completion_plugin.py依据与/的位置判定当前补全目标输入含时列出该组的配置选项ObjectType.CONFIG补全为组选项无时按组名补全若某组下没有子组但有配置文件则追加若只有子组则追加/支持追加与~删除前缀并原样回填到候选上——测试用例group→groupdict、grouplist~group→~groupdict、~grouplisttest_completion.py。3. 配置节点与值补全。当不是精确匹配组时Hydra 会尝试用当前已输入的前缀 overrides 加载完整配置load_configuration再调用_get_matches()在配置树上匹配。_get_matches()completion_plugin.py的规则是字典节点 → 候选为键.其值为配置时或键其为原始值时列表节点 → 候选为索引输入以./结尾时直接深入到对应节点取下一层键或当前值布尔值统一以小写字符串输出若配置因缺 mandatory 项等原因加载失败ConfigCompositionException则静默跳过节点补全只保留配置组候选避免给出误导结果。--multirun模式下run_mode切换为RunMode.MULTIRUN用同一套逻辑给出候选测试中对--multirun前缀的断言与普通模式一致列表/组的多选语法如groupdict,list当前补全仍以xfail标记为不支持。卸载与调试卸载同样通过-sc完成eval $(python my_app.py -sc uninstallbash)Bash 插件的uninstall()bash_completion.py输出unset hydra_bash_completion、恢复_HYDRA_OLD_COMP中保存的旧complete规则并清理该环境变量Fish 插件则输出complete -e -c name注销补全注册fish_completion.py。调试补全行为时Bash 插件支持环境变量开关HYDRA_COMP_DEBUG1bash_completion.py开启后会打印解析出的COMP_LINE、COMP_POINT、当前单词以及query返回的原始候选列表方便你确认是 Shell 侧脚本问题还是 Hydra 侧候选生成问题。注意事项与适用前提本文启用命令中的SHELL_NAME写法与仅支持 Bash的表述来源于 version-0.11 教程在当前仓库中bash、fish、zsh均已内置支持且帮助文本建议 Zsh 用户直接使用installbash。Fish 的安装写法略有不同python my_app.py -sc installfish | source。补全候选依赖当前应用配置配置组来自配置搜索路径中的目录结构节点与值来自实际加载出的配置树。若配置文件缺失或 defaults 中存在未填充的 mandatory 项节点补全会被跳过仅保留组补全。query子命令依赖 Shell 传入的COMP_LINE环境变量因此它只应被补全脚本调用不宜手动直接执行手动执行会因缺少该变量而解析失败。多选语法如groupdict,list的补全、以及~前缀在 Zsh/Fish 中的表现存在已知限制相关用例在测试中分别以xfail标记test_completion.py使用这些 Shell 时需注意。【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表