更新完 Antigravity,我的终端配置全没了

cover

大家好,我是飞飞。

昨天更新 Antigravity,更新完打开终端,所有别名全没了。gp 不认识了,ll 不认识了,JAVA_HOME 也空了。

我打开 ~/.zshrc——这是 macOS 终端的核心配置文件,你的快捷命令、环境变量、开发工具路径全存在这里——里面只剩两行。Antigravity 自己写的 PATH 配置。

我攒了两年的东西,全被它一次更新覆盖了。

说真的,一个 IDE 更新凭什么动我的 shell 配置?你自己的 PATH 你加到自己的配置里去啊,往 .zshrc 里写什么?这跟装个 App 结果它把你桌面壁纸换了有什么区别?

第一反应:从内存里抢救

幸运的是,我还有一个终端窗口开着。那个 session 是更新之前启动的,里面的 shell 状态还是旧的。

我马上开始导出。

1
2
3
4
5
6
7
8
# 导出所有别名
alias -L > ~/alias_backup.zsh

# 导出所有函数
functions > ~/functions_backup.zsh

# 导出所有环境变量
export -p > ~/env_backup.zsh

alias -L 是 zsh 的一个好东西,它会把别名输出成可以直接 source 的格式——alias gp='git push' 这种。不像 alias 裸跑,输出格式不统一。

functions 会把所有函数定义打出来,包括函数体。但问题是,它也会把 zsh 自带的补全函数全打出来——几百个以 _ 开头的函数。我后来手动删了半天。

export -p 导出环境变量。但这里面混了很多 session 级别的临时变量,比如 TERM_SESSION_IDITERM_PROFILE 这些,不是我自己设的。也得手动筛。

这三条命令救回了大概 70% 的内容。剩下 30% 是一些我记不清的小函数和条件判断逻辑,找不回来了。

谢谢 Antigravity,让我在一个周三的晚上复习了一遍 zsh 的内部命令。

拼了一个晚上,决定以后不能再这样了

拿到这些导出文件之后,我花了一整个晚上把它们拼回一个 .zshrc。过程很痛苦——别名和环境变量混在一起,一些 PATH 定义重复了四五遍,有些函数我都不记得是干什么的了。

拼完之后我问自己:下次 Antigravity 再更新,或者我换台电脑,这些东西还得重来一遍?

不行了,必须做两件事:版本控制,和模块化。

第一步:git + GitHub 私有仓库

最简单的方案。在 GitHub 上建一个私有仓库,把配置文件全丢进去。

1
2
3
mkdir ~/dotfiles
cd ~/dotfiles
git init

.zshrc 和相关配置文件复制进来,推到 GitHub。以后每次改完配置,commit 一下。换电脑的时候 clone 下来,做个软链接就行。

我没用 GNU Stow 也没用 chezmoi。那些工具很好,但对我来说太重了——我只需要管几个 zsh 配置文件,不需要管整个 home 目录的 dotfiles。一个 git 仓库加几条 ln -s 就够了。

第二步:把 .zshrc 拆成模块

以前我的 .zshrc 是一个 200 多行的大文件。PATH 定义、别名、Java 环境、Node 环境、Android SDK 路径、自定义函数全挤在一起。找个东西要翻半天,改一个地方怕影响别的。

我把它拆成了这样:

1
2
3
4
5
6
7
~/.zshrc                  # 主文件,只做 source
~/.zsh/
├── path.zsh # PATH 相关
├── alias.zsh # 别名
├── node.zsh # Node.js / nvm
├── java.zsh # JAVA_HOME / jenv
└── android.zsh # Android SDK

.zshrc 主文件变得很短:

1
2
3
4
5
6
# ~/.zshrc - 主配置文件

# 加载所有模块
for config_file in ~/.zsh/*.zsh; do
source "$config_file"
done

每个模块文件只管一件事。alias.zsh 里全是别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Git 快捷键
alias gp='git push'
alias gl='git pull'
alias gs='git status'
alias gd='git diff'
alias gc='git commit'
alias gco='git checkout'
alias gb='git branch'

# 日常
alias ll='ls -la'
alias ..='cd ..'
alias ...='cd ../..'

java.zsh 里只有 Java 环境配置:

1
2
3
# Java 环境
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH="$JAVA_HOME/bin:$PATH"

node.zsh 里只有 Node 相关:

1
2
3
4
# nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && source "$NVM_DIR/bash_completion"

这样拆完之后,好处很明显。

Antigravity 再手欠覆盖 .zshrc?没关系,主文件只有几行,重写一个 for 循环就行,真正的配置都在 ~/.zsh/ 目录里,它爱覆盖就覆盖去吧,反正覆盖的是个空壳。

想加一个新工具的环境配置?新建一个 .zsh 文件就行,不用在 200 行的大文件里找位置。

某个语言环境不用了?直接删那个文件,不怕影响别的。

第三步:让 Claude Code 帮我管配置

配置文件拆好、git 仓库建好之后,我发现 Claude Code 在这个场景下特别好用。

我把 dotfiles 仓库打开,告诉 Claude:”帮我检查一下这些配置文件有没有问题。”

它做了几件事让我印象很深。

它发现我的 path.zsh 里 PATH 被追加了四次 /usr/local/bin。每次 source 都会再加一遍,PATH 越来越长。它帮我改成了幂等写法——先检查路径是否已经在 PATH 里,再决定要不要加:

1
2
3
4
5
6
7
8
9
10
# 幂等 PATH 追加
add_to_path() {
case ":$PATH:" in
*":$1:"*) ;;
*) export PATH="$1:$PATH" ;;
esac
}

add_to_path "/usr/local/bin"
add_to_path "$HOME/.local/bin"

它还发现我的 alias.zsh 里有几个别名指向了不存在的路径——上次换 Homebrew 安装位置之后忘改了。它直接帮我更新成了正确的路径。

最后它建议我在每个模块文件开头加一行注释说明用途,方便以后翻。我以前觉得配置文件不需要注释,但文件多了之后确实有用。

现在我的工作流是这样:想改什么配置,打开 dotfiles 仓库,让 Claude Code 帮我改,改完跑一个 source ~/.zshrc 验证,没问题就 commit push。整个过程不超过两分钟。

一些实用建议

如果你也在用 Antigravity 或者任何喜欢往你 shell 配置里乱写东西的工具,建议做好准备。

现在就跑一遍 alias -L > ~/alias_backup.zsh。不用等配置丢了再着急。这条命令的输出是可以直接 source 的,存一份在云盘里没坏处。

.zshrc 拆成模块。不用一步到位,先把 PATH 和别名分出去就行。主文件里一个 for 循环 source 所有 .zsh 文件。以后再慢慢拆。

建一个 GitHub 私有仓库管理配置。git initgit remote addgit push,三条命令的事。以后每次改完配置随手 commit。

如果你用 Claude Code,试试让它帮你审一遍配置。它对 PATH 去重、变量规范化、幂等性检查这些事做得很好。比自己翻配置文件效率高得多。

配置文件这种东西,平时觉得无所谓,丢了才知道疼。我那个晚上从内存里一条一条捞别名的经历,希望你不用体会。Antigravity 下次更新的时候,我的配置已经在 GitHub 上躺着了,它随便折腾。

你的 .zshrc 有多少行?有没有版本控制?评论区聊聊。