chezmoi 模板函数 `completion`:在 dotfiles 中动态生成 Shell 补全脚本
开发工具CLI配置管理【免费下载链接】chezmoiManage your dotfiles across multiple diverse machines, securely.项目地址https://gitcode.com/gh_mirrors/ch/chezmoi点击查看免费下载导读chezmoi 提供了名为completion的模板函数它能在模板渲染阶段直接返回 chezmoi 自身针对指定 Shellbash、fish、powershell、zsh的补全脚本内容从而让你把“安装补全”这一环节纳入 dotfiles 的自动化流程。阅读本文后你将掌握该函数的语法、四类 Shell 的底层生成实现基于 Cobra 代码生成、它与chezmoi completion命令的等价关系以及如何在模板中实际落地使用。completion函数是什么completion是 chezmoi 模板体系中的一个函数用于获取 chezmoi 命令行的 Shell 补全代码。它接收一个字符串参数shell该参数只能是以下四个取值之一bashfishpowershellzsh函数返回值为对应的补全脚本全文一个多行字符串例如{{ completion zsh }}该示例会展开为完整的 zsh 补全脚本可直接写入用户的 zsh 补全目录或~/.zshrc引用的补全文件中。原文档assets/chezmoi.io/docs/reference/templates/functions/completion.md对函数语法与参数范围的定义即如上所示。源码中的注册与实现completion模板函数并非在配置初始化时静态注册而是挂在根命令的 pre-run 钩子中动态添加。原因在于它依赖命令树的根节点cmd来生成补全。见 internal/cmd/config.go#L2381-L2388// persistentPreRunRootE performs pre-run actions for the root command. func (c *Config) persistentPreRunRootE(cmd *cobra.Command, args []string) error { annotations : getAnnotations(cmd) // Add the completion template function. This needs cmd, so we cant do it // in newConfig. c.addTemplateFunc(completion, func(shell string) string { return mustValue(completion(cmd, shell)) }) ...这里有一个值得注意的实现细节模板函数体内通过mustValue包装了补全生成调用一旦传入不支持的 Shell 名称completion内部会返回错误并导致模板渲染直接失败而不是返回空串。四类 Shell 的生成逻辑真正的补全生成逻辑位于 internal/cmd/completioncmd.go#L41-L67 的completion函数中它基于 cobraspf13/cobra的代码生成器func completion(cmd *cobra.Command, shell string) (string, error) { builder : strings.Builder{} builder.Grow(16384) switch shell { case bash: includeDesc : true if err : cmd.Root().GenBashCompletionV2(builder, includeDesc); err ! nil { return , err } case fish: includeDesc : true if err : cmd.Root().GenFishCompletion(builder, includeDesc); err ! nil { return , err } case powershell: if err : cmd.Root().GenPowerShellCompletionWithDesc(builder); err ! nil { return , err } case zsh: if err : cmd.Root().GenZshCompletion(builder); err ! nil { return , err } default: return , fmt.Errorf(%s: unsupported shell, shell) } return builder.String(), nil }从源码结构可以看到bash使用GenBashCompletionV2新版 bash 补全格式并附带描述信息includeDesc truefish使用GenFishCompletion同样附带描述powershell使用GenPowerShellCompletionWithDesczsh使用GenZshCompletion其他任何值都会触发unsupported shell错误输出通过预扩容到 16 KiB 的strings.Builder收集避免频繁内存分配。与chezmoi completion命令的等价关系completion模板函数与 chezmoi 的chezmoi completion shell子命令共享同一套生成逻辑。该子命令定义于 internal/cmd/completioncmd.go#L14-L31completionCmd : cobra.Command{ GroupID: groupIDInternal, Use: completion shell, Short: Generate shell completion code, Args: cobra.ExactArgs(1), ValidArgs: []string{bash, fish, powershell, zsh}, ... }命令的RunE调用的正是同一个completion(cmd, args[0])函数internal/cmd/completioncmd.go#L33-L39并把结果写到标准输出。因此两者输出内容完全一致。命令的用法参考 internal/cmd/helps.gen.go#L218-L225chezmoi completion bash chezmoi completion fish --output~/.config/fish/completions/chezmoi.fish即completion函数是“模板世界”里的该命令适合在模板渲染阶段按需生成而chezmoi completion是“命令行世界”里的同名功能适合手动安装或写入安装脚本。此外该命令带有doesNotRequireValidConfig与persistentStateModeNone注解意味着它可以在没有有效配置和持久化状态的情况下独立运行。对应命令的完整文档见 assets/chezmoi.io/docs/reference/commands/completion.md。在模板中的实战用法completion函数最常见的落地方式是把生成的补全脚本写入目标机器的 Shell 补全目录。例如在 dotfiles 中维护一个“安装补全”的脚本模板run_前缀脚本借助run_onchange_仅在补全内容变化时更新#!/usr/bin/env bash mkdir -p {{ joinPath .chezmoi.homeDir .local/share/zsh/site-functions }} {{ completion zsh }} {{ joinPath .chezmoi.homeDir .local/share/zsh/site-functions/_chezmoi }}同样可以借助模板条件按机器差异生成不同 Shell 的补全{{ if eq .chezmoi.shell zsh }} {{ completion zsh }} {{ else if eq .chezmoi.shell fish }} {{ completion fish }} {{ end }}需要说明的是当前仓库 completions/ 目录下已预置了chezmoi-completion.bash、chezmoi.fish、chezmoi.ps1、chezmoi.zsh四个静态补全文件与模板函数生成的动态内容同源可作对照或离线分发使用。静态文件适合随包发布而模板函数适合在首次配置机器时按需精确落盘。使用边界与注意事项参数必须合法shell只接受bash、fish、powershell、zsh。传入其他值如tcsh会触发unsupported shell错误模板渲染随即失败因此不要在模板中对参数做模糊处理。函数只在有命令上下文时可用由于completion依赖根命令对象它是在persistentPreRunRootE阶段才被注册internal/cmd/config.go#L2381-L2388因此它面向的是 chezmoi 自身模板渲染的运行场景而非独立的纯函数。输出较大补全脚本约在 16 KiB 量级模板渲染结果会显著增大适合写入独立文件而非直接拼进~/.zshrc。只读仓库本文仅介绍查看、安装与配置方式无需修改仓库内容即可体验completion函数。总结completion模板函数把“Shell 补全安装”变成了 dotfiles 模板中一行可复用的表达式传入bash/fish/powershell/zsh之一即可获得与chezmoi completion shell命令完全一致的补全脚本。其底层由 cobra 的四类生成器驱动internal/cmd/completioncmd.go并依赖命令上下文在 pre-run 阶段动态注册internal/cmd/config.go。掌握它你就能在多台机器上实现补全能力的“声明式安装”进一步发挥 chezmoi 管理异构环境的能力。赞分享开发工具CLI配置管理【免费下载链接】chezmoiManage your dotfiles across multiple diverse machines, securely.项目地址https://gitcode.com/gh_mirrors/ch/chezmoi点击查看免费下载相关推荐chezmoi completion 命令详解为 bash / fish / powershell / zsh 生成 Shell 补全chezmoi completion 命令详解为 bash / fish / powershell / zsh 生成 Shell 补全 导读 completi开发工具CLI配置管理chezmoi 的 AWS Secrets Manager 模板函数在 dotfiles 中安全注入密钥chezmoi 的 AWS Secrets Manager 模板函数在 dotfiles 中安全注入密钥 导读 本文将完整讲解 chezmoi 内置的 aws开发工具CLI配置管理rclone completion fish 命令详解为 fish shell 一键生成 rclone 自动补全脚本rclone completion fish 命令详解为 fish shell 一键生成 rclone 自动补全脚本 导读 rclone completionCLI数据同步对象存储上一篇mlx-community/gemma-4-e2b-it-4bit vs 其他多模态模型性能对比与选择建议 下一篇PlacesToPostYourStartup社区贡献指南如何成为开源项目的活跃参与者创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AIGC检测技术原理与人工润色应对策略

AIGC检测技术原理与人工润色应对策略

1. AIGC检测技术的基本原理与挑战在探讨人工润色对AIGC检测结果的影响前,我们需要先理解AIGC检测系统的工作原理。当前主流的AIGC检测工具(如Turnitin、GPTZero等)主要基于以下几个维度的文本特征进行分析:1.1 文本特征分析维度词…

2026/9/20 8:09:35 阅读更多 →
iTOL系统发育树可视化核心原理与工程实践

iTOL系统发育树可视化核心原理与工程实践

1. 为什么非得用iTOL来美化系统发育树?——一个干了八年分子进化分析的老手的实在话做系统发育分析的人,几乎都经历过这种尴尬:在MEGA、IQ-TREE或者RAxML里跑完几十个基因、上百个物种的建树任务,好不容易拿到一棵bootstrap值看起…

2026/9/20 8:09:35 阅读更多 →
ARM7指令集入门:寄存器、寻址与流水线核心解析

ARM7指令集入门:寄存器、寻址与流水线核心解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 8:09:35 阅读更多 →

最新新闻

告别模板烂大街,一键wordpress建站怎么选服务器才不翻车

告别模板烂大街,一键wordpress建站怎么选服务器才不翻车

告别模板烂大街,一键wordpress建站怎么选服务器才不翻车 还在为网站长得像上个世纪的传单发愁吗?那些千篇一律的模板,不仅丑得扎眼,更致命的是加载慢、结构乱,根本撑不起你的品牌调性。很多站长朋友一上来就问我:市面上“一键wordpress”的选项这么多,到底该怎么选才不踩坑?…

2026/9/20 8:45:00 阅读更多 →
AI对话系统开发:从实践到优化的关键技术解析

AI对话系统开发:从实践到优化的关键技术解析

1. 项目概述"从野路子到系统思考:我与AI的九次灵魂对话"这个标题背后,隐藏着一段典型的AI技术探索历程。作为一名从业者,我完整经历了从零散尝试到体系化认知的转变过程。这九次关键对话,实际上代表着九个技术突破节点&…

2026/9/20 8:44:48 阅读更多 →
OpenResearch不是工具,而是本地优先科研工作流范式

OpenResearch不是工具,而是本地优先科研工作流范式

1. “OpenResearch”不是开源项目,而是一套本地优先的科研工作流范式最近在几个技术社区和科研协作群聊里,频繁看到“OpenResearch”被当作一个具体工具或 CLI 命令来讨论——有人问“orx install 失败”,有人贴出unable to locate the codex…

2026/9/20 8:44:48 阅读更多 →
AIGC检测与学术写作:深度改写与混合创作方法论

AIGC检测与学术写作:深度改写与混合创作方法论

1. 论文AIGC率问题的现状与挑战2026年的学术环境正在面临一个前所未有的挑战——随着生成式AI技术的普及,论文中AI生成内容(AIGC)的比例正在急剧攀升。最近一项针对全球TOP100高校的调研显示,超过67%的导师表示他们无法准确判断学…

2026/9/20 8:44:48 阅读更多 →
从零自研短链系统:从短码生成到高并发跳转的完整实战

从零自研短链系统:从短码生成到高并发跳转的完整实战

1. 内容整体设计与思路拆解短链这东西,听起来是个再小不过的工程。做之前我也觉得,不就是把一串长 URL 变成一个小短码嘛,能有多复杂。可真到动手写的时候才发现,一个能上线的短链系统,几乎把后端常见的套路全部串起来…

2026/9/20 8:44:48 阅读更多 →
昇腾Atlas 300V 24G部署YOLO实战:从ATC模型转换到AscendCL推理全流程

昇腾Atlas 300V 24G部署YOLO实战:从ATC模型转换到AscendCL推理全流程

1. 从“atlas”这个词说起:它到底指什么第一次看到“atlas”这个项目标题,很多人会愣一下——这词太泛了。地图册叫 atlas,希腊神话里扛着天球的泰坦神也叫 Atlas,而做 AI 部署的人看到它,第一反应往往是华为昇腾 Atla…

2026/9/20 8:44:48 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →