美化我的 Terminal 環境,使用 Oh My Zsh、Zim 和 Powerlevel10k

美化我的 Terminal 環境,使用 Oh My Zsh、Zim 和 Powerlevel10k

開發筆記

前言

平常就能發現大多軟體工程師都會對自己的 Terminal 做一些樣式上的調整,不過我主要使用的 Warp 本身就提供一定程度的客製化功能,所以其實沒特別在意。

直到最近看社群上看到有人在討論,就心血來潮也來改看看。

Zsh 的客製化工具

使用平台為 MacOS

目前看到比較多人在使用的工具有這兩個:

Oh My Zsh 蠻早之前就有聽過,而 Zim 看了幾篇討論,能受到推薦是因為效能。

Zsh 工具的效能比較

整體來說比 Oh My Zsh 啟動速度更快、更輕量,詳細可以看 zimfw 在 github wiki 上的 效能測試

不過 Zim 會多出 .zimrc 管理 modules,安裝上可能因此遇到一些衝突,會需要手動排除。

相比之下 Oh My Zsh 單純許多,不論安裝或解除安裝都很簡單,在前端開發上我也還沒感受出明顯的效能差異。

這兩套就根據自己的偏好擇一使用即可,畢竟都試過了就都記錄一下。

安裝 Oh My Zsh

開啟 Terminal 後,執行下面指令:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

完成安裝了,超級簡單!

打開 Terminal 後,就會看到 Terminal 的樣式已經改變了:

安裝 oh-my-zsh 後的 Terminal 樣式

接下來可以到 .zshrc 中做一些設定,這個檔案會存在於 MacOS 的 Home Directory 中(就是 Finder 中使用者名稱的資料夾)。

檔案預設會是隱藏的,所以如果想在 Finder 直接看到檔案,可以按下快捷鍵 Command + Shift + . 來顯示隱藏的檔案。

工程師的話當然是用 Command Line 的方式開啟(?):

# VSCode(需要先安裝過 'code' 指令)
 code ~/.zshrc
 
# Vim
 vim ~/.zshrc

設定 Plugin

Plugin 能提供 Oh My Zsh 如語法 highlight、command line 提示或自動完成等功能,根據需求添加即可。

.zshrc
# 多個 plugin 使用空格或是換行來分隔
plugins=(git docker vscode npm node)

要注意安裝的 plugin 如果太多,會讓 Terminal 變慢。

設定主題

Oh My Zsh 有許多主題可以選擇,可以看這篇 wiki 挑一個喜歡的主題。

比較常見的應該是 agnoster 這個主題:

.zshrc
# 找到 ZSH_THEME 這行,改成你想要的主題名稱
ZSH_THEME="agnoster"

Oh My Zsh 的 agnoster 主題

解除安裝 Oh My Zsh

想解除安裝的話也很簡單:

uninstall_oh_my_zsh

安裝 Zim

可以選擇自動安裝或手動安裝

如果已經有安裝需要和 zsh 搭配的套件,例如 homebrewnvm 之類,並且有自行排除問題的能力,我會建議選擇手動安裝,避免自動安裝覆蓋掉你目前的設定,可以參考手動安裝的文件

如果電腦還很乾淨,或是看不懂手動安裝的流程,那選擇自動安裝即可,等遇到問題再來排除(???):

# Automatic installation with curl
curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh

執行後會顯示下面的資訊:

Macbook-Noah /Users/noahchen % curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
) Using Zsh version 5.9
) ZIM_HOME not set, using the default one.
) Zsh is your default shell.
) Downloaded the Zim script to /Users/noahchen/.zim/zimfw.zsh
) Prepended Zim template to /Users/noahchen/.zimrc
) Prepended Zim template to /Users/noahchen/.zshrc
) Installed modules.
All done. Enjoy your Zsh IMproved! Restart your terminal for changes to take effect.

重新啟動 Terminal 後,就可以看到 Terminal 的樣式已經改變了。

安裝 Zim 後的 Terminal 樣式

用 Powerlevel10k 更換 Zim 的樣式

Zim 也有提供樣式可以更換,可以參考官方文件

但對我來說有兩個問題:

  1. 很醜。
  2. 視個別 theme 可能會額外需要安裝相應的 prompt enhancement modules,有點麻煩。

所以大多數人都會推薦額外安裝 Powerlevel10k 這個主題,當然 Oh My Zsh 也可以使用,但稍微麻煩一點。

Zim 安裝 Powerlevel10k 也相當簡單,只要在 .zimrc 中的 Modules 註解區塊下面新增 zmodule romkatv/powerlevel10k 這行即可:

.zimrc
#
# Modules
#
 
# Sets sane Zsh built-in environment options.
zmodule environment
# Provides handy git aliases and functions.
zmodule git
# Applies correct bindkeys for input events.
zmodule input
# Sets a custom terminal title.
zmodule termtitle
# Utility aliases and functions. Adds colour to ls, grep and less.
zmodule utility
# powerlevel10k
zmodule romkatv/powerlevel10k

然後在 Terminal 中執行 zimfw install

重新開啟 Terminal 後會出現以下內容,如果沒出現的話可以執行 p10k configure 來進行設定:

  This is Powerlevel10k configuration wizard. It will ask you a few
                 questions and configure your prompt.
 
           Does this look like a diamond (rotated square)?
             reference: https://graphemica.com/%E2%97%86
 
                            --->    <---
 
(y)  Yes.
 
(n)  No.
 
(q)  Quit and do nothing.
 
Choice [ynq]:

這邊是 Powerlevel10k 的設定向導,無法正常顯示代表沒有相應的字體,詳細可以參考文件安裝。

稍微查了一下,無法正常顯示的主題也剛好不是我喜歡的,所以我就直接繼續依照流程進行設定。

過程會不斷問關於一些排版或顯示的偏好,例如下面是指令之間的間距類型,根據自己的喜好選擇:

Prompt Spacing
(1) Compact.
~/src master ❯ 5s 16:23:42
~/src master ❯ 5s 16:23:42
 
(2) Sparse.
~/src master ❯ 5s 16:23:42
 
~/src master ❯ 5s 16:23:42
 
(r) Restart from the beginning.
(q) Quit and do nothing.
 
Choice [12rq]:

設定完成後重新開啟 Terminal 後,就可以看到 Terminal 變得超好看啦:

Zim 搭配 Powerlevel10k 主題

安裝 Zim 遇到的錯誤

分享一下我在安裝過程遇到幾種錯誤:

completion 被初始化過了

warning: completion was already initialized before completion module. Will call compinit again. See https://github.com/zimfw/zimfw/wiki/Troubleshooting#completion-is-not-working

參考 Troubleshooting,有提供解決方案。

主要問題是已經有地方執行過 compinit 初始化的指令了:

autoload -Uz compinit
compinit

可以用下面指令,搜尋看看有沒有檔案也會執行這兩行指令:

grep -r "compinit" ~/.zsh*

然後註解或是移除即可。

compdef: command not found

complete:13: command not found: compdef
compinit being called at /Users/chenxinyu/.zim/modules/completion/init.zsh:35

找不到原因,我是直接索性將 .zsh 相關的設定檔移除後修好了,不過像是 homebrew 就直接壞了…不過重新安裝就行。

解除安裝 Zim

比起 Oh My Zsh,Zim 的解除安裝真的麻煩許多,需要手動刪除 .zim 這個資料夾以及 .zimrc 這個設定檔。

然後檢查 .zshenv.zshrc.zlogin 這三個檔案,移除裡面和 zim 相關的的初始化指令。

結語

原本只是想說改個 Zsh 樣式,寫一篇 Oh My Zsh 安裝的筆記,但 survey 下去就發現 Zsh 這東西也是大坑,不小心就會越寫越多。

也因為這樣遇到一些問題,像是上面的 Bug 外,安裝 Zim 後也讓我 nvm 的 Deeper Shell Integration 功能也失效了,變得必須自行 Debug,但也因此對 Zsh 的熟悉度又增加了一些,也算是好事(?)