

開發者每天在終端機花的時間比想像中多。這篇記錄我打磨了好一陣子的 zsh 配置,核心原則只有一個:每天打超過三次的指令,都該變成肌肉記憶等級的短指令。
先講結論
.zshrc 本身只負責「載入」。所有 alias 和函數都拆到外部檔案——改某一類設定時不炸到其他部分。這不是潔癖,是被自己手殘改壞 .zshrc 之後學到的教訓。
檔案結構
~
├── .zshrc # 主配置:只做載入
├── .p10k.zsh # Powerlevel10k 主題
├── .zsh_aliases # 所有 alias 集中管理
└── .zsh/
├── git_wrapper.zsh # Git clone 多 SSH key
└── functions/
├── claude_dev.zsh # Claude Dev 工具
├── ports.zsh # Port 管理
├── aws_tools.zsh
├── docker_tools.zsh
└── ... # 各種工具函數
.zshrc:載入器,不是垃圾桶
# Oh My Zsh
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(git zsh-completions zsh-autosuggestions zsh-syntax-highlighting zsh-z)
source $ZSH/oh-my-zsh.sh
# 開發環境(nvm, pnpm, pyenv, direnv...)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
eval "$(pyenv init --path)" && eval "$(pyenv init -)"
# 載入外部模組——重點在這
[[ -f ~/.zsh_aliases ]] && source ~/.zsh_aliases
for f in ~/.zsh/functions/*.zsh; do source "$f"; done
[[ -f ~/.zsh/git_wrapper.zsh ]] && source ~/.zsh/git_wrapper.zsh四個 plugin 各有各的用處:zsh-autosuggestions 灰字提示按 → 接受、zsh-syntax-highlighting 打錯命令會變紅、zsh-z 根據頻率快速跳目錄。裝了之後回不去。
Alias 的三個層次
所有 alias 在 ~/.zsh_aliases,我把它們分成三層:
第一層:安全預設
alias rm='rm -i' alias mv='mv -i' alias cp='cp -i'破壞性操作都加 -i 確認。比裝 trash-cli 更通用,而且有一天你會感謝自己。
第二層:導航和日常
alias ll='ls -alF' alias ..='cd ..' alias ...='cd ../..'
alias h='history' alias work='cd ~/work'
alias tree='tree --dirsfirst'
alias treex='tree --prune -I "node_modules|.git|__pycache__"'treex 是看專案結構的必備——排除 node_modules 和 .git 後,才看得到真正的程式碼結構。
第三層:工具鏈
# Docker
alias dps='docker ps' alias dlogs='docker logs -f' alias dexec='docker exec -it'
# Kubernetes
alias k='kubectl' alias kga='kubectl get all' alias kl='kubectl logs -f'
# 搜尋(fd + ripgrep 取代 find + grep,速度差距是數量級的)
alias f='fd' alias rga='rg --hidden --no-ignore'
# Node.js
alias ni='npm install' alias nr='npm run' alias ns='npm start'值得單獨講的函數
Git Clone Wrapper:多 SSH Key 切換
多個 GitHub/GitLab 帳號各用不同 SSH key 時,每次 clone 都要想「這次該用哪把鑰匙」。這個 wrapper 用 flag 解決:
# git clone <repo-url> --work → 工作 SSH key
# git clone <repo-url> --origin → 個人 SSH key原理:攔截 git clone,根據 flag 替換 SSH config 中對應的 Host 別名。設好之後完全不用再想。
Port 管理
# pk 3000 → 直接 kill 佔用 port 3000 的 process
# pls → 列出所有 LISTEN 中的 port「port 被佔了」大概是開發時第二常見的錯誤(第一是 typo)。pk 3000 一行解決,不用再 lsof | grep | awk | kill 四連擊。
整理 dotfiles 的最佳時機是一年前。第二好的時機是現在。從 alias 分類開始——效果立竿見影。
進階的 server 管理指令和 SSH 技巧,看 下篇。