在 Mac 上使用 zsh 和 oh-my-zsh

2019年8月17日星期六 / , ,
簡體中文正體中文
摘要:
捨棄 Mac 上預設的 bash,改用 zsh 和 oh-my-zsh 來最佳化終端機體驗。

Mac 的終端機預設使用的是 bash,但 bash 的體驗實在有點簡陋,自動補全只能補檔案名稱,指令打錯也要等到按下 Enter 才知道,想要有好的終端機體驗,還是得切換到 zsh。zsh 本身就比 bash 強大許多,再搭配 oh-my-zsh 這個設定框架,自動補全、建議、高亮這些功能都能直接使用。

查看預設

先確認一下目前的 shell,以及系統裡有哪些 shell 可以使用。

Shell
echo $SHELL
# /bin/bash

cat /etc/shells

/etc/shells 裡列出來的,就是系統允許作為登入 shell 的程式。可以看到裡面其實已經有一個 /bin/zsh 了,不過這是系統內建的,版本比較舊,所以一般都會建議用 Homebrew 另外安裝一個新版的 zsh。

安裝 zsh

如果還沒有安裝 Homebrew,要先把它裝上。

Shell
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然後安裝 zsh。

Shell
brew install zsh
zsh --version

Homebrew 安裝的 zsh 在 /usr/local/bin/zsh,但是它並不在 /etc/shells 裡,這時候直接 chsh 會被拒絕,提示這不是一個合法的 shell。所以要先把它加進去,然後再切換預設 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。它把主題、外掛、自動補全這些東西都打包好了,裝完基本上就能直接使用。

官方提供了一鍵安裝指令:

Shell
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。

Shell
ZSH_THEME="robbyrussell"

oh-my-zsh 內建了許多主題,都放在 ~/.oh-my-zsh/themes 裡。還可以到 Oh My Zsh Themes 查看第三方主題。

外掛

oh-my-zsh 最好用的地方還是外掛。外掛同樣在 ~/.zshrc 裡設定,寫在 plugins 這個陣列裡就行。

Shell
plugins=(git z zsh-autosuggestions zsh-syntax-highlighting)

其中 git 和 z 是內建的,另外兩個是第三方外掛,需要先複製到 oh-my-zsh 的 custom 目錄底下。

Shell
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 指令能省不少事。

Shell
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 會記住你去過的目錄,然後根據存取頻率和時間來排序。所以只要去過一次,之後輸入目錄名稱的一部分就能直接跳過去。

Shell
z blog     # 跳到最常去的、路径里带 blog 的目录

用了幾天之後,我基本上就不太會手動輸入長路徑了。

zsh-autosuggestions

這個外掛會根據歷史紀錄,在你輸入的時候用灰色文字把可能的指令補在後面,按右方向鍵就能直接接受。很多長指令只要打前幾個字母,後面就會自己出現。

zsh-syntax-highlighting

它會替輸入中的指令上色,指令存在就是綠色,打錯了或不存在就是紅色,所以還沒按下 Enter 就能看出來有沒有拼錯。

另外它在 plugins 裡要放在最後,因為它要包覆其他外掛定義的那些 widget,放在前面的話,後載入的外掛就可能不會被高亮到。

把 bash 的設定搬過來

原本寫在 ~/.bash_profile 裡的東西,比如一些 PATH 和別名,zsh 是不會去讀的,所以要手動搬到 ~/.zshrc 裡。我建議放在 source $ZSH/oh-my-zsh.sh 這一行的後面,這樣自己定義的別名才能覆蓋掉外掛裡的同名別名。

Shell
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 就好。如果想手動更新,可以直接執行下面的指令。

Shell
upgrade_oh_my_zsh

zsh 本身則是跟著 Homebrew 一起更新,brew upgrade 的時候就會升級到最新版。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...