如果你是 macOS 上的開發者,應該會看過別人的 macOS Terminal 看起來很酷炫,有很多實用的 prompt 資訊和便利操作,你看到的 95% 是 zsh 這個 shell。
用 zsh 打造自己喜歡的酷炫 Terminal 並不難,網路上已經有很多教學。不過有些教學年代久遠,用的是比較舊的套件,仍有一些略嫌繁瑣的設定,例如 zsh theme Powerlevel9k 需要自己手動安裝 Powerline Font 來支援特殊 icon font。
後來新的 Powerlevel10k 將這些設定又更進一步簡化,設定方式變得非常人性化,更容易設定,而且效果更漂亮。
本文使用較新的 Powerlevel10k,整理從零開始的安裝設定步驟,也算是為自己做筆記,未來重置或更換 Mac 時能很快找回慣用的配置。
傳送門 (Table of Contents)
Step 1: 安裝 & 設定 iTerm2
iTerm2 是 macOS 上更好用的 Terminal 工具,幾乎 Mac 開發者必裝。
1-1. 安裝
透過 homebrew 安裝:
$ brew cask install iterm2
如果沒安裝過 homebrew,可以參考這篇教學:[Mac] Homebrew 與 Homebrew-Cask —— 更快速、簡潔、優雅地管理你的 Mac 軟體套件
1-2. 設定
為了讓 Terminal 能顯示漂亮的顏色配置,有 2 個 iTerm2 設定需要調整:
修改 Report Terminal Type 為 xterm-256color
設定路徑:頂端 iTerm2 選單 -> Preferences -> Profiles -> Terminal -> Report Terminal Type 設為 xterm-256color
修改顏色主題
如果覺得預設太醜,內建有幾個主題可以選擇。
設定路徑:Preferences -> Profiles -> Colors -> Color Presets...
如果內建的顏色主題都不喜歡,也可以去 mbadolato/iTerm2-Color-Schemes 下載其他主題。
更多關於 iTerm2 的設定,可以參考這篇教學:[iTerm2] 最佳 mac 終端機替代方案 常用設定和常用操作
Step 2: 安裝 zsh
新的 macOS 似乎內建已經有裝 zsh,可以先檢查你的 macOS 是不是已經有裝,有就可以跳過這一步。
檢查是否已有 zsh:
$ which zsh
如果沒有,可以使用 homebrew 安裝:
$ brew install zsh
$ sudo sh -c "echo $(which zsh) >> /etc/shells" # 將 zsh 加入系統的 shell 清單,需要輸入管理者密碼
補充:用 homebrew 安裝的 zsh 位置在 /usr/local/bin/zsh,而系統安裝的則會在 /bin/zsh。
安裝 zsh 後,把 zsh 設為預設 shell:
$ chsh -s $(which zsh)
如果這時候打開新的 terminal session,而且以前也沒裝過 zsh,會因為找不到 zsh 的設定檔 ( ~/.zshrc
檔) 而進入 zsh 的設定介面。
這邊可以先照畫面上 Recommended 的建議隨便設定,因為接下來會安裝更好用的設定套件。
Step 3: 安裝 oh-my-zsh
zsh 能客製化設定的內容非常多,但太難設定,光是初始化就讓人投降,因此一開始並不受歡迎。直到有人寫了一個套件來幫助大家設定,zsh 才有了今天火紅的光景,這個套件就是 oh-my-zsh。現在幾乎所有 zsh 好用的工具都有支援 oh-my-zsh。
安裝 oh-my-zsh 的指令,看你的習慣任選一個執行即可:
# via curl
$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# via wget
$ sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
上面的指令會直接執行 oh-my-zsh 的安裝 script,執行完成如果沒有出現什麼錯誤訊息就成功了,可以發現多了一個 ~/.oh-my-zsh
資料夾,Prompt 風格也被設定了預設的主題。
Step 4: 修改 zsh 主題 (zsh theme)
oh-my-zsh 內建很多 theme,例如 robbyrussell、agnoster,在它的 Github Wiki 上有很多截圖可以參考效果:Themes · ohmyzsh/ohmyzsh Wiki
切換內建的 theme 很簡單,修改 ~/.zshrc
裡的 ZSH_THEME
即可。
預設是 ZSH_THEME="robbyrussell"
,例如我想切換另一個內建 theme avit
:
$ vi ~/.zshrc
## 找到這個設定
ZSH_THEME="robbyrussell"
## 修改 theme 的名稱
ZSH_THEME="avit"
修改完成後重新啟動 shell,讓效果生效:
$ exec $SHELL
Step 5: 安裝超強 zsh theme Powerlevel10k
這裡會安裝一個超強的 zsh theme:Powerlevel10k。
Powerlevel9k 或 Powerlevel10k 都不是內建的 theme ,必須另外下載。
跟 Powerlevel9k 相比,我個人大推 Powerlevel10k:
- 設定介面變得非常容易和人性化,引導式的設定介面一步一步帶你設定,設定會有什麼效果也一目了然。
- 不用自己安裝 Powerline Font (支援特殊 icon font)。
- Prompt 客製化設定更多元。
如果你之前已經安裝過 Powerlevel9k 也不用擔心,Powerlevel10k 相容 Powerlevel9k 的設定。
5-1. 安裝 (透過 oh-my-zsh)
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
安裝完成後會看到 ~/.oh-my-zsh/custom/themes/
資料夾底下出現 powerlevel10k:
5-2. 修改 zsh theme 為 powerlevel10k
照前面 Step 4 做過的操作,將 zsh theme 改為 powerlevel10k。
$ vi ~/.zshrc
## 找到 ZSH_THEME 改成以下:
ZSH_THEME="powerlevel10k/powerlevel10k"
5-3. 觸發 Powerlevel10k 設定介面
重開一個 terminal 或執行 exec $SHELL
來重啟 zsh,會自動跳出 Powerlevel10k 的引導設定介面 (Configuration Wizard)。
如果沒有自動跳出,也可以透過指令觸發:
$ p10k configure
照著畫面提示一步步選擇你喜歡的設定,非常容易。
整個設定過程大部分都可以依喜好選擇,但開頭幾個設定會影響整個 Powerlevel10k 效果,可以參考下面的介紹。
5-4. Powerlevel10k 設定解說 (Configuration Wizard)
1. 安裝 Powerline Font
如果你之前沒裝過才會出現這個畫面,為了讓 icon 正常顯示,一定要裝,選「y」。
Powerlevel10k 幫你安裝完後,會提示你必須把整個 iTerm2 關閉重啟才能生效,按快捷鍵 Command + Q
可以把 iTerm2 完全關閉。
再次啟動 iTerm2 後會自動繼續 Powerlevel10k 後續設定。
2. 確認特殊符號是否正常
一開始有一連串步驟是為了幫你確認特殊 icon 是否能正常顯示,如果上面安裝 Powerline Font 的步驟有正常成功,這裡應該都能順利看到特殊符號正常呈現。
3. 選 Prompt Style
選擇 Prompt 的風格,有簡樸花俏不等的四種風格可選,這裡完全可以依個人喜好選擇,例如我個人偏好 (3) Rainbow 風格。
4. 選字元集 (Character Set)
這一步很重要,如果你需要 Prompt 上能有很多花俏的 icon,一定要選 (1) Unicode
。
5. 其他風格細節設定
接下來都是 Prompt 風格細節的偏好設定,依喜好選擇即可。
例如是否要顯示當前時間、哪種時制:
Prompt 內的分隔符號、末端的形狀:
要像傳統 Prompt 和指令在同一行,或分成兩行。我習慣一定要顯示完整目錄位置,一目了然自己所在的目錄層次,但同時會影響每次 Prompt 的顯示長度,指令輸入點也會跟著變動。所以我偏好分兩行,讓每次輸入指令的地方都是同一個點:
如果是分成兩行,可以幫第一行左右 Prompt 加連接線:
如果是分成兩行,可以為末端設定 Frame 風格,多一個圓弧線條:
也可以設定兩次指令之間的 Prompt 空間,我偏好 (2) Sparse 讓畫面看起來多一點緩衝不那麼擁擠:
Prompt Flow 如果選 (2) Fluent,會讓 Prompt 看起來更符合閱讀的語意,例如「on」某個 branch、「took」幾秒。不過 Terminal 用久了其實都很清楚每個資訊代表的意思,所以我比較喜歡 (1) Concise 簡潔一點:
Transient Prompt 應該是 Powerlevel10k 新功能,會讓 Prompt 固定只有一個,每次打完指令和輸出歷史會自動往上印。
這是 Powerlevel10k 官方 GitHub 的操作示範動圖:
這個功能視覺來說滿炫的,只是對我來說每個指令執行當下的 metadata 很重要(例如執行的目錄位置、該目錄是否 writable、執行時間、所花秒數等),Transient Prompt 會嚴重影響我對 terminal log 的判讀,所以我並沒有啟用。
照著 Powerlevel10k 的 Configuration Wizard 設定完畢,你就能擁有基本的酷炫 Prompt。如果想換口味,隨時打指令 $ p10k configure
就可以重新設定風格。
如果你還想進一步客製化
Powerlevel10k 最後產生的設定檔放在 ~/.p10k.zsh
,你可以對這個檔案做客製化微調。
對 Powerlevel10k 的客製化設定可以參考:[zsh] Powerlevel10k 設定心得筆記
如果想備份你的設定,也是備份這個檔案。
這是我的 ~/.p10k.zsh
設定,有加入一些客製化。我不習慣設定得太花俏,CPU loading、Memory、Network 資訊我選擇設定在 iTerm2 status bar 上,讓 Prompt 更簡潔。
註:另一個不在 Prompt 啟用 CPU loading、Memory、Network 資訊的原因,是發現數值和 iTerm2 的數值對不起來,iTerm2 的數值比較符合 Mac 狀況。至於為何會有落差,因為用不到,我就沒有特別去研究原因,知道原因的網友歡迎指點。
Appendix: 疑難雜症
引入原本 bash_profile 的設定
習慣用 terminal 的人通常有自己習慣的 shell 環境設定,之前可能都是放在 ~/.bash_profile
裡,記得要加到 ~/.zshrc
。
要注意的是避免使用這個做法:在 ~/.zshrc
加上一行 source ~/.bash_profile
。
這個做法看起來很方便,也可能能動,但由於 ~/.bash_profile
裡的指令是給 bash 讀的,如果用到 zsh 無法處理的指令,就會造成問題,例如 /usr/local/etc/bash_completion:59: command not found。
建議做法是將需要的設定獨立加到 ~/.zshrc
。如果有些設定不限定 shell,希望不同 shell 可以統一引用,也可以考慮額外拉一個檔案例如 ~/.common_shell_rc
,讓 ~/.zshrc
和 ~/.bash_profile
去 source ~/.common_shell_rc
。
如果之前在 ~/.zshrc
裡設定過 POWERLEVEL9K 參數
這其實是個不好的做法,針對 Powerlevel10k 或 Powerlevel9k theme 的設定,應該回歸 p10k 或 p9k 自己的設定檔。
如果曾經在 ~/.zshrc
裡設定過 POWERLEVEL9K 參數,記得拔掉,不然會和 ~/.p10k.zsh
裡的設定衝突。
$ cat ~/.zshrc | grep POWERLEVEL9K
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_writable vcs)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status time)
移除 on-my-zsh
正常應該是用不到,不過就順便紀錄一下。
如果想移除 on-my-zsh,可以輸入以下指令:
$ uninstall_oh_my_zsh
注意:這只是移除 oh-my-zsh,並不會移除 zsh。
查詢系統安裝了哪些 Shell:cat /etc/shells
如果想確認自己的機器支援哪些 shell,可以用以下指令:
> $ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
References
- Oh My Zsh – a delightful & open source framework for Zsh
- romkatv/powerlevel10k: A Zsh theme
- 超簡單!十分鐘打造漂亮又好用的 zsh command line – 財報狗技術部落格 – Medium
- 用 zsh + zim + powerlevel10k 讓你的 Terminal 潮又快 · dw’s 小站
- 如何讓 Terminal 看起來好用又好看|iTerms 2 + Oh-my-zsh 全攻略 | by 學.誌|Chris Kang | 不止數據|Not Only Data | Medium
- Ada Hsu 的胡思亂想: 在 macOS 上設定炫酷的 終端機 操作環境 – 使用 oh-my-zsh w/ Powerlevel9k
- config – Troubles uninstalling oh-my-zsh? – Stack Overflow