Ubuntu 安裝使用 zsh + zinit 懶人包

kyo
Code and Me
Published in
9 min readSep 12, 2021
by Aleksandar Pasaric from Pexels

之前曾提過,要嘗試在自己新開的 VM 上面使用之前沒用過的 zsh 套件管理器 — zinit,取代原來在 Mac 上的 zplug 方案。安裝後也進行了簡單的回顧

後來工作上又開了好幾個 VM,也是裝 Ubuntu,因為覺得設定有點麻煩所以一直使用預設的 bash shell,但操作起來就遠遠不及 zsh + 套件流暢。

只能說 zsh 真的用過就回不去了!想想還是鐵了心,把整個流程寫下來,作為日後的參考。

所謂的懶人包

就是只用最簡單的設定,獲取最重要的幾項功能,立即讓生產力得到提升。

和前一篇安裝 pyenv 的文章一樣,為確保內容的正確與可行,繼續使用同一個 Google f1-micro VM 來進行。

值得一提的是,因為安裝 pyenv 時要修改.bashrc.zshrc 相關檔案,如果兩者(zsh + pyenv)都要安裝,那麼適合先從本篇的 zsh 設定做起,以免重工。

安裝設定 zsh

這部分很簡單。

apt 安裝

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y zsh

將 zsh 設為預設登入 shell

安裝完 zsh 後,打 zsh 就可以登入使用。

sudo cat /etc/shells 指令可以看到目前 VM 上所有可用的 shell 路徑,包括了我們剛剛裝好的 zsh:

/bin/sh
/bin/bash
/usr/bin/bash
...
/bin/zsh
/usr/bin/zsh

使用下列指令將「當前使用者」的登入 shell 預設為/bin/zsh

sudo usermod -s /bin/zsh $USER

這樣之後登入就不必再打 zsh 了。

重登後,可使用 echo $SHELL確認輸出結果是否為/bin/zsh

新增與設定.zshrc

登入後,系統可能會提示你沒有.zshrc相關檔案等等,這很正常,新增即可。也要把之前存在.bashrc的內容貼到.zshrc 來,但要注意無法照單全收。

同時新增.zprofile

安裝 zinit

zsh 有很多套件管理器,安裝了這些套件後,才能發揮 zsh 真正強大之處,其中最有名的套件管理器不用說就是 oh my zsh

強大但複雜的 package manager

然而,有用過 zsh 套件管理器的都知道,無論 oh my zsh、zplug 還是 zinit,它們實際上都有非常豐富的語法和設定,都要弄清楚恐怕會讓人一個頭十個大,所涉及的 Linux、shell 相關知識也往往不是一般工程師的擅長領域。

因此,我們還是回歸簡潔精神,貫徹 80/20 法則,只設定最常用的那幾個外掛功能即可。因為光用這幾項功能,就已經能讓效率提升數倍了。

略過布景主題,但推薦 p10k

本篇會略過布景主題部分,倒不是它不重要,只是每個人各有偏好。真的不知道要選哪個的話,相信 p10k 還是目前最多人推薦的選項,我自己也是用它,而它在安裝上又有一些必要設定,且很可能需要額外安裝字型才能正常顯示。

總之,這部分並非本篇重點,所以暫且不提。

簡潔就好

關於所要安裝的外掛功能,之前都是複製貼上別人的.zshrc 設定,為了寫這篇文章我又花了 2 小時把必要的部分弄清楚一點,以下就只進行這些部分的設定,省去我自己也不確定是什麼功能的配置內容。

不得不說,複雜的設定也往往是令人卻步的主因,相信一部分人因此選擇了最無腦的 oh my zsh,那也不錯。本篇就獻給不想用 oh my zsh 而希望更加輕量、簡潔的用戶。

換句話說,選擇 zinit 或其他輕量的管理器,才好實現簡單設定與使用,而不用被 oh my zsh 強制幫你裝一堆東西。

對工程師而言,簡潔是一種信仰。

指令安裝 zinit

直接參考官方文件

sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"

設定 zinit

.zshrc新增配置語句

這邊是重點中的重點,輕量化的套件管理器如 zplug 或這裡的 zinit,基本上都是安裝 zsh 後,直接在.zshrc 加上相對應的配置語句即可。

而不同的管理器也有不同的語法,你可能根本不想知道這些語法細節,至少我是如此。所以通常裝完後就是去複製別人的.zshrc 片段,以下我也會提供複製素材,並稍加介紹每一行設定的作用為何。

新增所需的全部配置會放在最後,讓我先闡述一下這些功能。

zsh 套件四天王

各種動漫作品中常常出現四天王,而如果別人的配置你看多了,無論是哪一款 zsh 管理器,相信這四個絕對是最常出現的:

zinit light zsh-users/zsh-completions
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-history-substring-search
zinit light zdharma/fast-syntax-highlighting

簡單介紹:

  • zsh-completions:強化 zsh 以tab鍵「命令自動補全」功能,功能很多,我並不完全了解,其中一項是cd指令後面可以只接資料夾或檔名的「模糊搜尋」,按tab就會幫你搜尋與匹配。比如打cd sk就幫你找到cd Desktop/
  • zsh-autosuggestions:輸入一部分內容就會以暗字提示相同前綴的最後一個使用過的指令,超級方便。這或許就是最強的一項功能沒有之一。
  • zsh-history-substring-search:可視為「以方向鍵取得與切換歷史指令」的強化版,差別在於你可以先輸入部分指令比如docker container,此時再按方向鍵就「只會限制搜尋以此前綴開頭」的歷史指令,大幅縮小搜尋範圍。輸入部分不需要是完整指令。
  • fast-syntax-highlighting:這個應該就比較不用解釋,指令、參數、有效無效的指令都會有自己的顏色。

Oh my zsh 補強

oh my zsh 佔據了 zsh 管理器的大片江山,有其強大之處,其餘的管理器必然要支援其部分功能,以降低你搬家的心理門檻。況且已造好的優質輪子,豈有不借用之理?

以下這幾個是 oh my zsh 的 內建功能 ,推薦一併安裝:

zinit snippet OMZ::lib/completion.zsh
zinit snippet OMZ::lib/history.zsh
zinit snippet OMZ::lib/key-bindings.zsh
zinit snippet OMZ::lib/theme-and-appearance.zsh

這些算是 oh my zsh 的功能而非獨立的外掛,我找不到很完整的介紹,以下是實測後的大概功能介紹:

  • lib/completion.zsh:類似前述的zsh-completions。一個特色是持續按tab會移動到命令列外的選單,此時可以用方向鍵選擇。
  • lib/history.zsh:共用history指令的快取內容,我沒裝的話,一登出 zsh 就找不到原來的歷史紀錄了。
  • lib/key-bindings.zsh:沒裝的話我zsh-history-substring-search的 key-binding 設定會無效,所以還是乖乖裝了。
  • lib/theme-and-appearance.zsh:有裝的話終端機的布景主題配色才會套用到 VM 上。

key-bindings

我只設了兩組而已,其中給 zsh-history-substring-search 的部分(即前兩行)是必要的。

bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
bindkey ',' autosuggest-accept

前兩行:設定後才能用上下鍵來使用 zsh-history-substring-search

第三行: zsh-autosuggestions在暗字提示出現後,要按方向鍵 來補完,新增此 key-binding 後按,也可以了。因為, 比較近,比方向鍵更加方便操作。

其他

從名稱就能看得出來,它的功能就是你明明設了 alias卻打了完整的指令,會提示你 alias 的存在。這部分非必要,我只放在其他。

小結

以上這幾樣已經足夠覆蓋大部分的日常使用情景,最後附上設定檔:

# zsh 套件四天王
zinit light zsh-users/zsh-completions
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-history-substring-search
zinit light zdharma/fast-syntax-highlighting

# oh my zsh 功能
zinit snippet OMZ::lib/completion.zsh
zinit snippet OMZ::lib/history.zsh
zinit snippet OMZ::lib/key-bindings.zsh
zinit snippet OMZ::lib/theme-and-appearance.zsh

# key binding
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
bindkey ',' autosuggest-accept

# 其他
zinit load djui/alias-tips

Originally published at https://blog.kyomind.tw on September 12, 2021.

--

--