Ubuntu 安裝使用 zsh + zinit 懶人包
之前曾提過,要嘗試在自己新開的 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.