超簡單!十分鐘打造漂亮又好用的 zsh command line 環境

Gary Chu
財報狗技術部落格
14 min readDec 29, 2017

--

註:這篇適用於用 MAC 開發的 developer

身為程式開發者,很大一部分的時間是在用 command line 做事,如果能把 command line 調整成好用又酷炫的模樣,不只是效率提升非常多,用起來爽度也比較高

像下面這樣子的 command line 是不是比內建的有意思多了?

過去總覺得設定 command line 很麻煩,但其實如果不是要客製化很多細節,其實是非常簡單的。這篇文章教大家如何用很簡單的設定方式,就可以做到很酷炫的程度。沒試過的人照著這篇的步驟跑,十多分鐘就可以搞定了~

這篇的做法會依循以下兩個原則,讓不熟自訂 zsh 的人可以最輕鬆的入門:

  • 避免搞亂你的開發環境:僅可能使用 homebrew 來安裝需要的套件
  • 儘可能簡化需要理解的概念。除了 oh-my-zsh,不引入其他進階的 zsh 套件管理工具以及複雜的自訂功能

最後的結果大概會是長這樣:

安裝、設定方式

總共有以下步驟:

  1. 安裝 iTerm2
  2. 修改 iTerm2 的 color scheme
  3. 安裝 powerline font
  4. 安裝 zsh
  5. 安裝 oh-my-zsh
  6. 安裝 zsh theme: powerlevel9k
  7. 設定 powerlevel9k

步驟看似很多,但是每一步都很簡單!

安裝 iTerm2:

雖然不是必要,內建的 Terminal app 也可以,不過 iTerm2 還是比較好用,下面的示範也全都是用 iTerm2

安裝方式:

# 如果你從來沒有用過 brew cask 的話需要先跑這行
brew tap caskroom/cask
# 安裝 iTerm2
brew cask instal iterm2

安裝好以後,打開 iTerm2 檢查 Report Terminal Type 的設定,設定路徑:
Preferences > Profiles > Terminal > Report Terminal Type

設為 xterm-256color,等等在 terminal 才能看得到漂亮的顏色

iTerm2 Report Terminal Type 選單

修改 iTerm2 的 color scheme

這步驟很重要,預設的很醜,想要自己的 command line 看起來賞心悅目就絕對要換掉預設的

設定路徑:Preferences > Profiles > Colors > Color Presets...

內建已經幾個選則可以用,不過幾乎都很難看,iTerm2 Color Schemes 有超多可以選,先把整個 repo 下載到自己的電腦後,然後 import 到 iTerm2:

剛才下載下來的 iTerm2-Color-Schemes 有很多個資料夾,從 schemes 資料夾裡面選一個喜歡的 color scheme

這邊要注意的是點選了檔案 import 以後並不會生效,還要再去 color preset 點選你剛 import 的 scheme 才會生效

我自己是用 Tomorrow Night Eighties,優點是對比不會太強比較不刺眼,螢幕盯久了不會不舒服,顏色飽和度也適中,看起來質感比較好。不曉得要選哪一個的人可以試試看

https://github.com/mbadolato/iTerm2-Color-Schemes 上的 Tomorrow Night Eighties 截圖

這篇文章後面的 command line 截圖都是用這個 color scheme,如果你發現按照我的安裝步驟來做看起來顏色卻不太一樣,那就是你的 iTerm2 color scheme 和我不同

安裝 powerline font

因為我們要用的 theme 會用到很多的特殊 icon,所以 iTerm2 選用的字型必需要支援這種特殊 icon font。這類型的字體統稱為 powerline font(另外還有加強版支援更多特殊 icon 的叫的 nerd font)

沒有安裝的話畫面會長這樣,遇到 icon 會變框框問號

非 powerline font

裝完並設定新字型後的效果:

powerline font

支援 powerline 的字型很多,我推薦 Sauce Code Pro Nerd Font Complete
安裝方式推薦直接用 brew 安裝比較快又好管理

安裝指令:

# 先執行這行,才能用 homebrew 安裝字型。曾經執行過的人可以跳過這個指令
brew tap caskroom/fonts
# 安裝指令
brew cask install font-sourcecodepro-nerd-font

如果想要裝別的,brew 上面也有很多字型可以挑。

關鍵字是 nerd

brew cask search nerd
這麼多字型夠挑了吧~

裝完後,記得修改 iTerm2 字型設定否則不會生效。請改成 SauceCodePro Nerd Font 或你自己下載的字型

設定路徑:Preferences > Profiles > Text > Change Font (參考下圖)

修改 iTerm2 字型設定

2018–08–02 更新:
若你切換字型後,發生 iTerm2 無法正常運作,有可能是遇到同一字型有複數版本的問題,請按照以下流程修復:

打開 Font Book.app -> 選擇該字體 -> 選擇自動解決版本問題

註:特別感謝童宇凡的提醒以及 Huang Chi Yung這篇回報了這個問題

安裝 zsh:

zsh 是個取代 bash 的強大 shell,比 bash 好用幾百倍。這篇文章介紹的 command line 設定一定要跑在 zsh。沒用過的一定要試一下

一樣用 homebrew 安裝:

brew install zsh

並把 zsh 設定為你的預設 shell:

sudo sh -c "echo $(which zsh) >> /etc/shells" 
chsh -s $(which zsh)

安裝 oh-my-zsh

上一步裝完 zsh 後,就可以開始調整我們想要的 command line 外觀設定了,但是原始的 zsh 因為設定太難搞,所以多年前剛出現的時候沒有受到太多關注,直到有人寫了一套叫 oh-my-zsh 的 framework 來幫助大家使用 zsh,zsh 才火了起來。現在幾乎所有 zsh 好用的工具都有支援 oh-my-zsh,所以當然是要裝這東西

安裝指令:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

註:這會直接執行 oh-my-zsh 的 install.sh
有疑慮的人可以先稍微研究一下 oh-my-zsh github 上的 install.sh,覺得放心再執行

執行完以後如果沒有出現什麼錯誤訊息就代表成功了,同時會發現多了 oh-my-zsh 的資料夾 ~/.oh-my-zsh

重頭戲!!安裝 zsh theme powerlevel9k

剛裝完 oh-my-zsh 以後,預設是使用內建的 theme robbyrussell,多了 git 資訊,顏色也看起來比原生 bash 好一些:

不過 oh-my-zsh 內建很多 theme,在它的 github wiki 上有很多截圖可以參考

切換內建的 theme 很簡單,直接修改你的 ~/.zshrc,把原本 ZSH_THEME=”robbyrussell 改成你想要的:

# 編輯 ~/.zshrc
ZSH_THEME=”agnoster” # 試試看把 robbyrussell 改成 agnoster

任何的 zsh 設定修改過後,還要執行以下指令才會生效

exec $SHELL
agnoster 看起來是不是比 robbyrussell 漂亮多了?

這邊推薦一個超強的 theme,powerlevel9k!

文章開頭的圖片就是擷取自 powerlevel9k 的 github

圖片來源:https://github.com/bhilburn/powerlevel9k

powerlevel9k 不只是像上面的示範圖顯示一些基本的資訊,還可以做到很屌的事情,比如像下圖那樣,顯示 WiFi 訊號強度、筆電電池電力、CPU loading、system free memory 等等資訊在 command line

圖片擷取自 powerlevel9k github

powerlevel9k 安裝方式:

  1. powerlevel9k 不是 oh-my-zsh 內建的 theme ,必須另外下載

指令:

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

2. 編輯你的 ~/.zshrc ,把 ZSH_THEME 設為 powerlevel9k,並設定要顯示哪些東西在 command line 上:

ZSH_THEME="powerlevel9k/powerlevel9k"# command line 左邊想顯示的內容
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) # <= left prompt 設了 "dir"
# command line 右邊想顯示的內容
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(time) # <= right prompt 設了 "time"

上面的例子我們把左邊設了一個 dir,右邊設了 time,代表左邊想顯示當前資料夾路徑,右邊顯示時間

設定完後 command line 看起來會像這樣 (記得執行 exec $SHELL,設定才會生效):

左邊顯示當前資料夾路徑,右邊顯示時間

如果想要有版本控制的資訊,可以在 POWERLEVEL9K_LEFT_PROMPT_ELEMENTS 加上 vcs(vcs 為 version control system 的縮寫)

# 編輯 ~/.zshrc
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir vcs) # 加上 "vcs"

command line 會變這樣:

多了 git branch 以及 git status 資訊

當你進入了一個沒有寫入權限的資料夾時還可以給你提醒:

# 加上 "dir_writable"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_writable vcs)
/etc 沒有寫入權限,多出一個鎖頭提醒你

如果你的 command line 是設成 vi mode ,相信你一定碰過這個困擾,就是不曉得自己是處在 normal mode 還是 insert mode。沒關係,powerlevel9k 可以幫你解決這個問題:

# 加上 "vi_mode"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_writable vcs vi_mode)

結果如下:

上圖告訴我們現在在 insert mode

按下 ESC後:

告訴你變 normal mode 啦~讚吧!

我自己習慣左側的設定放一些常用基本資訊
右邊放一些好用但不是每次下指令都要看的東西

command line 右邊的設定放在 POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS

例如顯示上一個指令的 return code:

# 加上 "status" 顯示上一個指令的 return code:
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status time)

如果指令沒出錯,linux return code 為 0 時會有個綠色小勾勾:

指令正確執行,return code 為 0

如果打了錯誤指令會出現相對應的 return code,並且用紅色底色提醒你

指令執行錯誤,return code 為 127

還可以顯示目前電腦的 free memory:

# 加上 ram,顯示目前的 free memory
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status ram time)
還有 4.61G 的記憶體可用

2017/12/30 更新:
上圖的最左方有個資料夾 icon,且 git 資訊多顯示了幾個 icon,這用原本的設定是看不到的,需要加上這行:

POWERLEVEL9K_MODE='nerdfont-complete'

powerlevel9k 的 wiki 有解釋這個設定的作用,請大家使用時注意一下別忘記加上去

加上 CPU load average:

# 加上 load 顯示 CPU 忙碌程度
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status ram load time)
CPU 忙碌程度 2.45,還行

顯示電量:

POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(battery)
還可以用 6 小時又 11 分

示範了不少,但還有非常非常多東西可以用,請參考這個列表自己玩玩看https://github.com/bhilburn/powerlevel9k#available-prompt-segments

不過有些東西中看不中用,放太多東西也會讓 command line 反應變慢,試了各種設定一陣子後,只留下了一些我覺得比較有用的,給大家參考:

# 左側
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir dir_writable vcs vi_mode)
# 右側
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs history ram load time)
# 若當前登入的帳號為你的帳號 xxx,就不用特別顯示出來
DEFAULT_USER="xxx"
# 使用 nerd font 時可以顯示更多 icon。詳情請參考 powerlevel9k wiki
POWERLEVEL9K_MODE='nerdfont-complete'

最後…

這篇文章介紹了怎麼樣把自己的 command line 替換成 zsh,並且使用很厲害的 powerlevel9k theme,不過 zsh 不只是可以換酷炫的 theme 而已,更重要的是還有很多比 bash 好用的功能可以大幅提升工作效率,又可以裝各種方便的 plugin,就留待有機會時再介紹囉

最後的最後…

你可能會好奇為什麼叫做 powerlevel9k (power level 9000)

因為…

喜歡這篇文章的話可以拍拍手讓我知道哦~
按著不放可以快速多拍幾下 :)

--

--