zsh 插件管理器 - Zinit

[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爷怀,zstylescompleteions带欢,variables运授,PATHFPATH烤惊。這使得用戶可以更快熟悉新插件同時(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)安裝:步驟如下:

    1. 下載源碼到~/.zinit/bin
    mkdir ~/.zinit
    git clone https://github.com/zdharma/zinit.git ~/.zinit/bin
    
    1. 添加如下內(nèi)容到~/.zshrc最頂端:
    source ~/.zinit/bin/zinit.zsh
    
    1. 重新加載~/.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历等,verbpick辟癌,depth寒屯,cloneoptssvn黍少。
    • 文件選擇(Selection of Files):涵蓋的描述符有:pick寡夹,srcmultisrc厂置。
    • 加載限定(Conditional Loading):涵蓋的描述符有:wait菩掏,loadunload昵济,cloneonly智绸,ifhas访忿,subscribe / on-update-of瞧栗,trigger-load
    • 插件輸出(Plugin Output):涵蓋的描述符有:silent海铆,lucid迹恐,notify
    • 補(bǔ)全(Completions):涵蓋的描述符有:blockf卧斟,nocompletions殴边。
    • 下載 / 更新 / 加載時(shí)的命令執(zhí)行(Command Execution After Cloning, Updating or Loading):涵蓋的描述符有:mvcp珍语,atclone锤岸,atpull,atinitatload廊酣,run-atpull能耻,nocd赏枚,make亡驰,countdown晓猛,reset
    • Shell 仿真(Sticky-Emulation Of Other Shells):涵蓋的描述符有:sh / !sh凡辱,bash / !bash戒职,ksh / !kshcsh / !csh透乾。
    • 其他(Others)as洪燥,id-ascompile乳乌,nocompile捧韵,servicereset-prompt汉操,bindmap再来,trackbindswrap-track磷瘤,aliases芒篷,light-modeextract采缚。

    完整的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昌犹,glbb览芳,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 --commandas"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-Zshlib插件后,會(huì)先進(jìn)行source completion.zsh操作刹衫,然后還會(huì)對(duì)git.zsh醋寝,functions.zshhistory.zshgrep.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í)行一些額外命令,具體鉤子如下:

      1. atclone:插件下載完成(git clone)后黑滴,執(zhí)行相應(yīng)的命令憨募。
      2. atpull:插件更新完成(git pull)后,執(zhí)行相應(yīng)的命令袁辈。
      3. atinit:插件加載前菜谣,執(zhí)行初始化命令。
      4. 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)完成后滋觉,以及mvcp齐邦,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%框产。

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 提供的另外一些有用的特性以及一些本人覺得好用的操作:

  • 單文件加載:比如對(duì)于 Oh-My-Zsh 和 Prezto 插件奔坟,可以通過snippet修飾符來指定插件的 URI携栋,Zinit 會(huì)自動(dòng)下載并加載。如下所示:
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.zshalias.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è)atcloneatpull舰褪,atinitatload鉤子函數(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-monitorz-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 pullmv命令執(zhí)行之前運(yùn)行茂卦。但是何什,atpullmv等龙,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:在atcloneatpull操作后励七,執(zhí)行make操作(:如果是make '!',那么表示的是在進(jìn)行atcloneatpull之前先執(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 clonegit pull完成之前會(huì)先執(zhí)行make操作腰奋,然后執(zhí)行./direnv hook zsh > zhook.zsh,生成zhook.zsh目標(biāo)文件抱怔,最后再進(jìn)行source zhook.zsh操作劣坊。這樣子就確保了命令./direnv hook zsh只在git clonegit 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)贝攒。
zinit csearch
  • 子目錄 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)行如下配置即可:
    # Load OMZ Git library
    zinit snippet OMZL::git.zsh
    
    # Load Git plugin from OMZ
    zinit snippet OMZP::git
    
    如果想使用 Oh-My-Zsh 主題,由于 OMZ 大多數(shù)主題都要求promptsubst選項(xiàng)陕壹,否則可能出現(xiàn)類似... $(build_prompt) ...的錯(cuò)誤质欲,因此,還需配置如下內(nèi)容:
    setopt promptsubst
    
    如果想禁止 OMZ 的 git 插件提供的補(bǔ)全信息糠馆,可進(jìn)行如下配置:
    zinit cdclear -q
    
    綜上嘶伟,如果想使用 Oh-My-Zsh 主題,完整的配置如下:
    # 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
    

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末又碌,一起剝皮案震驚了整個(gè)濱河市九昧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毕匀,老刑警劉巖铸鹰,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異期揪,居然都是意外死亡掉奄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姓建,“玉大人诞仓,你說我怎么就攤上這事∷偻茫” “怎么了墅拭?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涣狗。 經(jīng)常有香客問我谍婉,道長,這世上最難降的妖魔是什么镀钓? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任穗熬,我火速辦了婚禮,結(jié)果婚禮上丁溅,老公的妹妹穿的比我還像新娘唤蔗。我一直安慰自己,他們只是感情好窟赏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布妓柜。 她就那樣靜靜地躺著,像睡著了一般涯穷。 火紅的嫁衣襯著肌膚如雪棍掐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天拷况,我揣著相機(jī)與錄音作煌,去河邊找鬼。 笑死蝠嘉,一個(gè)胖子當(dāng)著我的面吹牛最疆,可吹牛的內(nèi)容都是我干的杯巨。 我是一名探鬼主播蚤告,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼服爷!你這毒婦竟也來了杜恰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤仍源,失蹤者是張志新(化名)和其女友劉穎心褐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笼踩,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逗爹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚎于。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掘而。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挟冠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袍睡,到底是詐尸還是另有隱情知染,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布斑胜,位于F島的核電站控淡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏止潘。R本人自食惡果不足惜掺炭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凭戴。 院中可真熱鬧竹伸,春花似錦、人聲如沸簇宽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魏割。三九已至譬嚣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钞它,已是汗流浹背拜银。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遭垛,地道東北人尼桶。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像锯仪,于是被迫代替她去往敵國和親泵督。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345