在 Mac 上使用 zsh 和 oh-my-zsh
Mac 的終端機預設使用的是 bash,但 bash 的體驗實在有點簡陋,自動補全只能補檔案名稱,指令打錯也要等到按下 Enter 才知道,想要有好的終端機體驗,還是得切換到 zsh。zsh 本身就比 bash 強大許多,再搭配 oh-my-zsh 這個設定框架,自動補全、建議、高亮這些功能都能直接使用。
查看預設
先確認一下目前的 shell,以及系統裡有哪些 shell 可以使用。
echo $SHELL
# /bin/bash
cat /etc/shells
/etc/shells 裡列出來的,就是系統允許作為登入 shell 的程式。可以看到裡面其實已經有一個 /bin/zsh 了,不過這是系統內建的,版本比較舊,所以一般都會建議用 Homebrew 另外安裝一個新版的 zsh。
安裝 zsh
如果還沒有安裝 Homebrew,要先把它裝上。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然後安裝 zsh。
brew install zsh
zsh --version
Homebrew 安裝的 zsh 在 /usr/local/bin/zsh,但是它並不在 /etc/shells 裡,這時候直接 chsh 會被拒絕,提示這不是一個合法的 shell。所以要先把它加進去,然後再切換預設 shell。
# 把 Homebrew 的 zsh 加进允许的 shell 列表
echo /usr/local/bin/zsh | sudo tee -a /etc/shells
# 切换默认 shell
chsh -s /usr/local/bin/zsh
切換之後要把終端機完全關閉再重新開啟,然後再 echo $SHELL 看一眼,變成 /usr/local/bin/zsh 就表示成功了。
第一次進入 zsh 的時候,因為還沒有 ~/.zshrc,它會彈出一個設定精靈,問你要怎麼設定。這裡直接按 q 離開就行,因為接下來 oh-my-zsh 會幫我們產生一份。
安裝 oh-my-zsh
zsh 本身的預設設定很樸素,幾乎什麼都沒有,所以大部分人都會再裝一個設定框架,最常見的就是 oh-my-zsh。它把主題、外掛、自動補全這些東西都打包好了,裝完基本上就能直接使用。
官方提供了一鍵安裝指令:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
腳本會把 oh-my-zsh 複製到 ~/.oh-my-zsh,如果原本已經有 ~/.zshrc,它會先備份成 ~/.zshrc.pre-oh-my-zsh,然後換上自己的範本。
安裝完之後終端機會立刻換個樣子,提示字元變成一個箭頭加上目前目錄名稱,在 git 儲存庫裡還會顯示目前分支,有變更尚未提交的話後面還會多一個小叉。
主題
主題由 ~/.zshrc 裡的 ZSH_THEME 決定,預設是 robbyrussell。
ZSH_THEME="robbyrussell"
oh-my-zsh 內建了許多主題,都放在 ~/.oh-my-zsh/themes 裡。還可以到 Oh My Zsh Themes 查看第三方主題。
外掛
oh-my-zsh 最好用的地方還是外掛。外掛同樣在 ~/.zshrc 裡設定,寫在 plugins 這個陣列裡就行。
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)
其中 git 和 z 是內建的,另外兩個是第三方外掛,需要先複製到 oh-my-zsh 的 custom 目錄底下。
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
然後 source ~/.zshrc 或重新開啟終端機就能生效了。
git
git 外掛提供了一大堆縮寫,常用的幾個記住之後,打 git 指令能省不少事。
gst # git status
gaa # git add --all
gcmsg # git commit -m
gco # git checkout
gl # git pull
gp # git push
glog # git log --oneline --decorate --graph
想看全部的話,可以直接 alias | grep git。
z
z 會記住你去過的目錄,然後根據存取頻率和時間來排序。所以只要去過一次,之後輸入目錄名稱的一部分就能直接跳過去。
z blog # 跳到最常去的、路径里带 blog 的目录
用了幾天之後,我基本上就不太會手動輸入長路徑了。
zsh-autosuggestions
這個外掛會根據歷史紀錄,在你輸入的時候用灰色文字把可能的指令補在後面,按右方向鍵就能直接接受。很多長指令只要打前幾個字母,後面就會自己出現。
zsh-syntax-highlighting
它會替輸入中的指令上色,指令存在就是綠色,打錯了或不存在就是紅色,所以還沒按下 Enter 就能看出來有沒有拼錯。
另外它在 plugins 裡要放在最後,因為它要包覆其他外掛定義的那些 widget,放在前面的話,後載入的外掛就可能不會被高亮到。
把 bash 的設定搬過來
原本寫在 ~/.bash_profile 裡的東西,比如一些 PATH 和別名,zsh 是不會去讀的,所以要手動搬到 ~/.zshrc 裡。我建議放在 source $ZSH/oh-my-zsh.sh 這一行的後面,這樣自己定義的別名才能覆蓋掉外掛裡的同名別名。
source $ZSH/oh-my-zsh.sh
# User configuration
export PATH="$HOME/bin:$PATH"
export EDITOR="vim"
alias ll="ls -lah"
另外 bash 和 zsh 的語法大部分是相容的,平常使用的那些指令基本上不需要修改。只有少數地方不太一樣,比如 zsh 裡沒有匹配到的萬用字元會直接報錯,而不是像 bash 那樣原樣傳下去,所以遇到 no matches found 的時候,替參數加上引號就好了。
更新
oh-my-zsh 預設會定期檢查更新,時間到了開啟終端機會問你要不要更新,按 Enter 就好。如果想手動更新,可以直接執行下面的指令。
upgrade_oh_my_zsh
zsh 本身則是跟著 Homebrew 一起更新,brew upgrade 的時候就會升級到最新版。