讓 macOS 的 Terminal 又潮又實用:手把手設定教學 iTerm2 + oh-my-zsh + Powerlevel10k

(圖片來源:romkatv/powerlevel10k)

如果你是 macOS 上的開發者,應該會看過別人的 macOS Terminal 看起來很酷炫,有很多實用的 prompt 資訊和便利操作,你看到的 95% 是 zsh 這個 shell。

用 zsh 打造自己喜歡的酷炫 Terminal 並不難,網路上已經有很多教學。不過有些教學年代久遠,用的是比較舊的套件,仍有一些略嫌繁瑣的設定,例如 zsh theme Powerlevel9k 需要自己手動安裝 Powerline Font 來支援特殊 icon font。

後來新的 Powerlevel10k 將這些設定又更進一步簡化,設定方式變得非常人性化,更容易設定,而且效果更漂亮。

本文使用較新的 Powerlevel10k,整理從零開始的安裝設定步驟,也算是為自己做筆記,未來重置或更換 Mac 時能很快找回慣用的配置。

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:

  1. 設定介面變得非常容易和人性化,引導式的設定介面一步一步帶你設定,設定會有什麼效果也一目了然。
  2. 不用自己安裝 Powerline Font (支援特殊 icon font)。
  3. 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_profilesource ~/.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

發表留言