前一篇安裝好 iTerm2 及 Homebrew 後,這次要將 Shell 從 bash 改為更強大的 Zsh。Zsh 擁有自動補齊指令、路徑、變數等等的功能,並可以依據自身需求再加裝 plug-ins。
雖然 Zsh 相較於之前介紹過的 fish 仍有許多不足之處,但 Zsh 最大的優勢在於相容於 bash,不必重新學習特有的 shell script。不得不說 fish 的自動補齊以及指令提示真的非常強大,尤其是使用 git add [deep/path/file]
時還可以只打部分檔名再加 Tab 就能補齊正確路徑!
安裝 Zsh
macOS 已內建 Zsh,但版本較舊。我們可以直接使用 Homebrew 來安裝最新版:
$ brew install zsh
將 Zsh 設為預設 shell
先將我們透過 Homebrew 安裝的 Zsh 路徑加入 /etc/shells 中:
$ echo $(which zsh) | sudo tee -a /etc/shells
再使用以下指令將 Homebrew 安裝的 Zsh 設為預設 shell:
$ chsh -s $(which zsh)
只在 iTerm2 中使用 Zsh
如果只想在 iTerm2 中使用 Zsh,可以從選單列:
- iTerm2 -> Preferences -> Profiles -> General
設定 Command 為 /usr/local/bin/zsh。
將預設 shell 改回 bash
若要將預設 shell 從 Zsh 改回 bash:
$ chsh -s /bin/bash
初始化設定
將預設 shell 設定為 Zsh 並重新載入,或使用 zsh
指令進入 Zsh 後,第一次會看到 zsh-newuser-install 的初始化設定畫面:
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~). This function can help you with a few settings that should
make your use of the shell easier.
You can:
(q) Quit and do nothing. The function will be run again next time.
(0) Exit, creating the file ~/.zshrc containing just a comment.
That will prevent this function being run again.
(1) Continue to the main menu.
--- Type one of the keys in parentheses ---
zsh-newuser-install 可以協助設定並產生 .zshrc 設定檔,這裡我們先選擇 0:僅建立但不設定 .zshrc,稍後由 Oh My Zsh 或是 Antigen 來協助設定 Zsh。
若之後想重新透過 zsh-newuser-install 設定 Zsh,則可在備分 .zshrc 設定檔後,執行以下指令:
$ autoload -U zsh-newuser-install; zsh-newuser-install -f
Oh My Zsh
Zsh 有豐富的 plug-in 資源,可以大幅擴充 Zsh 的功能。但眾多的 plug-in 管理起來,不論是安裝、更新或移除都相當麻煩。我們可以借助 Zsh 組態框架——Oh My Zsh 來簡化插件與相關設定的管理。
依據 Oh My Zsh 的 GitHub 說明,執行以下指令來安裝:
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
Theme
Oh My Zsh 內建了多種佈景主題,預設為 robbyrussell。若要更改,可以修改 .zshrc:
ZSH_THEME="[theme]"
安裝第三方的 Theme 則可以按照以下步驟:
- 下載佈景主題(建議使用
git clone
)至$ZSH_CUSTOM/themes/
(變數$ZSH_CUSTOM
會指向 ~/.oh-my-zsh/custom) - 修改 .zshrc 設定檔中的
ZSH_THEME
powerlevel9k
因為 Powerlevel9k 主題使用了 Powerline 字型,我們先安裝 Nerd Fonts 字型(以 Knack Nerd Font 為例):
$ brew cask install font-hack-nerd-font
再下載 Powerlevel9k:
$ git clone https://github.com/bhilburn/powerlevel9k.git $ZSH_CUSTOM/themes/powerlevel9k
修改 .zshrc 設定檔中的 ZSH_THEME
:
ZSH_THEME="powerlevel9k/powerlevel9k"
並於 .zshrc 中加入以下設定來開啟 Powerlevel9k 主題對 Nerd Fonts 字型的支援(須在套用主題設定之前):
POWERLEVEL9K_MODE='nerdfont-complete'
重新載入 Zsh 設定檔:
$ source ~/.zshrc
以及在 iTerm2 中設定好使用 Knack Nerd Font 字型。
Plug-ins
Oh My Zsh 的套件安裝方式可依以下步驟:
- Plug-in 分為 Oh My Zsh 內建、或是自行下載
- 內建之 plug-in:無須額外的下載操作
- 自行下載之 plug-in:將 plug-in 下載(建議使用
git clone
)至$ZSH_CUSTOM/plugins/
(變數$ZSH_CUSTOM
會指向 ~/.oh-my-zsh/custom)
-
修改 .zshrc 設定檔中的
plugins
:plugins=(… [plugin])
-
重新載入 Zsh 設定檔:
$ source ~/.zshrc
NVM
使用 Homebrew 安裝
Homebrew 上的版本已不在維護,不建議使用此方式安裝。
Oh My Zsh 內建對 NVM 的支援,首先還是要安裝好 NVM:
$ brew install nvm
再於使用者家目錄下建立 .nvm 資料夾,以及指向 NVM 安裝路徑的 symbolic link:
$ mkdir ~/.nvm
$ ln -s $(brew --prefix nvm)/nvm.sh ~/.nvm/nvm.sh
再修改 .zshrc 設定檔中的 plugins
加入 nvm。
透過 zsh-nvm 安裝
由於 nvm 已不繼續支援透過 Homebrew 的安裝方式,因此我們使用 zsh-nvm 來安裝:
git clone https://github.com/lukechilds/zsh-nvm $ZSH_CUSTOM/plugins/zsh-nvm
再修改 .zshrc 設定檔中的 plugins
加入 zsh-nvm。
z
Oh My Zsh 內建對 Z 的支援,首先還是要安裝好 Z:
$ brew install z
再修改 .zshrc 設定檔中的 plugins
加入 z。
zsh-autosuggestions
zsh-autosuggestions 是一個提供指令提示功能的 plug-in:
$ git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
再修改 .zshrc 設定檔中的 plugins
加入 zsh-autosuggestions。
如果 iTerm2 使用了暗色調的配色,可能會看不到自動提示。可以執行以下指令修改提示字顏色:
$ echo "ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=10'" >> ~/.zshrc
$ source ~/.zshrc
zsh-syntax-highlighting
zsh-syntax-highlighting 是一個提供語法高亮(syntax highlighting)功能的 plug-in:
$ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
再修改 .zshrc 設定檔中的 plugins
加入 zsh-syntax-highlighting。
bd
bd 是一個提供直接跳至目前所在路徑的特定名稱之父目錄的 plug-in:
$ git clone https://github.com/Tarrasch/zsh-bd.git $ZSH_CUSTOM/plugins/bd
再修改 .zshrc 設定檔中的 plugins
加入 bd。
fzf
fzf 是一個模糊搜尋工具,可以輸入關鍵字的方式尋找檔案或目錄。fzf 不是 Zsh 的 plug-in,但為許多隨打即找工具的相依套件。
$ brew install fzf
接著安裝 fzf 的 key bindings 及 fuzzy completion 功能:
$ $(brew --prefix)/opt/fzf/install
安裝後會於 .zshrc 設定檔中新增:
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
zsh-interactive-cd
zsh-interactive-cd 是一個提供以隨打即找的方式來切換目錄的 plug-in。
※須要先安裝 fzf
$ git clone https://github.com/changyuheng/zsh-interactive-cd.git $ZSH_CUSTOM/plugins/zsh-interactive-cd
再修改 .zshrc 設定檔中的 plugins
加入 zsh-interactive-cd。
fz
fz 是一個提供以隨打即找的方式自歷史目錄中切換的 plug-in。
$ git clone https://github.com/changyuheng/fz.git $ZSH_CUSTOM/plugins/fz
再修改 .zshrc 設定檔中的 plugins
加入 fz。
Antigen
除了直接使用 Oh My Zsh 來管理 Zsh 插件外,另一個選擇是透過 Antigen。
Antigen 是一個 Zsh 的 plug-in 管理工具,可以只透過設定檔的方式來管理所有插件。不用自己下載、更新 plug-in,甚至能把 Oh My Zsh 也當作插件來管理。
$ brew install antigen
使用 Antigen 管理 Zsh Plug-ins
以上面所列的插件為例,編輯 .zshrc 設定檔:
# 開啟 Powerlevel9k 主題對 Nerd Fonts 字型的支援
POWERLEVEL9K_MODE='nerdfont-complete'
# 載入 Antigen
source /usr/local/share/antigen/antigen.zsh
# 透過 Antigen 來使用 Oh My Zsh
antigen use oh-my-zsh
# 透過 Antigen 載入 Oh My Zsh 內建 theme
# antigen theme robbyrussell
# 透過 Antigen 使用其他 Zsh theme
antigen theme bhilburn/powerlevel9k
# 透過 Antigen 使用 Oh My Zsh 內建 plug-ins
antigen bundle git
antigen bundle z
# 透過 Antigen 使用其他 Zsh plug-ins
antigen bundle lukechilds/zsh-nvm
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle Tarrasch/zsh-bd
antigen bundle changyuheng/zsh-interactive-cd
antigen bundle changyuheng/fz
# 套用 Antigen 設定
antigen apply
# 修改提示字顏色
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=10'
只要 Zsh 設定檔有異動,必須使用以下指令來讓 Antigen 載入新的設定:
$ antigen reset
再重新載入 Zsh:
$ zsh
常用指令
指令 | 說明 |
---|---|
antigen help |
Antigen 使用說明 |
antigen reset |
清除快取 |
antigen list |
查看已安裝的 Zsh Plug-in |
antigen update |
更新所有 Zsh Plug-in |
antigen update [plugin] |
更新指定 Zsh Plug-in |
antigen cleanup |
清除未使用 Zsh Plug-in 的 Git Repo |
antigen purge [plugin] |
移除 Zsh Plug-in |