cover

概念圖

開發者每天在終端機花的時間比想像中多。這篇記錄我打磨了好一陣子的 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 技巧,看 下篇