macOS 終端機體驗最佳化:iTerm2、Oh My Zsh Shell 與 Powerlevel9k

介紹


Homebrew

Homebrew 是 macOS 底下的套件管理程式,如同 Linux 的 APT,這幾年己漸漸取代 MacPorts 成為 macOS 套件管理工具的主流。

iTerm2

操作效率與使用體驗遠好於原生終端機,支援許多強大且方便好用的功能,比如:

  • 分割視窗
  • 隨傳隨到多隆鍵(Hotkey Window)
  • 剪貼簿歷史
  • 操作畫面重播
  • 高度定制性
  • 多主機多帳號管理
  • 盡可能不讓手移動的快速鍵
  • 免滑鼠選取複製貼上
  • 指令自動補完

無論是輕度使用者或重度開發者都推薦改用 iTerm2 來取代原生終端機。

ZSH

ZSH 是 Unix、Linux 底下著名的 shell1,與 terminal 不同的是,套用 Shell 的影響是作業系統層面,兩者之間關係有點類似網頁與瀏覽器。

macOS 預設的 Shell 是 Bash,本身已內建 ZSH,後面會提到如何切換。

Oh My Zsh

ZSH 本質是不錯的 Shell,但礙於駕馭曲線太高,在 Oh My Zsh 出來之前都一直乏人問津。

絕大多數使用 ZSH 的人都是靠 Oh My Zsh,它還加了外掛(plugin)及主題(theme)功能,也是多數人安裝 Oh My Zsh 的主要目的,可以說是 ZSH 加強版。

powerlevel9k

Oh My Zsh 是 ZSH 的加強版,而 Powerlevel9k 又是 Oh My Zsh 的加強版,主要是能客制化提示符號顯示系統狀態、git、程式語言、雲端運算……各式訊息(全部支援訊息)。只要照著接下來的步驟做,最終 macOS 命令模式從 iTerm2 呈現出來的畫面會是這樣:

因為主要變更的是Shell,macOS 裡原生的終端機也會變成:只是沒那麼好看就是了(如果仍堅持使用原生終端機的話…)。

至於為何叫 power level 9000,這是作者的解釋

準備環境


安裝 Homebrew

如果沒有 Homebrew,先執行以下指令安裝:


/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrew 會偵測是否有 Xcode,沒有的話過程會要求輸入目前登入帳號的密碼並自動安裝 Xcode,過程約數分鐘。

⚠️MacPorts 與 Homebrew 彼此不相容,要安裝 Homebrew 前請務必確認 MacPorts 已移除。

如果己經有 Homebrew,則先執行更新與升級:

brew update && brew upgrade

如果不太確定是否已有安裝 Homebrew ,可以執行


    brew --version
    

有出現版號代表有安裝。

安裝 Powerline/Nerd Font 字體

Oh My Zsh 裡許多主題或外掛都會用到額外的 icon,這類支援額外 icon 的字體叫 powerline font。其它還有 Programmer Font、Awesome Powerline Fonts 及 Nerd Fonts,每個字體都額外提供上個字體所沒有的 icon(資料來源)。原則上 Powerline font 己經夠用,但基於工程師不喜歡「缺少的感覺」心裡因素作祟,我個人會推薦 icon 最齊全的 nerd 字體(天曉得還會不會再出個補上 Nerd 不足的字體)。

這裡沒有先安裝字體的話,後續在切換 Shell 的主題不支援的icon就會以問號框亂碼呈現

方法一:透過 Homebrew 安裝

# 讓字體能用 Homebrew 來安裝
brew tap homebrew/cask-fonts

#安裝字體
brew install --cask font-sauce-code-pro-nerd-font

#如果想裝別的字體
brew search nerd

方法二:到官網下載安裝

如果不想只為了安裝字體多裝一個套件,也可以用傳統的方式從字體官網下載再從字體簿app匯入的方式安裝。

⚠️字體安裝好後,先開啟字體簿app,選取剛安裝的字型看有沒有出現「字體重覆衝突」相關的警告訊息,有的話點選自動解決版本問題讓系統自動修復,這部份沒有先處理待會 iTerm2 切換字型時應用程式會當機。

安裝 iTerm2

brew install --cask iterm2

cask 是 Homebrew 的子集,基本上就是一般 app 應用程式可直接透過brew cask指令一鍵安裝,省略了傳統開啟 Safari 到官網、搜尋app、下載、拖曳App 到應用程式資料夾的安裝方式。

變更預設字體

開啟 iTerm2: ⌘,  (Preferences) → Profiles → Text → Change Font → 搜尋並點選nerd

選擇一個配色(非必要步驟)

個人覺得 Solarized Dark 配色與與待會要介紹的主題最搭,也是 iTerm2 除了預設之外最受歡迎的配色。

⌘, → Profiles → Color → Color Presets… → Solarized Dark

雖然 Solarized Dark 配色好看,但預設的前景文字顏色略暗,看得會有些吃力,可以再點選Foreground 顏色框,把顏色改為白色看起來就清楚許多。

安裝好後,從這裡開始由 iTerm2 接手後續步驟。

安裝 ZSH

brew install zsh

雖然 macOS 已內建 ZSH,但版本較舊也不會自動更新,執行的是安裝指令但實際是把內建的 ZSH 更新到最新版。

zsh --version
zsh 5.3 (x86_64-apple-darwin17.0) #還沒安裝前是5.3版
brew install zsh
Updating Homebrew...
==> Downloading https://homebrew.bintray.com/bottles/zsh-5.5.1.high_sierra.bottl
######################################################################## 100.0%
==> Pouring zsh--5.5.1.high_sierra.bottle.tar.gz
🍺  /usr/local/Cellar/zsh/5.5.1: 1,444 files, 12.6MB
zsh --version
zsh 5.5.1 (x86_64-apple-darwin17.5.0) #安裝完後更新到最新版

一旦 ZSH 被加入 Homebrew 後,未來就會被加入更新檢查清單裡。

將預設 shell 改為 ZSH

chsh -s /bin/zsh

安裝 Oh My Zsh

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
介面會立即變更套用新的Shell
介面會立即變更套用新的Shell

Powerlevel9k

Powerleve9k 既是外掛也是主題。主題的部分是以 agnoster 為基礎再加強識別度,可以將許多本機資訊或醒目提示客制化在命令列上,還可選擇要顯示在左邊還右邊。

安裝

git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k

設定

編輯~/.zshrc
ZSH_THEME="robbyrussell"
改成ZSH_THEME="powerlevel9k/powerlevel9k"

以下是我的設定:

# 要使用的主題(二個powerlevel9k中間加斜線無誤)
ZSH_THEME="powerlevel9k/powerlevel9k"

# 左方命令提示要顯示的內容 
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
    os_icon # 作業系統icon
    context # 主機與使用者名稱
    dir # 所在目錄
    dir_writable # 目錄寫入鎖定警告,無寫入權限的目錄會出現紅色鎖頭
    root_indicator # 進入超級使用者權限會出現額外提示
    ssh # 處於 SSH 連線會出現額外提示
)

# 右方命令提示要顯示的內容 
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
    status
)

# 使用 nerd font 可以顯示更多 icon。詳情請參考 powerlevel9k wiki
POWERLEVEL9K_MODE='nerdfont-complete'

# 若當前登入的帳號為 david,就不用特別顯示出來,可節省一段顯示空間
DEFAULT_USER="david"

# 修正進 root 出現一堆 [oh-my-zsh] 權限安全警告訊息
ZSH_DISABLE_COMPFIX=true

# 按 tab 如果沒有可用指令就出現紅點
COMPLETION_WAITING_DOTS="true"

完整參數

推薦外掛


autojump

雖然 ZSH 己內建快速切換目錄指令d,但d指令只會記得當下操作的 session 曾開啟過的目錄;而 autojump 會記得安裝後所有曾去過的目錄。

j 目錄名就可以直接進入該目錄。

解決 root 無法套用 ZSH shell 的問題


# 把 david 改為自己的使用者帳號
cp -R /Users/david/.oh-my-zsh /Users/david/.zshrc .

可以考慮在 powerlevel9k 左邊顯示的內容設定加個root_indicator加強切換到 root 環境底下的識別度。

  1. Shell 是系統的使用者介面,它定義了系統的操作方式(比如按tab會補完檔名)及如何呈現(比如目錄會顯示不同顏色),不同 Shell 呈現不同的介面與功能(當然還包含開發層面的部分,這裡僅簡單的解釋)。
2 個留言