From 2b460a74f236178cd8d06b55069049381d79256e Mon Sep 17 00:00:00 2001 From: Vladislav Doster Date: Thu, 15 Dec 2022 22:21:49 -0600 Subject: [PATCH] fix: vim modelines & zsdoc pdf rendering Signed-off-by: Vladislav Doster --- doc/zsdoc/pdf/git-process-output.zsh.pdf | Bin 50348 -> 50195 bytes doc/zsdoc/pdf/rpm2cpio.zsh.pdf | Bin 25337 -> 25327 bytes doc/zsdoc/pdf/zinit-additional.zsh.pdf | Bin 67381 -> 67021 bytes doc/zsdoc/pdf/zinit-autoload.zsh.pdf | Bin 397449 -> 385118 bytes doc/zsdoc/pdf/zinit-install.zsh.pdf | Bin 213591 -> 229327 bytes doc/zsdoc/pdf/zinit-side.zsh.pdf | Bin 106114 -> 102824 bytes doc/zsdoc/pdf/zinit.zsh.pdf | Bin 459235 -> 448345 bytes scripts/docker-build.sh | 81 - scripts/docker-run.sh | 260 -- zinit-additional.zsh | 13 +- zinit-autoload.zsh | 4913 +++++++++++----------- zinit.zsh | 5 +- 12 files changed, 2466 insertions(+), 2806 deletions(-) delete mode 100755 scripts/docker-build.sh delete mode 100755 scripts/docker-run.sh diff --git a/doc/zsdoc/pdf/git-process-output.zsh.pdf b/doc/zsdoc/pdf/git-process-output.zsh.pdf index 3359dc1b43219aa31366c94de6de0727cfc809d1..d8d8436846b34f701722b6a0e7a14ea98cb32d22 100644 GIT binary patch delta 27582 zcmce-byVET_a%zEySqExxCeIvgrI@o8r-e%-~^iB8eD_B1()C&90I`|g2U_N=H9vA zSu^wAyfwf1hwgJebx!TtRkhFQ)lGQ>EI1tY!#W->6&IBT3g=5>OLJvo6LUKkDj;wC zWdSsxHVxVm8kSc;0BkQx4nCphs#S-*fd(tW4}fset@E9DKYG0Q?+WJP-@OA;1g4afbFEu-MSq2?ePDfFPJ6hy8owh)=pzw!Xr?L@Nx5VfnOlJ0@L8X0sWiGe~5K4 zwMXIONe3*`OlIRHYlAUD-)vx&9Hi(;BkV6o_1=+d36LND4{2KCS!atVjA3T3dI}|=14qnK1QvGr8 z0e+$VC)pqKugM^>zn?;8`Go}%`)*NlEbiYc2XnDggZ?k@@DK9;0S%yE z#Qqoa@V}w~7Q!01orN8lANZSO$f;H$ia_|qH$NYEktpi-TRv{EE%9Go9zO6Laq@33 z5CBdlaTIYv;id9Gft)oU5cuo%{_90kN)-iiH~)j<-zGOV@9(1m{=&kXfQkSw$j!mc z2j1Ys1+#Oafwf5U;D8)J0f>VGjK#%MYecpRO$tf=OHyQk99&e~e18m{UxpwUgO{Y% znL+{@a`7O8sF;k*%w3JG?Od24%lPB5aI-gcwRW)o<@>EpkWu!=@5~`4Ab|=Gj+qL; zl|V%W4FpqD;WI+6%kMlcUiJ=-F4n(-c>cItt>2m3S=&Pb0X*P0RK#F;8Vs-^B|aq5 zfhr%G2mFEtAIwaR56%1g-7CmDKFAYla1?bUSb~NS%tnI;EdY7O0+Fv@{ur7F7y#tf zLc-W-@d>#h^EjB;pooZ2aVneJTe@0N@o+<)>(bKv_u>>y3lS#)E?y3SU+VZ^U^#2m4NIJ{^(>ZIq>D^%<8_ECQ z;}2wF2Y+TF1fMbg2Ua$gU;56?{7c{Eng4|i#H{_{E%DlZzcSd2{Po568^FN zR>D8#e^bIgj=#k1pJacVzbE@!3IAaETM2(dCHsZ-ZzcS*l)sb^Vu0D%>3+%JAOC+D z3ID+UM+W~J2ft0gzZ7x1fX;Nj!t0RBFYJP@_}$A+B8KP}MT zBmP`^9zGxk@9*>Ymk99iasP^koX0;l1QVox`4#_LBzS;a96X@k=kcF}0LT&k)#Cg$ z;a?Uc!C!d(G9mGQHCj|We>wirk>A;VCHvd_J((%WAM-CPcK?`vLnZz@*I$eM*UG`1 z?37?GBm~g^6(0WQG=TnI=YJ^=|5F+S!HEDKcpd-;FCUl+Qynb91qU`F;|J>k-$Mhy z8^ABn+~9R`W$+0PJjvhn5YqNg{jOb*LJ4W=sJMZU+Q@_Yt9JgXDf$2aScR7w^;a$X z+xFt6hLoywURInxNtBIUT&aLuzseoBkdGex$or1)Pd_i^;AZbi#f8GDYVPSu1>gq< zLRteseq!(lA2B3}FTV(+5~71S_))z^k`MW4XK4&nf+z(;~8zg&YtoZuKfbV#*D2jd9SgWDkGGDV03_}7|I zIRA5%z<E8018d1=2}@A4GYX zKV$VE{fTiS9jM(K`4y>l(yotIL8umv6*OFNz9bG69kdB|8Jv7T^e6^FgQ*f#^#YPH zT?Q88J4Ry8FYbrEBXq}33E=OZQwkt`Pmx%l(!k!ag2k=%0C-4^k$7O}?D>JkaMtg7#pBxJK=d0DZAii-1xT94LqECsCNM3JCFGRr?Fy{_ z_{~{odsYM%H%e1tU?#P9Rmn4V$_Ip|;V);@pzU#oCpc~>tqAgw;uXSSouHYmb zKFuRBpVsCmSY7pUm{Ie6YM;T|-@b_dup^5vLb&+Fa{WypORT!cP4R2_Xn-m6xA6xIPO{-#OhBQ5`Dq<6U#a`rZapFG>csVimD*ZG++@4VK% z_&G6|nSsN!;xfEu=m4mWL~o4CGD*ELu=+SX%%IV`J&(^a{J3C1r1c*BP#CB>-yjxkZ6pPj#v`Bi2eSB}O0 zY?!+`(3=xVPbVS&8FnX>Uf)pIQd(o8;-zb?p8L&=ZE*IWPB2=wLJ_Rk`)MmbeQdO$f;H^$7p=qwrh<2% z2%M-rn^*7Ha>&uh{inw!lF#}v2)o`NDN~X^B?QmAa20$PQkYOLGe$U)CvBKEJ}e~P z=+Eq##%LtJ8Kvvx=R)uBG=)x!P=n%v&T-@biUqsaawB3j#|{(2AcJ+PjWrHVJ$sJG zIo`i1d3{Zcnz3QlKZc%*5Nn>YhDG2AV%x)h?dJL+i@6Elw_8JW)ruZr*njZt5Cu$; zBCH}*SakiKKFpEA6mw_g*}?j4Gp9k<0=Y5lNPU5eg6ar)yujD#NMi3hQn(*nM*h_} z-y@7~^v?Lh;Yq)=Pfy37tq2@t{WLIKm>!=nvG8W#cJf|^rjR}2NOAMp_>95Q1B!Wn z*KKmmRT)jZwD1i_^=M%W1$R-_djXc{rWUZzt5~1!5MTIsABHUevkWb!Ri@j6Y1okK zzZ-Jx+VshfcouT@Ww$bam0v2)qp!VTiN57(s}(5*#wbi4|J z%A^aed>ep1GVn!UxwDV>?kI!C)UH!)XR8(T{eiG@__8rSxWDHf7X+u1+n#xKLh`|iG6;{r)nhweGH z2eF}2jwVhFcUI-#%vf3ykC0L!y2V;2dvKLIv$j{UAX+DDkT+aGM~U@sADDu1+ETBv ziwl3$q2i*iR3>p07MSMQswnU6LXE^u3B9g1HW+3il^?Hq$(sKrB;gQNlACH*7Aob= z#xo3FkD7-Y?tM><^&2CV)+!JVyGAg{hREVZ?ZEEB6H1{7-xWz3Ve{EHj#F!^*QNI} zlOsA3U0me2XuuFVs5HX&^6anByRf^$q^kYZOxqP(i72NB(58*`Tche@+%O5_Q-Do3 zy_<{epBlgFt~2C^ZS-Lre09uw(Y)Ne!BE*b^Ujd>(15J4C{$T#o@WG<5y35;(+rp9 zLb|&QkG$8h1hthric6YPL|o*Nw&$$HDrheJ29xE)(!3ytV0r3|16x41ws_AvEIE+R zH^(;b0H53U0n@dW11rVKasGOAt1IOIpQMA8Ea`1ETf)(V-TUnsWO8b`&%S+O6BPD| zn^*>*b$~3HYEyWR)j9x#-4{XV1h-zyG}gbdfchzs4^1pg?qJMr0W*- z0cK(giV?r96NkyJzv{||`XM61Ez~W>4K08sfGsjQ0W;w)C5(9lV&D;z<=uSz zJv)v4F5MqkEP#cJsDB{92GAci z;Eo_hTZuXlEJ=hF2%}Nn1%FY+3QrZ$-?~d1+M$`faYw%{2e7v64R!=YIOtpW*y~hY z`&v=^EZ6#2#EpenuBAO%{Vdb{vK`7wX!#vXvR10pmD+Wqb*zh|#?J#|xk$kE&E-j` z;myFaB1f?uXRFcb#rb4%4=3mf0J<)?NVYei=>tXd5v~w|;tboILUJc~$nyqimg3ZW;0?Uj1f}W7hlQlup18)ktVQ=qP+6esb2fwdK4ZKgZ{e0E zz*t0BLR7E;Vd?vQzC+ro_gZS#ZgcSRDoIMDpdgY6+@^8n_X5+&kiH^C@;LE4$ug{I zM$EH!YHams^HJmHoc?qeuWu%b!?usDFD+WtxBo?j4}afF)>TScM@CzQU&ajTNOosZ zMfwH9VZ13tM|9kns|PU}don!gX$e7{1Il+;<9CGjpgK1@v20{?N`Tvx+W57P z^-AiQK(OR5tO7*`*nMR4)o-3>=^p}}%H7hnVP&snNayqCK zkwwpF&KA34L;Y7BJR5(+x*TpfYUla$#KwMN6@bV5?sC&8jZqyhAYs68Yewr8@PMx+ zaiuA~O>GGH{P7y*1o$NObRUEksN$%~#ma_Ff&Zjr@M8H#Q_**e?`|()j9^zbsc98{ z5`w~B)l0v@IO3fWygujR=IzY(uy#M>Jxgh$0bi_? zdsop++4D-cnLieipljNG6|iX7?={JswJV)fpli`{_vgHk8@?yjpfzKz$D79~NC257 zWTM;XRm;Hm7kAh28xBsG)9sTtkZ838s%m|kZ)KBv*3O`b^Iy$Qd^f2nZG1rTkcFraGdY^!%Q_}lj1?ZA~ z@iH96UgG`4)!VfK));RF_-Az00dWw1$rZfy;_c`WjnJEnK?kw;oR@eMMZiv!8lWp+etI;*>^{3exEuHu+Ppj@}8D)>l*r#@DXTqUb=Q zOsK~w7e~hU0jNKig8|GR-*j*Jm$nykkv!)0OVvrGjrSS!%xBDVD%bT7-$|dE zz9zt&XNo9Ubno^pwbqcz>g&Ud3SwI5x5vcjvrIR8p6J{J4eUJP0%-Hi$x~wTHpV8a zOZ1Xz6QObl^As3#Jix*1;B;~j@#d@P-B39WY5UMOq?V4$&6zt=ANPekD%$Gie|(#d z*PH;|A=MVDgLN{D7ZwcxcS1?eTWm=kVukhZnC52jS=c*Nm3F4HDa4;PxEb&7@eUeM z*BjA(YLlRqWt+^fK58isX?mJK(X*v_7+;LUKi@>%j<%z`Db&d*0AJ&PEDd`VK%!WJ z_s8`^>w~pRBjNg-(qhl|5;KI9TlnU^F+WG8J4D~t3*5VZ4+CZgV@hybu@AzR=<%M0 ziqLB#tD0XjeC^UmE{P!VRn(FwI`55(uy4E`cGER+DpZ|RI>MreAbhP)3yKwwFcT>r z{5;V_d;i#d`N`nCCn(`7sA+Q0Urose?nsh5wY&oD{!zz_T{mmQ!%S1z*EgN_T${~E z!J^Xlx{Ze=sXhgzSCbc(eDq?zkcQ%Qv^dK-?%3SmQ!$$fhFQsR`4EvUG2v9oLS!+i zu70@DCZz7(Jwt7 zWa~EVm*sh&!lqHt@C%9SUroJZzUm`;7S75r9X!a(xa}{#&9L`{-F*$!;uojr`H{c) zba@~_xxL)u$wd`k0hFXV7qv#U`U6UGk`(NS@^GU%$ias~6P zc4FjZ)Pec87V~73-8!9DI=5|@e529?PY=FZKh=DEo=Ja%j+>CJy56t3t@t#yT)W%U zXM$>G+du2e89Xa&HGYokj?`+qp-FmlzW>=7^>AEZnk_QD@(B9MIIzAldxdr#^L>uZ zEpz01w^aeqH;yqUmaWWf#%*a*ZH%wbY-gAv#IB>(pONx@C-~;-il&g*^4)*ciOLQPm)_UBo~+KS41XM zmbTSzyIPFU_RtPAlIUf7YU)i1>KH8ACA9qfNz6M-{v!e7J#W!^)+A-UotJZ60=uVR zeIZ(p#CTd=Hv`x>b2`;wL7=Y8eEl}_D&tsVLYK4xaq%PQ$oLs> z-i-ON6q~D(SLd!UyoAri;fk~KX=A>Aj9$eIB@N28q?EC69=5}E8mdVo=RZV0XrW{- zct`keoM;ff?)`9`6*W3uiU{g(SX)vnPd2kQ=h)ma7$aF6AU!fYxac#WC_0;SR@(la z3&iD3I!mPl#eWiR7QXg6F#|{H3QsBm$oPKZ3ZGEzzG}A1tetaiIW^a4rr{-JwW-FR zH@PY2WM|J znEd17Vmb<4Aj*?pSX|V}wN5}hkAe2wJ+raOuJJo5$TTLu&e4@eu&BY&-*gLT>V&X1 z{v$1>t#JAYZzgWZSu~M)Axn{3$J)5-6ucBZ(B*i*}5hdv7M`p z?vGC+O9)wHY+A3->ub{~O~EpPXD|0e4_Gv&rj@h6Q^S6pVtzk+{P6dO`SKR^Qr_&_ z^AUxOgGA5gK2OE)Mh_;GID8%nu5W_hWC;a=iDy@aXhdt&EZ7b}@=$waNK>@rQn~*2j&` zOcVpp9RF3ReR9}_shF|z#B<4$>;!&8k?A{$&(<8)E0ebOu^rDL(|29l_i|yett#c? zH6T*d#Zs5`-QeQz#Kjk)5iRQ(RY1KjpQ<-eKk)`$ksnfi;n(uC29~q3Gqc7e;T~&Q zFekCvD7-fMD%%vTr0!_FUy7o9B>!4_i*X1jgX0&(CdbS{@=$w(OcJA*lAlQbk)(rM z=9_*WQpgGqIdwWQ1LlQ8OCmbx?E?BONNfmV1%?BkeIDT7m6@`2;h`;)K}VvbRa` z!)8X%{sYx6psbrI2)vm!G}mk5p6_)Z@o%c(e*u_{3~{)9Z326|(0Qqv(XLn+f| zd1kVhjPaFne*9N+W#5&LaeJ`e8N+XZXs=^nL?c`tL~c~OlZD)7OTr9FER=7nrtD?` z4c+DClB9X{X&=ETQPix3dP%v`S$yI{!X-vM@^oKG+U-?T6&1(QzIipYVVjnVJv9@4 z(h}Hb{J<$=?O51SR#$oghZQ#A%+J50c}As*zAVK#!a1J8hE2d*!A3RfEkQmem=9QOn^E`qQSJVkkwk z(ftFfqWj{)hU(n@bK*ZAbi8gCF6_owaycGh>*4Wf7bx>rXD_Yjr-05fd}G~F_T2_& zy2}eX3ttng*>#6*oZe-SDSFSY@4eeLr&aS}%w`G*Qa!IhBWQM7l`y8fV=@fH%Sdl{aW4FkwOco;>l_zWVKI-f=>UgYkSlTmIVhc-5 z*_V?+st`NuKUZhi9_R>r#pc~Be6iwN2r$BqnVMzCoCw?_D*Ycci_^K8b|lUxcuSW&wo{78$IlLVAUwP zU|yOgz&cvp%+|-72DkJUtXkP{PPcZ8Xy#(A zC>+(EuXS+2-nE7DD`>Mw9L?$(S)dI6L<%Ux^ETfmAodVR#Esh$vUX~AaY;38<9&Yh zST$VgjeS8|J2!wE;uFgJ$@A*&4QT`|Eq&UZ9PRrb*DKScqH-U*R|9hAYIYtLk|Y{G zVdx%fqznf4duqAt6oR@fjc{xg>+$@h5;fnk*#L&8oJVSIZ_?O`1oY26t;xYRcUli> z{k*Q9K>lt1`bt^3v8?1n2DJn;U!EKL;u22phF_xUxW;Tn~p zvFI9XzIrgg22~55$4cfUGSVF@GD=;HlPeF^lN`{#ZykE4uz&tQ(>BI?{pxaOjBUB| zGF$1Z)tPwOTRhBmCS@uVRUP#dX_A{MSz{EN$vL90QV~{c2p92aE0n?T5+FJRRA_PB z;P30@XWnSBatxRLXsQw{YzBAP+~0I4gTaod?!D_~iJ%u`@G4w=l{M_WQQSmhocUY` zxbpHA{cmx;4P_81=h`_7AY8m8Y34*g4fwG~gw`r?4(eYQNK~TlU-zs_Wr_HLT%4pg zLyfJa*%|pop;y7s7fn@`KFE?3=DQ{?tyB+nOH);GiaiQkn5{F?sHj&h}NDL#*%q%No;A|#hxk*BhLa5r)^vx+|c>Gj~Q zHYkM|7ab~bM6|k7a9^}bZ{m+jEj@> z=Rlzg+?R=b54s6aG!}k@eo0sDw_L8DExQL6xr6}gq^Ln(hqymG1Yw}x?{e%2wY*#A zC!jYZq-V-GX(||$Udv4Npd(5n+RKKswaU4So=j`uSo~IydvMT_@do}9!P3J;UyZ*# zx3abtR9U~YxBF>HXfLecb!+X?w>gw{*_O)sID4mtMO3Rbq+;NU`(x7VQ}|%lw?PzV zadEL#mHX$n9Y)&TTv+vV0>`98#AL)da-ybE;4JDYlV$!5O5~a_iHH8Sx1AumEo7(1 z+%DC%ULw-UlCCW{QRED&^4yb@7NYm-UA=>zASNr6*yuDET&W)o{cgq3@Dl=QlDJlI z=()ytl03e*s2i+$XfJW25un5)eJ5PHZ72iWl%&YXL(^q5m1=_w#t|JTPZyEZIA1n& zA7b&4xW|a8_ER0Qz;Mk+&Gq<1lV-!9e|mTvgnf{O5{L7nt!s74N%nl0&ub^+K+<`Q z148FZ?W(CUuay;O7oCul*b5XCQ+i+ z4P7DFF9tb?Tfs!Lu#tZ`pMpBjJFCqLHWHV zyxs-pEhnMOT$*ug1FA?X#_GF_nQHuu`HJ!YSkVI@|IiR+F7`IkNiUriy8zupy&4^Ce~AR?JFBYg`x zT1I0;lp7#v{x~0bx4r^H%Z5I(gs3Oe4*YU;3_Gsun2NRKnz4R(3Y&CwYVx|8wf|b~ z_9Fr%{Oex2!BOJ%IZCCW{;8gdU>X;bbo>)jpSW}^7FUqP!n504q_hl)+Wu^)S? z_QwlT`)M%CbVWU8%0;_2=#S9qZ`vs=gL1e@zd2RLrV6acZj3Gpz@nRoJ`Io2bB zv-fB{Z)(?oIYjT3hw;fITj<>TK(XB|4}BW(S_}16jyym^Bh4$96O>FG@!`yT0Yyn26FJMQswb;l_bOBRVfCofzk zPZWe|s?AiCyCgKGvQJz^cb-|??RcNLfYXuuCp+>##=35|ZMiJVoO zgqLG;%r>i8<3LM#4?|*6NlU&!+y$#siHpqP->FbYo$3yZ82K@o;x@uWPJtSa>(85;KRO2t}w)?XaW6JhAGRD{wdEN=QJB zh4?&-jn;a!X>;f*8NKtlLVnyJ2f~|)xOXrh_>+AXSidO-w6k1Hrgrd@0fqTy;G|U! zyu)}(!x^>6@RAfeVqx-89$%FQGhd;u)zALjsL6s99V*j6lx|LV zY+0_PCiU*)(#4JA?;4qT)2RKNe3)KTO|r}=tAyo`<}%qNWK&N}et#$cZ8j!lHzkDh z%SLT7gdmSs3HN&E906>N48^b&IZ*JC8eV?M1&s#8`$+W#jZ(1CycWLazuQ|r#CcD* zNEc}I1oy=;1k-+v{VW`(gl`X5dXT{J6*GoE-Ot&iGctVEH_VTqN3i zWnzDLF+Gk|id_vYG(olqhcnjKJP69WR@uVc7gox*LNz2&VUk~&O1x~_WjE+}<>qbq(&A9CMpfVY z2=-bpF~SMo+&HQ2?hTeZ41N*0ukkSf)6sj@u8Rf~=I%-=Uj(#HQ@j2=a@LN>p~dedE2?(@(l&j>27bt*PJP|q zN=z>d7pXwCt{;Gvwx5G0V{Pup_`pN;V>6fvwtarljBu;)h)R6}F=lpj)a zhWx~&PM9&_yJ#eo+?B8%PWl<}_L3yUhL+(#DR!CRiZS$h4gcVGORrZt3`aRfLR1F; z+#KNu*i;Uf)Cr*Dxl%LwH_Y<=NbD5yxP!!L+#|{5uM^nm1aHi9{Y-Qnn+}Tk%K79H z-^&{@7vp+h@a#nyZ`iibt;^kW=$_@pzBw+dnm>!fXfm?onig5)ab+glU)J_o&@N7- z)}Wz7QzJ4dp(G-n)i$iBaZQ|aekE~x#!94~YWF5=@&+HoK%=CW%uV&32Eh6;9`a=? zH@a9@{py(7hZ_+Ao^}x-X=k#6K)H3y_f>D9Pmq$7QsVnVP2e0fnOK%cEs>-LRGmIf4E1Tq6=3XL=wu}N{)jGm zD#lpYOr26()W_5OUT&(W!n8>%S?qKMxLl4n`Zz1qp1 zO!K}Za9{3D_@Uo)PLO1%d*5}p?-NnscVZlIC2H`KB59SU^WcFHc;HJ|J7!dEyWjZi z^!{$Qk*m|$HMF{eh*uUUONq$WX-XVkT45wummo(mVG1TaQv9 zsKznvJ=?45RDqsmS~nH)zKW6psPFa6zUD{l2e@GFGj^NLlOrh%<+wWx3+h%ih{xDX znxo9B$X!36{ApTySB-TKa%l4UwrX0u-`EA$4uHHyy{5eenD@wU90QD(^h{^qD|A?F z`*bY|fTQJ(4Bw?K69gxb8JQUEWyT0`9T))U5%V}FbTwjiA%;>OScsG2X<_s?DE@a- z0eQv67m70^hdt`;tx`9WALd>t+OAc8xSYgtK3+WP2sr~w4X9>Gt9;AM)p#$=lO{St zoCbpGRt(RRpffj8lv0uM?-YM2&3U-?opTY^7yJCP(u0gYUM?2x1(l1o>I^A zUfNzt>50dwb_o+22q0V7Vu|U0w%tWYTdb<5%zO?ymivI&9$A@peFi42LHBH82~4;m~oY zMqg@9Uw&7Z!Th#k%s_XklaJvxX3G@BMgLw6!zP%>7yk4Swp>r^2JML*+@lQKN#$DV zkF9oawl)yIc02ZqcySKOZ=OQltKlJ=#lPAvzBWhr=Jd_{o8qOTE7P4e_m*FJAQSaZ zG&5SI4h1eo+l2Zwvr#(z1{<><+Ruv4x6`rQ$Fw?#!H4L}DpxN{Q}KgNbY$s3$vrkW zBzS0`VG+p-64@M+DSU)5W=^H*bwwGNC}E8XISbXNw46fzsvf&7P7N%%F<*Hnx;7 z`j~tg`r@~RZcY1rMxhRG+DSSTV7p6|=fChDa2Hs2p?DTa!aNxZRDnCGA7PCH{SL|^S2 zx*6d`0p@izj%DPQL?q3Lbz@42mmp~+=@OY3KtCc2B3LMJ5PeLQeUXa=icVF`qY_Ur z8e^n8-M(!>IWMO=QjPQWDCnrusHCLxji)mX9%5$+mj)XduM9U1Q#) z0wM)7=oJ_j({W}b`=Q9%(JlSGA5&Y(X0GUKT;DajpIFKilDI`jEo31qbtXL^5i8hr zA?m>X{K8VkJU~FO49$fLB7&D-C(Ny-4)!VG^o8y;EgsR79x~u&RWsJ^94}lnJ}$8$ zW>cBeQ&FtFPIVej{bs|l@N-wwGOQcZlHhe|-A3*B`oOh_i(N^9d)ym+Auc1zBEAEg zc5--nDNJ>vl}`6`Qz$jW-jHZKD7=lqoRh%NCT>OgKt#ruPNBqYpg`^Y9Yn>^yphU& zS$)SUp1fuCrA-1S6`0D}dv^L`M7;|GSYg}H%}j8hRQ+n_VxB_@ews+Da|L(t&K6b3-?qJK13aC5eN=4-FUAmLj`Hqw@t6&3c0Ot0tcpR`Lr>7dqWZeeV!h z*2rL?DGHQk^HGFgL9A9fsH)s?SADO`z&}U(0t+HVU{d-2L>Xra+XNDx)Hd zV~Xdc_j>8cm2iY=tuCZ#GgsFtNPYt%ewdg0W@idDa6e>kYhiTwP`c{0q$yVd)n#LZ7drWW!=M~6G~$g_1; zY$qx85LdZoDo9=lKtX`P37|ZK_9pnb0KmW}ZGdIso%f3& zG`qQ%RyXZjYK)Jsa}qJ)HfkZiJZHWeF1I3#N%uZ#*kXGdCX)1l?NQ{D5A=I3K&Rl% zTy;`K)z{WIR}9fZw(vnB7F&b6*yTf?Bc!rrxLRl1U3rhnA!0k@82x;H2BTFqcfDxJ z@2kes1tcIm%;>jo-L@_8)5i)u2&0epBVIjx|}F@9tV^_9zf;wYy?+ z;ASLDvSeS*e=mmP`^drQMOrrGE#V5IYqZy9N2L!FeC4Ma)yR7i|K)A^-FW>GJn~pB z$;nw|Jfmzha%lpY_06>}z-Yc<$p%$OrStJ|{`)yd*y+n|)oMCEo4`b{z7Nf9fdfQFTivNv+$XtQK z!RayG8yDRp3jO0}PxEoGF7TIR_CR(9_CyE#YDBVSQWWO4)a3huZ`GXVa@; zO%H6j1&TQ?BzN1Zg-BCy-<=pcjW3hU$II8`NrXpC)%ui?RHvquJyz-%zmrxOr-`Z7fmSdZnn9HtT$L z2E^7@b3!N{w{Gqbm~GapDIiBu08PdAB`r}h$HFuwa;1g^@T0G%`o@yjT(#n4Dz|^B zlSo|HsCC~2#hs%r`Q*4*RbfHB?Evn6V|M;NHZIApVe0ns%2X%Dh3$Q(o1@uA*)%=z z?GH9>=w%zpXe9%<8Yj;1S?A7U8&-A-@?c(Ubqwn>1NblGdKw~iC*WrC<9Sdf6$pM8c zN6rlTa&nHqwiC2ghkJElvZxdLvXs-tR9e{V{bOw@n;W6JsyG>Lpz##Q8xkKtB8~5drgR{7xq0>*Z z6%Jc}*SgXwNlo!rDN_^tHWc0_E4a0e$^Wd#gaqc~uB= z4TON|Rboj2 z%f?;#k&t#Nr8mu1qpz<-x%m_n9jBcd9+x=r%yjgO>dk3%Ex}N@^W*ERg9G_)5kF0T zM1@VrCj%}J;>pH|tCOf9Xmx4l8mW7CUsy4>kSnu=jGx7HrXf>RbFVV1ZHfx#VI-!0m2-Ph*|dZNdSegyTzv$bVYhUXAW;*CbD6D2pa~| zJ|o&i$WyKHO2nr;-|-) zcvb3O6J7K-pc9I>Rcnn9A@s;(HkfNzY%28qh#h@$zF#Fh)?4!&MlXSH{#FB;(YBbb z)vSnEQp)t!T5eJ>cvp2}7*O4HXB2P(4`8o>?TSq8ih#CItuO>7*dx@vCZy#oUo+QF z(Ii?NR(A7p^L8tZp3!nZ-;P7`yOQ)^HOkc#5RTG&FPhhK>cM|*OZ4*#gMCVdGv64h zep~61!SWt9jl*Low68MMro*AgCLgogU1A-esK7Z#@1vpU+$8Sda9M`0bCq8%tAk~k ziw7}TQ`b;KhlC}_esp!(+1%Vn<^?^a5%-i{4qG+hmR6dgS8nyl^fF*6s|c`kQJPjn z0E|3vcAI7Jd#$Q@ol<`tD0ZF>v$FW^2fYHS7v_97vn(|Q*V_ZQu^`q_lostmZkvkG zI8L^b!CgZuT*C>BZ6p~5S^S=cHaYDb05)b+N<*$7p|BoN|r)zNxjG9pR*GC_?B=_x0SW3a}?2@ZyyF0PdnT2 zo&-36MLP6-*(?X_)l-uxbu)AkuM#q{h(W=%75-WWuC8WjYH{CVzb3X zCVS8KSOqPaAQt+E9s}Db)06Y##68O&iyk3y^kz1ZP{;2|3dC6MQsL?WG2s4v0A*CH zeS<AHLRR1?5OXpuvms)nJIXR5Q;6(txiS-}N|bCtKrHM=Omnd^SY0Al~Qg zKP7!Uq>YqR3PeMNWmSs5nXUErP4JH*yEWY5^lzl!=-3@$PmCGh^EWk>J`hLv!i3O- zG@8S-z)r&xRTHn3FF4VxmQT-wp%PJtM^D`;50c9zy9}2f`2f>SGc_q6yNb6*WG3;f zly7SMRAKkvEfe~YhCELAOehR4ambhW!`s+$9@?+E@%{2+<>5TRI16;~7V79_IMx_L zx{dNmFA;=Ur_=}gE0+>;C4VB)kjI>Vi<1^YKzB){A&+8PhK`Swa$6>)As-j%@nf1o zE(WpfdqRF`vcCCs#x;PG_haIDh1l9md9p(`CI4wmZLP0($@#^jVW-DgfJgVl5$cWS zdk-gznl)kkj4QU|%h7unM8ce*3`-je|H%1^bfNUbk=EVpv(XEB1kFBA>sd1eE$ouz znY6PD3bCr))YCC9g6p%6p^BGc^FwbW)8|3rK;CgoPf-^>wXPnu@vn$brA*hVr>2Ov z=-UzD&QOWy(}7)*F_WIpkJqGyR+eE-YZ*?%q+CHY<4pzLs&=aQ4}t5w(GG7(s2Xp6 zz_#`96F05Z?$Vp4WD;MG-RF+4KZJP1V=DW2$@vhj)vjm8F?q<~Mc%5!B@*5EkfwuD z&JYPK`-8YhD0oCKd{y&;9Xz&9Rbpb@<+#Nc#3tsxldU6?-rtk9A}$_bbQEPf9Pc&M zW7b`}!p?W|yJMbZ9<4N(tO~ z%`&9dU8gk4&_%jIe@fL2c5oVAn4Stvi^pWo3AVx>?RvQ{D?nYr?!j))S|uuScB zoicTpW@1%mGI>uU@|`-kmCa+t zJeP>>dN>egfA$%z2Kf$cqKyRh6*RU{Z{hnSK`u-(o@0z0uNi5tZfr78umpMzpTtoJ z;|3}9^?mLkLI?Rb>m`a0r(CE$5;l44i_GLDwz)19r08F2ac#mes*m7bVV|&R97CUe zr5S}2?`x7D;6~Kg+_);Ix#+z&I%mZcJ72-a6@Ld*wIrY1+VjmS0xn4bBi9XbkamhW z=V>jF`gF6{(UVu1%aCO(cx zRF8Ipqn%LpBX(NnK;Sk$g(o%dIM(c}_k*0~-`7=mk?CpAvqyLmp)K=8@}*=>?N`vS zYlG`w4~DpVwjRQ@iWU=Iy;vsyK+G|S%D)&Iwn2BrepW{>^>vX1(d1d&d5Gb4ZCua} zGUPvBfB*lfj^9iD`H!8~3i7_hSR#S%jL&+%k5GM)!c+*j#iJ54lOTXmlK4_XM`!$@ z3X9L(iA*?sPF-@-RYR>mJ@e2avoOouq)$P!XvJ*$&>egxlvQ`o0@N)6+W{#Y8V*Ja z-)%C;95$bbBBig4JvDY;uegkh?s$yPw_l6WMq`17UtH4?3vr2PSn@m`NuAJ!NOh54 zjQS9Ah}|E8k<>BPx9?+niA(9;!R6M8cl-YQD(NV8UC^?Fm2mrl0qc^3qx>^0jz)Iq z?dAG%bttg8-->RZ<+DUCGJ42a~=Al)6(-QC@=>23t1 z1%YAc8bU%O1xX1h>F$>1@;moF=boeMul>CHtM#q*JTrS{ulGHQXju~Bhzu$~`8W#K zir!~YaDC-Es+ZYsa`!fFbVM=$Sp4Nqi+HmGCjao8h1HlbE96>;hy&-ye>s^#Ukt;7@5 zA7A({7yD&eJ8+lYPvP9+g!fQv4_r^~S(83uO6mHmiOk(F;__NplfIDo2t*g)7qTL< zJ&*~-{xD_`y~l{7!122iD(hGGMM_Ic7k%e?^&8)uQ@a~n3eRRO$=yOOz2-{p1zmM1G;1yfrnwF? zNQpP$k94q1q{b6Is`WljEtfnb_Ekm-EWYkaOl&BRXr6%$90i|B!; z_{+Uauhdzt2vBho|1ZG`X)Bq*^OXaIy6%-}T7H3uB7J3bkBY-);8t*Wo*d&_%TLb7 z!||HW=DP9xHvFqNbOPj^@)J(kq&y(}8$!7gV(nZ$4nC+XbO`Ou5HZ%gp#sqfQ%*DI(RvL#7idQm4GvxiwvZo88!iV^WWos0ylHLxhBLg0It z1kc>Q=GqIYWvEXp0H29VGGIPd#5`-l^kUd84(1lxS+d~v7ugw#;1`hfDDXKYd`L6>{%f zf_6y4riH_S+zh4mSocXb70AkHH0DP>cM4zB_Rzpkn}x`&W3{W+E7T4}3pG+MsbA89 z;sy|*_f)f&axKhEq(&Al_12l?T1TCp}cNZGnZ1*X-4 z&za)x-CSIPYic}|_~pgX3gJovbHp#*7jGGuH7Dc%F1xZ)PJ9BWZ7uZcP`0;+N%H4H z)q)cFnjw4J(wN+WZxbyZX3ujm4KPc* z_~!ab?pEBV;1s`OCfZp*3Gu&AFp=_`RCHpk1-csHe{kOgv-HMPv6vD{Rd=HqIHhu2pSJmI&8`CrC2;Eoaz(w}b+2K}1S$wZ z)nJWT8(DYgm!uatgjR=f2!un=8c<^wZMG z+}zRALA(!dQ9e4T^}NU=DZicK0|{%?%y1pk;BHW>S6Nc6RzTrgi%czS{T(JRdYxVy zOl~|j7=AYIeavF$a)Y|9E4@O#%|mX_HKt&F+mkL37kYsY6!pYOUWIT7yLsOgW;$6L3Ar#VE=m*&Qvr7a zlge^8o_EK)X%u4!{Ybo8a1aEfAW=esE+fOOM30rnuv^}i&c1!2RD(#z?a;yWg-08RH2usc6{Z17?{-goUWDyRKA5c__ za|MC=3(%I+9btW_EL}%CdGF9>(GoNG*w>^?ci|SyF?6Ime#63p`9M4HQi%EDu>Tx7wfA|l$+i8} zMF9E!LJIO%IyM|15Y`r1i~H!ZidQPsWpv>O@-K`THwgmt2(jK=esX`5t@W4LOd(&q z-XV!H@aU?;A97+xa;qauPVCu z$|0JXY3}oG@IBJ}0xU5wP2*Lb!C>a$udU$f2(pqo)+UUp-S3Rriqp8tyeHos8g2Y6 ze>Mu#!^)Vsf{dg>448pqx*LI+Vlfg`3@JCpMR2){B%?Ve>rEvu&Rg5%2NqJ|9ly&x z(ACCt)jXM~7fbv!g@6)dFi|+-@i_IRKvfR5bGNY(mIs#Yo6wwQe7%Oet-=Nbb}*;i`$T5kKtIyu z2LGfK&KzSzn~`(Q*3vnK%{M_F$9LMKih;bF^~0wl8)X-Qq8(~cna)+|Xl(2!&7hO= zp6a=|QplWyLaDt!?rH&*Rkg~j@vW3{2=%&r_-JXY$2qnSZ&n0}*8w-y@s)kCRGRJ5 z_Cx5e+HTGdy4Zk=!!e~xMAs@JC0ue)zWZgsLCwThugQ$n#Il=q=xY~iuY6Ghu!M_qqxK+oJ)1$ zeW?G8+OdZ^sFJ~+`Fmg94H_gs0Pk4YEn?4z5cQhiA_2I3kfz|51p)>6VY<{a}GgdQ;JHpArvz*6;4;Wu+ zJrm^!1K33N1Cc`ART(8lsMl8P_O7=3X~Z)wC6BLRtMk0HgNtxF%sJWX0^z7_Y|ipk zSF3I(Fn|84nL7bS$yfQdL>s-^EC%(IY>q7g|uBDZgZvo>fnl zfE1XVAu50>n)I* zE6$=^NklNCF z?|?}}1V0|7Z0?NsNbDX~ghhM7juipF*VCgDjB9s*U{sQh%F>N;TvkXvWAF@v>Ga?=fKZ@0c__fhT^idv7vVn5Q z8`1wAH)egDu>ssp@Tsg0C1)}Xd!Q%}i}@zyw?0I>Z@v<{r6S=$)XDd*r1&6WpoWHl za!BOtnWcVR)HV`mHt3`5bY7$|`{~y>LV;{}J?T%}+p-I-sUa5HS5ABLn zHX;x4N_Th&UeywgO$Xl1y$H^|NfcC`$SWiPHxHp7{z~tRVqVu^0flfS@T`k z$>5u)+cn=CXkz+q%j^aEp~i9>&>IkW%kmqYa9x13SEnVi*~u9TIZJ?8AN0XRyPxdl zl4HTFlWYs@MZqIzi#AGe&EYuR;s-@_ugFQvUQu$>?iA>0K@bX*@v)5WzSX3l$Vqv2 z*ljEwHIH^08np5Z^$5*{BhsV$h*sCw@_jbkdq>ACeo9#tU=A|;n5PR!!x2CJd|ZBm zdx%V%lh5D{uhpGxgwrOU{t0ykNpmIvG{!y2SoFjt5MCTX*^JpNo`Ze*PNpvqWe=1^ z;PmmrL*kw=$+0A{UMia!6?olHfR|KYlU<~Ub}z4*vKw49Y=>)~{h^4GA@XfK3sD8{ zTHNPt9lVfrFVj&mJd9M_Kt@Aw&~$sP)_l4ZlV!x%coNXVgS+)V~0e)E~;C} z;l4e*2&%E+6<{X_P*#QOu@B-rh+-v);JoW(78bwXPabdYUaEh%0*N?s1zBo{TwaS_ zRUrEiI#*y(QbA_?_ZP6sgj@kpV)IO{e$cGwmwSQ5TGm z?$&G5@qx7NN3ft3%VPkK-qMk<7oQKU$r$Mru}F|RDHQqQ2gI_LC95e#D<$79A%p_e zWF>Xj!OD#60*tDgz#RTeJph*q$0go7MIeN9jC?#Rse>IB0~~dMTd0GQit#yh6(c?d zzshSoJmj8))bQhr-@IQgVNjkZ5FBCnN*&7a+!E?TuwWmh)yW*T%r=Z0^{99n-b&<#pwk#aQD?V#@16C$$+HD%3N&v@#k*-37ejvW5&ez z&-sa8Fb6xUNT9ua*b>&z$eEqp=x=uBkj?FAt-qwwG_9?t)^6!x(aQjBt7w=>f{YrZ zq^4yi=ao#@N(76*H0peysyiB-X{vsH7~QlKFa6O_48y4h8nvYg3|XWI<+Gli!jWX% zZ*G+11{fme}SX`}<9MHT2=r7&LO0@M@L za?^RTD7|)q2AL}bxdO#to(gv#b(LEIF-^{rp{KL8*mo*wz?G*(1@dT11VYWpFc zl1a@v(T8{qa>--%ksUszf>;;2E#9+T!xycyJI?+1is8Rlb!z(}{Rh`64_$h`u zuCOA7n60hxcqy!mVxqKP6h$$OFTaQAqTxG3z-i5SH1bs?>9MriAK6*+9p8_k*PEqP z0EQP%ULT1t#OA$n|j*x=hqavjJ|l6T!(y#$ENZ2>XwP#KY+79IIaOm<@{ zn+#=Hrq&wA^0HH^ahhmn3Y9L^wD`~KX)iu2hrIC#^d)2V=|$MloiBMKJe zD(fWE%&w?E={Dx-&Tm!h5XE@v&dU!9SU@2qx+2^fWS^woGTPpf%2#yqJo|yb33SU= zr1#p7sx^V+$=`_JyCr6C^bK~GR}h5$)IUgb!)g4etxZQSeo5LD1Dz?8BOuVSS-TRL z3xuB+>MuEQhfd&F_0djI8n1gI&Jb`rePdjKOeHxnI*w3e zqsqwvsYPy8C+#FzyPcQ2uMqz2^W3F6^1y|@D`uJET~q^NIgLXmT?mWb0PudDfL7kt zH zN<^6f>A_fDT;3i_YEt`h=pn-cZJ}!~afau) zep2e(1n=bR2`d!tk>VJ9!A>nsea(`O?V89aH+& z-3&1!+v~NwK4OV~2Ei|zF^8&Vqc)H!IJ~zJcE9Q275xkcoKfl(tkB5is z^C`5U$s)a^DY>|4Oam}yaNkJQ&scoF*M$}n+Yr3Bvw-CqUb5ij%DNGwh#hi&%&z~O zdD^Eg%6b6Z$9!(5v}`v=R(_SxKzH;2m9JEtcgFsZOvN1;-x*`!FpqBCWE5UaZLF?P z4eHg5e}t+GS(WY_3X(-QXDo^R*ozx4Wu|dQHC{$9@#19}Wf`DK^agR|rG-Ki`?E_4 zv)Y-S9!v@6*4DKdmJKNNkk8Bi*yrPK^)Emi=oPV3s_zvaCFOof%!s_`K`y@c|0ou34ufrV1Xo6 zknh4J?v>6}8$9szds+yNqaBe){w?Zn{u+q%%F;5=`if5$g^l0%4cRl>40hi{e=1AYZS=MQEgrz~Ma5Dyt15L?xvnS}<*h+@ zm6Dg{?>y(~8peah2F!yu2Z>=BVO!pcXtHRvwj(wV^48dzXsn`!r&a64VWPLSmn1x@ zVfjMd&le*`zsarAA`jS{MkkG;2Iq;UM)S*?e{n?{JRKx)$-y}QcyX{VN65#>9}8(d zUURXMG^YZDoXXaoovx)KUs5R3w79nmDgtdj$xh;vC|tzLd#L(!e-4p@>Kl6pesZST z8b`auOwN@M0AV!N^()W^k?u{u zz%eHOnPltx14-4}!5pJYv_?`}f?IVzkh$881}B| zlk?c;$@$0IEytJWiIR7O6<^tn{R&IRK4!-vnJD7FF{)&o%-)TLlGCIPdYFo@WLgoi+yJb5Q=3-U5bd3<&o8+^McyW#4tI67aJcqTUNGh){bj`AJ5V$hTlLzS4 zuiZD{X1sLR0wmDadycA;oB%0JP+v9OOawM?1rXR+^2_h_YoY$5*{sGaJ;E4H_{t3 zTHjOFr^bgED(WlX5$O$HwrK9-Y0eMqQ5ebH-Pu%(!#yAYxMtchIL>E<>R^gK0((Hb zK$PiV{#tFK@u$(?!+hKGy7ID`qf7(o-Uut)6SQb?(>19V0e5#jMoNOch9-3TM}fm+ zDg*l~LS4(T=_4?oU%si&aBZ};T0Wb6y^J<)$dE6cQ4H5?* zs{|fGwAo#k#<*jD@;)4{RUgbxnf?NVJqB5->jRvQpZ>xBePC5h|DlTI4-dji1dL~XtABmvbzt4xxIY*0y^mD75z}z4QEhvdrWp9}A$PX@ z&5)4~C9Uw3xowV0oL@MGq+Q|sImgTmc`D)O`8K?HtG=h z^2^OeoVRfWa5<~oaY66ntlU~}wmfMUos)<$w2R8l`#AcNX6Sw`OoYz#jW!&ay}AjG zrf4dv9VJ$Tx;EM@wwejqCO@>x#yf>vYsGyb_q7Hu{FkXk%@u{x@FzwDG`ZQ0=b7YA@c)fA#CLjJt#BkPA25E1FR@Lx~rx*OR^u$-% zlb2;ErS^VKPfawcSevVtT%Hu@&I!DgyCq_jyIn6Oon^kYYZa@-_V@-QFV_fezQVwC zK#Pww_3JKW+kEvRA#sev*C4FKyhCC;gJ#^=I%j&S%He$^^4?tu16{YIEx|Uzr%7ou zoO~nlGs(lEf|c-j=sJ|j3QoK+yw7YBha}U~?w7P)Yb%o{q`ehDV|(Rrcsi!!mrE?g1)k{0h{zD+6GLn17%W(*wcV@JzLp`wIO+{E^cI?LWc`_|g29WEs0QX+ zd$c!vf->8MZIFLv=2}mPuR7-8ka16n(5`+SJ~-Mf7aIUE0Of4O55ik1o5uvTud1 z)SKc4Xd`Uo@h*EH^zBsRC~;*RP>;}}Z%GU|5L z-1zdak&jy8O;DLht%zdH_{Eg0`%4X)+1rRml_*9GqUOI2dbB2so%nmwOm%VXlPaCq z-{E-%BmY!d2NPTB^_8klMLX|1Rw#rWh0!Onb)69b;tb`-3st5NsR!YyG}CyoSl^c$ zZ^iG>*=48YDTI-6?-YuBaW-)hPIN~+KxNaT)t5lrR+mzjhtNEvwdL^YZf7pG;RShj z7>U|$L*GMK)uK0fAraf2{f93Twm$Zsn(IiVlSUc7q%EaVUK1ynG+(ox*#`o3%dbA= zdi@B-Z9nW+@|)Dte7pELmGS{grau2yYH%BFy?vu5D!}oiN&)_7P&!hg{_6tF!^8E& zru_%T$Nt2Y{U`RsMgIrJ3ugPvmzSO6iM0H`eR3 zJo6XE1Ab!t{=<%k^X~$Ac%P`(|84h_|7q|(sTutT_%DnP4E}S*Y#dK|D}UIrar|A( z6ZRz4@UJNU?kXDxH`{+E{^#x!2Jrn^HQUpQ{AI`q{ztaupYi_zIoWvsO2WzUq$u#G z9oLiBpBOjS|6;&@2IOUbqHX_Y{C^TIF#BHtx!Ab>Dv*nv{cnu(?}>2n{I~Bv{bzp? zqxrK7>>N+>4u2H$BrEmTlCX2}{v#gqUqwGf`)gBkaBzYDoE!%yFBkCV26#ji5hU&G{sH^ye}?DJF3KpD*>lTg}P+M{Azaaq>RNHKiK# RNTPx{xKU|oC6%R6{|9gRMcx1a delta 27714 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 YL%8^O69)PvL7e;?AbNU9B`MJV0kME^B>(^b diff --git a/doc/zsdoc/pdf/rpm2cpio.zsh.pdf b/doc/zsdoc/pdf/rpm2cpio.zsh.pdf index ef93b3731c10a1ac33c66a091a0ff264ccbe6ad7..d2443d74ff95755aa6f580d8edb1b16f987d4b83 100644 GIT binary patch delta 15474 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 diff --git a/doc/zsdoc/pdf/zinit-additional.zsh.pdf b/doc/zsdoc/pdf/zinit-additional.zsh.pdf index 7589771d19a21333580b365664890e0c09d9ef37..2c2e7e75e8b698002d151886e3084205c52c1610 100644 GIT binary patch literal 67021 zcmeFa2_ThQ*En8M%2Y{6;S`nGnU8~%Au?8m2114-^Gt|DNhKAM5=s&hl8_-qrVMFT zDKg8DS!Tceobw!xn|j^vz4v?n-~Yb1dz`cOv!DH}z4qQ~uW7Gm^BzSdF_bu#aq~3z zj}e7HBJ5497-eJ-5;~SHHY9|gr=^{xi8vWz4d{SnZf@ez_U0s|^&F-m9}+X4WEq(Hk}U2H7vpsP@Kz-6eey0Hn# z#u;ddVoEK{B&6mbZ6D=tD%r5pm*Z$=O~jIN3Y=@}j&AiDdT6t2$1Ww!ge6=j8Is zYYO&uE&xF=WE2dwNY3`IPE?A6>13)+azW@zfawP2D#_giA)#Um23j8eR)D`%$n={X z2|NuwU=reyl9F?%D4|Glvos}XDa#{Fof(nhU>?FBXHz>ynyU)hbFOMDXfiU&>oB6Q zcyR)OfJ1;k;z%48p<~7aMg7;q1P z7BMs#F)Rs-!kS@mf5#({NO4I?JcSl0fH4Xwj{9@eK%&jiNIVLSglL1u;Y|Uhpx+n* z8qg2)=Wjq8JO+&APn6P^!C_<(Xh2025r>e$5dr1QaY!5nO9U4T5IU-V@rdEk1aaJa zZcVEh&zd{23`KO5m}kV1=UyXs{`P1qaZ=;RygOG++@(fExNQX0R|?D2zA} z$Yp<|)eKs+r~o=a2>vaIV2NPtkbeRZa{_X~TxcO%Gld>lNw8?~3q%9r-==^a0~zA) zKm|_}C(JXAsY3%MESRnYJP=&|o+*pPVa18RnX*8>LWB7Lts^Y-3!q^FCNCaLToTw3 zVTp>c@XcZ&!vu3)AkNGy7hnPZ$AQtn1D*?Q*fKz(B4SPd9;pBW<_r!E3ssPSiIOBU z8XS#Kghpb~V2WS~e}^E6!Jx!($a$nXAeKmip~0Y$K!intNeT(PIJ6`vA)-kDClcNq zl>anTpbRW zrows6PiYlnVGVGrE>C{Z3Nf?fcZgEQk;N- zb`c=m0F9pl0v3tEPz(Z;0vrZ#25=QGPDDXl2n>Rbpr9Ru0^)GuM6xje1~H(U(EdSf z3WtKO!w;eWri>IUD3A>!us7f!LjVN^Dn7sv2e$)5+K$0j~v8JllV2u%g z=!=Cco6r@q363n+Qsh$d6(YG6Ga%Q(wmu+#F5D0XS#*FE41)ny|2bcf#Rr(1XlFhd zq6j87Wa|gCXlBjN6!Y>d47GrQnn$RDj}@c70kE?JtGBj`v8@9Np=iG_>j`8S12Y|k z1-lz&R?;L=tS3PHU!c)%FEH2q>|vbSC$j4iatS#DR~4}G!IXfTCKpg|pm-_u z1&xf1?MyA~oy1)19fT0%t{?=B%t$WAmNw2pKvaPm0VU?Hc4Sv1R7Q4Nf-*bc=>#C; z7=@}(C}Lz{Z{`6?$%6@%df3@JI9o#Zk)3Ct$kWo)hGgsno?_y9#K?){VDIE2gg}$= zC10joaCR{!m(SitEr(DAmLSSwJuNB4u68!|#%ACG^~s)=&Lk(ubq30)9rLtwv2`$V zb~SN!F`~He0A8~fk2)DU7`ZqZn_AO$7(*T;TGuDJ&kGzTXd+Xo4ox87#r?z717-*y z|ISXmh0Hn}b$u*g*1>LOnpsD2W6mxQ^3eR;A7G$`Tmy5b9o2_BcZT9oC}4s5LseS$ z=KNj9VolAFCL*>DHm=SnTRSl)(h*l1W2XgCfIKz9a$Eof$Ro@sK|=uwuc4s;l^xIR z78XtXnF3U1GPf!Qc#CkjKTrUA@XvI`pm5@N;@qlaw)XpZLco!5lEm40BBlc34=ha= zLM%MYc@{t{u+>3)gN9gm@(QQnrsSpibGJ~yrcd}|w`jvAU>CO}o`C#IUECDOfItMc zd#d@7yoXSIx-%xB`Hg@7YX%_#0T^t^qCCa92g5Yx4!8t12mz<3IEF0EQ=E6e#0%X& zV-SKI=U}*?`^nBd0vG^bI;3�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 diff --git a/doc/zsdoc/pdf/zinit-autoload.zsh.pdf b/doc/zsdoc/pdf/zinit-autoload.zsh.pdf index 827569687d19f4885d257221e36384a97da1a1e8..cd018b397b703d4d3c6ee7124ace632f544eb6cf 100644 GIT binary patch literal 385118 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%0AYS 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 (Wm02*w&PM5UyQ&qh{l-jLGRFOnClok| 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 literal 397449 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

)hN!3op{mIwZWZ8FR}cgHrH*yA^=?%S4}amB-r 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 diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh deleted file mode 100755 index a6d75a6b9..000000000 --- a/scripts/docker-build.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash - -build() { - cd "$( - cd "$(dirname "$0")" > /dev/null 2>&1 - pwd -P - )" || exit 9 - - local image_name="${1:-zinit}" - local tag="${2:-latest}" - local zsh_version="${3}" - shift 3 - - local dockerfile="../docker/Dockerfile" - - if [[ -n $zsh_version ]]; then - tag="zsh${zsh_version}-${tag}" - fi - - echo -e "\e[34mBuilding image: ${image_name}\e[0m" >&2 - - local -a args - [[ -n $NO_CACHE ]] && args+=(--no-cache "$@") - - if docker build \ - --build-arg "PUSERNAME=$(id -u -n)" \ - --build-arg "PUID=$(id -u)" \ - --build-arg "PGID=$(id -g)" \ - --build-arg "TERM=${TERM:-xterm-256color}" \ - --build-arg "ZINIT_ZSH_VERSION=${zsh_version}" \ - --file "$dockerfile" \ - --tag "${image_name}:${tag}" \ - "${args[@]}" \ - "$(realpath ..)"; then - { - echo -e "\e[34mTo use this image for zunit tests run: \e[0m" - echo -e "\e[34mexport CONTAINER_IMAGE=\"${image_name}\" CONTAINER_TAG=\"${tag}\"\e[0m" - echo -e "\e[34mzunit run --verbose\e[0m" - } >&2 - else - echo -e "\e[31m❌ Container failed to build.\e[0m" >&2 - return 1 - fi -} - -if [[ ${BASH_SOURCE[0]} == "${0}" ]]; then - BUILD_ZSH_VERSION="${BUILD_ZSH_VERSION:-}" - CONTAINER_IMAGE="${CONTAINER_IMAGE:-ghcr.io/zdharma-continuum/zinit}" - CONTAINER_TAG="${CONTAINER_TAG:-latest}" - NO_CACHE="${NO_CACHE:-}" - - while [[ -n $* ]]; do - case "$1" in - --image | -i) - CONTAINER_IMAGE="$2" - shift 2 - ;; - --no-cache | -N) - NO_CACHE=1 - shift - ;; - --zsh-version | -zv | --zv) - BUILD_ZSH_VERSION="${2}" - shift 2 - ;; - *) - break - ;; - esac - done - - build "${CONTAINER_IMAGE}" "${CONTAINER_TAG}" "${BUILD_ZSH_VERSION}" "$@" -fi - -# Local Variables: -# mode: Shell-Script -# sh-indentation: 2 -# indent-tabs-mode: nil -# sh-basic-offset: 2 -# End: -# vim: ft=bash sw=2 ts=2 et diff --git a/scripts/docker-run.sh b/scripts/docker-run.sh deleted file mode 100755 index 3b6f4fb72..000000000 --- a/scripts/docker-run.sh +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env bash - -parent_process() { - local ppid pcmd - ppid="$(ps -o ppid= -p "$$" | awk '{ print $1 }')" - - if [[ -z $ppid ]]; then - echo "Failed to determine parent process" >&2 - return 1 - fi - - if pcmd="$(ps -o cmd= -p "$ppid")"; then - echo "$pcmd" - return - fi - return 1 -} - -running_interactively() { - if [[ -n $CI ]]; then - return 1 - fi - - if ! [[ -t 1 ]]; then - # return false if running non-interactively, unless run with zunit - parent_process | grep -q zunit - fi -} - -create_init_config_file() { - local tempfile - - if [[ -z $* ]]; then - return 1 - fi - - tempfile="$(mktemp)" - echo "$*" > "$tempfile" - # DIRTYFIX perms... - chmod 666 "$tempfile" - echo "$tempfile" -} - -run() { - local image="${CONTAINER_IMAGE:-ghcr.io/zdharma-continuum/zinit}" - local tag="${CONTAINER_TAG:-latest}" - local init_config="$1" - shift - - local -a args=(--rm) - - local cruntime=docker - local sudo_cmd - if [[ -z $CI ]] && command -v podman > /dev/null 2>&1; then - cruntime=podman - # rootless containers are a PITA - # https://www.tutorialworks.com/podman-rootless-volumes/ - sudo_cmd=sudo - fi - - if running_interactively; then - args+=(--tty=true --interactive=true) - fi - - if [[ -n $init_config ]]; then - if [[ -r $init_config ]]; then - args+=(--volume "${init_config}:/init.zsh") - else - echo "❌ Init config file is not readable" >&2 - return 1 - fi - fi - - if [[ -n $CONTAINER_WORKDIR ]]; then - args+=(--workdir "$CONTAINER_WORKDIR") - fi - - # Inherit TERM - if [[ -n $TERM ]]; then - args+=(--env "TERM=${TERM}") - fi - - if [[ -n ${CONTAINER_ENV[*]} ]]; then - local e - for e in "${CONTAINER_ENV[@]}"; do - args+=(--env "${e}") - done - fi - - if [[ -n ${CONTAINER_VOLUMES[*]} ]]; then - local vol - for vol in "${CONTAINER_VOLUMES[@]}"; do - # shellcheck disable=2076 - if [[ ! " ${args[*]} " =~ " --volume ${vol} " ]]; then - args+=(--volume "${vol}") - fi - done - fi - - local -a cmd=("$@") - - if [[ -n $WRAP_CMD ]]; then - local zsh_opts="ilsc" - [[ -n $ZSH_DEBUG ]] && zsh_opts="x${zsh_opts}" - cmd=(zsh "-${zsh_opts}" "${cmd[*]}") - fi - - if [[ -n $DEBUG ]]; then - { - # The @Q below is necessary to keep the quotes intact - # https://stackoverflow.com/a/12985353/1872036 - echo -e "🚀 \e[35mRunning command" - echo -e "\$ ${cruntime} run ${args[*]} ${image}:${tag} ${cmd[*]@Q}\e[0m" - } >&2 - fi - - ${sudo_cmd} "${cruntime}" run "${args[@]}" "${image}:${tag}" "${cmd[@]}" -} - -if [[ ${BASH_SOURCE[0]} == "${0}" ]]; then - CONTAINER_ENV=() - CONTAINER_IMAGE="${CONTAINER_IMAGE:-ghcr.io/zdharma-continuum/zinit}" - CONTAINER_TAG="${CONTAINER_TAG:-latest}" - CONTAINER_VOLUMES=() - CONTAINER_WORKDIR="${CONTAINER_WORKDIR:-}" - DEBUG="${DEBUG:-}" - INIT_CONFIG_VAL="${INIT_CONFIG_VAL:-}" - PRESET="${PRESET:-}" - WRAP_CMD="${WRAP_CMD:-}" - ZSH_DEBUG="${ZSH_DEBUG:-}" - - while [[ -n $* ]]; do - case "$1" in - # Fetch init config from clipboard (Linux only) - --xsel | -b) - INIT_CONFIG_VAL="$(xsel -b)" - shift - ;; - -c | --config | --init-config | --init) - INIT_CONFIG_VAL="$2" - shift 2 - ;; - -f | --config-file | --init-config-file | --file) - if ! [[ -r $2 ]]; then - echo "Unable to read from file: $2" >&2 - exit 2 - fi - INIT_CONFIG_VAL="$(cat "$2")" - shift 2 - ;; - -d | --debug) - DEBUG=1 - shift - ;; - -D | --dev | --devel) - DEVEL=1 - shift - ;; - --docs) - PRESET=docs - shift - ;; - -i | --image) - CONTAINER_IMAGE="$2" - shift 2 - ;; - -t | --tag) - CONTAINER_TAG="$2" - shift 2 - ;; - # Additional container env vars - -e | --env | --environment) - CONTAINER_ENV+=("$2") - shift 2 - ;; - # Additional container volumes - -v | --volume) - CONTAINER_VOLUMES+=("$2") - shift 2 - ;; - # Whether to wrap the command in zsh -silc - -w | --wrap) - WRAP_CMD=1 - shift - ;; - --tests | --zunit | -z) - PRESET=zunit - shift - ;; - # Whether to enable debug tracing of zinit (zsh -x) - # Only applies to wrapped commands (--w|--wrap) - --zsh-debug | -x | -Z) - ZSH_DEBUG=1 - shift - ;; - *) - break - ;; - esac - done - - GIT_ROOT_DIR="$(git rev-parse --show-toplevel)" - CMD=("$@") - - case "$PRESET" in - zunit) - # Mount root of the repo to /src - # Mount /tmp/zunit-zinit to /data - CONTAINER_VOLUMES+=( - "${GIT_ROOT_DIR}:/src" - "${TMPDIR:-/tmp}/zunit-zinit:/data" - ) - CONTAINER_ENV+=( - "QUIET=1" - "NOTHING_FANCY=1" - ) - ;; - docs) - # Mount root of the repo to /src - CONTAINER_VOLUMES+=( - "${GIT_ROOT_DIR}:/src" - ) - CONTAINER_ENV+=( - "QUIET=1" - "NOTHING_FANCY=1" - "LC_ALL=en_US.UTF-8" - ) - CONTAINER_WORKDIR=/src - # shellcheck disable=2016 - INIT_CONFIG_VAL='zinit nocompile make'\''PREFIX=$ZPFX install'\'' for zdharma-continuum/zshelldoc' - # shellcheck disable=2016 - CMD=(zsh -ilsc - 'sudo chown -R "$(id -u):$(id -g)" /src && - @zi::scheduler burst && - sudo apk add tree && - make -C /src doc') - ;; - esac - - if INIT_CONFIG="$(create_init_config_file "$INIT_CONFIG_VAL")"; then - trap 'rm -vf $INIT_CONFIG' EXIT INT - fi - - if [[ -n $DEVEL ]]; then - # Mount root of the repo to /src - CONTAINER_VOLUMES+=( - "${GIT_ROOT_DIR}:/src" - ) - fi - - run "$INIT_CONFIG" "${CMD[@]}" -fi - -# Local Variables: -# mode: Shell-Script -# sh-indentation: 2 -# indent-tabs-mode: nil -# sh-basic-offset: 2 -# End: -# vim: ft=bash sw=2 ts=2 et diff --git a/zinit-additional.zsh b/zinit-additional.zsh index a0dc90a10..c8ca53060 100644 --- a/zinit-additional.zsh +++ b/zinit-additional.zsh @@ -76,7 +76,6 @@ zi::service() { builtin read -t 1 ___tmp <>"${___fle:r}.fifo2" done >>! "$ZSRV_WORK_DIR/$ZSRV_ID".log 2>&1 } # ]]] - # FUNCTION: zi::wrap-track-functions [[[ zi::wrap-track-functions() { local user="$1" plugin="$2" id_as="$3" f @@ -104,6 +103,11 @@ function $f { # Dtrace # +# FUNCTION: zi::clear-debug-report [[[ +# Forgets dtrace repport gathered up to this moment. +zi::clear-debug-report() { + zi::clear-report-for _dtrace/_dtrace +} # ]]] # FUNCTION: zi::debug-start [[[ # Starts Dtrace, i.e. session tracking for changes in Zsh state. zi::debug-start() { @@ -130,11 +134,6 @@ zi::debug-stop() { # Gather end data now, for diffing later zi::diff _dtrace/_dtrace end } # ]]] -# FUNCTION: zi::clear-debug-report [[[ -# Forgets dtrace repport gathered up to this moment. -zi::clear-debug-report() { - zi::clear-report-for _dtrace/_dtrace -} # ]]] # FUNCTION: zi::debug-unload [[[ # Reverts changes detected by dtrace run. zi::debug-unload() { @@ -146,4 +145,4 @@ zi::debug-unload() { fi } # ]]] -# vim: set fenc=utf8 ffs=unix foldmarker=[[[,]]] foldmethod=marker ft=zsh list noet sw=2 ts=2 tw=72 : +# vim: set fenc=utf8 ffs=unix foldmarker=[[[,]]] foldmethod=marker ft=zsh list noet sw=2 ts=2 tw=72: diff --git a/zinit-autoload.zsh b/zinit-autoload.zsh index a92d1fef8..0e71e27b8 100644 --- a/zinit-autoload.zsh +++ b/zinit-autoload.zsh @@ -9,19 +9,125 @@ ZINIT[EXTENDED_GLOB]="" # Backend, low level functions # -# FUNCTION: zi::unregister-plugin [[[ -# Removes the plugin from ZINIT_REGISTERED_PLUGINS array and from the -# zsh_loaded_plugins array (managed according to the plugin standard) -zi::unregister-plugin() { +# FUNCTION: zi::any-to-uspl2 [[[ +# Converts given plugin-spec to format that's used in keys for hash tables. +# So basically, creates string "user/plugin" (this format is called: uspl2). +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - (optional) plugin (only when $1 - i.e. user - given) +zi::any-to-uspl2() { zi::any-to-user-plugin "$1" "$2" - local uspl2="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" \ - teleid="$3" + [[ "${reply[-2]}" = "%" ]] && REPLY="${reply[-2]}${reply[-1]}" || REPLY="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]//---//}" +} # ]]] +# FUNCTION: zi::at-eval [[[ +zi::at-eval() { + local atclone="$2" atpull="$1" + integer retval + @zi::substitute atclone atpull + [[ $atpull = "%atclone" ]] && { eval "$atclone"; retval=$?; } || { eval "$atpull"; retval=$?; } + return $retval +} +# ]]] +# FUNCTION: zi::clear-report-for [[[ +# Clears all report data for given user/plugin. This is +# done by resetting all related global ZINIT_* hashes. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - (optional) plugin (only when $1 - i.e. user - given) +zi::clear-report-for() { + zi::any-to-uspl2 "$1" "$2" - # If not found, the index will be length+1 - ZINIT_REGISTERED_PLUGINS[${ZINIT_REGISTERED_PLUGINS[(i)$uspl2]}]=() - # Support Zsh plugin standard - zsh_loaded_plugins[${zsh_loaded_plugins[(i)$teleid]}]=() - ZINIT[STATES__$uspl2]="0" + # Shadowing + ZINIT_REPORTS[$REPLY]="" + ZINIT[BINDKEYS__$REPLY]="" + ZINIT[ZSTYLES__$REPLY]="" + ZINIT[ALIASES__$REPLY]="" + ZINIT[WIDGETS_SAVED__$REPLY]="" + ZINIT[WIDGETS_DELETE__$REPLY]="" + + # Function diffing + ZINIT[FUNCTIONS__$REPLY]="" + ZINIT[FUNCTIONS_BEFORE__$REPLY]="" + ZINIT[FUNCTIONS_AFTER__$REPLY]="" + + # Option diffing + ZINIT[OPTIONS__$REPLY]="" + ZINIT[OPTIONS_BEFORE__$REPLY]="" + ZINIT[OPTIONS_AFTER__$REPLY]="" + + # Environment diffing + ZINIT[PATH__$REPLY]="" + ZINIT[PATH_BEFORE__$REPLY]="" + ZINIT[PATH_AFTER__$REPLY]="" + ZINIT[FPATH__$REPLY]="" + ZINIT[FPATH_BEFORE__$REPLY]="" + ZINIT[FPATH_AFTER__$REPLY]="" + + # Parameter diffing + ZINIT[PARAMETERS_PRE__$REPLY]="" + ZINIT[PARAMETERS_POST__$REPLY]="" + ZINIT[PARAMETERS_BEFORE__$REPLY]="" + ZINIT[PARAMETERS_AFTER__$REPLY]="" +} # ]]] +# FUNCTION: zi::diff-env-compute [[[ +# Computes ZINIT_PATH, ZINIT_FPATH that hold (f)path components +# added by plugin. Uses data gathered earlier by zi::diff-env(). +# +# $1 - user/plugin +zi::diff-env-compute() { + local uspl2="$1" + typeset -a tmp + + # Cannot run diff if *_BEFORE or *_AFTER variable is not set + # Following is paranoid for *_BEFORE and *_AFTER being only spaces + builtin setopt localoptions extendedglob nokshglob noksharrays + [[ "${ZINIT[PATH_BEFORE__$uspl2]}" != *[$'! \t']* || "${ZINIT[PATH_AFTER__$uspl2]}" != *[$'! \t']* ]] && return 1 + [[ "${ZINIT[FPATH_BEFORE__$uspl2]}" != *[$'! \t']* || "${ZINIT[FPATH_AFTER__$uspl2]}" != *[$'! \t']* ]] && return 1 + + typeset -A path_state fpath_state + local i + + # + # PATH processing + # + + # This includes new path elements + for i in "${(z)ZINIT[PATH_AFTER__$uspl2]}"; do + path_state[${(Q)i}]=1 + done + + # Remove duplicated entries, i.e. existing before + for i in "${(z)ZINIT[PATH_BEFORE__$uspl2]}"; do + unset "path_state[${(Q)i}]" + done + + # Store the path elements, associating them with plugin ($uspl2) + ZINIT[PATH__$uspl2]="" + for i in "${(onk)path_state[@]}"; do + ZINIT[PATH__$uspl2]+="${(q)i} " + done + + # + # FPATH processing + # + + # This includes new path elements + for i in "${(z)ZINIT[FPATH_AFTER__$uspl2]}"; do + fpath_state[${(Q)i}]=1 + done + + # Remove duplicated entries, i.e. existing before + for i in "${(z)ZINIT[FPATH_BEFORE__$uspl2]}"; do + unset "fpath_state[${(Q)i}]" + done + + # Store the path elements, associating them with plugin ($uspl2) + ZINIT[FPATH__$uspl2]="" + for i in "${(onk)fpath_state[@]}"; do + ZINIT[FPATH__$uspl2]+="${(q)i} " + done + + return 0 } # ]]] # FUNCTION: zi::diff-functions-compute [[[ # Computes FUNCTIONS that holds new functions added by plugin. @@ -91,66 +197,6 @@ zi::diff-options-compute() { ZINIT[OPTIONS__$uspl2]="${(kv)opts[@]}" return 0 } # ]]] -# FUNCTION: zi::diff-env-compute [[[ -# Computes ZINIT_PATH, ZINIT_FPATH that hold (f)path components -# added by plugin. Uses data gathered earlier by zi::diff-env(). -# -# $1 - user/plugin -zi::diff-env-compute() { - local uspl2="$1" - typeset -a tmp - - # Cannot run diff if *_BEFORE or *_AFTER variable is not set - # Following is paranoid for *_BEFORE and *_AFTER being only spaces - builtin setopt localoptions extendedglob nokshglob noksharrays - [[ "${ZINIT[PATH_BEFORE__$uspl2]}" != *[$'! \t']* || "${ZINIT[PATH_AFTER__$uspl2]}" != *[$'! \t']* ]] && return 1 - [[ "${ZINIT[FPATH_BEFORE__$uspl2]}" != *[$'! \t']* || "${ZINIT[FPATH_AFTER__$uspl2]}" != *[$'! \t']* ]] && return 1 - - typeset -A path_state fpath_state - local i - - # - # PATH processing - # - - # This includes new path elements - for i in "${(z)ZINIT[PATH_AFTER__$uspl2]}"; do - path_state[${(Q)i}]=1 - done - - # Remove duplicated entries, i.e. existing before - for i in "${(z)ZINIT[PATH_BEFORE__$uspl2]}"; do - unset "path_state[${(Q)i}]" - done - - # Store the path elements, associating them with plugin ($uspl2) - ZINIT[PATH__$uspl2]="" - for i in "${(onk)path_state[@]}"; do - ZINIT[PATH__$uspl2]+="${(q)i} " - done - - # - # FPATH processing - # - - # This includes new path elements - for i in "${(z)ZINIT[FPATH_AFTER__$uspl2]}"; do - fpath_state[${(Q)i}]=1 - done - - # Remove duplicated entries, i.e. existing before - for i in "${(z)ZINIT[FPATH_BEFORE__$uspl2]}"; do - unset "fpath_state[${(Q)i}]" - done - - # Store the path elements, associating them with plugin ($uspl2) - ZINIT[FPATH__$uspl2]="" - for i in "${(onk)fpath_state[@]}"; do - ZINIT[FPATH__$uspl2]+="${(q)i} " - done - - return 0 -} # ]]] # FUNCTION: zi::diff-parameter-compute [[[ # Computes ZINIT_PARAMETERS_PRE, ZINIT_PARAMETERS_POST that hold # parameters created or changed (their type) by plugin. Uses @@ -205,27 +251,20 @@ zi::diff-parameter-compute() { return 0 } # ]]] -# FUNCTION: zi::any-to-uspl2 [[[ -# Converts given plugin-spec to format that's used in keys for hash tables. -# So basically, creates string "user/plugin" (this format is called: uspl2). +# FUNCTION: zi::exists-message [[[ +# Checks if plugin is loaded. Testable. Also outputs error +# message if plugin is not loaded. # # $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) # $2 - (optional) plugin (only when $1 - i.e. user - given) -zi::any-to-uspl2() { - zi::any-to-user-plugin "$1" "$2" - [[ "${reply[-2]}" = "%" ]] && REPLY="${reply[-2]}${reply[-1]}" || REPLY="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]//---//}" -} # ]]] -# FUNCTION: zi::save-set-extendedglob [[[ -# Enables extendedglob-option first saving if it was already -# enabled, for restoration of this state later. -zi::save-set-extendedglob() { - [[ -o "extendedglob" ]] && ZINIT[EXTENDED_GLOB]="1" || ZINIT[EXTENDED_GLOB]="0" - builtin setopt extendedglob -} # ]]] -# FUNCTION: zi::restore-extendedglob [[[ -# Restores extendedglob-option from state saved earlier. -zi::restore-extendedglob() { - [[ "${ZINIT[EXTENDED_GLOB]}" = "0" ]] && builtin unsetopt extendedglob || builtin setopt extendedglob +zi::exists-message() { + zi::any-to-uspl2 "$1" "$2" + if [[ -z "${ZINIT_REGISTERED_PLUGINS[(r)$REPLY]}" ]]; then + zi::any-colorify-as-uspl2 "$1" "$2" + builtin print "${ZINIT[col-error]}No such plugin${ZINIT[col-rst]} $REPLY" + return 1 + fi + return 0 } # ]]] # FUNCTION: zi::prepare-readlink [[[ # Prepares readlink command, used for establishing completion's owner. @@ -237,76 +276,65 @@ zi::prepare-readlink() { REPLY="readlink" fi } # ]]] -# FUNCTION: zi::clear-report-for [[[ -# Clears all report data for given user/plugin. This is -# done by resetting all related global ZINIT_* hashes. +# FUNCTION: zi::restore-extendedglob [[[ +# Restores extendedglob-option from state saved earlier. +zi::restore-extendedglob() { + [[ "${ZINIT[EXTENDED_GLOB]}" = "0" ]] && builtin unsetopt extendedglob || builtin setopt extendedglob +} # ]]] +# FUNCTION: zi::save-set-extendedglob [[[ +# Enables extendedglob-option first saving if it was already +# enabled, for restoration of this state later. +zi::save-set-extendedglob() { + [[ -o "extendedglob" ]] && ZINIT[EXTENDED_GLOB]="1" || ZINIT[EXTENDED_GLOB]="0" + builtin setopt extendedglob +} # ]]] +# FUNCTION: zi::unregister-plugin [[[ +# Removes the plugin from ZINIT_REGISTERED_PLUGINS array and from the +# zsh_loaded_plugins array (managed according to the plugin standard) +zi::unregister-plugin() { + zi::any-to-user-plugin "$1" "$2" + local uspl2="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" \ + teleid="$3" + + # If not found, the index will be length+1 + ZINIT_REGISTERED_PLUGINS[${ZINIT_REGISTERED_PLUGINS[(i)$uspl2]}]=() + # Support Zsh plugin standard + zsh_loaded_plugins[${zsh_loaded_plugins[(i)$teleid]}]=() + ZINIT[STATES__$uspl2]="0" +} # ]]] + +# +# Format functions # -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - (optional) plugin (only when $1 - i.e. user - given) -zi::clear-report-for() { - zi::any-to-uspl2 "$1" "$2" - # Shadowing - ZINIT_REPORTS[$REPLY]="" - ZINIT[BINDKEYS__$REPLY]="" - ZINIT[ZSTYLES__$REPLY]="" - ZINIT[ALIASES__$REPLY]="" - ZINIT[WIDGETS_SAVED__$REPLY]="" - ZINIT[WIDGETS_DELETE__$REPLY]="" - - # Function diffing - ZINIT[FUNCTIONS__$REPLY]="" - ZINIT[FUNCTIONS_BEFORE__$REPLY]="" - ZINIT[FUNCTIONS_AFTER__$REPLY]="" - - # Option diffing - ZINIT[OPTIONS__$REPLY]="" - ZINIT[OPTIONS_BEFORE__$REPLY]="" - ZINIT[OPTIONS_AFTER__$REPLY]="" - - # Environment diffing - ZINIT[PATH__$REPLY]="" - ZINIT[PATH_BEFORE__$REPLY]="" - ZINIT[PATH_AFTER__$REPLY]="" - ZINIT[FPATH__$REPLY]="" - ZINIT[FPATH_BEFORE__$REPLY]="" - ZINIT[FPATH_AFTER__$REPLY]="" - - # Parameter diffing - ZINIT[PARAMETERS_PRE__$REPLY]="" - ZINIT[PARAMETERS_POST__$REPLY]="" - ZINIT[PARAMETERS_BEFORE__$REPLY]="" - ZINIT[PARAMETERS_AFTER__$REPLY]="" -} # ]]] -# FUNCTION: zi::exists-message [[[ -# Checks if plugin is loaded. Testable. Also outputs error -# message if plugin is not loaded. +# FUNCTION: zi::format-env [[[ +# Creates one-column text about FPATH or PATH elements +# added when given plugin was loaded. # -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - (optional) plugin (only when $1 - i.e. user - given) -zi::exists-message() { - zi::any-to-uspl2 "$1" "$2" - if [[ -z "${ZINIT_REGISTERED_PLUGINS[(r)$REPLY]}" ]]; then - zi::any-colorify-as-uspl2 "$1" "$2" - builtin print "${ZINIT[col-error]}No such plugin${ZINIT[col-rst]} $REPLY" - return 1 +# $1 - user/plugin (i.e. uspl2 format of plugin-spec) +# $2 - if 1, then examine PATH, if 2, then examine FPATH +zi::format-env() { + local uspl2="$1" which="$2" + + # Format PATH? + if [[ "$which" = "1" ]]; then + typeset -a elem + elem=( "${(z@)ZINIT[PATH__$uspl2]}" ) + elif [[ "$which" = "2" ]]; then + typeset -a elem + elem=( "${(z@)ZINIT[FPATH__$uspl2]}" ) fi - return 0 -} # ]]] -# FUNCTION: zi::at-eval [[[ -zi::at-eval() { - local atclone="$2" atpull="$1" - integer retval - @zi::substitute atclone atpull - [[ $atpull = "%atclone" ]] && { eval "$atclone"; retval=$?; } || { eval "$atpull"; retval=$?; } - return $retval -} -# ]]] -# -# Format functions -# + # Enumerate elements added + local answer="" e + for e in "${elem[@]}"; do + [[ -z "$e" ]] && continue + e="${(Q)e}" + answer+="$e"$'\n' + done + [[ -n "$answer" ]] && REPLY="$answer" +} # ]]] # FUNCTION: zi::format-functions [[[ # Creates a one or two columns text with functions created # by given plugin. @@ -393,34 +421,6 @@ zi::format-options() { REPLY+="${(r:longest+1:: :)k}$txt"$'\n' done } # ]]] -# FUNCTION: zi::format-env [[[ -# Creates one-column text about FPATH or PATH elements -# added when given plugin was loaded. -# -# $1 - user/plugin (i.e. uspl2 format of plugin-spec) -# $2 - if 1, then examine PATH, if 2, then examine FPATH -zi::format-env() { - local uspl2="$1" which="$2" - - # Format PATH? - if [[ "$which" = "1" ]]; then - typeset -a elem - elem=( "${(z@)ZINIT[PATH__$uspl2]}" ) - elif [[ "$which" = "2" ]]; then - typeset -a elem - elem=( "${(z@)ZINIT[FPATH__$uspl2]}" ) - fi - - # Enumerate elements added - local answer="" e - for e in "${elem[@]}"; do - [[ -z "$e" ]] && continue - e="${(Q)e}" - answer+="$e"$'\n' - done - - [[ -n "$answer" ]] && REPLY="$answer" -} # ]]] # FUNCTION: zi::format-parameter [[[ # Creates one column text that lists global parameters that # changed when the given plugin was loaded. @@ -473,76 +473,6 @@ zi::format-parameter() { # Completion functions # -# FUNCTION: zi::get-completion-owner [[[ -# Returns "user---plugin" string (uspl1 format) of plugin that -# owns given completion. -# -# Both :A and readlink will be used, then readlink's output if -# results differ. Readlink might not be available. -# -# :A will read the link "twice" and give the final repository -# directory, possibly without username in the uspl format; -# readlink will read the link "once" -# -# $1 - absolute path to completion file (in COMPLETIONS_DIR) -# $2 - readlink command (":" or "readlink") -zi::get-completion-owner() { - setopt localoptions extendedglob nokshglob noksharrays noshwordsplit - local cpath="$1" - local readlink_cmd="$2" - local in_plugin_path tmp - - # Try to go not too deep into resolving the symlink, - # to have the name as it is in .zinit/plugins - # :A goes deep, descends fully to origin directory - # Readlink just reads what symlink points to - in_plugin_path="${cpath:A}" - tmp=$( "$readlink_cmd" "$cpath" ) - # This in effect works as: "if different, then readlink" - [[ -n "$tmp" ]] && in_plugin_path="$tmp" - - if [[ "$in_plugin_path" != "$cpath" && -r "$in_plugin_path" ]]; then - # Get the user---plugin part of path - while [[ "$in_plugin_path" != ${ZINIT[PLUGINS_DIR]}/[^/]## && "$in_plugin_path" != "/" && "$in_plugin_path" != "." ]]; do - in_plugin_path="${in_plugin_path:h}" - done - in_plugin_path="${in_plugin_path:t}" - - if [[ -z "$in_plugin_path" ]]; then - in_plugin_path="${tmp:h}" - fi - else - # readlink and :A have nothing - in_plugin_path="[unknown]" - fi - - REPLY="$in_plugin_path" -} # ]]] -# FUNCTION: zi::get-completion-owner-uspl2col [[[ -# For shortening of code - returns colorized plugin name -# that owns given completion. -# -# $1 - absolute path to completion file (in COMPLETIONS_DIR) -# $2 - readlink command (":" or "readlink") -zi::get-completion-owner-uspl2col() { - # "cpath" "readline_cmd" - zi::get-completion-owner "$1" "$2" - zi::any-colorify-as-uspl2 "$REPLY" -} # ]]] -# FUNCTION: zi::find-completions-of-plugin [[[ -# Searches for completions owned by given plugin. -# Returns them in `reply' array. -# -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::find-completions-of-plugin() { - builtin setopt localoptions nullglob extendedglob nokshglob noksharrays - zi::any-to-user-plugin "$1" "$2" - local user="${reply[-2]}" plugin="${reply[-1]}" uspl - [[ "$user" = "%" ]] && uspl="${user}${plugin}" || uspl="${reply[-2]}${reply[-2]:+---}${reply[-1]//\//---}" - - reply=( "${ZINIT[PLUGINS_DIR]}/$uspl"/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN) ) -} # ]]] # FUNCTION: zi::check-comp-consistency [[[ # Zinit creates symlink for each installed completion. # This function checks whether given completion (i.e. @@ -571,71 +501,141 @@ zi::check-comp-consistency() { # Tell user that he can manually modify but should do it right (( error )) && builtin print "${ZINIT[col-error]}Manual edit of ${ZINIT[COMPLETIONS_DIR]} occured?${ZINIT[col-rst]}" } # ]]] -# FUNCTION: zi::check-which-completions-are-installed [[[ +# FUNCTION: zi::check-which-completions-are-enabled [[[ # For each argument that each should be a path to completion # within a plugin's dir, it checks whether that completion -# is installed - returns 0 or 1 on corresponding positions +# is disabled - returns 0 or 1 on corresponding positions # in reply. # +# Uninstalled completions will be reported as "0" +# - i.e. disabled +# # $1, ... - path to completion within plugin's directory -zi::check-which-completions-are-installed() { - local i cfile bkpfile +zi::check-which-completions-are-enabled() { + local i cfile reply=( ) for i in "$@"; do cfile="${i:t}" - bkpfile="${cfile#_}" - if [[ -e "${ZINIT[COMPLETIONS_DIR]}"/"$cfile" || -e "${ZINIT[COMPLETIONS_DIR]}"/"$bkpfile" ]]; then + if [[ -e "${ZINIT[COMPLETIONS_DIR]}"/"$cfile" ]]; then reply+=( "1" ) else reply+=( "0" ) fi done } # ]]] -# FUNCTION: zi::check-which-completions-are-enabled [[[ +# FUNCTION: zi::check-which-completions-are-installed [[[ # For each argument that each should be a path to completion # within a plugin's dir, it checks whether that completion -# is disabled - returns 0 or 1 on corresponding positions +# is installed - returns 0 or 1 on corresponding positions # in reply. # -# Uninstalled completions will be reported as "0" -# - i.e. disabled -# # $1, ... - path to completion within plugin's directory -zi::check-which-completions-are-enabled() { - local i cfile +zi::check-which-completions-are-installed() { + local i cfile bkpfile reply=( ) for i in "$@"; do cfile="${i:t}" + bkpfile="${cfile#_}" - if [[ -e "${ZINIT[COMPLETIONS_DIR]}"/"$cfile" ]]; then + if [[ -e "${ZINIT[COMPLETIONS_DIR]}"/"$cfile" || -e "${ZINIT[COMPLETIONS_DIR]}"/"$bkpfile" ]]; then reply+=( "1" ) else reply+=( "0" ) fi done } # ]]] -# FUNCTION: zi::uninstall-completions [[[ -# Removes all completions of given plugin from Zshell (i.e. from FPATH). -# The FPATH is typically `~/.zinit/completions/'. +# FUNCTION: zi::find-completions-of-plugin [[[ +# Searches for completions owned by given plugin. +# Returns them in `reply' array. # # $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) # $2 - plugin (only when $1 - i.e. user - given) -zi::uninstall-completions() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt nullglob extendedglob warncreateglobal typesetsilent noshortloops +zi::find-completions-of-plugin() { + builtin setopt localoptions nullglob extendedglob nokshglob noksharrays + zi::any-to-user-plugin "$1" "$2" + local user="${reply[-2]}" plugin="${reply[-1]}" uspl + [[ "$user" = "%" ]] && uspl="${user}${plugin}" || uspl="${reply[-2]}${reply[-2]:+---}${reply[-1]//\//---}" - typeset -a completions symlinked backup_comps - local c cfile bkpfile - integer action global_action=0 + reply=( "${ZINIT[PLUGINS_DIR]}/$uspl"/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN) ) +} # ]]] +# FUNCTION: zi::get-completion-owner [[[ +# Returns "user---plugin" string (uspl1 format) of plugin that +# owns given completion. +# +# Both :A and readlink will be used, then readlink's output if +# results differ. Readlink might not be available. +# +# :A will read the link "twice" and give the final repository +# directory, possibly without username in the uspl format; +# readlink will read the link "once" +# +# $1 - absolute path to completion file (in COMPLETIONS_DIR) +# $2 - readlink command (":" or "readlink") +zi::get-completion-owner() { + setopt localoptions extendedglob nokshglob noksharrays noshwordsplit + local cpath="$1" + local readlink_cmd="$2" + local in_plugin_path tmp - zi::get-path "$1" "$2" - [[ -e $REPLY ]] && { - completions=( $REPLY/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN) ) - } || { - builtin print "No completions found for \`$1${${1:#(%|/)*}:+${2:+/}}$2'" - return 1 - } + # Try to go not too deep into resolving the symlink, + # to have the name as it is in .zinit/plugins + # :A goes deep, descends fully to origin directory + # Readlink just reads what symlink points to + in_plugin_path="${cpath:A}" + tmp=$( "$readlink_cmd" "$cpath" ) + # This in effect works as: "if different, then readlink" + [[ -n "$tmp" ]] && in_plugin_path="$tmp" + + if [[ "$in_plugin_path" != "$cpath" && -r "$in_plugin_path" ]]; then + # Get the user---plugin part of path + while [[ "$in_plugin_path" != ${ZINIT[PLUGINS_DIR]}/[^/]## && "$in_plugin_path" != "/" && "$in_plugin_path" != "." ]]; do + in_plugin_path="${in_plugin_path:h}" + done + in_plugin_path="${in_plugin_path:t}" + + if [[ -z "$in_plugin_path" ]]; then + in_plugin_path="${tmp:h}" + fi + else + # readlink and :A have nothing + in_plugin_path="[unknown]" + fi + + REPLY="$in_plugin_path" +} # ]]] +# FUNCTION: zi::get-completion-owner-uspl2col [[[ +# For shortening of code - returns colorized plugin name +# that owns given completion. +# +# $1 - absolute path to completion file (in COMPLETIONS_DIR) +# $2 - readlink command (":" or "readlink") +zi::get-completion-owner-uspl2col() { + # "cpath" "readline_cmd" + zi::get-completion-owner "$1" "$2" + zi::any-colorify-as-uspl2 "$REPLY" +} # ]]] +# FUNCTION: zi::uninstall-completions [[[ +# Removes all completions of given plugin from Zshell (i.e. from FPATH). +# The FPATH is typically `~/.zinit/completions/'. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::uninstall-completions() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt nullglob extendedglob warncreateglobal typesetsilent noshortloops + + typeset -a completions symlinked backup_comps + local c cfile bkpfile + integer action global_action=0 + + zi::get-path "$1" "$2" + [[ -e $REPLY ]] && { + completions=( $REPLY/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN) ) + } || { + builtin print "No completions found for \`$1${${1:#(%|/)*}:+${2:+/}}$2'" + return 1 + } symlinked=( ${ZINIT[COMPLETIONS_DIR]}/_[^_.]*~*.zwc ) backup_comps=( ${ZINIT[COMPLETIONS_DIR]}/[^_.]*~*.zwc ) @@ -702,1421 +702,1278 @@ zi::pager() { return 0 } # ]]] -# FUNCTION: zi::self-update [[[ -# Updates Zinit code (does a git pull) -zi::self-update() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob typesetsilent warncreateglobal - - [[ $1 = -q ]] && +zi::message "{pre}[self-update]{info} updating zinit repository{msg2}" \ - - local nl=$'\n' escape=$'\x1b[' - local current_branch=$(git -C $ZINIT[BIN_DIR] rev-parse --abbrev-ref HEAD) - # local current_branch='main' - local -a lines - ( - builtin cd -q "$ZINIT[BIN_DIR]" \ - && +zi::message -n "{pre}[self-update]{info} fetching latest changes from {obj}$current_branch{info} branch$nl{rst}" \ - && command git fetch --quiet \ - && lines=( ${(f)"$(command git log --color --date=short --pretty=format:'%Cgreen%cd %h %Creset%s %Cred%d%Creset || %b' ..origin/HEAD)"} ) - if (( ${#lines} > 0 )); then - # Remove the (origin/main ...) segments, to expect only tags to appear - lines=( "${(S)lines[@]//\(([,[:blank:]]#(origin|HEAD|master|main)[^a-zA-Z]##(HEAD|origin|master|main)[,[:blank:]]#)#\)/}" ) - # Remove " ||" if it ends the line (i.e. no additional text from the body) - lines=( "${lines[@]/ \|\|[[:blank:]]#(#e)/}" ) - # If there's no ref-name, 2 consecutive spaces occur - fix this - lines=( "${lines[@]/(#b)[[:space:]]#\|\|[[:space:]]#(*)(#e)/|| ${match[1]}}" ) - lines=( "${lines[@]/(#b)$escape([0-9]##)m[[:space:]]##${escape}m/$escape${match[1]}m${escape}m}" ) - # Replace what follows "|| ..." with the same thing but with no - # newlines, and also only first 10 words (the (w)-flag enables - # word-indexing) - lines=( "${lines[@]/(#b)[[:blank:]]#\|\|(*)(#e)/| ${${match[1]//$nl/ }[(w)1,(w)10]}}" ) - builtin print -rl -- "${lines[@]}" | zi::pager - builtin print - fi - if [[ $1 != -q ]] { - command git pull --no-stat --ff-only origin main - } else { - command git pull --no-stat --quiet --ff-only origin main +# FUNCTION: zi::build-module [[[ +# Performs ./configure && make on the module and displays information +# how to load the module in .zshrc. +zi::build-module() { + setopt localoptions localtraps + trap 'return 1' INT TERM + if command git -C "${ZINIT[MODULE_DIR]}" rev-parse 2>/dev/null; then + command git -C "${ZINIT[MODULE_DIR]}" clean -d -f -f + command git -C "${ZINIT[MODULE_DIR]}" reset --hard HEAD + command git -C "${ZINIT[MODULE_DIR]}" pull + else + command git clone "https://github.com/zdharma-continuum/zinit-module.git" "${ZINIT[MODULE_DIR]}" || { + builtin print "${ZINIT[col-error]}Failed to clone module repo${ZINIT[col-rst]}" + return 1 } + fi + ( builtin cd -q "${ZINIT[MODULE_DIR]}" + +zi::message "{pname}== Building module zdharma-continuum/zinit-module, running: make clean, then ./configure and then make =={rst}" + +zi::message "{pname}== The module sources are located at: "${ZINIT[MODULE_DIR]}" =={rst}" + if [[ -f Makefile ]] { + if [[ "$1" = "--clean" ]] { + noglob +zi::message {p}-- make distclean --{rst} + make distclean + ((1)) + } else { + noglob +zi::message {p}-- make clean --{rst} + make clean + } + } + noglob +zi::message {p}-- ./configure --{rst} + CPPFLAGS=-I/usr/local/include CFLAGS="-g -Wall -O3" LDFLAGS=-L/usr/local/lib ./configure --disable-gdbm --without-tcsetpgrp && { + noglob +zi::message {p}-- make --{rst} + if { make } { + [[ -f Src/zdharma_continuum/zinit.so ]] && cp -vf Src/zdharma_continuum/zinit.{so,bundle} + noglob +zi::message "{info}Module has been built correctly.{rst}" + zi::module info + } else { + noglob +zi::message "{error}Module didn't build.{rst} " + zi::module info --link + } + } + builtin print $EPOCHSECONDS >! "${ZINIT[MAN_DIR]}/COMPILED_AT" ) - if [[ $1 != -q ]] { - +zi::message "{pre}[self-update]{info} compiling zinit via {obj}zcompile{rst}" - } - command rm -f $ZINIT[BIN_DIR]/*.zwc(DN) - zcompile -U $ZINIT[BIN_DIR]/zinit.zsh - zcompile -U $ZINIT[BIN_DIR]/zinit-{'side','install','autoload','additional'}.zsh - zcompile -U $ZINIT[BIN_DIR]/share/git-process-output.zsh - # Load for the current session - [[ $1 != -q ]] && +zi::message "{pre}[self-update]{info} reloading zinit for the current session{rst}" - - # +zi::message "{pre}[self-update]{info} resetting zinit repository via{rst}: {cmd}${ICE[reset]:-git reset --hard HEAD}{rst}" - source $ZINIT[BIN_DIR]/zinit.zsh - zcompile -U $ZINIT[BIN_DIR]/zinit-{'side','install','autoload'}.zsh - # Read and remember the new modification timestamps - local file - for file ( "" -side -install -autoload ) { - zi::get-mtime-into "${ZINIT[BIN_DIR]}/zinit$file.zsh" "ZINIT[mtime$file]" - } } # ]]] -# FUNCTION: zi::show-registered-plugins [[[ -# Lists loaded plugins (subcommands list, lodaded) -zi::show-registered-plugins() { +# FUNCTION: zi::cd [[[ +# Jumps to plugin's directory (in Zinit's home directory). +# +# User-action entry point. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::cd() { builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob warncreateglobal typesetsilent noshortloops - - typeset -a filtered - local keyword="$1" - - keyword="${keyword## ##}" - keyword="${keyword%% ##}" - if [[ -n "$keyword" ]]; then - builtin print "Installed plugins matching ${ZINIT[col-info]}$keyword${ZINIT[col-rst]}:" - filtered=( "${(M)ZINIT_REGISTERED_PLUGINS[@]:#*$keyword*}" ) - else - filtered=( "${ZINIT_REGISTERED_PLUGINS[@]}" ) - fi + builtin setopt extendedglob warncreateglobal typesetsilent rcquotes - local i - for i in "${filtered[@]}"; do - [[ "$i" = "_local/zinit" ]] && continue - zi::any-colorify-as-uspl2 "$i" - # Mark light loads - [[ "${ZINIT[STATES__$i]}" = "1" ]] && REPLY="$REPLY ${ZINIT[col-info]}*${ZINIT[col-rst]}" - builtin print -r -- "$REPLY" - done + zi::get-path "$1" "$2" && { + if [[ -e $REPLY ]]; then + builtin pushd $REPLY + else + +zi::message "No such plugin or snippet" + return 1 + fi + builtin print + } || { + +zi::message "No such plugin or snippet" + return 1 + } } # ]]] -# FUNCTION: zi::unload [[[ -# 1. call the zsh plugin's standard *_plugin_unload function -# 2. call the code provided by the zsh plugin's standard @zsh-plugin-run-at-update -# 3. delete bindkeys (...) -# 4. delete zstyles -# 5. restore options -# 6. remove aliases -# 7. restore zle state -# 8. unfunction functions (created by plugin) -# 9. clean-up fpath and path -# 10. delete created variables -# 11. forget the plugin +# FUNCTION: zi::cdisable [[[ +# Enables given installed completion. # -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::unload() { - zi::any-to-user-plugin "$1" "$2" - local uspl2="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" user="${reply[-2]}" plugin="${reply[-1]}" quiet="${${3:+1}:-0}" - local k +# User-action entry point. +# +# $1 - e.g. "_mkdir" or "mkdir" +zi::cdisable() { + local c="$1" + c="${c#_}" - zi::any-colorify-as-uspl2 "$uspl2" - (( quiet )) || builtin print -r -- "${ZINIT[col-bar]}---${ZINIT[col-rst]} Unloading plugin: $REPLY ${ZINIT[col-bar]}---${ZINIT[col-rst]}" + local cfile="${ZINIT[COMPLETIONS_DIR]}/_${c}" + local bkpfile="${cfile:h}/$c" - local ___dir - [[ "$user" = "%" ]] && ___dir="$plugin" || ___dir="${ZINIT[PLUGINS_DIR]}/${user:+${user}---}${plugin//\//---}" + if [[ ! -e "$cfile" && ! -e "$bkpfile" ]]; then + builtin print "${ZINIT[col-error]}No such completion \`$c'${ZINIT[col-rst]}" + return 1 + fi - # KSH_ARRAYS immunity - integer correct=0 - [[ -o "KSH_ARRAYS" ]] && correct=1 + # Check if it's already disabled + # Not existing "$cfile" says that + if [[ ! -e "$cfile" ]]; then + builtin print "Completion ${ZINIT[col-info]}$c${ZINIT[col-rst]} already disabled" - # Allow unload for debug user - if [[ "$uspl2" != "_dtrace/_dtrace" ]]; then - zi::exists-message "$1" "$2" || return 1 + zi::check-comp-consistency "$cfile" "$bkpfile" 0 + return 1 fi - zi::any-colorify-as-uspl2 "$1" "$2" - local uspl2col="$REPLY" - - # Store report of the plugin in variable LASTREPORT - typeset -g LASTREPORT - LASTREPORT=`zi::show-report "$1" "$2"` + # No disable, but bkpfile exists? + if [[ -e "$bkpfile" ]]; then + builtin print "${ZINIT[col-error]}Warning: completion's backup file \`${bkpfile:t}' already exists, will overwrite${ZINIT[col-rst]}" + zi::check-comp-consistency "$cfile" "$bkpfile" 1 + command rm -f "$bkpfile" + else + zi::check-comp-consistency "$cfile" "$bkpfile" 0 + fi - # Call the Zsh Plugin's Standard *_plugin_unload function - (( ${+functions[${plugin}_plugin_unload]} )) && ${plugin}_plugin_unload + # Disable + command mv "$cfile" "$bkpfile" - # Call the code provided by the Zsh Plugin's Standard @zsh-plugin-run-at-update - local -a tmp - local -A sice - tmp=( "${(z@)ZINIT_SICE[$uspl2]}" ) - (( ${#tmp} > 1 && ${#tmp} % 2 == 0 )) && sice=( "${(Q)tmp[@]}" ) || sice=() + # Prepare readlink command for establishing completion's owner + zi::prepare-readlink + # Get completion's owning plugin + zi::get-completion-owner-uspl2col "$bkpfile" "$REPLY" - if [[ -n ${sice[ps-on-unload]} ]]; then - (( quiet )) || builtin print -r "Running plugin's provided unload code: ${ZINIT[col-info]}${sice[ps-on-unload][1,50]}${sice[ps-on-unload][51]:+…}${ZINIT[col-rst]}" - local ___oldcd="$PWD" - () { setopt localoptions noautopushd; builtin cd -q "$___dir"; } - eval "${sice[ps-on-unload]}" - () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; } - fi + builtin print "Disabled ${ZINIT[col-info]}$c${ZINIT[col-rst]} completion belonging to $REPLY" - # 1. Delete done bindkeys - typeset -a string_widget - string_widget=( "${(z)ZINIT[BINDKEYS__$uspl2]}" ) - local sw - for sw in "${(Oa)string_widget[@]}"; do - [[ -z "$sw" ]] && continue - # Remove one level of quoting to split using (z) - sw="${(Q)sw}" - typeset -a sw_arr - sw_arr=( "${(z)sw}" ) + return 0 +} # ]]] +# FUNCTION: zi::cenable [[[ +# Disables given installed completion. +# +# User-action entry point. +# +# $1 - e.g. "_mkdir" or "mkdir" +zi::cenable() { + local c="$1" + c="${c#_}" - # Remove one level of quoting to pass to bindkey - local sw_arr1="${(Q)sw_arr[1-correct]}" # Keys - local sw_arr2="${(Q)sw_arr[2-correct]}" # Widget - local sw_arr3="${(Q)sw_arr[3-correct]}" # Optional previous-bound widget - local sw_arr4="${(Q)sw_arr[4-correct]}" # Optional -M or -A or -N - local sw_arr5="${(Q)sw_arr[5-correct]}" # Optional map name - local sw_arr6="${(Q)sw_arr[6-correct]}" # Optional -R (not with -A, -N) + local cfile="${ZINIT[COMPLETIONS_DIR]}/_${c}" + local bkpfile="${cfile:h}/$c" - if [[ "$sw_arr4" = "-M" && "$sw_arr6" != "-R" ]]; then - if [[ -n "$sw_arr3" ]]; then - () { - builtin emulate -LR zsh -o extendedglob ${=${options[xtrace]:#off}:+-o xtrace} - (( quiet )) || builtin print -r "Restoring bindkey ${${(q)sw_arr1}//(#m)\\[\^\?\]\[\)\(\'\"\}\{\`]/${MATCH#\\}} $sw_arr3 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" - } - bindkey -M "$sw_arr5" "$sw_arr1" "$sw_arr3" - else - (( quiet )) || builtin print -r "Deleting bindkey ${(q)sw_arr1} $sw_arr2 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" - bindkey -M "$sw_arr5" -r "$sw_arr1" - fi - elif [[ "$sw_arr4" = "-M" && "$sw_arr6" = "-R" ]]; then - if [[ -n "$sw_arr3" ]]; then - (( quiet )) || builtin print -r "Restoring ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr3 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" - bindkey -RM "$sw_arr5" "$sw_arr1" "$sw_arr3" - else - (( quiet )) || builtin print -r "Deleting ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr2 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" - bindkey -M "$sw_arr5" -Rr "$sw_arr1" - fi - elif [[ "$sw_arr4" != "-M" && "$sw_arr6" = "-R" ]]; then - if [[ -n "$sw_arr3" ]]; then - (( quiet )) || builtin print -r "Restoring ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr3" - bindkey -R "$sw_arr1" "$sw_arr3" - else - (( quiet )) || builtin print -r "Deleting ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr2" - bindkey -Rr "$sw_arr1" - fi - elif [[ "$sw_arr4" = "-A" ]]; then - (( quiet )) || builtin print -r "Linking backup-\`main' keymap \`$sw_arr5' back to \`main'" - bindkey -A "$sw_arr5" "main" - elif [[ "$sw_arr4" = "-N" ]]; then - (( quiet )) || builtin print -r "Deleting keymap \`$sw_arr5'" - bindkey -D "$sw_arr5" - else - if [[ -n "$sw_arr3" ]]; then - () { - builtin emulate -LR zsh -o extendedglob ${=${options[xtrace]:#off}:+-o xtrace} - (( quiet )) || builtin print -r "Restoring bindkey ${${(q)sw_arr1}//(#m)\\[\^\?\]\[\)\(\'\"\}\{\`]/${MATCH#\\}} $sw_arr3" - } - bindkey "$sw_arr1" "$sw_arr3" - else - (( quiet )) || builtin print -r "Deleting bindkey ${(q)sw_arr1} $sw_arr2" - bindkey -r "$sw_arr1" - fi - fi - done + if [[ ! -e "$cfile" && ! -e "$bkpfile" ]]; then + builtin print "${ZINIT[col-error]}No such completion \`$c'${ZINIT[col-rst]}" + return 1 + fi - # 2. Delete created Zstyles + # Check if there is no backup file + # This is treated as if the completion is already enabled + if [[ ! -e "$bkpfile" ]]; then + builtin print "Completion ${ZINIT[col-info]}$c${ZINIT[col-rst]} already enabled" - typeset -a pattern_style - pattern_style=( "${(z)ZINIT[ZSTYLES__$uspl2]}" ) - local ps - for ps in "${(Oa)pattern_style[@]}"; do - [[ -z "$ps" ]] && continue - # Remove one level of quoting to split using (z) - ps="${(Q)ps}" - typeset -a ps_arr - ps_arr=( "${(z)ps}" ) + zi::check-comp-consistency "$cfile" "$bkpfile" 0 + return 1 + fi - # Remove one level of quoting to pass to zstyle - local ps_arr1="${(Q)ps_arr[1-correct]}" - local ps_arr2="${(Q)ps_arr[2-correct]}" + # Disabled, but completion file already exists? + if [[ -e "$cfile" ]]; then + builtin print "${ZINIT[col-error]}Warning: completion's file \`${cfile:t}' exists, will overwrite${ZINIT[col-rst]}" + builtin print "${ZINIT[col-error]}Completion is actually enabled and will re-enable it again${ZINIT[col-rst]}" + zi::check-comp-consistency "$cfile" "$bkpfile" 1 + command rm -f "$cfile" + else + zi::check-comp-consistency "$cfile" "$bkpfile" 0 + fi - (( quiet )) || builtin print "Deleting zstyle $ps_arr1 $ps_arr2" + # Enable + command mv "$bkpfile" "$cfile" # move completion's backup file created when disabling - zstyle -d "$ps_arr1" "$ps_arr2" - done + # Prepare readlink command for establishing completion's owner + zi::prepare-readlink + # Get completion's owning plugin + zi::get-completion-owner-uspl2col "$cfile" "$REPLY" - # 3. Restore changed options - # paranoid, don't want bad key/value pair error - zi::diff-options-compute "$uspl2" - integer empty=0 - zi::save-set-extendedglob - [[ "${ZINIT[OPTIONS__$uspl2]}" != *[$'! \t']* ]] && empty=1 - zi::restore-extendedglob + builtin print "Enabled ${ZINIT[col-info]}$c${ZINIT[col-rst]} completion belonging to $REPLY" - if (( empty != 1 )); then - typeset -A opts - opts=( "${(z)ZINIT[OPTIONS__$uspl2]}" ) - for k in "${(kon)opts[@]}"; do - # Internal options - [[ "$k" = "physical" ]] && continue + return 0 +} # ]]] +# FUNCTION: zi::changes [[[ +# Shows `git log` of given plugin. +# +# User-action entry point. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::changes() { + zi::any-to-user-plugin "$1" "$2" + local user="${reply[-2]}" plugin="${reply[-1]}" - if [[ "${opts[$k]}" = "on" ]]; then - (( quiet )) || builtin print "Setting option $k" - builtin setopt "$k" - else - (( quiet )) || builtin print "Unsetting option $k" - builtin unsetopt "$k" - fi - done - fi + zi::exists-physically-message "$user" "$plugin" || return 1 - # 4. Delete aliases - typeset -a aname_avalue - aname_avalue=( "${(z)ZINIT[ALIASES__$uspl2]}" ) - local nv - for nv in "${(Oa)aname_avalue[@]}"; do - [[ -z "$nv" ]] && continue - # Remove one level of quoting to split using (z) - nv="${(Q)nv}" - typeset -a nv_arr - nv_arr=( "${(z)nv}" ) + ( + builtin cd -q "${ZINIT[PLUGINS_DIR]}/${user:+${user}---}${plugin//\//---}" && \ + command git log -p --graph --decorate --date=relative -C -M + ) +} # ]]] +# FUNCTION: zi::clear-completions [[[ +# Delete stray and improper completions. +# +# Completions live even when plugin isn't loaded - if they are +# installed and enabled. +# +# User-action entry point. +zi::clear-completions() { + builtin setopt localoptions nullglob extendedglob nokshglob noksharrays - # Remove one level of quoting to pass to unalias - local nv_arr1="${(Q)nv_arr[1-correct]}" - local nv_arr2="${(Q)nv_arr[2-correct]}" - local nv_arr3="${(Q)nv_arr[3-correct]}" + typeset -a completions + completions=( "${ZINIT[COMPLETIONS_DIR]}"/_[^_.]*~*.zwc "${ZINIT[COMPLETIONS_DIR]}"/[^_.]*~*.zwc ) - if [[ "$nv_arr3" = "-s" ]]; then - if [[ -n "$nv_arr2" ]]; then - (( quiet )) || builtin print "Restoring ${ZINIT[col-info]}suffix${ZINIT[col-rst]} alias ${nv_arr1}=${nv_arr2}" - alias "$nv_arr1" &> /dev/null && unalias -s -- "$nv_arr1" - alias -s -- "${nv_arr1}=${nv_arr2}" - else - (( quiet )) || alias "$nv_arr1" &> /dev/null && { - builtin print "Removing ${ZINIT[col-info]}suffix${ZINIT[col-rst]} alias ${nv_arr1}" - unalias -s -- "$nv_arr1" - } - fi - elif [[ "$nv_arr3" = "-g" ]]; then - if [[ -n "$nv_arr2" ]]; then - (( quiet )) || builtin print "Restoring ${ZINIT[col-info]}global${ZINIT[col-rst]} alias ${nv_arr1}=${nv_arr2}" - alias "$nv_arr1" &> /dev/null && unalias -g -- "$nv_arr1" - alias -g -- "${nv_arr1}=${nv_arr2}" - else - (( quiet )) || alias "$nv_arr1" &> /dev/null && { - builtin print "Removing ${ZINIT[col-info]}global${ZINIT[col-rst]} alias ${nv_arr1}" - unalias -- "${(q)nv_arr1}" - } - fi - else - if [[ -n "$nv_arr2" ]]; then - (( quiet )) || builtin print "Restoring alias ${nv_arr1}=${nv_arr2}" - alias "$nv_arr1" &> /dev/null && unalias -- "$nv_arr1" - alias -- "${nv_arr1}=${nv_arr2}" - else - (( quiet )) || alias "$nv_arr1" &> /dev/null && { - builtin print "Removing alias ${nv_arr1}" - unalias -- "$nv_arr1" - } - fi - fi + # Find longest completion name + local cpath c + integer longest=0 + for cpath in "${completions[@]}"; do + c="${cpath:t}" + c="${c#_}" + [[ "${#c}" -gt "$longest" ]] && longest="${#c}" done - # - # 5. Restore Zle state - # + zi::prepare-readlink + local rdlink="$REPLY" - local -a keys - keys=( "${(@on)ZINIT[(I)TIME_<->_*]}" ) - integer keys_size=${#keys} - () { - setopt localoptions extendedglob noksharrays typesetsilent - typeset -a restore_widgets skip_delete - local wid - restore_widgets=( "${(z)ZINIT[WIDGETS_SAVED__$uspl2]}" ) - for wid in "${(Oa)restore_widgets[@]}"; do - [[ -z "$wid" ]] && continue - wid="${(Q)wid}" - typeset -a orig_saved - orig_saved=( "${(z)wid}" ) - - local tpe="${orig_saved[1]}" - local orig_saved1="${(Q)orig_saved[2]}" # Original widget - local comp_wid="${(Q)orig_saved[3]}" - local orig_saved2="${(Q)orig_saved[4]}" # Saved target function - local orig_saved3="${(Q)orig_saved[5]}" # Saved previous $widget's contents + integer disabled unknown stray + for cpath in "${completions[@]}"; do + c="${cpath:t}" + [[ "${c#_}" = "${c}" ]] && disabled=1 || disabled=0 + c="${c#_}" - local found_time_key="${keys[(r)TIME_<->_${uspl2//\//---}]}" to_process_plugin - integer found_time_idx=0 idx=0 - to_process_plugin="" - [[ "$found_time_key" = (#b)TIME_(<->)_* ]] && found_time_idx="${match[1]}" - if (( found_time_idx )); then # Must be true - for (( idx = found_time_idx + 1; idx <= keys_size; ++ idx )); do - found_time_key="${keys[(r)TIME_${idx}_*]}" - local oth_uspl2="" - [[ "$found_time_key" = (#b)TIME_${idx}_(*) ]] && oth_uspl2="${match[1]//---//}" - local -a entry_splitted - entry_splitted=( "${(z@)ZINIT[WIDGETS_SAVED__$oth_uspl2]}" ) - integer found_idx="${entry_splitted[(I)(-N|-C)\ $orig_saved1\\\ *]}" - local -a entry_splitted2 - entry_splitted2=( "${(z@)ZINIT[BINDKEYS__$oth_uspl2]}" ) - integer found_idx2="${entry_splitted2[(I)*\ $orig_saved1\ *]}" - if (( found_idx || found_idx2 )) - then - # Skip multiple loads of the same plugin - # TODO: fully handle multiple plugin loads - if [[ "$oth_uspl2" != "$uspl2" ]]; then - to_process_plugin="$oth_uspl2" - # only the first one is needed - break - fi - fi - done - if [[ -n "$to_process_plugin" ]]; then - if (( !found_idx && !found_idx2 )); then - (( quiet )) || builtin print "Problem (1) during handling of widget \`$orig_saved1' (contents: $orig_saved2)" - continue - fi - (( quiet )) || builtin print "Chaining widget \`$orig_saved1' to plugin $oth_uspl2" - local -a oth_orig_saved - if (( found_idx )) { - oth_orig_saved=( "${(z)${(Q)entry_splitted[found_idx]}}" ) - local oth_fun="${oth_orig_saved[4]}" - # below is wrong because we don't want to call other plugins function at any moment - # oth_orig_saved[2]="${(q)orig_saved2}" - oth_orig_saved[5]="${(q)orig_saved3}" # chain up the widget - entry_splitted[found_idx]="${(q)${(j: :)oth_orig_saved}}" - ZINIT[WIDGETS_SAVED__$oth_uspl2]="${(j: :)entry_splitted}" - } else { - oth_orig_saved=( "${(z)${(Q)entry_splitted2[found_idx2]}}" ) - local oth_fun="${widgets[${oth_orig_saved[3]}]#*:}" - } - integer idx="${functions[$orig_saved2][(i)(#b)([^[:space:]]#${orig_saved1}[^[:space:]]#)]}" - if (( idx <= ${#functions[$orig_saved2]} )) - then - local prefix_X="${match[1]#\{}" - [[ $prefix_X != \$* ]] && prefix_X="${prefix_X%\}}" - idx="${functions[$oth_fun][(i)(#b)([^[:space:]]#${orig_saved1}[^[:space:]]#)]}" - if (( idx <= ${#functions[$oth_fun]} )); then - match[1]="${match[1]#\{}" - [[ ${match[1]} != \$* ]] && match[1]="${match[1]%\}}" - eval "local oth_prefix_uspl2_X=\"${match[1]}\"" - if [[ "${widgets[$prefix_X]}" = builtin ]]; then - (( quiet )) || builtin print "Builtin-restoring widget \`$oth_prefix_uspl2_X' ($oth_uspl2)" - zle -A ".${prefix_X#.}" "$oth_prefix_uspl2_X" - elif [[ "${widgets[$prefix_X]}" = completion:* ]]; then - (( quiet )) || builtin print "Chain*-restoring widget \`$oth_prefix_uspl2_X' ($oth_uspl2)" - zle -C "$oth_prefix_uspl2_X" "${(@)${(@s.:.)${orig_saved3#user:}}[2,3]}" - else - (( quiet )) || builtin print "Chain-restoring widget \`$oth_prefix_uspl2_X' ($oth_uspl2)" - zle -N "$oth_prefix_uspl2_X" "${widgets[$prefix_X]#user:}" - fi - fi - # The alternate method - # skip_delete+=( "${match[1]}" ) - # functions[$oth_fun]="${functions[$oth_fun]//[^\{[:space:]]#$orig_saved1/${match[1]}}" - fi - else - (( quiet )) || builtin print "Restoring Zle widget $orig_saved1" - if [[ "$orig_saved3" = builtin ]]; then - zle -A ".$orig_saved1" "$orig_saved1" - elif [[ "$orig_saved3" = completion:* ]]; then - zle -C "$orig_saved1" "${(@)${(@s.:.)${orig_saved3#user:}}[2,3]}" - else - zle -N "$orig_saved1" "${orig_saved3#user:}" - fi - fi - else - (( quiet )) || builtin print "Problem (2) during handling of widget \`$orig_saved1' (contents: $orig_saved2)" - fi - done - } + # This will resolve completion's symlink to obtain + # information about the repository it comes from, i.e. + # about user and plugin, taken from directory name + zi::get-completion-owner "$cpath" "$rdlink" + [[ "$REPLY" = "[unknown]" ]] && unknown=1 || unknown=0 + zi::any-colorify-as-uspl2 "$REPLY" - typeset -a delete_widgets - delete_widgets=( "${(z)ZINIT[WIDGETS_DELETE__$uspl2]}" ) - local wid - for wid in "${(Oa)delete_widgets[@]}"; do - [[ -z "$wid" ]] && continue - wid="${(Q)wid}" - if [[ -n "${skip_delete[(r)$wid]}" ]]; then - builtin print "Would delete $wid" - continue - fi - if [[ "${ZINIT_ZLE_HOOKS_LIST[$wid]}" = "1" ]]; then - (( quiet )) || builtin print "Removing Zle hook \`$wid'" - else - (( quiet )) || builtin print "Removing Zle widget \`$wid'" + # If we successfully read a symlink (unknown == 0), test if it isn't broken + stray=0 + if (( unknown == 0 )); then + [[ ! -f "$cpath" ]] && stray=1 fi - zle -D "$wid" - done - # 6. Unfunction - zi::diff-functions-compute "$uspl2" - typeset -a func - func=( "${(z)ZINIT[FUNCTIONS__$uspl2]}" ) - local f - for f in "${(on)func[@]}"; do - [[ -z "$f" ]] && continue - f="${(Q)f}" - (( quiet )) || builtin print "Deleting function $f" - (( ${+functions[$f]} )) && unfunction -- "$f" - (( ${+precmd_functions} )) && precmd_functions=( ${precmd_functions[@]:#$f} ) - (( ${+preexec_functions} )) && preexec_functions=( ${preexec_functions[@]:#$f} ) - (( ${+chpwd_functions} )) && chpwd_functions=( ${chpwd_functions[@]:#$f} ) - (( ${+periodic_functions} )) && periodic_functions=( ${periodic_functions[@]:#$f} ) - (( ${+zshaddhistory_functions} )) && zshaddhistory_functions=( ${zshaddhistory_functions[@]:#$f} ) - (( ${+zshexit_functions} )) && zshexit_functions=( ${zshexit_functions[@]:#$f} ) + if (( unknown == 1 || stray == 1 )); then + builtin print -n "Removing completion: ${(r:longest+1:: :)c} $REPLY" + (( disabled )) && builtin print -n " ${ZINIT[col-error]}[disabled]${ZINIT[col-rst]}" + (( unknown )) && builtin print -n " ${ZINIT[col-error]}[unknown file]${ZINIT[col-rst]}" + (( stray )) && builtin print -n " ${ZINIT[col-error]}[stray]${ZINIT[col-rst]}" + builtin print + command rm -f "$cpath" + fi done +} # ]]] +# FUNCTION: zi::compile-uncompile-all [[[ +# Compiles or uncompiles all existing (on disk) plugins. +# +# User-action entry point. +zi::compile-uncompile-all() { + builtin setopt localoptions nullglob - # 7. Clean up FPATH and PATH - zi::diff-env-compute "$uspl2" - # iterate over $path elements and skip those that were added by the plugin - typeset -a new elem p - elem=( "${(z)ZINIT[PATH__$uspl2]}" ) - for p in "${path[@]}"; do - if [[ -z "${elem[(r)${(q)p}]}" ]] { - new+=( "$p" ) - } else { - (( quiet )) || builtin print "Removing PATH element ${ZINIT[col-info]}$p${ZINIT[col-rst]}" - [[ -d "$p" ]] || (( quiet )) || builtin print "${ZINIT[col-error]}Warning:${ZINIT[col-rst]} it didn't exist on disk" - } - done - path=( "${new[@]}" ) + local compile="$1" - # The same for $fpath - elem=( "${(z)ZINIT[FPATH__$uspl2]}" ) - new=( ) - for p ( "${fpath[@]}" ) { - if [[ -z "${elem[(r)${(q)p}]}" ]] { - new+=( "$p" ) - } else { - (( quiet )) || builtin print "Removing FPATH element ${ZINIT[col-info]}$p${ZINIT[col-rst]}" - [[ -d "$p" ]] || (( quiet )) || builtin print "${ZINIT[col-error]}Warning:${ZINIT[col-rst]} it didn't exist on disk" - } - } - fpath=( "${new[@]}" ) + typeset -a plugins + plugins=( "${ZINIT[PLUGINS_DIR]}"/*(DN) ) - # 8. Delete created variables - zi::diff-parameter-compute "$uspl2" - empty=0 - zi::save-set-extendedglob - [[ "${ZINIT[PARAMETERS_POST__$uspl2]}" != *[$'! \t']* ]] && empty=1 - zi::restore-extendedglob + local p user plugin + for p in "${plugins[@]}"; do + [[ "${p:t}" = "custom" || "${p:t}" = "_local---zinit" ]] && continue - if (( empty != 1 )); then - typeset -A elem_pre elem_post - elem_pre=( "${(z)ZINIT[PARAMETERS_PRE__$uspl2]}" ) - elem_post=( "${(z)ZINIT[PARAMETERS_POST__$uspl2]}" ) + zi::any-to-user-plugin "${p:t}" + user="${reply[-2]}" plugin="${reply[-1]}" - # Find variables created or modified - local wl found - local -a whitelist - whitelist=( "${(@Q)${(z@)ZINIT[ENV-WHITELIST]}}" ) - for k in "${(k)elem_post[@]}"; do - k="${(Q)k}" - local v1="${(Q)elem_pre[$k]}" - local v2="${(Q)elem_post[$k]}" + zi::any-colorify-as-uspl2 "$user" "$plugin" + builtin print -r -- "$REPLY:" - # "" means a variable was deleted, not created/changed - if [[ $v2 != '""' ]]; then - # Don't unset readonly variables - [[ ${(tP)k} == *-readonly(|-*) ]] && continue + if [[ "$compile" = "1" ]]; then + zi::compile-plugin "$user" "$plugin" + else + zi::uncompile-plugin "$user" "$plugin" "1" + fi + done +} # ]]] +# FUNCTION: zi::compiled [[[ +# Displays list of plugins that are compiled. +# +# User-action entry point. +zi::compiled() { + builtin setopt localoptions nullglob - # Don't unset arrays managed by add-zsh-hook, also ignore a few special parameters - # TODO: remember and remove hooks - case "$k" in - (chpwd_functions|precmd_functions|preexec_functions|periodic_functions|zshaddhistory_functions|zshexit_functions|zsh_directory_name_functions) - continue - (path|PATH|fpath|FPATH) - continue; - ;; - esac + typeset -a matches m + matches=( ${ZINIT[PLUGINS_DIR]}/*/*.zwc(DN) ) - # Don't unset redefined variables, only newly defined "" means variable didn't exist before plugin load (didn't have a type). - # Do an exception for the prompt variables - if [[ $v1 = '""' || ( $k = (RPROMPT|RPS1|RPS2|PROMPT|PS1|PS2|PS3|PS4) && $v1 != $v2 ) ]]; then - found=0 - for wl in "${whitelist[@]}"; do - if [[ "$k" = ${~wl} ]]; then - found=1 - break - fi - done - if (( !found )); then - (( quiet )) || builtin print "Unsetting variable $k" - # checked that 4.3.17 does support "--"; cannot be parameter starting with "-" but let's defensively use "--" here - unset -- "$k" - else - builtin print "Skipping unset of variable $k (whitelist)" - fi - fi - fi - done + if [[ "${#matches[@]}" -eq "0" ]]; then + builtin print "No compiled plugins" + return 0 fi - # 9. Forget the plugin - if [[ "$uspl2" = "_dtrace/_dtrace" ]]; then - zi::clear-debug-report - (( quiet )) || builtin print "dtrace report saved to \$LASTREPORT" + local cur_plugin="" uspl1 file user plugin + for m in "${matches[@]}"; do + file="${m:t}" + uspl1="${${m:h}:t}" + zi::any-to-user-plugin "$uspl1" + user="${reply[-2]}" plugin="${reply[-1]}" + + if [[ "$cur_plugin" != "$uspl1" ]]; then + [[ -n "$cur_plugin" ]] && builtin print # newline + zi::any-colorify-as-uspl2 "$user" "$plugin" + builtin print -r -- "$REPLY:" + cur_plugin="$uspl1" + fi + + builtin print "$file" + done +} # ]]] +# FUNCTION: zi::confirm [[[ +# Prints given question, waits for "y" key, evals +# given expression if "y" obtained +# +# $1 - question +# $2 - expression +zi::confirm() { + if (( OPTS[opt_-y,--yes] )); then + integer retval + eval "$2"; retval=$? + (( OPTS[opt_-q,--quiet] )) || builtin print "\nDone (action executed, exit code: $retval)" else - (( quiet )) || builtin print "Unregistering plugin $uspl2col" - zi::unregister-plugin "$user" "$plugin" "${sice[teleid]}" - zsh_loaded_plugins[${zsh_loaded_plugins[(i)$user${${user:#(%|/)*}:+/}$plugin]}]=() # Support Zsh plugin standard - zi::clear-report-for "$user" "$plugin" - (( quiet )) || builtin print "Plugin's report saved to \$LASTREPORT" + builtin print -Pr -- "$1" + builtin print "[yY/n…]" + local ans + if [[ -t 0 ]] { + read -q ans + } else { + read -k1 -u0 ans + } + if [[ "$ans" = "y" ]] { + eval "$2" + builtin print "\nDone (action executed, exit code: $?)" + } else { + builtin print "\nBreak, no action" + return 1 + } fi + return 0 } # ]]] -# FUNCTION: zi::show-report [[[ -# Displays report of the plugin given. +# FUNCTION: zi::create [[[ +# Creates a plugin, also on Github (if not "_local/name" plugin). # -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user (+ plugin in $2), plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::show-report() { - setopt localoptions extendedglob warncreateglobal typesetsilent noksharrays +# User-action entry point. +# +# $1 - (optional) plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - (optional) plugin (only when $1 - i.e. user - given) +zi::create() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + setopt localoptions extendedglob warncreateglobal typesetsilent \ + noshortloops rcquotes + zi::any-to-user-plugin "$1" "$2" - local user="${reply[-2]}" plugin="${reply[-1]}" uspl2="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" + local user="${reply[-2]}" plugin="${reply[-1]}" - # Allow debug report - if [[ "$user/$plugin" != "_dtrace/_dtrace" ]]; then - zi::exists-message "$user" "$plugin" || return 1 + if (( ${+commands[curl]} == 0 || ${+commands[git]} == 0 )); then + builtin print "${ZINIT[col-error]}curl and git are needed${ZINIT[col-rst]}" + return 1 fi - # Print title - builtin printf "${ZINIT[col-title]}Report for${ZINIT[col-rst]} %s%s plugin\n"\ - "${user:+${ZINIT[col-uname]}$user${ZINIT[col-rst]}}${${user:#(%|/)*}:+/}"\ - "${ZINIT[col-pname]}$plugin${ZINIT[col-rst]}" + # Read whether to create under organization + local isorg + vared -cp 'Create under an organization? (y/n): ' isorg - # Print "----------" - local msg="Report for $user${${user:#(%|/)*}:+/}$plugin plugin" - builtin print -- "${ZINIT[col-bar]}${(r:${#msg}::-:)tmp__}${ZINIT[col-rst]}" + if [[ $isorg = (y|yes) ]]; then + local org="$user" + vared -cp "Github organization name: " org + fi - local -A map - map=( - Error: "${ZINIT[col-error]}" - Warning: "${ZINIT[col-error]}" - Note: "${ZINIT[col-note]}" - ) - # Print report gathered via shadowing - () { - setopt localoptions extendedglob - builtin print -rl -- "${(@)${(f@)ZINIT_REPORTS[$uspl2]}/(#b)(#s)([^[:space:]]##)([[:space:]]##)/${map[${match[1]}]:-${ZINIT[col-keyword]}}${match[1]}${ZINIT[col-rst]}${match[2]}}" - } + # Read user + local compcontext="user:User Name:(\"$USER\" \"$user\")" + vared -cp "Github user name or just \"_local\" (or leave blank, for an userless plugin): " user - # Print report gathered via $functions-diffing - REPLY="" - zi::diff-functions-compute "$uspl2" - zi::format-functions "$uspl2" - [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}Functions created:${ZINIT[col-rst]}"$'\n'"$REPLY" + # Read plugin + unset compcontext + vared -cp 'Plugin name: ' plugin - # Print report gathered via $options-diffing - REPLY="" - zi::diff-options-compute "$uspl2" - zi::format-options "$uspl2" - [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}Options changed:${ZINIT[col-rst]}"$'\n'"$REPLY" + if [[ "$plugin" = "_unknown" ]]; then + builtin print "${ZINIT[col-error]}No plugin name entered${ZINIT[col-rst]}" + return 1 + fi - # Print report gathered via environment diffing - REPLY="" - zi::diff-env-compute "$uspl2" - zi::format-env "$uspl2" "1" - [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}PATH elements added:${ZINIT[col-rst]}"$'\n'"$REPLY" + plugin="${plugin//[^a-zA-Z0-9_]##/-}" + zi::any-colorify-as-uspl2 "${${${(M)isorg:#(y|yes)}:+$org}:-$user}" "$plugin" + local uspl2col="$REPLY" + builtin print "Plugin is $uspl2col" - REPLY="" - zi::format-env "$uspl2" "2" - [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}FPATH elements added:${ZINIT[col-rst]}"$'\n'"$REPLY" + if zi::exists-physically "${${${(M)isorg:#(y|yes)}:+$org}:-$user}" "$plugin"; then + builtin print "${ZINIT[col-error]}Repository${ZINIT[col-rst]} $uspl2col ${ZINIT[col-error]}already exists locally${ZINIT[col-rst]}" + return 1 + fi - # Print report gathered via parameter diffing - zi::diff-parameter-compute "$uspl2" - zi::format-parameter "$uspl2" - [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}Variables added or redefined:${ZINIT[col-rst]}"$'\n'"$REPLY" + builtin cd -q "${ZINIT[PLUGINS_DIR]}" - # Print what completions plugin has - zi::find-completions-of-plugin "$user" "$plugin" - typeset -a completions - completions=( "${reply[@]}" ) + if [[ "$user" != "_local" && -n "$user" ]]; then + builtin print "${ZINIT[col-info]}Creating Github repository${ZINIT[col-rst]}" + if [[ $isorg = (y|yes) ]]; then + curl --silent -u "$user" https://api.github.com/orgs/$org/repos -d '{"name":"'"$plugin"'"}' >/dev/null + else + curl --silent -u "$user" https://api.github.com/user/repos -d '{"name":"'"$plugin"'"}' >/dev/null + fi + command git clone "https://github.com/${${${(M)isorg:#(y|yes)}:+$org}:-$user}/${plugin}.git" "${${${(M)isorg:#(y|yes)}:+$org}:-$user}---${plugin//\//---}" || { + builtin print "${ZINIT[col-error]}Creation of remote repository $uspl2col ${ZINIT[col-error]}failed${ZINIT[col-rst]}" + builtin print "${ZINIT[col-error]}Bad credentials?${ZINIT[col-rst]}" + return 1 + } + builtin cd -q "${${${(M)isorg:#(y|yes)}:+$org}:-$user}---${plugin//\//---}" + command git config credential.https://github.com.username "${user}" + else + builtin print "${ZINIT[col-info]}Creating local git repository${${user:+.}:-, ${ZINIT[col-pname]}free-style, without the \"_local/\" part${ZINIT[col-info]}.}${ZINIT[col-rst]}" + command mkdir "${user:+${user}---}${plugin//\//---}" + builtin cd -q "${user:+${user}---}${plugin//\//---}" + command git init || { + builtin print "Git repository initialization failed, aborting" + return 1 + } + fi - if [[ "${#completions[@]}" -ge "1" ]]; then - builtin print "${ZINIT[col-p]}Completions:${ZINIT[col-rst]}" - zi::check-which-completions-are-installed "${completions[@]}" - typeset -a installed - installed=( "${reply[@]}" ) + local user_name="$(command git config user.name 2>/dev/null)" + local year="${$(command date "+%Y"):-2020}" - zi::check-which-completions-are-enabled "${completions[@]}" - typeset -a enabled - enabled=( "${reply[@]}" ) + command cat >! "${plugin:t}.plugin.zsh" <! "README.md" + command cp -vf "${ZINIT[BIN_DIR]}/LICENSE" LICENSE + command cp -vf "${ZINIT[BIN_DIR]}/share/template-plugin/zsh.gitignore" .gitignore + command cp -vf "${ZINIT[BIN_DIR]}/share/template-plugin/template-script" . + + command sed -i -e "s/MY_PLUGIN_DIR/${${(U)plugin:t}//-/_}_DIR/g" template-script + command sed -i -e "s/USER_NAME/$user_name/g" template-script + command sed -i -e "s/YEAR/$year/g" template-script + + if [[ "$user" != "_local" && -n "$user" ]]; then + builtin print "Your repository is ready\!" + builtin print "An MIT LICENSE file has been placed - please review the " \ + "license terms to see if they fit your new project:" + builtin print "- https://choosealicense.com/" + builtin print "Remote repository $uspl2col set up as origin." + builtin print "You're in plugin's local folder, the files aren't added to git." + builtin print "Your next step after commiting will be:" + builtin print "git push -u origin master (or \`… -u origin main')" + else + builtin print "Created local $uspl2col plugin." + builtin print "You're in plugin's repository folder, the files aren't added to git." fi +} # ]]] +# FUNCTION: zi::delete [[[ +# Deletes plugin's or snippet's directory (in Zinit's home directory). +# +# User-action entry point. +# +# $1 - snippet URL or plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::delete() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + setopt extendedglob warncreateglobal typesetsilent - command rm -f ${TMPDIR:-${TMPDIR:-/tmp}}/zinit-execs.$$.lst ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.installed_comps.$$.lst \ - ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.skipped_comps.$$.lst ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.compiled.$$.lst + local -a opts match mbegin mend + local MATCH; integer MBEGIN MEND _retval - # A flag for the annexes. 0 – no new commits, 1 - run-atpull mode, - # 2 – full update/there are new commits to download, 3 - full but - # a forced download (i.e.: the medium doesn't allow to peek update) - ZINIT[annex-multi-flag:pull-active]=0 + # Parse options + zi::parse-opts delete "$@" + builtin set -- "${reply[@]}" + if (( $@[(I)-*] || OPTS[opt_-h,--help] )) { +zi::prehelp-usage-message delete $___opt_map[delete] $@; return 1; } - (( ${#ICE[@]} > 0 )) && { ZINIT_SICE[$user${${user:#(%|/)*}:+/}$plugin]=""; local nf="-nftid"; } + local the_id="$1${${1:#(%|/)*}:+${2:+/}}$2" - zi::compute-ice "$user${${user:#(%|/)*}:+/}$plugin" "pack$nf" \ - ice local_dir filename is_snippet || return 1 + # -a/--all given? + if (( OPTS[opt_-a,--all] )); then + zi::confirm "Prune all plugins in \`${ZINIT[PLUGINS_DIR]}'"\ +"and snippets in \`${ZINIT[SNIPPETS_DIR]}'?" \ +"command rm -rf ${${ZINIT[PLUGINS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcEFG312}/*~*/_local---zinit(ND) "\ +"${${ZINIT[SNIPPETS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcEFG312}/*~*/plugins(ND)" + return $? + fi - zi::any-to-user-plugin ${ice[teleid]:-$id_as} - user=${reply[1]} plugin=${reply[2]} + # -c/--clean given? + if (( OPTS[opt_-c,--clean] )) { + zi::confirm "Prune ${ZINIT[col-info]}CURRENTLY NOT LOADED${ZINIT[col-rst]}"\ +" plugins in $ZINIT[col-file]$ZINIT[PLUGINS_DIR]%f%b"\ +" and snippets in $ZINIT[col-file]$ZINIT[SNIPPETS_DIR]%f%b?" \ +" # Delete unloaded snippets +local -aU loadedsnips todelete final_todelete +loadedsnips=( \${\${ZINIT_SNIPPETS[@]% <*>}/(#m)*/\$(zi::get-object-path snippet \"\$MATCH\" && builtin print -rn \$REPLY; )} ) +local dir=\${\${ZINIT[SNIPPETS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/xyzcba231} +todelete=( \$dir/*/*/*(ND/) \$dir/*/*(ND/) \$dir/*(ND/) ) +final_todelete=( \${todelete[@]:#*/(\${(~j:|:)loadedsnips}|*/plugins|._backup|._zinit|.svn|.git)(|/*)} ) +final_todelete=( \${final_todelete[@]//(#m)*/\$( zi::get-object-path snippet \"\${\${\${MATCH##\${dir}[/[:space:]]#}/(#i)(#b)(http(s|)|ftp(s|)|ssh|rsync)--/\${match[1]##--}://}//--//}\" && builtin print -r -- \$REPLY)} ) +final_todelete=( \${final_todelete[@]:#(\${(~j:|:)loadedsnips}|*/plugins|*/._backup|*/._zinit|*/.svn|*/.git)(|/*)} ) +todelete=( \${\${\${(@)\${(@)final_todelete##\$dir/#}//(#i)(#m)(http(s|)|ftp(s|)|ssh|rsync)--/\${MATCH%--}://}//--//}//(#b)(*)\/([^\/]##)(#e)/\$match[1]/\$ZINIT[col-file]\$match[2]\$ZINIT[col-rst]} ) +todelete=( \${todelete[@]//(#m)(#s)[^\/]##(#e)/\$ZINIT[col-file]\$MATCH\$ZINIT[col-rst]} ) +final_todelete=( \${\${\${(@)\${(@)final_todelete##\$dir/#}//(#i)(#m)(http(s|)|ftp(s|)|ssh|rsync)--/\${MATCH%--}://}//--//}//(#b)(*)\/([^\/]##)(#e)/\$match[1]/\$match[2]} ) +builtin print; print -Prln \"\$ZINIT[col-obj]Deleting the following \"\ +\"\$ZINIT[col-file]\${#todelete}\$ZINIT[col-msg2] UNLOADED\$ZINIT[col-obj] snippets:%f%b\" \ + \$todelete \"%f%b\" +sleep 3 +local snip +for snip ( \$final_todelete ) { zinit delete -q -y \$snip; _retval+=\$?; } +builtin print -Pr \"\$ZINIT[col-obj]Done (with the exit code: \$_retval).%f%b\" - local repo="${${${(M)id_as#%}:+${id_as#%}}:-${ZINIT[PLUGINS_DIR]}/${id_as//\//---}}" +# Next delete unloaded plugins +local -a dirs +dirs=( \${\${ZINIT[PLUGINS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcEFG312}/*~*/(\${(~j:|:)\${ZINIT_REGISTERED_PLUGINS[@]//\//---}})(ND/) ) +dirs=( \${(@)\${dirs[@]##\$ZINIT[PLUGINS_DIR]/#}//---//} ) +builtin print -Prl \"\" \"\$ZINIT[col-obj]Deleting the following \"\ +\"\$ZINIT[col-file]\${#dirs}\$ZINIT[col-msg2] UNLOADED\$ZINIT[col-obj] plugins:%f%b\" \ +\${\${dirs//(#b)(*)(\/([^\/]##))(#e)/\${\${match[2]:+\$ZINIT[col-uname]\$match[1]\$ZINIT[col-rst]/\$ZINIT[col-pname]\$match[3]\$ZINIT[col-rst]}:-\$ZINIT[col-pname]\$match[1]}}//(#b)(^\$ZINIT[col-uname])(*)/\$ZINIT[col-pname]\$match[1]} +sleep 3 +for snip ( \$dirs ) { zinit delete -q -y \$snip; _retval+=\$?; } +builtin print -Pr \"\$ZINIT[col-obj]Done (with the exit code: \$_retval).%f%b\"" + return _retval + } - # Run annexes' preinit hooks - local -a arr - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:preinit-pre <->]} - ${(on)ZINIT_EXTS[(I)z-annex hook:preinit-<-> <->]} - ${(on)ZINIT_EXTS2[(I)zinit hook:preinit-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" ${${key##(zinit|z-annex) hook:}%% <->} update || \ - return $(( 10 - $? )) - done + local -A ICE2 + local local_dir filename is_snippet - # Check if repository has a remote set, if it is _local - if [[ -f $local_dir/.git/config ]]; then - local -a config - config=( ${(f)"$(<$local_dir/.git/config)"} ) - if [[ ${#${(M)config[@]:#\[remote[[:blank:]]*\]}} -eq 0 ]]; then - (( !OPTS[opt_-q,--quiet] )) && { - zi::any-colorify-as-uspl2 "$id_as" - [[ $id_as = _local/* ]] && builtin print -r -- "Skipping local plugin $REPLY" || \ - builtin print -r -- "$REPLY doesn't have a remote set, will not fetch" - } - return 1 - fi + zi::compute-ice "$the_id" "pack" \ + ICE2 local_dir filename is_snippet || return 1 + + if [[ "$local_dir" != /* ]] + then + builtin print "Obtained a risky, not-absolute path ($local_dir), aborting" + return 1 fi - command rm -f $local_dir/.zinit_lastupd + ICE2[teleid]="${ICE2[teleid]:-${ICE2[id-as]}}" - if (( 1 )); then - if [[ -z ${ice[is_release]} && ${ice[from]} = (gh-r|github-rel|cygwin) ]] { - ice[is_release]=true - } + local -a files + files=( "$local_dir"/*.(zsh|sh|bash|ksh)(DN:t) + "$local_dir"/*(*DN:t) "$local_dir"/*(@DN:t) "$local_dir"/*(.DN:t) + "$local_dir"/*~*/.(_zinit|svn|git)(/DN:t) "$local_dir"/*(=DN:t) + "$local_dir"/*(pDN:t) "$local_dir"/*(%DN:t) + ) + (( !${#files} )) && files=( "no files?" ) + files=( ${(@)files[1,4]} ${files[4]+more…} ) - integer count is_release=0 - for (( count = 1; count <= 5; ++ count )) { - if (( ${+ice[is_release${count:#1}]} )) { - is_release=1 - } - } + # Make the ices available for the hooks. + local -A ICE + ICE=( "${(kv)ICE2[@]}" ) - (( ${+functions[zi::setup-plugin-dir]} )) || builtin source ${ZINIT[BIN_DIR]}"/zinit-install.zsh" - if [[ $ice[from] == (gh-r|github-rel) ]] { - { - ICE=( "${(kv)ice[@]}" ) - zi::get-latest-gh-r-url-part "$user" "$plugin" || return $? - } always { - ICE=() - } + if (( is_snippet )); then + if [[ "${+ICE2[svn]}" = "1" ]] { + if [[ -e "$local_dir" ]] + then + zi::confirm "Delete $local_dir? (it holds: ${(j:, :)${(@u)files}})" \ + "zi::run-delete-hooks snippet \"${ICE2[teleid]}\" \"\" \"$the_id\" \ + \"$local_dir\"; \ + command rm -rf ${(q)${${local_dir:#[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcYZX321}}" + else + builtin print "No such snippet" + return 1 + fi } else { - REPLY="" - } - - if (( is_release )) { - count=0 - for REPLY ( $reply ) { - count+=1 - local version=${REPLY/(#b)(\/[^\/]##)(#c4,4)\/([^\/]##)*/${match[2]}} - if [[ ${ice[is_release${count:#1}]} = $REPLY ]] { - (( ${+ice[run-atpull]} || OPTS[opt_-u,--urge] )) && \ - ZINIT[annex-multi-flag:pull-active]=1 || \ - ZINIT[annex-multi-flag:pull-active]=0 - } else { - ZINIT[annex-multi-flag:pull-active]=2 - break - } - } - if (( ZINIT[annex-multi-flag:pull-active] <= 1 && !OPTS[opt_-q,--quiet] )) { - builtin print -- "\rBinary release already up to date (version: $version)" - } + if [[ -e "$local_dir" ]]; then + zi::confirm "Delete $local_dir? (it holds: ${(j:, :)${(@u)files}})" \ + "zi::run-delete-hooks snippet \"${ICE2[teleid]}\" \"\" \"$the_id\" \ + \"$local_dir\"; command rm -rf \ + ${(q)${${local_dir:#[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcYZX321}}" + else + builtin print "No such snippet" + return 1 + fi } + else + zi::any-to-user-plugin "${ICE2[teleid]}" + if [[ -e "$local_dir" ]]; then + zi::confirm "Delete $local_dir? (it holds: ${(j:, :)${(@u)files}})" \ + "zi::run-delete-hooks plugin \"${reply[-2]}\" \"${reply[-1]}\" \"$the_id\" \ + \"$local_dir\"; \ + command rm -rf ${(q)${${local_dir:#[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcYZX321}}" + else + builtin print -r -- "No such plugin or snippet" + return 1 + fi + fi - if (( 1 )) { - if (( ZINIT[annex-multi-flag:pull-active] >= 1 )) { - if (( OPTS[opt_-q,--quiet] && !PUPDATE )) { - zi::any-colorify-as-uspl2 "$id_as" - (( ZINIT[first-plugin-mark] )) && { - ZINIT[first-plugin-mark]=0 - } || builtin print - builtin print "\rUpdating $REPLY" - } + return 0 +} # ]]] +# FUNCTION: zi::edit [[[ +# Runs $EDITOR on source of given plugin. If the variable is not +# set then defaults to `vim'. +# +# User-action entry point. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::edit() { + local -A ICE2 + local local_dir filename is_snippet the_id="$1${${1:#(%|/)*}:+${2:+/}}$2" - ICE=( "${(kv)ice[@]}" ) - # Run annexes' atpull hooks (the before atpull-ice ones). - # The gh-r / GitHub releases block. - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} - ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update:bin - hook_rc=$? - [[ "$hook_rc" -ne 0 ]] && { - # note: this will effectively return the last != 0 rc - retval="$hook_rc" - builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" - } - done + zi::compute-ice "$the_id" "pack" \ + ICE2 local_dir filename is_snippet || return 1 - if (( ZINIT[annex-multi-flag:pull-active] >= 2 )) { - if ! zi::setup-plugin-dir "$user" "$plugin" "$id_as" release -u $version; then - ZINIT[annex-multi-flag:pull-active]=0 - fi - if (( OPTS[opt_-q,--quiet] != 1 )) { - builtin print - } - } - ICE=() - } - } + ICE2[teleid]="${ICE2[teleid]:-${ICE2[id-as]}}" - if [[ -d $local_dir/.git ]] && ( builtin cd -q $local_dir ; git show-ref --verify --quiet refs/heads/main ); then - local main_branch=main - else - local main_branch=master + if (( is_snippet )); then + if [[ ! -e "$local_dir" ]]; then + builtin print "No such snippet" + return 1 + fi + else + if [[ ! -e "$local_dir" ]]; then + builtin print -r -- "No such plugin or snippet" + return 1 fi + fi - if (( ! is_release )) { - ( builtin cd -q "$local_dir" || return 1 - integer had_output=0 - local IFS=$'\n' - command git fetch --quiet && \ - command git --no-pager log --color --date=short --pretty=format:'%Cgreen%cd %h %Creset%s%n' ..FETCH_HEAD | \ - while read line; do - [[ -n ${line%%[[:space:]]##} ]] && { - [[ $had_output -eq 0 ]] && { - had_output=1 - if (( OPTS[opt_-q,--quiet] && !PUPDATE )) { - zi::any-colorify-as-uspl2 "$id_as" - (( ZINIT[first-plugin-mark] )) && { - ZINIT[first-plugin-mark]=0 - } || builtin print - builtin print "Updating $REPLY" - } - } - builtin print $line - } - done | \ - command tee .zinit_lastupd | \ - zi::pager & + "${EDITOR:-vim}" "$local_dir" + return 0 +} # ]]] +# FUNCTION: zi::get-path [[[ +# Returns path of given ID-string, which may be a plugin-spec +# (like "user/plugin" or "user" "plugin"), an absolute path +# ("%" "/home/..." and also "%SNIPPETS/..." etc.), or a plugin +# nickname (i.e. id-as'' ice-mod), or a snippet nickname. +zi::get-path() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + setopt extendedglob warncreateglobal typesetsilent noshortloops - integer pager_pid=$! - { sleep 20 && kill -9 $pager_pid 2>/dev/null 1>&2; } &! - { wait $pager_pid; } > /dev/null 2>&1 + [[ $1 == % ]] && local id_as=%$2 || local id_as=$1${1:+/}$2 + zi::get-object-path snippet "$id_as" || \ + zi::get-object-path plugin "$id_as" - local -a log - { log=( ${(@f)"$(<$local_dir/.zinit_lastupd)"} ); } 2>/dev/null - command rm -f $local_dir/.zinit_lastupd + return $(( 1 - reply[3] )) +} # ]]] +# FUNCTION: zi::glance [[[ +# Shows colorized source code of plugin. Is able to use pygmentize, +# highlight, GNU source-highlight. +# +# User-action entry point. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::glance() { + zi::any-to-user-plugin "$1" "$2" + local user="${reply[-2]}" plugin="${reply[-1]}" - if [[ ${#log} -gt 0 ]] { - ZINIT[annex-multi-flag:pull-active]=2 - } else { - if (( ${+ice[run-atpull]} || OPTS[opt_-u,--urge] )) { - ZINIT[annex-multi-flag:pull-active]=1 + zi::exists-physically-message "$user" "$plugin" || return 1 - # Handle the snippet/plugin boundary in the messages - if (( OPTS[opt_-q,--quiet] && !PUPDATE )) { - zi::any-colorify-as-uspl2 "$id_as" - (( ZINIT[first-plugin-mark] )) && { - ZINIT[first-plugin-mark]=0 - } || builtin print - builtin print "\rUpdating $REPLY" - } - } else { - ZINIT[annex-multi-flag:pull-active]=0 - } - } + zi::first "$1" "$2" || { + builtin print "${ZINIT[col-error]}No source file found, cannot glance${ZINIT[col-rst]}" + return 1 + } - if (( ZINIT[annex-multi-flag:pull-active] >= 1 )) { - ICE=( "${(kv)ice[@]}" ) - # Run annexes' atpull hooks (the before atpull-ice ones). - # The regular Git-plugins block. - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} - ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update:git - hook_rc=$? - [[ "$hook_rc" -ne 0 ]] && { - # note: this will effectively return the last != 0 rc - retval="$hook_rc" - builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" - } - done - ICE=() - (( ZINIT[annex-multi-flag:pull-active] >= 2 )) && command git pull --no-stat ${=ice[pullopts]:---ff-only} origin ${ice[ver]:-$main_branch} |& command grep -E -v '(FETCH_HEAD|up.to.date\.|From.*://)' - } - return ${ZINIT[annex-multi-flag:pull-active]} - ) - ZINIT[annex-multi-flag:pull-active]=$? - } + local fname="${reply[-1]}" - if [[ -d $local_dir/.git ]]; then - ( - builtin cd -q "$local_dir" # || return 1 - don't return, maybe it's some hook's logic - if (( OPTS[opt_-q,--quiet] )) { - command git pull --recurse-submodules ${=ice[pullopts]:---ff-only} origin ${ice[ver]:-$main_branch} &> /dev/null - } else { - command git pull --recurse-submodules ${=ice[pullopts]:---ff-only} origin ${ice[ver]:-$main_branch} |& command grep -E -v '(FETCH_HEAD|up.to.date\.|From.*://)' - } - ) - fi - if [[ -n ${(v)ice[(I)(mv|cp|atpull|ps-on-update|cargo)]} || $+ice[sbin]$+ice[make]$+ice[extract]$+ice[configure] -ne 0 ]] { - if (( !OPTS[opt_-q,--quiet] && ZINIT[annex-multi-flag:pull-active] == 1 )) { - +zi::message -n "{pre}[update]{msg3} Continuing with the update because " - (( ${+ice[run-atpull]} )) && \ - +zi::message "{ice}run-atpull{apo}''{msg3} ice given.{rst}" || \ - +zi::message "{opt}-u{msg3}/{opt}--urge{msg3} given.{rst}" - } - } + integer has_256_colors=0 + [[ "$TERM" = xterm* || "$TERM" = "screen" ]] && has_256_colors=1 - # Any new commits? - if (( ZINIT[annex-multi-flag:pull-active] >= 1 )) { - ICE=( "${(kv)ice[@]}" ) - # Run annexes' atpull hooks (the before atpull[^!]…-ice ones). - # Block common for Git and gh-r plugins. - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-pre <->]} - ${${ICE[atpull]:#\!*}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update - hook_rc="$?" - [[ "$hook_rc" -ne 0 ]] && { - # note: this will effectively return the last != 0 rc - retval="$hook_rc" - builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" - } - done + { + if (( ${+commands[pygmentize]} )); then + builtin print "Glancing with ${ZINIT[col-info]}pygmentize${ZINIT[col-rst]}" + pygmentize -l bash -g "$fname" + elif (( ${+commands[highlight]} )); then + builtin print "Glancing with ${ZINIT[col-info]}highlight${ZINIT[col-rst]}" + if (( has_256_colors )); then + highlight -q --force -S sh -O xterm256 "$fname" + else + highlight -q --force -S sh -O ansi "$fname" + fi + elif (( ${+commands[source-highlight]} )); then + builtin print "Glancing with ${ZINIT[col-info]}source-highlight${ZINIT[col-rst]}" + source-highlight -fesc --failsafe -s zsh -o STDOUT -i "$fname" + else + cat "$fname" + fi + } | { + if [[ -t 1 ]]; then + zi::pager + else + cat + fi + } +} # ]]] +# FUNCTION: zi::list-bindkeys [[[ +zi::list-bindkeys() { + local uspl2 uspl2col sw first=1 + local -a string_widget - # Run annexes' atpull hooks (the after atpull-ice ones). - # Block common for Git and gh-r plugins. - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:atpull-pre <->]} - ${(on)ZINIT_EXTS[(I)z-annex hook:atpull-<-> <->]} - ${(on)ZINIT_EXTS2[(I)zinit hook:atpull-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update - hook_rc="$?" - [[ "$hook_rc" -ne 0 ]] && { - # note: this will effectively return the last != 0 rc - retval="$hook_rc" - builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" - } - done - ICE=() - } + # KSH_ARRAYS immunity + integer correct=0 + [[ -o "KSH_ARRAYS" ]] && correct=1 - # Store ices to disk at update of plugin - zi::store-ices "$local_dir/._zinit" ice "" "" "" "" - fi + for uspl2 in "${(@ko)ZINIT[(I)BINDKEYS__*]}"; do + [[ -z "${ZINIT[$uspl2]}" ]] && continue - # Run annexes' atpull hooks (the `always' after atpull-ice ones) - # Block common for Git and gh-r plugins. - ICE=( "${(kv)ice[@]}" ) - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:%atpull-pre <->]} - ${(on)ZINIT_EXTS[(I)z-annex hook:%atpull-<-> <->]} - ${(on)ZINIT_EXTS2[(I)zinit hook:%atpull-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update:$ZINIT[annex-multi-flag:pull-active] - hook_rc=$? - [[ "$hook_rc" -ne 0 ]] && { - # note: this will effectively return the last != 0 rc - retval="$hook_rc" - builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" - } - done - ICE=() + (( !first )) && builtin print + first=0 - typeset -ga INSTALLED_EXECS - { INSTALLED_EXECS=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit-execs.$$.lst)}" ) } 2>/dev/null + uspl2="${uspl2#BINDKEYS__}" - if [[ -e ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.skipped_comps.$$.lst || -e ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.installed_comps.$$.lst ]] { - typeset -ga INSTALLED_COMPS SKIPPED_COMPS - { INSTALLED_COMPS=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit.installed_comps.$$.lst)}" ) } 2>/dev/null - { SKIPPED_COMPS=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit.skipped_comps.$$.lst)}" ) } 2>/dev/null - } + zi::any-colorify-as-uspl2 "$uspl2" + uspl2col="$REPLY" + builtin print "$uspl2col" - if [[ -e ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.compiled.$$.lst ]] { - typeset -ga ADD_COMPILED - { ADD_COMPILED=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit.compiled.$$.lst)}" ) } 2>/dev/null - } + string_widget=( "${(z@)ZINIT[BINDKEYS__$uspl2]}" ) + for sw in "${(Oa)string_widget[@]}"; do + [[ -z "$sw" ]] && continue + # Remove one level of quoting to split using (z) + sw="${(Q)sw}" + typeset -a sw_arr + sw_arr=( "${(z@)sw}" ) - if (( PUPDATE && ZINIT[annex-multi-flag:pull-active] > 0 )) { - builtin print ${ZINIT[annex-multi-flag:pull-active]} >! $PUFILE.ind - } + # Remove one level of quoting to pass to bindkey + local sw_arr1="${(Q)sw_arr[1-correct]}" # Keys + local sw_arr2="${(Q)sw_arr[2-correct]}" # Widget + local sw_arr3="${(Q)sw_arr[3-correct]}" # Optional -M or -A or -N + local sw_arr4="${(Q)sw_arr[4-correct]}" # Optional map name + local sw_arr5="${(Q)sw_arr[5-correct]}" # Optional -R (not with -A, -N) - return $retval + if [[ "$sw_arr3" = "-M" && "$sw_arr5" != "-R" ]]; then + builtin print "bindkey $sw_arr1 $sw_arr2 ${ZINIT[col-info]}for keymap $sw_arr4${ZINIT[col-rst]}" + elif [[ "$sw_arr3" = "-M" && "$sw_arr5" = "-R" ]]; then + builtin print "${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey $sw_arr1 $sw_arr2 ${ZINIT[col-info]}mapped to $sw_arr4${ZINIT[col-rst]}" + elif [[ "$sw_arr3" != "-M" && "$sw_arr5" = "-R" ]]; then + builtin print "${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey $sw_arr1 $sw_arr2" + elif [[ "$sw_arr3" = "-A" ]]; then + builtin print "Override of keymap \`main'" + elif [[ "$sw_arr3" = "-N" ]]; then + builtin print "New keymap \`$sw_arr4'" + else + builtin print "bindkey $sw_arr1 $sw_arr2" + fi + done + done } # ]]] -# FUNCTION: zi::update-or-status-snippet [[[ -# -# Implements update or status operation for snippet given by URL. +# FUNCTION: zi::list-compdef-replay [[[ +# Shows recorded compdefs (called by plugins loaded earlier). +# Plugins often call `compdef' hoping for `compinit' being +# already ran. Zinit solves this by recording compdefs. # -# $1 - "status" or "update" -# $2 - snippet URL -zi::update-or-status-snippet() { - local st="$1" URL="${2%/}" local_dir filename is_snippet - (( ${#ICE[@]} > 0 )) && { ZINIT_SICE[$URL]=""; local nf="-nftid"; } - local -A ICE2 - zi::compute-ice "$URL" "pack$nf" \ - ICE2 local_dir filename is_snippet || return 1 +# User-action entry point. +zi::list-compdef-replay() { + builtin print "Recorded compdefs:" + local cdf + for cdf in "${ZINIT_COMPDEF_REPLAY[@]}"; do + builtin print "compdef ${(Q)cdf}" + done +} # ]]] +# FUNCTION: zi::ls [[[ +zi::ls() { + (( ${+commands[tree]} )) || { + builtin print "${ZINIT[col-error]}No \`tree' program, it is required by the subcommand \`ls\'${ZINIT[col-rst]}" + builtin print "Download from: http://mama.indstate.edu/users/ice/tree/" + builtin print "It is also available probably in all distributions and Homebrew, as package \`tree'" + } + ( + setopt localoptions extendedglob nokshglob noksharrays + builtin cd -q "${ZINIT[SNIPPETS_DIR]}" + local -a list + local -x LANG=en_US.utf-8 + list=( "${(f@)"$(${=ZINIT[LIST_COMMAND]})"}" ) + # Oh-My-Zsh single file + list=( "${list[@]//(#b)(https--github.com--(ohmyzsh|robbyrussel)l--oh-my-zsh--raw--master(--)(#c0,1)(*))/$ZINIT[col-info]Oh-My-Zsh$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](single-file)$ZINIT[col-rst] ${match[1]}}" ) + # Oh-My-Zsh SVN + list=( "${list[@]//(#b)(https--github.com--(ohmyzsh|robbyrussel)l--oh-my-zsh--trunk(--)(#c0,1)(*))/$ZINIT[col-info]Oh-My-Zsh$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](SVN)$ZINIT[col-rst] ${match[1]}}" ) + # Prezto single file + list=( "${list[@]//(#b)(https--github.com--sorin-ionescu--prezto--raw--master(--)(#c0,1)(*))/$ZINIT[col-info]Prezto$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](single-file)$ZINIT[col-rst] ${match[1]}}" ) + # Prezto SVN + list=( "${list[@]//(#b)(https--github.com--sorin-ionescu--prezto--trunk(--)(#c0,1)(*))/$ZINIT[col-info]Prezto$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](SVN)$ZINIT[col-rst] ${match[1]}}" ) - integer retval + # First-level names + list=( "${list[@]//(#b)(#s)(│   └──| └──| ├──|│   ├──) (*)/${match[1]} $ZINIT[col-p]${match[2]}$ZINIT[col-rst]}" ) - if [[ "$st" = "status" ]]; then - if (( ${+ICE2[svn]} )); then - builtin print -r -- "${ZINIT[col-info]}Status for ${${${local_dir:h}:t}##*--}/${local_dir:t}${ZINIT[col-rst]}" - ( builtin cd -q "$local_dir"; command svn status -vu ) - retval=$? - builtin print + list[-1]+=", located at ZINIT[SNIPPETS_DIR], i.e. ${ZINIT[SNIPPETS_DIR]}" + builtin print -rl -- "${list[@]}" + ) +} # ]]] +# FUNCTION: zi::module [[[ +# Function that has sub-commands passed as long-options (with two dashes, --). +# It's an attempt to plugin only this one function into `zinit' function +# defined in zinit.zsh, to not make this file longer than it's needed. +zi::module() { + if [[ "$1" = "build" ]]; then + zi::build-module "${@[2,-1]}" + elif [[ "$1" = "info" ]]; then + if [[ "$2" = "--link" ]]; then + builtin print -r "You can copy the error messages and submit" + builtin print -r "error-report at: https://github.com/zdharma-continuum/zinit-module/issues" else - builtin print -r -- "${ZINIT[col-info]}Status for ${${local_dir:h}##*--}/$filename${ZINIT[col-rst]}" - ( builtin cd -q "$local_dir"; command ls -lth $filename ) - retval=$? - builtin print + builtin print -r "To load the module, add following 2 lines to .zshrc, at top:" + builtin print -r " module_path+=( \"${ZINIT[MODULE_DIR]}/Src\" )" + builtin print -r " zmodload zdharma_continuum/zinit" + builtin print -r "" + builtin print -r "After loading, use command \`zpmod' to communicate with the module." + builtin print -r "See \`zpmod -h' for more information." fi - else - (( ${+functions[zi::setup-plugin-dir]} )) || builtin source ${ZINIT[BIN_DIR]}"/zinit-install.zsh" - ICE=( "${(kv)ICE2[@]}" ) - zi::update-snippet "${ICE2[teleid]:-$URL}" - retval=$? + elif [[ "$1" = (help|usage) ]]; then + builtin print -r "Usage: zinit module {build|info|help} [options]" + builtin print -r " zinit module build [--clean]" + builtin print -r " zinit module info [--link]" + builtin print -r "" + builtin print -r "To start using the zinit Zsh module run: \`zinit module build'" + builtin print -r "and follow the instructions. Option --clean causes \`make distclean'" + builtin print -r "to be run. To display the instructions on loading the module, run:" + builtin print -r "\`zinit module info'." fi - - ICE=() - - if (( PUPDATE && ZINIT[annex-multi-flag:pull-active] > 0 )) { - builtin print ${ZINIT[annex-multi-flag:pull-active]} >! $PUFILE.ind - } - - return $retval } # ]]] -# FUNCTION: zi::update-or-status-all [[[ -# Updates (git pull) or does `git status` for all existing plugins. -# This includes also plugins that are not loaded into Zsh (but exist -# on disk). Also updates (i.e. redownloads) snippets. -# -# User-action entry point. -zi::update-or-status-all() { +# FUNCTION: zi::recall [[[ +zi::recall() { builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob nullglob warncreateglobal typesetsilent noshortloops - - local -F2 SECONDS=0 - - zi::self-update -q + setopt extendedglob warncreateglobal typesetsilent noshortloops - [[ $2 = restart ]] && \ - +zi::message "{msg2}Restarting the update with the new codebase loaded.{rst}"$'\n' + local -A ice + local el val cand1 cand2 local_dir filename is_snippet - local file - integer sum el update_rc - for file ( "" -side -install -autoload ) { - zi::get-mtime-into "${ZINIT[BIN_DIR]}/zinit$file.zsh" el; sum+=el - } + local -a ice_order nval_ices output + ice_order=( + ${(s.|.)ZINIT[ice-list]} - # Reload Zinit? - if [[ $2 != restart ]] && (( ZINIT[mtime] + ZINIT[mtime-side] + - ZINIT[mtime-install] + ZINIT[mtime-autoload] != sum - )) { - +zi::message "{msg2}Detected Zinit update in another session -" \ - "{pre}reloading Zinit{msg2}{…}{rst}" - source $ZINIT[BIN_DIR]/zinit.zsh - source $ZINIT[BIN_DIR]/zinit-side.zsh - source $ZINIT[BIN_DIR]/zinit-install.zsh - source $ZINIT[BIN_DIR]/zinit-autoload.zsh - for file ( "" -side -install -autoload ) { - zi::get-mtime-into "${ZINIT[BIN_DIR]}/zinit$file.zsh" "ZINIT[mtime$file]" - } - +zi::message "%B{pname}Done.{rst}"$'\n' - zi::update-or-status-all "$1" restart - return $? - } + # Include all additional ices – after + # stripping them from the possible: '' + ${(@)${(@Akons:|:u)${ZINIT_EXTS[ice-mods]//\'\'/}}/(#s)<->-/} + ) + nval_ices=( + ${(s.|.)ZINIT[nval-ice-list]} + # Include only those additional ices, + # don't have the '' in their name, i.e. + # aren't designed to hold value + ${(@)${(@)${(@Akons:|:u)ZINIT_EXTS[ice-mods]}:#*\'\'*}/(#s)<->-/} - integer retval + # Must be last + svn + ) + zi::compute-ice "$1${${1:#(%|/)*}:+${2:+/}}$2" "pack" \ + ice local_dir filename is_snippet || return 1 - if (( OPTS[opt_-p,--parallel] )) && [[ $1 = update ]] { - (( !OPTS[opt_-q,--quiet] )) && \ - +zi::message '{info2}Parallel Update Starts Now{…}{rst}' - zi::update-all-parallel - retval=$? - zi::compinit 1 1 &>/dev/null - rehash - if (( !OPTS[opt_-q,--quiet] )) { - +zi::message "{msg2}The update took {obj}${SECONDS}{msg2} seconds{rst}" + [[ -e $local_dir ]] && { + for el ( ${ice_order[@]} ) { + val="${ice[$el]}" + cand1="${(qqq)val}" + cand2="${(qq)val}" + if [[ -n "$val" ]] { + [[ "${cand1/\\\$/}" != "$cand1" || "${cand1/\\\!/}" != "$cand1" ]] && output+=( "$el$cand2" ) || output+=( "$el$cand1" ) + } elif [[ ${+ice[$el]} = 1 && -n "${nval_ices[(r)$el]}" ]] { + output+=( "$el" ) + } } - return $retval - } - - local st=$1 id_as repo snip pd user plugin - integer PUPDATE=0 - local -A ICE + if [[ ${#output} = 0 ]]; then + builtin print -zr "# No Ice modifiers" + else + builtin print -zr "zinit ice ${output[*]}; zinit " + fi + +zi::deploy-message @rst + } || builtin print -r -- "No such plugin or snippet" +} # ]]] +# FUNCTION: zi::recently [[[ +# Shows plugins that obtained commits in specified past time. +# +# User-action entry point. +# +# $1 - time spec, e.g. "1 week" +zi::recently() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt nullglob extendedglob warncreateglobal \ + typesetsilent noshortloops + local IFS=. + local gitout + local timespec=${*// ##/.} + timespec=${timespec//.##/.} + [[ -z $timespec ]] && timespec=1.week - if (( OPTS[opt_-s,--snippets] || !OPTS[opt_-l,--plugins] )) { - local -a snipps - snipps=( ${ZINIT[SNIPPETS_DIR]}/**/(._zinit|._zplugin)(ND) ) + typeset -a plugins + plugins=( ${ZINIT[PLUGINS_DIR]}/*(DN-/) ) - [[ $st != status && ${OPTS[opt_-q,--quiet]} != 1 && -n $snipps ]] && \ - +zi::message "{info}Note:{rst} updating also unloaded snippets" + local p uspl1 + for p in ${plugins[@]}; do + uspl1=${p:t} + [[ $uspl1 = custom || $uspl1 = _local---zinit ]] && continue - for snip ( ${ZINIT[SNIPPETS_DIR]}/**/(._zinit|._zplugin)/mode(D) ) { - [[ ! -f ${snip:h}/url ]] && continue - [[ -f ${snip:h}/id-as ]] && \ - id_as="$(<${snip:h}/id-as)" || \ - id_as= - zi::update-or-status-snippet "$st" "${id_as:-$(<${snip:h}/url)}" - ICE=() - } - [[ -n $snipps ]] && builtin print - } + pushd "$p" >/dev/null || continue + if [[ -d .git ]]; then + gitout=`command git log --all --max-count=1 --since=$timespec 2>/dev/null` + if [[ -n $gitout ]]; then + zi::any-colorify-as-uspl2 "$uspl1" + builtin print -r -- "$REPLY" + fi + fi + popd >/dev/null + done +} # ]]] +# FUNCTION: zi::run-delete-hooks [[[ +zi::run-delete-hooks() { + if [[ -n ${ICE[atdelete]} ]]; then + zi::countdown "atdelete" && ( (( ${+ICE[nocd]} == 0 )) && \ + { builtin cd -q "$5" && eval "${ICE[atdelete]}"; ((1)); } || \ + eval "${ICE[atdelete]}" ) + fi - ICE=() + local -a arr + local key - if (( OPTS[opt_-s,--snippets] && !OPTS[opt_-l,--plugins] )) { - return - } + # Run annexes' atdelete hooks + reply=( + ${(on)ZINIT_EXTS2[(I)zinit hook:atdelete-pre <->]} + ${(on)ZINIT_EXTS[(I)z-annex hook:atdelete-<-> <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:atdelete-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" "$1" "$2" $3 "$4" "$5" "${${key##(zinit|z-annex) hook:}%% <->}" delete:TODO + done +} # ]]] +# FUNCTION: zi::search-completions [[[ +# While zi::show-completions() shows what completions are +# installed, this functions searches through all plugin dirs +# showing what's available in general (for installation). +# +# User-action entry point. +zi::search-completions() { + builtin setopt localoptions nullglob extendedglob nokshglob noksharrays - if [[ $st = status ]]; then - (( !OPTS[opt_-q,--quiet] )) && \ - +zi::message "{info}Note:{rst} status done also for unloaded plugins" - else - (( !OPTS[opt_-q,--quiet] )) && \ - +zi::message "{info}Note:{rst} updating also unloaded plugins" - fi + typeset -a plugin_paths + plugin_paths=( "${ZINIT[PLUGINS_DIR]}"/*(DN) ) - ZINIT[first-plugin-mark]=init + # Find longest plugin name. Things are ran twice here, first pass + # is to get longest name of plugin which is having any completions + integer longest=0 + typeset -a completions + local pp + for pp in "${plugin_paths[@]}"; do + completions=( "$pp"/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN^/) ) + if [[ "${#completions[@]}" -gt 0 ]]; then + local pd="${pp:t}" + [[ "${#pd}" -gt "$longest" ]] && longest="${#pd}" + fi + done - for repo in ${ZINIT[PLUGINS_DIR]}/*; do - pd=${repo:t} + builtin print "${ZINIT[col-info]}[+]${ZINIT[col-rst]} is installed, ${ZINIT[col-p]}[-]${ZINIT[col-rst]} uninstalled, ${ZINIT[col-error]}[+-]${ZINIT[col-rst]} partially installed" - # Two special cases - [[ $pd = custom || $pd = _local---zinit ]] && continue + local c + for pp in "${plugin_paths[@]}"; do + completions=( "$pp"/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN^/) ) - zi::any-colorify-as-uspl2 "$pd" + if [[ "${#completions[@]}" -gt 0 ]]; then + # Array of completions, e.g. ( _cp _xauth ) + completions=( "${completions[@]:t}" ) - # Check if repository has a remote set - if [[ -f $repo/.git/config ]]; then - local -a config - config=( ${(f)"$(<$repo/.git/config)"} ) - if [[ ${#${(M)config[@]:#\[remote[[:blank:]]*\]}} -eq 0 ]]; then - if (( !OPTS[opt_-q,--quiet] )) { - [[ $pd = _local---* ]] && \ - builtin print -- "\nSkipping local plugin $REPLY" || \ - builtin print "\n$REPLY doesn't have a remote set, will not fetch" - } - continue + # Detect if the completions are installed + integer all_installed="${#completions[@]}" + for c in "${completions[@]}"; do + if [[ -e "${ZINIT[COMPLETIONS_DIR]}/$c" || -e "${ZINIT[COMPLETIONS_DIR]}/${c#_}" ]]; then + (( all_installed -- )) + fi + done + + if [[ "$all_installed" -eq "${#completions[@]}" ]]; then + builtin print -n "${ZINIT[col-p]}[-]${ZINIT[col-rst]} " + elif [[ "$all_installed" -eq "0" ]]; then + builtin print -n "${ZINIT[col-info]}[+]${ZINIT[col-rst]} " + else + builtin print -n "${ZINIT[col-error]}[+-]${ZINIT[col-rst]} " fi - fi - zi::any-to-user-plugin "$pd" - local user=${reply[-2]} plugin=${reply[-1]} + # Convert directory name to colorified $user/$plugin + zi::any-colorify-as-uspl2 "${pp:t}" - # Must be a git repository or a binary release - if [[ ! -d $repo/.git && ! -f $repo/._zinit/is_release ]]; then - (( !OPTS[opt_-q,--quiet] )) && \ - builtin print "$REPLY: not a git repository" - continue - fi + # Adjust for escape code (nasty, utilizes fact that + # ${ZINIT[col-rst]} is used twice, so as a $ZINIT_COL) + integer adjust_ec=$(( ${#ZINIT[col-rst]} * 2 + ${#ZINIT[col-uname]} + ${#ZINIT[col-pname]} )) - if [[ $st = status ]]; then - builtin print "\nStatus for plugin $REPLY" - ( builtin cd -q "$repo"; command git status ) - else - (( !OPTS[opt_-q,--quiet] )) && builtin print "Updating $REPLY" || builtin print -n . - zi::update-or-status update "$user" "$plugin" - update_rc=$? - [[ $update_rc -ne 0 ]] && { - +zi::message "🚧{warn}Warning: {pid}${user}/${plugin} {warn}update returned {obj}$update_rc" - retval=$? - } + builtin print "${(r:longest+adjust_ec:: :)REPLY} ${(j:, :)completions}" fi done - - zi::compinit 1 1 &>/dev/null - if (( !OPTS[opt_-q,--quiet] )) { - +zi::message "{msg2}The update took {obj}${SECONDS}{msg2} seconds{rst}" - } - - return "$retval" } # ]]] -# FUNCTION: zi::update-all-parallel [[[ -zi::update-all-parallel() { +# FUNCTION: zi::self-update [[[ +# Updates Zinit code (does a git pull) +zi::self-update() { builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob warncreateglobal typesetsilent \ - noshortloops nomonitor nonotify + setopt extendedglob typesetsilent warncreateglobal - local id_as repo snip uspl user plugin PUDIR="$(mktemp -d)" + [[ $1 = -q ]] && +zi::message "{pre}[self-update]{info} updating zinit repository{msg2}" \ - local -A PUAssocArray map - map=( / -- "=" -EQ- "?" -QM- "&" -AMP- : - ) - local -a files - integer main_counter counter PUPDATE=1 + local nl=$'\n' escape=$'\x1b[' + local current_branch=$(git -C $ZINIT[BIN_DIR] rev-parse --abbrev-ref HEAD) + # local current_branch='main' + local -a lines + ( + builtin cd -q "$ZINIT[BIN_DIR]" \ + && +zi::message -n "{pre}[self-update]{info} fetching latest changes from {obj}$current_branch{info} branch$nl{rst}" \ + && command git fetch --quiet \ + && lines=( ${(f)"$(command git log --color --date=short --pretty=format:'%Cgreen%cd %h %Creset%s %Cred%d%Creset || %b' ..origin/HEAD)"} ) + if (( ${#lines} > 0 )); then + # Remove the (origin/main ...) segments, to expect only tags to appear + lines=( "${(S)lines[@]//\(([,[:blank:]]#(origin|HEAD|master|main)[^a-zA-Z]##(HEAD|origin|master|main)[,[:blank:]]#)#\)/}" ) + # Remove " ||" if it ends the line (i.e. no additional text from the body) + lines=( "${lines[@]/ \|\|[[:blank:]]#(#e)/}" ) + # If there's no ref-name, 2 consecutive spaces occur - fix this + lines=( "${lines[@]/(#b)[[:space:]]#\|\|[[:space:]]#(*)(#e)/|| ${match[1]}}" ) + lines=( "${lines[@]/(#b)$escape([0-9]##)m[[:space:]]##${escape}m/$escape${match[1]}m${escape}m}" ) + # Replace what follows "|| ..." with the same thing but with no + # newlines, and also only first 10 words (the (w)-flag enables + # word-indexing) + lines=( "${lines[@]/(#b)[[:blank:]]#\|\|(*)(#e)/| ${${match[1]//$nl/ }[(w)1,(w)10]}}" ) + builtin print -rl -- "${lines[@]}" | zi::pager + builtin print + fi + if [[ $1 != -q ]] { + command git pull --no-stat --ff-only origin main + } else { + command git pull --no-stat --quiet --ff-only origin main + } + ) + if [[ $1 != -q ]] { + +zi::message "{pre}[self-update]{info} compiling zinit via {obj}zcompile{rst}" + } + command rm -f $ZINIT[BIN_DIR]/*.zwc(DN) + zcompile -U $ZINIT[BIN_DIR]/zinit.zsh + zcompile -U $ZINIT[BIN_DIR]/zinit-{'side','install','autoload','additional'}.zsh + zcompile -U $ZINIT[BIN_DIR]/share/git-process-output.zsh + # Load for the current session + [[ $1 != -q ]] && +zi::message "{pre}[self-update]{info} reloading zinit for the current session{rst}" - files=( ${ZINIT[SNIPPETS_DIR]}/**/(._zinit|._zplugin)/mode(ND) ) - main_counter=${#files} - if (( OPTS[opt_-s,--snippets] || !OPTS[opt_-l,--plugins] )) { - for snip ( "${files[@]}" ) { - main_counter=main_counter-1 - # The continue may cause the tail of processes to fall-through to the following plugins-specific `wait' - # Should happen only in a very special conditions - # TODO handle this - [[ ! -f ${snip:h}/url ]] && continue - [[ -f ${snip:h}/id-as ]] && \ - id_as="$(<${snip:h}/id-as)" || \ - id_as= + # +zi::message "{pre}[self-update]{info} resetting zinit repository via{rst}: {cmd}${ICE[reset]:-git reset --hard HEAD}{rst}" + source $ZINIT[BIN_DIR]/zinit.zsh + zcompile -U $ZINIT[BIN_DIR]/zinit-{'side','install','autoload'}.zsh + # Read and remember the new modification timestamps + local file + for file ( "" -side -install -autoload ) { + zi::get-mtime-into "${ZINIT[BIN_DIR]}/zinit$file.zsh" "ZINIT[mtime$file]" + } +} # ]]] - counter+=1 - local ef_id="${id_as:-$(<${snip:h}/url)}" - local PUFILEMAIN=${${ef_id#/}//(#m)[\/=\?\&:]/${map[$MATCH]}} - local PUFILE=$PUDIR/${counter}_$PUFILEMAIN.out +# FUNCTION: zi::show-all-reports [[[ +# Displays reports of all loaded plugins. +# +# User-action entry point. +zi::show-all-reports() { + local i + for i in "${ZINIT_REGISTERED_PLUGINS[@]}"; do + [[ "$i" = "_local/zinit" ]] && continue + zi::show-report "$i" + done +} # ]]] +# FUNCTION: zi::show-completions [[[ +# Display installed (enabled and disabled), completions. Detect +# stray and improper ones. +# +# Completions live even when plugin isn't loaded - if they are +# installed and enabled. +# +# User-action entry point. +zi::show-completions() { + builtin setopt localoptions nullglob extendedglob nokshglob noksharrays + local count="${1:-3}" - zi::update-or-status-snippet "$st" "$ef_id" &>! $PUFILE & + typeset -a completions + completions=( "${ZINIT[COMPLETIONS_DIR]}"/_[^_.]*~*.zwc "${ZINIT[COMPLETIONS_DIR]}"/[^_.]*~*.zwc ) - PUAssocArray[$!]=$PUFILE + local cpath c o s group - zi::wait-for-update-jobs snippets - } - } + # Prepare readlink command for establishing + # completion's owner + zi::prepare-readlink + local rdlink="$REPLY" - counter=0 - PUAssocArray=() + float flmax=${#completions} flcur=0 + typeset -F1 flper - if (( OPTS[opt_-l,--plugins] || !OPTS[opt_-s,--snippets] )) { - local -a files2 - files=( ${ZINIT[PLUGINS_DIR]}/*(ND/) ) + local -A owner_to_group + local -a packs splitted - # Pre-process plugins - for repo ( $files ) { - uspl=${repo:t} - # Two special cases - [[ $uspl = custom || $uspl = _local---zinit ]] && continue + integer disabled unknown stray + for cpath in "${completions[@]}"; do + c="${cpath:t}" + [[ "${c#_}" = "${c}" ]] && disabled=1 || disabled=0 + c="${c#_}" - # Check if repository has a remote set - if [[ -f $repo/.git/config ]] { - local -a config - config=( ${(f)"$(<$repo/.git/config)"} ) - if [[ ${#${(M)config[@]:#\[remote[[:blank:]]*\]}} -eq 0 ]] { - continue - } - } + # This will resolve completion's symlink to obtain + # information about the repository it comes from, i.e. + # about user and plugin, taken from directory name + zi::get-completion-owner "$cpath" "$rdlink" + [[ "$REPLY" = "[unknown]" ]] && unknown=1 || unknown=0 + o="$REPLY" - zi::any-to-user-plugin "$uspl" - local user=${reply[-2]} plugin=${reply[-1]} + # If we successfully read a symlink (unknown == 0), test if it isn't broken + stray=0 + if (( unknown == 0 )); then + [[ ! -f "$cpath" ]] && stray=1 + fi - # Must be a git repository or a binary release - if [[ ! -d $repo/.git && ! -f $repo/._zinit/is_release ]] { - continue - } - files2+=( $repo ) - } + s=$(( 1*disabled + 2*unknown + 4*stray )) - main_counter=${#files2} - for repo ( "${files2[@]}" ) { - main_counter=main_counter-1 + owner_to_group[${o}--$s]+="$c;" + group="${owner_to_group[${o}--$s]%;}" + splitted=( "${(s:;:)group}" ) - uspl=${repo:t} - id_as=${uspl//---//} + if [[ "${#splitted}" -ge "$count" ]]; then + packs+=( "${(q)group//;/, } ${(q)o} ${(q)s}" ) + unset "owner_to_group[${o}--$s]" + fi - counter+=1 - local PUFILEMAIN=${${id_as#/}//(#m)[\/=\?\&:]/${map[$MATCH]}} - local PUFILE=$PUDIR/${counter}_$PUFILEMAIN.out + (( ++ flcur )) + flper=$(( flcur / flmax * 100 )) + builtin print -u 2 -n -- "\r${flper}% " + done - zi::any-colorify-as-uspl2 "$uspl" - +zi::message "Updating $REPLY{…}" >! $PUFILE + for o in "${(k)owner_to_group[@]}"; do + group="${owner_to_group[$o]%;}" + s="${o##*--}" + o="${o%--*}" + packs+=( "${(q)group//;/, } ${(q)o} ${(q)s}" ) + done + packs=( "${(on)packs[@]}" ) - zi::any-to-user-plugin "$uspl" - local user=${reply[-2]} plugin=${reply[-1]} + builtin print -u 2 # newline after percent - zi::update-or-status update "$user" "$plugin" &>>! $PUFILE & + # Find longest completion name + integer longest=0 + local -a unpacked + for c in "${packs[@]}"; do + unpacked=( "${(Q@)${(z@)c}}" ) + [[ "${#unpacked[1]}" -gt "$longest" ]] && longest="${#unpacked[1]}" + done - PUAssocArray[$!]=$PUFILE + for c in "${packs[@]}"; do + unpacked=( "${(Q@)${(z@)c}}" ) # TODO: ${(Q)${(z@)c}[@]} ? - zi::wait-for-update-jobs plugins + zi::any-colorify-as-uspl2 "$unpacked[2]" + builtin print -n "${(r:longest+1:: :)unpacked[1]} $REPLY" - } - } - # Shouldn't happen - # (( ${#PUAssocArray} > 0 )) && wait ${(k)PUAssocArray} -} # ]]] -# FUNCTION: zi::wait-for-update-jobs [[[ -zi::wait-for-update-jobs() { - local tpe=$1 - if (( counter > OPTS[value] || main_counter == 0 )) { - wait ${(k)PUAssocArray} - local ind_file - for ind_file ( ${^${(von)PUAssocArray}}.ind(DN.) ) { - command cat ${ind_file:r} - (( !OPTS[opt_-d,--debug] && !ZINIT[DEBUG_MODE] )) && \ - command rm -f $ind_file - } - (( !OPTS[opt_-d,--debug] && !ZINIT[DEBUG_MODE] )) && \ - command rm -f ${(v)PUAssocArray} - counter=0 - PUAssocArray=() - } elif (( counter == 1 && !OPTS[opt_-q,--quiet] )) { - +zi::message "{obj}Spawning the next{num}" \ - "${OPTS[value]}{obj} concurrent update jobs" \ - "({msg2}${tpe}{obj}){…}{rst}" - } + (( unpacked[3] & 0x1 )) && builtin print -n " ${ZINIT[col-error]}[disabled]${ZINIT[col-rst]}" + (( unpacked[3] & 0x2 )) && builtin print -n " ${ZINIT[col-error]}[unknown file, clean with cclear]${ZINIT[col-rst]}" + (( unpacked[3] & 0x4 )) && builtin print -n " ${ZINIT[col-error]}[stray, clean with cclear]${ZINIT[col-rst]}" + builtin print + done } # ]]] -# FUNCTION: zi::show-zstatus [[[ -# Shows Zinit status, i.e. number of loaded plugins, -# of available completions, etc. +# FUNCTION: zi::show-debug-report [[[ +# Displays dtrace report (data recorded in interactive session). # # User-action entry point. -zi::show-zstatus() { - builtin setopt localoptions nullglob extendedglob nokshglob noksharrays - - local infoc="${ZINIT[col-info2]}" +zi::show-debug-report() { + zi::show-report "_dtrace/_dtrace" +} # ]]] +# FUNCTION: zi::show-registered-plugins [[[ +# Lists loaded plugins (subcommands list, lodaded) +zi::show-registered-plugins() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + setopt extendedglob warncreateglobal typesetsilent noshortloops - +zi::message "Zinit's main directory: {file}${ZINIT[HOME_DIR]}{rst}" - +zi::message "Zinit's binary directory: {file}${ZINIT[BIN_DIR]}{rst}" - +zi::message "Plugin directory: {file}${ZINIT[PLUGINS_DIR]}{rst}" - +zi::message "Completions directory: {file}${ZINIT[COMPLETIONS_DIR]}{rst}" + typeset -a filtered + local keyword="$1" - # Without _zlocal/zinit - +zi::message "Loaded plugins: {num}$(( ${#ZINIT_REGISTERED_PLUGINS[@]} - 1 )){rst}" + keyword="${keyword## ##}" + keyword="${keyword%% ##}" + if [[ -n "$keyword" ]]; then + builtin print "Installed plugins matching ${ZINIT[col-info]}$keyword${ZINIT[col-rst]}:" + filtered=( "${(M)ZINIT_REGISTERED_PLUGINS[@]:#*$keyword*}" ) + else + filtered=( "${ZINIT_REGISTERED_PLUGINS[@]}" ) + fi - # Count light-loaded plugins - integer light=0 - local s - for s in "${(@v)ZINIT[(I)STATES__*]}"; do - [[ "$s" = 1 ]] && (( light ++ )) + local i + for i in "${filtered[@]}"; do + [[ "$i" = "_local/zinit" ]] && continue + zi::any-colorify-as-uspl2 "$i" + # Mark light loads + [[ "${ZINIT[STATES__$i]}" = "1" ]] && REPLY="$REPLY ${ZINIT[col-info]}*${ZINIT[col-rst]}" + builtin print -r -- "$REPLY" done - # Without _zlocal/zinit - +zi::message "Light loaded: {num}$(( light - 1 )){rst}" +} # ]]] +# FUNCTION: zi::show-report [[[ +# Displays report of the plugin given. +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user (+ plugin in $2), plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::show-report() { + setopt localoptions extendedglob warncreateglobal typesetsilent noksharrays + zi::any-to-user-plugin "$1" "$2" + local user="${reply[-2]}" plugin="${reply[-1]}" uspl2="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" - # Downloaded plugins, without _zlocal/zinit, custom - typeset -a plugins - plugins=( "${ZINIT[PLUGINS_DIR]}"/*(DN) ) - +zi::message "Downloaded plugins: {num}$(( ${#plugins} - 1 )){rst}" + # Allow debug report + if [[ "$user/$plugin" != "_dtrace/_dtrace" ]]; then + zi::exists-message "$user" "$plugin" || return 1 + fi - # Number of enabled completions, with _zlocal/zinit - typeset -a completions - completions=( "${ZINIT[COMPLETIONS_DIR]}"/_[^_.]*~*.zwc(DN) ) - +zi::message "Enabled completions: {num}${#completions[@]}{rst}" + # Print title + builtin printf "${ZINIT[col-title]}Report for${ZINIT[col-rst]} %s%s plugin\n"\ + "${user:+${ZINIT[col-uname]}$user${ZINIT[col-rst]}}${${user:#(%|/)*}:+/}"\ + "${ZINIT[col-pname]}$plugin${ZINIT[col-rst]}" - # Number of disabled completions, with _zlocal/zinit - completions=( "${ZINIT[COMPLETIONS_DIR]}"/[^_.]*~*.zwc(DN) ) - +zi::message "Disabled completions: {num}${#completions[@]}{rst}" + # Print "----------" + local msg="Report for $user${${user:#(%|/)*}:+/}$plugin plugin" + builtin print -- "${ZINIT[col-bar]}${(r:${#msg}::-:)tmp__}${ZINIT[col-rst]}" - # Number of completions existing in all plugins - completions=( "${ZINIT[PLUGINS_DIR]}"/*/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN) ) - +zi::message "Completions available overall: {num}${#completions[@]}{rst}" + local -A map + map=( + Error: "${ZINIT[col-error]}" + Warning: "${ZINIT[col-error]}" + Note: "${ZINIT[col-note]}" + ) + # Print report gathered via shadowing + () { + setopt localoptions extendedglob + builtin print -rl -- "${(@)${(f@)ZINIT_REPORTS[$uspl2]}/(#b)(#s)([^[:space:]]##)([[:space:]]##)/${map[${match[1]}]:-${ZINIT[col-keyword]}}${match[1]}${ZINIT[col-rst]}${match[2]}}" + } - # Enumerate snippets loaded - # }, ${infoc}{rst}", j:, :, {msg}"$'\e[0m, +zi::message h - +zi::message -n "Snippets loaded: " - local sni - for sni in ${(onv)ZINIT_SNIPPETS[@]}; do - +zi::message -n "{url}${sni% <[^>]#>}{rst} ${(M)sni%<[^>]##>}, " - done - [[ -z $sni ]] && builtin print -n " " - builtin print '\b\b ' + # Print report gathered via $functions-diffing + REPLY="" + zi::diff-functions-compute "$uspl2" + zi::format-functions "$uspl2" + [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}Functions created:${ZINIT[col-rst]}"$'\n'"$REPLY" - # Number of compiled plugins - typeset -a matches m - integer count=0 - matches=( ${ZINIT[PLUGINS_DIR]}/*/*.zwc(DN) ) + # Print report gathered via $options-diffing + REPLY="" + zi::diff-options-compute "$uspl2" + zi::format-options "$uspl2" + [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}Options changed:${ZINIT[col-rst]}"$'\n'"$REPLY" - local cur_plugin="" uspl1 - for m in "${matches[@]}"; do - uspl1="${${m:h}:t}" + # Print report gathered via environment diffing + REPLY="" + zi::diff-env-compute "$uspl2" + zi::format-env "$uspl2" "1" + [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}PATH elements added:${ZINIT[col-rst]}"$'\n'"$REPLY" - if [[ "$cur_plugin" != "$uspl1" ]]; then - (( count ++ )) - cur_plugin="$uspl1" - fi - done + REPLY="" + zi::format-env "$uspl2" "2" + [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}FPATH elements added:${ZINIT[col-rst]}"$'\n'"$REPLY" - +zi::message "Compiled plugins: {num}$count{rst}" + # Print report gathered via parameter diffing + zi::diff-parameter-compute "$uspl2" + zi::format-parameter "$uspl2" + [[ -n "$REPLY" ]] && builtin print "${ZINIT[col-p]}Variables added or redefined:${ZINIT[col-rst]}"$'\n'"$REPLY" + + # Print what completions plugin has + zi::find-completions-of-plugin "$user" "$plugin" + typeset -a completions + completions=( "${reply[@]}" ) + + if [[ "${#completions[@]}" -ge "1" ]]; then + builtin print "${ZINIT[col-p]}Completions:${ZINIT[col-rst]}" + zi::check-which-completions-are-installed "${completions[@]}" + typeset -a installed + installed=( "${reply[@]}" ) + + zi::check-which-completions-are-enabled "${completions[@]}" + typeset -a enabled + enabled=( "${reply[@]}" ) + + integer count="${#completions[@]}" idx + for (( idx=1; idx <= count; idx ++ )); do + builtin print -n "${completions[idx]:t}" + if [[ "${installed[idx]}" != "1" ]]; then + builtin print -n " ${ZINIT[col-uninst]}[not installed]${ZINIT[col-rst]}" + else + if [[ "${enabled[idx]}" = "1" ]]; then + builtin print -n " ${ZINIT[col-info]}[enabled]${ZINIT[col-rst]}" + else + builtin print -n " ${ZINIT[col-error]}[disabled]${ZINIT[col-rst]}" + fi + fi + builtin print + done + builtin print + fi } # ]]] # FUNCTION: zi::show-times [[[ # Shows loading times of all loaded plugins. @@ -2189,118 +2046,129 @@ zi::show-times() { done builtin print "Total: $sum sec" } # ]]] -# FUNCTION: zi::list-bindkeys [[[ -zi::list-bindkeys() { - local uspl2 uspl2col sw first=1 - local -a string_widget +# FUNCTION: zi::show-zstatus [[[ +# Shows Zinit status, i.e. number of loaded plugins, +# of available completions, etc. +# +# User-action entry point. +zi::show-zstatus() { + builtin setopt localoptions nullglob extendedglob nokshglob noksharrays - # KSH_ARRAYS immunity - integer correct=0 - [[ -o "KSH_ARRAYS" ]] && correct=1 + local infoc="${ZINIT[col-info2]}" - for uspl2 in "${(@ko)ZINIT[(I)BINDKEYS__*]}"; do - [[ -z "${ZINIT[$uspl2]}" ]] && continue + +zi::message "Zinit's main directory: {file}${ZINIT[HOME_DIR]}{rst}" + +zi::message "Zinit's binary directory: {file}${ZINIT[BIN_DIR]}{rst}" + +zi::message "Plugin directory: {file}${ZINIT[PLUGINS_DIR]}{rst}" + +zi::message "Completions directory: {file}${ZINIT[COMPLETIONS_DIR]}{rst}" - (( !first )) && builtin print - first=0 + # Without _zlocal/zinit + +zi::message "Loaded plugins: {num}$(( ${#ZINIT_REGISTERED_PLUGINS[@]} - 1 )){rst}" - uspl2="${uspl2#BINDKEYS__}" + # Count light-loaded plugins + integer light=0 + local s + for s in "${(@v)ZINIT[(I)STATES__*]}"; do + [[ "$s" = 1 ]] && (( light ++ )) + done + # Without _zlocal/zinit + +zi::message "Light loaded: {num}$(( light - 1 )){rst}" - zi::any-colorify-as-uspl2 "$uspl2" - uspl2col="$REPLY" - builtin print "$uspl2col" + # Downloaded plugins, without _zlocal/zinit, custom + typeset -a plugins + plugins=( "${ZINIT[PLUGINS_DIR]}"/*(DN) ) + +zi::message "Downloaded plugins: {num}$(( ${#plugins} - 1 )){rst}" - string_widget=( "${(z@)ZINIT[BINDKEYS__$uspl2]}" ) - for sw in "${(Oa)string_widget[@]}"; do - [[ -z "$sw" ]] && continue - # Remove one level of quoting to split using (z) - sw="${(Q)sw}" - typeset -a sw_arr - sw_arr=( "${(z@)sw}" ) + # Number of enabled completions, with _zlocal/zinit + typeset -a completions + completions=( "${ZINIT[COMPLETIONS_DIR]}"/_[^_.]*~*.zwc(DN) ) + +zi::message "Enabled completions: {num}${#completions[@]}{rst}" - # Remove one level of quoting to pass to bindkey - local sw_arr1="${(Q)sw_arr[1-correct]}" # Keys - local sw_arr2="${(Q)sw_arr[2-correct]}" # Widget - local sw_arr3="${(Q)sw_arr[3-correct]}" # Optional -M or -A or -N - local sw_arr4="${(Q)sw_arr[4-correct]}" # Optional map name - local sw_arr5="${(Q)sw_arr[5-correct]}" # Optional -R (not with -A, -N) + # Number of disabled completions, with _zlocal/zinit + completions=( "${ZINIT[COMPLETIONS_DIR]}"/[^_.]*~*.zwc(DN) ) + +zi::message "Disabled completions: {num}${#completions[@]}{rst}" - if [[ "$sw_arr3" = "-M" && "$sw_arr5" != "-R" ]]; then - builtin print "bindkey $sw_arr1 $sw_arr2 ${ZINIT[col-info]}for keymap $sw_arr4${ZINIT[col-rst]}" - elif [[ "$sw_arr3" = "-M" && "$sw_arr5" = "-R" ]]; then - builtin print "${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey $sw_arr1 $sw_arr2 ${ZINIT[col-info]}mapped to $sw_arr4${ZINIT[col-rst]}" - elif [[ "$sw_arr3" != "-M" && "$sw_arr5" = "-R" ]]; then - builtin print "${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey $sw_arr1 $sw_arr2" - elif [[ "$sw_arr3" = "-A" ]]; then - builtin print "Override of keymap \`main'" - elif [[ "$sw_arr3" = "-N" ]]; then - builtin print "New keymap \`$sw_arr4'" - else - builtin print "bindkey $sw_arr1 $sw_arr2" - fi - done + # Number of completions existing in all plugins + completions=( "${ZINIT[PLUGINS_DIR]}"/*/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN) ) + +zi::message "Completions available overall: {num}${#completions[@]}{rst}" + + # Enumerate snippets loaded + # }, ${infoc}{rst}", j:, :, {msg}"$'\e[0m, +zi::message h + +zi::message -n "Snippets loaded: " + local sni + for sni in ${(onv)ZINIT_SNIPPETS[@]}; do + +zi::message -n "{url}${sni% <[^>]#>}{rst} ${(M)sni%<[^>]##>}, " done -} # ]]] -# FUNCTION: zi::compiled [[[ -# Displays list of plugins that are compiled. -# -# User-action entry point. -zi::compiled() { - builtin setopt localoptions nullglob + [[ -z $sni ]] && builtin print -n " " + builtin print '\b\b ' + # Number of compiled plugins typeset -a matches m + integer count=0 matches=( ${ZINIT[PLUGINS_DIR]}/*/*.zwc(DN) ) - if [[ "${#matches[@]}" -eq "0" ]]; then - builtin print "No compiled plugins" - return 0 - fi - - local cur_plugin="" uspl1 file user plugin + local cur_plugin="" uspl1 for m in "${matches[@]}"; do - file="${m:t}" uspl1="${${m:h}:t}" - zi::any-to-user-plugin "$uspl1" - user="${reply[-2]}" plugin="${reply[-1]}" if [[ "$cur_plugin" != "$uspl1" ]]; then - [[ -n "$cur_plugin" ]] && builtin print # newline - zi::any-colorify-as-uspl2 "$user" "$plugin" - builtin print -r -- "$REPLY:" + (( count ++ )) cur_plugin="$uspl1" fi - - builtin print "$file" done + + +zi::message "Compiled plugins: {num}$count{rst}" } # ]]] -# FUNCTION: zi::compile-uncompile-all [[[ -# Compiles or uncompiles all existing (on disk) plugins. + +# FUNCTION: zi::stress [[[ +# Compiles plugin with various options on and off to see +# how well the code is written. The options are: +# +# NO_SHORT_LOOPS, IGNORE_BRACES, IGNORE_CLOSE_BRACES, SH_GLOB, +# CSH_JUNKIE_QUOTES, NO_MULTI_FUNC_DEF. # # User-action entry point. -zi::compile-uncompile-all() { - builtin setopt localoptions nullglob +# +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::stress() { + zi::any-to-user-plugin "$1" "$2" + local user="${reply[-2]}" plugin="${reply[-1]}" - local compile="$1" + zi::exists-physically-message "$user" "$plugin" || return 1 - typeset -a plugins - plugins=( "${ZINIT[PLUGINS_DIR]}"/*(DN) ) + zi::first "$1" "$2" || { + builtin print "${ZINIT[col-error]}No source file found, cannot stress${ZINIT[col-rst]}" + return 1 + } - local p user plugin - for p in "${plugins[@]}"; do - [[ "${p:t}" = "custom" || "${p:t}" = "_local---zinit" ]] && continue + local pdir_path="${reply[-2]}" fname="${reply[-1]}" - zi::any-to-user-plugin "${p:t}" - user="${reply[-2]}" plugin="${reply[-1]}" + integer compiled=1 + [[ -e "${fname}.zwc" ]] && command rm -f "${fname}.zwc" || compiled=0 - zi::any-colorify-as-uspl2 "$user" "$plugin" - builtin print -r -- "$REPLY:" + local -a ZINIT_STRESS_TEST_OPTIONS + ZINIT_STRESS_TEST_OPTIONS=( + "NO_SHORT_LOOPS" "IGNORE_BRACES" "IGNORE_CLOSE_BRACES" + "SH_GLOB" "CSH_JUNKIE_QUOTES" "NO_MULTI_FUNC_DEF" + ) - if [[ "$compile" = "1" ]]; then - zi::compile-plugin "$user" "$plugin" - else - zi::uncompile-plugin "$user" "$plugin" "1" - fi - done + ( + builtin emulate -LR ksh ${=${options[xtrace]:#off}:+-o xtrace} + builtin unsetopt shglob kshglob + for i in "${ZINIT_STRESS_TEST_OPTIONS[@]}"; do + builtin setopt "$i" + builtin print -n "Stress-testing ${fname:t} for option $i " + zcompile -UR "$fname" 2>/dev/null && { + builtin print "[${ZINIT[col-success]}Success${ZINIT[col-rst]}]" + } || { + builtin print "[${ZINIT[col-failure]}Fail${ZINIT[col-rst]}]" + } + builtin unsetopt "$i" + done + ) + + command rm -f "${fname}.zwc" + (( compiled )) && zcompile -U "$fname" } # ]]] # FUNCTION: zi::uncompile-plugin [[[ # Uncompiles given plugin. @@ -2337,1019 +2205,1152 @@ zi::uncompile-plugin() { command rm -f "$m" done } # ]]] - -# FUNCTION: zi::show-completions [[[ -# Display installed (enabled and disabled), completions. Detect -# stray and improper ones. -# -# Completions live even when plugin isn't loaded - if they are -# installed and enabled. +# FUNCTION: zi::unload [[[ +# 1. call the zsh plugin's standard *_plugin_unload function +# 2. call the code provided by the zsh plugin's standard @zsh-plugin-run-at-update +# 3. delete bindkeys (...) +# 4. delete zstyles +# 5. restore options +# 6. remove aliases +# 7. restore zle state +# 8. unfunction functions (created by plugin) +# 9. clean-up fpath and path +# 10. delete created variables +# 11. forget the plugin # -# User-action entry point. -zi::show-completions() { - builtin setopt localoptions nullglob extendedglob nokshglob noksharrays - local count="${1:-3}" - - typeset -a completions - completions=( "${ZINIT[COMPLETIONS_DIR]}"/_[^_.]*~*.zwc "${ZINIT[COMPLETIONS_DIR]}"/[^_.]*~*.zwc ) - - local cpath c o s group - - # Prepare readlink command for establishing - # completion's owner - zi::prepare-readlink - local rdlink="$REPLY" +# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) +# $2 - plugin (only when $1 - i.e. user - given) +zi::unload() { + zi::any-to-user-plugin "$1" "$2" + local uspl2="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" user="${reply[-2]}" plugin="${reply[-1]}" quiet="${${3:+1}:-0}" + local k - float flmax=${#completions} flcur=0 - typeset -F1 flper + zi::any-colorify-as-uspl2 "$uspl2" + (( quiet )) || builtin print -r -- "${ZINIT[col-bar]}---${ZINIT[col-rst]} Unloading plugin: $REPLY ${ZINIT[col-bar]}---${ZINIT[col-rst]}" - local -A owner_to_group - local -a packs splitted + local ___dir + [[ "$user" = "%" ]] && ___dir="$plugin" || ___dir="${ZINIT[PLUGINS_DIR]}/${user:+${user}---}${plugin//\//---}" - integer disabled unknown stray - for cpath in "${completions[@]}"; do - c="${cpath:t}" - [[ "${c#_}" = "${c}" ]] && disabled=1 || disabled=0 - c="${c#_}" + # KSH_ARRAYS immunity + integer correct=0 + [[ -o "KSH_ARRAYS" ]] && correct=1 - # This will resolve completion's symlink to obtain - # information about the repository it comes from, i.e. - # about user and plugin, taken from directory name - zi::get-completion-owner "$cpath" "$rdlink" - [[ "$REPLY" = "[unknown]" ]] && unknown=1 || unknown=0 - o="$REPLY" + # Allow unload for debug user + if [[ "$uspl2" != "_dtrace/_dtrace" ]]; then + zi::exists-message "$1" "$2" || return 1 + fi - # If we successfully read a symlink (unknown == 0), test if it isn't broken - stray=0 - if (( unknown == 0 )); then - [[ ! -f "$cpath" ]] && stray=1 - fi + zi::any-colorify-as-uspl2 "$1" "$2" + local uspl2col="$REPLY" - s=$(( 1*disabled + 2*unknown + 4*stray )) + # Store report of the plugin in variable LASTREPORT + typeset -g LASTREPORT + LASTREPORT=`zi::show-report "$1" "$2"` - owner_to_group[${o}--$s]+="$c;" - group="${owner_to_group[${o}--$s]%;}" - splitted=( "${(s:;:)group}" ) + # Call the Zsh Plugin's Standard *_plugin_unload function + (( ${+functions[${plugin}_plugin_unload]} )) && ${plugin}_plugin_unload - if [[ "${#splitted}" -ge "$count" ]]; then - packs+=( "${(q)group//;/, } ${(q)o} ${(q)s}" ) - unset "owner_to_group[${o}--$s]" - fi + # Call the code provided by the Zsh Plugin's Standard @zsh-plugin-run-at-update + local -a tmp + local -A sice + tmp=( "${(z@)ZINIT_SICE[$uspl2]}" ) + (( ${#tmp} > 1 && ${#tmp} % 2 == 0 )) && sice=( "${(Q)tmp[@]}" ) || sice=() - (( ++ flcur )) - flper=$(( flcur / flmax * 100 )) - builtin print -u 2 -n -- "\r${flper}% " - done + if [[ -n ${sice[ps-on-unload]} ]]; then + (( quiet )) || builtin print -r "Running plugin's provided unload code: ${ZINIT[col-info]}${sice[ps-on-unload][1,50]}${sice[ps-on-unload][51]:+…}${ZINIT[col-rst]}" + local ___oldcd="$PWD" + () { setopt localoptions noautopushd; builtin cd -q "$___dir"; } + eval "${sice[ps-on-unload]}" + () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; } + fi - for o in "${(k)owner_to_group[@]}"; do - group="${owner_to_group[$o]%;}" - s="${o##*--}" - o="${o%--*}" - packs+=( "${(q)group//;/, } ${(q)o} ${(q)s}" ) - done - packs=( "${(on)packs[@]}" ) + # 1. Delete done bindkeys + typeset -a string_widget + string_widget=( "${(z)ZINIT[BINDKEYS__$uspl2]}" ) + local sw + for sw in "${(Oa)string_widget[@]}"; do + [[ -z "$sw" ]] && continue + # Remove one level of quoting to split using (z) + sw="${(Q)sw}" + typeset -a sw_arr + sw_arr=( "${(z)sw}" ) - builtin print -u 2 # newline after percent + # Remove one level of quoting to pass to bindkey + local sw_arr1="${(Q)sw_arr[1-correct]}" # Keys + local sw_arr2="${(Q)sw_arr[2-correct]}" # Widget + local sw_arr3="${(Q)sw_arr[3-correct]}" # Optional previous-bound widget + local sw_arr4="${(Q)sw_arr[4-correct]}" # Optional -M or -A or -N + local sw_arr5="${(Q)sw_arr[5-correct]}" # Optional map name + local sw_arr6="${(Q)sw_arr[6-correct]}" # Optional -R (not with -A, -N) - # Find longest completion name - integer longest=0 - local -a unpacked - for c in "${packs[@]}"; do - unpacked=( "${(Q@)${(z@)c}}" ) - [[ "${#unpacked[1]}" -gt "$longest" ]] && longest="${#unpacked[1]}" + if [[ "$sw_arr4" = "-M" && "$sw_arr6" != "-R" ]]; then + if [[ -n "$sw_arr3" ]]; then + () { + builtin emulate -LR zsh -o extendedglob ${=${options[xtrace]:#off}:+-o xtrace} + (( quiet )) || builtin print -r "Restoring bindkey ${${(q)sw_arr1}//(#m)\\[\^\?\]\[\)\(\'\"\}\{\`]/${MATCH#\\}} $sw_arr3 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" + } + bindkey -M "$sw_arr5" "$sw_arr1" "$sw_arr3" + else + (( quiet )) || builtin print -r "Deleting bindkey ${(q)sw_arr1} $sw_arr2 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" + bindkey -M "$sw_arr5" -r "$sw_arr1" + fi + elif [[ "$sw_arr4" = "-M" && "$sw_arr6" = "-R" ]]; then + if [[ -n "$sw_arr3" ]]; then + (( quiet )) || builtin print -r "Restoring ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr3 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" + bindkey -RM "$sw_arr5" "$sw_arr1" "$sw_arr3" + else + (( quiet )) || builtin print -r "Deleting ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr2 ${ZINIT[col-info]}in map ${ZINIT[col-rst]}$sw_arr5" + bindkey -M "$sw_arr5" -Rr "$sw_arr1" + fi + elif [[ "$sw_arr4" != "-M" && "$sw_arr6" = "-R" ]]; then + if [[ -n "$sw_arr3" ]]; then + (( quiet )) || builtin print -r "Restoring ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr3" + bindkey -R "$sw_arr1" "$sw_arr3" + else + (( quiet )) || builtin print -r "Deleting ${ZINIT[col-info]}range${ZINIT[col-rst]} bindkey ${(q)sw_arr1} $sw_arr2" + bindkey -Rr "$sw_arr1" + fi + elif [[ "$sw_arr4" = "-A" ]]; then + (( quiet )) || builtin print -r "Linking backup-\`main' keymap \`$sw_arr5' back to \`main'" + bindkey -A "$sw_arr5" "main" + elif [[ "$sw_arr4" = "-N" ]]; then + (( quiet )) || builtin print -r "Deleting keymap \`$sw_arr5'" + bindkey -D "$sw_arr5" + else + if [[ -n "$sw_arr3" ]]; then + () { + builtin emulate -LR zsh -o extendedglob ${=${options[xtrace]:#off}:+-o xtrace} + (( quiet )) || builtin print -r "Restoring bindkey ${${(q)sw_arr1}//(#m)\\[\^\?\]\[\)\(\'\"\}\{\`]/${MATCH#\\}} $sw_arr3" + } + bindkey "$sw_arr1" "$sw_arr3" + else + (( quiet )) || builtin print -r "Deleting bindkey ${(q)sw_arr1} $sw_arr2" + bindkey -r "$sw_arr1" + fi + fi done - for c in "${packs[@]}"; do - unpacked=( "${(Q@)${(z@)c}}" ) # TODO: ${(Q)${(z@)c}[@]} ? + # 2. Delete created Zstyles - zi::any-colorify-as-uspl2 "$unpacked[2]" - builtin print -n "${(r:longest+1:: :)unpacked[1]} $REPLY" + typeset -a pattern_style + pattern_style=( "${(z)ZINIT[ZSTYLES__$uspl2]}" ) + local ps + for ps in "${(Oa)pattern_style[@]}"; do + [[ -z "$ps" ]] && continue + # Remove one level of quoting to split using (z) + ps="${(Q)ps}" + typeset -a ps_arr + ps_arr=( "${(z)ps}" ) - (( unpacked[3] & 0x1 )) && builtin print -n " ${ZINIT[col-error]}[disabled]${ZINIT[col-rst]}" - (( unpacked[3] & 0x2 )) && builtin print -n " ${ZINIT[col-error]}[unknown file, clean with cclear]${ZINIT[col-rst]}" - (( unpacked[3] & 0x4 )) && builtin print -n " ${ZINIT[col-error]}[stray, clean with cclear]${ZINIT[col-rst]}" - builtin print - done -} # ]]] -# FUNCTION: zi::clear-completions [[[ -# Delete stray and improper completions. -# -# Completions live even when plugin isn't loaded - if they are -# installed and enabled. -# -# User-action entry point. -zi::clear-completions() { - builtin setopt localoptions nullglob extendedglob nokshglob noksharrays + # Remove one level of quoting to pass to zstyle + local ps_arr1="${(Q)ps_arr[1-correct]}" + local ps_arr2="${(Q)ps_arr[2-correct]}" - typeset -a completions - completions=( "${ZINIT[COMPLETIONS_DIR]}"/_[^_.]*~*.zwc "${ZINIT[COMPLETIONS_DIR]}"/[^_.]*~*.zwc ) + (( quiet )) || builtin print "Deleting zstyle $ps_arr1 $ps_arr2" - # Find longest completion name - local cpath c - integer longest=0 - for cpath in "${completions[@]}"; do - c="${cpath:t}" - c="${c#_}" - [[ "${#c}" -gt "$longest" ]] && longest="${#c}" + zstyle -d "$ps_arr1" "$ps_arr2" done - zi::prepare-readlink - local rdlink="$REPLY" - - integer disabled unknown stray - for cpath in "${completions[@]}"; do - c="${cpath:t}" - [[ "${c#_}" = "${c}" ]] && disabled=1 || disabled=0 - c="${c#_}" + # 3. Restore changed options + # paranoid, don't want bad key/value pair error + zi::diff-options-compute "$uspl2" + integer empty=0 + zi::save-set-extendedglob + [[ "${ZINIT[OPTIONS__$uspl2]}" != *[$'! \t']* ]] && empty=1 + zi::restore-extendedglob - # This will resolve completion's symlink to obtain - # information about the repository it comes from, i.e. - # about user and plugin, taken from directory name - zi::get-completion-owner "$cpath" "$rdlink" - [[ "$REPLY" = "[unknown]" ]] && unknown=1 || unknown=0 - zi::any-colorify-as-uspl2 "$REPLY" + if (( empty != 1 )); then + typeset -A opts + opts=( "${(z)ZINIT[OPTIONS__$uspl2]}" ) + for k in "${(kon)opts[@]}"; do + # Internal options + [[ "$k" = "physical" ]] && continue - # If we successfully read a symlink (unknown == 0), test if it isn't broken - stray=0 - if (( unknown == 0 )); then - [[ ! -f "$cpath" ]] && stray=1 - fi + if [[ "${opts[$k]}" = "on" ]]; then + (( quiet )) || builtin print "Setting option $k" + builtin setopt "$k" + else + (( quiet )) || builtin print "Unsetting option $k" + builtin unsetopt "$k" + fi + done + fi - if (( unknown == 1 || stray == 1 )); then - builtin print -n "Removing completion: ${(r:longest+1:: :)c} $REPLY" - (( disabled )) && builtin print -n " ${ZINIT[col-error]}[disabled]${ZINIT[col-rst]}" - (( unknown )) && builtin print -n " ${ZINIT[col-error]}[unknown file]${ZINIT[col-rst]}" - (( stray )) && builtin print -n " ${ZINIT[col-error]}[stray]${ZINIT[col-rst]}" - builtin print - command rm -f "$cpath" - fi - done -} # ]]] -# FUNCTION: zi::search-completions [[[ -# While zi::show-completions() shows what completions are -# installed, this functions searches through all plugin dirs -# showing what's available in general (for installation). -# -# User-action entry point. -zi::search-completions() { - builtin setopt localoptions nullglob extendedglob nokshglob noksharrays + # 4. Delete aliases + typeset -a aname_avalue + aname_avalue=( "${(z)ZINIT[ALIASES__$uspl2]}" ) + local nv + for nv in "${(Oa)aname_avalue[@]}"; do + [[ -z "$nv" ]] && continue + # Remove one level of quoting to split using (z) + nv="${(Q)nv}" + typeset -a nv_arr + nv_arr=( "${(z)nv}" ) - typeset -a plugin_paths - plugin_paths=( "${ZINIT[PLUGINS_DIR]}"/*(DN) ) + # Remove one level of quoting to pass to unalias + local nv_arr1="${(Q)nv_arr[1-correct]}" + local nv_arr2="${(Q)nv_arr[2-correct]}" + local nv_arr3="${(Q)nv_arr[3-correct]}" - # Find longest plugin name. Things are ran twice here, first pass - # is to get longest name of plugin which is having any completions - integer longest=0 - typeset -a completions - local pp - for pp in "${plugin_paths[@]}"; do - completions=( "$pp"/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN^/) ) - if [[ "${#completions[@]}" -gt 0 ]]; then - local pd="${pp:t}" - [[ "${#pd}" -gt "$longest" ]] && longest="${#pd}" + if [[ "$nv_arr3" = "-s" ]]; then + if [[ -n "$nv_arr2" ]]; then + (( quiet )) || builtin print "Restoring ${ZINIT[col-info]}suffix${ZINIT[col-rst]} alias ${nv_arr1}=${nv_arr2}" + alias "$nv_arr1" &> /dev/null && unalias -s -- "$nv_arr1" + alias -s -- "${nv_arr1}=${nv_arr2}" + else + (( quiet )) || alias "$nv_arr1" &> /dev/null && { + builtin print "Removing ${ZINIT[col-info]}suffix${ZINIT[col-rst]} alias ${nv_arr1}" + unalias -s -- "$nv_arr1" + } + fi + elif [[ "$nv_arr3" = "-g" ]]; then + if [[ -n "$nv_arr2" ]]; then + (( quiet )) || builtin print "Restoring ${ZINIT[col-info]}global${ZINIT[col-rst]} alias ${nv_arr1}=${nv_arr2}" + alias "$nv_arr1" &> /dev/null && unalias -g -- "$nv_arr1" + alias -g -- "${nv_arr1}=${nv_arr2}" + else + (( quiet )) || alias "$nv_arr1" &> /dev/null && { + builtin print "Removing ${ZINIT[col-info]}global${ZINIT[col-rst]} alias ${nv_arr1}" + unalias -- "${(q)nv_arr1}" + } + fi + else + if [[ -n "$nv_arr2" ]]; then + (( quiet )) || builtin print "Restoring alias ${nv_arr1}=${nv_arr2}" + alias "$nv_arr1" &> /dev/null && unalias -- "$nv_arr1" + alias -- "${nv_arr1}=${nv_arr2}" + else + (( quiet )) || alias "$nv_arr1" &> /dev/null && { + builtin print "Removing alias ${nv_arr1}" + unalias -- "$nv_arr1" + } + fi fi done - builtin print "${ZINIT[col-info]}[+]${ZINIT[col-rst]} is installed, ${ZINIT[col-p]}[-]${ZINIT[col-rst]} uninstalled, ${ZINIT[col-error]}[+-]${ZINIT[col-rst]} partially installed" + # + # 5. Restore Zle state + # - local c - for pp in "${plugin_paths[@]}"; do - completions=( "$pp"/**/_[^_.]*~*(*.zwc|*.html|*.txt|*.png|*.jpg|*.jpeg|*.js|*.md|*.yml|*.ri|_zsh_highlight*|/zsdoc/*|*.ps1)(DN^/) ) + local -a keys + keys=( "${(@on)ZINIT[(I)TIME_<->_*]}" ) + integer keys_size=${#keys} + () { + setopt localoptions extendedglob noksharrays typesetsilent + typeset -a restore_widgets skip_delete + local wid + restore_widgets=( "${(z)ZINIT[WIDGETS_SAVED__$uspl2]}" ) + for wid in "${(Oa)restore_widgets[@]}"; do + [[ -z "$wid" ]] && continue + wid="${(Q)wid}" + typeset -a orig_saved + orig_saved=( "${(z)wid}" ) - if [[ "${#completions[@]}" -gt 0 ]]; then - # Array of completions, e.g. ( _cp _xauth ) - completions=( "${completions[@]:t}" ) + local tpe="${orig_saved[1]}" + local orig_saved1="${(Q)orig_saved[2]}" # Original widget + local comp_wid="${(Q)orig_saved[3]}" + local orig_saved2="${(Q)orig_saved[4]}" # Saved target function + local orig_saved3="${(Q)orig_saved[5]}" # Saved previous $widget's contents - # Detect if the completions are installed - integer all_installed="${#completions[@]}" - for c in "${completions[@]}"; do - if [[ -e "${ZINIT[COMPLETIONS_DIR]}/$c" || -e "${ZINIT[COMPLETIONS_DIR]}/${c#_}" ]]; then - (( all_installed -- )) + local found_time_key="${keys[(r)TIME_<->_${uspl2//\//---}]}" to_process_plugin + integer found_time_idx=0 idx=0 + to_process_plugin="" + [[ "$found_time_key" = (#b)TIME_(<->)_* ]] && found_time_idx="${match[1]}" + if (( found_time_idx )); then # Must be true + for (( idx = found_time_idx + 1; idx <= keys_size; ++ idx )); do + found_time_key="${keys[(r)TIME_${idx}_*]}" + local oth_uspl2="" + [[ "$found_time_key" = (#b)TIME_${idx}_(*) ]] && oth_uspl2="${match[1]//---//}" + local -a entry_splitted + entry_splitted=( "${(z@)ZINIT[WIDGETS_SAVED__$oth_uspl2]}" ) + integer found_idx="${entry_splitted[(I)(-N|-C)\ $orig_saved1\\\ *]}" + local -a entry_splitted2 + entry_splitted2=( "${(z@)ZINIT[BINDKEYS__$oth_uspl2]}" ) + integer found_idx2="${entry_splitted2[(I)*\ $orig_saved1\ *]}" + if (( found_idx || found_idx2 )) + then + # Skip multiple loads of the same plugin + # TODO: fully handle multiple plugin loads + if [[ "$oth_uspl2" != "$uspl2" ]]; then + to_process_plugin="$oth_uspl2" + # only the first one is needed + break + fi + fi + done + if [[ -n "$to_process_plugin" ]]; then + if (( !found_idx && !found_idx2 )); then + (( quiet )) || builtin print "Problem (1) during handling of widget \`$orig_saved1' (contents: $orig_saved2)" + continue + fi + (( quiet )) || builtin print "Chaining widget \`$orig_saved1' to plugin $oth_uspl2" + local -a oth_orig_saved + if (( found_idx )) { + oth_orig_saved=( "${(z)${(Q)entry_splitted[found_idx]}}" ) + local oth_fun="${oth_orig_saved[4]}" + # below is wrong because we don't want to call other plugins function at any moment + # oth_orig_saved[2]="${(q)orig_saved2}" + oth_orig_saved[5]="${(q)orig_saved3}" # chain up the widget + entry_splitted[found_idx]="${(q)${(j: :)oth_orig_saved}}" + ZINIT[WIDGETS_SAVED__$oth_uspl2]="${(j: :)entry_splitted}" + } else { + oth_orig_saved=( "${(z)${(Q)entry_splitted2[found_idx2]}}" ) + local oth_fun="${widgets[${oth_orig_saved[3]}]#*:}" + } + integer idx="${functions[$orig_saved2][(i)(#b)([^[:space:]]#${orig_saved1}[^[:space:]]#)]}" + if (( idx <= ${#functions[$orig_saved2]} )) + then + local prefix_X="${match[1]#\{}" + [[ $prefix_X != \$* ]] && prefix_X="${prefix_X%\}}" + idx="${functions[$oth_fun][(i)(#b)([^[:space:]]#${orig_saved1}[^[:space:]]#)]}" + if (( idx <= ${#functions[$oth_fun]} )); then + match[1]="${match[1]#\{}" + [[ ${match[1]} != \$* ]] && match[1]="${match[1]%\}}" + eval "local oth_prefix_uspl2_X=\"${match[1]}\"" + if [[ "${widgets[$prefix_X]}" = builtin ]]; then + (( quiet )) || builtin print "Builtin-restoring widget \`$oth_prefix_uspl2_X' ($oth_uspl2)" + zle -A ".${prefix_X#.}" "$oth_prefix_uspl2_X" + elif [[ "${widgets[$prefix_X]}" = completion:* ]]; then + (( quiet )) || builtin print "Chain*-restoring widget \`$oth_prefix_uspl2_X' ($oth_uspl2)" + zle -C "$oth_prefix_uspl2_X" "${(@)${(@s.:.)${orig_saved3#user:}}[2,3]}" + else + (( quiet )) || builtin print "Chain-restoring widget \`$oth_prefix_uspl2_X' ($oth_uspl2)" + zle -N "$oth_prefix_uspl2_X" "${widgets[$prefix_X]#user:}" + fi + fi + # The alternate method + # skip_delete+=( "${match[1]}" ) + # functions[$oth_fun]="${functions[$oth_fun]//[^\{[:space:]]#$orig_saved1/${match[1]}}" + fi + else + (( quiet )) || builtin print "Restoring Zle widget $orig_saved1" + if [[ "$orig_saved3" = builtin ]]; then + zle -A ".$orig_saved1" "$orig_saved1" + elif [[ "$orig_saved3" = completion:* ]]; then + zle -C "$orig_saved1" "${(@)${(@s.:.)${orig_saved3#user:}}[2,3]}" + else + zle -N "$orig_saved1" "${orig_saved3#user:}" + fi fi - done - - if [[ "$all_installed" -eq "${#completions[@]}" ]]; then - builtin print -n "${ZINIT[col-p]}[-]${ZINIT[col-rst]} " - elif [[ "$all_installed" -eq "0" ]]; then - builtin print -n "${ZINIT[col-info]}[+]${ZINIT[col-rst]} " else - builtin print -n "${ZINIT[col-error]}[+-]${ZINIT[col-rst]} " + (( quiet )) || builtin print "Problem (2) during handling of widget \`$orig_saved1' (contents: $orig_saved2)" fi + done + } - # Convert directory name to colorified $user/$plugin - zi::any-colorify-as-uspl2 "${pp:t}" - - # Adjust for escape code (nasty, utilizes fact that - # ${ZINIT[col-rst]} is used twice, so as a $ZINIT_COL) - integer adjust_ec=$(( ${#ZINIT[col-rst]} * 2 + ${#ZINIT[col-uname]} + ${#ZINIT[col-pname]} )) - - builtin print "${(r:longest+adjust_ec:: :)REPLY} ${(j:, :)completions}" + typeset -a delete_widgets + delete_widgets=( "${(z)ZINIT[WIDGETS_DELETE__$uspl2]}" ) + local wid + for wid in "${(Oa)delete_widgets[@]}"; do + [[ -z "$wid" ]] && continue + wid="${(Q)wid}" + if [[ -n "${skip_delete[(r)$wid]}" ]]; then + builtin print "Would delete $wid" + continue + fi + if [[ "${ZINIT_ZLE_HOOKS_LIST[$wid]}" = "1" ]]; then + (( quiet )) || builtin print "Removing Zle hook \`$wid'" + else + (( quiet )) || builtin print "Removing Zle widget \`$wid'" fi + zle -D "$wid" done -} # ]]] -# FUNCTION: zi::cenable [[[ -# Disables given installed completion. -# -# User-action entry point. -# -# $1 - e.g. "_mkdir" or "mkdir" -zi::cenable() { - local c="$1" - c="${c#_}" - - local cfile="${ZINIT[COMPLETIONS_DIR]}/_${c}" - local bkpfile="${cfile:h}/$c" - - if [[ ! -e "$cfile" && ! -e "$bkpfile" ]]; then - builtin print "${ZINIT[col-error]}No such completion \`$c'${ZINIT[col-rst]}" - return 1 - fi - - # Check if there is no backup file - # This is treated as if the completion is already enabled - if [[ ! -e "$bkpfile" ]]; then - builtin print "Completion ${ZINIT[col-info]}$c${ZINIT[col-rst]} already enabled" - - zi::check-comp-consistency "$cfile" "$bkpfile" 0 - return 1 - fi - # Disabled, but completion file already exists? - if [[ -e "$cfile" ]]; then - builtin print "${ZINIT[col-error]}Warning: completion's file \`${cfile:t}' exists, will overwrite${ZINIT[col-rst]}" - builtin print "${ZINIT[col-error]}Completion is actually enabled and will re-enable it again${ZINIT[col-rst]}" - zi::check-comp-consistency "$cfile" "$bkpfile" 1 - command rm -f "$cfile" - else - zi::check-comp-consistency "$cfile" "$bkpfile" 0 - fi + # 6. Unfunction + zi::diff-functions-compute "$uspl2" + typeset -a func + func=( "${(z)ZINIT[FUNCTIONS__$uspl2]}" ) + local f + for f in "${(on)func[@]}"; do + [[ -z "$f" ]] && continue + f="${(Q)f}" + (( quiet )) || builtin print "Deleting function $f" + (( ${+functions[$f]} )) && unfunction -- "$f" + (( ${+precmd_functions} )) && precmd_functions=( ${precmd_functions[@]:#$f} ) + (( ${+preexec_functions} )) && preexec_functions=( ${preexec_functions[@]:#$f} ) + (( ${+chpwd_functions} )) && chpwd_functions=( ${chpwd_functions[@]:#$f} ) + (( ${+periodic_functions} )) && periodic_functions=( ${periodic_functions[@]:#$f} ) + (( ${+zshaddhistory_functions} )) && zshaddhistory_functions=( ${zshaddhistory_functions[@]:#$f} ) + (( ${+zshexit_functions} )) && zshexit_functions=( ${zshexit_functions[@]:#$f} ) + done - # Enable - command mv "$bkpfile" "$cfile" # move completion's backup file created when disabling + # 7. Clean up FPATH and PATH + zi::diff-env-compute "$uspl2" + # iterate over $path elements and skip those that were added by the plugin + typeset -a new elem p + elem=( "${(z)ZINIT[PATH__$uspl2]}" ) + for p in "${path[@]}"; do + if [[ -z "${elem[(r)${(q)p}]}" ]] { + new+=( "$p" ) + } else { + (( quiet )) || builtin print "Removing PATH element ${ZINIT[col-info]}$p${ZINIT[col-rst]}" + [[ -d "$p" ]] || (( quiet )) || builtin print "${ZINIT[col-error]}Warning:${ZINIT[col-rst]} it didn't exist on disk" + } + done + path=( "${new[@]}" ) - # Prepare readlink command for establishing completion's owner - zi::prepare-readlink - # Get completion's owning plugin - zi::get-completion-owner-uspl2col "$cfile" "$REPLY" + # The same for $fpath + elem=( "${(z)ZINIT[FPATH__$uspl2]}" ) + new=( ) + for p ( "${fpath[@]}" ) { + if [[ -z "${elem[(r)${(q)p}]}" ]] { + new+=( "$p" ) + } else { + (( quiet )) || builtin print "Removing FPATH element ${ZINIT[col-info]}$p${ZINIT[col-rst]}" + [[ -d "$p" ]] || (( quiet )) || builtin print "${ZINIT[col-error]}Warning:${ZINIT[col-rst]} it didn't exist on disk" + } + } + fpath=( "${new[@]}" ) - builtin print "Enabled ${ZINIT[col-info]}$c${ZINIT[col-rst]} completion belonging to $REPLY" + # 8. Delete created variables + zi::diff-parameter-compute "$uspl2" + empty=0 + zi::save-set-extendedglob + [[ "${ZINIT[PARAMETERS_POST__$uspl2]}" != *[$'! \t']* ]] && empty=1 + zi::restore-extendedglob - return 0 -} # ]]] -# FUNCTION: zi::cdisable [[[ -# Enables given installed completion. -# -# User-action entry point. -# -# $1 - e.g. "_mkdir" or "mkdir" -zi::cdisable() { - local c="$1" - c="${c#_}" + if (( empty != 1 )); then + typeset -A elem_pre elem_post + elem_pre=( "${(z)ZINIT[PARAMETERS_PRE__$uspl2]}" ) + elem_post=( "${(z)ZINIT[PARAMETERS_POST__$uspl2]}" ) - local cfile="${ZINIT[COMPLETIONS_DIR]}/_${c}" - local bkpfile="${cfile:h}/$c" + # Find variables created or modified + local wl found + local -a whitelist + whitelist=( "${(@Q)${(z@)ZINIT[ENV-WHITELIST]}}" ) + for k in "${(k)elem_post[@]}"; do + k="${(Q)k}" + local v1="${(Q)elem_pre[$k]}" + local v2="${(Q)elem_post[$k]}" - if [[ ! -e "$cfile" && ! -e "$bkpfile" ]]; then - builtin print "${ZINIT[col-error]}No such completion \`$c'${ZINIT[col-rst]}" - return 1 - fi + # "" means a variable was deleted, not created/changed + if [[ $v2 != '""' ]]; then + # Don't unset readonly variables + [[ ${(tP)k} == *-readonly(|-*) ]] && continue - # Check if it's already disabled - # Not existing "$cfile" says that - if [[ ! -e "$cfile" ]]; then - builtin print "Completion ${ZINIT[col-info]}$c${ZINIT[col-rst]} already disabled" + # Don't unset arrays managed by add-zsh-hook, also ignore a few special parameters + # TODO: remember and remove hooks + case "$k" in + (chpwd_functions|precmd_functions|preexec_functions|periodic_functions|zshaddhistory_functions|zshexit_functions|zsh_directory_name_functions) + continue + (path|PATH|fpath|FPATH) + continue; + ;; + esac - zi::check-comp-consistency "$cfile" "$bkpfile" 0 - return 1 + # Don't unset redefined variables, only newly defined "" means variable didn't exist before plugin load (didn't have a type). + # Do an exception for the prompt variables + if [[ $v1 = '""' || ( $k = (RPROMPT|RPS1|RPS2|PROMPT|PS1|PS2|PS3|PS4) && $v1 != $v2 ) ]]; then + found=0 + for wl in "${whitelist[@]}"; do + if [[ "$k" = ${~wl} ]]; then + found=1 + break + fi + done + if (( !found )); then + (( quiet )) || builtin print "Unsetting variable $k" + # checked that 4.3.17 does support "--"; cannot be parameter starting with "-" but let's defensively use "--" here + unset -- "$k" + else + builtin print "Skipping unset of variable $k (whitelist)" + fi + fi + fi + done fi - # No disable, but bkpfile exists? - if [[ -e "$bkpfile" ]]; then - builtin print "${ZINIT[col-error]}Warning: completion's backup file \`${bkpfile:t}' already exists, will overwrite${ZINIT[col-rst]}" - zi::check-comp-consistency "$cfile" "$bkpfile" 1 - command rm -f "$bkpfile" + # 9. Forget the plugin + if [[ "$uspl2" = "_dtrace/_dtrace" ]]; then + zi::clear-debug-report + (( quiet )) || builtin print "dtrace report saved to \$LASTREPORT" else - zi::check-comp-consistency "$cfile" "$bkpfile" 0 + (( quiet )) || builtin print "Unregistering plugin $uspl2col" + zi::unregister-plugin "$user" "$plugin" "${sice[teleid]}" + zsh_loaded_plugins[${zsh_loaded_plugins[(i)$user${${user:#(%|/)*}:+/}$plugin]}]=() # Support Zsh plugin standard + zi::clear-report-for "$user" "$plugin" + (( quiet )) || builtin print "Plugin's report saved to \$LASTREPORT" fi +} # ]]] +# FUNCTION: zi::update-all-parallel [[[ +zi::update-all-parallel() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + setopt extendedglob warncreateglobal typesetsilent \ + noshortloops nomonitor nonotify - # Disable - command mv "$cfile" "$bkpfile" - - # Prepare readlink command for establishing completion's owner - zi::prepare-readlink - # Get completion's owning plugin - zi::get-completion-owner-uspl2col "$bkpfile" "$REPLY" + local id_as repo snip uspl user plugin PUDIR="$(mktemp -d)" - builtin print "Disabled ${ZINIT[col-info]}$c${ZINIT[col-rst]} completion belonging to $REPLY" + local -A PUAssocArray map + map=( / -- "=" -EQ- "?" -QM- "&" -AMP- : - ) + local -a files + integer main_counter counter PUPDATE=1 - return 0 -} # ]]] -# FUNCTION: zi::cd [[[ -# Jumps to plugin's directory (in Zinit's home directory). -# -# User-action entry point. -# -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::cd() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt extendedglob warncreateglobal typesetsilent rcquotes + files=( ${ZINIT[SNIPPETS_DIR]}/**/(._zinit|._zplugin)/mode(ND) ) + main_counter=${#files} + if (( OPTS[opt_-s,--snippets] || !OPTS[opt_-l,--plugins] )) { + for snip ( "${files[@]}" ) { + main_counter=main_counter-1 + # The continue may cause the tail of processes to fall-through to the following plugins-specific `wait' + # Should happen only in a very special conditions + # TODO handle this + [[ ! -f ${snip:h}/url ]] && continue + [[ -f ${snip:h}/id-as ]] && \ + id_as="$(<${snip:h}/id-as)" || \ + id_as= - zi::get-path "$1" "$2" && { - if [[ -e $REPLY ]]; then - builtin pushd $REPLY - else - +zi::message "No such plugin or snippet" - return 1 - fi - builtin print - } || { - +zi::message "No such plugin or snippet" - return 1 - } -} # ]]] -# FUNCTION: zi::run-delete-hooks [[[ -zi::run-delete-hooks() { - if [[ -n ${ICE[atdelete]} ]]; then - zi::countdown "atdelete" && ( (( ${+ICE[nocd]} == 0 )) && \ - { builtin cd -q "$5" && eval "${ICE[atdelete]}"; ((1)); } || \ - eval "${ICE[atdelete]}" ) - fi + counter+=1 + local ef_id="${id_as:-$(<${snip:h}/url)}" + local PUFILEMAIN=${${ef_id#/}//(#m)[\/=\?\&:]/${map[$MATCH]}} + local PUFILE=$PUDIR/${counter}_$PUFILEMAIN.out - local -a arr - local key + zi::update-or-status-snippet "$st" "$ef_id" &>! $PUFILE & - # Run annexes' atdelete hooks - reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:atdelete-pre <->]} - ${(on)ZINIT_EXTS[(I)z-annex hook:atdelete-<-> <->]} - ${(on)ZINIT_EXTS2[(I)zinit hook:atdelete-post <->]} - ) - for key in "${reply[@]}"; do - arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) - "${arr[5]}" "$1" "$2" $3 "$4" "$5" "${${key##(zinit|z-annex) hook:}%% <->}" delete:TODO - done -} # ]]] -# FUNCTION: zi::delete [[[ -# Deletes plugin's or snippet's directory (in Zinit's home directory). -# -# User-action entry point. -# -# $1 - snippet URL or plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::delete() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob warncreateglobal typesetsilent + PUAssocArray[$!]=$PUFILE - local -a opts match mbegin mend - local MATCH; integer MBEGIN MEND _retval + zi::wait-for-update-jobs snippets + } + } - # Parse options - zi::parse-opts delete "$@" - builtin set -- "${reply[@]}" - if (( $@[(I)-*] || OPTS[opt_-h,--help] )) { +zi::prehelp-usage-message delete $___opt_map[delete] $@; return 1; } + counter=0 + PUAssocArray=() - local the_id="$1${${1:#(%|/)*}:+${2:+/}}$2" + if (( OPTS[opt_-l,--plugins] || !OPTS[opt_-s,--snippets] )) { + local -a files2 + files=( ${ZINIT[PLUGINS_DIR]}/*(ND/) ) - # -a/--all given? - if (( OPTS[opt_-a,--all] )); then - zi::confirm "Prune all plugins in \`${ZINIT[PLUGINS_DIR]}'"\ -"and snippets in \`${ZINIT[SNIPPETS_DIR]}'?" \ -"command rm -rf ${${ZINIT[PLUGINS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcEFG312}/*~*/_local---zinit(ND) "\ -"${${ZINIT[SNIPPETS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcEFG312}/*~*/plugins(ND)" - return $? - fi + # Pre-process plugins + for repo ( $files ) { + uspl=${repo:t} + # Two special cases + [[ $uspl = custom || $uspl = _local---zinit ]] && continue - # -c/--clean given? - if (( OPTS[opt_-c,--clean] )) { - zi::confirm "Prune ${ZINIT[col-info]}CURRENTLY NOT LOADED${ZINIT[col-rst]}"\ -" plugins in $ZINIT[col-file]$ZINIT[PLUGINS_DIR]%f%b"\ -" and snippets in $ZINIT[col-file]$ZINIT[SNIPPETS_DIR]%f%b?" \ -" # Delete unloaded snippets -local -aU loadedsnips todelete final_todelete -loadedsnips=( \${\${ZINIT_SNIPPETS[@]% <*>}/(#m)*/\$(zi::get-object-path snippet \"\$MATCH\" && builtin print -rn \$REPLY; )} ) -local dir=\${\${ZINIT[SNIPPETS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/xyzcba231} -todelete=( \$dir/*/*/*(ND/) \$dir/*/*(ND/) \$dir/*(ND/) ) -final_todelete=( \${todelete[@]:#*/(\${(~j:|:)loadedsnips}|*/plugins|._backup|._zinit|.svn|.git)(|/*)} ) -final_todelete=( \${final_todelete[@]//(#m)*/\$( zi::get-object-path snippet \"\${\${\${MATCH##\${dir}[/[:space:]]#}/(#i)(#b)(http(s|)|ftp(s|)|ssh|rsync)--/\${match[1]##--}://}//--//}\" && builtin print -r -- \$REPLY)} ) -final_todelete=( \${final_todelete[@]:#(\${(~j:|:)loadedsnips}|*/plugins|*/._backup|*/._zinit|*/.svn|*/.git)(|/*)} ) -todelete=( \${\${\${(@)\${(@)final_todelete##\$dir/#}//(#i)(#m)(http(s|)|ftp(s|)|ssh|rsync)--/\${MATCH%--}://}//--//}//(#b)(*)\/([^\/]##)(#e)/\$match[1]/\$ZINIT[col-file]\$match[2]\$ZINIT[col-rst]} ) -todelete=( \${todelete[@]//(#m)(#s)[^\/]##(#e)/\$ZINIT[col-file]\$MATCH\$ZINIT[col-rst]} ) -final_todelete=( \${\${\${(@)\${(@)final_todelete##\$dir/#}//(#i)(#m)(http(s|)|ftp(s|)|ssh|rsync)--/\${MATCH%--}://}//--//}//(#b)(*)\/([^\/]##)(#e)/\$match[1]/\$match[2]} ) -builtin print; print -Prln \"\$ZINIT[col-obj]Deleting the following \"\ -\"\$ZINIT[col-file]\${#todelete}\$ZINIT[col-msg2] UNLOADED\$ZINIT[col-obj] snippets:%f%b\" \ - \$todelete \"%f%b\" -sleep 3 -local snip -for snip ( \$final_todelete ) { zinit delete -q -y \$snip; _retval+=\$?; } -builtin print -Pr \"\$ZINIT[col-obj]Done (with the exit code: \$_retval).%f%b\" + # Check if repository has a remote set + if [[ -f $repo/.git/config ]] { + local -a config + config=( ${(f)"$(<$repo/.git/config)"} ) + if [[ ${#${(M)config[@]:#\[remote[[:blank:]]*\]}} -eq 0 ]] { + continue + } + } -# Next delete unloaded plugins -local -a dirs -dirs=( \${\${ZINIT[PLUGINS_DIR]%%[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcEFG312}/*~*/(\${(~j:|:)\${ZINIT_REGISTERED_PLUGINS[@]//\//---}})(ND/) ) -dirs=( \${(@)\${dirs[@]##\$ZINIT[PLUGINS_DIR]/#}//---//} ) -builtin print -Prl \"\" \"\$ZINIT[col-obj]Deleting the following \"\ -\"\$ZINIT[col-file]\${#dirs}\$ZINIT[col-msg2] UNLOADED\$ZINIT[col-obj] plugins:%f%b\" \ -\${\${dirs//(#b)(*)(\/([^\/]##))(#e)/\${\${match[2]:+\$ZINIT[col-uname]\$match[1]\$ZINIT[col-rst]/\$ZINIT[col-pname]\$match[3]\$ZINIT[col-rst]}:-\$ZINIT[col-pname]\$match[1]}}//(#b)(^\$ZINIT[col-uname])(*)/\$ZINIT[col-pname]\$match[1]} -sleep 3 -for snip ( \$dirs ) { zinit delete -q -y \$snip; _retval+=\$?; } -builtin print -Pr \"\$ZINIT[col-obj]Done (with the exit code: \$_retval).%f%b\"" - return _retval - } + zi::any-to-user-plugin "$uspl" + local user=${reply[-2]} plugin=${reply[-1]} - local -A ICE2 - local local_dir filename is_snippet + # Must be a git repository or a binary release + if [[ ! -d $repo/.git && ! -f $repo/._zinit/is_release ]] { + continue + } + files2+=( $repo ) + } - zi::compute-ice "$the_id" "pack" \ - ICE2 local_dir filename is_snippet || return 1 + main_counter=${#files2} + for repo ( "${files2[@]}" ) { + main_counter=main_counter-1 - if [[ "$local_dir" != /* ]] - then - builtin print "Obtained a risky, not-absolute path ($local_dir), aborting" - return 1 - fi + uspl=${repo:t} + id_as=${uspl//---//} - ICE2[teleid]="${ICE2[teleid]:-${ICE2[id-as]}}" + counter+=1 + local PUFILEMAIN=${${id_as#/}//(#m)[\/=\?\&:]/${map[$MATCH]}} + local PUFILE=$PUDIR/${counter}_$PUFILEMAIN.out - local -a files - files=( "$local_dir"/*.(zsh|sh|bash|ksh)(DN:t) - "$local_dir"/*(*DN:t) "$local_dir"/*(@DN:t) "$local_dir"/*(.DN:t) - "$local_dir"/*~*/.(_zinit|svn|git)(/DN:t) "$local_dir"/*(=DN:t) - "$local_dir"/*(pDN:t) "$local_dir"/*(%DN:t) - ) - (( !${#files} )) && files=( "no files?" ) - files=( ${(@)files[1,4]} ${files[4]+more…} ) + zi::any-colorify-as-uspl2 "$uspl" + +zi::message "Updating $REPLY{…}" >! $PUFILE - # Make the ices available for the hooks. - local -A ICE - ICE=( "${(kv)ICE2[@]}" ) + zi::any-to-user-plugin "$uspl" + local user=${reply[-2]} plugin=${reply[-1]} - if (( is_snippet )); then - if [[ "${+ICE2[svn]}" = "1" ]] { - if [[ -e "$local_dir" ]] - then - zi::confirm "Delete $local_dir? (it holds: ${(j:, :)${(@u)files}})" \ - "zi::run-delete-hooks snippet \"${ICE2[teleid]}\" \"\" \"$the_id\" \ - \"$local_dir\"; \ - command rm -rf ${(q)${${local_dir:#[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcYZX321}}" - else - builtin print "No such snippet" - return 1 - fi - } else { - if [[ -e "$local_dir" ]]; then - zi::confirm "Delete $local_dir? (it holds: ${(j:, :)${(@u)files}})" \ - "zi::run-delete-hooks snippet \"${ICE2[teleid]}\" \"\" \"$the_id\" \ - \"$local_dir\"; command rm -rf \ - ${(q)${${local_dir:#[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcYZX321}}" - else - builtin print "No such snippet" - return 1 - fi - } - else - zi::any-to-user-plugin "${ICE2[teleid]}" - if [[ -e "$local_dir" ]]; then - zi::confirm "Delete $local_dir? (it holds: ${(j:, :)${(@u)files}})" \ - "zi::run-delete-hooks plugin \"${reply[-2]}\" \"${reply[-1]}\" \"$the_id\" \ - \"$local_dir\"; \ - command rm -rf ${(q)${${local_dir:#[/[:space:]]##}:-${TMPDIR:-${TMPDIR:-/tmp}}/abcYZX321}}" - else - builtin print -r -- "No such plugin or snippet" - return 1 - fi - fi + zi::update-or-status update "$user" "$plugin" &>>! $PUFILE & - return 0 -} # ]]] -# FUNCTION: zi::confirm [[[ -# Prints given question, waits for "y" key, evals -# given expression if "y" obtained -# -# $1 - question -# $2 - expression -zi::confirm() { - if (( OPTS[opt_-y,--yes] )); then - integer retval - eval "$2"; retval=$? - (( OPTS[opt_-q,--quiet] )) || builtin print "\nDone (action executed, exit code: $retval)" - else - builtin print -Pr -- "$1" - builtin print "[yY/n…]" - local ans - if [[ -t 0 ]] { - read -q ans - } else { - read -k1 -u0 ans - } - if [[ "$ans" = "y" ]] { - eval "$2" - builtin print "\nDone (action executed, exit code: $?)" - } else { - builtin print "\nBreak, no action" - return 1 - } - fi - return 0 -} # ]]] -# FUNCTION: zi::changes [[[ -# Shows `git log` of given plugin. -# -# User-action entry point. -# -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::changes() { - zi::any-to-user-plugin "$1" "$2" - local user="${reply[-2]}" plugin="${reply[-1]}" + PUAssocArray[$!]=$PUFILE - zi::exists-physically-message "$user" "$plugin" || return 1 + zi::wait-for-update-jobs plugins - ( - builtin cd -q "${ZINIT[PLUGINS_DIR]}/${user:+${user}---}${plugin//\//---}" && \ - command git log -p --graph --decorate --date=relative -C -M - ) + } + } + # Shouldn't happen + # (( ${#PUAssocArray} > 0 )) && wait ${(k)PUAssocArray} } # ]]] -# FUNCTION: zi::recently [[[ -# Shows plugins that obtained commits in specified past time. +# FUNCTION: zi::update-or-status [[[ +# Updates (git pull) or does `git status' for given plugin. # # User-action entry point. # -# $1 - time spec, e.g. "1 week" -zi::recently() { +# $1 - "status" for status, other for update +# $2 - plugin spec (4 formats: user---plugin, user/plugin, user (+ plugin in $2), plugin) +# $3 - plugin (only when $1 - i.e. user - given) +zi::update-or-status() { + # Set the localtraps option. builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt nullglob extendedglob warncreateglobal \ - typesetsilent noshortloops + setopt extendedglob nullglob warncreateglobal typesetsilent noshortloops - local IFS=. - local gitout - local timespec=${*// ##/.} - timespec=${timespec//.##/.} - [[ -z $timespec ]] && timespec=1.week + local -a arr + ZINIT[first-plugin-mark]=${${ZINIT[first-plugin-mark]:#init}:-1} + ZINIT[-r/--reset-opt-hook-has-been-run]=0 - typeset -a plugins - plugins=( ${ZINIT[PLUGINS_DIR]}/*(DN-/) ) + # Deliver and withdraw the `m` function when finished. + zi::set-m-func set + trap "zi::set-m-func unset" EXIT - local p uspl1 - for p in ${plugins[@]}; do - uspl1=${p:t} - [[ $uspl1 = custom || $uspl1 = _local---zinit ]] && continue + integer retval hook_rc was_snippet + zi::two-paths "$2${${2:#(%|/)*}:+${3:+/}}$3" + if [[ -d ${reply[-4]} || -d ${reply[-2]} ]]; then + zi::update-or-status-snippet "$1" "$2${${2:#(%|/)*}:+${3:+/}}$3" + retval=$? + was_snippet=1 + fi - pushd "$p" >/dev/null || continue - if [[ -d .git ]]; then - gitout=`command git log --all --max-count=1 --since=$timespec 2>/dev/null` - if [[ -n $gitout ]]; then - zi::any-colorify-as-uspl2 "$uspl1" - builtin print -r -- "$REPLY" - fi - fi - popd >/dev/null - done -} # ]]] -# FUNCTION: zi::create [[[ -# Creates a plugin, also on Github (if not "_local/name" plugin). -# -# User-action entry point. -# -# $1 - (optional) plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - (optional) plugin (only when $1 - i.e. user - given) -zi::create() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt localoptions extendedglob warncreateglobal typesetsilent \ - noshortloops rcquotes + zi::any-to-user-plugin "$2" "$3" + local user=${reply[-2]} plugin=${reply[-1]} st=$1 \ + local_dir filename is_snippet key \ + id_as="${reply[-2]}${${reply[-2]:#(%|/)*}:+/}${reply[-1]}" + local -A ice - zi::any-to-user-plugin "$1" "$2" - local user="${reply[-2]}" plugin="${reply[-1]}" + if (( was_snippet )) { + zi::exists-physically "$user" "$plugin" || return $retval + zi::any-colorify-as-uspl2 "$2" "$3" + (( !OPTS[opt_-q,--quiet] )) && \ + +zi::message "{msg2}Updating also \`$REPLY{rst}{msg2}'" \ + "plugin (already updated a snippet of the same name){…}{rst}" + } else { + zi::exists-physically-message "$user" "$plugin" || return 1 + } - if (( ${+commands[curl]} == 0 || ${+commands[git]} == 0 )); then - builtin print "${ZINIT[col-error]}curl and git are needed${ZINIT[col-rst]}" - return 1 + if [[ $st = status ]]; then + ( builtin cd -q ${ZINIT[PLUGINS_DIR]}/${user:+${user}---}${plugin//\//---}; command git status; ) + return $retval fi - # Read whether to create under organization - local isorg - vared -cp 'Create under an organization? (y/n): ' isorg + command rm -f ${TMPDIR:-${TMPDIR:-/tmp}}/zinit-execs.$$.lst ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.installed_comps.$$.lst \ + ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.skipped_comps.$$.lst ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.compiled.$$.lst - if [[ $isorg = (y|yes) ]]; then - local org="$user" - vared -cp "Github organization name: " org - fi + # A flag for the annexes. 0 – no new commits, 1 - run-atpull mode, + # 2 – full update/there are new commits to download, 3 - full but + # a forced download (i.e.: the medium doesn't allow to peek update) + ZINIT[annex-multi-flag:pull-active]=0 - # Read user - local compcontext="user:User Name:(\"$USER\" \"$user\")" - vared -cp "Github user name or just \"_local\" (or leave blank, for an userless plugin): " user + (( ${#ICE[@]} > 0 )) && { ZINIT_SICE[$user${${user:#(%|/)*}:+/}$plugin]=""; local nf="-nftid"; } - # Read plugin - unset compcontext - vared -cp 'Plugin name: ' plugin + zi::compute-ice "$user${${user:#(%|/)*}:+/}$plugin" "pack$nf" \ + ice local_dir filename is_snippet || return 1 - if [[ "$plugin" = "_unknown" ]]; then - builtin print "${ZINIT[col-error]}No plugin name entered${ZINIT[col-rst]}" - return 1 + zi::any-to-user-plugin ${ice[teleid]:-$id_as} + user=${reply[1]} plugin=${reply[2]} + + local repo="${${${(M)id_as#%}:+${id_as#%}}:-${ZINIT[PLUGINS_DIR]}/${id_as//\//---}}" + + # Run annexes' preinit hooks + local -a arr + reply=( + ${(on)ZINIT_EXTS2[(I)zinit hook:preinit-pre <->]} + ${(on)ZINIT_EXTS[(I)z-annex hook:preinit-<-> <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:preinit-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" ${${key##(zinit|z-annex) hook:}%% <->} update || \ + return $(( 10 - $? )) + done + + # Check if repository has a remote set, if it is _local + if [[ -f $local_dir/.git/config ]]; then + local -a config + config=( ${(f)"$(<$local_dir/.git/config)"} ) + if [[ ${#${(M)config[@]:#\[remote[[:blank:]]*\]}} -eq 0 ]]; then + (( !OPTS[opt_-q,--quiet] )) && { + zi::any-colorify-as-uspl2 "$id_as" + [[ $id_as = _local/* ]] && builtin print -r -- "Skipping local plugin $REPLY" || \ + builtin print -r -- "$REPLY doesn't have a remote set, will not fetch" + } + return 1 + fi fi - plugin="${plugin//[^a-zA-Z0-9_]##/-}" - zi::any-colorify-as-uspl2 "${${${(M)isorg:#(y|yes)}:+$org}:-$user}" "$plugin" - local uspl2col="$REPLY" - builtin print "Plugin is $uspl2col" + command rm -f $local_dir/.zinit_lastupd - if zi::exists-physically "${${${(M)isorg:#(y|yes)}:+$org}:-$user}" "$plugin"; then - builtin print "${ZINIT[col-error]}Repository${ZINIT[col-rst]} $uspl2col ${ZINIT[col-error]}already exists locally${ZINIT[col-rst]}" - return 1 - fi + if (( 1 )); then + if [[ -z ${ice[is_release]} && ${ice[from]} = (gh-r|github-rel|cygwin) ]] { + ice[is_release]=true + } - builtin cd -q "${ZINIT[PLUGINS_DIR]}" + integer count is_release=0 + for (( count = 1; count <= 5; ++ count )) { + if (( ${+ice[is_release${count:#1}]} )) { + is_release=1 + } + } - if [[ "$user" != "_local" && -n "$user" ]]; then - builtin print "${ZINIT[col-info]}Creating Github repository${ZINIT[col-rst]}" - if [[ $isorg = (y|yes) ]]; then - curl --silent -u "$user" https://api.github.com/orgs/$org/repos -d '{"name":"'"$plugin"'"}' >/dev/null - else - curl --silent -u "$user" https://api.github.com/user/repos -d '{"name":"'"$plugin"'"}' >/dev/null - fi - command git clone "https://github.com/${${${(M)isorg:#(y|yes)}:+$org}:-$user}/${plugin}.git" "${${${(M)isorg:#(y|yes)}:+$org}:-$user}---${plugin//\//---}" || { - builtin print "${ZINIT[col-error]}Creation of remote repository $uspl2col ${ZINIT[col-error]}failed${ZINIT[col-rst]}" - builtin print "${ZINIT[col-error]}Bad credentials?${ZINIT[col-rst]}" - return 1 + (( ${+functions[zi::setup-plugin-dir]} )) || builtin source ${ZINIT[BIN_DIR]}"/zinit-install.zsh" + if [[ $ice[from] == (gh-r|github-rel) ]] { + { + ICE=( "${(kv)ice[@]}" ) + zi::get-latest-gh-r-url-part "$user" "$plugin" || return $? + } always { + ICE=() + } + } else { + REPLY="" } - builtin cd -q "${${${(M)isorg:#(y|yes)}:+$org}:-$user}---${plugin//\//---}" - command git config credential.https://github.com.username "${user}" - else - builtin print "${ZINIT[col-info]}Creating local git repository${${user:+.}:-, ${ZINIT[col-pname]}free-style, without the \"_local/\" part${ZINIT[col-info]}.}${ZINIT[col-rst]}" - command mkdir "${user:+${user}---}${plugin//\//---}" - builtin cd -q "${user:+${user}---}${plugin//\//---}" - command git init || { - builtin print "Git repository initialization failed, aborting" - return 1 + + if (( is_release )) { + count=0 + for REPLY ( $reply ) { + count+=1 + local version=${REPLY/(#b)(\/[^\/]##)(#c4,4)\/([^\/]##)*/${match[2]}} + if [[ ${ice[is_release${count:#1}]} = $REPLY ]] { + (( ${+ice[run-atpull]} || OPTS[opt_-u,--urge] )) && \ + ZINIT[annex-multi-flag:pull-active]=1 || \ + ZINIT[annex-multi-flag:pull-active]=0 + } else { + ZINIT[annex-multi-flag:pull-active]=2 + break + } + } + if (( ZINIT[annex-multi-flag:pull-active] <= 1 && !OPTS[opt_-q,--quiet] )) { + builtin print -- "\rBinary release already up to date (version: $version)" + } } - fi - local user_name="$(command git config user.name 2>/dev/null)" - local year="${$(command date "+%Y"):-2020}" + if (( 1 )) { + if (( ZINIT[annex-multi-flag:pull-active] >= 1 )) { + if (( OPTS[opt_-q,--quiet] && !PUPDATE )) { + zi::any-colorify-as-uspl2 "$id_as" + (( ZINIT[first-plugin-mark] )) && { + ZINIT[first-plugin-mark]=0 + } || builtin print + builtin print "\rUpdating $REPLY" + } - command cat >! "${plugin:t}.plugin.zsh" <]} + ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update:bin + hook_rc=$? + [[ "$hook_rc" -ne 0 ]] && { + # note: this will effectively return the last != 0 rc + retval="$hook_rc" + builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" + } + done -# Copyright (c) $year $user_name + if (( ZINIT[annex-multi-flag:pull-active] >= 2 )) { + if ! zi::setup-plugin-dir "$user" "$plugin" "$id_as" release -u $version; then + ZINIT[annex-multi-flag:pull-active]=0 + fi + if (( OPTS[opt_-q,--quiet] != 1 )) { + builtin print + } + } + ICE=() + } + } -# According to the Zsh Plugin Standard: -# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html + if [[ -d $local_dir/.git ]] && ( builtin cd -q $local_dir ; git show-ref --verify --quiet refs/heads/main ); then + local main_branch=main + else + local main_branch=master + fi -0=\${\${ZERO:-\${0:#\$ZSH_ARGZERO}}:-\${(%):-%N}} -0=\${\${(M)0:#/*}:-\$PWD/\$0} + if (( ! is_release )) { + ( builtin cd -q "$local_dir" || return 1 + integer had_output=0 + local IFS=$'\n' + command git fetch --quiet && \ + command git --no-pager log --color --date=short --pretty=format:'%Cgreen%cd %h %Creset%s%n' ..FETCH_HEAD | \ + while read line; do + [[ -n ${line%%[[:space:]]##} ]] && { + [[ $had_output -eq 0 ]] && { + had_output=1 + if (( OPTS[opt_-q,--quiet] && !PUPDATE )) { + zi::any-colorify-as-uspl2 "$id_as" + (( ZINIT[first-plugin-mark] )) && { + ZINIT[first-plugin-mark]=0 + } || builtin print + builtin print "Updating $REPLY" + } + } + builtin print $line + } + done | \ + command tee .zinit_lastupd | \ + zi::pager & -# Then \${0:h} to get plugin's directory + integer pager_pid=$! + { sleep 20 && kill -9 $pager_pid 2>/dev/null 1>&2; } &! + { wait $pager_pid; } > /dev/null 2>&1 -if [[ \${zsh_loaded_plugins[-1]} != */${plugin:t} && -z \${fpath[(r)\${0:h}]} ]] { - fpath+=( "\${0:h}" ) -} + local -a log + { log=( ${(@f)"$(<$local_dir/.zinit_lastupd)"} ); } 2>/dev/null + command rm -f $local_dir/.zinit_lastupd -# Standard hash for plugins, to not pollute the namespace -typeset -gA Plugins -Plugins[${${(U)plugin:t}//-/_}_DIR]="\${0:h}" + if [[ ${#log} -gt 0 ]] { + ZINIT[annex-multi-flag:pull-active]=2 + } else { + if (( ${+ice[run-atpull]} || OPTS[opt_-u,--urge] )) { + ZINIT[annex-multi-flag:pull-active]=1 -autoload -Uz template-script + # Handle the snippet/plugin boundary in the messages + if (( OPTS[opt_-q,--quiet] && !PUPDATE )) { + zi::any-colorify-as-uspl2 "$id_as" + (( ZINIT[first-plugin-mark] )) && { + ZINIT[first-plugin-mark]=0 + } || builtin print + builtin print "\rUpdating $REPLY" + } + } else { + ZINIT[annex-multi-flag:pull-active]=0 + } + } -# Use alternate vim marks [[[ and ]]] as the original ones can -# confuse nested substitutions, e.g.: \${\${\${VAR}}} + if (( ZINIT[annex-multi-flag:pull-active] >= 1 )) { + ICE=( "${(kv)ice[@]}" ) + # Run annexes' atpull hooks (the before atpull-ice ones). + # The regular Git-plugins block. + reply=( + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} + ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update:git + hook_rc=$? + [[ "$hook_rc" -ne 0 ]] && { + # note: this will effectively return the last != 0 rc + retval="$hook_rc" + builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" + } + done + ICE=() + (( ZINIT[annex-multi-flag:pull-active] >= 2 )) && command git pull --no-stat ${=ice[pullopts]:---ff-only} origin ${ice[ver]:-$main_branch} |& command grep -E -v '(FETCH_HEAD|up.to.date\.|From.*://)' + } + return ${ZINIT[annex-multi-flag:pull-active]} + ) + ZINIT[annex-multi-flag:pull-active]=$? + } -# vim:ft=zsh:tw=80:sw=4:sts=4:et:foldmarker=[[[,]]] -EOF + if [[ -d $local_dir/.git ]]; then + ( + builtin cd -q "$local_dir" # || return 1 - don't return, maybe it's some hook's logic + if (( OPTS[opt_-q,--quiet] )) { + command git pull --recurse-submodules ${=ice[pullopts]:---ff-only} origin ${ice[ver]:-$main_branch} &> /dev/null + } else { + command git pull --recurse-submodules ${=ice[pullopts]:---ff-only} origin ${ice[ver]:-$main_branch} |& command grep -E -v '(FETCH_HEAD|up.to.date\.|From.*://)' + } + ) + fi + if [[ -n ${(v)ice[(I)(mv|cp|atpull|ps-on-update|cargo)]} || $+ice[sbin]$+ice[make]$+ice[extract]$+ice[configure] -ne 0 ]] { + if (( !OPTS[opt_-q,--quiet] && ZINIT[annex-multi-flag:pull-active] == 1 )) { + +zi::message -n "{pre}[update]{msg3} Continuing with the update because " + (( ${+ice[run-atpull]} )) && \ + +zi::message "{ice}run-atpull{apo}''{msg3} ice given.{rst}" || \ + +zi::message "{opt}-u{msg3}/{opt}--urge{msg3} given.{rst}" + } + } - builtin print -r -- "# $plugin" >! "README.md" - command cp -vf "${ZINIT[BIN_DIR]}/LICENSE" LICENSE - command cp -vf "${ZINIT[BIN_DIR]}/share/template-plugin/zsh.gitignore" .gitignore - command cp -vf "${ZINIT[BIN_DIR]}/share/template-plugin/template-script" . + # Any new commits? + if (( ZINIT[annex-multi-flag:pull-active] >= 1 )) { + ICE=( "${(kv)ice[@]}" ) + # Run annexes' atpull hooks (the before atpull[^!]…-ice ones). + # Block common for Git and gh-r plugins. + reply=( + ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-pre <->]} + ${${ICE[atpull]:#\!*}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update + hook_rc="$?" + [[ "$hook_rc" -ne 0 ]] && { + # note: this will effectively return the last != 0 rc + retval="$hook_rc" + builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" + } + done - command sed -i -e "s/MY_PLUGIN_DIR/${${(U)plugin:t}//-/_}_DIR/g" template-script - command sed -i -e "s/USER_NAME/$user_name/g" template-script - command sed -i -e "s/YEAR/$year/g" template-script + # Run annexes' atpull hooks (the after atpull-ice ones). + # Block common for Git and gh-r plugins. + reply=( + ${(on)ZINIT_EXTS2[(I)zinit hook:atpull-pre <->]} + ${(on)ZINIT_EXTS[(I)z-annex hook:atpull-<-> <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:atpull-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update + hook_rc="$?" + [[ "$hook_rc" -ne 0 ]] && { + # note: this will effectively return the last != 0 rc + retval="$hook_rc" + builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" + } + done + ICE=() + } - if [[ "$user" != "_local" && -n "$user" ]]; then - builtin print "Your repository is ready\!" - builtin print "An MIT LICENSE file has been placed - please review the " \ - "license terms to see if they fit your new project:" - builtin print "- https://choosealicense.com/" - builtin print "Remote repository $uspl2col set up as origin." - builtin print "You're in plugin's local folder, the files aren't added to git." - builtin print "Your next step after commiting will be:" - builtin print "git push -u origin master (or \`… -u origin main')" - else - builtin print "Created local $uspl2col plugin." - builtin print "You're in plugin's repository folder, the files aren't added to git." + # Store ices to disk at update of plugin + zi::store-ices "$local_dir/._zinit" ice "" "" "" "" fi -} # ]]] -# FUNCTION: zi::glance [[[ -# Shows colorized source code of plugin. Is able to use pygmentize, -# highlight, GNU source-highlight. -# -# User-action entry point. -# -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::glance() { - zi::any-to-user-plugin "$1" "$2" - local user="${reply[-2]}" plugin="${reply[-1]}" - zi::exists-physically-message "$user" "$plugin" || return 1 + # Run annexes' atpull hooks (the `always' after atpull-ice ones) + # Block common for Git and gh-r plugins. + ICE=( "${(kv)ice[@]}" ) + reply=( + ${(on)ZINIT_EXTS2[(I)zinit hook:%atpull-pre <->]} + ${(on)ZINIT_EXTS[(I)z-annex hook:%atpull-<-> <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:%atpull-post <->]} + ) + for key in "${reply[@]}"; do + arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) + "${arr[5]}" plugin "$user" "$plugin" "$id_as" "$local_dir" "${${key##(zinit|z-annex) hook:}%% <->}" update:$ZINIT[annex-multi-flag:pull-active] + hook_rc=$? + [[ "$hook_rc" -ne 0 ]] && { + # note: this will effectively return the last != 0 rc + retval="$hook_rc" + builtin print -Pr -- "${ZINIT[col-warn]}Warning:%f%b ${ZINIT[col-obj]}${arr[5]}${ZINIT[col-warn]} hook returned with ${ZINIT[col-obj]}${hook_rc}${ZINIT[col-rst]}" + } + done + ICE=() - zi::first "$1" "$2" || { - builtin print "${ZINIT[col-error]}No source file found, cannot glance${ZINIT[col-rst]}" - return 1 - } + typeset -ga INSTALLED_EXECS + { INSTALLED_EXECS=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit-execs.$$.lst)}" ) } 2>/dev/null - local fname="${reply[-1]}" + if [[ -e ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.skipped_comps.$$.lst || -e ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.installed_comps.$$.lst ]] { + typeset -ga INSTALLED_COMPS SKIPPED_COMPS + { INSTALLED_COMPS=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit.installed_comps.$$.lst)}" ) } 2>/dev/null + { SKIPPED_COMPS=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit.skipped_comps.$$.lst)}" ) } 2>/dev/null + } - integer has_256_colors=0 - [[ "$TERM" = xterm* || "$TERM" = "screen" ]] && has_256_colors=1 + if [[ -e ${TMPDIR:-${TMPDIR:-/tmp}}/zinit.compiled.$$.lst ]] { + typeset -ga ADD_COMPILED + { ADD_COMPILED=( "${(@f)$(<${TMPDIR:-${TMPDIR:-/tmp}}/zinit.compiled.$$.lst)}" ) } 2>/dev/null + } - { - if (( ${+commands[pygmentize]} )); then - builtin print "Glancing with ${ZINIT[col-info]}pygmentize${ZINIT[col-rst]}" - pygmentize -l bash -g "$fname" - elif (( ${+commands[highlight]} )); then - builtin print "Glancing with ${ZINIT[col-info]}highlight${ZINIT[col-rst]}" - if (( has_256_colors )); then - highlight -q --force -S sh -O xterm256 "$fname" - else - highlight -q --force -S sh -O ansi "$fname" - fi - elif (( ${+commands[source-highlight]} )); then - builtin print "Glancing with ${ZINIT[col-info]}source-highlight${ZINIT[col-rst]}" - source-highlight -fesc --failsafe -s zsh -o STDOUT -i "$fname" - else - cat "$fname" - fi - } | { - if [[ -t 1 ]]; then - zi::pager - else - cat - fi + if (( PUPDATE && ZINIT[annex-multi-flag:pull-active] > 0 )) { + builtin print ${ZINIT[annex-multi-flag:pull-active]} >! $PUFILE.ind } + + return $retval } # ]]] -# FUNCTION: zi::edit [[[ -# Runs $EDITOR on source of given plugin. If the variable is not -# set then defaults to `vim'. +# FUNCTION: zi::update-or-status-all [[[ +# Updates (git pull) or does `git status` for all existing plugins. +# This includes also plugins that are not loaded into Zsh (but exist +# on disk). Also updates (i.e. redownloads) snippets. # # User-action entry point. -# -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::edit() { - local -A ICE2 - local local_dir filename is_snippet the_id="$1${${1:#(%|/)*}:+${2:+/}}$2" +zi::update-or-status-all() { + builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} + setopt extendedglob nullglob warncreateglobal typesetsilent noshortloops - zi::compute-ice "$the_id" "pack" \ - ICE2 local_dir filename is_snippet || return 1 + local -F2 SECONDS=0 - ICE2[teleid]="${ICE2[teleid]:-${ICE2[id-as]}}" + zi::self-update -q - if (( is_snippet )); then - if [[ ! -e "$local_dir" ]]; then - builtin print "No such snippet" - return 1 - fi - else - if [[ ! -e "$local_dir" ]]; then - builtin print -r -- "No such plugin or snippet" - return 1 - fi - fi + [[ $2 = restart ]] && \ + +zi::message "{msg2}Restarting the update with the new codebase loaded.{rst}"$'\n' - "${EDITOR:-vim}" "$local_dir" - return 0 -} # ]]] -# FUNCTION: zi::stress [[[ -# Compiles plugin with various options on and off to see -# how well the code is written. The options are: -# -# NO_SHORT_LOOPS, IGNORE_BRACES, IGNORE_CLOSE_BRACES, SH_GLOB, -# CSH_JUNKIE_QUOTES, NO_MULTI_FUNC_DEF. -# -# User-action entry point. -# -# $1 - plugin spec (4 formats: user---plugin, user/plugin, user, plugin) -# $2 - plugin (only when $1 - i.e. user - given) -zi::stress() { - zi::any-to-user-plugin "$1" "$2" - local user="${reply[-2]}" plugin="${reply[-1]}" + local file + integer sum el update_rc + for file ( "" -side -install -autoload ) { + zi::get-mtime-into "${ZINIT[BIN_DIR]}/zinit$file.zsh" el; sum+=el + } - zi::exists-physically-message "$user" "$plugin" || return 1 + # Reload Zinit? + if [[ $2 != restart ]] && (( ZINIT[mtime] + ZINIT[mtime-side] + + ZINIT[mtime-install] + ZINIT[mtime-autoload] != sum + )) { + +zi::message "{msg2}Detected Zinit update in another session -" \ + "{pre}reloading Zinit{msg2}{…}{rst}" + source $ZINIT[BIN_DIR]/zinit.zsh + source $ZINIT[BIN_DIR]/zinit-side.zsh + source $ZINIT[BIN_DIR]/zinit-install.zsh + source $ZINIT[BIN_DIR]/zinit-autoload.zsh + for file ( "" -side -install -autoload ) { + zi::get-mtime-into "${ZINIT[BIN_DIR]}/zinit$file.zsh" "ZINIT[mtime$file]" + } + +zi::message "%B{pname}Done.{rst}"$'\n' + zi::update-or-status-all "$1" restart + return $? + } - zi::first "$1" "$2" || { - builtin print "${ZINIT[col-error]}No source file found, cannot stress${ZINIT[col-rst]}" - return 1 + integer retval + + if (( OPTS[opt_-p,--parallel] )) && [[ $1 = update ]] { + (( !OPTS[opt_-q,--quiet] )) && \ + +zi::message '{info2}Parallel Update Starts Now{…}{rst}' + zi::update-all-parallel + retval=$? + zi::compinit 1 1 &>/dev/null + rehash + if (( !OPTS[opt_-q,--quiet] )) { + +zi::message "{msg2}The update took {obj}${SECONDS}{msg2} seconds{rst}" + } + return $retval } - local pdir_path="${reply[-2]}" fname="${reply[-1]}" + local st=$1 id_as repo snip pd user plugin + integer PUPDATE=0 - integer compiled=1 - [[ -e "${fname}.zwc" ]] && command rm -f "${fname}.zwc" || compiled=0 + local -A ICE - local -a ZINIT_STRESS_TEST_OPTIONS - ZINIT_STRESS_TEST_OPTIONS=( - "NO_SHORT_LOOPS" "IGNORE_BRACES" "IGNORE_CLOSE_BRACES" - "SH_GLOB" "CSH_JUNKIE_QUOTES" "NO_MULTI_FUNC_DEF" - ) - ( - builtin emulate -LR ksh ${=${options[xtrace]:#off}:+-o xtrace} - builtin unsetopt shglob kshglob - for i in "${ZINIT_STRESS_TEST_OPTIONS[@]}"; do - builtin setopt "$i" - builtin print -n "Stress-testing ${fname:t} for option $i " - zcompile -UR "$fname" 2>/dev/null && { - builtin print "[${ZINIT[col-success]}Success${ZINIT[col-rst]}]" - } || { - builtin print "[${ZINIT[col-failure]}Fail${ZINIT[col-rst]}]" - } - builtin unsetopt "$i" - done - ) + if (( OPTS[opt_-s,--snippets] || !OPTS[opt_-l,--plugins] )) { + local -a snipps + snipps=( ${ZINIT[SNIPPETS_DIR]}/**/(._zinit|._zplugin)(ND) ) - command rm -f "${fname}.zwc" - (( compiled )) && zcompile -U "$fname" -} # ]]] -# FUNCTION: zi::list-compdef-replay [[[ -# Shows recorded compdefs (called by plugins loaded earlier). -# Plugins often call `compdef' hoping for `compinit' being -# already ran. Zinit solves this by recording compdefs. -# -# User-action entry point. -zi::list-compdef-replay() { - builtin print "Recorded compdefs:" - local cdf - for cdf in "${ZINIT_COMPDEF_REPLAY[@]}"; do - builtin print "compdef ${(Q)cdf}" - done -} # ]]] -# FUNCTION: zi::ls [[[ -zi::ls() { - (( ${+commands[tree]} )) || { - builtin print "${ZINIT[col-error]}No \`tree' program, it is required by the subcommand \`ls\'${ZINIT[col-rst]}" - builtin print "Download from: http://mama.indstate.edu/users/ice/tree/" - builtin print "It is also available probably in all distributions and Homebrew, as package \`tree'" + [[ $st != status && ${OPTS[opt_-q,--quiet]} != 1 && -n $snipps ]] && \ + +zi::message "{info}Note:{rst} updating also unloaded snippets" + + for snip ( ${ZINIT[SNIPPETS_DIR]}/**/(._zinit|._zplugin)/mode(D) ) { + [[ ! -f ${snip:h}/url ]] && continue + [[ -f ${snip:h}/id-as ]] && \ + id_as="$(<${snip:h}/id-as)" || \ + id_as= + zi::update-or-status-snippet "$st" "${id_as:-$(<${snip:h}/url)}" + ICE=() + } + [[ -n $snipps ]] && builtin print } - ( - setopt localoptions extendedglob nokshglob noksharrays - builtin cd -q "${ZINIT[SNIPPETS_DIR]}" - local -a list - local -x LANG=en_US.utf-8 - list=( "${(f@)"$(${=ZINIT[LIST_COMMAND]})"}" ) - # Oh-My-Zsh single file - list=( "${list[@]//(#b)(https--github.com--(ohmyzsh|robbyrussel)l--oh-my-zsh--raw--master(--)(#c0,1)(*))/$ZINIT[col-info]Oh-My-Zsh$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](single-file)$ZINIT[col-rst] ${match[1]}}" ) - # Oh-My-Zsh SVN - list=( "${list[@]//(#b)(https--github.com--(ohmyzsh|robbyrussel)l--oh-my-zsh--trunk(--)(#c0,1)(*))/$ZINIT[col-info]Oh-My-Zsh$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](SVN)$ZINIT[col-rst] ${match[1]}}" ) - # Prezto single file - list=( "${list[@]//(#b)(https--github.com--sorin-ionescu--prezto--raw--master(--)(#c0,1)(*))/$ZINIT[col-info]Prezto$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](single-file)$ZINIT[col-rst] ${match[1]}}" ) - # Prezto SVN - list=( "${list[@]//(#b)(https--github.com--sorin-ionescu--prezto--trunk(--)(#c0,1)(*))/$ZINIT[col-info]Prezto$ZINIT[col-error]${match[2]/--//}$ZINIT[col-pname]${match[3]//--/$ZINIT[col-error]/$ZINIT[col-pname]} $ZINIT[col-info](SVN)$ZINIT[col-rst] ${match[1]}}" ) - # First-level names - list=( "${list[@]//(#b)(#s)(│   └──| └──| ├──|│   ├──) (*)/${match[1]} $ZINIT[col-p]${match[2]}$ZINIT[col-rst]}" ) + ICE=() - list[-1]+=", located at ZINIT[SNIPPETS_DIR], i.e. ${ZINIT[SNIPPETS_DIR]}" - builtin print -rl -- "${list[@]}" - ) -} # ]]] -# FUNCTION: zi::get-path [[[ -# Returns path of given ID-string, which may be a plugin-spec -# (like "user/plugin" or "user" "plugin"), an absolute path -# ("%" "/home/..." and also "%SNIPPETS/..." etc.), or a plugin -# nickname (i.e. id-as'' ice-mod), or a snippet nickname. -zi::get-path() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob warncreateglobal typesetsilent noshortloops + if (( OPTS[opt_-s,--snippets] && !OPTS[opt_-l,--plugins] )) { + return + } - [[ $1 == % ]] && local id_as=%$2 || local id_as=$1${1:+/}$2 - zi::get-object-path snippet "$id_as" || \ - zi::get-object-path plugin "$id_as" + if [[ $st = status ]]; then + (( !OPTS[opt_-q,--quiet] )) && \ + +zi::message "{info}Note:{rst} status done also for unloaded plugins" + else + (( !OPTS[opt_-q,--quiet] )) && \ + +zi::message "{info}Note:{rst} updating also unloaded plugins" + fi - return $(( 1 - reply[3] )) -} # ]]] -# FUNCTION: zi::recall [[[ -zi::recall() { - builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} - setopt extendedglob warncreateglobal typesetsilent noshortloops + ZINIT[first-plugin-mark]=init - local -A ice - local el val cand1 cand2 local_dir filename is_snippet + for repo in ${ZINIT[PLUGINS_DIR]}/*; do + pd=${repo:t} - local -a ice_order nval_ices output - ice_order=( - ${(s.|.)ZINIT[ice-list]} + # Two special cases + [[ $pd = custom || $pd = _local---zinit ]] && continue - # Include all additional ices – after - # stripping them from the possible: '' - ${(@)${(@Akons:|:u)${ZINIT_EXTS[ice-mods]//\'\'/}}/(#s)<->-/} - ) - nval_ices=( - ${(s.|.)ZINIT[nval-ice-list]} - # Include only those additional ices, - # don't have the '' in their name, i.e. - # aren't designed to hold value - ${(@)${(@)${(@Akons:|:u)ZINIT_EXTS[ice-mods]}:#*\'\'*}/(#s)<->-/} + zi::any-colorify-as-uspl2 "$pd" - # Must be last - svn - ) - zi::compute-ice "$1${${1:#(%|/)*}:+${2:+/}}$2" "pack" \ - ice local_dir filename is_snippet || return 1 + # Check if repository has a remote set + if [[ -f $repo/.git/config ]]; then + local -a config + config=( ${(f)"$(<$repo/.git/config)"} ) + if [[ ${#${(M)config[@]:#\[remote[[:blank:]]*\]}} -eq 0 ]]; then + if (( !OPTS[opt_-q,--quiet] )) { + [[ $pd = _local---* ]] && \ + builtin print -- "\nSkipping local plugin $REPLY" || \ + builtin print "\n$REPLY doesn't have a remote set, will not fetch" + } + continue + fi + fi - [[ -e $local_dir ]] && { - for el ( ${ice_order[@]} ) { - val="${ice[$el]}" - cand1="${(qqq)val}" - cand2="${(qq)val}" - if [[ -n "$val" ]] { - [[ "${cand1/\\\$/}" != "$cand1" || "${cand1/\\\!/}" != "$cand1" ]] && output+=( "$el$cand2" ) || output+=( "$el$cand1" ) - } elif [[ ${+ice[$el]} = 1 && -n "${nval_ices[(r)$el]}" ]] { - output+=( "$el" ) - } - } + zi::any-to-user-plugin "$pd" + local user=${reply[-2]} plugin=${reply[-1]} - if [[ ${#output} = 0 ]]; then - builtin print -zr "# No Ice modifiers" + # Must be a git repository or a binary release + if [[ ! -d $repo/.git && ! -f $repo/._zinit/is_release ]]; then + (( !OPTS[opt_-q,--quiet] )) && \ + builtin print "$REPLY: not a git repository" + continue + fi + + if [[ $st = status ]]; then + builtin print "\nStatus for plugin $REPLY" + ( builtin cd -q "$repo"; command git status ) else - builtin print -zr "zinit ice ${output[*]}; zinit " + (( !OPTS[opt_-q,--quiet] )) && builtin print "Updating $REPLY" || builtin print -n . + zi::update-or-status update "$user" "$plugin" + update_rc=$? + [[ $update_rc -ne 0 ]] && { + +zi::message "🚧{warn}Warning: {pid}${user}/${plugin} {warn}update returned {obj}$update_rc" + retval=$? + } fi - +zi::deploy-message @rst - } || builtin print -r -- "No such plugin or snippet" + done + + zi::compinit 1 1 &>/dev/null + if (( !OPTS[opt_-q,--quiet] )) { + +zi::message "{msg2}The update took {obj}${SECONDS}{msg2} seconds{rst}" + } + + return "$retval" } # ]]] -# FUNCTION: zi::module [[[ -# Function that has sub-commands passed as long-options (with two dashes, --). -# It's an attempt to plugin only this one function into `zinit' function -# defined in zinit.zsh, to not make this file longer than it's needed. -zi::module() { - if [[ "$1" = "build" ]]; then - zi::build-module "${@[2,-1]}" - elif [[ "$1" = "info" ]]; then - if [[ "$2" = "--link" ]]; then - builtin print -r "You can copy the error messages and submit" - builtin print -r "error-report at: https://github.com/zdharma-continuum/zinit-module/issues" +# FUNCTION: zi::update-or-status-snippet [[[ +# +# Implements update or status operation for snippet given by URL. +# +# $1 - "status" or "update" +# $2 - snippet URL +zi::update-or-status-snippet() { + local st="$1" URL="${2%/}" local_dir filename is_snippet + (( ${#ICE[@]} > 0 )) && { ZINIT_SICE[$URL]=""; local nf="-nftid"; } + local -A ICE2 + zi::compute-ice "$URL" "pack$nf" \ + ICE2 local_dir filename is_snippet || return 1 + + integer retval + + if [[ "$st" = "status" ]]; then + if (( ${+ICE2[svn]} )); then + builtin print -r -- "${ZINIT[col-info]}Status for ${${${local_dir:h}:t}##*--}/${local_dir:t}${ZINIT[col-rst]}" + ( builtin cd -q "$local_dir"; command svn status -vu ) + retval=$? + builtin print else - builtin print -r "To load the module, add following 2 lines to .zshrc, at top:" - builtin print -r " module_path+=( \"${ZINIT[MODULE_DIR]}/Src\" )" - builtin print -r " zmodload zdharma_continuum/zinit" - builtin print -r "" - builtin print -r "After loading, use command \`zpmod' to communicate with the module." - builtin print -r "See \`zpmod -h' for more information." + builtin print -r -- "${ZINIT[col-info]}Status for ${${local_dir:h}##*--}/$filename${ZINIT[col-rst]}" + ( builtin cd -q "$local_dir"; command ls -lth $filename ) + retval=$? + builtin print fi - elif [[ "$1" = (help|usage) ]]; then - builtin print -r "Usage: zinit module {build|info|help} [options]" - builtin print -r " zinit module build [--clean]" - builtin print -r " zinit module info [--link]" - builtin print -r "" - builtin print -r "To start using the zinit Zsh module run: \`zinit module build'" - builtin print -r "and follow the instructions. Option --clean causes \`make distclean'" - builtin print -r "to be run. To display the instructions on loading the module, run:" - builtin print -r "\`zinit module info'." + else + (( ${+functions[zi::setup-plugin-dir]} )) || builtin source ${ZINIT[BIN_DIR]}"/zinit-install.zsh" + ICE=( "${(kv)ICE2[@]}" ) + zi::update-snippet "${ICE2[teleid]:-$URL}" + retval=$? fi + + ICE=() + + if (( PUPDATE && ZINIT[annex-multi-flag:pull-active] > 0 )) { + builtin print ${ZINIT[annex-multi-flag:pull-active]} >! $PUFILE.ind + } + + return $retval } # ]]] -# FUNCTION: zi::build-module [[[ -# Performs ./configure && make on the module and displays information -# how to load the module in .zshrc. -zi::build-module() { - setopt localoptions localtraps - trap 'return 1' INT TERM - if command git -C "${ZINIT[MODULE_DIR]}" rev-parse 2>/dev/null; then - command git -C "${ZINIT[MODULE_DIR]}" clean -d -f -f - command git -C "${ZINIT[MODULE_DIR]}" reset --hard HEAD - command git -C "${ZINIT[MODULE_DIR]}" pull - else - command git clone "https://github.com/zdharma-continuum/zinit-module.git" "${ZINIT[MODULE_DIR]}" || { - builtin print "${ZINIT[col-error]}Failed to clone module repo${ZINIT[col-rst]}" - return 1 +# FUNCTION: zi::wait-for-update-jobs [[[ +zi::wait-for-update-jobs() { + local tpe=$1 + if (( counter > OPTS[value] || main_counter == 0 )) { + wait ${(k)PUAssocArray} + local ind_file + for ind_file ( ${^${(von)PUAssocArray}}.ind(DN.) ) { + command cat ${ind_file:r} + (( !OPTS[opt_-d,--debug] && !ZINIT[DEBUG_MODE] )) && \ + command rm -f $ind_file } - fi - ( builtin cd -q "${ZINIT[MODULE_DIR]}" - +zi::message "{pname}== Building module zdharma-continuum/zinit-module, running: make clean, then ./configure and then make =={rst}" - +zi::message "{pname}== The module sources are located at: "${ZINIT[MODULE_DIR]}" =={rst}" - if [[ -f Makefile ]] { - if [[ "$1" = "--clean" ]] { - noglob +zi::message {p}-- make distclean --{rst} - make distclean - ((1)) - } else { - noglob +zi::message {p}-- make clean --{rst} - make clean - } - } - noglob +zi::message {p}-- ./configure --{rst} - CPPFLAGS=-I/usr/local/include CFLAGS="-g -Wall -O3" LDFLAGS=-L/usr/local/lib ./configure --disable-gdbm --without-tcsetpgrp && { - noglob +zi::message {p}-- make --{rst} - if { make } { - [[ -f Src/zdharma_continuum/zinit.so ]] && cp -vf Src/zdharma_continuum/zinit.{so,bundle} - noglob +zi::message "{info}Module has been built correctly.{rst}" - zi::module info - } else { - noglob +zi::message "{error}Module didn't build.{rst} " - zi::module info --link - } - } - builtin print $EPOCHSECONDS >! "${ZINIT[MAN_DIR]}/COMPILED_AT" - ) + (( !OPTS[opt_-d,--debug] && !ZINIT[DEBUG_MODE] )) && \ + command rm -f ${(v)PUAssocArray} + counter=0 + PUAssocArray=() + } elif (( counter == 1 && !OPTS[opt_-q,--quiet] )) { + +zi::message "{obj}Spawning the next{num}" \ + "${OPTS[value]}{obj} concurrent update jobs" \ + "({msg2}${tpe}{obj}){…}{rst}" + } } # ]]] # diff --git a/zinit.zsh b/zinit.zsh index c0c5b7581..8ebac767c 100644 --- a/zinit.zsh +++ b/zinit.zsh @@ -1282,6 +1282,7 @@ zi::prepare-home() { command cp -f $ZINIT[BIN_DIR]/doc/zinit.1 $ZINIT[MAN_DIR]/man1 } } # ]]] + # FUNCTION: zi::load-object [[[ zi::load-object() { local ___type="$1" ___id=$2 @@ -1296,8 +1297,8 @@ zi::load-object() { ___retval+=$? return __retval -} -# ]]] +} # ]]] + # FUNCTION: zi::set-m-func [[[ # Sets and withdraws the temporary, atclone/atpull time function `m`. zi::set-m-func() {