本仓库是 chezmoi 的源目录——永远编辑源文件,不要直接改 $HOME 下的目标文件(否则下次 apply 会被覆盖,产生漂移)。
# 1. 编辑源文件(chezmoi edit 会直接打开源目录中的对应文件)
chezmoi edit ~/.config/zsh/.zshrc # XDG 真实入口(源 dot_config/zsh/dot_zshrc)
chezmoi edit ~/.zshrc # 注意:~/.zshrc 解析到的是一行符号链接模板 symlink_dot_zshrc.tmpl
# (改 zshrc 内容请用上面一行,chezmoi source-path 实测)
# 或直接:
$EDITOR ~/.local/share/chezmoi/dot_config/zsh/dot_zshrc
# 其他示例:
chezmoi edit ~/.config/nvim/lua/config/options.lua
# 2. 预览将要发生的变更(apply 前必看)
chezmoi diff
# 3. 应用到 $HOME
chezmoi apply
# 4. 验证(见下方验收清单),通过后提交
git -C ~/.local/share/chezmoi add -A && git -C ~/.local/share/chezmoi commit -m "..."小贴士:
chezmoi edit等价于用$EDITOR打开~/.local/share/chezmoi/下的对应dot_/private_源文件; 直接编辑源文件亦可,效果相同。详见 layout.md 的命名约定。
| 命令 | 用途 |
|---|---|
chezmoi managed |
列出所有被管理的目标文件 |
chezmoi diff |
源与目标的差异预览(apply 前必看) |
chezmoi apply --dry-run |
试运行,不实际写入 |
chezmoi add <file> |
把已有文件纳入管理(自动加 dot_ / private_ 前缀) |
chezmoi add --encrypt / --template |
需要时再启用加密/模板 |
chezmoi forget <file> |
停止管理(源文件一并删除) |
chezmoi doctor |
环境体检 |
chezmoi status |
简要漂移概览(等价 git status 视角) |
chezmoi ignored |
查看被 .chezmoiignore 排除的文件 |
zimfw update |
更新 Zim 插件(zsh,改动 dot_config/zsh/dot_zimrc 后按需执行) |
zimfw upgrade |
升级 zimfw 自身(zsh) |
zimfw init |
重建 ${ZIM_HOME}/init.zsh(改动 ~/.config/zsh/.zimrc 后需要,dot_zshrc 会按 -nt 时间戳自动重建) |
zimfw info |
查看 zimfw 版本与模块信息 |
auto-update |
一键全量更新入口:若定义了 onproxy 函数则先切代理,随后直接委托 update-all 执行(覆盖目标一致);定义于 dot_config/zsh/aliases.zsh,详见 dev-tools.md |
update-all [targets...] |
关联数组驱动的批量更新,支持参数选择目标(如 update-all brew mise)、带失败计数与耗时统计;覆盖 brew / rustup / tldr / uv / mise / pi 共 6 项(已覆盖 mise,与 auto-update 的核心差异);定义于 aliases.zsh,详见 dev-tools.md |
auto-update与update-all均定义于dot_config/zsh/aliases.zsh;auto-update为兼容旧习惯的一键入口(内部委托update-all),update-all为支持参数过滤、失败计数与耗时统计的实际实现,二者覆盖目标一致(均含mise);详见 dev-tools.md 对比表。
从仓库根执行,不部署到真实 HOME,不联网、不加载真实插件或运行更新器:
python3 docs/validation/check.py --strict依赖、跳过项与隔离边界见 validation/README.md,本次审查结论见 optimization.md。
下方命令使用真实 HOME;交互 shell 与 Neovim 首次启动可能下载插件,zimfw update/init 会更新或重建插件。仅在确认要对当前机器操作时逐项执行,勿整块复制进 CI 或误当纯验证。
改动不同组件后至少跑过对应检查(覆盖 zsh / zim / starship / ghostty / alacritty / nvim / fish / mise / git / chezmoi):
# zsh 模块(语法 + 干净启动 + 关键定义)
for f in ~/.config/zsh/{aliases,fzf,sdk}.zsh ~/.config/zsh/.zshrc ~/.config/zsh/.zimrc; do zsh -n "$f" || exit 1; done
# 逐文件校验(实测 zsh -n 多文件传参时只查首个);覆盖 aliases.zsh 中的 auto-update / update-all(含关联数组、耗时统计)语法
zsh -ic 'exit' # 干净启动无报错
zsh -ic 'type ls df du; echo $EDITOR' # 关键别名/变量(EDITOR=nvim)
zsh -ic 'type auto-update update-all' # 验证更新函数已加载(update-all 支持参数过滤、失败计数与耗时统计)
# 注意:短别名 k 定义在 sdk.zsh 且仅当 kubectl 可用时才存在,无 kubectl 的机器上属预期缺失
# Zim 插件管理器(改动 ~/.config/zsh/.zimrc 后;重启 shell 时 dot_zshrc 会按 -nt 时间戳自动重建 init.zsh)
zsh -ic 'zimfw info' # 查看 zimfw 版本
zsh -ic 'zimfw update' # 更新插件
zsh -ic 'zimfw init' # 手动重建 init.zsh
# starship 渲染
starship prompt
starship explain # 可选:查看各模块判定
# ghostty 配置解析(会打印生效值;ghostty CLI 需先在 Ghostty 菜单 →
# "Install CLI tool" 安装,否则用全路径 /Applications/Ghostty.app/Contents/MacOS/ghostty)
ghostty +show-config
# 或:ghostty +show-config | head -n 50
# neovim 无报错启动
nvim --headless +qa
nvim --headless -c "lua require('config.lazy')" -c "qa" # 可选:校验 lazy spec
# git 配置合法(未知键不会报错,但可确认解析;proxy 与 SSH 统一为 7890)
git config --list --show-origin | head
git config --get core.editor
git config --get safe.directory
git config --get-regexp proxy # 应为 socks5h://127.0.0.1:7890(与 SSH ProxyCommand 7890 统一)
# 或校验源文件:
git config --file ~/.local/share/chezmoi/dot_gitconfig --get-regexp proxy
# fish 配置语法检查(fish -n 只校验首个文件,必须逐个检查;实测多文件传参时后续文件被静默跳过)
for f in ~/.config/fish/config.fish ~/.config/fish/conf.d/*.fish; do fish --no-config -n "$f" || exit 1; done
# conf.d 现为六文件分层:00_env / 01_activate / 10_sys / 20_dev / 21_k8s / 22_rev(01_activate 以 type -q mise 守卫激活,与 zsh 侧 dot_zshrc 的 activate 对应;编号=加载阶段,文件名=领域)。可调用大函数(update-all/auto-update、onproxy/ofproxy、y、serve、netcheck、makes/xargsp/__half_cpu_count、bak/timer/decide、find-large/dus/filestats/recent/tree-size,共 18 个)在 dot_config/fish/functions/ 惰性加载(首次调用才 source);kubecolor 补全在 dot_config/fish/completions/kubecolor.fish;fisher 插件安装于 ~/.config/fish/fisher = fisher_path,退出 chezmoi 管理域,config.fish 注入其 functions/completions/conf.d,不写入仓库 dot_config/fish/functions/
# ⚠️ conf.d 分层重排的迁移清理:chezmoi 不删除源里移除的条目,旧四文件在其他机器
# git pull && chezmoi apply 后仍会残留并被继续 source(与新文件双份定义、旧 k8s 别名复活),
# 必须逐机手动清理:
rm -f ~/.config/fish/conf.d/{00_aliases,01_dev,01_rev,02_mise}.fish
# (新机器全新 apply 无此问题;全部存量机器清理完后可删除本段提示)
# mise 环境体检
mise doctor
mise ls # Bun/Deno/Go/pnpm 使用 latest;Node.js 固定为 24.19.0
# alacritty:CLI 无 --print-config 子命令(0.17 实测报错),配置解析在启动时进行,
# 冒烟启动(瞬间退出)即可验证配置可解析
alacritty --version
alacritty -e true
# chezmoi 全局状态
chezmoi doctor && chezmoi diff提交约定:小步提交、说明动机;涉及行为变化的改动在 commit body 里写明验证命令与结果。
更多工具链细节见 dev-tools.md,完整映射见 layout.md。
fzf 安装前缀缓存放在 $ZDOTDIR/.cache/zsh/fzf_prefix(未设置 ZDOTDIR 时即 ~/.cache/zsh/fzf_prefix;旧版 ~/.fzf_prefix_cache 首次加载时自动清理)。升级/卸载/换机器后若失效,模块会自愈删除并重新探测;
也可手动删除该缓存文件强制重建:
rm -f ~/.cache/zsh/fzf_prefix && exec zsh详见 dot_config/zsh/fzf.zsh 的探测逻辑与 shell.md。
dot_gitconfig 中仅一处引用 socks5h://127.0.0.1:7890(http "https://github.com",对该 URL 匹配的
HTTP/HTTPS 远程均生效),与 private_dot_ssh/private_config 的 ProxyCommand 探测端口 7890 一致
(nc -z 127.0.0.1 7890),更换端口时需同步修改 Git、SSH、Zsh/Fish shell 代理设置与相关文档。
历史遗留的冗余 [https …] / [ssh "ssh.github.com"] 段及注释化全局代理段均已清理,无需再处理旧注释。详见 dev-tools.md 与 getting-started.md。
auto-update 现为 update-all 的薄包装:打印 🚀 横幅、(若定义)先执行 onproxy 切代理,
随后直接调用 update-all(无参全量)。二者覆盖目标与失败统计行为完全一致:
| 维度 | auto-update |
update-all |
|---|---|---|
| 定义位置 | aliases.zsh 的 auto-update |
aliases.zsh 的 update-all |
| 覆盖目标 | 6 项(同 update-all,经委托实现) |
6 项:brew / rustup / tldr / uv / mise / pi(含 mise upgrade、pi update --all) |
| 参数 | 无参数,固定调用 update-all 全量 |
支持 update-all brew mise 参数过滤,未传参则全量;未知目标报错并提示可用列表 |
| 守卫与容错 | 由 update-all 实现 |
循环内 command -v $name 守卫 + eval 失败则 failed++ |
| 统计与输出 | 由 update-all 提供(另加 🚀 横幅与可选 onproxy) |
失败计数 failed、耗时 mins / secs、print -P 彩色输出(蓝标题/绿成功/黄跳过/红失败) |
| 适用场景 | 兼容旧习惯的一键全量(含代理切换) | 需单目标更新、需查看耗时与失败统计、脚本化调用 |
历史:旧版
auto_update曾顺序守卫调用五个*_update辅助函数(不含mise), 这些函数已在提交0af1f61中删除,auto_update随之改为委托update-all。
两者均定义于 dot_config/zsh/aliases.zsh,zsh -n 已覆盖其语法校验。
详见 dev-tools.md 与 aliases.zsh 源码。
GOPATH=~/.local/share/go、GOPROXY=https://goproxy.cn,direct(dot_config/zsh/sdk.zsh,与 fish00_env.fish统一)pip清华镜像别名(dot_config/zsh/aliases.zsh的pip_tsinghua_mirror)、uv镜像开关注释(sdk.zsh)
新机器路径不一致时按需调整源文件后 chezmoi diff → apply。详见 shell.md 与 sdk.zsh 注释。
说明目标文件在应用后被直接改过(例如工具自动写回配置)。两种处理:
- 这些改动是想要的 → 把内容合并回源文件再提交;
- 是临时产物 → 直接
chezmoi apply覆盖回去。
不要让漂移长期存在,否则无法分清哪边是权威版本。
可用 chezmoi status / chezmoi diff 快速查看漂移文件列表。
.chezmoiignore(仓库根)控制 chezmoi add / apply 时忽略的目标名模式(模式按部署后的目标路径匹配,不是源文件名),当前包括:
- 本地覆盖与备份:
**/*.local、**/*.local.*、**/*.bak(**/前缀才能覆盖嵌套路径,如.config/kitty/kitty.local.conf仅入库不部署)、**/.DS_Store、**/*.log* - 仓库文档:
**/*.md(包括根级与嵌套 README 和其他 Markdown)、docs/;**/LICENSE行保留为防御(根级与nvim/LICENSE文件均已删除) - 敏感信息:
**/*token*、**/*secret*、**/*credential*、**/*auth.json*、**/hosts.yml(覆盖嵌套路径) - 构建产物:
**/node_modules/、**/.pnpm-store/ - fish 机器本地状态:
.config/fish/fish_variables(fish Universal Variables,仅本机) - 机器本地配置:
.claude/settings.json、.codex/config.toml .orca/与.vscode/是防御性 ignore pattern;根.vscode/源目录当前不是 chezmoi target,具体 Git 例外由.gitignore管理
⚠️ 根锚定陷阱:.chezmoiignore模式锚定在源根,没有**/前缀的模式只匹配仓库根,嵌套目标仍会部署——这与全局.gitignore(无内部斜杠的模式自动匹配任意层级)相反。历史与现行共出现过三次“规则静默不生效”:源名失配的dot_gitconfig/**/dot_git、拼写错误**/REAMDME.md,以及本轮修复的**.log/node_modules//.pnpm-store/。新增规则务必用**/前缀,并由docs/validation/check.py::test_hygiene_rules_exclude_nested_targets以嵌套 fixture + mutation control 守住。
- Pi:Git 的
.gitignore只允许跟踪四个已审查配置;.chezmoiignore是运行时黑名单,不是部署 allowlist。它排除列出的 permission-mode/sessions/npm/missions/tasks/models-store/workflows state 与敏感路径,但其他本地dot_pi/源文件若不匹配黑名单,仍可能部署。Git 跟踪规则不能替代部署规则,提交前仍需审查 diff
历史修正(2026-08 收口):旧版曾按源名书写
**/dot_git/**/dot_DS_Store/dot_gitconfig(均不匹配目标名.git/.DS_Store/.gitconfig,从未生效),且**/README.md误拼为**/REAMDME.md、缺**/LICENSE——现已全部按目标名改写、删除无效行并补齐。因此dot_gitconfig→~/.gitconfig为正常部署目标(旧文档称其被排除、"仅作本地参考快照"系对无效行的误读);修复后chezmoi managed曾为 55 个目标;后续去重又删除了被更宽模式覆盖或已无对应文件的冗余行(根级README.md/LICENSE、docs/**、**/.git、*client_secret*、两条**.md及已不存在的REPO-INSIGHT.md),核心 targets 不变;此后 fish 配置扩容,并加入.config/fish/fish_variables至.chezmoiignore进一步排除。以上均为历史快照数字,会随配置与 chezmoi 版本变化,请以chezmoi managed实测为准。详见 layout.md。
注意:docs/ 被忽略意味着文档改动仅在仓库内维护,不会 apply 到 $HOME。新增文档请同步更新 layout.md 的索引。
旧注释曾提到用 git show baseline:... 找回已删除的配置(conda、wezterm 别名等),现已改为直接指向
git 历史。本仓库自 init 提交起从未打过 baseline 标签(git tag 为空),旧内容来自更早的独立
zsh-config 仓库;如确需找回请去旧仓库翻历史。不要在本仓库中创建同名标签造成混淆。
chezmoi add 会自动推断前缀;手工放文件进源目录时要记得:
- 隐藏文件加
dot_、要收紧权限的加private_、符号链接用symlink_(内容写目标路径)、可执行文件加executable_ - 模板文件追加
.tmpl后缀
详见 layout.md。新增配置请同步更新 layout.md 的映射表与 getting-started.md 的验证清单。