交互式 zsh 启动时按以下顺序执行(~/.zshrc 经 symlink_dot_zshrc.tmpl 指向 ~/.config/zsh/.zshrc,源码为 dot_config/zsh/dot_zshrc)。顺序即语义——同名定义后加载者生效,例如 k 别名由 sdk.zsh 按需定义,因此 aliases.zsh 有意不定义 k。
- Zim 引导:缺失时下载 zimfw,随后
zimfw init生成并加载~/.zim/init.zsh(含补全、高亮、自动建议等)。 - PATH 注入:前置
~/bin、Homebrew、/usr/local/bin、~/.local/bin等,并按目录存在性守卫注入 cargo/rustup 路径。 - 工具初始化:
zoxide/mise/starship按command -v守卫顺序eval初始化,未安装静默跳过;brew shellenv由 Zim 的zimfw/homebrew模块在 init.zsh 阶段注入(早于 rustup 守卫,避免重复 eval);fzf键位绑定唯一收敛于fzf.zsh(~/.zshrc不再重复)。 - 三模块加载:依次
sourcealiases.zsh(导出$EDITOR/$VISUAL)→fzf.zsh(依赖$EDITOR的 Ctrl-G 绑定)→sdk.zsh(惰性加载 SDKMAN、缓存补全等)。 - SDK 环境:
sdk.zsh无条件加载,内部逐项守卫(SDKMAN 惰性、kubectl/docker 补全缓存)。SDKMAN 初始化失败不再递归,重 source 不替换已初始化函数。补全缓存按真实路径/stat 身份失效;每工具内建 flock 覆盖检查、发布与加载,compiled artifact 以最终源码名生成。
完整命令与守卫细节以 dot_config/zsh/dot_zshrc 与三模块源文件为准,模块契约详见 dot_config/zsh/README.md。
环境变量说明:Zsh/Fish 都只在
LANG、EDITOR或VISUAL未设置或为空时设置默认值;非空的继承值会保留。Ghostty 则显式设置LANG=zh_CN.UTF-8。$EDITOR/$VISUAL由aliases.zsh导出。
Zim 模块由 dot_config/zsh/dot_zimrc(经 symlink_dot_zimrc.tmpl 部署为 ~/.zimrc → ~/.config/zsh/.zimrc)定义,按环境、提示符、补全、收尾四组组织,通过 zimfw 加载。核心包括基础环境(environment/utility 等)以及补全链(Homebrew 自适应路径、zsh-completions、completion、fzf-tab)。收尾模块为语法高亮、历史子串搜索与自动建议。提示符模块(duration-info/prompt-pwd/asciiship)已注释停用,提示符由 Starship 接管。完整清单、加载顺序与注释掉的未启用模块以 dot_zimrc 源码为唯一权威。
已设置
ZSH_AUTOSUGGEST_MANUAL_REBIND=1以提升末尾模块性能;历史的ZSH_HIGHLIGHT_HIGHLIGHTERS配置因子模块未启用而删除。
Starship 由 zsh(eval "$(starship init zsh)")与 fish(config.fish 内 starship init fish)双侧初始化;提示符配置 starship.toml 不在仓库内(已于 0ad1efc 移除),实际位于机器本地 ~/.config/starship.toml(Catppuccin Mocha 单行 powerline 布局)。跨机迁移需自行拷贝该文件;仓库侧仅保证 starship 二进制与初始化路径可用。
dot_config/zsh/fzf.zsh 统一管理 fzf 初始化、全局选项与交互函数,详见源文件与 dot_config/zsh/README.md。
fzf 前缀按平台自适应探测(Apple Silicon /opt/homebrew → Intel /usr/local → ~/.fzf → /usr),结果缓存至 ~/.cache/zsh/fzf_prefix 并支持自愈重探;探测后按需追加至 $PATH,随后带守卫地 eval "$(fzf --zsh)" 初始化键位与补全。该 eval 是全链路中 fzf 键位的唯一初始化点。具体测试条件与缓存文件名以 fzf.zsh 为准。
FZF_DEFAULT_COMMAND / FZF_ALT_C_COMMAND / FZF_CTRL_T_COMMAND 的实际命令(含 fd 主力与 rg 兜底、排除列表)均在 fzf.zsh 中定义,通过 exclude_list 变量展开。以源文件 dot_config/zsh/fzf.zsh 为唯一权威。
FZF_DEFAULT_OPTS(布局、颜色、全部键位绑定)集中在 fzf.zsh 中定义——键位绑定直接写在源文件里,以 fzf.zsh 源码为准,本节不再逐字抄录。要点:
- 编辑器打开键位原为
ctrl-o,现改为ctrl-g(ctrl-g:execute($EDITOR -- {} >/dev/tty 2>&1),$EDITOR由aliases.zsh导出); - 原
ctrl-e:execute(code {} &> /dev/tty)的 VS Code 打开绑定已注释(仅保留注释行,不再生效); - 保留 Tab/Shift-Tab 默认多选切换行为,不重绑定为纯移动。
专项 FZF_CTRL_R_OPTS / FZF_CTRL_T_OPTS / FZF_ALT_C_OPTS(排序、预览、提示语等)亦在同文件中定义,以源文件为准。
fzf.zsh 提供 frg(内容搜索预览并跳转)、fkill/find_large_files/ftm(进程/大文件/tmux 会话)以及 flf/flkill/flnet/fluser(lsof 浏览)等交互函数,函数列表与依赖见源文件 dot_config/zsh/fzf.zsh。预览共享 LSOF_PREVIEW 片段(直接使用 fzf 的 PID 字段,不再启动 awk)。fkill/flkill 在发信号前校验全部正整数 PID 并去重;frg 拒绝非正整数行号,避免文件名中的冒号变成 Neovim +Ex 命令,含冒号文件名仍不支持可靠导航。详见源文件。
auto-update 与 update-all 定义于 dot_config/zsh/aliases.zsh,前者为兼容旧习惯的一键入口(可选 onproxy 后委托后者),后者为关联数组驱动的批量更新(支持参数过滤、失败计数与耗时统计)。覆盖目标、任务定义与彩色输出细节均以 aliases.zsh 源文件为准,详见 dev-tools.md 与源文件。
Aloxaf/fzf-tab 由 dot_config/zsh/dot_zimrc 经 zimfw 加载,fzf.zsh 仅保留 zstyle 配置(补全排序、描述格式、颜色、fzf-preview、fzf-flags 等)。完整 zstyle 列表以 fzf.zsh 为唯一权威。普通 fzf 动作使用 sh -c;fzf-tab 的 CLI flags 单独覆盖为 zsh -f -c,因为其预览初始化包含 Zsh 专属语法。
Fish 是 Ghostty 的登录 shell:Ghostty 以 command = direct:/opt/homebrew/bin/fish -l 启动(zsh -l / tmux 方案注释保留);Alacritty 经 [terminal.shell](/opt/homebrew/bin/fish -c "tmux new -A -s main")进入 tmux;kitty 以 shell = /opt/homebrew/bin/fish --login --interactive 固定(kitty 主配置为机器本地维护,仓库仅保留 kitty.local.conf 作参考、不参与部署);tmux default-shell 亦为 Fish——四终端(Ghostty/Alacritty/kitty/tmux)均为 Fish。Zsh 栈(XDG 收敛 + Zim 三模块)完整保留为次选入口(~/.zshrc 经 symlink 指向 ~/.config/zsh/.zshrc)。仓库中 dot_config/fish/(部署后为 ~/.config/fish/)提供:config.fish 在 interactive 时初始化 Starship 与 zoxide,fish_plugins(13 插件)声明插件清单,fisher 将插件安装于 ~/.config/fish/fisher(fisher_path,退出 chezmoi 管理域),config.fish 把其 functions/completions/conf.d 注入搜索路径;conf.d 六文件分层(00_env/01_activate/10_sys/20_dev/21_k8s/22_rev)承载环境与别名,可调用大函数(update-all、onproxy、y、serve 等 18 个)在仓库 functions/ 惰性加载(首次调用才 source),completions/ 含 kubecolor 补全与 OrbStack docker/kubectl/orbctl symlink 补全。Fish 侧已初始化 Starship、zoxide(config.fish 的 zoxide init fish 与 fzf_zoxide 插件)与 fzf 键位(fzf.fish 插件经 fisher_path 生效,不写入仓库 functions/);mise 已双侧接入(zsh 侧 dot_zshrc 的 eval "$(mise activate zsh)" + fish 侧 conf.d/01_activate.fish 守卫激活);SDKMAN 惰性桩两侧对齐(zsh 原生接管式;fish 经 edc/bass 转发 bash init,导出变量差量回传),详见 dot_config/fish/ 源目录与 layout.md。
Zsh 与 Fish 已对齐的环境契约包括:可移植时间戳别名、LANG/EDITOR/VISUAL 非空值守卫、HOMEBREW_NO_* 静默标志、代理回环豁免(no_proxy/NO_PROXY)、k8s 快捷别名集、ws/wp 目录跳转、du -h -d 2 profile、wget -c、编辑器别名(v/vi/vim/nv/nvi)、format(biome)、update-all 记账(attempted/skipped/failed)与 rustup 目标名互认(fish 侧接受 rustup≈rust)。两侧的 rm/cp/mv -i 别名都已注释停用;不要依赖它们提供覆盖/删除确认。Fish 仅将 10_sys.fish 中遮蔽常见系统命令的部分别名限制在交互 shell;20_dev.fish 与 21_k8s.fish 的应用别名在非交互 fish 中也定义。Zsh 则由交互式 .zshrc 加载整组别名。
以下不对称为有意保留(port 与否以使用场景为准,勿机械同步):
| 不对称项 | zsh 侧 | fish 侧 | 说明 |
|---|---|---|---|
| 工具快捷别名 | 无 | Go 6 个、Maven 5 个、pip 5 个、pnpm 5 个、Cargo 6 个、数据库 2 个(共 29 个) | fish 是四终端主力交互 shell,日常快捷别名集中在此;zsh 为维护中的次选入口 |
| AI 入口命名 | cla_cfg / clp_cfg |
claconfig / clpconfig |
同义不同名,各自历史习惯 |
lt / fishsource / 剪贴板 cbcopy、cbpaste |
无 | 有 | Fish 侧专属;finder 与 iterm* 两侧均有 |
k 定义点 |
仅当 kubectl 存在时定义;kubectl() 在可用时调用 kubecolor |
无条件定义 k=kubecolor |
Zsh 有命令存在性守卫;Fish 调用 k 前必须安装 kubecolor |
| update-all stderr | 捕获 + 失败末 5 行摘要(2>! mktemp) |
实时透传 | fish 无 NO_CLOBBER/mktemp 模板约束 |
| Rust 目标名 | 仅 rustup |
rust(另接受 rustup) |
fish 保持短名,兼容 zsh 肌肉记忆 |
| fzf 环境/键位 | fzf.zsh 前缀探测 + fzf --zsh |
fisher 插件 patrickf1/fzf.fish |
各随生态惯例,FZF_DEFAULT_* 子集 fish 侧不设 |