[TOC]
前言
Zinit 是一個(gè)靈活快速的 zsh 插件管理器霹粥,它可以自動(dòng)安裝 Github 或者其他網(wǎng)站上的 zsh 插件。
特性
Zinit 是當(dāng)前唯一提供 Turbo 模式的 zsh 插件管理器窿侈,該模式可以使 zsh 啟動(dòng)提速 50-80%琐脏。
Zinit 會(huì)打印插件加載時(shí)設(shè)置的
aliases
坞琴,functions
坏为,bindkeys
鲸匿,Zle widgets
爷怀,zstyles
,completeions
带欢,variables
运授,PATH
和FPATH
烤惊。這使得用戶可以更快熟悉新插件同時(shí)在不同的場(chǎng)合下,提供了豐富且易于顯示信息等有用功能吁朦。支持插件
unloading
和羅列功能柒室,支持安裝/卸載,有選擇的禁止/啟用插件補(bǔ)全功能逗宜。Zinit 支持加載 Oh-My-Zsh 和 Prezto 插件和庫雄右,但是其實(shí)現(xiàn)不基于特定框架,不會(huì)讓插件管理器膨脹這類代碼(更多該部分內(nèi)容纺讲,可查看:Introduction)擂仍。
系統(tǒng)不使用
$FPATH
,加載擁有相同入口的多個(gè)插件時(shí)熬甚,不會(huì)混亂$FPATH
逢渔。設(shè)置選項(xiàng)通常會(huì)引起兼容性問題,除了KSH_ARRAYS
乡括。Zinit 支持特殊肃廓,專用的為用戶卸載冗長復(fù)雜命令的
packages
。Zinit 提供了特殊的 Zinit 擴(kuò)展:annexes粟判,通過 annexes 可以為插件管理器設(shè)置新的命令亿昏,URL 預(yù)處理器,安裝后(
post-install
)/更新后(post-update
)鉤子...档礁。
安裝
Zinit 提供了自動(dòng)安裝和手動(dòng)安裝兩種方法:
-
自動(dòng)安裝:方法如下:(推薦)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
-
手動(dòng)安裝:步驟如下:
- 下載源碼到
~/.zinit/bin
:
mkdir ~/.zinit git clone https://github.com/zdharma/zinit.git ~/.zinit/bin
- 添加如下內(nèi)容到
~/.zshrc
最頂端:
source ~/.zinit/bin/zinit.zsh
- 重新加載
~/.zshrc
:
source ~/.zshrc
- 下載源碼到
核心功能
Zinit 的涉及到的內(nèi)容很多角钩,完全了解 Zinit 提供的功能其實(shí)沒有必要,我們只需理解 Zinit 最核心的一些功能點(diǎn)即可呻澜。
以下是本人認(rèn)為的 Zinit 的核心功能递礼,掌握下列內(nèi)容,應(yīng)當(dāng)就可以基本使用 Zinit:
-
插件下載及加載:作為一個(gè) zsh 的插件管理器羹幸,其基本功能就是插件下載及加載脊髓。插件的下載 / 加載基本使用方法如下:
zinit load zdharma/history-search-multi-word zinit light zsh-users/zsh-syntax-highlighting
以上兩個(gè)命令是 Zinit 提供的兩個(gè)基礎(chǔ)插件加載配置,其中:
-
load
:表示使能插件追蹤功能栅受。使用該關(guān)鍵字后将硝,Zinit 會(huì)記錄相關(guān)插件啟動(dòng)的信息,并提供如下功能:-
zinit report {plugin-spec}
:查看插件信息 -
zinit unload {plugin-spec}
:卸載插件
-
light
:表示關(guān)閉插件追蹤功能屏镊。當(dāng)使用該關(guān)鍵字后依疼,Zinit 不會(huì)對(duì)插件加載信息進(jìn)行追蹤,也就不具備查看和卸載插件的功能而芥,但正如其名稱一致律罢,它提供了一個(gè)輕量級(jí)插件加載功能,加載插件速度會(huì)非彻髫ぃ快误辑。
注:在 Turbo 模式下沧踏,
load
引起的插件追蹤導(dǎo)致的加載緩慢幾乎是微不足道的。 -
-
ice 修飾符(Ice-Modifiers):Zinit 內(nèi)置了很多
ice
修飾符用于為下一條zinit
命令添加額外的描述信息巾钉。
見名知意翘狱,所謂ice
,表示的就是添加一些東西(比如往飲料里添加冰塊(ice))砰苍,同時(shí)冰塊(ice)易融化盒蟆,表示使用ice
修飾的信息僅僅只對(duì)下一條zinit
命令起作用。ice
修飾符提供的額外信息描述可分為如下幾大項(xiàng):-
下載選項(xiàng)(Cloning Options):涵蓋的描述符有:
proto
师骗,from
历等,ver
,bpick
辟癌,depth
寒屯,cloneopts
,svn
黍少。 -
文件選擇(Selection of Files):涵蓋的描述符有:
pick
寡夹,src
,multisrc
厂置。 -
加載限定(Conditional Loading):涵蓋的描述符有:
wait
菩掏,load
,unload
昵济,cloneonly
智绸,if
,has
访忿,subscribe / on-update-of
瞧栗,trigger-load
。 -
插件輸出(Plugin Output):涵蓋的描述符有:
silent
海铆,lucid
迹恐,notify
。 -
補(bǔ)全(Completions):涵蓋的描述符有:
blockf
卧斟,nocompletions
殴边。 -
下載 / 更新 / 加載時(shí)的命令執(zhí)行(Command Execution After Cloning, Updating or Loading):涵蓋的描述符有:
mv
,cp
珍语,atclone
锤岸,atpull
,atinit
,atload
廊酣,run-atpull
能耻,nocd
赏枚,make
亡驰,countdown
晓猛,reset
。 -
Shell 仿真(Sticky-Emulation Of Other Shells):涵蓋的描述符有:
sh / !sh
凡辱,bash / !bash
戒职,ksh / !ksh
,csh / !csh
透乾。 -
其他(Others):
as
洪燥,id-as
,compile
乳乌,nocompile
捧韵,service
,reset-prompt
汉操,bindmap
再来,trackbinds
,wrap-track
磷瘤,aliases
芒篷,light-mode
,extract
采缚。
完整的
ice
描述符相關(guān)內(nèi)容可查看:Ice Modifiers针炉。以下簡單對(duì)幾個(gè)較常用的
ice
修飾符進(jìn)行介紹:-
as
:表示下載插件的意圖,通常有如下 3 個(gè)選項(xiàng):-
as"progrma"
:也可以寫為as"command"
扳抽,就是將下載的插件作為命令使用篡帕。當(dāng)插件下載完成后,會(huì)自動(dòng)將插件腳本/命令(通常由pick
指定)自動(dòng)添加到系統(tǒng)環(huán)境變量$PATH
中贸呢。 -
as"completion"
:表示將插件或者單文件腳本(以下劃線_*
開始的文件)作為補(bǔ)全文件赂苗。 -
as"null"
:即pick"/dev/null" nocompletions
的簡寫,表示取消默認(rèn)的source
操作和自動(dòng)補(bǔ)全安裝贮尉。
-
-
from
:指定插件下載網(wǎng)址拌滋。支持的網(wǎng)址有:from"github"
(默認(rèn)),..."github-rel"
猜谚,..."gitlab"
败砂,..."bitbucket"
,..."notabug"
(其各自對(duì)應(yīng)的簡寫為:gh
魏铅,gh-r
昌犹,gl
,bb
览芳,nb
)斜姥,也可以是一個(gè)完整的域名。比如:zinit ice from"gh-r" as"program" zinit load junegunn/fzf-bin
上述命令會(huì)到 Github-release 頁面下載
junegunn/fzf-bin
的可執(zhí)行文件,并自動(dòng)解壓铸敏。注:
from
不支持 snippet 操作缚忧。 -
bpick
:用于指定在 GitHub Releases 頁面下載的具體文件(依據(jù)正則表達(dá)式進(jìn)行選取)杈笔。比如:zinit ice from"gh-r" as"program" bpick"*linux*" zinit load docker/compose
上述命令會(huì)在 Github-release 頁面下載名稱符合
*linux*
的文件(也就是 Linux 版本的安裝文件)闪水,并自動(dòng)進(jìn)行解壓。注:通常無需自己指定
bpick
選項(xiàng)蒙具,因?yàn)?Zinit 會(huì)自動(dòng)根據(jù)當(dāng)前操作系統(tǒng)及其 CPU 架構(gòu)自動(dòng)下載合適的文件球榆。
注:bpick
不支持 snippet 操作。 -
pick
:選擇要進(jìn)行source
或者作為命令的文件(當(dāng)使用snippet --command
或as"program"
時(shí))禁筏。pick
選項(xiàng)使用正則匹配持钉,對(duì)下載并解壓完成的文件夾內(nèi)的所有文件按字母表順序進(jìn)行排序,第一個(gè)符合條件的文件即為匹配文件篱昔。比如:zinit ice pick"powerless.zsh" zinit light martinrotter/powerless
上述命令會(huì)下載插件
martinrotter/powerless
右钾,pick
指定了下載完成后會(huì)自動(dòng)進(jìn)行source powerless.zsh
操作。pick
還有另一個(gè)更常用的操作就是結(jié)合as"porgram"
/as"command"
操作旱爆,表示將pick
指定的文件增加+x
權(quán)限并添加到系統(tǒng)環(huán)境變量$PATH
中舀射。比如:zinit ice as"program" pick"httpstat.sh" zinit light b4b4r07/httpstat
上述命令會(huì)下載插件
b4b4r07/httpstat
,由于指定了as"program"
怀伦,所以會(huì)將pick
選項(xiàng)指定的文件作為可執(zhí)行文件脆烟,此時(shí) Zinit 會(huì)自動(dòng)將httpstat.sh
所在的目錄添加到$PATH
中。注:使用
as"program"
時(shí)房待,對(duì)pick
執(zhí)行的文件邢羔,就不會(huì)進(jìn)行source
操作,而是作為命令使用桑孩,因此拜鹤,通常會(huì)結(jié)合mv
/cp
等選項(xiàng)將可執(zhí)行文件重命名,方便終端簡化命令調(diào)用流椒,比如對(duì)上述代碼進(jìn)行修改為如下:zinit ice as"program" cp"httpstat.sh -> httpstat" pick"httpstat" zinit light b4b4r07/httpstat
當(dāng)下載完成后敏簿,會(huì)首先進(jìn)行
cp
操作,將插件根目錄的httpstat.sh
復(fù)制一份為httpstat
宣虾,然后pick
選項(xiàng)生效惯裕,為httpstat
添加可執(zhí)行權(quán)限并添加到$PATH
中。如此終端就可以直接使用httpstat
命令了绣硝。 -
src
:指定額外文件進(jìn)行source
蜻势。當(dāng)pick
指定的主文件source
完成或添加到$PATH
后,會(huì)對(duì)src
指定的文件進(jìn)行source
操作鹉胖。zinit ice pick"powerless.zsh" src"utilities.zsh" zinit light martinrotter/powerless
上述命令在
powerless.zsh
進(jìn)行source
操作后握玛,還會(huì)執(zhí)行source utilities.zsh
操作够傍。注:
src
不支持正則匹配,而是直接以原意進(jìn)行匹配挠铲。 -
multisrc
:支持指定多個(gè)文件進(jìn)行source
操作冕屯。多個(gè)文件以空格進(jìn)行分割,或者以大括號(hào)進(jìn)行分割市殷。比如:zinit ice svn pick"completion.zsh" multisrc'git.zsh \ functions.zsh {history,grep}.zsh' zinit snippet OMZ::lib
上述命令在下載完成 Oh-My-Zsh 的
lib
插件后,會(huì)先進(jìn)行source completion.zsh
操作刹衫,然后還會(huì)對(duì)git.zsh
醋寝,functions.zsh
,history.zsh
和grep.zsh
進(jìn)行source
操作带迟。注:
multisrc
支持正則匹配音羞。 load
:當(dāng)滿足條件時(shí),加載插件仓犬。插件只會(huì)加載一次嗅绰,當(dāng)下次條件再次滿足時(shí),不會(huì)觸發(fā)再次加載(除非插件已被卸載unload
)搀继。-
unload
:當(dāng)滿足條件時(shí)窘面,卸載插件。插件只會(huì)卸載一次叽躯,當(dāng)下次條件再次滿足時(shí)财边,不會(huì)觸發(fā)再次卸載(除非插件已被再次加載load
)。# Load when in ~/tmp zinit ice load'![[ $PWD = */tmp* ]]' unload'![[ $PWD != */tmp* ]]' \ atload"!promptinit; prompt sprint3" zinit load psprint/zprompts # Load when NOT in ~/tmp zinit ice load'![[ $PWD != */tmp* ]]' unload'![[ $PWD = */tmp* ]]' zinit load russjohnson/angry-fly-zsh
-
插件生命周期(life-cycle):Zinit 中点骑,插件加載會(huì)經(jīng)歷四個(gè)生命周期:下載(clone)-> 更新(update)-> 初始化(init)-> 加載(load)酣难。每個(gè)周期 Zinit 都為我們提供了相應(yīng)的鉤子(hook)方便我們?cè)谙鄳?yīng)的插件生命周期內(nèi)執(zhí)行一些額外命令,具體鉤子如下:
-
atclone
:插件下載完成(git clone
)后黑滴,執(zhí)行相應(yīng)的命令憨募。 -
atpull
:插件更新完成(git pull
)后,執(zhí)行相應(yīng)的命令袁辈。 -
atinit
:插件加載前菜谣,執(zhí)行初始化命令。 -
atload
:插件加載完成后晚缩,執(zhí)行相應(yīng)的命令葛菇。如果采用zinit load
方式加載插件,則此時(shí)atload"!{command}"
會(huì)對(duì)插件加載過程進(jìn)行檢測(cè)橡羞。
zinit ice from"gh-r" as"program" bpick"*amd64*.deb" pick"usr/bin/bat" \ atclone"echo clone" \ atpull"echo update" \ atinit"echo init" \ atload"echo load" zinit light sharkdp/bat
-
mv
:在下載(git clone
)或者更新(git pull
)完成后眯停,進(jìn)行mv
操作。比如:mv "fzf-* -> fzf"
cp
:在下載(git clone
)或者更新(git pull
)完成后卿泽,進(jìn)行cp
操作莺债。比如:cp "docker-c* -> dcompose"
make
:在下載(git clone
)/ 更新(git pull
)完成后滋觉,以及mv
,cp
齐邦,atpull
椎侠,atclone
操作完成后,執(zhí)行make
命令措拇,編譯源碼我纪。make
選項(xiàng)可添加參數(shù)信息,比如:make"install PREFIX=/opt"
丐吓。如果make
選項(xiàng)以!
開頭(make'!'
)浅悉,那么其會(huì)先于atclone
/atpull
運(yùn)行。
zinit ice as"program" atclone"rm -f src/auto/config.cache; ./configure" \ atpull"%atclone" make pick"src/vim" zinit light vim/vim
上述命令使用 Zinit 下載 Vim 源碼并進(jìn)行編譯安裝券犁。當(dāng)插件
vim/vim
下載完成后术健,會(huì)觸發(fā)atclone
鉤子,此時(shí)會(huì)執(zhí)行rm -f src/auto/config.cache; ./configure
操作粘衬,然后執(zhí)行make
操作荞估,編譯 Vim 源碼,此時(shí)src
文件就會(huì)生成可執(zhí)行文件vim
稚新,最后通過pick
選項(xiàng)將make
生成的vim
添加到$PATH
中勘伺。當(dāng)插件更新完成后,會(huì)觸發(fā)atpull
操作褂删,%atclone
表示執(zhí)行的命令與atclone
一致娇昙,最后會(huì)再次觸發(fā)make
操作,對(duì)更新后的源碼進(jìn)行編譯笤妙。reset
:在插件更新(git pull
)前冒掌,執(zhí)行git reset --hard HEAD
(或者svn revert
)操作,將插件恢復(fù)到上一次初始狀態(tài)蹲盘,目的是為了避免插件更新引起的可能沖突(conflict)股毫。對(duì)于使用gh-r
下載的插件,會(huì)執(zhí)行rm -rf *
操作召衔,直接刪除所有舊文件铃诬。-
wait
:用于插件(或腳本文件)延遲加載。其使用有如下幾種方式:-
wait'<number>'
:表示在控制臺(tái)啟動(dòng)number
毫秒后苍凛,加載插件趣席。比如:zinit ice wait'1' zinit light wfxr/forgit
上述命令表示在控制臺(tái)(prompt)啟動(dòng) 1s 后,加載插件
wfxr/forgit
醇蝴。注:不附帶數(shù)值的
wait
相當(dāng)于wait'0'
宣肚,表示控制臺(tái)啟動(dòng)后立即加載插件。 -
wait’[[ ... ]]‘
/wait'(( ... ))'
:當(dāng)滿足條件時(shí)悠栓,加載插件霉涨。比如:zinit ice wait'[[ $PWD = */github || $PWD = */github/* ]]' zinit load unixorn/git-extra-commands '
上述命令在用戶進(jìn)入
github
目錄時(shí)按价,會(huì)自動(dòng)加載插件unixorn/git-extra-commands
。 wait'!...'
:!
表示當(dāng)加載插件完成后笙瑟,重置控制臺(tái)楼镐。通常用于主題插件的加載。
-
注:zsh 在使用
wait
描述符延遲加載插件后往枷,其啟動(dòng)速度可提升 80%框产。 -
下載選項(xiàng)(Cloning Options):涵蓋的描述符有:
注:ice
描述符的執(zhí)行順序?yàn)椋?strong>atinit
-> atpull!
-> make'!!'
-> mv
-> cp
-> make!
-> atclone
/atpull
-> make
-> (plugin script loading)
-> src
-> multisrc
-> atload
'
-
Turbo Mode (Zsh >= 5.3):Zinit 中所謂的 Turbo Mode,其實(shí)就是插件延遲加載功能错洁,更確切的說秉宿,就是使用
ice
修飾符的wait
選項(xiàng)進(jìn)行插件加載。比如:PS1="READY > " zinit ice wait'!0' zinit load halfo/lambda-mod-zsh-theme
上述命令表示終端在加載完成
.zshrc
文件并成功顯示第一個(gè)控制臺(tái)時(shí)墓臭,加載插件halfo/lambda-mod-zsh-theme
蘸鲸。實(shí)際上插件真正進(jìn)行加載大約是在提示符READY >
出現(xiàn)后的 1ms 內(nèi)妖谴。
我們一般不會(huì)用以上方法加載提示符窿锉,但此處作為直接觀察 Turbo 模式卻是一個(gè)不錯(cuò)的方法。 -
Zinit 命令(Zinit Commands):Zinit 提供了在終端進(jìn)行操作的一些命令膝舅,比如:
# 加載插件 $ zinit load {plg-spec} # 加載插件嗡载,不打印加載信息 $ zinit light [-b] {plg-spec} # 加載單文件,-f 表示不使用緩存仍稀,即強(qiáng)制重新下載 $ zinit snippet [-f] {url} # 卸載插件洼滚,-q 表示 quiet $ zinit unload [-q] {plg-spec} # 顯示插件加載時(shí)間,以插件加載順序排序技潘。-s 表示以秒進(jìn)行顯示(默認(rèn)毫秒)遥巴,-m 表示顯示插件加載時(shí)刻 $ zinit times [-s] [-m] # 顯示 Zinit 狀態(tài) $ zinit zstatus # 顯示插件加載狀態(tài),--all 表示顯示所有插件 $ zinit report {plg-spec} | --all # 顯示已加載的插件(使用關(guān)鍵字進(jìn)行過濾) $ zinit loaded [keyword],list [keyword] # 顯示每個(gè)插件的設(shè)置的按鍵綁定 $ zinit bindkeys # 編譯插件 $ zinit compile {plg-spec} | --all # 移除已編譯的插件 $ zinit uncompile {plg-spec} | --all # 顯示已編譯的插件 $ zinit compiled # 更新 Zinit $ zinit self-update # 更新插件/腳本享幽,--all 表示更新所有插件/腳本铲掐,-q 表示靜默更新,-r | --reset 更新前執(zhí)行 git reset --hard / svn revert $ zinit update [-q] [-r] {plg-spec} | URL | --all # 為下一條 zinit 命令添加 ice 描述符 $ zinit ice <ice specification> # 磁盤刪除插件/腳本值桩,--all 表示清除摆霉,--clean 表示刪除未加載的插件/腳本 $ zinit delete {plg-spec} | URL | --clean | --all # 進(jìn)入插件目錄 $ zinit cd {plg-spec}
更多 Zinit 內(nèi)置命令,請(qǐng)參考:zinit-commands
其他
以下是 Zinit 提供的另外一些有用的特性以及一些本人覺得好用的操作:
zinit snippet 'https://github.com/robbyrussell/oh-my-zsh/raw/master/plugins/git/git.plugin.zsh'
zinit snippet 'https://github.com/sorin-ionescu/prezto/blob/master/modules/helper/init.zsh'
snippet
表示通過curl
咳秉,wget
下載的單文件腳本婉支。
對(duì)于 Oh-My-Zsh 和 Prezto,Zinit 提供了相應(yīng)的簡寫方式:
# OMZ:: 表示 Oh My Zsh 插件
zinit snippet OMZ::plugins/git/git.plugin.zsh
# PZT:: 表示 Prezto 插件
zinit snippet PZT::modules/helper/init.zsh
-
多文件加載:
snippet
支持Subversion
協(xié)議澜建,Github 同樣也支持該協(xié)議磅摹。因此滋迈,如果使用的是Subversion
協(xié)議,那么snippet
則支持 多文件加載(比如户誓,一個(gè) Prezto 模塊可以包含兩個(gè)或以上文件饼灿,比如init.zsh
,alias.zsh
)帝美。默認(rèn)會(huì)進(jìn)行加載的文件為:*.plugin.zsh
碍彭,init.zsh
,*.zsh-theme
:
# URL points to directory
zinit ice svn
zinit snippet PZT::modules/docker
-
附件(Annexes):Zinit 附件即 Zinit 擴(kuò)展(Zinit Extensions)悼潭,其作用是為 Zinit 增加一些子命令(subcommand)庇忌,增加更多新的
ice
修飾符選項(xiàng)以及注冊(cè)atclone
,atpull
舰褪,atinit
和atload
鉤子函數(shù)...比如:
# Load a few important annexes, without Turbo
# (this is currently required for annexes)
zinit light-mode for \
zinit-zsh/z-a-patch-dl \
zinit-zsh/z-a-as-monitor \
zinit-zsh/z-a-bin-gem-node
上述命令就安裝了 3 個(gè)比較重要的附件:z-a-patch-dl
皆疹,z-a-as-monitor
和z-a-bin-gen-node
。
-
For 語法(The For-Syntax):相對(duì)于經(jīng)典的
ice
語法占拍,F(xiàn)or 語法提供了更加緊湊略就,優(yōu)化的語法結(jié)構(gòu)。比如:
zinit as"null" wait"3" lucid for \
sbin"recall" Fakerr/git-recall \
sbin paulirish/git-open \
sbin paulirish/git-recent \
sbin davidosomething/git-my \
make"PREFIX=$ZPFX install" iwata/git-now \
make"PREFIX=$ZPFX" tj/git-extras
上述單一一條命令就安裝了 6 個(gè)插件晃酒,并且所有插件共享基礎(chǔ)ice
選項(xiàng):as"null
表牢,wait"3"
,lucid
贝次,可以看到崔兴,F(xiàn)or 語法確實(shí)簡潔許多。
注:sbin
描述符是由附件 z-a-bin-gem-node 提供的蛔翅,sbin
選項(xiàng)的作用在于無需更改$PATH
就可以在命令行中直接使用其指定的命令敲茄。如果命令與插件名稱相同,可省略不寫山析。
-
atpull"…"
:atpull
屬性在插件更新的時(shí)候會(huì)被觸發(fā)堰燎。通常在更新插件的時(shí)候,拷貝文件是安全操作:因?yàn)閭}庫初始文件是不會(huì)被修改的盖腿,因此 Git 不會(huì)報(bào)告沖突爽待。但是,移動(dòng)mv
文件就不一定了翩腐,此時(shí)鸟款,就可結(jié)合atpull
屬性:zinit ice as"program" mv"httpstat.sh -> httpstat" \ pick"httpstat" atpull'!git reset --hard' zinit light b4b4r07/httpstat
無沖突更新:如果
atpull
以感嘆號(hào)開頭,那么它會(huì)在git pull
和mv
命令執(zhí)行之前運(yùn)行茂卦。但是何什,atpull
,mv
等龙,cp
只在抓取到新提交commit
的時(shí)候才會(huì)運(yùn)行处渣。
因此伶贰,對(duì)于上述命令,如果用戶執(zhí)行zinit update b4b4r07/httpstat
命令更新插件罐栈,如果該插件抓取到新的commit
黍衙,那么首先就會(huì)執(zhí)行git reset --hard
,重新恢復(fù)初始文件httpstat.sh
荠诬,然后就執(zhí)行git pull
琅翻,拉取新commit
(使用fast-forward
模式),成功后就會(huì)執(zhí)行mv
命令柑贞,將httpstat.sh
修改為httpstat
方椎。以這種方式就可以在無須阻塞git
更新的同時(shí),使用mv
命令永久更新插件內(nèi)容钧嘶。
-
腳本命令(Snippets-Commands):可以將腳本的命令直接添加到
$PATH
中:
zinit ice mv"httpstat.sh -> httpstat" \
pick"httpstat" as"program"
zinit snippet \
https://github.com/b4b4r07/httpstat/blob/master/httpstat.sh
-
編譯程序(Compiling Programs):典型的場(chǎng)景就是從 github 下載源碼進(jìn)行編譯棠众,比如運(yùn)行
./configure
/make
等命令,則此時(shí)可以使用ice
修飾符有决,通過pick
選擇需要添加到$PATH
的二進(jìn)制程序闸拿,通過make
選項(xiàng)執(zhí)行 make 操作...例子如下:
zinit ice as"program" atclone"rm -f src/auto/config.cache; ./configure" \
atpull"%atclone" make pick"src/vim"
zinit light vim/vim
上述命令中的各個(gè)參數(shù)含義如下:
-
as"program"
:表示結(jié)果為一個(gè)可執(zhí)行文件(命令),因此不會(huì)進(jìn)行source
操作疮薇,而是直接把 Zinit 會(huì)把pick
指定的二進(jìn)制文件添加到$PATH
中胸墙。 -
atclone"..."
:表示下載(git clone
)完成后我注,需要執(zhí)行的命令按咒。 -
atpull"%atclone"
:表示更新(git pull
)完成后,執(zhí)行atclone''
指定的命令但骨。 -
make
:在atclone
和atpull
操作后励七,執(zhí)行make
操作(注:如果是make '!'
,那么表示的是在進(jìn)行atclone
或atpull
之前先執(zhí)行make
操作)奔缠。 -
pick"src/vim"
:表示編譯完成后生成的可執(zhí)行文件為src/vim
掠抬,則意味著 Zinit 會(huì)把src
目錄添加到$PATH
中。
如果需要執(zhí)行的是make install
操作校哎,則只需將make
修改為make"all install"
如果編譯(make
)完成后两波,需要進(jìn)行source
操作,則使用src
選項(xiàng)闷哆,比如:
zinit ice as"program" make'!' atclone'./direnv hook zsh > zhook.zsh' \
atpull'%atclone' src"zhook.zsh"
zinit light direnv/direnv
上述命令在git clone
和git pull
完成之前會(huì)先執(zhí)行make
操作腰奋,然后執(zhí)行./direnv hook zsh > zhook.zsh
,生成zhook.zsh
目標(biāo)文件抱怔,最后再進(jìn)行source zhook.zsh
操作劣坊。這樣子就確保了命令./direnv hook zsh
只在git clone
和git pull
時(shí)才執(zhí)行,其他情況不響應(yīng)屈留,因此 zsh 可以更快啟動(dòng)局冰。
-
腳本補(bǔ)全(Snippets-Completions):通過使用
as"completion"
测蘑,可以讓snippet
命令直接加載一個(gè)補(bǔ)全文件:
zinit ice as"completion"
zinit snippet https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker
- 補(bǔ)全管理(Completion Management):Zinit 允許為每個(gè)插件指定各自補(bǔ)全的禁止/啟用。比如安裝一個(gè)流行的提供補(bǔ)全的插件:
zinit ice blockf
zinit light zsh-users/zsh-completions
第一條命令中的blockf
指令會(huì)阻斷傳統(tǒng)的補(bǔ)全添加方式康二,Zinit 會(huì)使用自己的方式(基于符號(hào)鏈接而不是添加多個(gè)目錄到$fpath
)碳胳。
Zinit 會(huì)自動(dòng)安裝新下載插件的補(bǔ)全。如果要卸載補(bǔ)全然后再重新安裝沫勿,方法如下:
zinit cuninstall zsh-users/zsh-completions # uninstall
zinit creinstall zsh-users/zsh-completions # install
- 列舉補(bǔ)全(Listing Completions):查看所有插件提供的補(bǔ)全固逗,方法如下:
zi clist
默認(rèn)情況下,上述命令每行會(huì)顯示插件的 3 個(gè)補(bǔ)全藕帜,也可以通過為clist
添加參數(shù)指定補(bǔ)全顯示個(gè)數(shù)烫罩,比如:
zi clist 6 # 每行顯示 6 個(gè)補(bǔ)全
- 啟用/禁用補(bǔ)全(Enabling and Disabling Completions):啟用/禁止補(bǔ)全只需提供補(bǔ)全的名字:
$ zi cdisable cmake
Disabled cmake completion belonging to zsh-users/zsh-completions
$ zi cenable cmake
Enabled cmake completion belonging to zsh-users/zsh-completions
-
補(bǔ)全搜索:
zinit csearch
命令會(huì)對(duì)所有插件目錄進(jìn)行補(bǔ)全搜索,列舉所有可用補(bǔ)全洽故,并顯示其安裝狀態(tài)贝攒。
-
子目錄 SVN 支持(Subversion for Subdirectories):通常,如果要使用 Github 項(xiàng)目的某個(gè)子目錄作為 snippet时甚,那么可以為 URL 添加
/trunk/{path-to-dir}
隘弊,比如:
zinit ice svn
zinit snippet https://github.com/zsh-users/zsh-completions/trunk/src
# For Oh My Zsh and Prezto, the OMZ:: and PZT:: prefixes work
# without the need to add the `/trunk/` infix (however the path
# should point to a directory, not to a file):
zinit ice svn; zinit snippet PZT::modules/docker
snippet 也會(huì)像插件下載一樣,自動(dòng)安裝其補(bǔ)全荒适。
-
使用 Oh-My-Zsh 主題:Zinit 并沒有直接提供加載 Oh-My-Zsh 框架的功能梨熙,但是我們可以通過
snippet
命令來加載單獨(dú)的插件。
Oh-My-Zsh 的部分插件 / 主題會(huì)依賴 Oh-My-Zsh 本身提供的一些功能刀诬,比如常用的 git 庫和 git 插件咽扇,則在.zshrc
中進(jìn)行如下配置即可:
如果想使用 Oh-My-Zsh 主題,由于 OMZ 大多數(shù)主題都要求# Load OMZ Git library zinit snippet OMZL::git.zsh # Load Git plugin from OMZ zinit snippet OMZP::git
promptsubst
選項(xiàng)陕壹,否則可能出現(xiàn)類似... $(build_prompt) ...
的錯(cuò)誤质欲,因此,還需配置如下內(nèi)容:
如果想禁止 OMZ 的 git 插件提供的補(bǔ)全信息糠馆,可進(jìn)行如下配置:setopt promptsubst
綜上嘶伟,如果想使用 Oh-My-Zsh 主題,完整的配置如下:zinit cdclear -q
# Load OMZ Git library zinit snippet OMZL::git.zsh # Load Git plugin from OMZ zinit snippet OMZP::git zinit cdclear -q # <- forget completions provided up to this moment setopt promptsubst # Load theme from OMZ # zinit snippet OMZT::gnzh # Load normal GitHub plugin with theme depending on OMZ Git library # zinit light NicoSantangelo/Alpharized