使用場景與痛點
在日常開發中,我們經常同時打開多個 iTerm2 窗口或 Tab,在不同項目之間頻繁切換。窗口一多,很容易分不清當前終端到底指向哪個項目或目錄。尤其是在執行構建、部署、清理腳本時,一旦跑錯目錄,後果往往不小——比如你想清理測試環境的緩存,結果手一抖把生產環境的數據目錄給幹掉了,這酸爽可不是一般人能承受的。
如果每次都要靠 pwd 或盯着 prompt 來確認位置,不僅打斷思路,也不夠直觀。就像開車導航,明明可以抬頭顯示,卻非要低頭看儀表盤,體驗自然大打折扣。
什麼是 iTerm2 的 Badge
iTerm2的Badge是顯示在終端窗口右上角的一小段文字,用於標識當前終端的 上下文 。它不佔用命令行空間但始終可見,非常適合顯示一些輔助信息,比如當前項目名、目錄、Git分支或運行環境。
我們今天要做的事情很簡單:讓Badge自動顯示當前文件夾名稱,並在切換目錄時同步更新。
最終效果預覽
想象這樣一個場景:你正在開發多個項目,同時打開了多個iTerm2標籤頁。假設你當前所在目錄是:
~/projects/funtester
那麼在 iTerm2 窗口右上角,會出現一個簡潔醒目的Badge標識:
funtester
這個Badge採用半透明背景,字體清晰可見,不會干擾你的工作焦點。更妙的是,當你執行 cd ~/projects/user-service 切換到其他項目目錄時,Badge 會瞬間自動更新為 user-service,無需任何手動操作。
這種無縫的上下文感知,讓你在多任務切換時始終保持清晰的方向感,避免了頻繁查看 pwd 或解析複雜prompt的煩惱。
實現思路簡介
iTerm2 通過一個強大的擴展控制序列 OSC 1337,讓 Shell 命令能夠動態操控 Badge 顯示。這個控制序列就像是終端與應用程序之間的秘密通信協議,其中 SetBadgeFormat 指令專門負責設置 Badge 內容,但有個小要求——內容必須經過 Base64 編碼處理,確保數據傳輸的穩定性和兼容性。
整個實現流程其實相當直觀,可以分解為三個清晰步驟:首先獲取當前工作目錄的完整路徑,然後提取出最後一級目錄名稱,最後將這個名稱進行 Base64 編碼並通過控制序列發送給 iTerm2。理解這些技術細節並非強制要求,但當你知道背後的原理時,會對這段配置的使用更有信心,也更容易根據需要進行自定義調整。
推薦方案:自動隨目錄變化(Zsh)
在 macOS 默認配備的 Zsh 環境中,我們可以巧妙地利用 chpwd hook 來實現 Badge 的智能更新。每當目錄發生變化時,這個鈎子函數就會自動觸發,讓 Badge 始終顯示最新的位置信息。
配置過程超級簡單:只需要在 ~/.zshrc 文件中添加一小段函數和鈎子配置即可。既不會影響終端的啓動速度,也不需要複雜的安裝步驟。
配置完成後,無論你是新打開一個終端標籤頁,還是在項目間執行 cd 命令切換目錄,Badge 都會悄無聲息地保持最新狀態,就像一個貼心的導航助手。
這是一種 設置後就忘記 的完美體驗——在日常工作中你幾乎察覺不到它的存在,但當你需要快速確認當前上下文時,它總是在右上角靜靜等待着你的目光。
# 定義設置 Badge 的函數
function iterm_set_badge() {
# 僅在 iTerm2 環境中生效,避免其他終端報錯
if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
# 使用 OSC 1337 控制序列設置 Badge,內容需要 Base64 編碼
printf "\e]1337;SetBadgeFormat=%s\a" \
"$(echo -n "$(basename "$PWD")" | base64)"
fi
}
# 加載 Zsh 鈎子系統
autoload -Uz add-zsh-hook
# 將函數綁定到目錄變化鈎子
add-zsh-hook chpwd iterm_set_badge
# 立即執行一次,確保新終端也有 Badge
iterm_set_badge
寫在最後
Badge 真正的魅力不在於功能多麼豐富,而在於它那恰到好處的設計。它把你最關心的上下文信息,優雅地放在了右上角這個最不會分散注意力的位置。不用頻繁低頭查看 pwd,不用敲命令確認位置,也不會干擾你正常的終端交互。等你習慣了這種 無聲的守護 後,再回到沒有 Badge 的終端,反而會覺得心裏空落落的,像是少了點安全感。
很多看似高深的效率優化,其實並沒有那麼複雜,只不過是被我們忽視了或者沒有被系統性地整理出來。iTerm2 的 Badge 就是這樣一個不起眼的 小技能 ,但它能為你帶來長期穩定的收益。如果你經常需要在多個項目間切換,頻繁執行 cd 命令,那這幾分鐘的配置絕對值得嘗試。更有趣的是,你還可以在此基礎上進行擴展——顯示 Git 分支狀態、環境標識,甚至與 tmux 聯動,讓你的終端變得越來越 懂你 。