qbit and vim

This commit is contained in:
2024-03-12 13:41:48 -04:00
parent 81c9080483
commit f3a0a7ec7a
171 changed files with 15225 additions and 8 deletions

BIN
qbit/macchiato.qbtheme Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

View File

@@ -0,0 +1 @@
import{aA as f}from"./index-135ae4c1.js";import{c as d,J as t}from"./vue-d2584a6d.js";function h(a,e,o=1){const{currentPage:n,currentPageSize:r,pageCount:u,isFirstPage:c,isLastPage:i,next:g,prev:l}=f({total:()=>t(a).length,page:o,pageSize:()=>t(e)===-1?t(a).length:t(e)}),p=d(()=>{const s=(n.value-1)*t(e),P=s+r.value;return t(a).slice(s,P)});return{currentPage:n,currentPageSize:r,pageCount:u,isFirstPage:c,isLastPage:i,next:g,prev:l,paginatedResults:p}}export{h as u};

View File

@@ -0,0 +1 @@
.menu-scrollable[data-v-4e81b4b5]{max-height:500px;overflow:visible}.gap[data-v-08ef66f1]{gap:8px}.gap[data-v-60c9ae77]{gap:8px 16px}#torrentList[data-v-31f288a6]{background-color:unset}.gap[data-v-e5ea358f]{gap:8px 16px}#torrentList[data-v-e8f6336b]{background-color:unset}.gap[data-v-23c01601]{gap:8px}#torrentList[data-v-8832d38a]{background-color:unset}#torrentList tbody tr[data-v-8832d38a]:nth-child(odd){background-color:rgb(var(--v-theme-surface))}#torrentList tbody tr.selected[data-v-8832d38a]{position:relative}#torrentList tbody tr.selected[data-v-8832d38a]:nth-child(odd):after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}

View File

@@ -0,0 +1 @@
import{g as w,ae as kt,a1 as d,a2 as T,a3 as i,ab as _,W as x,Z as p,a8 as R,a6 as f,m as a,a7 as H,af as et,ag as tt,F,K as Ue,d as O,r as ot,c as C,M as Se,x as at,u,Y as J,ao as $e,D as he,$ as nt,n as N,ap as lt,aq as rt,S as Fe,a5 as se,N as _e,P as Ce,a0 as Xe,w as Tt,q as $t,ar as Ct,A as We}from"./vue-d2584a6d.js";import{V as le,a as De,b as Ge,c as Ie,d as re,u as He,e as fe,f as Ke,g as be,h as ze,i as Q,j as qe,k as M,l as Z,m as Ye,n as Be,o as Vt,p as Oe,q as Ve,r as ve,s as Te,t as ee,v as st,w as wt,x as q,C as it,_ as X,y as U,z as we,A as St,B as Dt,T as L,D as dt,E as ut,F as It,G as Bt,H as B,I as je,J as Pt,K as Et,L as xt,R as Lt,M as K,N as Je,O as Ne,P as At,Q as Rt}from"./index-135ae4c1.js";import{_ as Qe}from"./dayjs-f7aba705.js";import"./faker-c43f92d4.js";import{d as ie}from"./dayjs.min-1969f9c6.js";import{ac as ct}from"./vuetify-e547ef1b.js";import{u as Mt}from"./ArrayPagination-26934cac.js";import{d as Ot}from"./index-fd06c5c5.js";const Nt={class:"d-flex"},Ut={key:2},Ft={key:3},Gt=w({__name:"RightClickMenuEntry",props:{text:{},icon:{},action:{type:Function},hidden:{type:Boolean},disabled:{type:Boolean},disabledText:{},disabledIcon:{},divider:{type:Boolean},children:{}},setup(h){return(e,l)=>{const t=kt("RightClickMenuEntry",!0);return e.hidden?R("",!0):(d(),T(re,{key:0,class:"px-3 pointer",disabled:e.disabled,onClick:e.action},{default:i(()=>[_("div",Nt,[e.disabled&&e.disabledIcon?(d(),T(le,{key:0,class:"mr-2"},{default:i(()=>[x(p(e.disabledIcon),1)]),_:1})):e.icon?(d(),T(le,{key:1,class:"mr-2"},{default:i(()=>[x(p(e.icon),1)]),_:1})):R("",!0),e.disabled&&e.disabledText?(d(),f("span",Ut,p(e.disabledText),1)):(d(),f("span",Ft,p(e.text),1)),a(De),!e.disabled&&e.children?(d(),T(le,{key:4},{default:i(()=>[x("mdi-chevron-right")]),_:1})):R("",!0)]),e.children?(d(),T(Ge,{key:0,activator:"parent","open-on-hover":!0,"open-on-click":!0,"close-delay":"0","open-delay":"0",location:"right"},{default:i(()=>[a(Ie,null,{default:i(()=>[(d(!0),f(F,null,H(e.children,n=>(d(),T(t,et(tt(n)),null,16))),256))]),_:1})]),_:1})):R("",!0)]),_:1},8,["disabled","onClick"]))}}}),Ht=w({__name:"RenameTorrentDialog",props:{guid:{},hash:{}},setup(h){const e=h,{isOpened:l}=He(e.guid),{t}=Ue(),n=fe(),r=O(),o=O(),s=O(!1),c=ot({newName:""}),v=[P=>!!P||t("dialogs.renameTorrent.required"),P=>P!==S.value||t("dialogs.renameTorrent.sameName")],k=C(()=>n.getTorrentByHash(e.hash)),S=C(()=>k.value?.name);async function A(){await o.value?.validate(),s.value&&(await n.renameTorrent(e.hash,c.newName),y())}const y=()=>{l.value=!1};return Se(()=>{c.newName=k.value?.name||""}),at(()=>{r.value?.select()}),(P,E)=>(d(),T(Ye,{modelValue:u(l),"onUpdate:modelValue":E[3]||(E[3]=V=>he(l)?l.value=V:null)},{default:i(()=>[a(Z,null,{default:i(()=>[a(Ke,null,{default:i(()=>[x(p(P.$t("dialogs.renameTorrent.title")),1)]),_:1}),a(be,null,{default:i(()=>[a(u(ze),{modelValue:s.value,"onUpdate:modelValue":E[1]||(E[1]=V=>s.value=V),ref_key:"form",ref:o,onSubmit:E[2]||(E[2]=J(()=>{},["prevent"]))},{default:i(()=>[S.value?(d(),T(Q,{key:0,"model-value":S.value,disabled:"",label:P.$t("dialogs.renameTorrent.oldName")},null,8,["model-value","label"])):R("",!0),a(Q,{modelValue:c.newName,"onUpdate:modelValue":E[0]||(E[0]=V=>c.newName=V),ref_key:"field",ref:r,rules:v,autofocus:"",label:P.$t("dialogs.renameTorrent.newName"),onKeydown:$e(A,["enter"])},null,8,["modelValue","label"])]),_:1},8,["modelValue"])]),_:1}),a(qe,null,{default:i(()=>[a(De),a(M,{color:"error",onClick:y},{default:i(()=>[x(p(P.$t("common.cancel")),1)]),_:1}),a(M,{color:"accent",disabled:!s.value,onClick:A},{default:i(()=>[x(p(P.$t("common.save")),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"]))}}),ne=-2,z=-1,Kt=w({__name:"ShareLimitDialog",props:{guid:{},hashes:{}},setup(h){const e=h,{isOpened:l}=He(e.guid),t=Be(),n=fe(),r=O(!1),o=O("global"),s=O(!1),c=O(0),v=O(!1),k=O(0),S=O(!1),A=O(0),y=C(()=>o.value!=="enabled");function P(){l.value=!1}async function E(){switch(o.value){case"global":await t.setShareLimit(e.hashes,ne,ne,ne);break;case"disabled":await t.setShareLimit(e.hashes,z,z,z);break;case"enabled":await t.setShareLimit(e.hashes,s.value?c.value:z,v.value?k.value:z,S.value?A.value:z);break}P()}return Se(async()=>{const V=n.getTorrentByHash(e.hashes[0]);if(!V)return P();const g=V.ratio_limit,D=V.seeding_time_limit,Y=V.inactive_seeding_time_limit;g===ne&&D===ne&&Y===ne?o.value="global":g===z&&D===z&&Y===z?o.value="disabled":(o.value="enabled",s.value=g>=0,c.value=s.value?g:0,v.value=D>=0,k.value=v.value?D:0,S.value=Y>=0,A.value=S.value?Y:0)}),(V,g)=>(d(),T(Ye,{modelValue:u(l),"onUpdate:modelValue":g[9]||(g[9]=D=>he(l)?l.value=D:null),"max-width":"500"},{default:i(()=>[a(Z,{title:V.$t("dialogs.share_limit.title")},{default:i(()=>[a(be,null,{default:i(()=>[a(ze,{modelValue:r.value,"onUpdate:modelValue":g[7]||(g[7]=D=>r.value=D),onSubmit:g[8]||(g[8]=J(()=>{},["prevent"])),onKeydown:$e(J(E,["prevent"]),["enter"])},{default:i(()=>[a(Vt,{modelValue:o.value,"onUpdate:modelValue":g[0]||(g[0]=D=>o.value=D)},{default:i(()=>[a(Oe,{label:V.$t("dialogs.share_limit.global"),value:"global"},null,8,["label"]),a(Oe,{label:V.$t("dialogs.share_limit.disabled"),value:"disabled"},null,8,["label"]),a(Oe,{label:V.$t("dialogs.share_limit.enabled"),value:"enabled"},null,8,["label"])]),_:1},8,["modelValue"]),a(Ve,null,{default:i(()=>[a(ve,{cols:"12",class:"d-flex align-center"},{default:i(()=>[_("span",null,[a(Te,{modelValue:s.value,"onUpdate:modelValue":g[1]||(g[1]=D=>s.value=D),disabled:y.value},null,8,["modelValue","disabled"])]),a(Q,{modelValue:c.value,"onUpdate:modelValue":g[2]||(g[2]=D=>c.value=D),disabled:y.value||!s.value,density:"compact","hide-details":"",label:V.$t("dialogs.share_limit.ratio_limit")},null,8,["modelValue","disabled","label"])]),_:1}),a(ve,{cols:"12",class:"d-flex align-center"},{default:i(()=>[_("span",null,[a(Te,{modelValue:v.value,"onUpdate:modelValue":g[3]||(g[3]=D=>v.value=D),disabled:y.value},null,8,["modelValue","disabled"])]),a(Q,{modelValue:k.value,"onUpdate:modelValue":g[4]||(g[4]=D=>k.value=D),disabled:y.value||!v.value,density:"compact","hide-details":"",label:V.$t("dialogs.share_limit.seeding_time_limit")},null,8,["modelValue","disabled","label"])]),_:1}),a(ve,{cols:"12",class:"d-flex align-center"},{default:i(()=>[_("span",null,[a(Te,{modelValue:S.value,"onUpdate:modelValue":g[5]||(g[5]=D=>S.value=D),disabled:y.value},null,8,["modelValue","disabled"])]),a(Q,{modelValue:A.value,"onUpdate:modelValue":g[6]||(g[6]=D=>A.value=D),disabled:y.value||!S.value,density:"compact","hide-details":"",label:V.$t("dialogs.share_limit.inactive_seeding_time_limit")},null,8,["modelValue","disabled","label"])]),_:1})]),_:1})]),_:1},8,["modelValue","onKeydown"])]),_:1}),a(qe,null,{default:i(()=>[a(De),a(M,{color:"error",onClick:P},{default:i(()=>[x(p(V.$t("common.cancel")),1)]),_:1}),a(M,{color:"accent",disabled:!r.value,onClick:E},{default:i(()=>[x(p(V.$t("common.save")),1)]),_:1},8,["disabled"])]),_:1})]),_:1},8,["title"])]),_:1},8,["modelValue"]))}}),Ze=w({__name:"SpeedLimitDialog",props:{guid:{},hashes:{},mode:{}},setup(h){const e=h,{isOpened:l}=He(e.guid),t=Be(),n=fe(),r=O(!1),o=O(0);function s(){l.value=!1}async function c(){const v=Math.max(0,o.value)*1e3;switch(e.mode){case"download":await t.setDownloadLimit(v,e.hashes);break;case"upload":await t.setUploadLimit(v,e.hashes);break}s()}return Se(async()=>{const v=n.getTorrentByHash(e.hashes[0]);if(!v)return s();switch(e.mode){case"download":o.value=Math.max(0,Math.round(v.dl_limit/1e3));break;case"upload":o.value=Math.max(0,Math.round(v.up_limit/1e3));break}}),(v,k)=>(d(),T(Ye,{modelValue:u(l),"onUpdate:modelValue":k[3]||(k[3]=S=>he(l)?l.value=S:null)},{default:i(()=>[a(Z,{title:v.$t(`dialogs.speed_limit.${v.mode}`)},{default:i(()=>[a(be,null,{default:i(()=>[a(ze,{modelValue:r.value,"onUpdate:modelValue":k[1]||(k[1]=S=>r.value=S),onSubmit:k[2]||(k[2]=J(()=>{},["prevent"])),onKeydown:$e(J(c,["prevent"]),["enter"])},{default:i(()=>[a(Q,{modelValue:o.value,"onUpdate:modelValue":k[0]||(k[0]=S=>o.value=S),type:"number",autofocus:"",clearable:"",label:v.$t("dialogs.speed_limit.label"),"prepend-inner-icon":"mdi-speedometer",suffix:"kB/s",onKeydown:$e(J(c,["prevent"]),["enter"])},null,8,["modelValue","label","onKeydown"])]),_:1},8,["modelValue","onKeydown"])]),_:1}),a(qe,null,{default:i(()=>[a(De),a(M,{color:"error",onClick:s},{default:i(()=>[x(p(v.$t("common.cancel")),1)]),_:1}),a(M,{color:"accent",disabled:!r.value,onClick:c},{default:i(()=>[x(p(v.$t("common.save")),1)]),_:1},8,["disabled"])]),_:1})]),_:1},8,["title"])]),_:1},8,["modelValue"]))}}),Pe=h=>(lt("data-v-4e81b4b5"),h=h(),rt(),h),zt={class:"d-flex justify-space-around"},qt=Pe(()=>_("span",null,"Resume",-1)),Yt=Pe(()=>_("span",null,"Force Resume",-1)),jt=Pe(()=>_("span",null,"Pause",-1)),Xt=Pe(()=>_("span",null,"Delete",-1)),Wt=w({__name:"RightClickMenu",props:{modelValue:{type:Boolean}},emits:["update:modelValue"],setup(h,{emit:e}){const l=h,t=e,{t:n}=Ue(),r=nt(),o=ee(),s=st(),c=Be(),v=wt(),k=fe(),S=C({get:()=>l.modelValue,set:I=>t("update:modelValue",I)}),A=C(()=>o.selectedTorrents.length>1),y=C(()=>o.selectedTorrents),P=C(()=>y.value[0]),E=C(()=>k.getTorrentByHash(P.value)),V=C(()=>o.selectedTorrents.map(k.getTorrentByHash).filter(I=>!!I)),g=C(()=>[{name:""},...c.categories]);async function D(){await k.resumeTorrents(y)}async function Y(){await k.forceResumeTorrents(y)}async function Ee(){await k.pauseTorrents(y)}function xe(){s.createDialog(it,{hashes:[...o.selectedTorrents]})}function de(){s.createDialog(Qe,{hashes:[...o.selectedTorrents],mode:"dl"})}function j(){s.createDialog(Qe,{hashes:[...o.selectedTorrents],mode:"save"})}function te(){s.createDialog(Ht,{hash:o.selectedTorrents[0]})}async function Le(){await k.recheckTorrents(y)}async function ge(){await c.reannounceTorrents(y)}async function oe(){await c.toggleSeqDl(y)}async function Ae(){await c.toggleFLPiecePrio(y)}async function ue(){await c.toggleAutoTmm(y,!E.value?.auto_tmm)}function ye(I){return V.value.every(G=>G&&G.tags&&G.tags.includes(I))}async function Re(I){ye(I)?await k.removeTorrentTags(y.value,[I]):await k.addTorrentTags(y.value,[I])}async function W(I){await navigator.clipboard.writeText(I)}function ce(){s.createDialog(Ze,{hashes:y.value,mode:"download"})}function pe(){s.createDialog(Ze,{hashes:y.value,mode:"upload"})}function ae(){s.createDialog(Kt,{hashes:y.value})}async function ke(){y.value.forEach(I=>{k.exportTorrent(I).then(G=>{const m=window.URL.createObjectURL(G),b=document.createElement("a");b.href=m,b.style.opacity="0",b.setAttribute("download",`${I}.torrent`),document.body.appendChild(b),b.click(),document.body.removeChild(b)})})}const me=C(()=>[{text:n("dashboard.right_click.advanced.title"),icon:"mdi-head-cog",children:[{text:n("dashboard.right_click.advanced.download_path"),icon:"mdi-tray-arrow-down",action:de},{text:n("dashboard.right_click.advanced.save_path"),icon:"mdi-content-save",action:j},{text:n("dashboard.right_click.advanced.rename"),icon:"mdi-rename-box",hidden:A.value,action:te},{text:n("dashboard.right_click.advanced.recheck"),icon:"mdi-playlist-check",action:Le},{text:n("dashboard.right_click.advanced.reannounce"),icon:"mdi-bullhorn",action:ge},{text:n("dashboard.right_click.advanced.seq_dl"),icon:E.value?.seq_dl?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",action:oe},{text:n("dashboard.right_click.advanced.f_l_prio"),icon:E.value?.f_l_piece_prio?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",action:Ae},{text:n("dashboard.right_click.advanced.auto_tmm"),icon:E.value?.auto_tmm?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",action:ue}]},{text:n("dashboard.right_click.priority.title"),icon:"mdi-priority-high",hidden:!v.preferences.queueing_enabled,children:[{text:n("dashboard.right_click.priority.top"),icon:"mdi-priority-high",action:async()=>await k.setTorrentPriority(y.value,"topPrio")},{text:n("dashboard.right_click.priority.increase"),icon:"mdi-arrow-up",action:async()=>await k.setTorrentPriority(y.value,"increasePrio")},{text:n("dashboard.right_click.priority.decrease"),icon:"mdi-arrow-down",action:async()=>await k.setTorrentPriority(y.value,"decreasePrio")},{text:n("dashboard.right_click.priority.bottom"),icon:"mdi-priority-low",action:async()=>await k.setTorrentPriority(y.value,"bottomPrio")}]},{text:n("dashboard.right_click.tags.title"),icon:"mdi-tag",disabled:c.tags.length===0,disabledText:n("dashboard.right_click.tags.disabled_title"),disabledIcon:"mdi-tag-off",children:c.tags.map(I=>({text:I,icon:ye(I)?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",action:async()=>await Re(I)}))},{text:n("dashboard.right_click.category.title"),icon:"mdi-label",disabled:c.categories.length===0,disabledText:n("dashboard.right_click.category.disabled_title"),disabledIcon:"mdi-label-off",children:g.value.map(I=>({text:I.name===""?n("dashboard.right_click.category.clear"):I.name,action:async()=>await k.setTorrentCategory(y.value,I.name)}))},{text:n("dashboard.right_click.speed_limit.title"),icon:"mdi-speedometer-slow",children:[{text:n("dashboard.right_click.speed_limit.download"),icon:"mdi-download",action:ce},{text:n("dashboard.right_click.speed_limit.upload"),icon:"mdi-upload",action:pe},{text:n("dashboard.right_click.speed_limit.share"),icon:"mdi-account-group",action:ae}]},{text:n("dashboard.right_click.copy.title"),icon:"mdi-content-copy",hidden:A.value,children:[{text:n("dashboard.right_click.copy.name"),icon:"mdi-alphabetical-variant",action:async()=>E.value&&await W(E.value.name)},{text:n("dashboard.right_click.copy.hash"),icon:"mdi-pound",action:async()=>await W(P.value)},{text:n("dashboard.right_click.copy.magnet"),icon:"mdi-magnet",action:async()=>E.value&&await W(E.value.magnet)}]},{text:n("dashboard.right_click.export",o.selectedTorrents.length),icon:A.value?"mdi-download-multiple":"mdi-download",action:ke},{text:n("dashboard.right_click.info"),icon:"mdi-information",hidden:A.value,action:()=>r.push({name:"torrentDetail",params:{hash:P.value}})}]);return(I,G)=>S.value?(d(),T(Ge,{key:0,modelValue:S.value,"onUpdate:modelValue":G[0]||(G[0]=m=>S.value=m),activator:"parent","close-on-content-click":!0,transition:"slide-y-transition","scroll-strategy":"none"},{default:i(()=>[a(Ie,null,{default:i(()=>[a(re,null,{default:i(()=>[_("div",zt,[a(q,{location:"top"},{activator:i(({props:m})=>[a(M,N({density:"compact",variant:"plain",icon:"mdi-play"},m,{onClick:D}),null,16)]),default:i(()=>[qt]),_:1}),a(q,{location:"top"},{activator:i(({props:m})=>[a(M,N({density:"compact",variant:"plain",icon:"mdi-fast-forward"},m,{onClick:Y}),null,16)]),default:i(()=>[Yt]),_:1}),a(q,{location:"top"},{activator:i(({props:m})=>[a(M,N({density:"compact",variant:"plain",icon:"mdi-pause"},m,{onClick:Ee}),null,16)]),default:i(()=>[jt]),_:1}),a(q,{location:"top"},{activator:i(({props:m})=>[a(M,N({color:"red",density:"compact",variant:"plain",icon:"mdi-delete-forever"},m,{onClick:xe}),null,16)]),default:i(()=>[Xt]),_:1})])]),_:1}),(d(!0),f(F,null,H(me.value,m=>(d(),T(Gt,et(tt(m)),null,16))),256))]),_:1})]),_:1},8,["modelValue"])):R("",!0)}});const Jt=X(Wt,[["__scopeId","data-v-4e81b4b5"]]),Qt={class:"d-flex flex-column"},Zt={class:"text-caption text-grey"},eo={class:"text-caption text-grey"},pt=w({__name:"ItemAmount",props:{torrent:{},title:{},value:{},total:{}},setup(h){return(e,l)=>(d(),f("div",Qt,[_("div",Zt,p(e.$t(`torrent.properties.${e.title}`)),1),_("div",null,[x(p(e.torrent[e.value])+" ",1),_("span",eo," / "+p(e.torrent[e.total]),1)])]))}}),to={key:0,class:"d-flex flex-column"},oo={class:"text-caption text-grey"},ao={class:"d-flex flex-row gap"},no=w({__name:"ItemChip",props:{torrent:{},title:{},value:{},color:{}},setup(h){const e=h,l=U(),t=C(()=>{const r=e.torrent[e.value],o=typeof r;if(o==="string")return r.length>0?[r]:[];if(o==="object")return r}),n=C(()=>t.value.length<1);return(r,o)=>u(l).hideChipIfUnset&&n.value?R("",!0):(d(),f("div",to,[_("div",oo,p(r.$t(`torrent.properties.${r.title}`)),1),_("div",ao,[!t.value||n.value?(d(),T(we,{key:0,color:r.color.replace("$1",r.torrent[r.value]),variant:"flat"},{default:i(()=>[x(p(r.$t(`torrent.properties.empty_${r.value}`)),1)]),_:1},8,["color"])):(d(!0),f(F,{key:1},H(t.value,s=>(d(),T(we,{color:r.color.replace("$1",r.torrent.state),variant:"flat"},{default:i(()=>[x(p(s),1)]),_:2},1032,["color"]))),256))])]))}});const mt=X(no,[["__scopeId","data-v-08ef66f1"]]),lo={class:"d-flex flex-column"},ro={class:"text-caption text-grey"},so={class:"text-caption text-grey"},vt=w({__name:"ItemData",props:{torrent:{},title:{},value:{}},setup(h){const e=U();return(l,t)=>(d(),f("div",lo,[_("div",ro,p(l.$t(`torrent.properties.${l.title}`)),1),_("div",null,[x(p(u(St)(l.torrent[l.value],u(e).useBinarySize))+" ",1),_("span",so,p(u(Dt)(l.torrent[l.value],u(e).useBinarySize)),1)])]))}}),io={class:"d-flex flex-column"},uo={class:"text-caption text-grey"},co={key:0},po={key:1},ht=w({__name:"ItemDateTime",props:{torrent:{},title:{},value:{}},setup(h){const e=U();return(l,t)=>(d(),f("div",io,[_("div",uo,p(l.$t(`torrent.properties.${l.title}`)),1),_("div",null,[l.torrent[l.value]>0?(d(),f("span",co,p(u(ie)(l.torrent[l.value]*1e3).format(u(e).dateFormat??"DD/MM/YYYY, HH:mm:ss")),1)):(d(),f("span",po,p(l.$t("dashboard.not_complete")),1))])]))}}),mo={class:"d-flex flex-column"},vo={class:"text-caption text-grey"},ho={key:0},_o={key:1},_t=w({__name:"ItemDuration",props:{torrent:{},title:{},value:{}},setup(h){const e=h,l=C(()=>{const t=ie.duration(e.torrent[e.value],"seconds"),n=[t.years(),t.months(),t.days(),t.hours(),t.minutes(),t.seconds()],r=["Y","M","d","h","m","s"];let o=!1;return n.map((s,c)=>{if(o||s)return o=!0,`${s}${r[c]}`}).filter(s=>s).join(" ")});return(t,n)=>(d(),f("div",mo,[_("div",vo,p(t.$t(`torrent.properties.${t.title}`)),1),_("div",null,[t.torrent[t.value]>0?(d(),f("span",ho,p(l.value),1)):(d(),f("span",_o,p(t.$t("dashboard.not_complete")),1))])]))}}),fo={class:"d-flex flex-column"},bo={class:"text-caption text-grey"},ft=w({__name:"ItemPercent",props:{torrent:{},title:{},value:{}},setup(h){const e=h,l=C(()=>[L.UPLOADING,L.CHECKING_UP,L.FORCED_UP,L.ALLOCATING,L.DOWNLOADING,L.META_DL,L.CHECKING_DL,L.FORCED_DL,L.CHECKING_RESUME_DATA,L.MOVING].includes(e.torrent.state));return(t,n)=>(d(),f("div",fo,[_("div",bo,p(t.$t(`torrent.properties.${t.title}`)),1),a(ut,{"model-value":t.torrent[t.value],max:1,striped:l.value,height:20,color:`torrent-${t.torrent.state}`,rounded:"sm",style:{width:"10em"}},{default:i(()=>[x(p(u(dt)(t.torrent[t.value])),1)]),_:1},8,["model-value","striped","color"])]))}}),go={class:"d-flex flex-column"},yo={class:"text-caption text-grey"},bt=w({__name:"ItemRelativeTime",props:{torrent:{},title:{},value:{}},setup(h){return(e,l)=>(d(),f("div",go,[_("div",yo,p(e.$t(`torrent.properties.${e.title}`)),1),_("div",null,[_("span",null,p(u(ie)(e.torrent[e.value]*1e3).fromNow()),1)])]))}}),ko={class:"d-flex flex-column"},To={class:"text-caption text-grey"},$o={class:"text-caption text-grey"},gt=w({__name:"ItemSpeed",props:{torrent:{},title:{},value:{}},setup(h){const e=U();return(l,t)=>(d(),f("div",ko,[_("div",To,p(l.$t(`torrent.properties.${l.title}`)),1),_("div",null,[x(p(u(It)(l.torrent[l.value],u(e).useBitSpeed))+" ",1),_("span",$o,p(u(Bt)(l.torrent[l.value],u(e).useBitSpeed)),1)])]))}}),Co={class:"d-flex flex-column"},Vo={class:"text-caption text-grey"},yt=w({__name:"ItemText",props:{torrent:{},title:{},value:{}},setup(h){return(e,l)=>(d(),f("div",Co,[_("div",Vo,p(e.$t(`torrent.properties.${e.title}`)),1),_("div",null,p(e.torrent[e.value]),1)]))}}),wo={class:"d-flex gap flex-wrap"},So=w({__name:"GridTorrent",props:{torrent:{}},emits:["onTorrentClick"],setup(h){const e=h,l=ee(),t=U(),n=C(()=>(e.torrent.progress===1?t.doneGridProperties:t.busyGridProperties).filter(c=>c.active).sort((c,v)=>c.order-v.order)),r=s=>{switch(s){case B.AMOUNT:return pt;case B.CHIP:return mt;case B.DATA:return vt;case B.DATETIME:return ht;case B.DURATION:return _t;case B.PERCENT:return ft;case B.RELATIVE:return bt;case B.SPEED:return gt;case B.TEXT:default:return yt}},o=C(()=>l.isTorrentInSelection(e.torrent.hash));return(s,c)=>(d(),T(Z,{class:se(`sideborder ${s.torrent.state} pointer`),height:"100%",color:o.value?`torrent-${s.torrent.state}-darken-3`:void 0,onClick:c[0]||(c[0]=v=>s.$emit("onTorrentClick",v,s.torrent))},{default:i(()=>[a(Ke,{class:"text-wrap text-subtitle-1 pt-1 pb-0"},{default:i(()=>[x(p(s.torrent.name),1)]),_:1}),a(be,null,{default:i(()=>[_("div",wo,[(d(!0),f(F,null,H(n.value,v=>(d(),T(Fe(r(v.type)),N({torrent:s.torrent},v.props),null,16,["torrent"]))),256))])]),_:1})]),_:1},8,["class","color"]))}});const Do=X(So,[["__scopeId","data-v-60c9ae77"]]),Io={class:"d-flex align-center",style:{height:"100%",width:"100%"}},Bo=w({__name:"GridView",props:{paginatedTorrents:{}},emits:["onCheckboxClick","onTorrentClick","onTorrentDblClick","onTorrentRightClick","startPress","endPress"],setup(h){const e=ct(),l=ee();return(t,n)=>(d(),T(Ve,{id:"torrentList"},{default:i(()=>[(d(!0),f(F,null,H(t.paginatedTorrents,r=>(d(),T(ve,{cols:"12",lg:"3",md:"4",sm:"6",xl:"2",class:se([u(e).mobile?"pb-2":"pb-4","pt-0"]),onContextmenu:o=>t.$emit("onTorrentRightClick",o,r),onTouchcancel:n[1]||(n[1]=o=>t.$emit("endPress")),onTouchend:n[2]||(n[2]=o=>t.$emit("endPress")),onTouchmove:n[3]||(n[3]=o=>t.$emit("endPress")),onTouchstart:o=>t.$emit("startPress",o.touches.item(0),r),onDblclick:o=>t.$emit("onTorrentDblClick",r)},{default:i(()=>[_("div",Io,[a(je,null,{default:i(()=>[_e(a(M,{color:`torrent-${r.state}`,icon:u(l).isTorrentInSelection(r.hash)?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",class:"mr-2",variant:"text",onClick:o=>t.$emit("onCheckboxClick",r)},null,8,["color","icon","onClick"]),[[Ce,u(l).isSelectionMultiple]])]),_:2},1024),a(Do,{torrent:r,onOnTorrentClick:n[0]||(n[0]=(o,s)=>t.$emit("onTorrentClick",o,s))},null,8,["torrent"])])]),_:2},1032,["class","onContextmenu","onTouchstart","onDblclick"]))),256))]),_:1}))}});const Po=X(Bo,[["__scopeId","data-v-31f288a6"]]),Eo={class:"d-flex gap flex-wrap"},xo=w({__name:"ListTorrent",props:{torrent:{}},emits:["onTorrentClick"],setup(h){const e=h,l=ee(),t=U(),n=C(()=>(e.torrent.progress===1?t.doneTorrentProperties:t.busyTorrentProperties).filter(c=>c.active).sort((c,v)=>c.order-v.order)),r=s=>{switch(s){case B.AMOUNT:return pt;case B.CHIP:return mt;case B.DATA:return vt;case B.DATETIME:return ht;case B.DURATION:return _t;case B.PERCENT:return ft;case B.RELATIVE:return bt;case B.SPEED:return gt;case B.TEXT:default:return yt}},o=C(()=>l.isTorrentInSelection(e.torrent.hash));return(s,c)=>(d(),T(Z,{class:se(`sideborder ${s.torrent.state} pointer`),width:"100%",color:o.value?`torrent-${s.torrent.state}-darken-3`:void 0,onClick:c[0]||(c[0]=v=>s.$emit("onTorrentClick",v,s.torrent))},{default:i(()=>[a(Ke,{class:"text-wrap text-subtitle-1 pt-1 pb-0"},{default:i(()=>[x(p(s.torrent.name),1)]),_:1}),a(be,{class:"pa-2 pt-0"},{default:i(()=>[_("div",Eo,[(d(!0),f(F,null,H(n.value,v=>(d(),T(Fe(r(v.type)),N({torrent:s.torrent},v.props),null,16,["torrent"]))),256))])]),_:1})]),_:1},8,["class","color"]))}});const Lo=X(xo,[["__scopeId","data-v-e5ea358f"]]),Ao={class:"d-flex align-center"},Ro=w({__name:"ListView",props:{paginatedTorrents:{}},emits:["onCheckboxClick","onTorrentClick","onTorrentDblClick","onTorrentRightClick","startPress","endPress"],setup(h){const e=ct(),l=ee();return(t,n)=>(d(),T(Ie,{id:"torrentList",class:"pa-0"},{default:i(()=>[(d(!0),f(F,null,H(t.paginatedTorrents,r=>(d(),T(re,{id:`torrent-${r.hash}`,class:se([u(e).mobile?"mb-2":"mb-4","pa-0"]),onContextmenu:o=>t.$emit("onTorrentRightClick",o,r),onTouchcancel:n[1]||(n[1]=o=>t.$emit("endPress")),onTouchend:n[2]||(n[2]=o=>t.$emit("endPress")),onTouchmove:n[3]||(n[3]=o=>t.$emit("endPress")),onTouchstart:o=>t.$emit("startPress",o.touches.item(0),r),onDblclick:o=>t.$emit("onTorrentDblClick",r)},{default:i(()=>[_("div",Ao,[a(je,null,{default:i(()=>[_e(a(M,{color:`torrent-${r.state}`,icon:u(l).isTorrentInSelection(r.hash)?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",class:"mr-2",variant:"text",onClick:o=>t.$emit("onCheckboxClick",r)},null,8,["color","icon","onClick"]),[[Ce,u(l).isSelectionMultiple]])]),_:2},1024),a(Lo,{torrent:r,onOnTorrentClick:n[0]||(n[0]=(o,s)=>t.$emit("onTorrentClick",o,s))},null,8,["torrent"])])]),_:2},1032,["id","class","onContextmenu","onTouchstart","onDblclick"]))),256))]),_:1}))}});const Mo=X(Ro,[["__scopeId","data-v-e8f6336b"]]),Oo=w({__name:"ItemAmount",props:{torrent:{},title:{},value:{},total:{}},setup(h){return(e,l)=>(d(),f("td",null,p(e.torrent[e.value])+" / "+p(e.torrent[e.total]),1))}}),No={key:0,class:"d-flex flex-row gap"},Uo=w({__name:"ItemChip",props:{torrent:{},title:{},value:{},color:{}},setup(h){const e=h,l=U(),t=C(()=>{const r=e.torrent[e.value],o=typeof r;if(o==="string")return r.length>0?[r]:[];if(o==="object")return r}),n=C(()=>t.value.length<1);return(r,o)=>(d(),f("td",null,[u(l).hideChipIfUnset&&n.value?R("",!0):(d(),f("div",No,[!t.value||n.value?(d(),T(we,{key:0,color:r.color.replace("$1",r.torrent[r.value]),variant:"flat"},{default:i(()=>[x(p(r.$t(`torrent.properties.empty_${r.value}`)),1)]),_:1},8,["color"])):(d(!0),f(F,{key:1},H(t.value,s=>(d(),T(we,{color:r.color.replace("$1",r.torrent.state),variant:"flat"},{default:i(()=>[x(p(s),1)]),_:2},1032,["color"]))),256))]))]))}});const Fo=X(Uo,[["__scopeId","data-v-23c01601"]]),Go=w({__name:"ItemData",props:{torrent:{},title:{},value:{}},setup(h){const e=U();return(l,t)=>(d(),f("td",null,p(u(Pt)(l.torrent[l.value],u(e).useBinarySize)),1))}}),Ho={key:0},Ko={key:1},zo=w({__name:"ItemDateTime",props:{torrent:{},title:{},value:{}},setup(h){const e=U();return(l,t)=>l.torrent[l.value]>0?(d(),f("td",Ho,p(u(ie)(l.torrent[l.value]*1e3).format(u(e).dateFormat??"DD/MM/YYYY, HH:mm:ss")),1)):(d(),f("td",Ko,p(l.$t("dashboard.not_complete")),1))}}),qo={key:0},Yo={key:1},jo=w({__name:"ItemDuration",props:{torrent:{},title:{},value:{}},setup(h){const e=h,l=C(()=>{const t=ie.duration(e.torrent[e.value],"seconds"),n=[t.years(),t.months(),t.days(),t.hours(),t.minutes(),t.seconds()],r=["Y","M","d","h","m","s"];let o=!1;return n.map((s,c)=>{if(o||s)return o=!0,`${s}${r[c]}`}).filter(s=>s).join(" ")});return(t,n)=>t.torrent[t.value]>0?(d(),f("td",qo,p(l.value),1)):(d(),f("td",Yo,p(t.$t("dashboard.not_complete")),1))}}),Xo=w({__name:"ItemPercent",props:{torrent:{},title:{},value:{}},setup(h){const e=h,l=C(()=>[L.UPLOADING,L.CHECKING_UP,L.FORCED_UP,L.ALLOCATING,L.DOWNLOADING,L.META_DL,L.CHECKING_DL,L.FORCED_DL,L.CHECKING_RESUME_DATA,L.MOVING].includes(e.torrent.state));return(t,n)=>(d(),f("td",null,[a(ut,{"model-value":t.torrent[t.value],max:1,striped:l.value,height:20,color:`torrent-${t.torrent.state}`,rounded:"sm",style:{width:"10em"}},{default:i(()=>[x(p(u(dt)(t.torrent[t.value])),1)]),_:1},8,["model-value","striped","color"])]))}}),Wo=w({__name:"ItemRelativeTime",props:{torrent:{},title:{},value:{}},setup(h){return(e,l)=>(d(),f("td",null,p(u(ie)(e.torrent[e.value]*1e3).fromNow()),1))}}),Jo=w({__name:"ItemSpeed",props:{torrent:{},title:{},value:{}},setup(h){const e=U();return(l,t)=>(d(),f("td",null,p(u(Et)(l.torrent[l.value],u(e).useBitSpeed)),1))}}),Qo=w({__name:"ItemText",props:{torrent:{},title:{},value:{}},setup(h){return(e,l)=>(d(),f("td",null,p(e.torrent[e.value]),1))}}),Zo=w({__name:"TableTorrent",props:{torrent:{}},setup(h){const e=U(),l=C(()=>e.tableProperties.filter(n=>n.active).sort((n,r)=>n.order-r.order)),t=n=>{switch(n){case B.AMOUNT:return Oo;case B.CHIP:return Fo;case B.DATA:return Go;case B.DATETIME:return zo;case B.DURATION:return jo;case B.PERCENT:return Xo;case B.RELATIVE:return Wo;case B.SPEED:return Jo;case B.TEXT:default:return Qo}};return(n,r)=>(d(!0),f(F,null,H(l.value,o=>(d(),T(Fe(t(o.type)),N({torrent:n.torrent},o.props),null,16,["torrent"]))),256))}}),ea=h=>(lt("data-v-8832d38a"),h=h(),rt(),h),ta=ea(()=>_("th",{class:"px-1"},null,-1)),oa={key:0},aa={class:"text-left"},na={class:"text-left"},la=["onContextmenu","onTouchstart","onClick","onDblclick"],ra={key:0},sa=w({__name:"TableView",props:{paginatedTorrents:{}},emits:["onCheckboxClick","onTorrentClick","onTorrentDblClick","onTorrentRightClick","startPress","endPress"],setup(h){const e=ee(),l=U(),t=C(()=>l.tableProperties.filter(o=>o.active).sort((o,s)=>o.order-s.order));function n(o){return e.isTorrentInSelection(o.hash)}const r=o=>["pointer",n(o)?`bg-torrent-${o.state}-darken-3 selected`:""];return(o,s)=>(d(),T(xt,{id:"torrentList",class:"pa-0",density:"compact"},{default:i(()=>[_("thead",null,[_("tr",null,[ta,u(e).isSelectionMultiple?(d(),f("th",oa)):R("",!0),_("th",aa,p(o.$t("torrent.properties.name")),1),(d(!0),f(F,null,H(t.value,c=>(d(),f("th",na,p(o.$t(`torrent.properties.${c.props.title}`)),1))),256))])]),_("tbody",null,[(d(!0),f(F,null,H(o.paginatedTorrents,c=>_e((d(),f("tr",{class:se(r(c)),onContextmenu:v=>o.$emit("onTorrentRightClick",v,c),onTouchcancel:s[0]||(s[0]=v=>o.$emit("endPress")),onTouchend:s[1]||(s[1]=v=>o.$emit("endPress")),onTouchmove:s[2]||(s[2]=v=>o.$emit("endPress")),onTouchstart:v=>o.$emit("startPress",v.touches.item(0),c),onClick:v=>o.$emit("onTorrentClick",v,c),onDblclick:v=>o.$emit("onTorrentDblClick",c)},[_("td",{class:se(`pa-0 bg-torrent-${c.state}`)},null,2),u(e).isSelectionMultiple?(d(),f("td",ra,[a(Te,{"model-value":n(c),color:`torrent-${c.state}`,variant:"text",onClick:J(v=>o.$emit("onCheckboxClick",c),["stop"])},null,8,["model-value","color","onClick"])])):R("",!0),_("td",null,p(c.name),1),a(Zo,{torrent:c},null,8,["torrent"])],42,la)),[[Lt]])),256))])]),_:1}))}});const ia=X(sa,[["__scopeId","data-v-8832d38a"]]),da={class:"pt-4 px-1 px-sm-5"},ua={class:"pa-0",style:{width:"10em"}},ca={class:"text-uppercase",style:{float:"right","font-size":"0.8em"}},pa={class:"text-grey"},ma={key:0,class:"mt-5 text-xs-center"},va={class:"text-grey"},ha={key:1},_a={key:5},Va=w({__name:"Dashboard",setup(h){const{t:e}=Ue(),l=nt(),t=ee(),{currentPage:n,isSelectionMultiple:r,selectedTorrents:o,displayMode:s,torrentCountString:c}=Xe(t),v=st(),k=Be(),S=fe(),{filteredTorrents:A,sortOptions:y}=Xe(S),P=U(),E=[{value:"added_on",title:e("dashboard.sortBy.added_on")},{value:"amount_left",title:e("dashboard.sortBy.amount_left")},{value:"auto_tmm",title:e("dashboard.sortBy.auto_tmm")},{value:"availability",title:e("dashboard.sortBy.availability")},{value:"avg_download_speed",title:e("dashboard.sortBy.avg_download_speed")},{value:"avg_upload_speed",title:e("dashboard.sortBy.avg_upload_speed")},{value:"category",title:e("dashboard.sortBy.category")},{value:"completed",title:e("dashboard.sortBy.completed")},{value:"completion_on",title:e("dashboard.sortBy.completion_on")},{value:"content_path",title:e("dashboard.sortBy.content_path")},{value:"dl_limit",title:e("dashboard.sortBy.dl_limit")},{value:"dlspeed",title:e("dashboard.sortBy.dlspeed")},{value:"download_path",title:e("dashboard.sortBy.download_path")},{value:"downloaded",title:e("dashboard.sortBy.downloaded")},{value:"downloaded_session",title:e("dashboard.sortBy.downloaded_session")},{value:"eta",title:e("dashboard.sortBy.eta")},{value:"f_l_piece_prio",title:e("dashboard.sortBy.f_l_piece_prio")},{value:"force_start",title:e("dashboard.sortBy.force_start")},{value:"globalSpeed",title:e("dashboard.sortBy.globalSpeed")},{value:"globalVolume",title:e("dashboard.sortBy.globalVolume")},{value:"hash",title:e("dashboard.sortBy.hash")},{value:"infohash_v1",title:e("dashboard.sortBy.infohash_v1")},{value:"infohash_v2",title:e("dashboard.sortBy.infohash_v2")},{value:"last_activity",title:e("dashboard.sortBy.last_activity")},{value:"magnet_uri",title:e("dashboard.sortBy.magnet_uri")},{value:"max_ratio",title:e("dashboard.sortBy.max_ratio")},{value:"max_seeding_time",title:e("dashboard.sortBy.max_seeding_time")},{value:"name",title:e("dashboard.sortBy.name")},{value:"num_complete",title:e("dashboard.sortBy.num_complete")},{value:"num_incomplete",title:e("dashboard.sortBy.num_incomplete")},{value:"num_leechs",title:e("dashboard.sortBy.num_leechs")},{value:"num_seeds",title:e("dashboard.sortBy.num_seeds")},{value:"priority",title:e("dashboard.sortBy.priority")},{value:"progress",title:e("dashboard.sortBy.progress")},{value:"ratio",title:e("dashboard.sortBy.ratio")},{value:"ratio_limit",title:e("dashboard.sortBy.ratio_limit")},{value:"save_path",title:e("dashboard.sortBy.save_path")},{value:"seeding_time",title:e("dashboard.sortBy.seeding_time")},{value:"seeding_time_limit",title:e("dashboard.sortBy.seeding_time_limit")},{value:"seen_complete",title:e("dashboard.sortBy.seen_complete")},{value:"seq_dl",title:e("dashboard.sortBy.seq_dl")},{value:"size",title:e("dashboard.sortBy.size")},{value:"state",title:e("dashboard.sortBy.state")},{value:"super_seeding",title:e("dashboard.sortBy.super_seeding")},{value:"tags",title:e("dashboard.sortBy.tags")},{value:"time_active",title:e("dashboard.sortBy.time_active")},{value:"total_size",title:e("dashboard.sortBy.total_size")},{value:"tracker",title:e("dashboard.sortBy.tracker")},{value:"trackers_count",title:e("dashboard.sortBy.trackers_count")},{value:"up_limit",title:e("dashboard.sortBy.up_limit")},{value:"uploaded",title:e("dashboard.sortBy.uploaded")},{value:"uploaded_session",title:e("dashboard.sortBy.uploaded_session")},{value:"upspeed",title:e("dashboard.sortBy.upspeed")}].sort((m,b)=>m.title.localeCompare(b.title));E.splice(0,0,{value:"",title:e("dashboard.sortBy.default")});const V=O(!1),g=ot({isVisible:!1,offset:[0,0]}),D=C({get:()=>S.textFilter,set:Ot(m=>{S.textFilter=m??""},300)}),Y=C(()=>s.value===K.LIST),Ee=C(()=>s.value===K.GRID),xe=C(()=>s.value===K.TABLE),{paginatedResults:de,currentPage:j,pageCount:te}=Mt(A,P.paginationSize,n),Le=C(()=>!!S.textFilter&&S.textFilter.length>0),ge=C(()=>A.value.length<=o.value.length);function oe(m){V.value=m??!V.value,V.value&&We(()=>{document.getElementById("searchInput")?.focus()})}function Ae(){S.textFilter=""}function ue(){window.scrollTo({top:0,behavior:"smooth"})}function ye(){r.value&&t.unselectAllTorrents(),r.value=!r.value}function Re(){ge.value?t.unselectAllTorrents():t.selectTorrents(...A.value.map(m=>m.hash))}function W(m){r.value||l.push({name:"torrentDetail",params:{hash:m.hash}})}function ce(m){t.toggleSelect(m.hash)}function pe(m,b){m.shiftKey?t.spanTorrentSelection(b.hash):(Ne(m)||t.isSelectionMultiple)&&(t.isSelectionMultiple=!0,t.toggleSelect(b.hash))}async function ae(m,b){g.isVisible&&(g.isVisible=!1,await We()),g.isVisible=!0,g.offset=[m.pageX,m.pageY],r.value?o.value.length===0&&t.selectTorrent(b.hash):(t.unselectAllTorrents(),t.selectTorrent(b.hash))}const ke=O();function me(m,b){ke.value=setTimeout(()=>{ae(m,b)},500)}function I(){clearTimeout(ke.value)}function G(m){if(v.hasActiveDialog)return!1;const b=m.target;if(Ne(m)&&m.key==="a"&&b.tagName!=="INPUT")return t.unselectAllTorrents(),t.selectTorrents(...A.value.map($=>$.hash)),m.preventDefault(),!0;if(Ne(m)&&m.key==="f"){const $=document.getElementById("searchInput");if(document.activeElement!==$)return oe(!0),m.preventDefault(),!0}if(m.key==="Escape"){const $=document.getElementById("searchInput");return document.activeElement===$||V.value?oe(!1):(r.value=!1,t.unselectAllTorrents()),m.preventDefault(),!0}if(m.key==="Delete")return o.value.length===0?void 0:(v.createDialog(it,{hashes:o.value}),m.preventDefault(),!0);if(m.key==="/"){const $=document.getElementById("searchInput");return document.activeElement!==$&&!V.value&&(l.push({name:"searchEngine"}),m.preventDefault()),!0}}return Tt(()=>g.isVisible,m=>{!m&&!r.value&&t.unselectAllTorrents()}),Se(async()=>{await k.fetchCategories(),await k.fetchTags(),oe(Le.value)}),at(()=>{document.addEventListener("keydown",G),r.value=!1,ue()}),$t(()=>{document.removeEventListener("keydown",G)}),(m,b)=>(d(),f(F,null,[_("div",da,[a(Ve,{class:"ma-0 pa-0 mb-2"},{default:i(()=>[a(je,null,{default:i(()=>[_e(a(Z,{color:"transparent"},{default:i(()=>[a(Q,{id:"searchInput",modelValue:D.value,"onUpdate:modelValue":b[0]||(b[0]=$=>D.value=$),label:u(e)("dashboard.searchInputLabel"),clearable:"",density:"compact","hide-details":"","prepend-inner-icon":"mdi-magnify",rounded:"pill","single-line":"",style:{width:"200px"},variant:"solo","onClick:clear":b[1]||(b[1]=$=>Ae())},null,8,["modelValue","label"])]),_:1},512),[[Ce,V.value]])]),_:1}),a(q,{text:u(e)("dashboard.toggleSearchFilter"),location:"top"},{activator:i(({props:$})=>[a(M,N({icon:V.value?"mdi-chevron-left-circle":"mdi-text-box-search"},$,{variant:"plain",onClick:b[2]||(b[2]=Me=>oe())}),null,16,["icon"])]),_:1},8,["text"]),a(q,{text:u(e)("dashboard.toggleSelectMode"),location:"top"},{activator:i(({props:$})=>[a(M,N({icon:u(r)?"mdi-checkbox-marked":"mdi-checkbox-blank-outline"},$,{variant:"plain",onClick:ye}),null,16,["icon"])]),_:1},8,["text"]),a(Ge,null,{activator:i(({props:$})=>[a(q,{text:m.$t("dashboard.displayMode.title"),location:"top"},{activator:i(({props:Me})=>[a(M,N({icon:""},N($,Me),{variant:"plain"}),{default:i(()=>[u(s)===u(K).LIST?(d(),T(le,{key:0,icon:"mdi-view-list"})):R("",!0),u(s)===u(K).GRID?(d(),T(le,{key:1,icon:"mdi-view-grid"})):R("",!0),u(s)===u(K).TABLE?(d(),T(le,{key:2,icon:"mdi-table"})):R("",!0)]),_:2},1040)]),_:2},1032,["text"])]),default:i(()=>[a(Ie,null,{default:i(()=>[a(re,{title:m.$t("dashboard.displayMode.list"),"prepend-icon":"mdi-view-list",onClick:b[3]||(b[3]=$=>s.value=u(K).LIST)},null,8,["title"]),a(re,{title:m.$t("dashboard.displayMode.grid"),"prepend-icon":"mdi-view-grid",onClick:b[4]||(b[4]=$=>s.value=u(K).GRID)},null,8,["title"]),a(re,{title:m.$t("dashboard.displayMode.table"),"prepend-icon":"mdi-table",onClick:b[5]||(b[5]=$=>s.value=u(K).TABLE)},null,8,["title"])]),_:1})]),_:1}),a(q,{text:u(e)("dashboard.toggleSortOrder"),location:"top"},{activator:i(({props:$})=>[a(M,N({icon:u(y).reverseOrder?"mdi-arrow-up-thin":"mdi-arrow-down-thin"},$,{variant:"plain",onClick:b[6]||(b[6]=Me=>u(y).reverseOrder=!u(y).reverseOrder)}),null,16,["icon"])]),_:1},8,["text"]),_("div",ua,[a(At,{modelValue:u(y).sortBy,"onUpdate:modelValue":b[7]||(b[7]=$=>u(y).sortBy=$),items:u(E),label:u(e)("dashboard.sortLabel"),"auto-select-first":"",density:"compact","hide-details":"",variant:"solo-filled"},null,8,["modelValue","items","label"])]),a(ve,{class:"align-center justify-center"},{default:i(()=>[_("span",ca,p(u(c)),1)]),_:1})]),_:1}),a(Ve,{class:"ma-0 pa-0"},{default:i(()=>[a(Rt,null,{default:i(()=>[_e(a(Z,{color:"transparent"},{default:i(()=>[a(q,{text:u(e)("common.selectAll"),location:"bottom"},{activator:i(({props:$})=>[a(M,N({icon:ge.value?"mdi-checkbox-marked":"mdi-checkbox-blank-outline",class:"text-grey",color:"transparent",style:{left:"-8px"}},$,{onClick:Re}),null,16,["icon"])]),_:1},8,["text"]),_("span",pa,p(u(e)("dashboard.selectAll")),1)]),_:1},512),[[Ce,u(r)]])]),_:1})]),_:1}),u(A).length===0?(d(),f("div",ma,[_("p",va,p(u(e)("common.emptyList")),1)])):R("",!0),u(P).isPaginationOnTop&&!u(P).isInfiniteScrollActive&&u(te)>1?(d(),f("div",ha,[a(Je,{modelValue:u(j),"onUpdate:modelValue":b[8]||(b[8]=$=>he(j)?j.value=$:null),length:u(te),"next-icon":"mdi-menu-right","prev-icon":"mdi-menu-left",onInput:ue},null,8,["modelValue","length"])])):R("",!0),Y.value?(d(),T(Mo,{key:2,"paginated-torrents":u(de),onOnTorrentClick:pe,onOnTorrentDblClick:W,onOnCheckboxClick:ce,onOnTorrentRightClick:ae,onStartPress:me,onEndPress:I},null,8,["paginated-torrents"])):Ee.value?(d(),T(Po,{key:3,class:"mb-2","paginated-torrents":u(de),onOnTorrentClick:pe,onOnTorrentDblClick:W,onOnCheckboxClick:ce,onOnTorrentRightClick:ae,onStartPress:me,onEndPress:I},null,8,["paginated-torrents"])):xe.value?(d(),T(ia,{key:4,"paginated-torrents":u(de),onOnTorrentClick:pe,onOnTorrentDblClick:W,onOnCheckboxClick:ce,onOnTorrentRightClick:ae,onStartPress:me,onEndPress:I},null,8,["paginated-torrents"])):R("",!0),!u(P).isPaginationOnTop&&!u(P).isInfiniteScrollActive&&u(te)>1?(d(),f("div",_a,[a(Je,{modelValue:u(j),"onUpdate:modelValue":b[9]||(b[9]=$=>he(j)?j.value=$:null),length:u(te),"next-icon":"mdi-menu-right","prev-icon":"mdi-menu-left",onInput:ue},null,8,["modelValue","length"])])):R("",!0)]),_("div",{style:Ct(`position: absolute; left: ${g.offset[0]}px; top: ${g.offset[1]}px;`)},[a(Jt,{modelValue:g.isVisible,"onUpdate:modelValue":b[10]||(b[10]=$=>g.isVisible=$)},null,8,["modelValue"])],4)],64))}});export{Va as default};

View File

@@ -0,0 +1 @@
import{g as v,K as b,$ as h,aa as q,r as x,d as C,x as k,a as S,a1 as K,a2 as T,a3 as s,m as e,W as m,Z as p,u as l,Y as f,ao as _,a9 as y}from"./vue-d2584a6d.js";import{_ as A}from"./PasswordField.vue_vue_type_script_setup_true_lang-f7d196be.js";import{aS as B,aT as F,f as L,aL as U,g as I,h as M,i as N,V as O,j as R,k as $,l as j}from"./index-135ae4c1.js";import"./faker-c43f92d4.js";import"./vuetify-e547ef1b.js";const G=v({__name:"Login",setup(D){const{t:a}=b(),V=h(),o=q(),u=B(),r=x({username:"",password:""}),c=C(!1),w={username:[d=>!!d||a("login.rules.username_required")],password:[d=>!!d||a("login.rules.password_required")]},i=async()=>{c.value&&(await u.login(r.username,r.password),u.isAuthenticated?(y.success(a("login.success")),g()):y.error(a("login.error")))},g=()=>{o.query.redirect?V.push(o.query.redirect):V.push({name:"dashboard"})};return k(async()=>{o.query.username&&o.query.password&&await u.login(o.query.username,o.query.password)}),S(()=>{u.isAuthenticated&&g()}),(d,t)=>(K(),T(F,{class:"mt-16"},{default:s(()=>[e(j,{class:"mx-auto",rounded:"lg","min-width":"250"},{default:s(()=>[e(L,null,{default:s(()=>[m(p(l(a)("login.title")),1)]),_:1}),e(U,null,{default:s(()=>[m(p(l(a)("login.subtitle")),1)]),_:1}),e(I,null,{default:s(()=>[e(M,{modelValue:c.value,"onUpdate:modelValue":t[2]||(t[2]=n=>c.value=n),onSubmit:f(i,["prevent"])},{default:s(()=>[e(N,{modelValue:r.username,"onUpdate:modelValue":t[0]||(t[0]=n=>r.username=n),label:l(a)("login.username"),autofocus:"",rules:w.username,onKeydown:_(f(i,["prevent"]),["enter"]),variant:"outlined"},{prepend:s(()=>[e(O,{color:"accent",icon:"mdi-account"})]),_:1},8,["modelValue","label","rules","onKeydown"]),e(A,{modelValue:r.password,"onUpdate:modelValue":t[1]||(t[1]=n=>r.password=n),label:l(a)("login.password"),rules:w.password,"prepend-icon":"mdi-lock",onKeydown:_(f(i,["prevent"]),["enter"]),variant:"outlined"},null,8,["modelValue","label","rules","onKeydown"])]),_:1},8,["modelValue"])]),_:1}),e(R,null,{default:s(()=>[e($,{variant:"elevated",block:"",color:"accent",onClick:i},{default:s(()=>[m(p(l(a)("login.submit")),1)]),_:1})]),_:1})]),_:1})]),_:1}))}});export{G as default};

View File

@@ -0,0 +1 @@
.v-theme--darkTheme .logtype-normal[data-v-77aed2b3]{color:#fff!important}.v-theme--darkTheme .logtype-info[data-v-77aed2b3]{color:gray!important}.v-theme--darkTheme .logtype-warning[data-v-77aed2b3]{color:#b8860b!important}.v-theme--darkTheme .logtype-critical[data-v-77aed2b3]{color:#c80000!important}.v-theme--lightTheme .logtype-normal[data-v-77aed2b3]{color:#000!important}.v-theme--lightTheme .logtype-info[data-v-77aed2b3]{color:gray!important}.v-theme--lightTheme .logtype-warning[data-v-77aed2b3]{color:#daa520!important}.v-theme--lightTheme .logtype-critical[data-v-77aed2b3]{color:red!important}

View File

@@ -0,0 +1 @@
import{u as G}from"./ArrayPagination-26934cac.js";import{ay as P,y as K,az as l,av as H,ai as Q,q as b,c as Z,r as g,k as J,d,a1 as X,s as Y,a3 as c,i as ee,N as S,aw as te,ax as le,_ as ae}from"./index-135ae4c1.js";import"./faker-c43f92d4.js";import{g as se,$ as oe,K as ne,d as h,c as f,M as ue,I as ie,a1 as i,a6 as I,m as e,a3 as a,ab as F,Z as m,u as o,a2 as v,D as x,a8 as y,F as B,a7 as re,a5 as de,W as N}from"./vue-d2584a6d.js";import{d as me}from"./dayjs.min-1969f9c6.js";import"./vuetify-e547ef1b.js";const ce={class:"pa-3"},pe={style:{"font-size":"1.6em !important"},class:"subtitle-1 ml-2"},ge={class:"d-flex justify-end"},fe=se({__name:"Logs",setup(ve){const w=oe(),{t:O}=ne(),_=P(),$=K(),V=h([{title:l[l.NORMAL],value:l.NORMAL},{title:l[l.INFO],value:l.INFO},{title:l[l.WARNING],value:l.WARNING},{title:l[l.CRITICAL],value:l.CRITICAL}]),u=h([l.NORMAL,l.INFO,l.WARNING,l.CRITICAL]),L=h(""),M=f(()=>_.logs),U=f(()=>M.value.filter(t=>u.value.includes(t.type))),{results:C}=H(U,L,t=>t.message),T=f(()=>u.value.length>0),k=f(()=>u.value.length===V.value.length),{paginatedResults:E,currentPage:r,pageCount:p}=G(C,30),A=()=>{w.push({name:"dashboard"})},W=t=>`logtype-${l[t?.type]?.toLowerCase()}`,j=t=>l[t.type],q=t=>me(t.timestamp*1e3).format($.dateFormat),z=()=>{k.value?u.value=[]:u.value=V.value.map(t=>t.value)},R=t=>{t.key==="Escape"&&A()};return ue(async()=>{document.addEventListener("keydown",R),await _.cleanAndFetchLogs(),Q(_.fetchLogs,15e3)}),ie(()=>{document.removeEventListener("keydown",R)}),(t,n)=>(i(),I("div",ce,[e(b,{"no-gutters":"",align:"center",justify:"center"},{default:a(()=>[e(g,null,{default:a(()=>[F("h1",pe,m(o(O)("logs.title")),1)]),_:1}),e(g,null,{default:a(()=>[F("div",ge,[e(J,{icon:"mdi-close",variant:"plain",onClick:A})])]),_:1})]),_:1}),e(Z,null,{default:a(()=>[e(d,null,{default:a(()=>[e(b,null,{default:a(()=>[e(g,{cols:"6"},{default:a(()=>[e(X,{modelValue:u.value,"onUpdate:modelValue":n[0]||(n[0]=s=>u.value=s),items:V.value,label:t.$t("logs.filters.type"),"hide-details":"",multiple:"",chips:""},{"prepend-item":a(()=>[e(d,{title:t.$t("common.selectAll"),onClick:z},{prepend:a(()=>[e(Y,{indeterminate:T.value&&!k.value,"model-value":T.value},null,8,["indeterminate","model-value"])]),_:1},8,["title"]),e(c)]),_:1},8,["modelValue","items","label"])]),_:1}),e(g,{cols:"6"},{default:a(()=>[e(ee,{modelValue:L.value,"onUpdate:modelValue":n[1]||(n[1]=s=>L.value=s),label:t.$t("logs.filters.query"),"hide-details":""},null,8,["modelValue","label"])]),_:1})]),_:1})]),_:1}),e(c,{class:"my-3",thickness:"5"}),o(p)>1?(i(),v(d,{key:0},{default:a(()=>[e(S,{modelValue:o(r),"onUpdate:modelValue":n[2]||(n[2]=s=>x(r)?r.value=s:null),length:o(p),"prev-icon":"mdi-menu-left","next-icon":"mdi-menu-right"},null,8,["modelValue","length"])]),_:1})):y("",!0),e(c),(i(!0),I(B,null,re(o(E),(s,D)=>(i(),I(B,null,[D>0?(i(),v(c,{key:0})):y("",!0),e(d,{class:de(W(s))},{default:a(()=>[e(te,null,{default:a(()=>[N(m(s.id)+") "+m(s.message),1)]),_:2},1024),e(le,null,{default:a(()=>[N(m(j(s))+" | "+m(q(s)),1)]),_:2},1024)]),_:2},1032,["class"])],64))),256)),o(C).length===0?(i(),v(d,{key:1},{default:a(()=>[N(m(t.$t("logs.emptyLogList")),1)]),_:1})):y("",!0),e(c),o(p)>1?(i(),v(d,{key:2},{default:a(()=>[e(S,{modelValue:o(r),"onUpdate:modelValue":n[3]||(n[3]=s=>x(r)?r.value=s:null),length:o(p),"prev-icon":"mdi-menu-left","next-icon":"mdi-menu-right"},null,8,["modelValue","length"])]),_:1})):y("",!0)]),_:1})]))}});const Ne=ae(fe,[["__scopeId","data-v-77aed2b3"]]);export{Ne as default};

View File

@@ -0,0 +1 @@
import{au as r,v as s,aR as n}from"./index-135ae4c1.js";import{g as u,aa as i,$ as m,M as p}from"./vue-d2584a6d.js";import"./faker-c43f92d4.js";import"./vuetify-e547ef1b.js";const l=u({__name:"MagnetHandler",setup(d){const o=i(),a=m();return p(async()=>{const e=decodeURIComponent(o.params.url);if(e.startsWith("magnet:")){const t=r();t.isFirstInit=!1,t.pushTorrentToQueue(e),s().createDialog(n,{})}await a.push({name:"dashboard"})}),()=>{}}});export{l as default};

View File

@@ -0,0 +1 @@
import{g as s,d as r,c as o,a1 as t,a2 as i,au as d,a3 as l,m as u}from"./vue-d2584a6d.js";import{V as m,i as f}from"./index-135ae4c1.js";const h=s({__name:"PasswordField",props:{hideIcon:{type:Boolean},prependIcon:{}},setup(v){const e=r(!1);function a(){e.value=!e.value}const p=o(()=>e.value?"text":"password"),c=o(()=>e.value?"mdi-eye":"mdi-eye-off");return(n,y)=>(t(),i(f,{type:p.value,"append-inner-icon":n.hideIcon?"":c.value,"onClick:appendInner":a},d({_:2},[n.prependIcon?{name:"prepend",fn:l(()=>[u(m,{color:"accent",icon:n.prependIcon},null,8,["icon"])]),key:"0"}:void 0]),1032,["type","append-inner-icon"]))}});export{h as _};

View File

@@ -0,0 +1 @@
import{g as K,$ as q,K as W,d as Y,r as Z,c as G,M as J,x as O,I as X,a1 as i,a6 as v,m as e,a3 as s,ab as r,Z as u,u as n,a2 as y,D as L,a8 as m,F as S,a7 as ee,a5 as te,W as x,Y as C}from"./vue-d2584a6d.js";import{u as se}from"./ArrayPagination-26934cac.js";import{au as le,v as ae,ah as ne,y as oe,av as ie,q as D,c as $,r as h,k as f,d as p,i as re,a2 as ue,a as N,N as F,a3 as de,aw as ce,ax as me,m as fe,l as pe,f as _e,ad as ve,ae as Ve,g as ge,_ as ke}from"./index-135ae4c1.js";import"./faker-c43f92d4.js";import{d as ye}from"./index-fd06c5c5.js";import"./vuetify-e547ef1b.js";const he={class:"pa-3"},Ae={class:"subtitle-1 ml-2",style:{"font-size":"1.6em !important"}},xe={class:"d-flex justify-end"},Ce={class:"d-flex flex-row align-center justify-center"},we={class:"d-flex"},be={key:0},Re={key:1},Te={class:"d-flex flex-column"},Le=["innerHTML"],Se=K({__name:"RssArticles",setup(De){const I=q(),{t:V}=W(),U=le(),B=ae(),o=ne(),M=oe(),_=Y(!1),g=Z({title:"",content:""}),A=G({get:()=>o.filters.title,set:ye(t=>{o.filters.title=t??""},300)}),k=ie(()=>o.articles.sort((t,a)=>Number(a.parsedDate)-Number(t.parsedDate)),()=>A.value,t=>t.title),{paginatedResults:j,currentPage:c,pageCount:w}=se(k.results,15);function E(t){const a=M.useIdForRssLinks?t.id:t.link;window.open(a,"_blank","noreferrer")}function H(t){t.description&&(g.title=t.title.trim(),g.content=t.description.trim(),_.value=!0)}function P(t){U.pushTorrentToQueue(t.torrentURL)}async function b(t){await o.markArticleAsRead(t.id)}async function Q(){await o.markAllAsRead()}function R(){I.push({name:"dashboard"})}function T(t){if(B.hasActiveDialog||_.value)return!1;t.key==="Escape"&&R()}return J(async()=>{await o.fetchFeeds()}),O(()=>{document.addEventListener("keydown",T)}),X(()=>{document.removeEventListener("keydown",T)}),(t,a)=>(i(),v("div",he,[e(D,{align:"center",justify:"center","no-gutters":""},{default:s(()=>[e(h,null,{default:s(()=>[r("h1",Ae,u(n(V)("rssArticles.title")),1)]),_:1}),e(h,null,{default:s(()=>[r("div",xe,[e(f,{icon:"mdi-close",variant:"plain",onClick:R})])]),_:1})]),_:1}),e($,null,{default:s(()=>[e(p,null,{default:s(()=>[e(D,null,{default:s(()=>[e(h,{cols:"12"},{default:s(()=>[e(re,{modelValue:A.value,"onUpdate:modelValue":a[0]||(a[0]=l=>A.value=l),label:t.$t("rssArticles.filters.title"),clearable:"","hide-details":""},null,8,["modelValue","label"])]),_:1}),e(h,{cols:"12"},{default:s(()=>[r("div",Ce,[e(ue,{modelValue:n(o).filters.unread,"onUpdate:modelValue":a[1]||(a[1]=l=>n(o).filters.unread=l),label:t.$t("rssArticles.filters.unread"),"hide-details":""},null,8,["modelValue","label"]),e(N),e(f,{text:t.$t("rssArticles.markAllAsRead"),color:"primary",onClick:Q},null,8,["text"])])]),_:1})]),_:1})]),_:1}),n(k).results.value.length?(i(),y(p,{key:0},{default:s(()=>[e(F,{modelValue:n(c),"onUpdate:modelValue":a[2]||(a[2]=l=>L(c)?c.value=l:null),length:n(w),"next-icon":"mdi-menu-right","prev-icon":"mdi-menu-left"},null,8,["modelValue","length"])]),_:1})):m("",!0),e(p,null,{default:s(()=>[e($,null,{default:s(()=>[(i(!0),v(S,null,ee(n(j),(l,z)=>(i(),v(S,null,[z>0?(i(),y(de,{key:0,color:"white"})):m("",!0),e(p,{class:te({"rss-read":l.isRead}),onClick:d=>H(l),onContextmenu:d=>b(l)},{default:s(()=>[r("div",we,[r("div",null,[e(ce,{class:"wrap-anywhere",style:{"white-space":"unset"}},{default:s(()=>[x(u(l.title),1)]),_:2},1024),e(me,{class:"d-block"},{default:s(()=>[r("div",null,u(l.parsedDate.toLocaleString()),1),r("div",null,u(n(V)("rssArticles.item.feedName",{name:n(o).getFeedNames(l.id).join(" | ")})),1),l.author?(i(),v("div",be,u(n(V)("rssArticles.item.author",{author:l.author})),1)):m("",!0),l.category?(i(),v("div",Re,u(n(V)("rssArticles.item.category",{category:l.category})),1)):m("",!0)]),_:2},1024)]),e(N),r("div",Te,[e(f,{icon:"mdi-open-in-new",variant:"text",onClick:C(d=>E(l),["stop"])},null,8,["onClick"]),e(f,{color:"accent",icon:"mdi-check",variant:"text",onClick:C(d=>b(l),["stop"])},null,8,["onClick"]),e(f,{icon:"mdi-download",variant:"text",onClick:C(d=>P(l),["stop"])},null,8,["onClick"])])]),e(fe,{modelValue:_.value,"onUpdate:modelValue":a[4]||(a[4]=d=>_.value=d)},{default:s(()=>[e(pe,null,{default:s(()=>[e(_e,null,{default:s(()=>[e(ve,{color:"transparent"},{default:s(()=>[e(Ve,null,{default:s(()=>[x(u(g.title),1)]),_:1}),e(f,{icon:"mdi-close",onClick:a[3]||(a[3]=d=>_.value=!1)})]),_:1})]),_:1}),e(ge,null,{default:s(()=>[r("div",{class:"description-container",innerHTML:g.content},null,8,Le)]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:2},1032,["class","onClick","onContextmenu"])],64))),256)),n(k).results.value.length===0?(i(),y(p,{key:0},{default:s(()=>[x(u(t.$t("common.emptyList")),1)]),_:1})):m("",!0)]),_:1})]),_:1}),n(k).results.value.length?(i(),y(p,{key:1},{default:s(()=>[e(F,{modelValue:n(c),"onUpdate:modelValue":a[5]||(a[5]=l=>L(c)?c.value=l:null),length:n(w),"next-icon":"mdi-menu-right","prev-icon":"mdi-menu-left"},null,8,["modelValue","length"])]),_:1})):m("",!0)]),_:1})]))}});const Me=ke(Se,[["__scopeId","data-v-87c5959f"]]);export{Me as default};

View File

@@ -0,0 +1 @@
.rss-read.v-theme--darkTheme[data-v-87c5959f]{color:#b6b6b6!important}.rss-read.v-theme--lightTheme[data-v-87c5959f]{color:gray!important}.description-container[data-v-87c5959f]{border:solid red 5px}.description-container img{max-width:100%;height:auto}

View File

@@ -0,0 +1 @@
import{g as Y,K as G,d as h,a1 as S,a2 as M,a3 as a,m as e,ab as C,Z as m,n as te,W as E,u as v,Y as J,D as ne,$ as se,a0 as ie,c as K,M as oe,q as re,a6 as j,F as ue,a7 as ce,ao as de}from"./vue-d2584a6d.js";import{u as fe,aB as W,l as A,f as ge,a as D,k as c,m as F,g as H,h as me,i as Z,j as x,ag as X,s as ve,V as pe,au as he,v as ye,y as Ve,av as ke,q as $,c as be,r as b,af as Ee,ar as Se,as as we,d as O,aC as Ce,aD as _e,a1 as Q,a3 as Te,J as Pe}from"./index-135ae4c1.js";import"./faker-c43f92d4.js";import"./vuetify-e547ef1b.js";const $e=["href","title"],Me=Y({__name:"PluginManagerDialog",props:{guid:{}},setup(R){const I=R,{isOpened:t}=fe(I.guid),{t:y}=G(),d=W(),f=[{title:y("dialogs.pluginManager.headers.enabled"),key:"enabled",sortable:!1},{title:y("dialogs.pluginManager.headers.name"),key:"fullName"},{title:y("dialogs.pluginManager.headers.version"),key:"version"},{title:y("dialogs.pluginManager.headers.url"),key:"url"},{title:y("dialogs.pluginManager.headers.actions"),key:"actions"}],V=h(!1),k=h(!1),w=h(!1),p=h(!1),u=h("");async function N(r){await d.toggleSearchPlugin(r),await d.fetchSearchPlugins()}async function _(){k.value=!0,await d.updatePlugins().then(()=>new Promise(r=>setTimeout(r,2e3))),await d.fetchSearchPlugins(),k.value=!1}async function U(){T(),V.value=!0,await d.installSearchPlugin(u.value),u.value="",setTimeout(()=>{d.fetchSearchPlugins().then(()=>{V.value=!1})},1e3)}async function q(r){V.value=!0,await d.uninstallSearchPlugin(r.name),await d.fetchSearchPlugins(),V.value=!1}const s=()=>{t.value=!1};function T(){w.value=!1}return(r,g)=>(S(),M(F,{modelValue:v(t),"onUpdate:modelValue":g[4]||(g[4]=n=>ne(t)?t.value=n:null)},{default:a(()=>[e(A,null,{default:a(()=>[e(ge,{class:"d-flex"},{default:a(()=>[C("div",null,m(r.$t("dialogs.pluginManager.title")),1),e(D),e(c,{text:r.$t("dialogs.pluginManager.update"),color:"accent",class:"mr-2",loading:k.value,onClick:_},null,8,["text","loading"]),e(F,{modelValue:w.value,"onUpdate:modelValue":g[3]||(g[3]=n=>w.value=n)},{activator:a(({props:n})=>[e(c,te(n,{color:"primary"}),{default:a(()=>[E(m(r.$t("dialogs.pluginManager.install.activator")),1)]),_:2},1040)]),default:a(()=>[e(A,{title:r.$t("dialogs.pluginManager.install.title")},{default:a(()=>[e(H,null,{default:a(()=>[e(v(me),{modelValue:p.value,"onUpdate:modelValue":g[1]||(g[1]=n=>p.value=n),onSubmit:g[2]||(g[2]=J(()=>{},["prevent"]))},{default:a(()=>[e(Z,{modelValue:u.value,"onUpdate:modelValue":g[0]||(g[0]=n=>u.value=n),autofocus:"",label:r.$t("dialogs.pluginManager.install.label")},null,8,["modelValue","label"])]),_:1},8,["modelValue"])]),_:1}),e(x,null,{default:a(()=>[e(D),e(c,{color:"error",onClick:T},{default:a(()=>[E(m(r.$t("common.cancel")),1)]),_:1}),e(c,{color:"accent",onClick:U},{default:a(()=>[E(m(r.$t("common.ok")),1)]),_:1})]),_:1})]),_:1},8,["title"])]),_:1},8,["modelValue"])]),_:1}),e(H,null,{default:a(()=>[e(X,{headers:f,"items-per-page":"-1",items:v(d).searchPlugins,"sort-by":[{key:"fullName",order:"asc"}],loading:V.value},{"item.enabled":a(({item:n})=>[e(ve,{"model-value":n.enabled,onClick:P=>N(n)},null,8,["model-value","onClick"])]),"item.url":a(({item:n})=>[C("a",{href:n.url,title:n.name},m(n.url),9,$e)]),"item.actions":a(({item:n})=>[e(pe,{color:"red",icon:"mdi-delete",onClick:P=>q(n)},null,8,["onClick"])]),tfoot:a(()=>[]),_:1},8,["items","loading"])]),_:1}),e(x,null,{default:a(()=>[e(D),e(c,{color:"accent",onClick:s},{default:a(()=>[E(m(r.$t("common.close")),1)]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]))}}),De={class:"pa-3"},Ie={style:{"font-size":"1.6em !important"},class:"subtitle-1 ml-2"},Ne={class:"d-flex justify-end"},ze=Y({__name:"SearchEngine",setup(R){const I=se(),{t}=G(),y=he(),d=ye(),f=W(),V=Ve(),k=h(),w=h(!1),p=h(0),{searchData:u}=ie(f),N=[{title:t("searchEngine.headers.fileName"),key:"fileName"},{title:t("searchEngine.headers.fileSize"),key:"fileSize"},{title:t("searchEngine.headers.nbSeeders"),key:"nbSeeders"},{title:t("searchEngine.headers.nbLeechers"),key:"nbLeechers"},{title:t("searchEngine.headers.siteUrl"),key:"siteUrl"},{title:"",key:"actions",sortable:!1}],_=[{title:t("searchEngine.filters.category.movies"),value:"movies"},{title:t("searchEngine.filters.category.tv"),value:"tv"},{title:t("searchEngine.filters.category.music"),value:"music"},{title:t("searchEngine.filters.category.games"),value:"games"},{title:t("searchEngine.filters.category.anime"),value:"anime"},{title:t("searchEngine.filters.category.software"),value:"software"},{title:t("searchEngine.filters.category.pictures"),value:"pictures"},{title:t("searchEngine.filters.category.books"),value:"books"}];_.sort((l,i)=>l.title.localeCompare(i.title));const U=[{title:t("searchEngine.filters.category.all"),value:"all"},..._],q=K(()=>{const l=[{title:t("searchEngine.filters.plugins.all"),value:"all"},{title:t("searchEngine.filters.plugins.enabled"),value:"enabled"}];return f.searchPlugins.filter(i=>i.enabled).forEach(i=>{l.push({title:i.name,value:i.name})}),l}),s=K(()=>u.value[p.value]??{}),{results:T}=ke(()=>s.value.results,()=>s.value.filters?.title,l=>l.fileName);function r(){f.createNewTab(),p.value=u.value.length-1,k.value?.focus()}function g(){u.value.length!==1&&(f.deleteTab(s.value.uniqueId),p.value=Math.min(p.value,u.value.length-1))}function n(l){y.pushTorrentToQueue(l.fileUrl)}async function P(){await f.runNewSearch(s.value),s.value.timer=setInterval(()=>ae(s.value),1e3),k.value?.saveValueToHistory()}async function B(l){await f.stopSearch(l),l.timer&&clearInterval(l.timer)}function ee(){u.value.forEach(B)}async function ae(l){await f.refreshResults(l)==="Stopped"&&await B(l)}const L=()=>{I.push({name:"dashboard"})};function le(){d.createDialog(Me)}function z(l){if(d.hasActiveDialog||w.value)return!1;l.key==="Escape"&&L()}return oe(async()=>{document.addEventListener("keydown",z),u.value.length===0?f.createNewTab():u.value.forEach(l=>{l.id&&l.id!==0&&(l.timer=setInterval(()=>f.refreshResults(l),1e3))}),await f.fetchSearchPlugins()}),re(()=>{document.removeEventListener("keydown",z),u.value.forEach(l=>{l.timer&&clearInterval(l.timer)})}),(l,i)=>(S(),j("div",De,[e($,{"no-gutters":"",align:"center",justify:"center"},{default:a(()=>[e(b,null,{default:a(()=>[C("h1",Ie,m(v(t)("searchEngine.title")),1)]),_:1}),e(b,null,{default:a(()=>[C("div",Ne,[e(c,{icon:"mdi-stop",variant:"plain",color:"error",onClick:ee}),e(c,{icon:"mdi-toy-brick",variant:"plain",color:"primary",onClick:le}),e(c,{icon:"mdi-close",variant:"plain",onClick:L})])]),_:1})]),_:1}),e($,{class:"ma-0 pa-0"},{default:a(()=>[e(Ee,{class:"d-flex align-center justify-center ma-0 pa-0 bg-primary",fluid:""},{default:a(()=>[e(Se,{modelValue:p.value,"onUpdate:modelValue":i[0]||(i[0]=o=>p.value=o),class:"overflow-auto","bg-color":"primary","show-arrows":""},{default:a(()=>[(S(!0),j(ue,null,ce(v(u),o=>(S(),M(we,{key:o.uniqueId},{default:a(()=>[C("h4",null,m(!o.query||o.query.length===0?l.$t("searchEngine.tabHeaderEmpty"):o.query),1)]),_:2},1024))),128))]),_:1},8,["modelValue"]),e(D),e(c,{icon:"mdi-plus-circle-outline",variant:"plain",color:"accent",onClick:r}),e(c,{icon:"mdi-minus-circle-outline",variant:"plain",color:"error",disabled:v(u).length===1,onClick:g},null,8,["disabled"])]),_:1})]),_:1}),e(be,null,{default:a(()=>[e(O,null,{default:a(()=>[e($,{class:"mt-1"},{default:a(()=>[e(b,{cols:"12",md:"6"},{default:a(()=>[e(Ce,{modelValue:s.value.query,"onUpdate:modelValue":i[1]||(i[1]=o=>s.value.query=o),"history-key":v(_e).SEARCH_ENGINE_QUERY,ref_key:"queryInput",ref:k,autofocus:"",density:"compact","hide-details":"",clearable:"",label:l.$t("searchEngine.query"),onKeydown:de(J(P,["prevent"]),["enter"])},null,8,["modelValue","history-key","label","onKeydown"])]),_:1}),e(b,{cols:"6",sm:"5",md:"2"},{default:a(()=>[e(Q,{modelValue:s.value.filters.category,"onUpdate:modelValue":i[2]||(i[2]=o=>s.value.filters.category=o),height:"1",variant:"outlined",density:"compact","hide-details":"",items:U,label:l.$t("searchEngine.filters.category.label")},null,8,["modelValue","label"])]),_:1}),e(b,{cols:"6",sm:"5",md:"2"},{default:a(()=>[e(Q,{modelValue:s.value.filters.plugin,"onUpdate:modelValue":i[3]||(i[3]=o=>s.value.filters.plugin=o),flat:"",density:"compact","hide-details":"",variant:"outlined",items:q.value,label:l.$t("searchEngine.filters.plugins.label")},null,8,["modelValue","items","label"])]),_:1}),e(b,{cols:"12",sm:"2",class:"d-flex align-center justify-center"},{default:a(()=>[s.value.id===0?(S(),M(c,{key:0,color:"accent",flat:"",class:"mx-auto px-4",onClick:P},{default:a(()=>[E(m(l.$t("searchEngine.runSearch")),1)]),_:1})):(S(),M(c,{key:1,color:"warning",flat:"",class:"mx-auto px-4",onClick:i[4]||(i[4]=o=>B(s.value))},{default:a(()=>[E(m(l.$t("searchEngine.stopSearch")),1)]),_:1}))]),_:1})]),_:1})]),_:1}),e(Te,{class:"my-3"}),e(O,null,{default:a(()=>[e(X,{headers:N,items:v(T),"footer-props":{itemsPerPageOptions:[10,25,50,100,-1]},"items-per-page":s.value.itemsPerPage},{top:a(()=>[e($,null,{default:a(()=>[e(b,{cols:"12"},{default:a(()=>[e(Z,{modelValue:s.value.filters.title,"onUpdate:modelValue":i[5]||(i[5]=o=>s.value.filters.title=o),density:"compact","hide-details":"",label:l.$t("searchEngine.filters.title.label")},null,8,["modelValue","label"])]),_:1})]),_:1})]),"item.fileSize":a(({item:o})=>[E(m(v(Pe)(o.fileSize,v(V).useBinarySize)),1)]),"item.actions":a(({item:o})=>[e(c,{icon:"mdi-download",variant:"flat",density:"compact",onClick:Ue=>n(o)},null,8,["onClick"])]),_:1},8,["items","items-per-page"])]),_:1})]),_:1})]))}});export{ze as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.scrollable-col[data-v-8013deca]{@media (min-width: 600px){max-height:calc(100vh - 200px)}@media (max-width: 599px){max-height:calc(60vh - 200px)}overflow-y:auto}.gap[data-v-1eb1c7d2]{margin-bottom:8px}.gap[data-v-1eb1c7d2]:last-child{margin-bottom:unset}td .dnd-handle[data-v-63969f1b]{cursor:move}

View File

@@ -0,0 +1,2 @@
import{u as rt,n as oe,l as ae,f as _e,g as ce,h as Ye,i as ke,j as Te,a as te,k as A,m as be,y as he,aE as K,J,D as Ve,c as Q,d as W,aw as ze,V as le,b as it,aF as st,v as Ue,ai as Je,aj as ut,r as S,e as Fe,aG as dt,aH as X,aI as Z,q as I,a2 as pe,K as ee,ax as Ne,z as de,_ as Ce,A as ct,B as mt,T as ft,aJ as vt,aK as pt,aL as _t,aM as gt,aN as yt,a3 as Ie,aO as ht,aP as Ae,af as Qe,a7 as Xe,aQ as Ge,a0 as Ke,aq as wt,C as Dt,ar as $t,as as se,at as ue}from"./index-135ae4c1.js";import{d as V,a as kt,J as Tt,g as j,K as ne,r as Be,M as Se,A as ge,a1 as u,a2 as F,a3 as t,m as e,W as y,Z as l,u as o,Y as Oe,a8 as x,ao as Ze,D as bt,ab as c,n as ye,a6 as $,a7 as R,F as U,ae as Vt,a0 as Nt,c as E,w as me,x as Le,a4 as je,au as Ft,I as Re,a5 as xe,aa as Ct,$ as St,q as Ot}from"./vue-d2584a6d.js";import"./faker-c43f92d4.js";import{_ as Pt}from"./dayjs-f7aba705.js";import{d as He}from"./dayjs.min-1969f9c6.js";import{an as At}from"./vuetify-e547ef1b.js";var $e=(w=>(w[w.MISSING=0]="MISSING",w[w.DOWNLOADING=1]="DOWNLOADING",w[w.DOWNLOADED=2]="DOWNLOADED",w))($e||{}),Y=(w=>(w[w.DISABLED=0]="DISABLED",w[w.NOT_YET_CONTACTED=1]="NOT_YET_CONTACTED",w[w.WORKING=2]="WORKING",w[w.UPDATING=3]="UPDATING",w[w.NOT_WORKING=4]="NOT_WORKING",w))(Y||{});const It={pdf:"mdi-file-pdf-box",png:"mdi-file-image",jpg:"mdi-file-image",jpeg:"mdi-file-image",tiff:"mdi-file-image",doc:"mdi-file-document",docx:"mdi-file-document",txt:"mdi-file-document",nfo:"mdi-information-variant-box",mp3:"mdi-music",wav:"mdi-music",flac:"mdi-music",avi:"mdi-movie",mp4:"mdi-movie",mkv:"mdi-movie",mov:"mdi-movie",wmv:"mdi-movie",srt:"mdi-subtitles",idx:"mdi-subtitles",sub:"mdi-subtitles",rar:"mdi-folder-zip",zip:"mdi-folder-zip",gz:"mdi-folder-zip","7z":"mdi-folder-zip",exe:"mdi-application",msi:"mdi-application",dmg:"mdi-application",deb:"mdi-application",iso:"mdi-application",jar:"mdi-application"};function xt(w){const a=w.split(".").pop()?.toLowerCase()||"";return It[a]||"mdi-file"}function qe(){return{type:"root",name:"",fullName:"",id:"",children:[]}}function zt(w){const a=V(qe());return kt(()=>{const d=qe(),r=Tt(w)??[];for(const m of r){let h=d;m.name.replace("\\","/").split("/").reduce((p,s)=>{const i=p===""?s:p+"/"+s;if(m.name.replace("\\","/").split("/").pop()===s){const b={type:"file",name:s,fullName:i,id:m.index,availability:m.availability,index:m.index,is_seed:m.is_seed,priority:m.priority,progress:m.progress,size:m.size};h.children.push(b)}else{const b=h.children.find(T=>T.name===s);if(b)h=b;else{const T={type:"folder",name:s,fullName:i,id:i,children:[]};h.children.push(T),h=T}}return i},"")}a.value=d}),{tree:a}}const et=j({__name:"MoveTorrentFileDialog",props:{guid:{},hash:{},isFolder:{type:Boolean},oldName:{}},setup(w){const a=w,{isOpened:d}=rt(a.guid),{t:r}=ne(),m=oe(),h=V(),p=V(),s=V(!1),i=Be({newName:""}),b=[g=>!!g||r("dialogs.moveTorrent.required")];async function T(){await h.value?.validate(),s.value&&(a.isFolder?await m.renameTorrentFolder(a.hash,a.oldName,i.newName):await m.renameTorrentFile(a.hash,a.oldName,i.newName),P())}const P=()=>{d.value=!1};return Se(()=>{if(i.newName=a.oldName,a.isFolder)ge(()=>p.value?.select());else{const g=i.newName.lastIndexOf("/"),N=i.newName.lastIndexOf(".");ge(()=>{p.value?.setSelectionRange(g+1,N==-1?i.newName.length:N)})}}),(g,N)=>(u(),F(be,{modelValue:o(d),"onUpdate:modelValue":N[3]||(N[3]=O=>bt(d)?d.value=O:null)},{default:t(()=>[e(ae,null,{default:t(()=>[e(_e,null,{default:t(()=>[y(l(o(r)("dialogs.moveTorrentFile.title",1+Number(g.isFolder))),1)]),_:1}),e(ce,null,{default:t(()=>[e(o(Ye),{modelValue:s.value,"onUpdate:modelValue":N[1]||(N[1]=O=>s.value=O),ref_key:"form",ref:h,onSubmit:N[2]||(N[2]=Oe(()=>{},["prevent"]))},{default:t(()=>[g.oldName?(u(),F(ke,{key:0,"model-value":g.oldName,disabled:"",label:g.$t("dialogs.moveTorrentFile.oldName")},null,8,["model-value","label"])):x("",!0),e(ke,{modelValue:i.newName,"onUpdate:modelValue":N[0]||(N[0]=O=>i.newName=O),ref_key:"input",ref:p,rules:b,autofocus:"",label:g.$t("dialogs.moveTorrent.newPath"),onKeydown:Ze(T,["enter"])},null,8,["modelValue","label"])]),_:1},8,["modelValue"])]),_:1}),e(Te,null,{default:t(()=>[e(te),e(A,{color:"error",onClick:P},{default:t(()=>[y(l(g.$t("common.cancel")),1)]),_:1}),e(A,{color:"accent",disabled:!s.value,onClick:T},{default:t(()=>[y(l(g.$t("common.save")),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"]))}}),Ut={class:"mr-2"},Bt={class:"mr-2"},Lt={class:"mr-4"},Rt={class:"ml-2"},Et=j({__name:"FileNode",props:{node:{}},emits:["renameFile","setFilePriority"],setup(w){const{t:a}=ne(),d=he(),r=[{name:a("constants.file_priority.max"),icon:"mdi-priority-high",value:K.MAXIMAL},{name:a("constants.file_priority.high"),icon:"mdi-arrow-up",value:K.HIGH},{name:a("constants.file_priority.normal"),icon:"mdi-arrow-down",value:K.NORMAL},{name:a("constants.file_priority.unwanted"),icon:"mdi-priority-low",value:K.DO_NOT_DOWNLOAD}];function m(h){return r.find(p=>p.value===h.priority)?.name||""}return(h,p)=>(u(),F(W,{title:h.node.name,value:h.node.index,"prepend-icon":o(xt)(h.node.name)},{append:t(()=>[c("span",Ut,"[ "+l(o(J)(h.node.size,o(d).useBinarySize))+" ]",1),c("span",Bt,l(o(Ve)(h.node.progress)),1),c("span",Lt,"[ "+l(m(h.node))+" ]",1),e(it,{"open-on-hover":"","open-on-click":"","open-delay":"0","close-delay":"0"},{activator:t(({props:s})=>[e(A,ye(s,{class:"mr-2",color:"accent",size:"x-small",icon:"mdi-trending-up"}),null,16)]),default:t(()=>[e(Q,null,{default:t(()=>[(u(),$(U,null,R(r,s=>e(W,{onClick:i=>h.$emit("setFilePriority",h.node,s.value)},{default:t(()=>[e(ze,null,{default:t(()=>[e(le,null,{default:t(()=>[y(l(s.icon),1)]),_:2},1024),c("span",Rt,l(s.name),1)]),_:2},1024)]),_:2},1032,["onClick"])),64))]),_:1})]),_:1}),e(A,{color:"accent",size:"x-small",icon:"mdi-pencil",onClick:p[0]||(p[0]=Oe(s=>h.$emit("renameFile",h.node),["stop"]))})]),_:1},8,["title","value","prepend-icon"]))}}),Wt={class:"mr-2"},Mt=j({__name:"FolderNode",props:{node:{}},emits:["renameFolder","renameFile","setFilePriority"],setup(w){const{t:a}=ne();function d(r){let m=0,h=0;for(const s of r.children)s.type==="file"?m++:s.type==="folder"&&h++;const p=[];return m>0&&p.push(a("torrentDetail.content.fileInfo",m)),h>0&&p.push(a("torrentDetail.content.folderInfo",h)),p.join(", ")}return(r,m)=>{const h=Vt("FolderNode",!0);return u(),F(st,{value:r.node.type==="root"?"(root)":r.node.fullName},{activator:t(({props:p})=>[e(W,ye(p,{"prepend-icon":r.node.type==="root"?"mdi-file-tree":"mdi-folder",title:r.node.type==="root"?r.$t("torrentDetail.content.rootNode"):r.node.name,value:r.node.type==="root"?"(root)":r.node.fullName}),{append:t(({isActive:s})=>[c("span",Wt,l(d(r.node)),1),r.node.type==="folder"?(u(),F(A,{key:0,color:"accent",size:"x-small",icon:"mdi-pencil",onClick:m[0]||(m[0]=Oe(i=>r.$emit("renameFolder",r.node),["stop"]))})):x("",!0),e(le,{icon:s?"mdi-chevron-up":"mdi-chevron-down"},null,8,["icon"])]),_:2},1040,["prepend-icon","title","value"])]),default:t(()=>[(u(!0),$(U,null,R(r.node.children,p=>(u(),$(U,null,[p.type==="folder"?(u(),F(h,{key:0,node:p,onRenameFolder:m[1]||(m[1]=s=>r.$emit("renameFolder",s)),onRenameFile:m[2]||(m[2]=s=>r.$emit("renameFile",s)),onSetFilePriority:m[3]||(m[3]=(s,i)=>r.$emit("setFilePriority",s,i))},null,8,["node"])):x("",!0),p.type==="file"?(u(),F(Et,{key:1,node:p,onRenameFile:m[4]||(m[4]=s=>r.$emit("renameFile",s)),onSetFilePriority:m[5]||(m[5]=(s,i)=>r.$emit("setFilePriority",s,i))},null,8,["node"])):x("",!0)],64))),256))]),_:1},8,["value"])}}}),Gt=j({__name:"RootNode",props:{root:{}},emits:["renameFolder","renameFile","setFilePriority"],setup(w){return(a,d)=>(u(),F(Q,{density:"compact","select-strategy":"classic"},{default:t(()=>[e(Mt,{node:a.root,onRenameFolder:d[0]||(d[0]=r=>a.$emit("renameFolder",r)),onRenameFile:d[1]||(d[1]=r=>a.$emit("renameFile",r)),onSetFilePriority:d[2]||(d[2]=(r,m)=>a.$emit("setFilePriority",r,m))},null,8,["node"])]),_:1}))}}),Kt=j({__name:"Content",props:{torrent:{},isActive:{type:Boolean}},setup(w){const a=w,d=Ue(),r=oe(),{fileContentInterval:m}=Nt(he()),{pause:h,resume:p}=Je(_,m,{immediate:!1,immediateCallback:!0}),s=V(!1),i=V(!1),b=V([]),{tree:T}=zt(b),P=V(["(root)"]),g=V(""),N=Be({hash:"",isFolder:!1,oldName:""}),O=E({get:()=>b.value.filter(f=>f.priority!==K.DO_NOT_DOWNLOAD).map(f=>f.index),async set(f){const L=b.value.filter(D=>D.priority!==K.DO_NOT_DOWNLOAD).map(D=>D.index),M=L.filter(D=>!f.includes(D)).map(D=>b.value.find(C=>C.index===D)).filter(D=>D&&D.priority!==K.DO_NOT_DOWNLOAD).map(D=>D.index),k=f.filter(D=>!L.includes(D)).map(D=>b.value.find(C=>C.index===D)).filter(D=>D&&D.priority===K.DO_NOT_DOWNLOAD).map(D=>D.index);M.length&&await r.setTorrentFilePriority(a.torrent.hash,M,K.DO_NOT_DOWNLOAD),k.length&&await r.setTorrentFilePriority(a.torrent.hash,k,K.NORMAL),await _()}});async function z(f){N.hash=a.torrent.hash,N.isFolder=f.type==="folder",N.oldName=f.fullName,g.value=d.createDialog(et,N)}async function v(f,L){await r.setTorrentFilePriority(a.torrent.hash,[f.index],L),await _()}async function _(){s.value||(s.value=!0,i.value=!0,await ge(),b.value=await r.fetchFiles(a.torrent.hash),i.value=!1,s.value=!1,await ge())}return me(()=>a.isActive,f=>{f?(p(),_()):h()}),me(()=>d.isDialogOpened(g.value),f=>{f||_()}),Le(()=>{p()}),(f,L)=>(u(),F(ae,{loading:i.value,flat:""},{default:t(()=>[e(Gt,{opened:P.value,"onUpdate:opened":L[0]||(L[0]=M=>P.value=M),selected:O.value,"onUpdate:selected":L[1]||(L[1]=M=>O.value=M),root:o(T),onRenameFolder:z,onRenameFile:z,onSetFilePriority:v},null,8,["opened","selected","root"])]),_:1},8,["loading"]))}}),jt={class:"pl-4"},Ht={class:"pr-4"},q=j({__name:"InfoBase",props:{compact:{type:Boolean}},setup(w){return(a,d)=>(u(),F(S,{cols:"12",sm:"6",lg:"3"},{default:t(()=>[e(ut,{rounded:"xl",class:"d-flex align-center py-2 border"},{default:t(()=>[c("div",jt,[je(a.$slots,"title")]),e(te),c("div",Ht,[je(a.$slots,"text")])]),_:3})]),_:3}))}}),qt={key:0,class:"d-flex gap"},Yt=j({__name:"Info",props:{torrent:{},isActive:{type:Boolean}},setup(w){const a=w,d=oe(),r=Fe(),m=he(),h=E({get:()=>a.torrent.auto_tmm,set:v=>d.toggleAutoTmm([a.torrent.hash],v)}),p=E({get:()=>a.torrent.f_l_piece_prio,set:()=>d.toggleFLPiecePrio([a.torrent.hash])}),s=E({get:()=>a.torrent.forced,set:v=>{v?r.forceResumeTorrents([a.torrent.hash]):r.resumeTorrents([a.torrent.hash])}}),i=E({get:()=>a.torrent.seq_dl,set:()=>d.toggleSeqDl([a.torrent.hash])}),b=E({get:()=>a.torrent.super_seeding,set:v=>d.setSuperSeeding([a.torrent.hash],v)}),T=[{title:"added_on",text:"added_on"},{title:"completed_on",text:"completed_on"},{title:"last_activity",text:"last_activity"},{title:"seen_complete",text:"seen_complete"}],P=[{title:"ratio_time_limit",text:"ratio_time_limit"},{title:"seeding_time",text:"seeding_time"},{title:"time_active",text:"time_active"}],g=[{title:"downloaded",text:"downloaded"},{title:"downloaded_session",text:"downloaded_session"},{title:"uploaded",text:"uploaded"},{title:"uploaded_session",text:"uploaded_session"},{title:"size",text:"size"},{title:"total_size",text:"total_size"},{title:"amount_left",text:"amount_left"},{title:"global_volume",text:"globalVolume"}],N=[{title:"download_limit",text:"dl_limit"},{title:"download_speed",text:"dlspeed"},{title:"upload_limit",text:"up_limit"},{title:"upload_speed",text:"upspeed"},{title:"avg_download_speed",text:"avgDownloadSpeed"},{title:"avg_upload_speed",text:"avgUploadSpeed"},{title:"global_speed",text:"globalSpeed"}],O=[{title:"available_peers",text:"available_peers"},{title:"available_seeds",text:"available_seeds"},{title:"num_leechs",text:"num_leechs"},{title:"num_seeds",text:"num_seeds"},{title:"ratio",text:"ratio"},{title:"ratio_limit",text:"ratio_limit"},{title:"availability",text:"availability"},{title:"eta",text:"eta"},{title:"category",text:"category"},{title:"state",text:"stateString"},{title:"trackers_count",text:"trackers_count"},{title:"priority",text:"priority"}],z=[{title:"content_path",text:"content_path"},{title:"download_path",text:"download_path"},{title:"hash",text:"hash"},{title:"infohash_v1",text:"infohash_v1"},{title:"infohash_v2",text:"infohash_v2"},{title:"magnet",text:"magnet"},{title:"name",text:"name"},{title:"save_path",text:"savePath"},{title:"tracker",text:"tracker"}];return(v,_)=>(u(),F(Q,null,{default:t(()=>[e(W,null,{default:t(()=>[e(dt,null,{default:t(()=>[e(X,{title:v.$t("torrentDetail.info.datetime_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(I,null,{default:t(()=>[(u(),$(U,null,R(T,f=>e(q,null,Ft({title:t(()=>[y(l(v.$t(`torrent.properties.${f.title}`)),1)]),_:2},[v.torrent[f.text]>0?{name:"text",fn:t(()=>[y(l(o(He)(v.torrent[f.text]*1e3).format(o(m).dateFormat??"DD/MM/YYYY, HH:mm:ss")),1)]),key:"0"}:{name:"text",fn:t(()=>[y(l(v.$t("common.NA")),1)]),key:"1"}]),1024)),64))]),_:1})]),_:1})]),_:1},8,["title"]),e(X,{title:v.$t("torrentDetail.info.duration_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(I,null,{default:t(()=>[(u(),$(U,null,R(P,f=>e(q,null,{title:t(()=>[y(l(v.$t(`torrent.properties.${f.title}`)),1)]),text:t(()=>[y(l(o(He).duration(v.torrent[f.text],"s").humanize()),1)]),_:2},1024)),64))]),_:1})]),_:1})]),_:1},8,["title"]),e(X,{title:v.$t("torrentDetail.info.boolean_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(I,null,{default:t(()=>[e(q,null,{title:t(()=>[e(pe,{modelValue:h.value,"onUpdate:modelValue":_[0]||(_[0]=f=>h.value=f),"hide-details":"",density:"compact",label:v.$t("torrent.properties.auto_tmm")},null,8,["modelValue","label"])]),_:1}),e(q,null,{title:t(()=>[e(pe,{modelValue:p.value,"onUpdate:modelValue":_[1]||(_[1]=f=>p.value=f),"hide-details":"",density:"compact",label:v.$t("torrent.properties.f_l_piece_prio")},null,8,["modelValue","label"])]),_:1}),e(q,null,{title:t(()=>[e(pe,{modelValue:s.value,"onUpdate:modelValue":_[2]||(_[2]=f=>s.value=f),"hide-details":"",density:"compact",label:v.$t("torrent.properties.forced")},null,8,["modelValue","label"])]),_:1}),e(q,null,{title:t(()=>[e(pe,{modelValue:i.value,"onUpdate:modelValue":_[3]||(_[3]=f=>i.value=f),"hide-details":"",density:"compact",label:v.$t("torrent.properties.seq_dl")},null,8,["modelValue","label"])]),_:1}),e(q,null,{title:t(()=>[e(pe,{modelValue:b.value,"onUpdate:modelValue":_[4]||(_[4]=f=>b.value=f),"hide-details":"",density:"compact",label:v.$t("torrent.properties.super_seeding")},null,8,["modelValue","label"])]),_:1})]),_:1})]),_:1})]),_:1},8,["title"]),e(X,{title:v.$t("torrentDetail.info.data_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(I,null,{default:t(()=>[(u(),$(U,null,R(g,f=>e(q,null,{title:t(()=>[y(l(v.$t(`torrent.properties.${f.title}`)),1)]),text:t(()=>[y(l(o(J)(v.torrent[f.text],o(m).useBinarySize)),1)]),_:2},1024)),64))]),_:1})]),_:1})]),_:1},8,["title"]),e(X,{title:v.$t("torrentDetail.info.speed_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(I,null,{default:t(()=>[(u(),$(U,null,R(N,f=>e(q,null,{title:t(()=>[y(l(v.$t(`torrent.properties.${f.title}`)),1)]),text:t(()=>[y(l(o(ee)(v.torrent[f.text],o(m).useBitSpeed)),1)]),_:2},1024)),64))]),_:1})]),_:1})]),_:1},8,["title"]),e(X,{title:v.$t("torrentDetail.info.text_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(I,null,{default:t(()=>[(u(),$(U,null,R(O,f=>e(q,null,{title:t(()=>[y(l(v.$t(`torrent.properties.${f.title}`)),1)]),text:t(()=>[y(l(v.torrent[f.text]),1)]),_:2},1024)),64))]),_:1})]),_:1})]),_:1},8,["title"]),e(X,{title:v.$t("torrentDetail.info.long_text_values")},{default:t(()=>[e(Z,null,{default:t(()=>[e(Q,null,{default:t(()=>[(u(),$(U,null,R(z,f=>e(W,{title:v.$t(`torrent.properties.${f.title}`)},{default:t(()=>[e(Ne,null,{default:t(()=>[y(l(v.torrent[f.text]),1)]),_:2},1024)]),_:2},1032,["title"])),64)),e(W,{title:v.$t("torrent.properties.tags")},{default:t(()=>[v.torrent.tags?.length?(u(),$("div",qt,[(u(!0),$(U,null,R(v.torrent.tags,f=>(u(),F(de,{variant:"flat",color:"tag"},{default:t(()=>[y(l(f),1)]),_:2},1024))),256))])):(u(),F(Ne,{key:1},{default:t(()=>[y(l(v.$t("torrent.properties.empty_tags")),1)]),_:1}))]),_:1},8,["title"])]),_:1})]),_:1})]),_:1},8,["title"])]),_:1})]),_:1})]),_:1}))}});const Jt=Ce(Yt,[["__scopeId","data-v-bb1329d2"]]),Qt=["href"],Xt={key:1},Zt={class:"my-1"},el={class:"mr-2"},tl={key:0},ll={key:2},al={key:0},ol={key:1},nl={key:2},rl={key:3},il={key:4},sl={key:0},ul=j({__name:"Overview",props:{torrent:{},isActive:{type:Boolean}},setup(w){const a=w,{t:d}=ne(),r=At(),m=Ue(),h=oe(),p=Fe(),s=he(),i=V(),b=V(""),T=V(0),P=V([]),g=V(0),N=V(0),O=V(""),z=V(0),v=V(0),_=V(0),f=V(0),L=E(()=>`torrent-${a.torrent.state}`),M=E(()=>`${parseInt(ct(z.value,!0))} ${mt(z.value,!0)}`),k=E(()=>a.torrent.state===ft.META_DL),D=E(()=>!k.value&&_.value>0&&_.value<s.canvasRenderThreshold),C=E(()=>D.value&&_.value<s.canvasRefreshThreshold);async function we(){const n=await p.getTorrentProperties(a.torrent.hash);b.value=n.comment,T.value=n.dl_speed_avg,_.value=n.pieces_num,v.value=n.pieces_have,z.value=n.piece_size,f.value=n.up_speed_avg}async function H(){P.value=await h.fetchFiles(a.torrent.hash),N.value=P.value.length;const n=P.value.filter(G=>G.priority!==K.DO_NOT_DOWNLOAD);g.value=n.length,g.value===1&&(O.value=n[0].name)}async function Ee(){if(!i.value)return;const n=await h.fetchPieceState(a.torrent.hash);i.value.width=n.length||-1;const G=i.value.getContext("2d");G.clearRect(0,0,i.value.width,i.value.height);let B="",re=1;for(let ie=0;ie<n.length;++ie){const Pe=n[ie];let fe="";if(Pe===$e.DOWNLOADING)fe=r.current.value.colors["torrent-downloading"];else if(Pe===$e.DOWNLOADED)fe=r.current.value.colors["torrent-pausedUP"];else if(Pe===$e.MISSING){const ot=P.value.filter(ve=>ve.priority!==K.DO_NOT_DOWNLOAD).map(ve=>ve.piece_range);for(const[ve,nt]of ot)if(ie>ve&&ie<nt){fe=r.current.value.colors["torrent-pausedDL"];break}}if(fe===B){++re;continue}B!==""&&(G.fillStyle=B,G.fillRect(ie-re,0,re,i.value.height)),re=1,B=fe}B!==""&&(G.fillStyle=B,G.fillRect(n.length-re,0,re,i.value.height))}async function tt(){await navigator.clipboard.writeText(a.torrent.hash)}function De(n){m.createDialog(Pt,{hashes:[a.torrent.hash],mode:n})}function We(){m.createDialog(et,{hash:a.torrent.hash,isFolder:!1,oldName:O.value})}const{resume:lt,pause:at}=Je(async()=>{await H(),C.value&&await Ee()},s.fileContentInterval,{immediate:!0,immediateCallback:!0});me(()=>a.isActive,n=>{n?lt():at()}),me(()=>a.torrent,async()=>{await we()});function Me(n){if(m.hasActiveDialog)return!1;if(n.key==="d")return n.preventDefault(),De("dl"),!0;if(n.key==="s")return n.preventDefault(),De("save"),!0;if(n.key==="f"&&g.value===1)return n.preventDefault(),We(),!0}return Le(()=>{document.addEventListener("keydown",Me)}),Re(()=>{document.removeEventListener("keydown",Me)}),(n,G)=>n.torrent?(u(),F(ae,{key:0},{default:t(()=>[e(_e,{class:"text-wrap"},{default:t(()=>[y(l(n.torrent.name),1)]),_:1}),e(_t,null,{default:t(()=>[c("div",null,[(u(!0),$(U,null,R(o(pt)(b.value),B=>(u(),$("span",null,[o(vt)(B)?(u(),$("a",{key:0,target:"_blank",href:B},l(B),9,Qt)):(u(),$("span",Xt,l(B),1))]))),256))]),c("div",Zt,[c("span",el,l(n.torrent.hash),1),e(A,{variant:"outlined",rounded:"",onClick:tt},{default:t(()=>[y(l(n.$t("torrentDetail.overview.copy_hash")),1)]),_:1})])]),_:1}),e(ce,null,{default:t(()=>[e(I,null,{default:t(()=>[e(S,{cols:"12",md:"6"},{default:t(()=>[e(I,null,{default:t(()=>[e(S,{cols:"4"},{default:t(()=>[e(gt,{color:L.value,indeterminate:k.value,size:100,"model-value":n.torrent?.progress*100,width:15},{default:t(()=>[k.value?(u(),$("span",tl,l(n.$t("torrentDetail.overview.fetchingMetadata")),1)):n.torrent.progress===1?(u(),F(le,{key:1,icon:"mdi-check",size:"x-large"})):(u(),$("span",ll,l(o(Ve)(n.torrent.progress)),1))]),_:1},8,["color","indeterminate","model-value"])]),_:1}),e(S,{cols:"8",class:"d-flex flex-column align-center justify-center"},{default:t(()=>[k.value?(u(),$("div",al,[c("span",null,l(n.$t("torrentDetail.overview.waitingForMetadata")),1)])):D.value?(u(),$("div",ol,[c("canvas",{ref_key:"canvas",ref:i,width:"0",height:"10"},null,512)])):x("",!0),!k.value&&!D.value?(u(),$("div",nl,[c("span",null,l(n.$t("torrentDetail.overview.canvasRenderDisabled")),1)])):!k.value&&!C.value?(u(),$("div",rl,[c("span",null,l(n.$t("torrentDetail.overview.canvasRefreshDisabled")),1)])):x("",!0),_.value>0?(u(),$("div",il,[c("span",null,l(o(d)("torrentDetail.overview.pieceCount",{owned:v.value,total:_.value,pieceSize:M.value})),1)])):x("",!0),c("div",null,[e(le,{icon:"mdi-arrow-down"}),y(" "+l(o(ee)(n.torrent.dlspeed,o(s).useBitSpeed))+" ",1),e(le,{icon:"mdi-arrow-up"}),y(" "+l(o(ee)(n.torrent.upspeed,o(s).useBitSpeed)),1)])]),_:1})]),_:1}),e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.download_path"))+":",1),c("div",null,l(n.torrent.download_path),1),e(A,{icon:"mdi-pencil",color:"accent",size:"x-small",onClick:G[0]||(G[0]=B=>De("dl"))})]),_:1}),e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.fileCount"))+":",1),c("div",null,l(g.value)+" / "+l(N.value),1),g.value===1?(u(),$("div",sl,l(O.value),1)):x("",!0),g.value===1?(u(),F(A,{key:1,icon:"mdi-pencil",color:"accent",size:"x-small",onClick:We})):x("",!0)]),_:1})]),_:1}),e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.save_path"))+":",1),c("div",null,l(n.torrent.savePath),1),e(A,{icon:"mdi-pencil",color:"accent",size:"x-small",onClick:G[1]||(G[1]=B=>De("save"))})]),_:1}),e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.content_path"))+":",1),c("div",null,l(n.torrent.content_path),1)]),_:1})]),_:1})]),_:1}),e(S,{cols:"12",md:"6"},{default:t(()=>[e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.state"))+":",1),e(de,{variant:"flat",color:L.value},{default:t(()=>[y(l(n.$t(`torrent.state.${n.torrent.state}`)),1)]),_:1},8,["color"])]),_:1}),e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.category"))+":",1),e(de,{variant:"flat",color:"category"},{default:t(()=>[y(l(n.torrent.category.length?n.torrent.category:n.$t("navbar.side.filters.uncategorized")),1)]),_:1})]),_:1})]),_:1}),e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.tracker"))+":",1),e(de,{variant:"flat",color:"tracker"},{default:t(()=>[y(l(n.torrent.tracker?o(yt)(n.torrent.tracker):n.$t("navbar.side.filters.untracked")),1)]),_:1})]),_:1}),e(S,{cols:"6",class:"d-flex flex-wrap chipgap"},{default:t(()=>[c("div",null,l(n.$t("torrent.properties.tags"))+":",1),n.torrent.tags?(u(!0),$(U,{key:0},R(n.torrent.tags,B=>(u(),F(de,{key:B,variant:"flat",color:"tag"},{default:t(()=>[y(l(B),1)]),_:2},1024))),128)):x("",!0),!n.torrent.tags||n.torrent.tags.length===0?(u(),F(de,{key:1,variant:"flat",color:"tag"},{default:t(()=>[y(l(n.$t("navbar.side.filters.untagged")),1)]),_:1})):x("",!0)]),_:1})]),_:1}),e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.selectedFileSize"))+":",1),c("div",null,l(o(J)(n.torrent.size,o(s).useBinarySize))+" / "+l(o(J)(n.torrent.total_size,o(s).useBinarySize)),1)]),_:1}),e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.ratio"))+":",1),c("div",null,l(n.torrent.ratio),1)]),_:1})]),_:1}),e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.downloaded"))+":",1),c("div",null,l(o(J)(n.torrent.downloaded,o(s).useBinarySize)),1)]),_:1}),e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.uploaded"))+":",1),c("div",null,l(o(J)(n.torrent.uploaded,o(s).useBinarySize)),1)]),_:1})]),_:1}),e(I,null,{default:t(()=>[e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.dlSpeedAverage"))+":",1),c("div",null,l(o(ee)(T.value,o(s).useBitSpeed)),1)]),_:1}),e(S,{cols:"6"},{default:t(()=>[c("div",null,l(n.$t("torrentDetail.overview.upSpeedAverage"))+":",1),c("div",null,l(o(ee)(f.value,o(s).useBitSpeed)),1)]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})):x("",!0)}});const dl=Ce(ul,[["__scopeId","data-v-0d43f850"]]),cl={class:"d-flex"},ml={key:0},fl=["alt","src","title"],vl=["title"],pl={class:"text-subtitle-2 text-grey"},_l=["title"],gl={class:"d-flex flex-column"},yl={class:"text-h5"},hl=j({__name:"Peers",props:{torrent:{},isActive:{type:Boolean}},setup(w){const a=w,{t:d}=ne(),r=oe(),m=he(),h=V(!1),p=V([]),s=V(""),i=V(null),b=V(!1);async function T(){h.value=!0,p.value=Object.entries((await r.getTorrentPeers(a.torrent.hash)).peers).map(([z,v])=>({...v,host:z})),h.value=!1}async function P(){s.value.length&&(await r.addTorrentPeers(a.torrent.hash,s.value.split(`
`)),await T(),g())}function g(){b.value=!1,s.value=""}async function N(z){await r.banPeers([z.host]),await T()}async function O(z){z??a.isActive?(await T(),i.value=setInterval(T,5e3)):(clearInterval(i.value),i.value=null)}return Se(O),Re(()=>O(!1)),me(()=>a.isActive,O),(z,v)=>(u(),F(Q,null,{default:t(()=>[(u(!0),$(U,null,R(p.value,(_,f)=>(u(),$(U,null,[f>0?(u(),F(Ie,{key:0,color:"white"})):x("",!0),e(W,null,{default:t(()=>[c("div",cl,[c("div",null,[e(ze,{class:"overflow-visible text-select"},{default:t(()=>[_.country_code?(u(),$("span",ml,[o(ht)?(u(),$("img",{key:0,alt:o(Ae)(_.country_code).char,src:o(Ae)(_.country_code).url,title:_.country,style:{"max-width":"32px"}},null,8,fl)):(u(),$("span",{key:1,title:_.country},l(o(Ae)(_.country_code).char),9,vl))])):x("",!0),c("span",null,l(_.ip),1),c("span",pl," :"+l(_.port),1)]),_:2},1024),e(Ne,{class:"d-block"},{default:t(()=>[c("div",null,[y(" Flags: "),c("span",{class:"cursor-help",title:_.flags_desc},l(_.flags),9,_l)]),c("div",null,"Progress: "+l(o(Ve)(_.progress)),1),c("div",null,[e(le,{icon:"mdi-arrow-down",color:"download"}),y(" "+l(o(ee)(_.dl_speed,o(m).useBitSpeed))+" ",1),e(le,{icon:"mdi-arrow-up",color:"upload"}),y(" "+l(o(ee)(_.up_speed,o(m).useBitSpeed)),1)]),c("div",null,l(o(J)(_.downloaded,o(m).useBinarySize))+" | "+l(o(J)(_.uploaded,o(m).useBinarySize)),1),c("div",null,"Relevance: "+l(o(Ve)(_.relevance)),1)]),_:2},1024)]),e(te),c("div",gl,[e(A,{color:"red",icon:"mdi-cancel",variant:"text",onClick:L=>N(_)},null,8,["onClick"])])])]),_:2},1024)],64))),256)),p.value.length===0?(u(),F(W,{key:0},{default:t(()=>[y(l(z.$t("torrentDetail.peers.emptyList")),1)]),_:1})):x("",!0),e(W,null,{default:t(()=>[c("div",{class:xe(["d-flex gap py-5",z.$vuetify.display.mobile?"flex-column":"justify-space-evenly"])},[e(be,{modelValue:b.value,"onUpdate:modelValue":v[1]||(v[1]=_=>b.value=_),"max-width":"750px"},{activator:t(({props:_})=>[e(A,ye(_,{variant:"flat",text:o(d)("torrentDetail.peers.addPeers.title"),color:"accent"}),null,16,["text"])]),default:t(()=>[e(ae,null,{default:t(()=>[e(_e,null,{default:t(()=>[c("span",yl,l(o(d)("torrentDetail.peers.addPeers.title")),1)]),_:1}),e(ce,null,{default:t(()=>[e(Qe,null,{default:t(()=>[e(I,null,{default:t(()=>[e(S,{cols:"12"},{default:t(()=>[e(Xe,{modelValue:s.value,"onUpdate:modelValue":v[0]||(v[0]=_=>s.value=_),label:o(d)("torrentDetail.peers.addPeers.newPeers"),placeholder:o(d)("torrentDetail.peers.addPeers.newPeersPlaceholder"),hint:o(d)("torrentDetail.peers.addPeers.newPeersHint")},null,8,["modelValue","label","placeholder","hint"])]),_:1})]),_:1})]),_:1})]),_:1}),e(Te,null,{default:t(()=>[e(te),e(A,{color:"error",onClick:g},{default:t(()=>[y(l(o(d)("common.cancel")),1)]),_:1}),e(A,{color:"accent",onClick:P},{default:t(()=>[y(l(o(d)("common.ok")),1)]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],2)]),_:1})]),_:1}))}});const wl=Ce(hl,[["__scopeId","data-v-04aee0ca"]]),Dl=j({__name:"TagsAndCategories",props:{torrent:{},isActive:{type:Boolean}},setup(w){const a=w,d=oe(),r=Fe(),m=E(()=>d.categories.map(i=>i.name).indexOf(a.torrent.category)),h=E(()=>d.tags.filter(i=>a.torrent.tags?.includes(i)));async function p(i){a.torrent.category===i?await r.setTorrentCategory([a.torrent.hash],""):await r.setTorrentCategory([a.torrent.hash],i)}async function s(i){a.torrent.tags?.includes(i)?await r.removeTorrentTags([a.torrent.hash],[i]):await r.addTorrentTags([a.torrent.hash],[i])}return Se(async()=>{await d.fetchCategories(),await d.fetchTags()}),(i,b)=>(u(),F(ae,null,{default:t(()=>[e(ce,null,{default:t(()=>[e(I,null,{default:t(()=>[e(S,{cols:"12",md:"6"},{default:t(()=>[e(Ge,{"model-value":h.value,multiple:""},{default:t(()=>[e(Q,null,{default:t(()=>[e(Ke,null,{default:t(()=>[y(l(i.$t("torrentDetail.tagsAndCategories.tags")),1)]),_:1}),(u(!0),$(U,null,R(o(d).tags,T=>(u(),F(W,{title:T,variant:i.torrent.tags?.includes(T)?"tonal":void 0,"base-color":i.torrent.tags?.includes(T)?"accent":void 0,onClick:P=>s(T)},null,8,["title","variant","base-color","onClick"]))),256))]),_:1})]),_:1},8,["model-value"])]),_:1}),e(S,{cols:"12",md:"6"},{default:t(()=>[e(Ge,{"model-value":m.value},{default:t(()=>[e(Q,null,{default:t(()=>[e(Ke,null,{default:t(()=>[y(l(i.$t("torrentDetail.tagsAndCategories.categories")),1)]),_:1}),(u(!0),$(U,null,R(o(d).categories,T=>(u(),F(W,{title:T.name,variant:T.name===a.torrent.category?"tonal":void 0,"base-color":T.name===a.torrent.category?"accent":void 0,onClick:P=>p(T.name)},null,8,["title","variant","base-color","onClick"]))),256))]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})]),_:1})]),_:1}))}}),$l={class:"d-flex"},kl={key:0},Tl={key:1},bl={key:2},Vl={key:3},Nl={key:0,class:"d-flex flex-column"},Fl={class:"text-h5"},Cl={class:"text-h5"},Sl=j({__name:"Trackers",props:{torrent:{},isActive:{type:Boolean}},setup(w){const a=w,{t:d}=ne(),r=oe();function m(k){switch(k){case Y.DISABLED:return d("constants.trackerStatus.disabled");case Y.NOT_YET_CONTACTED:return d("constants.trackerStatus.not_yet_contacted");case Y.WORKING:return d("constants.trackerStatus.working");case Y.UPDATING:return d("constants.trackerStatus.updating");case Y.NOT_WORKING:return d("constants.trackerStatus.not_working");default:return""}}function h(k){return typeof k=="number"?k===-1?"N/A":k.valueOf():!k||k.num_peers===-1||k?.num_seeds===-1||k?.num_leeches===-1?"N/A":d("torrentDetail.trackers.peersValue",{peers:k.num_peers,seeds:k.num_seeds,leeches:k.num_leeches})}const p=V(!1),s=V([]),i=V(""),b=V(null),T=V(!1),P=[k=>!!k||d("torrentDetail.trackers.editTracker.newUrlRequired")],g=Be({isVisible:!1,isFormValid:!1,oldUrl:"",newUrl:""});function N(k){g.isVisible=!0,g.oldUrl=k.url,g.newUrl=k.url,ge(()=>{document.getElementById("input")?.select()})}async function O(){p.value=!0,s.value=(await r.getTorrentTrackers(a.torrent.hash)).map(k=>({...k,isSelectable:k.tier!==-1})),p.value=!1}async function z(){i.value.length&&(await r.addTorrentTrackers(a.torrent.hash,i.value),await O(),v())}function v(){T.value=!1,i.value=""}async function _(){g.isFormValid&&(await r.editTorrentTracker(a.torrent.hash,g.oldUrl,g.newUrl),g.isVisible=!1,await O())}async function f(k){await r.removeTorrentTrackers(a.torrent.hash,[k.url]),await O()}async function L(){await r.reannounceTorrents([a.torrent.hash])}async function M(k){k??a.isActive?(await O(),b.value=setInterval(O,5e3)):(clearInterval(b.value),b.value=null)}return Se(M),Re(()=>M(!1)),me(()=>a.isActive,M),(k,D)=>(u(),F(Q,null,{default:t(()=>[(u(!0),$(U,null,R(s.value,(C,we)=>(u(),$(U,null,[we===3?(u(),F(Ie,{key:0,color:"white",thickness:"5"})):we>0?(u(),F(Ie,{key:1,class:"mx-5",color:"white"})):x("",!0),e(W,null,{default:t(()=>[c("div",$l,[c("div",{class:xe(`tracker-${o(Y)[C.status].toLowerCase()}`)},[e(ze,{class:"text-break text-wrap"},{default:t(()=>[y(l(C.url),1)]),_:2},1024),e(Ne,{class:"d-block"},{default:t(()=>[C.msg?(u(),$("div",kl,l(C.msg),1)):(u(),$("div",Tl,l(m(C.status)),1)),C.tier>=0?(u(),$("div",bl,l(o(d)("torrentDetail.trackers.tier",C.tier)),1)):x("",!0),C.status!==o(Y).NOT_WORKING?(u(),$("div",Vl,[c("div",null,l(h(C)),1),c("div",null,"Downloads: "+l(h(C.num_downloaded)),1)])):x("",!0)]),_:2},1024)],2),e(te),C.tier>=0?(u(),$("div",Nl,[e(be,{modelValue:g.isVisible,"onUpdate:modelValue":D[4]||(D[4]=H=>g.isVisible=H),"max-width":"750px"},{activator:t(({props:H})=>[e(A,ye(H,{icon:"mdi-pencil",variant:"text",onClick:Ee=>N(C)}),null,16,["onClick"])]),default:t(()=>[e(ae,null,{default:t(()=>[e(_e,null,{default:t(()=>[c("span",Fl,l(o(d)("torrentDetail.trackers.editTracker.title")),1)]),_:1}),e(ce,null,{default:t(()=>[e(o(Ye),{modelValue:g.isFormValid,"onUpdate:modelValue":D[1]||(D[1]=H=>g.isFormValid=H),onSubmit:D[2]||(D[2]=Oe(()=>{},["prevent"]))},{default:t(()=>[e(o(ke),{"model-value":g.oldUrl,disabled:"",label:k.$t("torrentDetail.trackers.editTracker.oldUrl")},null,8,["model-value","label"]),e(o(ke),{modelValue:g.newUrl,"onUpdate:modelValue":D[0]||(D[0]=H=>g.newUrl=H),id:"input",rules:P,label:k.$t("torrentDetail.trackers.editTracker.newUrl"),autofocus:"",onKeydown:Ze(_,["enter"])},null,8,["modelValue","label"])]),_:1},8,["modelValue"])]),_:1}),e(Te,null,{default:t(()=>[e(te),e(A,{color:"error",disabled:!g.isFormValid,onClick:D[3]||(D[3]=H=>g.isVisible=!1)},{default:t(()=>[y(l(o(d)("common.cancel")),1)]),_:1},8,["disabled"]),e(A,{color:"accent",onClick:_},{default:t(()=>[y(l(o(d)("common.ok")),1)]),_:1})]),_:1})]),_:1})]),_:2},1032,["modelValue"]),e(A,{color:"red",icon:"mdi-delete",variant:"text",onClick:H=>f(C)},null,8,["onClick"])])):x("",!0)])]),_:2},1024)],64))),256)),e(W,null,{default:t(()=>[c("div",{class:xe(["d-flex gap py-5",k.$vuetify.display.mobile?"flex-column":"justify-space-evenly"])},[e(be,{modelValue:T.value,"onUpdate:modelValue":D[6]||(D[6]=C=>T.value=C),"max-width":"750px"},{activator:t(({props:C})=>[e(A,ye(C,{variant:"flat",text:o(d)("torrentDetail.trackers.addTrackers.title"),color:"accent"}),null,16,["text"])]),default:t(()=>[e(ae,null,{default:t(()=>[e(_e,null,{default:t(()=>[c("span",Cl,l(o(d)("torrentDetail.trackers.addTrackers.title")),1)]),_:1}),e(ce,null,{default:t(()=>[e(Qe,null,{default:t(()=>[e(I,null,{default:t(()=>[e(S,{cols:"12"},{default:t(()=>[e(Xe,{modelValue:i.value,"onUpdate:modelValue":D[5]||(D[5]=C=>i.value=C),label:o(d)("torrentDetail.trackers.addTrackers.newTrackers"),hint:o(d)("torrentDetail.trackers.addTrackers.newTrackersHint")},null,8,["modelValue","label","hint"])]),_:1})]),_:1})]),_:1})]),_:1}),e(Te,null,{default:t(()=>[e(te),e(A,{color:"error",onClick:v},{default:t(()=>[y(l(o(d)("common.cancel")),1)]),_:1}),e(A,{color:"accent",onClick:z},{default:t(()=>[y(l(o(d)("common.ok")),1)]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),e(A,{variant:"flat",disabled:s.value.length===3,text:o(d)("torrentDetail.trackers.reannounce"),color:"primary",onClick:L},null,8,["disabled","text"])],2)]),_:1})]),_:1}))}});const Ol=Ce(Sl,[["__scopeId","data-v-ed947913"]]),Pl={class:"pa-3"},Al={style:{"font-size":"1.6em !important"},class:"subtitle-1 ml-2"},Il={class:"d-flex justify-end"},El=j({__name:"TorrentDetail",setup(w){const a=Ct(),d=St(),{t:r}=ne(),m=Ue(),h=Fe(),p=V("overview"),s=E(()=>a.params.hash),i=E(()=>h.getTorrentByHash(s.value)),b=()=>{d.push({name:"dashboard"})};function T(P){if(m.hasActiveDialog)return!1;if(P.key==="Delete")return m.createDialog(Dt,{hashes:[s.value]}),P.preventDefault(),!0;P.key==="Escape"&&b()}return Le(()=>{document.addEventListener("keydown",T)}),Ot(()=>{document.removeEventListener("keydown",T)}),(P,g)=>(u(),$("div",Pl,[e(I,{"no-gutters":"",align:"center",justify:"center"},{default:t(()=>[e(S,null,{default:t(()=>[c("h1",Al,l(o(r)("torrentDetail.title")),1)]),_:1}),e(S,null,{default:t(()=>[c("div",Il,[e(A,{icon:"mdi-close",variant:"plain",onClick:b})])]),_:1})]),_:1}),e(I,{class:"ma-0 pa-0"},{default:t(()=>[e($t,{modelValue:p.value,"onUpdate:modelValue":g[0]||(g[0]=N=>p.value=N),"bg-color":"primary",grow:"","show-arrows":""},{default:t(()=>[e(se,{value:"overview"},{default:t(()=>[y(l(o(r)("torrentDetail.tabs.overview")),1)]),_:1}),e(se,{value:"info"},{default:t(()=>[y(l(o(r)("torrentDetail.tabs.info")),1)]),_:1}),e(se,{value:"trackers"},{default:t(()=>[y(l(o(r)("torrentDetail.tabs.trackers")),1)]),_:1}),e(se,{value:"peers"},{default:t(()=>[y(l(o(r)("torrentDetail.tabs.peers")),1)]),_:1}),e(se,{value:"content"},{default:t(()=>[y(l(o(r)("torrentDetail.tabs.content")),1)]),_:1}),e(se,{value:"tagsAndCategories"},{default:t(()=>[y(l(o(r)("torrentDetail.tabs.tagsAndCategories")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1}),i.value?(u(),F(wt,{key:0,modelValue:p.value,"onUpdate:modelValue":g[1]||(g[1]=N=>p.value=N),touch:!1},{default:t(()=>[e(ue,{value:"overview"},{default:t(()=>[e(dl,{torrent:i.value,"is-active":p.value==="overview"},null,8,["torrent","is-active"])]),_:1}),e(ue,{value:"info"},{default:t(()=>[e(Jt,{torrent:i.value,"is-active":p.value==="info"},null,8,["torrent","is-active"])]),_:1}),e(ue,{value:"trackers"},{default:t(()=>[e(Ol,{torrent:i.value,"is-active":p.value==="trackers"},null,8,["torrent","is-active"])]),_:1}),e(ue,{value:"peers"},{default:t(()=>[e(wl,{torrent:i.value,"is-active":p.value==="peers"},null,8,["torrent","is-active"])]),_:1}),e(ue,{value:"content"},{default:t(()=>[e(Kt,{torrent:i.value,"is-active":p.value==="content"},null,8,["torrent","is-active"])]),_:1}),e(ue,{value:"tagsAndCategories"},{default:t(()=>[e(Dl,{torrent:i.value,"is-active":p.value==="tagsAndCategories"},null,8,["torrent","is-active"])]),_:1})]),_:1},8,["modelValue"])):x("",!0)]))}});export{El as default};

View File

@@ -0,0 +1 @@
.gap[data-v-bb1329d2]{gap:8px}canvas[data-v-0d43f850]{height:100%;width:100%}.chipgap[data-v-0d43f850]{gap:4px}.gap[data-v-04aee0ca]{gap:8px}.cursor-help[data-v-04aee0ca]{cursor:help}.gap[data-v-ed947913]{gap:8px}.v-theme--darkTheme .tracker-disabled[data-v-ed947913]{color:#c6c6c6}.v-theme--darkTheme .tracker-not_yet_contacted[data-v-ed947913]{color:orange}.v-theme--darkTheme .tracker-working[data-v-ed947913]{color:#90ee90}.v-theme--darkTheme .tracker-not_working[data-v-ed947913]{color:#f08080}.v-theme--darkTheme .tracker-updating[data-v-ed947913]{color:#add8e6}.v-theme--lightTheme .tracker-disabled[data-v-ed947913]{color:gray}.v-theme--lightTheme .tracker-not_yet_contacted[data-v-ed947913]{color:orange}.v-theme--lightTheme .tracker-working[data-v-ed947913]{color:green}.v-theme--lightTheme .tracker-not_working[data-v-ed947913]{color:red}.v-theme--lightTheme .tracker-updating[data-v-ed947913]{color:#1e90ff}

View File

@@ -0,0 +1 @@
import{g as J,K as L,d as j,r as Q,c as K,M as X,a1 as E,a2 as A,a3 as x,m as k,W as B,Z as F,u as _,Y as tt,a8 as et,ao as st,D as nt,at as R,ad as U}from"./vue-d2584a6d.js";import{u as rt,n as ot,e as it,f as at,g as ut,h as dt,i as lt,aC as ht,aD as mt,j as ct,a as ft,k as I,l as $t,m as vt}from"./index-135ae4c1.js";import"./faker-c43f92d4.js";import{d as W}from"./dayjs.min-1969f9c6.js";const kt=J({__name:"MoveTorrentDialog",props:{guid:{},hashes:{},mode:{}},setup(H){const D=H,{isOpened:h}=rt(D.guid),{t:a}=L(),g=ot(),f=it(),b=j(),V=j(),S=j(!1),r=Q({newPath:""}),m=[o=>!!o||a("dialogs.moveTorrent.required")],M=K(()=>D.hashes.map(f.getTorrentByHash)),$=K(()=>{switch(D.mode){case"dl":return M.value[0]?.download_path;case"save":return M.value[0]?.savePath}});async function w(){await b.value?.validate(),S.value&&(await g.toggleAutoTmm(D.hashes,!1),await f.moveTorrents(D.mode,D.hashes,r.newPath),V.value?.saveValueToHistory(),y())}const y=()=>{h.value=!1};return X(()=>{r.newPath=$.value||""}),(o,l)=>(E(),A(vt,{modelValue:_(h),"onUpdate:modelValue":l[3]||(l[3]=d=>nt(h)?h.value=d:null)},{default:x(()=>[k($t,null,{default:x(()=>[k(at,null,{default:x(()=>[B(F(o.$t(`dialogs.moveTorrent.${o.mode}.title`)),1)]),_:1}),k(ut,null,{default:x(()=>[k(_(dt),{modelValue:S.value,"onUpdate:modelValue":l[1]||(l[1]=d=>S.value=d),ref_key:"form",ref:b,onSubmit:l[2]||(l[2]=tt(()=>{},["prevent"]))},{default:x(()=>[$.value?(E(),A(lt,{key:0,"model-value":$.value,disabled:"",label:o.$t("dialogs.moveTorrent.oldPath")},null,8,["model-value","label"])):et("",!0),k(ht,{modelValue:r.newPath,"onUpdate:modelValue":l[0]||(l[0]=d=>r.newPath=d),historyKey:_(mt).TORRENT_PATH,ref_key:"field",ref:V,rules:m,autofocus:"",label:o.$t("dialogs.moveTorrent.newPath"),onKeydown:st(w,["enter"])},null,8,["modelValue","historyKey","label"])]),_:1},8,["modelValue"])]),_:1}),k(ct,null,{default:x(()=>[k(ft),k(I,{color:"error",onClick:y},{default:x(()=>[B(F(o.$t("common.cancel")),1)]),_:1}),k(I,{color:"accent",disabled:!S.value,onClick:w},{default:x(()=>[B(F(o.$t("common.save")),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"]))}});var Z={exports:{}};(function(H,D){(function(h,a){H.exports=a()})(R,function(){var h,a,g=1e3,f=6e4,b=36e5,V=864e5,S=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,r=31536e6,m=2628e6,M=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,$={years:r,months:m,days:V,hours:b,minutes:f,seconds:g,milliseconds:1,weeks:6048e5},w=function(s){return s instanceof P},y=function(s,e,t){return new P(s,t,e.$l)},o=function(s){return a.p(s)+"s"},l=function(s){return s<0},d=function(s){return l(s)?Math.ceil(s):Math.floor(s)},C=function(s){return Math.abs(s)},Y=function(s,e){return s?l(s)?{negative:!0,format:""+C(s)+e}:{negative:!1,format:""+s+e}:{negative:!1,format:""}},P=function(){function s(t,n,u){var i=this;if(this.$d={},this.$l=u,t===void 0&&(this.$ms=0,this.parseFromMilliseconds()),n)return y(t*$[o(n)],this);if(typeof t=="number")return this.$ms=t,this.parseFromMilliseconds(),this;if(typeof t=="object")return Object.keys(t).forEach(function(T){i.$d[o(T)]=t[T]}),this.calMilliseconds(),this;if(typeof t=="string"){var c=t.match(M);if(c){var v=c.slice(2).map(function(T){return T!=null?Number(T):0});return this.$d.years=v[0],this.$d.months=v[1],this.$d.weeks=v[2],this.$d.days=v[3],this.$d.hours=v[4],this.$d.minutes=v[5],this.$d.seconds=v[6],this.calMilliseconds(),this}}return this}var e=s.prototype;return e.calMilliseconds=function(){var t=this;this.$ms=Object.keys(this.$d).reduce(function(n,u){return n+(t.$d[u]||0)*$[u]},0)},e.parseFromMilliseconds=function(){var t=this.$ms;this.$d.years=d(t/r),t%=r,this.$d.months=d(t/m),t%=m,this.$d.days=d(t/V),t%=V,this.$d.hours=d(t/b),t%=b,this.$d.minutes=d(t/f),t%=f,this.$d.seconds=d(t/g),t%=g,this.$d.milliseconds=t},e.toISOString=function(){var t=Y(this.$d.years,"Y"),n=Y(this.$d.months,"M"),u=+this.$d.days||0;this.$d.weeks&&(u+=7*this.$d.weeks);var i=Y(u,"D"),c=Y(this.$d.hours,"H"),v=Y(this.$d.minutes,"M"),T=this.$d.seconds||0;this.$d.milliseconds&&(T+=this.$d.milliseconds/1e3,T=Math.round(1e3*T)/1e3);var N=Y(T,"S"),z=t.negative||n.negative||i.negative||c.negative||v.negative||N.negative,G=c.format||v.format||N.format?"T":"",O=(z?"-":"")+"P"+t.format+n.format+i.format+G+c.format+v.format+N.format;return O==="P"||O==="-P"?"P0D":O},e.toJSON=function(){return this.toISOString()},e.format=function(t){var n=t||"YYYY-MM-DDTHH:mm:ss",u={Y:this.$d.years,YY:a.s(this.$d.years,2,"0"),YYYY:a.s(this.$d.years,4,"0"),M:this.$d.months,MM:a.s(this.$d.months,2,"0"),D:this.$d.days,DD:a.s(this.$d.days,2,"0"),H:this.$d.hours,HH:a.s(this.$d.hours,2,"0"),m:this.$d.minutes,mm:a.s(this.$d.minutes,2,"0"),s:this.$d.seconds,ss:a.s(this.$d.seconds,2,"0"),SSS:a.s(this.$d.milliseconds,3,"0")};return n.replace(S,function(i,c){return c||String(u[i])})},e.as=function(t){return this.$ms/$[o(t)]},e.get=function(t){var n=this.$ms,u=o(t);return u==="milliseconds"?n%=1e3:n=u==="weeks"?d(n/$[u]):this.$d[u],n||0},e.add=function(t,n,u){var i;return i=n?t*$[o(n)]:w(t)?t.$ms:y(t,this).$ms,y(this.$ms+i*(u?-1:1),this)},e.subtract=function(t,n){return this.add(t,n,!0)},e.locale=function(t){var n=this.clone();return n.$l=t,n},e.clone=function(){return y(this.$ms,this)},e.humanize=function(t){return h().add(this.$ms,"ms").locale(this.$l).fromNow(!t)},e.valueOf=function(){return this.asMilliseconds()},e.milliseconds=function(){return this.get("milliseconds")},e.asMilliseconds=function(){return this.as("milliseconds")},e.seconds=function(){return this.get("seconds")},e.asSeconds=function(){return this.as("seconds")},e.minutes=function(){return this.get("minutes")},e.asMinutes=function(){return this.as("minutes")},e.hours=function(){return this.get("hours")},e.asHours=function(){return this.as("hours")},e.days=function(){return this.get("days")},e.asDays=function(){return this.as("days")},e.weeks=function(){return this.get("weeks")},e.asWeeks=function(){return this.as("weeks")},e.months=function(){return this.get("months")},e.asMonths=function(){return this.as("months")},e.years=function(){return this.get("years")},e.asYears=function(){return this.as("years")},s}(),p=function(s,e,t){return s.add(e.years()*t,"y").add(e.months()*t,"M").add(e.days()*t,"d").add(e.hours()*t,"h").add(e.minutes()*t,"m").add(e.seconds()*t,"s").add(e.milliseconds()*t,"ms")};return function(s,e,t){h=t,a=t().$utils(),t.duration=function(i,c){var v=t.locale();return y(i,{$l:v},c)},t.isDuration=w;var n=e.prototype.add,u=e.prototype.subtract;e.prototype.add=function(i,c){return w(i)?p(this,i,1):n.bind(this)(i,c)},e.prototype.subtract=function(i,c){return w(i)?p(this,i,-1):u.bind(this)(i,c)}}})})(Z);var yt=Z.exports;const pt=U(yt);var q={exports:{}};(function(H,D){(function(h,a){H.exports=a()})(R,function(){return function(h,a,g){h=h||{};var f=a.prototype,b={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function V(r,m,M,$){return f.fromToBase(r,m,M,$)}g.en.relativeTime=b,f.fromToBase=function(r,m,M,$,w){for(var y,o,l,d=M.$locale().relativeTime||b,C=h.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],Y=C.length,P=0;P<Y;P+=1){var p=C[P];p.d&&(y=$?g(r).diff(M,p.d,!0):M.diff(r,p.d,!0));var s=(h.rounding||Math.round)(Math.abs(y));if(l=y>0,s<=p.r||!p.r){s<=1&&P>0&&(p=C[P-1]);var e=d[p.l];w&&(s=w(""+s)),o=typeof e=="string"?e.replace("%d",s):e(s,m,p.l,l);break}}if(m)return o;var t=l?d.future:d.past;return typeof t=="function"?t(o):t.replace("%s",o)},f.to=function(r,m){return V(r,m,this,!0)},f.from=function(r,m){return V(r,m,this)};var S=function(r){return r.$u?g.utc():g()};f.toNow=function(r){return this.to(S(this),r)},f.fromNow=function(r){return this.from(S(this),r)}}})})(q);var gt=q.exports;const Mt=U(gt),wt={thresholds:[{l:"s",r:1},{l:"m",r:1},{l:"mm",r:59,d:"minute"},{l:"h",r:1},{l:"hh",r:23,d:"hour"},{l:"d",r:1},{l:"dd",r:29,d:"day"},{l:"M",r:1},{l:"MM",r:11,d:"month"},{l:"y",r:1},{l:"yy",d:"year"}],rounding:Math.floor};W.extend(pt);W.extend(Mt,wt);export{kt as _};

View File

@@ -0,0 +1 @@
import{at as Q,ad as K}from"./vue-d2584a6d.js";var E={exports:{}};(function(V,X){(function(W,k){V.exports=k()})(Q,function(){var W=1e3,k=6e4,N=36e5,A="millisecond",S="second",w="minute",O="hour",M="day",T="week",m="month",U="quarter",v="year",_="date",J="Invalid Date",q=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,B=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,G={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(s){var n=["th","st","nd","rd"],t=s%100;return"["+s+(n[(t-20)%10]||n[t]||n[0])+"]"}},I=function(s,n,t){var r=String(s);return!r||r.length>=n?s:""+Array(n+1-r.length).join(t)+s},P={s:I,z:function(s){var n=-s.utcOffset(),t=Math.abs(n),r=Math.floor(t/60),e=t%60;return(n<=0?"+":"-")+I(r,2,"0")+":"+I(e,2,"0")},m:function s(n,t){if(n.date()<t.date())return-s(t,n);var r=12*(t.year()-n.year())+(t.month()-n.month()),e=n.clone().add(r,m),i=t-e<0,u=n.clone().add(r+(i?-1:1),m);return+(-(r+(t-e)/(i?e-u:u-e))||0)},a:function(s){return s<0?Math.ceil(s)||0:Math.floor(s)},p:function(s){return{M:m,y:v,w:T,d:M,D:_,h:O,m:w,s:S,ms:A,Q:U}[s]||String(s||"").toLowerCase().replace(/s$/,"")},u:function(s){return s===void 0}},x="en",D={};D[x]=G;var Z="$isDayjsObject",F=function(s){return s instanceof C||!(!s||!s[Z])},j=function s(n,t,r){var e;if(!n)return x;if(typeof n=="string"){var i=n.toLowerCase();D[i]&&(e=i),t&&(D[i]=t,e=i);var u=n.split("-");if(!e&&u.length>1)return s(u[0])}else{var o=n.name;D[o]=n,e=o}return!r&&e&&(x=e),e||!r&&x},f=function(s,n){if(F(s))return s.clone();var t=typeof n=="object"?n:{};return t.date=s,t.args=arguments,new C(t)},a=P;a.l=j,a.i=F,a.w=function(s,n){return f(s,{locale:n.$L,utc:n.$u,x:n.$x,$offset:n.$offset})};var C=function(){function s(t){this.$L=j(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[Z]=!0}var n=s.prototype;return n.parse=function(t){this.$d=function(r){var e=r.date,i=r.utc;if(e===null)return new Date(NaN);if(a.u(e))return new Date;if(e instanceof Date)return new Date(e);if(typeof e=="string"&&!/Z$/i.test(e)){var u=e.match(q);if(u){var o=u[2]-1||0,c=(u[7]||"0").substring(0,3);return i?new Date(Date.UTC(u[1],o,u[3]||1,u[4]||0,u[5]||0,u[6]||0,c)):new Date(u[1],o,u[3]||1,u[4]||0,u[5]||0,u[6]||0,c)}}return new Date(e)}(t),this.init()},n.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},n.$utils=function(){return a},n.isValid=function(){return this.$d.toString()!==J},n.isSame=function(t,r){var e=f(t);return this.startOf(r)<=e&&e<=this.endOf(r)},n.isAfter=function(t,r){return f(t)<this.startOf(r)},n.isBefore=function(t,r){return this.endOf(r)<f(t)},n.$g=function(t,r,e){return a.u(t)?this[r]:this.set(e,t)},n.unix=function(){return Math.floor(this.valueOf()/1e3)},n.valueOf=function(){return this.$d.getTime()},n.startOf=function(t,r){var e=this,i=!!a.u(r)||r,u=a.p(t),o=function(p,$){var y=a.w(e.$u?Date.UTC(e.$y,$,p):new Date(e.$y,$,p),e);return i?y:y.endOf(M)},c=function(p,$){return a.w(e.toDate()[p].apply(e.toDate("s"),(i?[0,0,0,0]:[23,59,59,999]).slice($)),e)},h=this.$W,d=this.$M,l=this.$D,b="set"+(this.$u?"UTC":"");switch(u){case v:return i?o(1,0):o(31,11);case m:return i?o(1,d):o(0,d+1);case T:var g=this.$locale().weekStart||0,Y=(h<g?h+7:h)-g;return o(i?l-Y:l+(6-Y),d);case M:case _:return c(b+"Hours",0);case O:return c(b+"Minutes",1);case w:return c(b+"Seconds",2);case S:return c(b+"Milliseconds",3);default:return this.clone()}},n.endOf=function(t){return this.startOf(t,!1)},n.$set=function(t,r){var e,i=a.p(t),u="set"+(this.$u?"UTC":""),o=(e={},e[M]=u+"Date",e[_]=u+"Date",e[m]=u+"Month",e[v]=u+"FullYear",e[O]=u+"Hours",e[w]=u+"Minutes",e[S]=u+"Seconds",e[A]=u+"Milliseconds",e)[i],c=i===M?this.$D+(r-this.$W):r;if(i===m||i===v){var h=this.clone().set(_,1);h.$d[o](c),h.init(),this.$d=h.set(_,Math.min(this.$D,h.daysInMonth())).$d}else o&&this.$d[o](c);return this.init(),this},n.set=function(t,r){return this.clone().$set(t,r)},n.get=function(t){return this[a.p(t)]()},n.add=function(t,r){var e,i=this;t=Number(t);var u=a.p(r),o=function(d){var l=f(i);return a.w(l.date(l.date()+Math.round(d*t)),i)};if(u===m)return this.set(m,this.$M+t);if(u===v)return this.set(v,this.$y+t);if(u===M)return o(1);if(u===T)return o(7);var c=(e={},e[w]=k,e[O]=N,e[S]=W,e)[u]||1,h=this.$d.getTime()+t*c;return a.w(h,this)},n.subtract=function(t,r){return this.add(-1*t,r)},n.format=function(t){var r=this,e=this.$locale();if(!this.isValid())return e.invalidDate||J;var i=t||"YYYY-MM-DDTHH:mm:ssZ",u=a.z(this),o=this.$H,c=this.$m,h=this.$M,d=e.weekdays,l=e.months,b=e.meridiem,g=function($,y,H,L){return $&&($[y]||$(r,i))||H[y].slice(0,L)},Y=function($){return a.s(o%12||12,$,"0")},p=b||function($,y,H){var L=$<12?"AM":"PM";return H?L.toLowerCase():L};return i.replace(B,function($,y){return y||function(H){switch(H){case"YY":return String(r.$y).slice(-2);case"YYYY":return a.s(r.$y,4,"0");case"M":return h+1;case"MM":return a.s(h+1,2,"0");case"MMM":return g(e.monthsShort,h,l,3);case"MMMM":return g(l,h);case"D":return r.$D;case"DD":return a.s(r.$D,2,"0");case"d":return String(r.$W);case"dd":return g(e.weekdaysMin,r.$W,d,2);case"ddd":return g(e.weekdaysShort,r.$W,d,3);case"dddd":return d[r.$W];case"H":return String(o);case"HH":return a.s(o,2,"0");case"h":return Y(1);case"hh":return Y(2);case"a":return p(o,c,!0);case"A":return p(o,c,!1);case"m":return String(c);case"mm":return a.s(c,2,"0");case"s":return String(r.$s);case"ss":return a.s(r.$s,2,"0");case"SSS":return a.s(r.$ms,3,"0");case"Z":return u}return null}($)||u.replace(":","")})},n.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},n.diff=function(t,r,e){var i,u=this,o=a.p(r),c=f(t),h=(c.utcOffset()-this.utcOffset())*k,d=this-c,l=function(){return a.m(u,c)};switch(o){case v:i=l()/12;break;case m:i=l();break;case U:i=l()/3;break;case T:i=(d-h)/6048e5;break;case M:i=(d-h)/864e5;break;case O:i=d/N;break;case w:i=d/k;break;case S:i=d/W;break;default:i=d}return e?i:a.a(i)},n.daysInMonth=function(){return this.endOf(m).$D},n.$locale=function(){return D[this.$L]},n.locale=function(t,r){if(!t)return this.$L;var e=this.clone(),i=j(t,r,!0);return i&&(e.$L=i),e},n.clone=function(){return a.w(this.$d,this)},n.toDate=function(){return new Date(this.valueOf())},n.toJSON=function(){return this.isValid()?this.toISOString():null},n.toISOString=function(){return this.$d.toISOString()},n.toString=function(){return this.$d.toUTCString()},s}(),z=C.prototype;return f.prototype=z,[["$ms",A],["$s",S],["$m",w],["$H",O],["$W",M],["$M",m],["$y",v],["$D",_]].forEach(function(s){z[s[1]]=function(n){return this.$g(n,s[0],s[1])}}),f.extend=function(s,n){return s.$i||(s(n,C,f),s.$i=!0),f},f.locale=j,f.isDayjs=F,f.unix=function(s){return f(1e3*s)},f.en=D[x],f.Ls=D,f.p={},f})})(E);var R=E.exports;const et=K(R);export{et as d};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{at as g,ad as F}from"./vue-d2584a6d.js";var M="Expected a function",S=0/0,N="[object Symbol]",W=/^\s+|\s+$/g,A=/^[-+]0x[0-9a-f]+$/i,B=/^0b[01]+$/i,R=/^0o[0-7]+$/i,_=parseInt,D=typeof g=="object"&&g&&g.Object===Object&&g,G=typeof self=="object"&&self&&self.Object===Object&&self,P=D||G||Function("return this")(),H=Object.prototype,U=H.toString,X=Math.max,q=Math.min,T=function(){return P.Date.now()};function z(e,t,i){var a,s,l,c,r,f,u=0,x=!1,d=!1,y=!0;if(typeof e!="function")throw new TypeError(M);t=E(t)||0,v(i)&&(x=!!i.leading,d="maxWait"in i,l=d?X(E(i.maxWait)||0,t):l,y="trailing"in i?!!i.trailing:y);function p(n){var o=a,m=s;return a=s=void 0,u=n,c=e.apply(m,o),c}function k(n){return u=n,r=setTimeout(b,t),x?p(n):c}function C(n){var o=n-f,m=n-u,h=t-o;return d?q(h,l-m):h}function I(n){var o=n-f,m=n-u;return f===void 0||o>=t||o<0||d&&m>=l}function b(){var n=T();if(I(n))return O(n);r=setTimeout(b,C(n))}function O(n){return r=void 0,y&&a?p(n):(a=s=void 0,c)}function L(){r!==void 0&&clearTimeout(r),u=0,a=f=s=r=void 0}function $(){return r===void 0?c:O(T())}function j(){var n=T(),o=I(n);if(a=arguments,s=this,f=n,o){if(r===void 0)return k(f);if(d)return r=setTimeout(b,t),p(f)}return r===void 0&&(r=setTimeout(b,t)),c}return j.cancel=L,j.flush=$,j}function v(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function J(e){return!!e&&typeof e=="object"}function K(e){return typeof e=="symbol"||J(e)&&U.call(e)==N}function E(e){if(typeof e=="number")return e;if(K(e))return S;if(v(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=v(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace(W,"");var i=B.test(e);return i||R.test(e)?_(e.slice(2),i?2:8):A.test(e)?S:+e}var Q=z;const Y=F(Q);export{Y as d};

View File

@@ -0,0 +1 @@
const t=[{name:"First torrent"},{name:"Second torrent"}];export{t as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
import{w as N,o as Kt,e as Zt,F as lt,i as _t,C as Xt,r as E,c as g,a as me,t as ft,b as dt,u as G,d as F,f as C,p as _,s as P,g as Jt,h as qt,j as mt,k as Qt,l as en,m as T,n as tn,q as gt,v as nn,x as rn,y as on,z as sn,A as an}from"./vue-d2584a6d.js";const un={badge:"Badge",open:"Open",close:"Close",confirmEdit:{ok:"OK",cancel:"Cancel"},dataIterator:{noResultsText:"No matching records found",loadingText:"Loading items..."},dataTable:{itemsPerPageText:"Rows per page:",ariaLabel:{sortDescending:"Sorted descending.",sortAscending:"Sorted ascending.",sortNone:"Not sorted.",activateNone:"Activate to remove sorting.",activateDescending:"Activate to sort descending.",activateAscending:"Activate to sort ascending."},sortBy:"Sort by"},dataFooter:{itemsPerPageText:"Items per page:",itemsPerPageAll:"All",nextPage:"Next page",prevPage:"Previous page",firstPage:"First page",lastPage:"Last page",pageText:"{0}-{1} of {2}"},dateRangeInput:{divider:"to"},datePicker:{itemsSelected:"{0} selected",range:{title:"Select dates",header:"Enter dates"},title:"Select date",header:"Enter date",input:{placeholder:"Enter date"}},noDataText:"No data available",carousel:{prev:"Previous visual",next:"Next visual",ariaLabel:{delimiter:"Carousel slide {0} of {1}"}},calendar:{moreEvents:"{0} more"},input:{clear:"Clear {0}",prependAction:"{0} prepended action",appendAction:"{0} appended action",otp:"Please enter OTP character {0}"},fileInput:{counter:"{0} files",counterSize:"{0} files ({1} in total)"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{root:"Pagination Navigation",next:"Next page",previous:"Previous page",page:"Go to page {0}",currentPage:"Page {0}, Current page",first:"First page",last:"Last page"}},stepper:{next:"Next",prev:"Previous"},rating:{ariaLabel:{item:"Rating {0} of {1}"}},loading:"Loading...",infiniteScroll:{loadMore:"Load more",empty:"No more"}},cn={af:!1,ar:!0,bg:!1,ca:!1,ckb:!1,cs:!1,de:!1,el:!1,en:!1,es:!1,et:!1,fa:!0,fi:!1,fr:!1,hr:!1,hu:!1,he:!0,id:!1,it:!1,ja:!1,ko:!1,lv:!1,lt:!1,nl:!1,no:!1,pl:!1,pt:!1,ro:!1,ru:!1,sk:!1,sl:!1,srCyrl:!1,srLatn:!1,sv:!1,th:!1,tr:!1,az:!1,uk:!1,vi:!1,zhHans:!1,zhHant:!1};function ln(e,t){let n;function r(){n=Zt(),n.run(()=>t.length?t(()=>{n?.stop(),r()}):t())}N(e,o=>{o&&!n?r():o||(n?.stop(),n=void 0)},{immediate:!0}),Kt(()=>{n?.stop()})}const D=typeof window<"u",Jr=D&&"IntersectionObserver"in window,fn=D&&("ontouchstart"in window||window.navigator.maxTouchPoints>0),qr=D&&"EyeDropper"in window;function Re(e,t,n){dn(e,t),t.set(e,n)}function dn(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function mn(e,t,n){var r=ht(e,t,"set");return gn(e,r,n),n}function gn(e,t,n){if(t.set)t.set.call(e,n);else{if(!t.writable)throw new TypeError("attempted to set read only private field");t.value=n}}function I(e,t){var n=ht(e,t,"get");return hn(e,n)}function ht(e,t,n){if(!t.has(e))throw new TypeError("attempted to "+n+" private field on non-instance");return t.get(e)}function hn(e,t){return t.get?t.get.call(e):t.value}function pt(e,t,n){const r=t.length-1;if(r<0)return e===void 0?n:e;for(let o=0;o<r;o++){if(e==null)return n;e=e[t[o]]}return e==null||e[t[r]]===void 0?n:e[t[r]]}function pn(e,t){if(e===t)return!0;if(e instanceof Date&&t instanceof Date&&e.getTime()!==t.getTime()||e!==Object(e)||t!==Object(t))return!1;const n=Object.keys(e);return n.length!==Object.keys(t).length?!1:n.every(r=>pn(e[r],t[r]))}function we(e,t,n){return e==null||!t||typeof t!="string"?n:e[t]!==void 0?e[t]:(t=t.replace(/\[(\w+)\]/g,".$1"),t=t.replace(/^\./,""),pt(e,t.split("."),n))}function Qr(e,t,n){if(t===!0)return e===void 0?n:e;if(t==null||typeof t=="boolean")return n;if(e!==Object(e)){if(typeof t!="function")return n;const o=t(e,n);return typeof o>"u"?n:o}if(typeof t=="string")return we(e,t,n);if(Array.isArray(t))return pt(e,t,n);if(typeof t!="function")return n;const r=t(e,n);return typeof r>"u"?n:r}function yt(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return Array.from({length:e},(n,r)=>t+r)}function ne(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"px";if(!(e==null||e===""))return isNaN(+e)?String(e):isFinite(+e)?`${Number(e)}${t}`:void 0}function Le(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ne(e){if(e&&"$el"in e){const t=e.$el;return t?.nodeType===Node.TEXT_NODE?t.nextElementSibling:t}return e}const eo=Object.freeze({enter:13,tab:9,delete:46,esc:27,space:32,up:38,down:40,left:37,right:39,end:35,home:36,del:46,backspace:8,insert:45,pageup:33,pagedown:34,shift:16}),to=Object.freeze({enter:"Enter",tab:"Tab",delete:"Delete",esc:"Escape",space:"Space",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",end:"End",home:"Home",del:"Delete",backspace:"Backspace",insert:"Insert",pageup:"PageUp",pagedown:"PageDown",shift:"Shift"});function no(e){return Object.keys(e)}function ve(e,t){return t.every(n=>e.hasOwnProperty(n))}function yn(e,t){const n={},r=new Set(Object.keys(e));for(const o of t)r.has(o)&&(n[o]=e[o]);return n}function Be(e,t,n){const r=Object.create(null),o=Object.create(null);for(const s in e)t.some(a=>a instanceof RegExp?a.test(s):a===s)&&!n?.some(a=>a===s)?r[s]=e[s]:o[s]=e[s];return[r,o]}function vn(e,t){const n={...e};return t.forEach(r=>delete n[r]),n}function ro(e,t){const n={};return t.forEach(r=>n[r]=e[r]),n}const vt=/^on[^a-z]/,Fe=e=>vt.test(e),bn=["onAfterscriptexecute","onAnimationcancel","onAnimationend","onAnimationiteration","onAnimationstart","onAuxclick","onBeforeinput","onBeforescriptexecute","onChange","onClick","onCompositionend","onCompositionstart","onCompositionupdate","onContextmenu","onCopy","onCut","onDblclick","onFocusin","onFocusout","onFullscreenchange","onFullscreenerror","onGesturechange","onGestureend","onGesturestart","onGotpointercapture","onInput","onKeydown","onKeypress","onKeyup","onLostpointercapture","onMousedown","onMousemove","onMouseout","onMouseover","onMouseup","onMousewheel","onPaste","onPointercancel","onPointerdown","onPointerenter","onPointerleave","onPointermove","onPointerout","onPointerover","onPointerup","onReset","onSelect","onSubmit","onTouchcancel","onTouchend","onTouchmove","onTouchstart","onTransitioncancel","onTransitionend","onTransitionrun","onTransitionstart","onWheel"],wn=["ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Enter","Escape","Tab"," "];function oo(e){return e.isComposing&&wn.includes(e.key)}function so(e){const[t,n]=Be(e,[vt]),r=vn(t,bn),[o,s]=Be(n,["class","style","id",/^data-/]);return Object.assign(o,t),Object.assign(s,r),[o,s]}function ao(e){return e==null?[]:Array.isArray(e)?e:[e]}function io(e,t){let n=0;const r=function(){for(var o=arguments.length,s=new Array(o),a=0;a<o;a++)s[a]=arguments[a];clearTimeout(n),n=setTimeout(()=>e(...s),G(t))};return r.clear=()=>{clearTimeout(n)},r.immediate=e,r}function Sn(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1;return Math.max(t,Math.min(n,e))}function uo(e){const t=e.toString().trim();return t.includes(".")?t.length-t.indexOf(".")-1:0}function Ve(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"0";return e+n.repeat(Math.max(0,t-e.length))}function Ye(e,t){return(arguments.length>2&&arguments[2]!==void 0?arguments[2]:"0").repeat(Math.max(0,t-e.length))+e}function Dn(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;const n=[];let r=0;for(;r<e.length;)n.push(e.substr(r,t)),r+=t;return n}function co(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1e3;if(e<t)return`${e} B`;const n=t===1024?["Ki","Mi","Gi"]:["k","M","G"];let r=-1;for(;Math.abs(e)>=t&&r<n.length-1;)e/=t,++r;return`${e.toFixed(1)} ${n[r]}B`}function A(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;const r={};for(const o in e)r[o]=e[o];for(const o in t){const s=e[o],a=t[o];if(Le(s)&&Le(a)){r[o]=A(s,a,n);continue}if(Array.isArray(s)&&Array.isArray(a)&&n){r[o]=n(s,a);continue}r[o]=a}return r}function xn(e){return e.map(t=>t.type===lt?xn(t.children):t).flat()}function L(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";if(L.cache.has(e))return L.cache.get(e);const t=e.replace(/[^a-z]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase();return L.cache.set(e,t),t}L.cache=new Map;function ie(e,t){if(!t||typeof t!="object")return[];if(Array.isArray(t))return t.map(n=>ie(e,n)).flat(1);if(Array.isArray(t.children))return t.children.map(n=>ie(e,n)).flat(1);if(t.component){if(Object.getOwnPropertySymbols(t.component.provides).includes(e))return[t.component];if(t.component.subTree)return ie(e,t.component.subTree).flat(1)}return[]}var re=new WeakMap,W=new WeakMap;class lo{constructor(t){Re(this,re,{writable:!0,value:[]}),Re(this,W,{writable:!0,value:0}),this.size=t}push(t){I(this,re)[I(this,W)]=t,mn(this,W,(I(this,W)+1)%this.size)}values(){return I(this,re).slice(I(this,W)).concat(I(this,re).slice(0,I(this,W)))}}function fo(e){return"touches"in e?{clientX:e.touches[0].clientX,clientY:e.touches[0].clientY}:{clientX:e.clientX,clientY:e.clientY}}function mo(e){const t=E({}),n=g(e);return me(()=>{for(const r in n.value)t[r]=n.value[r]},{flush:"sync"}),ft(t)}function Se(e,t){return e.includes(t)}function bt(e){return e[2].toLowerCase()+e.slice(3)}const go=()=>[Function,Array];function ho(e,t){return t="on"+dt(t),!!(e[t]||e[`${t}Once`]||e[`${t}Capture`]||e[`${t}OnceCapture`]||e[`${t}CaptureOnce`])}function po(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(Array.isArray(e))for(const o of e)o(...n);else typeof e=="function"&&e(...n)}function An(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;const n=["button","[href]",'input:not([type="hidden"])',"select","textarea","[tabindex]"].map(r=>`${r}${t?':not([tabindex="-1"])':""}:not([disabled])`).join(", ");return[...e.querySelectorAll(n)]}function Cn(e,t,n){let r,o=e.indexOf(document.activeElement);const s=t==="next"?1:-1;do o+=s,r=e[o];while((!r||r.offsetParent==null||!(n?.(r)??!0))&&o<e.length&&o>=0);return r}function Mn(e,t){const n=An(e);if(!t)(e===document.activeElement||!e.contains(document.activeElement))&&n[0]?.focus();else if(t==="first")n[0]?.focus();else if(t==="last")n.at(-1)?.focus();else if(typeof t=="number")n[t]?.focus();else{const r=Cn(n,t);r?r.focus():Mn(e,t==="next"?"first":"last")}}function yo(e){return e==null||typeof e=="string"&&e.trim()===""}function vo(){}function bo(e,t){if(!(D&&typeof CSS<"u"&&typeof CSS.supports<"u"&&CSS.supports(`selector(${t})`)))return null;try{return!!e&&e.matches(t)}catch{return null}}function Fn(e){return e.some(t=>_t(t)?t.type===Xt?!1:t.type!==lt||Fn(t.children):!0)?e:null}const wt=["top","bottom"],On=["start","end","left","right"];function wo(e,t){let[n,r]=e.split(" ");return r||(r=Se(wt,n)?"start":Se(On,n)?"top":"center"),{side:He(n,t),align:He(r,t)}}function He(e,t){return e==="start"?t?"right":"left":e==="end"?t?"left":"right":e}function So(e){return{side:{center:"center",top:"bottom",bottom:"top",left:"right",right:"left"}[e.side],align:e.align}}function Do(e){return{side:e.side,align:{center:"center",top:"bottom",bottom:"top",left:"right",right:"left"}[e.align]}}function xo(e){return{side:e.align,align:e.side}}function Ao(e){return Se(wt,e.side)?"y":"x"}class ue{constructor(t){let{x:n,y:r,width:o,height:s}=t;this.x=n,this.y=r,this.width=o,this.height=s}get top(){return this.y}get bottom(){return this.y+this.height}get left(){return this.x}get right(){return this.x+this.width}}function Co(e,t){return{x:{before:Math.max(0,t.left-e.left),after:Math.max(0,e.right-t.right)},y:{before:Math.max(0,t.top-e.top),after:Math.max(0,e.bottom-t.bottom)}}}function Mo(e){return Array.isArray(e)?new ue({x:e[0],y:e[1],width:0,height:0}):e.getBoundingClientRect()}function Fo(e){const t=e.getBoundingClientRect(),n=getComputedStyle(e),r=n.transform;if(r){let o,s,a,i,c;if(r.startsWith("matrix3d("))o=r.slice(9,-1).split(/, /),s=+o[0],a=+o[5],i=+o[12],c=+o[13];else if(r.startsWith("matrix("))o=r.slice(7,-1).split(/, /),s=+o[0],a=+o[3],i=+o[4],c=+o[5];else return new ue(t);const u=n.transformOrigin,f=t.x-i-(1-s)*parseFloat(u),d=t.y-c-(1-a)*parseFloat(u.slice(u.indexOf(" ")+1)),m=s?t.width/s:e.offsetWidth+1,p=a?t.height/a:e.offsetHeight+1;return new ue({x:f,y:d,width:m,height:p})}else return new ue(t)}function Oo(e,t,n){if(typeof e.animate>"u")return{finished:Promise.resolve()};let r;try{r=e.animate(t,n)}catch{return{finished:Promise.resolve()}}return typeof r.finished>"u"&&(r.finished=new Promise(o=>{r.onfinish=()=>{o(r)}})),r}const ce=new WeakMap;function Eo(e,t){Object.keys(t).forEach(n=>{if(Fe(n)){const r=bt(n),o=ce.get(e);if(t[n]==null)o?.forEach(s=>{const[a,i]=s;a===r&&(e.removeEventListener(r,i),o.delete(s))});else if(!o||![...o].some(s=>s[0]===r&&s[1]===t[n])){e.addEventListener(r,t[n]);const s=o||new Set;s.add([r,t[n]]),ce.has(e)||ce.set(e,s)}}else t[n]==null?e.removeAttribute(n):e.setAttribute(n,t[n])})}function To(e,t){Object.keys(t).forEach(n=>{if(Fe(n)){const r=bt(n),o=ce.get(e);o?.forEach(s=>{const[a,i]=s;a===r&&(e.removeEventListener(r,i),o.delete(s))})}else e.removeAttribute(n)})}const z=2.4,je=.2126729,We=.7151522,ze=.072175,En=.55,Tn=.58,kn=.57,Pn=.62,oe=.03,Ue=1.45,$n=5e-4,In=1.25,Rn=1.25,Ge=.078,Ke=12.82051282051282,se=.06,Ze=.001;function _e(e,t){const n=(e.r/255)**z,r=(e.g/255)**z,o=(e.b/255)**z,s=(t.r/255)**z,a=(t.g/255)**z,i=(t.b/255)**z;let c=n*je+r*We+o*ze,u=s*je+a*We+i*ze;if(c<=oe&&(c+=(oe-c)**Ue),u<=oe&&(u+=(oe-u)**Ue),Math.abs(u-c)<$n)return 0;let f;if(u>c){const d=(u**En-c**Tn)*In;f=d<Ze?0:d<Ge?d-d*Ke*se:d-se}else{const d=(u**Pn-c**kn)*Rn;f=d>-Ze?0:d>-Ge?d-d*Ke*se:d+se}return f*100}function ko(e){}function Po(e,t){t=Array.isArray(t)?t.slice(0,-1).map(n=>`'${n}'`).join(", ")+` or '${t.at(-1)}'`:`'${t}'`}const fe=.20689655172413793,Ln=e=>e>fe**3?Math.cbrt(e):e/(3*fe**2)+4/29,Nn=e=>e>fe?e**3:3*fe**2*(e-4/29);function St(e){const t=Ln,n=t(e[1]);return[116*n-16,500*(t(e[0]/.95047)-n),200*(n-t(e[2]/1.08883))]}function Dt(e){const t=Nn,n=(e[0]+16)/116;return[t(n+e[1]/500)*.95047,t(n),t(n-e[2]/200)*1.08883]}const Bn=[[3.2406,-1.5372,-.4986],[-.9689,1.8758,.0415],[.0557,-.204,1.057]],Vn=e=>e<=.0031308?e*12.92:1.055*e**(1/2.4)-.055,Yn=[[.4124,.3576,.1805],[.2126,.7152,.0722],[.0193,.1192,.9505]],Hn=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function xt(e){const t=Array(3),n=Vn,r=Bn;for(let o=0;o<3;++o)t[o]=Math.round(Sn(n(r[o][0]*e[0]+r[o][1]*e[1]+r[o][2]*e[2]))*255);return{r:t[0],g:t[1],b:t[2]}}function Oe(e){let{r:t,g:n,b:r}=e;const o=[0,0,0],s=Hn,a=Yn;t=s(t/255),n=s(n/255),r=s(r/255);for(let i=0;i<3;++i)o[i]=a[i][0]*t+a[i][1]*n+a[i][2]*r;return o}function jn(e){return!!e&&/^(#|var\(--|(rgb|hsl)a?\()/.test(e)}function $o(e){return jn(e)&&!/^((rgb|hsl)a?\()?var\(--/.test(e)}const Xe=/^(?<fn>(?:rgb|hsl)a?)\((?<values>.+)\)/,Wn={rgb:(e,t,n,r)=>({r:e,g:t,b:n,a:r}),rgba:(e,t,n,r)=>({r:e,g:t,b:n,a:r}),hsl:(e,t,n,r)=>Je({h:e,s:t,l:n,a:r}),hsla:(e,t,n,r)=>Je({h:e,s:t,l:n,a:r}),hsv:(e,t,n,r)=>B({h:e,s:t,v:n,a:r}),hsva:(e,t,n,r)=>B({h:e,s:t,v:n,a:r})};function k(e){if(typeof e=="number")return{r:(e&16711680)>>16,g:(e&65280)>>8,b:e&255};if(typeof e=="string"&&Xe.test(e)){const{groups:t}=e.match(Xe),{fn:n,values:r}=t,o=r.split(/,\s*/).map(s=>s.endsWith("%")&&["hsl","hsla","hsv","hsva"].includes(n)?parseFloat(s)/100:parseFloat(s));return Wn[n](...o)}else if(typeof e=="string"){let t=e.startsWith("#")?e.slice(1):e;return[3,4].includes(t.length)?t=t.split("").map(n=>n+n).join(""):[6,8].includes(t.length),Mt(t)}else if(typeof e=="object"){if(ve(e,["r","g","b"]))return e;if(ve(e,["h","s","l"]))return B(At(e));if(ve(e,["h","s","v"]))return B(e)}throw new TypeError(`Invalid color: ${e==null?e:String(e)||e.constructor.name}
Expected #hex, #hexa, rgb(), rgba(), hsl(), hsla(), object or number`)}function B(e){const{h:t,s:n,v:r,a:o}=e,s=i=>{const c=(i+t/60)%6;return r-r*n*Math.max(Math.min(c,4-c,1),0)},a=[s(5),s(3),s(1)].map(i=>Math.round(i*255));return{r:a[0],g:a[1],b:a[2],a:o}}function Je(e){return B(At(e))}function zn(e){if(!e)return{h:0,s:1,v:1,a:1};const t=e.r/255,n=e.g/255,r=e.b/255,o=Math.max(t,n,r),s=Math.min(t,n,r);let a=0;o!==s&&(o===t?a=60*(0+(n-r)/(o-s)):o===n?a=60*(2+(r-t)/(o-s)):o===r&&(a=60*(4+(t-n)/(o-s)))),a<0&&(a=a+360);const i=o===0?0:(o-s)/o,c=[a,i,o];return{h:c[0],s:c[1],v:c[2],a:e.a}}function Io(e){const{h:t,s:n,v:r,a:o}=e,s=r-r*n/2,a=s===1||s===0?0:(r-s)/Math.min(s,1-s);return{h:t,s:a,l:s,a:o}}function At(e){const{h:t,s:n,l:r,a:o}=e,s=r+n*Math.min(r,1-r),a=s===0?0:2-2*r/s;return{h:t,s:a,v:s,a:o}}function Un(e){let{r:t,g:n,b:r,a:o}=e;return o===void 0?`rgb(${t}, ${n}, ${r})`:`rgba(${t}, ${n}, ${r}, ${o})`}function Ro(e){return Un(B(e))}function ae(e){const t=Math.round(e).toString(16);return("00".substr(0,2-t.length)+t).toUpperCase()}function Ct(e){let{r:t,g:n,b:r,a:o}=e;return`#${[ae(t),ae(n),ae(r),o!==void 0?ae(Math.round(o*255)):""].join("")}`}function Mt(e){e=Gn(e);let[t,n,r,o]=Dn(e,2).map(s=>parseInt(s,16));return o=o===void 0?o:o/255,{r:t,g:n,b:r,a:o}}function Lo(e){const t=Mt(e);return zn(t)}function No(e){return Ct(B(e))}function Gn(e){return e.startsWith("#")&&(e=e.slice(1)),e=e.replace(/([^0-9a-f])/gi,"F"),(e.length===3||e.length===4)&&(e=e.split("").map(t=>t+t).join("")),e.length!==6&&(e=Ve(Ve(e,6),8,"F")),e}function Kn(e,t){const n=St(Oe(e));return n[0]=n[0]+t*10,xt(Dt(n))}function Zn(e,t){const n=St(Oe(e));return n[0]=n[0]-t*10,xt(Dt(n))}function De(e){const t=k(e);return Oe(t)[1]}function Bo(e,t){const n=De(e),r=De(t),o=Math.max(n,r),s=Math.min(n,r);return(o+.05)/(s+.05)}function _n(e){const t=Math.abs(_e(k(0),k(e)));return Math.abs(_e(k(16777215),k(e)))>Math.min(t,50)?"#fff":"#000"}function V(e,t){return n=>Object.keys(e).reduce((r,o)=>{const a=typeof e[o]=="object"&&e[o]!=null&&!Array.isArray(e[o])?e[o]:{type:e[o]};return n&&o in n?r[o]={...a,default:n[o]}:r[o]=a,t&&!r[o].source&&(r[o].source=t),r},{})}const Xn=V({class:[String,Array],style:{type:[String,Array,Object],default:null}},"component"),K=Symbol.for("vuetify:defaults");function Jn(e){return F(e)}function Ee(){const e=C(K);if(!e)throw new Error("[Vuetify] Could not find defaults instance");return e}function Vo(e,t){const n=Ee(),r=F(e),o=g(()=>{if(G(t?.disabled))return n.value;const a=G(t?.scoped),i=G(t?.reset),c=G(t?.root);if(r.value==null&&!(a||i||c))return n.value;let u=A(r.value,{prev:n.value});if(a)return u;if(i||c){const f=Number(i||1/0);for(let d=0;d<=f&&!(!u||!("prev"in u));d++)u=u.prev;return u&&typeof c=="string"&&c in u&&(u=A(A(u,{prev:u}),u[c])),u}return u.prev?A(u.prev,u):u});return _(K,o),o}function qn(e,t){return typeof e.props?.[t]<"u"||typeof e.props?.[L(t)]<"u"}function Qn(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Ee();const r=O("useDefaults");if(t=t??r.type.name??r.type.__name,!t)throw new Error("[Vuetify] Could not determine component name");const o=g(()=>n.value?.[e._as??t]),s=new Proxy(e,{get(c,u){const f=Reflect.get(c,u);return u==="class"||u==="style"?[o.value?.[u],f].filter(d=>d!=null):typeof u=="string"&&!qn(r.vnode,u)?o.value?.[u]??n.value?.global?.[u]??f:f}}),a=P();me(()=>{if(o.value){const c=Object.entries(o.value).filter(u=>{let[f]=u;return f.startsWith(f[0].toUpperCase())});a.value=c.length?Object.fromEntries(c):void 0}else a.value=void 0});function i(){const c=nr(K,r);_(K,g(()=>a.value?A(c?.value??{},a.value):c?.value))}return{props:s,provideSubDefaults:i}}function te(e){if(e._setup=e._setup??e.setup,!e.name)return e;if(e._setup){e.props=V(e.props??{},e.name)();const t=Object.keys(e.props).filter(n=>n!=="class"&&n!=="style");e.filterProps=function(r){return yn(r,t)},e.props._as=String,e.setup=function(r,o){const s=Ee();if(!s.value)return e._setup(r,o);const{props:a,provideSubDefaults:i}=Qn(r,r._as??e.name,s),c=e._setup(a,o);return i(),c}}return e}function Ft(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return t=>(e?te:Jt)(t)}function Yo(e,t){return t.props=e,t}function Ho(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"div",n=arguments.length>2?arguments[2]:void 0;return Ft()({name:n??dt(qt(e.replace(/__/g,"-"))),props:{tag:{type:String,default:t},...Xn()},setup(r,o){let{slots:s}=o;return()=>mt(r.tag,{class:[e,r.class],style:r.style},s.default?.())}})}function jo(e){if(typeof e.getRootNode!="function"){for(;e.parentNode;)e=e.parentNode;return e!==document?null:document}const t=e.getRootNode();return t!==document&&t.getRootNode({composed:!0})!==document?null:t}const Wo="cubic-bezier(0.4, 0, 0.2, 1)",zo="cubic-bezier(0.0, 0, 0.2, 1)",Uo="cubic-bezier(0.4, 0, 1, 1)";function Go(e,t,n){return Object.keys(e).filter(r=>Fe(r)&&r.endsWith(t)).reduce((r,o)=>(r[o.slice(0,-t.length)]=s=>e[o](s,n(s)),r),{})}function O(e,t){const n=Qt();if(!n)throw new Error(`[Vuetify] ${e} ${t||"must be called from inside a setup function"}`);return n}function er(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"composables";const t=O(e).type;return L(t?.aliasName||t?.name)}let Ot=0,le=new WeakMap;function Te(){const e=O("getUid");if(le.has(e))return le.get(e);{const t=Ot++;return le.set(e,t),t}}Te.reset=()=>{Ot=0,le=new WeakMap};function Ko(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;for(;e;){if(t?tr(e):Et(e))return e;e=e.parentElement}return document.scrollingElement}function Zo(e,t){const n=[];if(t&&e&&!t.contains(e))return n;for(;e&&(Et(e)&&n.push(e),e!==t);)e=e.parentElement;return n}function Et(e){if(!e||e.nodeType!==Node.ELEMENT_NODE)return!1;const t=window.getComputedStyle(e);return t.overflowY==="scroll"||t.overflowY==="auto"&&e.scrollHeight>e.clientHeight}function tr(e){if(!e||e.nodeType!==Node.ELEMENT_NODE)return!1;const t=window.getComputedStyle(e);return["scroll","auto"].includes(t.overflowY)}function nr(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:O("injectSelf");const{provides:n}=t;if(n&&e in n)return n[e]}function _o(e){for(;e;){if(window.getComputedStyle(e).position==="fixed")return!0;e=e.offsetParent}return!1}function Xo(e){const t=O("useRender");t.render=e}function rr(e,t,n){let r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:d=>d,o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:d=>d;const s=O("useProxiedModel"),a=F(e[t]!==void 0?e[t]:n),i=L(t),u=i!==t?g(()=>(e[t],!!((s.vnode.props?.hasOwnProperty(t)||s.vnode.props?.hasOwnProperty(i))&&(s.vnode.props?.hasOwnProperty(`onUpdate:${t}`)||s.vnode.props?.hasOwnProperty(`onUpdate:${i}`))))):g(()=>(e[t],!!(s.vnode.props?.hasOwnProperty(t)&&s.vnode.props?.hasOwnProperty(`onUpdate:${t}`))));ln(()=>!u.value,()=>{N(()=>e[t],d=>{a.value=d})});const f=g({get(){const d=e[t];return r(u.value?d:a.value)},set(d){const m=o(d),p=en(u.value?e[t]:a.value);p===m||r(p)===d||(a.value=m,s?.emit(`update:${t}`,m))}});return Object.defineProperty(f,"externalValue",{get:()=>u.value?e[t]:a.value}),f}const qe="$vuetify.",Qe=(e,t)=>e.replace(/\{(\d+)\}/g,(n,r)=>String(t[+r])),Tt=(e,t,n)=>function(r){for(var o=arguments.length,s=new Array(o>1?o-1:0),a=1;a<o;a++)s[a-1]=arguments[a];if(!r.startsWith(qe))return Qe(r,s);const i=r.replace(qe,""),c=e.value&&n.value[e.value],u=t.value&&n.value[t.value];let f=we(c,i,null);return f||(`${r}${e.value}`,f=we(u,i,null)),f||(f=r),typeof f!="string"&&(f=r),Qe(f,s)};function kt(e,t){return(n,r)=>new Intl.NumberFormat([e.value,t.value],r).format(n)}function be(e,t,n){const r=rr(e,t,e[t]??n.value);return r.value=e[t]??n.value,N(n,o=>{e[t]==null&&(r.value=n.value)}),r}function Pt(e){return t=>{const n=be(t,"locale",e.current),r=be(t,"fallback",e.fallback),o=be(t,"messages",e.messages);return{name:"vuetify",current:n,fallback:r,messages:o,t:Tt(n,r,o),n:kt(n,r),provide:Pt({current:n,fallback:r,messages:o})}}}function or(e){const t=P(e?.locale??"en"),n=P(e?.fallback??"en"),r=F({en:un,...e?.messages});return{name:"vuetify",current:t,fallback:n,messages:r,t:Tt(t,n,r),n:kt(t,n),provide:Pt({current:t,fallback:n,messages:r})}}const Z=Symbol.for("vuetify:locale");function sr(e){return e.name!=null}function ar(e){const t=e?.adapter&&sr(e?.adapter)?e?.adapter:or(e),n=ur(t,e);return{...t,...n}}function ir(){const e=C(Z);if(!e)throw new Error("[Vuetify] Could not find injected locale instance");return e}function Jo(e){const t=C(Z);if(!t)throw new Error("[Vuetify] Could not find injected locale instance");const n=t.provide(e),r=cr(n,t.rtl,e),o={...n,...r};return _(Z,o),o}function ur(e,t){const n=F(t?.rtl??cn),r=g(()=>n.value[e.current.value]??!1);return{isRtl:r,rtl:n,rtlClasses:g(()=>`v-locale--is-${r.value?"rtl":"ltr"}`)}}function cr(e,t,n){const r=g(()=>n.rtl??t.value[e.current.value]??!1);return{isRtl:r,rtl:t,rtlClasses:g(()=>`v-locale--is-${r.value?"rtl":"ltr"}`)}}function qo(){const e=C(Z);if(!e)throw new Error("[Vuetify] Could not find injected rtl instance");return{isRtl:e.isRtl,rtlClasses:e.rtlClasses}}const xe={"001":1,AD:1,AE:6,AF:6,AG:0,AI:1,AL:1,AM:1,AN:1,AR:1,AS:0,AT:1,AU:1,AX:1,AZ:1,BA:1,BD:0,BE:1,BG:1,BH:6,BM:1,BN:1,BR:0,BS:0,BT:0,BW:0,BY:1,BZ:0,CA:0,CH:1,CL:1,CM:1,CN:1,CO:0,CR:1,CY:1,CZ:1,DE:1,DJ:6,DK:1,DM:0,DO:0,DZ:6,EC:1,EE:1,EG:6,ES:1,ET:0,FI:1,FJ:1,FO:1,FR:1,GB:1,"GB-alt-variant":0,GE:1,GF:1,GP:1,GR:1,GT:0,GU:0,HK:0,HN:0,HR:1,HU:1,ID:0,IE:1,IL:0,IN:0,IQ:6,IR:6,IS:1,IT:1,JM:0,JO:6,JP:0,KE:0,KG:1,KH:0,KR:0,KW:6,KZ:1,LA:0,LB:1,LI:1,LK:1,LT:1,LU:1,LV:1,LY:6,MC:1,MD:1,ME:1,MH:0,MK:1,MM:0,MN:1,MO:0,MQ:1,MT:0,MV:5,MX:0,MY:1,MZ:0,NI:0,NL:1,NO:1,NP:0,NZ:1,OM:6,PA:0,PE:0,PH:0,PK:0,PL:1,PR:0,PT:0,PY:0,QA:6,RE:1,RO:1,RS:1,RU:1,SA:0,SD:6,SE:1,SG:0,SI:1,SK:1,SM:1,SV:0,SY:6,TH:0,TJ:1,TM:1,TR:1,TT:0,TW:0,UA:1,UM:0,US:0,UY:1,UZ:1,VA:1,VE:0,VI:0,VN:1,WS:0,XK:1,YE:0,ZA:0,ZW:0};function lr(e,t){const n=[];let r=[];const o=$t(e),s=It(e),a=(o.getDay()-xe[t.slice(-2).toUpperCase()]+7)%7,i=(s.getDay()-xe[t.slice(-2).toUpperCase()]+7)%7;for(let c=0;c<a;c++){const u=new Date(o);u.setDate(u.getDate()-(a-c)),r.push(u)}for(let c=1;c<=s.getDate();c++){const u=new Date(e.getFullYear(),e.getMonth(),c);r.push(u),r.length===7&&(n.push(r),r=[])}for(let c=1;c<7-i;c++){const u=new Date(s);u.setDate(u.getDate()+c),r.push(u)}return r.length>0&&n.push(r),n}function $t(e){return new Date(e.getFullYear(),e.getMonth(),1)}function It(e){return new Date(e.getFullYear(),e.getMonth()+1,0)}function fr(e){const t=e.split("-").map(Number);return new Date(t[0],t[1]-1,t[2])}const dr=/^([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))$/;function Rt(e){if(e==null)return new Date;if(e instanceof Date)return e;if(typeof e=="string"){let t;if(dr.test(e))return fr(e);if(t=Date.parse(e),!isNaN(t))return new Date(t)}return null}const et=new Date(2e3,0,2);function mr(e){const t=xe[e.slice(-2).toUpperCase()];return yt(7).map(n=>{const r=new Date(et);return r.setDate(et.getDate()+t+n),new Intl.DateTimeFormat(e,{weekday:"narrow"}).format(r)})}function gr(e,t,n,r){const o=Rt(e)??new Date,s=r?.[t];if(typeof s=="function")return s(o,t,n);let a={};switch(t){case"fullDateWithWeekday":a={weekday:"long",day:"numeric",month:"long",year:"numeric"};break;case"normalDateWithWeekday":a={weekday:"short",day:"numeric",month:"short"};break;case"keyboardDate":a={day:"2-digit",month:"2-digit",year:"numeric"};break;case"monthAndDate":a={month:"long",day:"numeric"};break;case"monthAndYear":a={month:"long",year:"numeric"};break;case"month":a={month:"long"};break;case"monthShort":a={month:"short"};break;case"dayOfMonth":a={day:"numeric"};break;case"shortDate":a={year:"2-digit",month:"numeric",day:"numeric"};break;case"year":a={year:"numeric"};break;default:a=s??{timeZone:"UTC",timeZoneName:"short"}}return new Intl.DateTimeFormat(n,a).format(o)}function hr(e,t){const n=e.toJsDate(t),r=n.getFullYear(),o=Ye(String(n.getMonth()+1),2,"0"),s=Ye(String(n.getDate()),2,"0");return`${r}-${o}-${s}`}function pr(e){const[t,n,r]=e.split("-").map(Number);return new Date(t,n-1,r)}function yr(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function vr(e,t){const n=new Date(e);return n.setMonth(n.getMonth()+t),n}function br(e){return e.getFullYear()}function wr(e){return e.getMonth()}function Sr(e){return new Date(e.getFullYear(),e.getMonth()+1,1)}function Dr(e){return new Date(e.getFullYear(),0,1)}function xr(e){return new Date(e.getFullYear(),11,31)}function Ar(e,t){return Ae(e,t[0])&&Mr(e,t[1])}function Cr(e){const t=new Date(e);return t instanceof Date&&!isNaN(t.getTime())}function Ae(e,t){return e.getTime()>t.getTime()}function Mr(e,t){return e.getTime()<t.getTime()}function tt(e,t){return e.getTime()===t.getTime()}function Fr(e,t){return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}function Or(e,t){return e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}function Er(e,t,n){const r=new Date(e),o=new Date(t);return n==="month"?r.getMonth()-o.getMonth()+(r.getFullYear()-o.getFullYear())*12:Math.floor((r.getTime()-o.getTime())/(1e3*60*60*24))}function Tr(e,t){const n=new Date(e);return n.setMonth(t),n}function kr(e,t){const n=new Date(e);return n.setFullYear(t),n}function Pr(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function $r(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999)}class Ir{constructor(t){this.locale=t.locale,this.formats=t.formats}date(t){return Rt(t)}toJsDate(t){return t}toISO(t){return hr(this,t)}parseISO(t){return pr(t)}addDays(t,n){return yr(t,n)}addMonths(t,n){return vr(t,n)}getWeekArray(t){return lr(t,this.locale)}startOfMonth(t){return $t(t)}endOfMonth(t){return It(t)}format(t,n){return gr(t,n,this.locale,this.formats)}isEqual(t,n){return tt(t,n)}isValid(t){return Cr(t)}isWithinRange(t,n){return Ar(t,n)}isAfter(t,n){return Ae(t,n)}isBefore(t,n){return!Ae(t,n)&&!tt(t,n)}isSameDay(t,n){return Fr(t,n)}isSameMonth(t,n){return Or(t,n)}setMonth(t,n){return Tr(t,n)}setYear(t,n){return kr(t,n)}getDiff(t,n,r){return Er(t,n,r)}getWeekdays(){return mr(this.locale)}getYear(t){return br(t)}getMonth(t){return wr(t)}getNextMonth(t){return Sr(t)}startOfDay(t){return Pr(t)}endOfDay(t){return $r(t)}startOfYear(t){return Dr(t)}endOfYear(t){return xr(t)}}const Lt=Symbol.for("vuetify:date-options"),nt=Symbol.for("vuetify:date-adapter");function Rr(e,t){const n=A({adapter:Ir,locale:{af:"af-ZA",bg:"bg-BG",ca:"ca-ES",ckb:"",cs:"cs-CZ",de:"de-DE",el:"el-GR",en:"en-US",et:"et-EE",fa:"fa-IR",fi:"fi-FI",hr:"hr-HR",hu:"hu-HU",he:"he-IL",id:"id-ID",it:"it-IT",ja:"ja-JP",ko:"ko-KR",lv:"lv-LV",lt:"lt-LT",nl:"nl-NL",no:"no-NO",pl:"pl-PL",pt:"pt-PT",ro:"ro-RO",ru:"ru-RU",sk:"sk-SK",sl:"sl-SI",srCyrl:"sr-SP",srLatn:"sr-SP",sv:"sv-SE",th:"th-TH",tr:"tr-TR",az:"az-AZ",uk:"uk-UA",vi:"vi-VN",zhHans:"zh-CN",zhHant:"zh-TW"}},e);return{options:n,instance:Nt(n,t)}}function Nt(e,t){const n=E(typeof e.adapter=="function"?new e.adapter({locale:e.locale[t.current.value]??t.current.value,formats:e.formats}):e.adapter);return N(t.current,r=>{n.locale=e.locale[r]??r??n.locale}),n}function Qo(){const e=C(Lt);if(!e)throw new Error("[Vuetify] Could not find injected date options");const t=ir();return Nt(e,t)}function es(e,t){const n=e.toJsDate(t);let r=e.getYear(n),o=e.startOfYear(n);if(n<o)r=r-1,o=e.startOfYear(e.setYear(n,r));else{const i=e.startOfYear(e.setYear(n,r+1));n>=i&&(r=r+1,o=i)}const s=Math.abs(n.getTime()-o.getTime()),a=Math.ceil(s/(1e3*60*60*24));return Math.floor(a/7)+1}const ts=["sm","md","lg","xl","xxl"],Ce=Symbol.for("vuetify:display"),rt={mobileBreakpoint:"lg",thresholds:{xs:0,sm:600,md:960,lg:1280,xl:1920,xxl:2560}},Lr=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:rt;return A(rt,e)};function ot(e){return D&&!e?window.innerWidth:typeof e=="object"&&e.clientWidth||0}function st(e){return D&&!e?window.innerHeight:typeof e=="object"&&e.clientHeight||0}function at(e){const t=D&&!e?window.navigator.userAgent:"ssr";function n(l){return!!t.match(l)}const r=n(/android/i),o=n(/iphone|ipad|ipod/i),s=n(/cordova/i),a=n(/electron/i),i=n(/chrome/i),c=n(/edge/i),u=n(/firefox/i),f=n(/opera/i),d=n(/win/i),m=n(/mac/i),p=n(/linux/i);return{android:r,ios:o,cordova:s,electron:a,chrome:i,edge:c,firefox:u,opera:f,win:d,mac:m,linux:p,touch:fn,ssr:t==="ssr"}}function Nr(e,t){const{thresholds:n,mobileBreakpoint:r}=Lr(e),o=P(st(t)),s=P(at(t)),a=E({}),i=P(ot(t));function c(){o.value=st(),i.value=ot()}function u(){c(),s.value=at()}return me(()=>{const f=i.value<n.sm,d=i.value<n.md&&!f,m=i.value<n.lg&&!(d||f),p=i.value<n.xl&&!(m||d||f),l=i.value<n.xxl&&!(p||m||d||f),h=i.value>=n.xxl,w=f?"xs":d?"sm":m?"md":p?"lg":l?"xl":"xxl",Y=typeof r=="number"?r:n[r],H=i.value<Y;a.xs=f,a.sm=d,a.md=m,a.lg=p,a.xl=l,a.xxl=h,a.smAndUp=!f,a.mdAndUp=!(f||d),a.lgAndUp=!(f||d||m),a.xlAndUp=!(f||d||m||p),a.smAndDown=!(m||p||l||h),a.mdAndDown=!(p||l||h),a.lgAndDown=!(l||h),a.xlAndDown=!h,a.name=w,a.height=o.value,a.width=i.value,a.mobile=H,a.mobileBreakpoint=r,a.platform=s.value,a.thresholds=n}),D&&window.addEventListener("resize",c,{passive:!0}),{...ft(a),update:u,ssr:!!t}}const ns=V({mobileBreakpoint:[Number,String]},"display");function rs(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:er();const n=C(Ce);if(!n)throw new Error("Could not find Vuetify display injection");const r=g(()=>{if(!e.mobileBreakpoint)return n.mobile.value;const s=typeof e.mobileBreakpoint=="number"?e.mobileBreakpoint:n.thresholds.value[e.mobileBreakpoint];return n.width.value<s}),o=g(()=>t?{[`${t}--mobile`]:r.value}:{});return{...n,displayClasses:o,mobile:r}}const Br={collapse:"mdi-chevron-up",complete:"mdi-check",cancel:"mdi-close-circle",close:"mdi-close",delete:"mdi-close-circle",clear:"mdi-close-circle",success:"mdi-check-circle",info:"mdi-information",warning:"mdi-alert-circle",error:"mdi-close-circle",prev:"mdi-chevron-left",next:"mdi-chevron-right",checkboxOn:"mdi-checkbox-marked",checkboxOff:"mdi-checkbox-blank-outline",checkboxIndeterminate:"mdi-minus-box",delimiter:"mdi-circle",sortAsc:"mdi-arrow-up",sortDesc:"mdi-arrow-down",expand:"mdi-chevron-down",menu:"mdi-menu",subgroup:"mdi-menu-down",dropdown:"mdi-menu-down",radioOn:"mdi-radiobox-marked",radioOff:"mdi-radiobox-blank",edit:"mdi-pencil",ratingEmpty:"mdi-star-outline",ratingFull:"mdi-star",ratingHalf:"mdi-star-half-full",loading:"mdi-cached",first:"mdi-page-first",last:"mdi-page-last",unfold:"mdi-unfold-more-horizontal",file:"mdi-paperclip",plus:"mdi-plus",minus:"mdi-minus",calendar:"mdi-calendar",eyeDropper:"mdi-eyedropper"},Vr={component:e=>mt(Vt,{...e,class:"mdi"})},Yr=[String,Function,Object,Array],Me=Symbol.for("vuetify:icons"),ge=V({icon:{type:Yr},tag:{type:String,required:!0}},"icon"),it=Ft()({name:"VComponentIcon",props:ge(),setup(e,t){let{slots:n}=t;return()=>{const r=e.icon;return T(e.tag,null,{default:()=>[e.icon?T(r,null,null):n.default?.()]})}}}),Bt=te({name:"VSvgIcon",inheritAttrs:!1,props:ge(),setup(e,t){let{attrs:n}=t;return()=>T(e.tag,tn(n,{style:null}),{default:()=>[T("svg",{class:"v-icon__svg",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",role:"img","aria-hidden":"true"},[Array.isArray(e.icon)?e.icon.map(r=>Array.isArray(r)?T("path",{d:r[0],"fill-opacity":r[1]},null):T("path",{d:r},null)):T("path",{d:e.icon},null)])]})}}),os=te({name:"VLigatureIcon",props:ge(),setup(e){return()=>T(e.tag,null,{default:()=>[e.icon]})}}),Vt=te({name:"VClassIcon",props:ge(),setup(e){return()=>T(e.tag,{class:e.icon},null)}}),Hr={svg:{component:Bt},class:{component:Vt}};function jr(e){return A({defaultSet:"mdi",sets:{...Hr,mdi:Vr},aliases:{...Br,vuetify:["M8.2241 14.2009L12 21L22 3H14.4459L8.2241 14.2009Z",["M7.26303 12.4733L7.00113 12L2 3H12.5261C12.5261 3 12.5261 3 12.5261 3L7.26303 12.4733Z",.6]],"vuetify-outline":"svg:M7.26 12.47 12.53 3H2L7.26 12.47ZM14.45 3 8.22 14.2 12 21 22 3H14.45ZM18.6 5 12 16.88 10.51 14.2 15.62 5ZM7.26 8.35 5.4 5H9.13L7.26 8.35Z"}},e)}const ss=e=>{const t=C(Me);if(!t)throw new Error("Missing Vuetify Icons provide!");return{iconData:g(()=>{const r=G(e);if(!r)return{component:it};let o=r;if(typeof o=="string"&&(o=o.trim(),o.startsWith("$")&&(o=t.aliases?.[o.slice(1)])),!o)throw new Error(`Could not find aliased icon "${r}"`);if(Array.isArray(o))return{component:Bt,icon:o};if(typeof o!="string")return{component:it,icon:o};const s=Object.keys(t.sets).find(c=>typeof o=="string"&&o.startsWith(`${c}:`)),a=s?o.slice(s.length+1):o;return{component:t.sets[s??t.defaultSet].component,icon:a}})}},ee=Symbol.for("vuetify:theme"),as=V({theme:String},"theme"),Q={defaultTheme:"light",variations:{colors:[],lighten:0,darken:0},themes:{light:{dark:!1,colors:{background:"#FFFFFF",surface:"#FFFFFF","surface-bright":"#FFFFFF","surface-variant":"#424242","on-surface-variant":"#EEEEEE",primary:"#1867C0","primary-darken-1":"#1F5592",secondary:"#48A9A6","secondary-darken-1":"#018786",error:"#B00020",info:"#2196F3",success:"#4CAF50",warning:"#FB8C00"},variables:{"border-color":"#000000","border-opacity":.12,"high-emphasis-opacity":.87,"medium-emphasis-opacity":.6,"disabled-opacity":.38,"idle-opacity":.04,"hover-opacity":.04,"focus-opacity":.12,"selected-opacity":.08,"activated-opacity":.12,"pressed-opacity":.12,"dragged-opacity":.08,"theme-kbd":"#212529","theme-on-kbd":"#FFFFFF","theme-code":"#F5F5F5","theme-on-code":"#000000"}},dark:{dark:!0,colors:{background:"#121212",surface:"#212121","surface-bright":"#ccbfd6","surface-variant":"#a3a3a3","on-surface-variant":"#424242",primary:"#2196F3","primary-darken-1":"#277CC1",secondary:"#54B6B2","secondary-darken-1":"#48A9A6",error:"#CF6679",info:"#2196F3",success:"#4CAF50",warning:"#FB8C00"},variables:{"border-color":"#FFFFFF","border-opacity":.12,"high-emphasis-opacity":1,"medium-emphasis-opacity":.7,"disabled-opacity":.5,"idle-opacity":.1,"hover-opacity":.04,"focus-opacity":.12,"selected-opacity":.08,"activated-opacity":.12,"pressed-opacity":.16,"dragged-opacity":.08,"theme-kbd":"#212529","theme-on-kbd":"#FFFFFF","theme-code":"#343434","theme-on-code":"#CCCCCC"}}}};function Wr(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Q;if(!e)return{...Q,isDisabled:!0};const t={};for(const[n,r]of Object.entries(e.themes??{})){const o=r.dark||n==="dark"?Q.themes?.dark:Q.themes?.light;t[n]=A(o,r)}return A(Q,{...e,themes:t})}function zr(e){const t=Wr(e),n=F(t.defaultTheme),r=F(t.themes),o=g(()=>{const f={};for(const[d,m]of Object.entries(r.value)){const p=f[d]={...m,colors:{...m.colors}};if(t.variations)for(const l of t.variations.colors){const h=p.colors[l];if(h)for(const w of["lighten","darken"]){const Y=w==="lighten"?Kn:Zn;for(const H of yt(t.variations[w],1))p.colors[`${l}-${w}-${H}`]=Ct(Y(k(h),H))}}for(const l of Object.keys(p.colors)){if(/^on-[a-z]/.test(l)||p.colors[`on-${l}`])continue;const h=`on-${l}`,w=k(p.colors[l]);p.colors[h]=_n(w)}}return f}),s=g(()=>o.value[n.value]),a=g(()=>{const f=[];s.value.dark&&R(f,":root",["color-scheme: dark"]),R(f,":root",ut(s.value));for(const[l,h]of Object.entries(o.value))R(f,`.v-theme--${l}`,[`color-scheme: ${h.dark?"dark":"normal"}`,...ut(h)]);const d=[],m=[],p=new Set(Object.values(o.value).flatMap(l=>Object.keys(l.colors)));for(const l of p)/^on-[a-z]/.test(l)?R(m,`.${l}`,[`color: rgb(var(--v-theme-${l})) !important`]):(R(d,`.bg-${l}`,[`--v-theme-overlay-multiplier: var(--v-theme-${l}-overlay-multiplier)`,`background-color: rgb(var(--v-theme-${l})) !important`,`color: rgb(var(--v-theme-on-${l})) !important`]),R(m,`.text-${l}`,[`color: rgb(var(--v-theme-${l})) !important`]),R(m,`.border-${l}`,[`--v-border-color: var(--v-theme-${l})`]));return f.push(...d,...m),f.map((l,h)=>h===0?l:` ${l}`).join("")});function i(){return{style:[{children:a.value,id:"vuetify-theme-stylesheet",nonce:t.cspNonce||!1}]}}function c(f){if(t.isDisabled)return;const d=f._context.provides.usehead;if(d)if(d.push){const m=d.push(i);D&&N(a,()=>{m.patch(i)})}else D?(d.addHeadObjs(g(i)),me(()=>d.updateDOM())):d.addHeadObjs(i());else{let p=function(){if(typeof document<"u"&&!m){const l=document.createElement("style");l.type="text/css",l.id="vuetify-theme-stylesheet",t.cspNonce&&l.setAttribute("nonce",t.cspNonce),m=l,document.head.appendChild(m)}m&&(m.innerHTML=a.value)},m=D?document.getElementById("vuetify-theme-stylesheet"):null;D?N(a,p,{immediate:!0}):p()}}const u=g(()=>t.isDisabled?void 0:`v-theme--${n.value}`);return{install:c,isDisabled:t.isDisabled,name:n,themes:r,current:s,computedThemes:o,themeClasses:u,styles:a,global:{name:n,current:s}}}function is(e){O("provideTheme");const t=C(ee,null);if(!t)throw new Error("Could not find Vuetify theme injection");const n=g(()=>e.theme??t.name.value),r=g(()=>t.themes.value[n.value]),o=g(()=>t.isDisabled?void 0:`v-theme--${n.value}`),s={...t,name:n,current:r,themeClasses:o};return _(ee,s),s}function us(){O("useTheme");const e=C(ee,null);if(!e)throw new Error("Could not find Vuetify theme injection");return e}function R(e,t,n){e.push(`${t} {
`,...n.map(r=>` ${r};
`),`}
`)}function ut(e){const t=e.dark?2:1,n=e.dark?1:2,r=[];for(const[o,s]of Object.entries(e.colors)){const a=k(s);r.push(`--v-theme-${o}: ${a.r},${a.g},${a.b}`),o.startsWith("on-")||r.push(`--v-theme-${o}-overlay-multiplier: ${De(s)>.18?t:n}`)}for(const[o,s]of Object.entries(e.variables)){const a=typeof s=="string"&&s.startsWith("#")?k(s):void 0,i=a?`${a.r}, ${a.g}, ${a.b}`:void 0;r.push(`--v-${o}: ${i??s}`)}return r}function Ur(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"content";const n=F(),r=F();if(D){const o=new ResizeObserver(s=>{e?.(s,o),s.length&&(t==="content"?r.value=s[0].contentRect:r.value=s[0].target.getBoundingClientRect())});gt(()=>{o.disconnect()}),N(n,(s,a)=>{a&&(o.unobserve(Ne(a)),r.value=void 0),s&&o.observe(Ne(s))},{flush:"post"})}return{resizeRef:n,contentRect:nn(r)}}const de=Symbol.for("vuetify:layout"),Yt=Symbol.for("vuetify:layout-item"),ct=1e3,cs=V({overlaps:{type:Array,default:()=>[]},fullHeight:Boolean},"layout"),ls=V({name:{type:String},order:{type:[Number,String],default:0},absolute:Boolean},"layout-item");function fs(){const e=C(de);if(!e)throw new Error("[Vuetify] Could not find injected layout");return{getLayoutItem:e.getLayoutItem,mainRect:e.mainRect,mainStyles:e.mainStyles}}function ds(e){const t=C(de);if(!t)throw new Error("[Vuetify] Could not find injected layout");const n=e.id??`layout-item-${Te()}`,r=O("useLayoutItem");_(Yt,{id:n});const o=P(!1);on(()=>o.value=!0),sn(()=>o.value=!1);const{layoutItemStyles:s,layoutItemScrimStyles:a}=t.register(r,{...e,active:g(()=>o.value?!1:e.active.value),id:n});return gt(()=>t.unregister(n)),{layoutItemStyles:s,layoutRect:t.layoutRect,layoutItemScrimStyles:a}}const Gr=(e,t,n,r)=>{let o={top:0,left:0,right:0,bottom:0};const s=[{id:"",layer:{...o}}];for(const a of e){const i=t.get(a),c=n.get(a),u=r.get(a);if(!i||!c||!u)continue;const f={...o,[i.value]:parseInt(o[i.value],10)+(u.value?parseInt(c.value,10):0)};s.push({id:a,layer:f}),o=f}return s};function ms(e){const t=C(de,null),n=g(()=>t?t.rootZIndex.value-100:ct),r=F([]),o=E(new Map),s=E(new Map),a=E(new Map),i=E(new Map),c=E(new Map),{resizeRef:u,contentRect:f}=Ur(),d=g(()=>{const v=new Map,x=e.overlaps??[];for(const y of x.filter(S=>S.includes(":"))){const[S,b]=y.split(":");if(!r.value.includes(S)||!r.value.includes(b))continue;const j=o.get(S),$=o.get(b),X=s.get(S),J=s.get(b);!j||!$||!X||!J||(v.set(b,{position:j.value,amount:parseInt(X.value,10)}),v.set(S,{position:$.value,amount:-parseInt(J.value,10)}))}return v}),m=g(()=>{const v=[...new Set([...a.values()].map(y=>y.value))].sort((y,S)=>y-S),x=[];for(const y of v){const S=r.value.filter(b=>a.get(b)?.value===y);x.push(...S)}return Gr(x,o,s,i)}),p=g(()=>!Array.from(c.values()).some(v=>v.value)),l=g(()=>m.value[m.value.length-1].layer),h=g(()=>({"--v-layout-left":ne(l.value.left),"--v-layout-right":ne(l.value.right),"--v-layout-top":ne(l.value.top),"--v-layout-bottom":ne(l.value.bottom),...p.value?void 0:{transition:"none"}})),w=g(()=>m.value.slice(1).map((v,x)=>{let{id:y}=v;const{layer:S}=m.value[x],b=s.get(y),j=o.get(y);return{id:y,...S,size:Number(b.value),position:j.value}})),Y=v=>w.value.find(x=>x.id===v),H=O("createLayout"),ke=P(!1);rn(()=>{ke.value=!0}),_(de,{register:(v,x)=>{let{id:y,order:S,position:b,layoutSize:j,elementSize:$,active:X,disableTransitions:J,absolute:Wt}=x;a.set(y,S),o.set(y,b),s.set(y,j),i.set(y,X),J&&c.set(y,J);const Pe=ie(Yt,H?.vnode).indexOf(v);Pe>-1?r.value.splice(Pe,0,y):r.value.push(y);const $e=g(()=>w.value.findIndex(q=>q.id===y)),he=g(()=>n.value+m.value.length*2-$e.value*2),zt=g(()=>{const q=b.value==="left"||b.value==="right",pe=b.value==="right",Gt=b.value==="bottom",Ie={[b.value]:0,zIndex:he.value,transform:`translate${q?"X":"Y"}(${(X.value?0:-110)*(pe||Gt?-1:1)}%)`,position:Wt.value||n.value!==ct?"absolute":"fixed",...p.value?void 0:{transition:"none"}};if(!ke.value)return Ie;const M=w.value[$e.value];if(!M)throw new Error(`[Vuetify] Could not find layout item "${y}"`);const ye=d.value.get(y);return ye&&(M[ye.position]+=ye.amount),{...Ie,height:q?`calc(100% - ${M.top}px - ${M.bottom}px)`:$.value?`${$.value}px`:void 0,left:pe?void 0:`${M.left}px`,right:pe?`${M.right}px`:void 0,top:b.value!=="bottom"?`${M.top}px`:void 0,bottom:b.value!=="top"?`${M.bottom}px`:void 0,width:q?$.value?`${$.value}px`:void 0:`calc(100% - ${M.left}px - ${M.right}px)`}}),Ut=g(()=>({zIndex:he.value-1}));return{layoutItemStyles:zt,layoutItemScrimStyles:Ut,zIndex:he}},unregister:v=>{a.delete(v),o.delete(v),s.delete(v),i.delete(v),c.delete(v),r.value=r.value.filter(x=>x!==v)},mainRect:l,mainStyles:h,getLayoutItem:Y,items:w,layoutRect:f,rootZIndex:n});const Ht=g(()=>["v-layout",{"v-layout--full-height":e.fullHeight}]),jt=g(()=>({zIndex:t?n.value:void 0,position:t?"relative":void 0,overflow:t?"hidden":void 0}));return{layoutClasses:Ht,layoutStyles:jt,getLayoutItem:Y,items:w,layoutRect:f,layoutRef:u}}function Kr(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const{blueprint:t,...n}=e,r=A(t,n),{aliases:o={},components:s={},directives:a={}}=r,i=Jn(r.defaults),c=Nr(r.display,r.ssr),u=zr(r.theme),f=jr(r.icons),d=ar(r.locale),m=Rr(r.date,d);return{install:l=>{for(const h in a)l.directive(h,a[h]);for(const h in s)l.component(h,s[h]);for(const h in o)l.component(h,te({...o[h],name:h,aliasName:o[h].name}));if(u.install(l),l.provide(K,i),l.provide(Ce,c),l.provide(ee,u),l.provide(Me,f),l.provide(Z,d),l.provide(Lt,m.options),l.provide(nt,m.instance),D&&r.ssr)if(l.$nuxt)l.$nuxt.hook("app:suspense:resolve",()=>{c.update()});else{const{mount:h}=l;l.mount=function(){const w=h(...arguments);return an(()=>c.update()),l.mount=h,w}}Te.reset(),l.mixin({computed:{$vuetify(){return E({defaults:U.call(this,K),display:U.call(this,Ce),theme:U.call(this,ee),icons:U.call(this,Me),locale:U.call(this,Z),date:U.call(this,nt)})}}})},defaults:i,display:c,theme:u,icons:f,locale:d,date:m}}const Zr="3.4.4";Kr.version=Zr;function U(e){const t=this.$,n=t.parent?.provides??t.vnode.appContext?.provides;if(n&&e in n)return n[e]}export{Mn as $,rr as A,ln as B,ds as C,pn as D,Te as E,ao as F,ie as G,Se as H,Yr as I,ss as J,xn as K,Ur as L,wo as M,ho as N,D as O,Le as P,eo as Q,Ho as R,Jr as S,ir as T,so as U,bo as V,vn as W,go as X,te as Y,Po as Z,Qr as _,cs as a,_o as a0,So as a1,Do as a2,xo as a3,Zo as a4,ue as a5,Ao as a6,Co as a7,Et as a8,Ne as a9,yt as aA,to as aB,qr as aC,Ro as aD,Un as aE,Bo as aF,oo as aG,we as aH,yo as aI,Yo as aJ,ko as aK,Go as aL,ts as aM,Qo as aN,es as aO,co as aP,Jo as aQ,fs as aR,lo as aS,He as aT,ro as aU,Vt as aV,it as aW,os as aX,Bt as aY,Kr as aZ,Eo as aa,To as ab,rs as ac,jo as ad,Ko as ae,An as af,Cn as ag,Fe as ah,yn as ai,po as aj,io as ak,Fn as al,vo as am,us as an,Be as ao,ns as ap,no as aq,fo as ar,No as as,ve as at,B as au,Io as av,zn as aw,At as ax,Lo as ay,uo as az,as as b,is as c,ms as d,Xo as e,Oo as f,Ft as g,zo as h,Uo as i,Mo as j,Vo as k,ne as l,Xn as m,Fo as n,O as o,V as p,er as q,mo as r,Wo as s,jn as t,qo as u,$o as v,k as w,_n as x,Sn as y,ls as z};

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512"><rect width="100%" height="100%" fill="#fff" rx="50"/><path d="M70 85v345h80V85Z" style="fill:#3fb27f"/><path d="M150 430 430 85h-80L150 325Zm216-185h76l-64 80h-76Z" style="fill:#33475b"/><path d="M274 360h160l-60 70H214Z" style="fill:#3fb27f"/></svg>

After

Width:  |  Height:  |  Size: 316 B

View File

@@ -0,0 +1,29 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<meta name="description" content="VueTorrent" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<link rel="icon" href="./favicon.ico" sizes="any" />
<link rel="icon" href="./icon.svg" type="image/svg+xml" />
<link rel="apple-touch-icon" href="./apple-touch-icon.png" />
<meta name="theme-color" content="#000" />
<title>VueTorrent</title>
<script type="module" crossorigin src="./assets/index-135ae4c1.js"></script>
<link rel="modulepreload" crossorigin href="./assets/vue-d2584a6d.js">
<link rel="modulepreload" crossorigin href="./assets/faker-c43f92d4.js">
<link rel="modulepreload" crossorigin href="./assets/vuetify-e547ef1b.js">
<link rel="stylesheet" href="./assets/index-6e88811a.css">
<link rel="manifest" href="./manifest.webmanifest" crossorigin="use-credentials"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head>
<body>
<noscript>
<strong>We're sorry but Vuetorrent doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>

View File

@@ -0,0 +1 @@
{"name":"VueTorrent","short_name":"VueTorrent","start_url":".","display":"standalone","background_color":"#000","lang":"en","scope":"./","theme_color":"#597566","icons":[{"src":"./icon-192.png","type":"image/png","sizes":"192x192"},{"src":"./icon-512.png","type":"image/png","sizes":"512x512"}]}

View File

@@ -0,0 +1 @@
if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('./sw.js', { scope: './' })})}

View File

@@ -0,0 +1,2 @@
User-agent: *
Disallow:

View File

@@ -0,0 +1 @@
if(!self.define){let s,e={};const o=(o,l)=>(o=new URL(o+".js",l).href,e[o]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=o,s.onload=e,document.head.appendChild(s)}else s=o,importScripts(o),e()})).then((()=>{let s=e[o];if(!s)throw new Error(`Module ${o} didnt register its module`);return s})));self.define=(l,r)=>{const n=s||("document"in self?document.currentScript.src:"")||location.href;if(e[n])return;let i={};const a=s=>o(s,n),t={module:{uri:n},exports:i,require:a};e[n]=Promise.all(l.map((s=>t[s]||a(s)))).then((s=>(r(...s),i)))}}define(["./workbox-fa446783"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"apple-touch-icon.png",revision:"eed821a5bbfee3a20aab9c51c4977743"},{url:"assets/ArrayPagination-26934cac.js",revision:null},{url:"assets/Dashboard-e1ea0c85.css",revision:null},{url:"assets/Dashboard-e667d93a.js",revision:null},{url:"assets/dayjs-f7aba705.js",revision:null},{url:"assets/dayjs.min-1969f9c6.js",revision:null},{url:"assets/faker-c43f92d4.js",revision:null},{url:"assets/index-135ae4c1.js",revision:null},{url:"assets/index-6e88811a.css",revision:null},{url:"assets/index-fd06c5c5.js",revision:null},{url:"assets/Login-4fd3fce4.js",revision:null},{url:"assets/Logs-a45762d4.css",revision:null},{url:"assets/Logs-c238f379.js",revision:null},{url:"assets/MagnetHandler-d77b3bb6.js",revision:null},{url:"assets/materialdesignicons-webfont-28c8f97f.woff",revision:null},{url:"assets/materialdesignicons-webfont-31010194.woff2",revision:null},{url:"assets/PasswordField.vue_vue_type_script_setup_true_lang-f7d196be.js",revision:null},{url:"assets/roboto-cyrillic-400-normal-495d38d4.woff2",revision:null},{url:"assets/roboto-cyrillic-400-normal-adba67d2.woff",revision:null},{url:"assets/roboto-cyrillic-ext-400-normal-0a32035a.woff",revision:null},{url:"assets/roboto-cyrillic-ext-400-normal-b7ef2cd1.woff2",revision:null},{url:"assets/roboto-greek-400-normal-076b9dc1.woff",revision:null},{url:"assets/roboto-greek-400-normal-daf51ab5.woff2",revision:null},{url:"assets/roboto-latin-400-normal-a9fdbefa.woff",revision:null},{url:"assets/roboto-latin-400-normal-f6734f81.woff2",revision:null},{url:"assets/roboto-latin-ext-400-normal-3c23eb02.woff2",revision:null},{url:"assets/roboto-latin-ext-400-normal-c2b94086.woff",revision:null},{url:"assets/roboto-mono-cyrillic-400-normal-8c367f2f.woff2",revision:null},{url:"assets/roboto-mono-cyrillic-400-normal-f32fcdb5.woff",revision:null},{url:"assets/roboto-mono-cyrillic-ext-400-normal-ae7d87eb.woff",revision:null},{url:"assets/roboto-mono-cyrillic-ext-400-normal-eef02d41.woff2",revision:null},{url:"assets/roboto-mono-greek-400-normal-3355834d.woff",revision:null},{url:"assets/roboto-mono-greek-400-normal-53a8927b.woff2",revision:null},{url:"assets/roboto-mono-latin-400-normal-7295944e.woff2",revision:null},{url:"assets/roboto-mono-latin-400-normal-d5d7d67f.woff",revision:null},{url:"assets/roboto-mono-latin-ext-400-normal-20f2c9c1.woff",revision:null},{url:"assets/roboto-mono-latin-ext-400-normal-820adbd1.woff2",revision:null},{url:"assets/roboto-mono-vietnamese-400-normal-9a7a0360.woff",revision:null},{url:"assets/roboto-vietnamese-400-normal-77b24796.woff2",revision:null},{url:"assets/roboto-vietnamese-400-normal-d2390f1a.woff",revision:null},{url:"assets/RssArticles-1fe4e4bd.js",revision:null},{url:"assets/RssArticles-cd150368.css",revision:null},{url:"assets/SearchEngine-b38d96d6.js",revision:null},{url:"assets/Settings-af9c84ca.js",revision:null},{url:"assets/Settings-cac9dd1a.css",revision:null},{url:"assets/TorrentDetail-85e789b3.js",revision:null},{url:"assets/TorrentDetail-cad7bace.css",revision:null},{url:"assets/torrents-f1a47456.js",revision:null},{url:"assets/vue-d2584a6d.js",revision:null},{url:"assets/vuetify-e547ef1b.js",revision:null},{url:"favicon.ico",revision:"621ef878b9a700bd2249dad60d9f1141"},{url:"icon-192.png",revision:"1a475d65497c0b3609661246d8639ff4"},{url:"icon-512.png",revision:"fa311af470073dfeb0673806ae3e0e2f"},{url:"icon.svg",revision:"1a5efa1aa226aa0533605b7e84667ecd"},{url:"index.html",revision:"b595f6f4165d802b703cd2526fac0ff9"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.ico",revision:"621ef878b9a700bd2249dad60d9f1141"},{url:"icon.svg",revision:"1a5efa1aa226aa0533605b7e84667ecd"},{url:"icon-192.png",revision:"1a475d65497c0b3609661246d8639ff4"},{url:"icon-512.png",revision:"fa311af470073dfeb0673806ae3e0e2f"},{url:"robots.txt",revision:"b6216d61c03e6ce0c9aea6ca7808f7ca"},{url:"manifest.webmanifest",revision:"112d2a686dfcb44742c79ee217315d5c"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))}));

View File

@@ -0,0 +1 @@
define(["exports"],(function(t){"use strict";try{self["workbox:core:7.0.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.0.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const c=t.method;if(!o&&this.i.has(c)&&(o=this.i.get(c)),!o)return;let a;try{a=o.handle({url:s,request:t,event:e,params:i})}catch(t){a=Promise.reject(t)}const h=r&&r.catchHandler;return a instanceof Promise&&(this.o||h)&&(a=a.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),a}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(i)&&0===i.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let c;const a=()=>(c||(c=new o,c.addFetchListener(),c.addCacheListener()),c);function h(t,e,n){let o;if("string"==typeof t){const s=new URL(t,location.href);o=new i((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)o=new r(t,e,n);else if("function"==typeof t)o=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return a().registerRoute(o),o}const u={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},l=t=>[u.prefix,t,u.suffix].filter((t=>t&&t.length>0)).join("-"),f=t=>t||l(u.precache),w=t=>t||l(u.runtime);function d(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.0.0"]&&_()}catch(t){}function p(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class y{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class g{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.h.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.h=t}}let R;async function m(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=e?e(r):r,c=function(){if(void 0===R){const t=new Response("");if("body"in t)try{new Response(t.body),R=!0}catch(t){R=!1}R=!1}return R}()?i.body:await i.blob();return new Response(c,o)}function v(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class q{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const U=new Set;try{self["workbox:strategies:7.0.0"]&&_()}catch(t){}function L(t){return"string"==typeof t?new Request(t):t}class b{constructor(t,e){this.u={},Object.assign(this,e),this.event=e.event,this.l=t,this.p=new q,this.R=[],this.m=[...t.plugins],this.v=new Map;for(const t of this.m)this.v.set(t,{});this.event.waitUntil(this.p.promise)}async fetch(t){const{event:e}=this;let n=L(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.l.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=L(t);let s;const{cacheName:n,matchOptions:i}=this.l,r=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},i),{cacheName:n});s=await caches.match(r,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=L(t);var i;await(i=0,new Promise((t=>setTimeout(t,i))));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=r.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const c=await this.q(e);if(!c)return!1;const{cacheName:a,matchOptions:h}=this.l,u=await self.caches.open(a),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=v(e.url,s);if(e.url===i)return t.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,r);for(const e of o)if(i===v(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?c.clone():c)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of U)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:a,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.u[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=L(await t({mode:e,request:n,event:this.event,params:this.params}));this.u[s]=n}return this.u[s]}hasCallback(t){for(const e of this.l.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.l.plugins)if("function"==typeof e[t]){const s=this.v.get(e),n=n=>{const i=Object.assign(Object.assign({},n),{state:s});return e[t](i)};yield n}}waitUntil(t){return this.R.push(t),t}async doneWaiting(){let t;for(;t=this.R.shift();)await t}destroy(){this.p.resolve(null)}async q(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class C{constructor(t={}){this.cacheName=w(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new b(this,{event:e,request:s,params:n}),r=this.U(i,s,e);return[r,this.L(r,i,s,e)]}async U(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this._(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async L(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){t instanceof Error&&(r=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}class E extends C{constructor(t={}){t.cacheName=f(t.cacheName),super(t),this.C=!1!==t.fallbackToNetwork,this.plugins.push(E.copyRedirectedCacheableResponsesPlugin)}async _(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.O(t,e):await this.N(t,e))}async N(t,e){let n;const i=e.params||{};if(!this.C)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,r=t.integrity,o=!r||r===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?r||s:void 0})),s&&o&&"no-cors"!==t.mode&&(this.k(),await e.cachePut(t,n.clone()))}return n}async O(t,e){this.k();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}k(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==E.copyRedirectedCacheableResponsesPlugin&&(n===E.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(E.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}E.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},E.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await m(t):t};class O{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.K=new Map,this.P=new Map,this.T=new Map,this.l=new E({cacheName:f(t),plugins:[...e,new g({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.l}precache(t){this.addToCacheList(t),this.W||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.W=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=p(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.K.has(i)&&this.K.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.K.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.T.has(t)&&this.T.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.T.set(t,n.integrity)}if(this.K.set(i,t),this.P.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return d(t,(async()=>{const e=new y;this.strategy.plugins.push(e);for(const[e,s]of this.K){const n=this.T.get(s),i=this.P.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return d(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.K.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.K}getCachedURLs(){return[...this.K.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.K.get(e.href)}getIntegrityForCacheKey(t){return this.T.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}let x;const N=()=>(x||(x=new O),x);class k extends i{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(r,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}t.NavigationRoute=class extends i{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super((t=>this.j(t)),t),this.M=e,this.S=s}j({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.S)if(t.test(s))return!1;return!!this.M.some((t=>t.test(s)))}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const e=f();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(e).then((t=>{})))}))},t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.createHandlerBoundToURL=function(t){return N().createHandlerBoundToURL(t)},t.precacheAndRoute=function(t,e){!function(t){N().precache(t)}(t),function(t){const e=N();h(new k(e,t))}(e)},t.registerRoute=h}));

View File

@@ -0,0 +1 @@
2.4.0

7
vim/.vim/.netrwhist Normal file
View File

@@ -0,0 +1,7 @@
let g:netrw_dirhistmax =10
let g:netrw_dirhistcnt =5
let g:netrw_dirhist_5='/Users/joshp/.config/nvim'
let g:netrw_dirhist_4='/Users/joshp/nvim'
let g:netrw_dirhist_3='/Users/joshp/nvim/lua'
let g:netrw_dirhist_2='/Users/joshp/nvim/lua/joshp'
let g:netrw_dirhist_1='/Users/joshp/nvim'

View File

@@ -0,0 +1,58 @@
" [onedark.vim](https://github.com/joshdick/onedark.vim/)
" This is a [lightline.vim](https://github.com/itchyny/lightline.vim) colorscheme for use with
" the [onedark.vim](https://github.com/joshdick/onedark.vim) colorscheme.
let s:colors = onedark#GetColors()
if get(g:, 'onedark_termcolors', 256) == 16
let s:term_red = s:colors.red.cterm16
let s:term_green = s:colors.green.cterm16
let s:term_yellow = s:colors.yellow.cterm16
let s:term_blue = s:colors.blue.cterm16
let s:term_purple = s:colors.purple.cterm16
let s:term_white = s:colors.white.cterm16
let s:term_cursor_grey = s:colors.cursor_grey.cterm16
let s:term_visual_grey = s:colors.visual_grey.cterm16
else
let s:term_red = s:colors.red.cterm
let s:term_green = s:colors.green.cterm
let s:term_yellow = s:colors.yellow.cterm
let s:term_blue = s:colors.blue.cterm
let s:term_purple = s:colors.purple.cterm
let s:term_white = s:colors.white.cterm
let s:term_cursor_grey = s:colors.cursor_grey.cterm
let s:term_visual_grey = s:colors.visual_grey.cterm
endif
let s:red = [ s:colors.red.gui, s:term_red ]
let s:green = [ s:colors.green.gui, s:term_green ]
let s:yellow = [ s:colors.yellow.gui, s:term_yellow ]
let s:blue = [ s:colors.blue.gui, s:term_blue ]
let s:purple = [ s:colors.purple.gui, s:term_purple ]
let s:white = [ s:colors.white.gui, s:term_white ]
let s:cursor_grey = [ s:colors.cursor_grey.gui, s:term_cursor_grey ]
let s:visual_grey = [ s:colors.visual_grey.gui, s:term_visual_grey ]
let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}}
let s:p.normal.left = [ [ s:cursor_grey, s:green ], [ s:white, s:visual_grey ] ]
let s:p.normal.right = [ [ s:cursor_grey, s:green ], [ s:white, s:visual_grey ] ]
let s:p.inactive.left = [ [ s:white, s:visual_grey ], [ s:white, s:visual_grey ] ]
let s:p.inactive.right = [ [ s:cursor_grey, s:white ], [ s:cursor_grey, s:white ] ]
let s:p.insert.left = [ [ s:cursor_grey, s:blue ], [ s:white, s:visual_grey ] ]
let s:p.insert.right = [ [ s:cursor_grey, s:blue ], [ s:white, s:visual_grey ] ]
let s:p.replace.left = [ [ s:cursor_grey, s:red ], [ s:white, s:visual_grey ] ]
let s:p.replace.right = [ [ s:cursor_grey, s:red ], [ s:white, s:visual_grey ] ]
let s:p.visual.left = [ [ s:cursor_grey, s:purple ], [ s:white, s:visual_grey ] ]
let s:p.visual.right = [ [ s:cursor_grey, s:purple ], [ s:white, s:visual_grey ] ]
let s:p.normal.middle = [ [ s:white, s:cursor_grey ] ]
let s:p.inactive.middle = [ [ s:white, s:visual_grey ] ]
let s:p.tabline.left = [ [ s:white, s:visual_grey ] ]
let s:p.tabline.tabsel = [ [ s:cursor_grey, s:white ] ]
let s:p.tabline.middle = [ [ s:white, s:cursor_grey ] ]
let s:p.tabline.right = [ [ s:white, s:visual_grey ] ]
let s:p.normal.error = [ [ s:cursor_grey, s:red ] ]
let s:p.normal.warning = [ [ s:cursor_grey, s:yellow ] ]
let g:lightline#colorscheme#onedark#palette = lightline#colorscheme#flatten(s:p)

View File

@@ -0,0 +1,29 @@
" [onedark.vim](https://github.com/joshdick/onedark.vim/)
let s:overrides = get(g:, "onedark_color_overrides", {})
let s:colors = {
\ "red": get(s:overrides, "red", { "gui": "#E06C75", "cterm": "204", "cterm16": "1" }),
\ "dark_red": get(s:overrides, "dark_red", { "gui": "#BE5046", "cterm": "196", "cterm16": "9" }),
\ "green": get(s:overrides, "green", { "gui": "#98C379", "cterm": "114", "cterm16": "2" }),
\ "yellow": get(s:overrides, "yellow", { "gui": "#E5C07B", "cterm": "180", "cterm16": "3" }),
\ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "#D19A66", "cterm": "173", "cterm16": "11" }),
\ "blue": get(s:overrides, "blue", { "gui": "#61AFEF", "cterm": "39", "cterm16": "4" }),
\ "purple": get(s:overrides, "purple", { "gui": "#C678DD", "cterm": "170", "cterm16": "5" }),
\ "cyan": get(s:overrides, "cyan", { "gui": "#56B6C2", "cterm": "38", "cterm16": "6" }),
\ "white": get(s:overrides, "white", { "gui": "#ABB2BF", "cterm": "145", "cterm16": "15" }),
\ "black": get(s:overrides, "black", { "gui": "#282C34", "cterm": "235", "cterm16": "0" }),
\ "foreground": get(s:overrides, "foreground", { "gui": "#ABB2BF", "cterm": "145", "cterm16": "NONE" }),
\ "background": get(s:overrides, "background", { "gui": "#282C34", "cterm": "235", "cterm16": "NONE" }),
\ "comment_grey": get(s:overrides, "comment_grey", { "gui": "#5C6370", "cterm": "59", "cterm16": "7" }),
\ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "#4B5263", "cterm": "238", "cterm16": "8" }),
\ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "#2C323C", "cterm": "236", "cterm16": "0" }),
\ "visual_grey": get(s:overrides, "visual_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "8" }),
\ "menu_grey": get(s:overrides, "menu_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "7" }),
\ "special_grey": get(s:overrides, "special_grey", { "gui": "#3B4048", "cterm": "238", "cterm16": "7" }),
\ "vertsplit": get(s:overrides, "vertsplit", { "gui": "#3E4452", "cterm": "59", "cterm16": "7" }),
\}
function! onedark#GetColors()
return s:colors
endfunction

2812
vim/.vim/autoload/plug.vim Normal file
View File

@@ -0,0 +1,2812 @@
" vim-plug: Vim plugin manager
" ============================
"
" Download plug.vim and put it in ~/.vim/autoload
"
" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
"
" Edit your .vimrc
"
" call plug#begin('~/.vim/plugged')
"
" " Make sure you use single quotes
"
" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
" Plug 'junegunn/vim-easy-align'
"
" " Any valid git URL is allowed
" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
"
" " Multiple Plug commands can be written in a single line using | separators
" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
"
" " On-demand loading
" Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
"
" " Using a non-default branch
" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
"
" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
" Plug 'fatih/vim-go', { 'tag': '*' }
"
" " Plugin options
" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
"
" " Plugin outside ~/.vim/plugged with post-update hook
" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
"
" " Unmanaged plugin (manually installed and updated)
" Plug '~/my-prototype-plugin'
"
" " Initialize plugin system
" call plug#end()
"
" Then reload .vimrc and :PlugInstall to install plugins.
"
" Plug options:
"
"| Option | Description |
"| ----------------------- | ------------------------------------------------ |
"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
"| `rtp` | Subdirectory that contains Vim plugin |
"| `dir` | Custom directory for the plugin |
"| `as` | Use different name for the plugin |
"| `do` | Post-update hook (string or funcref) |
"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
"| `for` | On-demand loading: File types |
"| `frozen` | Do not update unless explicitly specified |
"
" More information: https://github.com/junegunn/vim-plug
"
"
" Copyright (c) 2017 Junegunn Choi
"
" MIT License
"
" Permission is hereby granted, free of charge, to any person obtaining
" a copy of this software and associated documentation files (the
" "Software"), to deal in the Software without restriction, including
" without limitation the rights to use, copy, modify, merge, publish,
" distribute, sublicense, and/or sell copies of the Software, and to
" permit persons to whom the Software is furnished to do so, subject to
" the following conditions:
"
" The above copyright notice and this permission notice shall be
" included in all copies or substantial portions of the Software.
"
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
if exists('g:loaded_plug')
finish
endif
let g:loaded_plug = 1
let s:cpo_save = &cpo
set cpo&vim
let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
let s:plug_tab = get(s:, 'plug_tab', -1)
let s:plug_buf = get(s:, 'plug_buf', -1)
let s:mac_gui = has('gui_macvim') && has('gui_running')
let s:is_win = has('win32')
let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
if s:is_win && &shellslash
set noshellslash
let s:me = resolve(expand('<sfile>:p'))
set shellslash
else
let s:me = resolve(expand('<sfile>:p'))
endif
let s:base_spec = { 'branch': '', 'frozen': 0 }
let s:TYPE = {
\ 'string': type(''),
\ 'list': type([]),
\ 'dict': type({}),
\ 'funcref': type(function('call'))
\ }
let s:loaded = get(s:, 'loaded', {})
let s:triggers = get(s:, 'triggers', {})
function! s:is_powershell(shell)
return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
endfunction
function! s:isabsolute(dir) abort
return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
endfunction
function! s:git_dir(dir) abort
let gitdir = s:trim(a:dir) . '/.git'
if isdirectory(gitdir)
return gitdir
endif
if !filereadable(gitdir)
return ''
endif
let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
if len(gitdir) && !s:isabsolute(gitdir)
let gitdir = a:dir . '/' . gitdir
endif
return isdirectory(gitdir) ? gitdir : ''
endfunction
function! s:git_origin_url(dir) abort
let gitdir = s:git_dir(a:dir)
let config = gitdir . '/config'
if empty(gitdir) || !filereadable(config)
return ''
endif
return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
endfunction
function! s:git_revision(dir) abort
let gitdir = s:git_dir(a:dir)
let head = gitdir . '/HEAD'
if empty(gitdir) || !filereadable(head)
return ''
endif
let line = get(readfile(head), 0, '')
let ref = matchstr(line, '^ref: \zs.*')
if empty(ref)
return line
endif
if filereadable(gitdir . '/' . ref)
return get(readfile(gitdir . '/' . ref), 0, '')
endif
if filereadable(gitdir . '/packed-refs')
for line in readfile(gitdir . '/packed-refs')
if line =~# ' ' . ref
return matchstr(line, '^[0-9a-f]*')
endif
endfor
endif
return ''
endfunction
function! s:git_local_branch(dir) abort
let gitdir = s:git_dir(a:dir)
let head = gitdir . '/HEAD'
if empty(gitdir) || !filereadable(head)
return ''
endif
let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
return len(branch) ? branch : 'HEAD'
endfunction
function! s:git_origin_branch(spec)
if len(a:spec.branch)
return a:spec.branch
endif
" The file may not be present if this is a local repository
let gitdir = s:git_dir(a:spec.dir)
let origin_head = gitdir.'/refs/remotes/origin/HEAD'
if len(gitdir) && filereadable(origin_head)
return matchstr(get(readfile(origin_head), 0, ''),
\ '^ref: refs/remotes/origin/\zs.*')
endif
" The command may not return the name of a branch in detached HEAD state
let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
return v:shell_error ? '' : result[-1]
endfunction
if s:is_win
function! s:plug_call(fn, ...)
let shellslash = &shellslash
try
set noshellslash
return call(a:fn, a:000)
finally
let &shellslash = shellslash
endtry
endfunction
else
function! s:plug_call(fn, ...)
return call(a:fn, a:000)
endfunction
endif
function! s:plug_getcwd()
return s:plug_call('getcwd')
endfunction
function! s:plug_fnamemodify(fname, mods)
return s:plug_call('fnamemodify', a:fname, a:mods)
endfunction
function! s:plug_expand(fmt)
return s:plug_call('expand', a:fmt, 1)
endfunction
function! s:plug_tempname()
return s:plug_call('tempname')
endfunction
function! plug#begin(...)
if a:0 > 0
let s:plug_home_org = a:1
let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
elseif exists('g:plug_home')
let home = s:path(g:plug_home)
elseif has('nvim')
let home = stdpath('data') . '/plugged'
elseif !empty(&rtp)
let home = s:path(split(&rtp, ',')[0]) . '/plugged'
else
return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
endif
if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
endif
let g:plug_home = home
let g:plugs = {}
let g:plugs_order = []
let s:triggers = {}
call s:define_commands()
return 1
endfunction
function! s:define_commands()
command! -nargs=+ -bar Plug call plug#(<args>)
if !executable('git')
return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
endif
if has('win32')
\ && &shellslash
\ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell))
return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
endif
if !has('nvim')
\ && (has('win32') || has('win32unix'))
\ && !has('multi_byte')
return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
endif
command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
command! -nargs=0 -bar PlugStatus call s:status()
command! -nargs=0 -bar PlugDiff call s:diff()
command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
endfunction
function! s:to_a(v)
return type(a:v) == s:TYPE.list ? a:v : [a:v]
endfunction
function! s:to_s(v)
return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
endfunction
function! s:glob(from, pattern)
return s:lines(globpath(a:from, a:pattern))
endfunction
function! s:source(from, ...)
let found = 0
for pattern in a:000
for vim in s:glob(a:from, pattern)
execute 'source' s:esc(vim)
let found = 1
endfor
endfor
return found
endfunction
function! s:assoc(dict, key, val)
let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
endfunction
function! s:ask(message, ...)
call inputsave()
echohl WarningMsg
let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
echohl None
call inputrestore()
echo "\r"
return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
endfunction
function! s:ask_no_interrupt(...)
try
return call('s:ask', a:000)
catch
return 0
endtry
endfunction
function! s:lazy(plug, opt)
return has_key(a:plug, a:opt) &&
\ (empty(s:to_a(a:plug[a:opt])) ||
\ !isdirectory(a:plug.dir) ||
\ len(s:glob(s:rtp(a:plug), 'plugin')) ||
\ len(s:glob(s:rtp(a:plug), 'after/plugin')))
endfunction
function! plug#end()
if !exists('g:plugs')
return s:err('plug#end() called without calling plug#begin() first')
endif
if exists('#PlugLOD')
augroup PlugLOD
autocmd!
augroup END
augroup! PlugLOD
endif
let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
if get(g:, 'did_load_filetypes', 0)
filetype off
endif
for name in g:plugs_order
if !has_key(g:plugs, name)
continue
endif
let plug = g:plugs[name]
if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
let s:loaded[name] = 1
continue
endif
if has_key(plug, 'on')
let s:triggers[name] = { 'map': [], 'cmd': [] }
for cmd in s:to_a(plug.on)
if cmd =~? '^<Plug>.\+'
if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
call s:assoc(lod.map, cmd, name)
endif
call add(s:triggers[name].map, cmd)
elseif cmd =~# '^[A-Z]'
let cmd = substitute(cmd, '!*$', '', '')
if exists(':'.cmd) != 2
call s:assoc(lod.cmd, cmd, name)
endif
call add(s:triggers[name].cmd, cmd)
else
call s:err('Invalid `on` option: '.cmd.
\ '. Should start with an uppercase letter or `<Plug>`.')
endif
endfor
endif
if has_key(plug, 'for')
let types = s:to_a(plug.for)
if !empty(types)
augroup filetypedetect
call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
augroup END
endif
for type in types
call s:assoc(lod.ft, type, name)
endfor
endif
endfor
for [cmd, names] in items(lod.cmd)
execute printf(
\ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
\ cmd, string(cmd), string(names))
endfor
for [map, names] in items(lod.map)
for [mode, map_prefix, key_prefix] in
\ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
execute printf(
\ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
\ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
endfor
endfor
for [ft, names] in items(lod.ft)
augroup PlugLOD
execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
\ ft, string(ft), string(names))
augroup END
endfor
call s:reorg_rtp()
filetype plugin indent on
if has('vim_starting')
if has('syntax') && !exists('g:syntax_on')
syntax enable
end
else
call s:reload_plugins()
endif
endfunction
function! s:loaded_names()
return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
endfunction
function! s:load_plugin(spec)
call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
endfunction
function! s:reload_plugins()
for name in s:loaded_names()
call s:load_plugin(g:plugs[name])
endfor
endfunction
function! s:trim(str)
return substitute(a:str, '[\/]\+$', '', '')
endfunction
function! s:version_requirement(val, min)
for idx in range(0, len(a:min) - 1)
let v = get(a:val, idx, 0)
if v < a:min[idx] | return 0
elseif v > a:min[idx] | return 1
endif
endfor
return 1
endfunction
function! s:git_version_requirement(...)
if !exists('s:git_version')
let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)')
endif
return s:version_requirement(s:git_version, a:000)
endfunction
function! s:progress_opt(base)
return a:base && !s:is_win &&
\ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
endfunction
function! s:rtp(spec)
return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
endfunction
if s:is_win
function! s:path(path)
return s:trim(substitute(a:path, '/', '\', 'g'))
endfunction
function! s:dirpath(path)
return s:path(a:path) . '\'
endfunction
function! s:is_local_plug(repo)
return a:repo =~? '^[a-z]:\|^[%~]'
endfunction
" Copied from fzf
function! s:wrap_cmds(cmds)
let cmds = [
\ '@echo off',
\ 'setlocal enabledelayedexpansion']
\ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
\ + ['endlocal']
if has('iconv')
if !exists('s:codepage')
let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
endif
return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
endif
return map(cmds, 'v:val."\r"')
endfunction
function! s:batchfile(cmd)
let batchfile = s:plug_tempname().'.bat'
call writefile(s:wrap_cmds(a:cmd), batchfile)
let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
if s:is_powershell(&shell)
let cmd = '& ' . cmd
endif
return [batchfile, cmd]
endfunction
else
function! s:path(path)
return s:trim(a:path)
endfunction
function! s:dirpath(path)
return substitute(a:path, '[/\\]*$', '/', '')
endfunction
function! s:is_local_plug(repo)
return a:repo[0] =~ '[/$~]'
endfunction
endif
function! s:err(msg)
echohl ErrorMsg
echom '[vim-plug] '.a:msg
echohl None
endfunction
function! s:warn(cmd, msg)
echohl WarningMsg
execute a:cmd 'a:msg'
echohl None
endfunction
function! s:esc(path)
return escape(a:path, ' ')
endfunction
function! s:escrtp(path)
return escape(a:path, ' ,')
endfunction
function! s:remove_rtp()
for name in s:loaded_names()
let rtp = s:rtp(g:plugs[name])
execute 'set rtp-='.s:escrtp(rtp)
let after = globpath(rtp, 'after')
if isdirectory(after)
execute 'set rtp-='.s:escrtp(after)
endif
endfor
endfunction
function! s:reorg_rtp()
if !empty(s:first_rtp)
execute 'set rtp-='.s:first_rtp
execute 'set rtp-='.s:last_rtp
endif
" &rtp is modified from outside
if exists('s:prtp') && s:prtp !=# &rtp
call s:remove_rtp()
unlet! s:middle
endif
let s:middle = get(s:, 'middle', &rtp)
let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
\ . ','.s:middle.','
\ . join(map(afters, 'escape(v:val, ",")'), ',')
let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
let s:prtp = &rtp
if !empty(s:first_rtp)
execute 'set rtp^='.s:first_rtp
execute 'set rtp+='.s:last_rtp
endif
endfunction
function! s:doautocmd(...)
if exists('#'.join(a:000, '#'))
execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
endif
endfunction
function! s:dobufread(names)
for name in a:names
let path = s:rtp(g:plugs[name])
for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
if len(finddir(dir, path))
if exists('#BufRead')
doautocmd BufRead
endif
return
endif
endfor
endfor
endfunction
function! plug#load(...)
if a:0 == 0
return s:err('Argument missing: plugin name(s) required')
endif
if !exists('g:plugs')
return s:err('plug#begin was not called')
endif
let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
if !empty(unknowns)
let s = len(unknowns) > 1 ? 's' : ''
return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
end
let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
if !empty(unloaded)
for name in unloaded
call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
endfor
call s:dobufread(unloaded)
return 1
end
return 0
endfunction
function! s:remove_triggers(name)
if !has_key(s:triggers, a:name)
return
endif
for cmd in s:triggers[a:name].cmd
execute 'silent! delc' cmd
endfor
for map in s:triggers[a:name].map
execute 'silent! unmap' map
execute 'silent! iunmap' map
endfor
call remove(s:triggers, a:name)
endfunction
function! s:lod(names, types, ...)
for name in a:names
call s:remove_triggers(name)
let s:loaded[name] = 1
endfor
call s:reorg_rtp()
for name in a:names
let rtp = s:rtp(g:plugs[name])
for dir in a:types
call s:source(rtp, dir.'/**/*.vim')
endfor
if a:0
if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
execute 'runtime' a:1
endif
call s:source(rtp, a:2)
endif
call s:doautocmd('User', name)
endfor
endfunction
function! s:lod_ft(pat, names)
let syn = 'syntax/'.a:pat.'.vim'
call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
execute 'autocmd! PlugLOD FileType' a:pat
call s:doautocmd('filetypeplugin', 'FileType')
call s:doautocmd('filetypeindent', 'FileType')
endfunction
function! s:lod_cmd(cmd, bang, l1, l2, args, names)
call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
call s:dobufread(a:names)
execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
endfunction
function! s:lod_map(map, names, with_prefix, prefix)
call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
call s:dobufread(a:names)
let extra = ''
while 1
let c = getchar(0)
if c == 0
break
endif
let extra .= nr2char(c)
endwhile
if a:with_prefix
let prefix = v:count ? v:count : ''
let prefix .= '"'.v:register.a:prefix
if mode(1) == 'no'
if v:operator == 'c'
let prefix = "\<esc>" . prefix
endif
let prefix .= v:operator
endif
call feedkeys(prefix, 'n')
endif
call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
endfunction
function! plug#(repo, ...)
if a:0 > 1
return s:err('Invalid number of arguments (1..2)')
endif
try
let repo = s:trim(a:repo)
let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
let spec = extend(s:infer_properties(name, repo), opts)
if !has_key(g:plugs, name)
call add(g:plugs_order, name)
endif
let g:plugs[name] = spec
let s:loaded[name] = get(s:loaded, name, 0)
catch
return s:err(repo . ' ' . v:exception)
endtry
endfunction
function! s:parse_options(arg)
let opts = copy(s:base_spec)
let type = type(a:arg)
let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)'
if type == s:TYPE.string
if empty(a:arg)
throw printf(opt_errfmt, 'tag', 'string')
endif
let opts.tag = a:arg
elseif type == s:TYPE.dict
for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
if has_key(a:arg, opt)
\ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
throw printf(opt_errfmt, opt, 'string')
endif
endfor
for opt in ['on', 'for']
if has_key(a:arg, opt)
\ && type(a:arg[opt]) != s:TYPE.list
\ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
throw printf(opt_errfmt, opt, 'string or list')
endif
endfor
if has_key(a:arg, 'do')
\ && type(a:arg.do) != s:TYPE.funcref
\ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do))
throw printf(opt_errfmt, 'do', 'string or funcref')
endif
call extend(opts, a:arg)
if has_key(opts, 'dir')
let opts.dir = s:dirpath(s:plug_expand(opts.dir))
endif
else
throw 'Invalid argument type (expected: string or dictionary)'
endif
return opts
endfunction
function! s:infer_properties(name, repo)
let repo = a:repo
if s:is_local_plug(repo)
return { 'dir': s:dirpath(s:plug_expand(repo)) }
else
if repo =~ ':'
let uri = repo
else
if repo !~ '/'
throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
endif
let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
let uri = printf(fmt, repo)
endif
return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
endif
endfunction
function! s:install(force, names)
call s:update_impl(0, a:force, a:names)
endfunction
function! s:update(force, names)
call s:update_impl(1, a:force, a:names)
endfunction
function! plug#helptags()
if !exists('g:plugs')
return s:err('plug#begin was not called')
endif
for spec in values(g:plugs)
let docd = join([s:rtp(spec), 'doc'], '/')
if isdirectory(docd)
silent! execute 'helptags' s:esc(docd)
endif
endfor
return 1
endfunction
function! s:syntax()
syntax clear
syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
syn match plugNumber /[0-9]\+[0-9.]*/ contained
syn match plugBracket /[[\]]/ contained
syn match plugX /x/ contained
syn match plugDash /^-\{1}\ /
syn match plugPlus /^+/
syn match plugStar /^*/
syn match plugMessage /\(^- \)\@<=.*/
syn match plugName /\(^- \)\@<=[^ ]*:/
syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
syn match plugTag /(tag: [^)]\+)/
syn match plugInstall /\(^+ \)\@<=[^:]*/
syn match plugUpdate /\(^* \)\@<=[^:]*/
syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
syn match plugEdge /^ \X\+$/
syn match plugEdge /^ \X*/ contained nextgroup=plugSha
syn match plugSha /[0-9a-f]\{7,9}/ contained
syn match plugRelDate /([^)]*)$/ contained
syn match plugNotLoaded /(not loaded)$/
syn match plugError /^x.*/
syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
syn match plugH2 /^.*:\n-\+$/
syn match plugH2 /^-\{2,}/
syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
hi def link plug1 Title
hi def link plug2 Repeat
hi def link plugH2 Type
hi def link plugX Exception
hi def link plugBracket Structure
hi def link plugNumber Number
hi def link plugDash Special
hi def link plugPlus Constant
hi def link plugStar Boolean
hi def link plugMessage Function
hi def link plugName Label
hi def link plugInstall Function
hi def link plugUpdate Type
hi def link plugError Error
hi def link plugDeleted Ignore
hi def link plugRelDate Comment
hi def link plugEdge PreProc
hi def link plugSha Identifier
hi def link plugTag Constant
hi def link plugNotLoaded Comment
endfunction
function! s:lpad(str, len)
return a:str . repeat(' ', a:len - len(a:str))
endfunction
function! s:lines(msg)
return split(a:msg, "[\r\n]")
endfunction
function! s:lastline(msg)
return get(s:lines(a:msg), -1, '')
endfunction
function! s:new_window()
execute get(g:, 'plug_window', 'vertical topleft new')
endfunction
function! s:plug_window_exists()
let buflist = tabpagebuflist(s:plug_tab)
return !empty(buflist) && index(buflist, s:plug_buf) >= 0
endfunction
function! s:switch_in()
if !s:plug_window_exists()
return 0
endif
if winbufnr(0) != s:plug_buf
let s:pos = [tabpagenr(), winnr(), winsaveview()]
execute 'normal!' s:plug_tab.'gt'
let winnr = bufwinnr(s:plug_buf)
execute winnr.'wincmd w'
call add(s:pos, winsaveview())
else
let s:pos = [winsaveview()]
endif
setlocal modifiable
return 1
endfunction
function! s:switch_out(...)
call winrestview(s:pos[-1])
setlocal nomodifiable
if a:0 > 0
execute a:1
endif
if len(s:pos) > 1
execute 'normal!' s:pos[0].'gt'
execute s:pos[1] 'wincmd w'
call winrestview(s:pos[2])
endif
endfunction
function! s:finish_bindings()
nnoremap <silent> <buffer> R :call <SID>retry()<cr>
nnoremap <silent> <buffer> D :PlugDiff<cr>
nnoremap <silent> <buffer> S :PlugStatus<cr>
nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
endfunction
function! s:prepare(...)
if empty(s:plug_getcwd())
throw 'Invalid current working directory. Cannot proceed.'
endif
for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
if exists(evar)
throw evar.' detected. Cannot proceed.'
endif
endfor
call s:job_abort()
if s:switch_in()
if b:plug_preview == 1
pc
endif
enew
else
call s:new_window()
endif
nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
if a:0 == 0
call s:finish_bindings()
endif
let b:plug_preview = -1
let s:plug_tab = tabpagenr()
let s:plug_buf = winbufnr(0)
call s:assign_name()
for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
execute 'silent! unmap <buffer>' k
endfor
setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
if exists('+colorcolumn')
setlocal colorcolumn=
endif
setf vim-plug
if exists('g:syntax_on')
call s:syntax()
endif
endfunction
function! s:close_pane()
if b:plug_preview == 1
pc
let b:plug_preview = -1
else
bd
endif
endfunction
function! s:assign_name()
" Assign buffer name
let prefix = '[Plugins]'
let name = prefix
let idx = 2
while bufexists(name)
let name = printf('%s (%s)', prefix, idx)
let idx = idx + 1
endwhile
silent! execute 'f' fnameescape(name)
endfunction
function! s:chsh(swap)
let prev = [&shell, &shellcmdflag, &shellredir]
if !s:is_win
set shell=sh
endif
if a:swap
if s:is_powershell(&shell)
let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s'
elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$'
set shellredir=>%s\ 2>&1
endif
endif
return prev
endfunction
function! s:bang(cmd, ...)
let batchfile = ''
try
let [sh, shellcmdflag, shrd] = s:chsh(a:0)
" FIXME: Escaping is incomplete. We could use shellescape with eval,
" but it won't work on Windows.
let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
if s:is_win
let [batchfile, cmd] = s:batchfile(cmd)
endif
let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
execute "normal! :execute g:_plug_bang\<cr>\<cr>"
finally
unlet g:_plug_bang
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
if s:is_win && filereadable(batchfile)
call delete(batchfile)
endif
endtry
return v:shell_error ? 'Exit status: ' . v:shell_error : ''
endfunction
function! s:regress_bar()
let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
call s:progress_bar(2, bar, len(bar))
endfunction
function! s:is_updated(dir)
return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir))
endfunction
function! s:do(pull, force, todo)
for [name, spec] in items(a:todo)
if !isdirectory(spec.dir)
continue
endif
let installed = has_key(s:update.new, name)
let updated = installed ? 0 :
\ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
if a:force || installed || updated
execute 'cd' s:esc(spec.dir)
call append(3, '- Post-update hook for '. name .' ... ')
let error = ''
let type = type(spec.do)
if type == s:TYPE.string
if spec.do[0] == ':'
if !get(s:loaded, name, 0)
let s:loaded[name] = 1
call s:reorg_rtp()
endif
call s:load_plugin(spec)
try
execute spec.do[1:]
catch
let error = v:exception
endtry
if !s:plug_window_exists()
cd -
throw 'Warning: vim-plug was terminated by the post-update hook of '.name
endif
else
let error = s:bang(spec.do)
endif
elseif type == s:TYPE.funcref
try
call s:load_plugin(spec)
let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
call spec.do({ 'name': name, 'status': status, 'force': a:force })
catch
let error = v:exception
endtry
else
let error = 'Invalid hook type'
endif
call s:switch_in()
call setline(4, empty(error) ? (getline(4) . 'OK')
\ : ('x' . getline(4)[1:] . error))
if !empty(error)
call add(s:update.errors, name)
call s:regress_bar()
endif
cd -
endif
endfor
endfunction
function! s:hash_match(a, b)
return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
endfunction
function! s:checkout(spec)
let sha = a:spec.commit
let output = s:git_revision(a:spec.dir)
if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
let output = s:system(
\ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
endif
return output
endfunction
function! s:finish(pull)
let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
if new_frozen
let s = new_frozen > 1 ? 's' : ''
call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
endif
call append(3, '- Finishing ... ') | 4
redraw
call plug#helptags()
call plug#end()
call setline(4, getline(4) . 'Done!')
redraw
let msgs = []
if !empty(s:update.errors)
call add(msgs, "Press 'R' to retry.")
endif
if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
\ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
call add(msgs, "Press 'D' to see the updated changes.")
endif
echo join(msgs, ' ')
call s:finish_bindings()
endfunction
function! s:retry()
if empty(s:update.errors)
return
endif
echo
call s:update_impl(s:update.pull, s:update.force,
\ extend(copy(s:update.errors), [s:update.threads]))
endfunction
function! s:is_managed(name)
return has_key(g:plugs[a:name], 'uri')
endfunction
function! s:names(...)
return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
endfunction
function! s:check_ruby()
silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
if !exists('g:plug_ruby')
redraw!
return s:warn('echom', 'Warning: Ruby interface is broken')
endif
let ruby_version = split(g:plug_ruby, '\.')
unlet g:plug_ruby
return s:version_requirement(ruby_version, [1, 8, 7])
endfunction
function! s:update_impl(pull, force, args) abort
let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
let args = filter(copy(a:args), 'v:val != "--sync"')
let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
\ remove(args, -1) : get(g:, 'plug_threads', 16)
let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
\ filter(managed, 'index(args, v:key) >= 0')
if empty(todo)
return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
endif
if !s:is_win && s:git_version_requirement(2, 3)
let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
let $GIT_TERMINAL_PROMPT = 0
for plug in values(todo)
let plug.uri = substitute(plug.uri,
\ '^https://git::@github\.com', 'https://github.com', '')
endfor
endif
if !isdirectory(g:plug_home)
try
call mkdir(g:plug_home, 'p')
catch
return s:err(printf('Invalid plug directory: %s. '.
\ 'Try to call plug#begin with a valid directory', g:plug_home))
endtry
endif
if has('nvim') && !exists('*jobwait') && threads > 1
call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
endif
let use_job = s:nvim || s:vim8
let python = (has('python') || has('python3')) && !use_job
let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby()
let s:update = {
\ 'start': reltime(),
\ 'all': todo,
\ 'todo': copy(todo),
\ 'errors': [],
\ 'pull': a:pull,
\ 'force': a:force,
\ 'new': {},
\ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
\ 'bar': '',
\ 'fin': 0
\ }
call s:prepare(1)
call append(0, ['', ''])
normal! 2G
silent! redraw
" Set remote name, overriding a possible user git config's clone.defaultRemoteName
let s:clone_opt = ['--origin', 'origin']
if get(g:, 'plug_shallow', 1)
call extend(s:clone_opt, ['--depth', '1'])
if s:git_version_requirement(1, 7, 10)
call add(s:clone_opt, '--no-single-branch')
endif
endif
if has('win32unix') || has('wsl')
call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input'])
endif
let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
" Python version requirement (>= 2.7)
if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
redir => pyv
silent python import platform; print platform.python_version()
redir END
let python = s:version_requirement(
\ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
endif
if (python || ruby) && s:update.threads > 1
try
let imd = &imd
if s:mac_gui
set noimd
endif
if ruby
call s:update_ruby()
else
call s:update_python()
endif
catch
let lines = getline(4, '$')
let printed = {}
silent! 4,$d _
for line in lines
let name = s:extract_name(line, '.', '')
if empty(name) || !has_key(printed, name)
call append('$', line)
if !empty(name)
let printed[name] = 1
if line[0] == 'x' && index(s:update.errors, name) < 0
call add(s:update.errors, name)
end
endif
endif
endfor
finally
let &imd = imd
call s:update_finish()
endtry
else
call s:update_vim()
while use_job && sync
sleep 100m
if s:update.fin
break
endif
endwhile
endif
endfunction
function! s:log4(name, msg)
call setline(4, printf('- %s (%s)', a:msg, a:name))
redraw
endfunction
function! s:update_finish()
if exists('s:git_terminal_prompt')
let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
endif
if s:switch_in()
call append(3, '- Updating ...') | 4
for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))'))
let [pos, _] = s:logpos(name)
if !pos
continue
endif
if has_key(spec, 'commit')
call s:log4(name, 'Checking out '.spec.commit)
let out = s:checkout(spec)
elseif has_key(spec, 'tag')
let tag = spec.tag
if tag =~ '\*'
let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
if !v:shell_error && !empty(tags)
let tag = tags[0]
call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
call append(3, '')
endif
endif
call s:log4(name, 'Checking out '.tag)
let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
else
let branch = s:git_origin_branch(spec)
call s:log4(name, 'Merging origin/'.s:esc(branch))
let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1'
\. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir)
endif
if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
\ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
call s:log4(name, 'Updating submodules. This may take a while.')
let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
endif
let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
if v:shell_error
call add(s:update.errors, name)
call s:regress_bar()
silent execute pos 'd _'
call append(4, msg) | 4
elseif !empty(out)
call setline(pos, msg[0])
endif
redraw
endfor
silent 4 d _
try
call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")'))
catch
call s:warn('echom', v:exception)
call s:warn('echo', '')
return
endtry
call s:finish(s:update.pull)
call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
call s:switch_out('normal! gg')
endif
endfunction
function! s:job_abort()
if (!s:nvim && !s:vim8) || !exists('s:jobs')
return
endif
for [name, j] in items(s:jobs)
if s:nvim
silent! call jobstop(j.jobid)
elseif s:vim8
silent! call job_stop(j.jobid)
endif
if j.new
call s:rm_rf(g:plugs[name].dir)
endif
endfor
let s:jobs = {}
endfunction
function! s:last_non_empty_line(lines)
let len = len(a:lines)
for idx in range(len)
let line = a:lines[len-idx-1]
if !empty(line)
return line
endif
endfor
return ''
endfunction
function! s:job_out_cb(self, data) abort
let self = a:self
let data = remove(self.lines, -1) . a:data
let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
call extend(self.lines, lines)
" To reduce the number of buffer updates
let self.tick = get(self, 'tick', -1) + 1
if !self.running || self.tick % len(s:jobs) == 0
let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
call s:log(bullet, self.name, result)
endif
endfunction
function! s:job_exit_cb(self, data) abort
let a:self.running = 0
let a:self.error = a:data != 0
call s:reap(a:self.name)
call s:tick()
endfunction
function! s:job_cb(fn, job, ch, data)
if !s:plug_window_exists() " plug window closed
return s:job_abort()
endif
call call(a:fn, [a:job, a:data])
endfunction
function! s:nvim_cb(job_id, data, event) dict abort
return (a:event == 'stdout' || a:event == 'stderr') ?
\ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
\ s:job_cb('s:job_exit_cb', self, 0, a:data)
endfunction
function! s:spawn(name, cmd, opts)
let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
\ 'new': get(a:opts, 'new', 0) }
let s:jobs[a:name] = job
if s:nvim
if has_key(a:opts, 'dir')
let job.cwd = a:opts.dir
endif
let argv = a:cmd
call extend(job, {
\ 'on_stdout': function('s:nvim_cb'),
\ 'on_stderr': function('s:nvim_cb'),
\ 'on_exit': function('s:nvim_cb'),
\ })
let jid = s:plug_call('jobstart', argv, job)
if jid > 0
let job.jobid = jid
else
let job.running = 0
let job.error = 1
let job.lines = [jid < 0 ? argv[0].' is not executable' :
\ 'Invalid arguments (or job table is full)']
endif
elseif s:vim8
let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})'))
if has_key(a:opts, 'dir')
let cmd = s:with_cd(cmd, a:opts.dir, 0)
endif
let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
\ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
\ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]),
\ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
\ 'err_mode': 'raw',
\ 'out_mode': 'raw'
\})
if job_status(jid) == 'run'
let job.jobid = jid
else
let job.running = 0
let job.error = 1
let job.lines = ['Failed to start job']
endif
else
let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]))
let job.error = v:shell_error != 0
let job.running = 0
endif
endfunction
function! s:reap(name)
let job = s:jobs[a:name]
if job.error
call add(s:update.errors, a:name)
elseif get(job, 'new', 0)
let s:update.new[a:name] = 1
endif
let s:update.bar .= job.error ? 'x' : '='
let bullet = job.error ? 'x' : '-'
let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
call s:log(bullet, a:name, empty(result) ? 'OK' : result)
call s:bar()
call remove(s:jobs, a:name)
endfunction
function! s:bar()
if s:switch_in()
let total = len(s:update.all)
call setline(1, (s:update.pull ? 'Updating' : 'Installing').
\ ' plugins ('.len(s:update.bar).'/'.total.')')
call s:progress_bar(2, s:update.bar, total)
call s:switch_out()
endif
endfunction
function! s:logpos(name)
let max = line('$')
for i in range(4, max > 4 ? max : 4)
if getline(i) =~# '^[-+x*] '.a:name.':'
for j in range(i + 1, max > 5 ? max : 5)
if getline(j) !~ '^ '
return [i, j - 1]
endif
endfor
return [i, i]
endif
endfor
return [0, 0]
endfunction
function! s:log(bullet, name, lines)
if s:switch_in()
let [b, e] = s:logpos(a:name)
if b > 0
silent execute printf('%d,%d d _', b, e)
if b > winheight('.')
let b = 4
endif
else
let b = 4
endif
" FIXME For some reason, nomodifiable is set after :d in vim8
setlocal modifiable
call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
call s:switch_out()
endif
endfunction
function! s:update_vim()
let s:jobs = {}
call s:bar()
call s:tick()
endfunction
function! s:tick()
let pull = s:update.pull
let prog = s:progress_opt(s:nvim || s:vim8)
while 1 " Without TCO, Vim stack is bound to explode
if empty(s:update.todo)
if empty(s:jobs) && !s:update.fin
call s:update_finish()
let s:update.fin = 1
endif
return
endif
let name = keys(s:update.todo)[0]
let spec = remove(s:update.todo, name)
let new = empty(globpath(spec.dir, '.git', 1))
call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
redraw
let has_tag = has_key(spec, 'tag')
if !new
let [error, _] = s:git_validate(spec, 0)
if empty(error)
if pull
let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
call extend(cmd, ['--depth', '99999999'])
endif
if !empty(prog)
call add(cmd, prog)
endif
call s:spawn(name, cmd, { 'dir': spec.dir })
else
let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
endif
else
let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
endif
else
let cmd = ['git', 'clone']
if !has_tag
call extend(cmd, s:clone_opt)
endif
if !empty(prog)
call add(cmd, prog)
endif
call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 })
endif
if !s:jobs[name].running
call s:reap(name)
endif
if len(s:jobs) >= s:update.threads
break
endif
endwhile
endfunction
function! s:update_python()
let py_exe = has('python') ? 'python' : 'python3'
execute py_exe "<< EOF"
import datetime
import functools
import os
try:
import queue
except ImportError:
import Queue as queue
import random
import re
import shutil
import signal
import subprocess
import tempfile
import threading as thr
import time
import traceback
import vim
G_NVIM = vim.eval("has('nvim')") == '1'
G_PULL = vim.eval('s:update.pull') == '1'
G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt'))
G_PROGRESS = vim.eval('s:progress_opt(1)')
G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
G_STOP = thr.Event()
G_IS_WIN = vim.eval('s:is_win') == '1'
class PlugError(Exception):
def __init__(self, msg):
self.msg = msg
class CmdTimedOut(PlugError):
pass
class CmdFailed(PlugError):
pass
class InvalidURI(PlugError):
pass
class Action(object):
INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
class Buffer(object):
def __init__(self, lock, num_plugs, is_pull):
self.bar = ''
self.event = 'Updating' if is_pull else 'Installing'
self.lock = lock
self.maxy = int(vim.eval('winheight(".")'))
self.num_plugs = num_plugs
def __where(self, name):
""" Find first line with name in current buffer. Return line num. """
found, lnum = False, 0
matcher = re.compile('^[-+x*] {0}:'.format(name))
for line in vim.current.buffer:
if matcher.search(line) is not None:
found = True
break
lnum += 1
if not found:
lnum = -1
return lnum
def header(self):
curbuf = vim.current.buffer
curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
num_spaces = self.num_plugs - len(self.bar)
curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
with self.lock:
vim.command('normal! 2G')
vim.command('redraw')
def write(self, action, name, lines):
first, rest = lines[0], lines[1:]
msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
msg.extend([' ' + line for line in rest])
try:
if action == Action.ERROR:
self.bar += 'x'
vim.command("call add(s:update.errors, '{0}')".format(name))
elif action == Action.DONE:
self.bar += '='
curbuf = vim.current.buffer
lnum = self.__where(name)
if lnum != -1: # Found matching line num
del curbuf[lnum]
if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
lnum = 3
else:
lnum = 3
curbuf.append(msg, lnum)
self.header()
except vim.error:
pass
class Command(object):
CD = 'cd /d' if G_IS_WIN else 'cd'
def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
self.cmd = cmd
if cmd_dir:
self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
self.timeout = timeout
self.callback = cb if cb else (lambda msg: None)
self.clean = clean if clean else (lambda: None)
self.proc = None
@property
def alive(self):
""" Returns true only if command still running. """
return self.proc and self.proc.poll() is None
def execute(self, ntries=3):
""" Execute the command with ntries if CmdTimedOut.
Returns the output of the command if no Exception.
"""
attempt, finished, limit = 0, False, self.timeout
while not finished:
try:
attempt += 1
result = self.try_command()
finished = True
return result
except CmdTimedOut:
if attempt != ntries:
self.notify_retry()
self.timeout += limit
else:
raise
def notify_retry(self):
""" Retry required for command, notify user. """
for count in range(3, 0, -1):
if G_STOP.is_set():
raise KeyboardInterrupt
msg = 'Timeout. Will retry in {0} second{1} ...'.format(
count, 's' if count != 1 else '')
self.callback([msg])
time.sleep(1)
self.callback(['Retrying ...'])
def try_command(self):
""" Execute a cmd & poll for callback. Returns list of output.
Raises CmdFailed -> return code for Popen isn't 0
Raises CmdTimedOut -> command exceeded timeout without new output
"""
first_line = True
try:
tfile = tempfile.NamedTemporaryFile(mode='w+b')
preexec_fn = not G_IS_WIN and os.setsid or None
self.proc = subprocess.Popen(self.cmd, stdout=tfile,
stderr=subprocess.STDOUT,
stdin=subprocess.PIPE, shell=True,
preexec_fn=preexec_fn)
thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
thrd.start()
thread_not_started = True
while thread_not_started:
try:
thrd.join(0.1)
thread_not_started = False
except RuntimeError:
pass
while self.alive:
if G_STOP.is_set():
raise KeyboardInterrupt
if first_line or random.random() < G_LOG_PROB:
first_line = False
line = '' if G_IS_WIN else nonblock_read(tfile.name)
if line:
self.callback([line])
time_diff = time.time() - os.path.getmtime(tfile.name)
if time_diff > self.timeout:
raise CmdTimedOut(['Timeout!'])
thrd.join(0.5)
tfile.seek(0)
result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
if self.proc.returncode != 0:
raise CmdFailed([''] + result)
return result
except:
self.terminate()
raise
def terminate(self):
""" Terminate process and cleanup. """
if self.alive:
if G_IS_WIN:
os.kill(self.proc.pid, signal.SIGINT)
else:
os.killpg(self.proc.pid, signal.SIGTERM)
self.clean()
class Plugin(object):
def __init__(self, name, args, buf_q, lock):
self.name = name
self.args = args
self.buf_q = buf_q
self.lock = lock
self.tag = args.get('tag', 0)
def manage(self):
try:
if os.path.exists(self.args['dir']):
self.update()
else:
self.install()
with self.lock:
thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
except PlugError as exc:
self.write(Action.ERROR, self.name, exc.msg)
except KeyboardInterrupt:
G_STOP.set()
self.write(Action.ERROR, self.name, ['Interrupted!'])
except:
# Any exception except those above print stack trace
msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
self.write(Action.ERROR, self.name, msg.split('\n'))
raise
def install(self):
target = self.args['dir']
if target[-1] == '\\':
target = target[0:-1]
def clean(target):
def _clean():
try:
shutil.rmtree(target)
except OSError:
pass
return _clean
self.write(Action.INSTALL, self.name, ['Installing ...'])
callback = functools.partial(self.write, Action.INSTALL, self.name)
cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
'' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
esc(target))
com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
result = com.execute(G_RETRIES)
self.write(Action.DONE, self.name, result[-1:])
def repo_uri(self):
cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
command = Command(cmd, self.args['dir'], G_TIMEOUT,)
result = command.execute(G_RETRIES)
return result[-1]
def update(self):
actual_uri = self.repo_uri()
expect_uri = self.args['uri']
regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
ma = regex.match(actual_uri)
mb = regex.match(expect_uri)
if ma is None or mb is None or ma.groups() != mb.groups():
msg = ['',
'Invalid URI: {0}'.format(actual_uri),
'Expected {0}'.format(expect_uri),
'PlugClean required.']
raise InvalidURI(msg)
if G_PULL:
self.write(Action.UPDATE, self.name, ['Updating ...'])
callback = functools.partial(self.write, Action.UPDATE, self.name)
fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
result = com.execute(G_RETRIES)
self.write(Action.DONE, self.name, result[-1:])
else:
self.write(Action.DONE, self.name, ['Already installed'])
def write(self, action, name, msg):
self.buf_q.put((action, name, msg))
class PlugThread(thr.Thread):
def __init__(self, tname, args):
super(PlugThread, self).__init__()
self.tname = tname
self.args = args
def run(self):
thr.current_thread().name = self.tname
buf_q, work_q, lock = self.args
try:
while not G_STOP.is_set():
name, args = work_q.get_nowait()
plug = Plugin(name, args, buf_q, lock)
plug.manage()
work_q.task_done()
except queue.Empty:
pass
class RefreshThread(thr.Thread):
def __init__(self, lock):
super(RefreshThread, self).__init__()
self.lock = lock
self.running = True
def run(self):
while self.running:
with self.lock:
thread_vim_command('noautocmd normal! a')
time.sleep(0.33)
def stop(self):
self.running = False
if G_NVIM:
def thread_vim_command(cmd):
vim.session.threadsafe_call(lambda: vim.command(cmd))
else:
def thread_vim_command(cmd):
vim.command(cmd)
def esc(name):
return '"' + name.replace('"', '\"') + '"'
def nonblock_read(fname):
""" Read a file with nonblock flag. Return the last line. """
fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
buf = os.read(fread, 100000).decode('utf-8', 'replace')
os.close(fread)
line = buf.rstrip('\r\n')
left = max(line.rfind('\r'), line.rfind('\n'))
if left != -1:
left += 1
line = line[left:]
return line
def main():
thr.current_thread().name = 'main'
nthreads = int(vim.eval('s:update.threads'))
plugs = vim.eval('s:update.todo')
mac_gui = vim.eval('s:mac_gui') == '1'
lock = thr.Lock()
buf = Buffer(lock, len(plugs), G_PULL)
buf_q, work_q = queue.Queue(), queue.Queue()
for work in plugs.items():
work_q.put(work)
start_cnt = thr.active_count()
for num in range(nthreads):
tname = 'PlugT-{0:02}'.format(num)
thread = PlugThread(tname, (buf_q, work_q, lock))
thread.start()
if mac_gui:
rthread = RefreshThread(lock)
rthread.start()
while not buf_q.empty() or thr.active_count() != start_cnt:
try:
action, name, msg = buf_q.get(True, 0.25)
buf.write(action, name, ['OK'] if not msg else msg)
buf_q.task_done()
except queue.Empty:
pass
except KeyboardInterrupt:
G_STOP.set()
if mac_gui:
rthread.stop()
rthread.join()
main()
EOF
endfunction
function! s:update_ruby()
ruby << EOF
module PlugStream
SEP = ["\r", "\n", nil]
def get_line
buffer = ''
loop do
char = readchar rescue return
if SEP.include? char.chr
buffer << $/
break
else
buffer << char
end
end
buffer
end
end unless defined?(PlugStream)
def esc arg
%["#{arg.gsub('"', '\"')}"]
end
def killall pid
pids = [pid]
if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
else
unless `which pgrep 2> /dev/null`.empty?
children = pids
until children.empty?
children = children.map { |pid|
`pgrep -P #{pid}`.lines.map { |l| l.chomp }
}.flatten
pids += children
end
end
pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
end
end
def compare_git_uri a, b
regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
end
require 'thread'
require 'fileutils'
require 'timeout'
running = true
iswin = VIM::evaluate('s:is_win').to_i == 1
pull = VIM::evaluate('s:update.pull').to_i == 1
base = VIM::evaluate('g:plug_home')
all = VIM::evaluate('s:update.todo')
limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
nthr = VIM::evaluate('s:update.threads').to_i
maxy = VIM::evaluate('winheight(".")').to_i
vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
cd = iswin ? 'cd /d' : 'cd'
tot = VIM::evaluate('len(s:update.todo)') || 0
bar = ''
skip = 'Already installed'
mtx = Mutex.new
take1 = proc { mtx.synchronize { running && all.shift } }
logh = proc {
cnt = bar.length
$curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
$curbuf[2] = '[' + bar.ljust(tot) + ']'
VIM::command('normal! 2G')
VIM::command('redraw')
}
where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
log = proc { |name, result, type|
mtx.synchronize do
ing = ![true, false].include?(type)
bar += type ? '=' : 'x' unless ing
b = case type
when :install then '+' when :update then '*'
when true, nil then '-' else
VIM::command("call add(s:update.errors, '#{name}')")
'x'
end
result =
if type || type.nil?
["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
elsif result =~ /^Interrupted|^Timeout/
["#{b} #{name}: #{result}"]
else
["#{b} #{name}"] + result.lines.map { |l| " " << l }
end
if lnum = where.call(name)
$curbuf.delete lnum
lnum = 4 if ing && lnum > maxy
end
result.each_with_index do |line, offset|
$curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
end
logh.call
end
}
bt = proc { |cmd, name, type, cleanup|
tried = timeout = 0
begin
tried += 1
timeout += limit
fd = nil
data = ''
if iswin
Timeout::timeout(timeout) do
tmp = VIM::evaluate('tempname()')
system("(#{cmd}) > #{tmp}")
data = File.read(tmp).chomp
File.unlink tmp rescue nil
end
else
fd = IO.popen(cmd).extend(PlugStream)
first_line = true
log_prob = 1.0 / nthr
while line = Timeout::timeout(timeout) { fd.get_line }
data << line
log.call name, line.chomp, type if name && (first_line || rand < log_prob)
first_line = false
end
fd.close
end
[$? == 0, data.chomp]
rescue Timeout::Error, Interrupt => e
if fd && !fd.closed?
killall fd.pid
fd.close
end
cleanup.call if cleanup
if e.is_a?(Timeout::Error) && tried < tries
3.downto(1) do |countdown|
s = countdown > 1 ? 's' : ''
log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
sleep 1
end
log.call name, 'Retrying ...', type
retry
end
[false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
end
}
main = Thread.current
threads = []
watcher = Thread.new {
if vim7
while VIM::evaluate('getchar(1)')
sleep 0.1
end
else
require 'io/console' # >= Ruby 1.9
nil until IO.console.getch == 3.chr
end
mtx.synchronize do
running = false
threads.each { |t| t.raise Interrupt } unless vim7
end
threads.each { |t| t.join rescue nil }
main.kill
}
refresh = Thread.new {
while true
mtx.synchronize do
break unless running
VIM::command('noautocmd normal! a')
end
sleep 0.2
end
} if VIM::evaluate('s:mac_gui') == 1
clone_opt = VIM::evaluate('s:clone_opt').join(' ')
progress = VIM::evaluate('s:progress_opt(1)')
nthr.times do
mtx.synchronize do
threads << Thread.new {
while pair = take1.call
name = pair.first
dir, uri, tag = pair.last.values_at *%w[dir uri tag]
exists = File.directory? dir
ok, result =
if exists
chdir = "#{cd} #{iswin ? dir : esc(dir)}"
ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
current_uri = data.lines.to_a.last
if !ret
if data =~ /^Interrupted|^Timeout/
[false, data]
else
[false, [data.chomp, "PlugClean required."].join($/)]
end
elsif !compare_git_uri(current_uri, uri)
[false, ["Invalid URI: #{current_uri}",
"Expected: #{uri}",
"PlugClean required."].join($/)]
else
if pull
log.call name, 'Updating ...', :update
fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
else
[true, skip]
end
end
else
d = esc dir.sub(%r{[\\/]+$}, '')
log.call name, 'Installing ...', :install
bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
FileUtils.rm_rf dir
}
end
mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
log.call name, result, ok
end
} if running
end
end
threads.each { |t| t.join rescue nil }
logh.call
refresh.kill if refresh
watcher.kill
EOF
endfunction
function! s:shellesc_cmd(arg, script)
let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
endfunction
function! s:shellesc_ps1(arg)
return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
endfunction
function! s:shellesc_sh(arg)
return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
endfunction
" Escape the shell argument based on the shell.
" Vim and Neovim's shellescape() are insufficient.
" 1. shellslash determines whether to use single/double quotes.
" Double-quote escaping is fragile for cmd.exe.
" 2. It does not work for powershell.
" 3. It does not work for *sh shells if the command is executed
" via cmd.exe (ie. cmd.exe /c sh -c command command_args)
" 4. It does not support batchfile syntax.
"
" Accepts an optional dictionary with the following keys:
" - shell: same as Vim/Neovim 'shell' option.
" If unset, fallback to 'cmd.exe' on Windows or 'sh'.
" - script: If truthy and shell is cmd.exe, escape for batchfile syntax.
function! plug#shellescape(arg, ...)
if a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
return a:arg
endif
let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
let script = get(opts, 'script', 1)
if shell =~# 'cmd\(\.exe\)\?$'
return s:shellesc_cmd(a:arg, script)
elseif s:is_powershell(shell)
return s:shellesc_ps1(a:arg)
endif
return s:shellesc_sh(a:arg)
endfunction
function! s:glob_dir(path)
return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
endfunction
function! s:progress_bar(line, bar, total)
call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
endfunction
function! s:compare_git_uri(a, b)
" See `git help clone'
" https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
" [git@] github.com[:port] : junegunn/vim-plug [.git]
" file:// / junegunn/vim-plug [/]
" / junegunn/vim-plug [/]
let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
let ma = matchlist(a:a, pat)
let mb = matchlist(a:b, pat)
return ma[1:2] ==# mb[1:2]
endfunction
function! s:format_message(bullet, name, message)
if a:bullet != 'x'
return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
else
let lines = map(s:lines(a:message), '" ".v:val')
return extend([printf('x %s:', a:name)], lines)
endif
endfunction
function! s:with_cd(cmd, dir, ...)
let script = a:0 > 0 ? a:1 : 1
return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
endfunction
function! s:system(cmd, ...)
let batchfile = ''
try
let [sh, shellcmdflag, shrd] = s:chsh(1)
if type(a:cmd) == s:TYPE.list
" Neovim's system() supports list argument to bypass the shell
" but it cannot set the working directory for the command.
" Assume that the command does not rely on the shell.
if has('nvim') && a:0 == 0
return system(a:cmd)
endif
let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
if s:is_powershell(&shell)
let cmd = '& ' . cmd
endif
else
let cmd = a:cmd
endif
if a:0 > 0
let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list)
endif
if s:is_win && type(a:cmd) != s:TYPE.list
let [batchfile, cmd] = s:batchfile(cmd)
endif
return system(cmd)
finally
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
if s:is_win && filereadable(batchfile)
call delete(batchfile)
endif
endtry
endfunction
function! s:system_chomp(...)
let ret = call('s:system', a:000)
return v:shell_error ? '' : substitute(ret, '\n$', '', '')
endfunction
function! s:git_validate(spec, check_branch)
let err = ''
if isdirectory(a:spec.dir)
let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
let remote = result[-1]
if empty(remote)
let err = join([remote, 'PlugClean required.'], "\n")
elseif !s:compare_git_uri(remote, a:spec.uri)
let err = join(['Invalid URI: '.remote,
\ 'Expected: '.a:spec.uri,
\ 'PlugClean required.'], "\n")
elseif a:check_branch && has_key(a:spec, 'commit')
let sha = s:git_revision(a:spec.dir)
if empty(sha)
let err = join(add(result, 'PlugClean required.'), "\n")
elseif !s:hash_match(sha, a:spec.commit)
let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
\ a:spec.commit[:6], sha[:6]),
\ 'PlugUpdate required.'], "\n")
endif
elseif a:check_branch
let current_branch = result[0]
" Check tag
let origin_branch = s:git_origin_branch(a:spec)
if has_key(a:spec, 'tag')
let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
if a:spec.tag !=# tag && a:spec.tag !~ '\*'
let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
\ (empty(tag) ? 'N/A' : tag), a:spec.tag)
endif
" Check branch
elseif origin_branch !=# current_branch
let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
\ current_branch, origin_branch)
endif
if empty(err)
let [ahead, behind] = split(s:lastline(s:system([
\ 'git', 'rev-list', '--count', '--left-right',
\ printf('HEAD...origin/%s', origin_branch)
\ ], a:spec.dir)), '\t')
if !v:shell_error && ahead
if behind
" Only mention PlugClean if diverged, otherwise it's likely to be
" pushable (and probably not that messed up).
let err = printf(
\ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
\ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
else
let err = printf("Ahead of origin/%s by %d commit(s).\n"
\ .'Cannot update until local changes are pushed.',
\ origin_branch, ahead)
endif
endif
endif
endif
else
let err = 'Not found'
endif
return [err, err =~# 'PlugClean']
endfunction
function! s:rm_rf(dir)
if isdirectory(a:dir)
return s:system(s:is_win
\ ? 'rmdir /S /Q '.plug#shellescape(a:dir)
\ : ['rm', '-rf', a:dir])
endif
endfunction
function! s:clean(force)
call s:prepare()
call append(0, 'Searching for invalid plugins in '.g:plug_home)
call append(1, '')
" List of valid directories
let dirs = []
let errs = {}
let [cnt, total] = [0, len(g:plugs)]
for [name, spec] in items(g:plugs)
if !s:is_managed(name)
call add(dirs, spec.dir)
else
let [err, clean] = s:git_validate(spec, 1)
if clean
let errs[spec.dir] = s:lines(err)[0]
else
call add(dirs, spec.dir)
endif
endif
let cnt += 1
call s:progress_bar(2, repeat('=', cnt), total)
normal! 2G
redraw
endfor
let allowed = {}
for dir in dirs
let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
let allowed[dir] = 1
for child in s:glob_dir(dir)
let allowed[child] = 1
endfor
endfor
let todo = []
let found = sort(s:glob_dir(g:plug_home))
while !empty(found)
let f = remove(found, 0)
if !has_key(allowed, f) && isdirectory(f)
call add(todo, f)
call append(line('$'), '- ' . f)
if has_key(errs, f)
call append(line('$'), ' ' . errs[f])
endif
let found = filter(found, 'stridx(v:val, f) != 0')
end
endwhile
4
redraw
if empty(todo)
call append(line('$'), 'Already clean.')
else
let s:clean_count = 0
call append(3, ['Directories to delete:', ''])
redraw!
if a:force || s:ask_no_interrupt('Delete all directories?')
call s:delete([6, line('$')], 1)
else
call setline(4, 'Cancelled.')
nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
nmap <silent> <buffer> dd d_
xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
echo 'Delete the lines (d{motion}) to delete the corresponding directories'
endif
endif
4
setlocal nomodifiable
endfunction
function! s:delete_op(type, ...)
call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
endfunction
function! s:delete(range, force)
let [l1, l2] = a:range
let force = a:force
let err_count = 0
while l1 <= l2
let line = getline(l1)
if line =~ '^- ' && isdirectory(line[2:])
execute l1
redraw!
let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
let force = force || answer > 1
if answer
let err = s:rm_rf(line[2:])
setlocal modifiable
if empty(err)
call setline(l1, '~'.line[1:])
let s:clean_count += 1
else
delete _
call append(l1 - 1, s:format_message('x', line[1:], err))
let l2 += len(s:lines(err))
let err_count += 1
endif
let msg = printf('Removed %d directories.', s:clean_count)
if err_count > 0
let msg .= printf(' Failed to remove %d directories.', err_count)
endif
call setline(4, msg)
setlocal nomodifiable
endif
endif
let l1 += 1
endwhile
endfunction
function! s:upgrade()
echo 'Downloading the latest version of vim-plug'
redraw
let tmp = s:plug_tempname()
let new = tmp . '/plug.vim'
try
let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp])
if v:shell_error
return s:err('Error upgrading vim-plug: '. out)
endif
if readfile(s:me) ==# readfile(new)
echo 'vim-plug is already up-to-date'
return 0
else
call rename(s:me, s:me . '.old')
call rename(new, s:me)
unlet g:loaded_plug
echo 'vim-plug has been upgraded'
return 1
endif
finally
silent! call s:rm_rf(tmp)
endtry
endfunction
function! s:upgrade_specs()
for spec in values(g:plugs)
let spec.frozen = get(spec, 'frozen', 0)
endfor
endfunction
function! s:status()
call s:prepare()
call append(0, 'Checking plugins')
call append(1, '')
let ecnt = 0
let unloaded = 0
let [cnt, total] = [0, len(g:plugs)]
for [name, spec] in items(g:plugs)
let is_dir = isdirectory(spec.dir)
if has_key(spec, 'uri')
if is_dir
let [err, _] = s:git_validate(spec, 1)
let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
else
let [valid, msg] = [0, 'Not found. Try PlugInstall.']
endif
else
if is_dir
let [valid, msg] = [1, 'OK']
else
let [valid, msg] = [0, 'Not found.']
endif
endif
let cnt += 1
let ecnt += !valid
" `s:loaded` entry can be missing if PlugUpgraded
if is_dir && get(s:loaded, name, -1) == 0
let unloaded = 1
let msg .= ' (not loaded)'
endif
call s:progress_bar(2, repeat('=', cnt), total)
call append(3, s:format_message(valid ? '-' : 'x', name, msg))
normal! 2G
redraw
endfor
call setline(1, 'Finished. '.ecnt.' error(s).')
normal! gg
setlocal nomodifiable
if unloaded
echo "Press 'L' on each line to load plugin, or 'U' to update"
nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
end
endfunction
function! s:extract_name(str, prefix, suffix)
return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
endfunction
function! s:status_load(lnum)
let line = getline(a:lnum)
let name = s:extract_name(line, '-', '(not loaded)')
if !empty(name)
call plug#load(name)
setlocal modifiable
call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
setlocal nomodifiable
endif
endfunction
function! s:status_update() range
let lines = getline(a:firstline, a:lastline)
let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
if !empty(names)
echo
execute 'PlugUpdate' join(names)
endif
endfunction
function! s:is_preview_window_open()
silent! wincmd P
if &previewwindow
wincmd p
return 1
endif
endfunction
function! s:find_name(lnum)
for lnum in reverse(range(1, a:lnum))
let line = getline(lnum)
if empty(line)
return ''
endif
let name = s:extract_name(line, '-', '')
if !empty(name)
return name
endif
endfor
return ''
endfunction
function! s:preview_commit()
if b:plug_preview < 0
let b:plug_preview = !s:is_preview_window_open()
endif
let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
if empty(sha)
let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$')
if empty(name)
return
endif
let title = 'HEAD@{1}..'
let command = 'git diff --no-color HEAD@{1}'
else
let title = sha
let command = 'git show --no-color --pretty=medium '.sha
let name = s:find_name(line('.'))
endif
if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
return
endif
if exists('g:plug_pwindow') && !s:is_preview_window_open()
execute g:plug_pwindow
execute 'e' title
else
execute 'pedit' title
wincmd P
endif
setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable
let batchfile = ''
try
let [sh, shellcmdflag, shrd] = s:chsh(1)
let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command
if s:is_win
let [batchfile, cmd] = s:batchfile(cmd)
endif
execute 'silent %!' cmd
finally
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
if s:is_win && filereadable(batchfile)
call delete(batchfile)
endif
endtry
setlocal nomodifiable
nnoremap <silent> <buffer> q :q<cr>
wincmd p
endfunction
function! s:section(flags)
call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
endfunction
function! s:format_git_log(line)
let indent = ' '
let tokens = split(a:line, nr2char(1))
if len(tokens) != 5
return indent.substitute(a:line, '\s*$', '', '')
endif
let [graph, sha, refs, subject, date] = tokens
let tag = matchstr(refs, 'tag: [^,)]\+')
let tag = empty(tag) ? ' ' : ' ('.tag.') '
return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
endfunction
function! s:append_ul(lnum, text)
call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
endfunction
function! s:diff()
call s:prepare()
call append(0, ['Collecting changes ...', ''])
let cnts = [0, 0]
let bar = ''
let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
call s:progress_bar(2, bar, len(total))
for origin in [1, 0]
let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
if empty(plugs)
continue
endif
call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
for [k, v] in plugs
let branch = s:git_origin_branch(v)
if len(branch)
let range = origin ? '..origin/'.branch : 'HEAD@{1}..'
let cmd = ['git', 'log', '--graph', '--color=never']
if s:git_version_requirement(2, 10, 0)
call add(cmd, '--no-show-signature')
endif
call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range])
if has_key(v, 'rtp')
call extend(cmd, ['--', v.rtp])
endif
let diff = s:system_chomp(cmd, v.dir)
if !empty(diff)
let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
let cnts[origin] += 1
endif
endif
let bar .= '='
call s:progress_bar(2, bar, len(total))
normal! 2G
redraw
endfor
if !cnts[origin]
call append(5, ['', 'N/A'])
endif
endfor
call setline(1, printf('%d plugin(s) updated.', cnts[0])
\ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
if cnts[0] || cnts[1]
nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
if empty(maparg("\<cr>", 'n'))
nmap <buffer> <cr> <plug>(plug-preview)
endif
if empty(maparg('o', 'n'))
nmap <buffer> o <plug>(plug-preview)
endif
endif
if cnts[0]
nnoremap <silent> <buffer> X :call <SID>revert()<cr>
echo "Press 'X' on each block to revert the update"
endif
normal! gg
setlocal nomodifiable
endfunction
function! s:revert()
if search('^Pending updates', 'bnW')
return
endif
let name = s:find_name(line('.'))
if empty(name) || !has_key(g:plugs, name) ||
\ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
return
endif
call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
setlocal modifiable
normal! "_dap
setlocal nomodifiable
echo 'Reverted'
endfunction
function! s:snapshot(force, ...) abort
call s:prepare()
setf vim
call append(0, ['" Generated by vim-plug',
\ '" '.strftime("%c"),
\ '" :source this file in vim to restore the snapshot',
\ '" or execute: vim -S snapshot.vim',
\ '', '', 'PlugUpdate!'])
1
let anchor = line('$') - 3
let names = sort(keys(filter(copy(g:plugs),
\'has_key(v:val, "uri") && isdirectory(v:val.dir)')))
for name in reverse(names)
let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir)
if !empty(sha)
call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
redraw
endif
endfor
if a:0 > 0
let fn = s:plug_expand(a:1)
if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
return
endif
call writefile(getline(1, '$'), fn)
echo 'Saved as '.a:1
silent execute 'e' s:esc(fn)
setf vim
endif
endfunction
function! s:split_rtp()
return split(&rtp, '\\\@<!,')
endfunction
let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
if exists('g:plugs')
let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
call s:upgrade_specs()
call s:define_commands()
endif
let &cpo = s:cpo_save
unlet s:cpo_save

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,741 @@
*fugitive.txt* A Git wrapper so awesome, it should be illegal
Author: Tim Pope <http://tpo.pe/>
License: Same terms as Vim itself (see |license|)
This plugin is only available if 'compatible' is not set.
INTRODUCTION *fugitive*
Whenever you edit a file from a Git repository, a set of commands is defined
that serve as a gateway to Git.
COMMANDS *fugitive-commands*
These commands are local to the buffers in which they work (generally, buffers
that are part of Git repositories).
*fugitive-:G*
:G [args] Same as :Git, but two characters shorter.
*:Git*
:Git {args} Run an arbitrary git command and display any output.
On UNIX this uses a pty and on other platforms it uses
a pipe, which will cause some behavior differences
such as the absence of progress bars. Any file the
command edits (for example, a commit message) will be
loaded into a split window. Closing that window will
resume running the command. A few Git subcommands
have different behavior; these are documented below.
*:Git!*
:Git! {args} Run an arbitrary git command in the background and
stream the output to the preview window. Requires a
Vim with |setbufline()|. Press CTRL-D during an
interactive :Git invocation to switch to this mode
retroactively.
*:Git_--paginate* *:Git_-p*
:Git --paginate {args} Run an arbitrary git command, capture output to a temp
:Git -p {args} file, and |:split| that temp file. Pass ++curwin as
the first argument to |:edit| the temp file instead.
A temp file is always used for commands like diff and
log that typically uses a pager, and for any command
that has the pager.<cmd> Git configuration option set.
:{range}Git! --paginate {args}
:{range}Git! -p {args} Run an arbitrary git command, and insert the output
after {range} in the current buffer.
*fugitive-summary*
:Git With no arguments, bring up a summary window vaguely
akin to git-status. If a summary window is already
open for the current repository, it is focused
instead. Press g? or see |fugitive-maps| for usage.
*:Git_blame*
:Git blame [flags] Run git-blame [flags] on the current file and open the
results in a scroll-bound vertical split. The
following maps, which work on the cursor line commit
where sensible, are provided:
g? show this help
A resize to end of author column
C resize to end of commit column
D resize to end of date/time column
gq close blame, then |:Gedit| to return to work
tree version
<CR> close blame, and jump to patch that added line
(or directly to blob for boundary commit)
o jump to patch or blob in horizontal split
O jump to patch or blob in new tab
p jump to patch or blob in preview window
- reblame at commit
The maps |fugitive_P| and |fugitive_~| are also
supported to reblame on a parent commit, but this is
inherently fragile, as the line being blamed will no
longer exist. The preferred alternative is to use
<CR> to open up the commit, select the corresponding
`-` line that you care about, and press <CR> twice
more to reblame at that line. Viewing the commit also
gives you additional context as to why the line
changed.
*g:fugitive_dynamic_colors*
In the GUI or a 256 color terminal, commit hashes will
be highlighted in different colors. To disable this:
>
let g:fugitive_dynamic_colors = 0
<
:[range]Git blame [...] If a range is given, just that part of the file will
:Git blame [...] {file} be blamed, and a horizontal split without
scrollbinding is used. You can also give an arbitrary
filename.
*:Git_difftool*
:Git[!] difftool [args] Invoke `git diff [args]` and load the changes into the
quickfix list. Each changed hunk gets a separate
quickfix entry unless you pass an option like
--name-only or --name-status. Jumps to the first
change unless [!] is given.
:Git difftool -y [args] Invoke `git diff [args]`, open each changed file in a
new tab, and invoke |:Gdiffsplit!| against the
appropriate commit.
*:Git_mergetool*
:Git mergetool [args] Like |:Git_difftool|, but target merge conflicts.
Wrappers for Vim built-ins ~
These all directly map onto a built-in Vim command, and generally have names
that prepend "G" to the command they are wrapping. For example, :Ggrep is G
plus |:grep|.
*:Ggrep* *:Git_grep*
:Ggrep[!] [args] An approximation of |:grep|[!] with git-grep as
:Git[!] grep -O [args] 'grepprg'.
:Ggrep[!] --quiet [args]
:Ggrep[!] -q [args] Like |:Ggrep|, but instead of displaying output, open
the quickfix list.
*:Glgrep*
:Glgrep[!] [args] :Ggrep but for |:lgrep|.
:0Git[!] grep -O [args]
*:Gclog*
:Gclog[!] [args] Use git-log [args] to load the commit history into the
|quickfix| list. Jumps to the first commit unless [!]
is given. This command wraps |:cfile|.
The quickfix list can be awkward for many use cases
and exhibits extremely poor performance with larger
data sets. Consider using |:Git| log --oneline
instead.
:{range}Gclog[!] [args] Use git-log -L to load previous revisions of the given
range of the current file into the |quickfix| list.
The cursor is positioned on the first line of the
first diff hunk for each commit. Use :0Gclog to
target the entire file.
*:Gllog*
:Gllog [args] Like |:Gclog|, but use the location list instead of the
|quickfix| list.
*:Gcd*
:Gcd [directory] |:cd| relative to the repository.
*:Glcd*
:Glcd [directory] |:lcd| relative to the repository.
*:Gedit* *fugitive-:Ge*
:Gedit [object] |:edit| a |fugitive-object|.
*:Gsplit*
:Gsplit [object] |:split| a |fugitive-object|.
*:Gvsplit*
:Gvsplit [object] |:vsplit| a |fugitive-object|.
*:Gtabedit*
:Gtabedit [object] |:tabedit| a |fugitive-object|.
*:Gpedit*
:Gpedit [object] |:pedit| a |fugitive-object|.
*:Gdrop*
:Gdrop [object] |:drop| a |fugitive-object|.
*:Gread* *fugitive-:Gr*
:Gread [object] Empty the buffer and |:read| a |fugitive-object|.
When the argument is omitted, this is similar to
git-checkout on a work tree file or git-add on a stage
file, but without writing anything to disk.
:{range}Gread [object] |:read| in a |fugitive-object| after {range}.
*:Gwrite* *fugitive-:Gw*
:Gwrite Write to the current file's path and stage the results.
When run in a work tree file, it is effectively git
add. Elsewhere, it is effectively git-checkout. A
great deal of effort is expended to behave sensibly
when the work tree or index version of the file is
open in another buffer.
:Gwrite {path} You can give |:Gwrite| an explicit path of where in
the work tree to write. You can also give a path like
:0:foo.txt or :0:% to write to just that stage in
the index.
*:Gwq*
:Gwq [path] Like |:Gwrite| followed by |:quit| if the write
succeeded.
:Gwq! [path] Like |:Gwrite|! followed by |:quit|! if the write
succeeded.
*:Gdiffsplit*
:Gdiffsplit [object] Perform a |vimdiff| against the given file, or if a
commit is given, the current file in that commit.
With no argument, the version in the index or work
tree is used, and the work tree version is always
placed to the right or bottom, depending on available
width. Use Vim's |do| and |dp| to stage and unstage
changes.
*:Gdiffsplit!*
:Gdiffsplit! Diff against any and all direct ancestors, retaining
focus on the current window. During a merge conflict,
this is a three-way diff against the "ours" and
"theirs" ancestors. Additional d2o and d3o maps are
provided to obtain the hunk from the "ours" or
"theirs" ancestor, respectively.
:Gdiffsplit! {object} Like |:Gdiffsplit|, but retain focus on the current
window.
*:Gvdiffsplit*
:Gvdiffsplit [object] Like |:Gdiffsplit|, but always split vertically.
*:Ghdiffsplit*
:Gdiffsplit ++novertical [object]
:Ghdiffsplit [object] Like |:Gdiffsplit|, but with "vertical" removed from
'diffopt'. The split will still be vertical if
combined with |:vertical|.
Other commands ~
These do not directly correspond to any built-in Vim command, and have a
capital letter after the "G" to convey this. For example, the file move
operation has nothing to do with the |:move| built-in, so it is named :GMove,
not :Gmove.
*:GMove*
:GMove {destination} Wrapper around git-mv that renames the buffer
afterward. Add a ! to pass -f.
*:GRename*
:GRename {destination} Like |:GMove| but operates relative to the parent
directory of the current file.
*:GDelete*
:GDelete Wrapper around git-rm that deletes the buffer
afterward. When invoked in an index file, --cached is
passed. Add a ! to pass -f and forcefully discard the
buffer.
*:GRemove* *:GUnlink*
:GRemove Like |:GDelete|, but keep the (now empty) buffer around.
:GUnlink
*:GBrowse*
:GBrowse Open the current file, blob, tree, commit, or tag
in your browser at the upstream hosting provider.
Upstream providers can be added by installing an
appropriate Vim plugin. For example, GitHub can be
supported by installing rhubarb.vim, available at
<https://github.com/tpope/vim-rhubarb>.
:GBrowse {object} Like :GBrowse, but for a given |fugitive-object|.
:{range}GBrowse [args] Appends an anchor to the URL that emphasizes the
selected lines. This also forces the URL to include a
commit rather than a branch name so it remains valid
if the file changes. You can give a range of "0" to
force this behavior without including an anchor.
:GBrowse [...]@{remote} Force using the given remote rather than the remote
for the current branch. The remote is used to
determine which upstream repository to link to.
:GBrowse {url} Open an arbitrary URL in your browser.
:[range]GBrowse! [args] Like :GBrowse, but put the URL on the clipboard rather
than opening it.
MAPS *fugitive-maps*
These maps are available in both the |fugitive-summary| buffer and Fugitive
object buffers, although not all maps make sense in all buffers. Mappings
that operate on the file or hunk under the cursor are generally available in
visual mode to operate on multiple files or partial hunks.
*fugitive-staging-maps*
Staging/unstaging maps ~
*fugitive_s*
s Stage (add) the file or hunk under the cursor.
*fugitive_u*
u Unstage (reset) the file or hunk under the cursor.
*fugitive_-*
- Stage or unstage the file or hunk under the cursor.
*fugitive_U*
U Unstage everything.
*fugitive_X*
X Discard the change under the cursor. This uses
`checkout` or `clean` under the hood. A command is
echoed that shows how to undo the change. Consult
`:messages` to see it again. During a merge conflict,
use 2X to call `checkout --ours` or 3X to call
`checkout --theirs` .
*fugitive_=*
= Toggle an inline diff of the file under the cursor.
*fugitive_>*
> Insert an inline diff of the file under the cursor.
*fugitive_<*
< Remove the inline diff of the file under the cursor.
*fugitive_gI*
gI Open .git/info/exclude in a split and add the file
under the cursor. Use a count to open .gitignore.
*fugitive_I*
I Invoke |:Git| add --patch or reset --patch on the file
P under the cursor. On untracked files, this instead
calls |:Git| add --intent-to-add.
*fugitive_d*
Diff maps ~
*fugitive_dp*
dp Invoke |:Git| diff on the file under the cursor.
Deprecated in favor of inline diffs.
*fugitive_dd*
dd Perform a |:Gdiffsplit| on the file under the cursor.
*fugitive_dv*
dv Perform a |:Gvdiffsplit| on the file under the cursor.
*fugitive_ds* *fugitive_dh*
ds Perform a |:Ghdiffsplit| on the file under the cursor.
dh
*fugitive_dq*
dq Close all but one diff buffer, and |:diffoff|! the
last one.
*fugitive_d?*
d? Show this help.
*fugitive-navigation-maps*
Navigation maps ~
*fugitive_<CR>*
<CR> Open the file or |fugitive-object| under the cursor.
In a blob, this and similar maps jump to the patch
from the diff where this was added, or where it was
removed if a count was given. If the line is still in
the work tree version, passing a count takes you to
it.
*fugitive_o*
o Open the file or |fugitive-object| under the cursor in
a new split.
*fugitive_gO*
gO Open the file or |fugitive-object| under the cursor in
a new vertical split.
*fugitive_O*
O Open the file or |fugitive-object| under the cursor in
a new tab.
*fugitive_p*
p Open the file or |fugitive-object| under the cursor in
a preview window. In the status buffer, 1p is
required to bypass the legacy usage instructions.
*fugitive_~*
~ Open the current file in the [count]th first ancestor.
*fugitive_P*
P Open the current file in the [count]th parent.
*fugitive_C*
C Open the commit containing the current file.
*fugitive_CTRL-P* *fugitive_(*
( Jump to the previous file, hunk, or revision.
*fugitive_CTRL-N* *fugitive_)*
) Jump to the next file, hunk, or revision.
*fugitive_[c*
[c Jump to previous hunk, expanding inline diffs
automatically. (This shadows the Vim built-in |[c|
that provides a similar operation in |diff| mode.)
*fugitive_]c*
]c Jump to next hunk, expanding inline diffs
automatically. (This shadows the Vim built-in |]c|
that provides a similar operation in |diff| mode.)
*fugitive_[/* *fugitive_[m*
[/ Jump to previous file, collapsing inline diffs
[m automatically. (Mnemonic: "/" appears in filenames,
"m" appears in "filenames".)
*fugitive_]/* *fugitive_]m*
]/ Jump to next file, collapsing inline diffs
]m automatically. (Mnemonic: "/" appears in filenames,
"m" appears in "filenames".)
*fugitive_i*
i Jump to the next file or hunk, expanding inline diffs
automatically.
*fugitive_[[*
[[ Jump [count] sections backward.
*fugitive_]]*
]] Jump [count] sections forward.
*fugitive_[]*
[] Jump [count] section ends backward.
*fugitive_][*
][ Jump [count] section ends forward.
*fugitive_star*
* On the first column of a + or - diff line, search for
the corresponding - or + line. Otherwise, defer to
built-in |star|.
*fugitive_#*
# Same as "*", but search backward.
*fugitive_gu*
gu Jump to file [count] in the "Untracked" or "Unstaged"
section.
*fugitive_gU*
gU Jump to file [count] in the "Unstaged" section.
*fugitive_gs*
gs Jump to file [count] in the "Staged" section.
*fugitive_gp*
gp Jump to file [count] in the "Unpushed" section.
*fugitive_gP*
gP Jump to file [count] in the "Unpulled" section.
*fugitive_gr*
gr Jump to file [count] in the "Rebasing" section.
*fugitive_gi*
gi Open .git/info/exclude in a split. Use a count to
open .gitignore.
*fugitive_c*
Commit maps ~
cc Create a commit.
ca Amend the last commit and edit the message.
ce Amend the last commit without editing the message.
cw Reword the last commit.
cvc Create a commit with -v.
cva Amend the last commit with -v
cf Create a `fixup!` commit for the commit under the
cursor.
cF Create a `fixup!` commit for the commit under the
cursor and immediately rebase it.
cs Create a `squash!` commit for the commit under the
cursor.
cS Create a `squash!` commit for the commit under the
cursor and immediately rebase it.
cA Create a `squash!` commit for the commit under the
cursor and edit the message.
c<Space> Populate command line with ":Git commit ".
*fugitive_cr*
crc Revert the commit under the cursor.
crn Revert the commit under the cursor in the index and
work tree, but do not actually commit the changes.
cr<Space> Populate command line with ":Git revert ".
*fugitive_cm*
cm<Space> Populate command line with ":Git merge ".
c? Show this help.
*fugitive_cb*
*fugitive_co*
Checkout/branch maps ~
coo Check out the commit under the cursor.
cb<Space> Populate command line with ":Git branch ".
co<Space> Populate command line with ":Git checkout ".
cb? Show this help.
co?
*fugitive_cz*
Stash maps ~
czz Push stash. Pass a [count] of 1 to add
`--include-untracked` or 2 to add `--all`.
czw Push stash of the work-tree. Like `czz` with
`--keep-index`.
czs Push stash of the stage. Does not accept a count.
czA Apply topmost stash, or stash@{count}.
cza Apply topmost stash, or stash@{count}, preserving the
index.
czP Pop topmost stash, or stash@{count}.
czp Pop topmost stash, or stash@{count}, preserving the
index.
cz<Space> Populate command line with ":Git stash ".
cz? Show this help.
*fugitive_r*
Rebase maps ~
ri Perform an interactive rebase. Uses ancestor of
u commit under cursor as upstream if available.
rf Perform an autosquash rebase without editing the todo
list. Uses ancestor of commit under cursor as
upstream if available.
ru Perform an interactive rebase against @{upstream}.
rp Perform an interactive rebase against @{push}.
rr Continue the current rebase.
rs Skip the current commit and continue the current
rebase.
ra Abort the current rebase.
re Edit the current rebase todo list.
rw Perform an interactive rebase with the commit under
the cursor set to `reword`.
rm Perform an interactive rebase with the commit under
the cursor set to `edit`.
rd Perform an interactive rebase with the commit under
the cursor set to `drop`.
r<Space> Populate command line with ":Git rebase ".
r? Show this help.
*fugitive-misc-maps*
Miscellaneous maps ~
*fugitive_gq* *fugitive_q*
gq Close the status buffer.
*fugitive_.*
. Start a |:| command line with the file under the
cursor prepopulated.
*fugitive_g?*
g? Show help for |fugitive-maps|.
*fugitive-global-maps*
Global maps ~
*fugitive_c_CTRL-R_CTRL-G*
<C-R><C-G> On the command line, recall the path to the current
|fugitive-object| (that is, a representation of the
object recognized by |:Gedit|).
*fugitive_y_CTRL-G*
["x]y<C-G> Yank the path to the current |fugitive-object|.
*g:fugitive_no_maps*
Global maps can be disabled with the g:fugitive_no_maps option.
>
let g:fugitive_no_maps = 1
<
SPECIFYING OBJECTS *fugitive-object* *fugitive-revision*
Fugitive objects are either work tree files or Git revisions as defined in the
"SPECIFYING REVISIONS" section in the git-rev-parse man page, with expansions
inspired by |cmdline-special| layered on top. For commands that accept an
optional object, the default is the file in the index for work tree files and
the work tree file for everything else. Example objects follow.
Object Meaning ~
@ The commit referenced by @ aka HEAD
master The commit referenced by master
master^ The parent of the commit referenced by master
master...other The merge base of master and other
master: The tree referenced by master
./master The file named master in the working directory
:(top)master The file named master in the work tree
Makefile The file named Makefile in the work tree
@^:Makefile The file named Makefile in the parent of HEAD
:Makefile The file named Makefile in the index (writable)
@~2:% The current file in the grandparent of HEAD
:% The current file in the index
:1:% The current file's common ancestor during a conflict
:2:# The alternate file in the target branch during a conflict
:3:#5 The file from buffer #5 in the merged branch during a conflict
! The commit owning the current file
!:Makefile The file named Makefile in the commit owning the current file
!3^2 The second parent of the commit owning buffer #3
.git/config The repo config file
: The |fugitive-summary| buffer
- A temp file containing the last |:Git| invocation's output
<cfile> The file or commit under the cursor
STATUSLINE *fugitive-statusline*
*FugitiveStatusline()* *fugitive#statusline()*
Add %{FugitiveStatusline()} to your statusline to get an indicator including
the current branch and the currently edited file's commit. If you don't have
a statusline, this one matches the default when 'ruler' is set:
>
set statusline=%<%f\ %h%m%r%{FugitiveStatusline()}%=%-14.(%l,%c%V%)\ %P
<
AUTOCOMMANDS *fugitive-autocommands*
A handful of |User| |autocommands| are provided to allow extending and
overriding Fugitive behaviors. Example usage:
>
autocmd User FugitiveBlob,FugitiveStageBlob call s:BlobOverrides()
<
*User_FugitiveTag*
FugitiveTag After loading a tag object.
*User_FugitiveCommit*
FugitiveCommit After loading a commit object.
*User_FugitiveTree*
FugitiveTree After loading a tree (directory) object.
*User_FugitiveBlob*
FugitiveBlob After loading a committed blob (file) object.
*User_FugitiveObject*
FugitiveObject After loading any of the 4 above buffer types.
*User_FugitiveStageBlob*
FugitiveStageBlob After loading a staged blob (file) object. These
buffers are 'modifiable' and oftentimes don't want the
same behavior as the other buffer types.
*User_FugitiveIndex*
FugitiveIndex After loading the |fugitive-summary| buffer.
*User_FugitivePager*
FugitivePager After loading a temp file created by a command like
:Git --paginate or :Git blame.
*User_FugitiveEditor*
FugitiveEditor After a :Git command (e.g., :Git commit) edits a file
(e.g., the commit message).
*User_FugitiveChanged*
FugitiveChanged After any event which can potentially change the
repository, for example, any invocation of |:Git|.
Originally intended for expiring caches, but can have
other uses.
API *fugitive-api*
Officially supported functions are documented inline in plugin/fugitive.vim.
DEPRECATIONS *fugitive-deprecated*
The following commands are deprecated in favor of replacements that adhere to
a new naming scheme. Remember that |:Git| can be shortened to |:G|, so
replacements using it are just one space character longer than the legacy
version.
*:Gremove* Superseded by |:GRemove|.
*:Gdelete* Superseded by |:GDelete|.
*:Gmove* Superseded by |:GMove|.
*:Grename* Superseded by |:GRename|.
*:Gbrowse* Superseded by |:GBrowse|.
*:Gdiff* Superseded by |:Gdiffsplit|
*:Gsdiff* Superseded by |:Ghdiffsplit|
*:Gvdiff* Superseded by |:Gvdiffsplit| or |:vert| |:Gdiffsplit|.
*:Gblame* Superseded by |:Git_blame|.
*:Gcommit* Superseded by |:Git| commit.
*:Gmerge* Superseded by |:Git| merge and |:Git_mergetool|.
*:Gpull* Superseded by |:Git| pull.
*:Grebase* Superseded by |:Git| rebase.
*:Grevert* Superseded by |:Git| revert.
*:Gpush* Superseded by |:Git| push.
*:Gfetch* Superseded by |:Git| fetch.
*:Glog* Superseded by |:Gclog|.
*:Gstatus* Superseded by |:Git| (with no arguments).
*:Gsplit!* Superseded by |:Git_--paginate|.
*:Gvsplit!* Superseded by :vert Git --paginate.
*:Gtabsplit!* Superseded by :tab Git --paginate.
*:Gpedit!* Superseded by :Git! --paginate.
*User_Fugitive*
Fugitive used to support `:autocmd User Fugitive` to run an autocommand after
loading any buffer belonging to a Git repository, but this has been phased
out. Instead, one can leverage regular autocommand events like |BufNewFile|
and |BufReadPost|, and check !empty(FugitiveGitDir()) to confirm Fugitive has
found a repository. See also |fugitive-autocommands| for other, more
selective events.
ABOUT *fugitive-about*
Grab the latest version or report a bug on GitHub:
https://github.com/tpope/vim-fugitive
vim:tw=78:et:ft=help:norl:

View File

@@ -0,0 +1,1753 @@
*neobundle.txt* Next generation Vim package manager
Version: 4.0
Author: Shougo <Shougo.Matsu at gmail.com>
Copyright (C) 2010 http://github.com/gmarik
License: MIT license {{{
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
}}}
CONTENTS *neobundle-contents*
Introduction |neobundle-introduction|
Usage |neobundle-usage|
Install |neobundle-install|
Interface |neobundle-interface|
Functions |neobundle-functions|
Commands |neobundle-commands|
Variables |neobundle-variables|
Options |neobundle-options|
Configuration Examples |neobundle-examples|
Migrating from Pathogen |neobundle-migrate-from-pathogen|
Unite sources |neobundle-unite-sources|
FAQ |neobundle-faq|
==============================================================================
INTRODUCTION *neobundle-introduction*
*neobundle* is the next generation Vim package manager. This plugin is based on
Vundle (https://github.com/gmarik/vundle), but I renamed and added tons of
features. Because, Vundle's author does not want to add huge features in
Vundle.
Note: Neobundle is not a stable plugin manager. If you want a stable plugin
manager, you should use Vundle plugin. It works well widely and it is more
tested. If you want to use extended features, you can use neobundle.
Vundle features: Stable, simple, good for beginners
Neobundle features: Early development (may break compatibility), very complex,
good for plugin power users (for example, 50+ plugins and over 1000 lines
.vimrc, ...)
Neobundle features:
* Uses |vimproc| if available
* Uses neovim async jobs feature if available
* |unite.vim| interface
* Revision lock
* Supports svn/Mercurial repositories besides Git
* Can use a different base path
* Vundle like syntax
==============================================================================
USAGE *neobundle-usage*
Refer to the example:
|neobundle-examples|
Run this command to update your bundled plugins:
>
:NeoBundleUpdate
<
Note: To use the unite.vim interface, run this command (requires |unite.vim|):
>
:Unite neobundle/update
<
Settings for this plugin are compatible with Vundle.vim :-)
You can search popular plugins and add neobundle settings at Vimpusher
(registration required):
http://www.vimpusher.com/
Or at vim-scripts.org:
http://vim-scripts.org/
Neobundle now features a plugin search for vim.org scripts (requires
|unite.vim|)
>
:Unite neobundle/search
<
==============================================================================
INSTALL *neobundle-install*
Requirements:
* Vim 7.2.051 or above.
* "git" command in $PATH (if you want to install github or vim.org plugins)
First of all, git clone the repository.
Note: You need to have git installed.
>
$ mkdir ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
<
And set up a path to the repository directory.
>
set runtimepath+={path to neobundle directory}
<
Example:
>
set runtimepath+=~/.vim/bundle/neobundle.vim
<
Now configure your bundles. (Refer to |neobundle-examples|)
Run the |:NeoBundleInstall| command to install your plugins.
>
$ vim +NeoBundleInstall +q
or
>
$ . ~/.vim/bundle/neobundle.vim/bin/neoinstall
<
Note: To use neoinstall in Windows, Vim command must be in $PATH. >
> .vim/bundle/neobundle.vim/bin/neoinstall
Note: To update and build vimproc in Windows, you can use
"neoinstall_novimproc" command. >
> .vim/bundle/neobundle.vim/bin/neoinstall_novimproc vimproc.vim
neoinstall can take arguments (install/update plugin names).
>
# Build vimproc before install plugins
$ . ~/.vim/bundle/neobundle.vim/bin/neoinstall vimproc.vim
<
==============================================================================
INTERFACE *neobundle-interface*
------------------------------------------------------------------------------
FUNCTIONS *neobundle-functions*
neobundle#begin([{base-path}]) *neobundle#begin()*
Initializes neobundle.vim and start neobundle bundles
configuration block.
{base-path} is where your downloaded plugins will be placed.
If {base-path} is omitted, neobundle looks for "~/.vim/bundle"
or "~/.config/nvim/bundle" directory.
Note: But recommend you to specify the {base-path}.
Note: You must not call the function inside a
"has('vim_starting')" block.
Note: You can use |neobundle#begin()| / |neobundle#end()| block
only once in your .vimrc.
Note: It executes ":filetype off" automatically.
Note: You must execute |:NeoBundle| commands in
|neobundle#begin()| or |neobundle#append()| block.
>
if &compatible
set nocompatible
endif
set runtimepath+={path to neobundle directory}
call neobundle#begin(expand('~/.vim/bundle'))
NeoBundle 'https://github.com/Shougo/neocomplcache.git'
...
call neobundle#end()
filetype plugin indent on
<
neobundle#append() *neobundle#append()*
Start neobundle bundles configuration block.
You can use multiple |neobundle#append()| / |neobundle#end()|
blocks in your .vimrc.
Note: It does not initialize neobundle. You must call
|neobundle#begin()| at first.
Note: It executes ":filetype off" automatically.
Note: You must execute |:NeoBundle| commands in
|neobundle#begin()| or |neobundle#append()| block.
neobundle#end() *neobundle#end()*
End neobundle bundles configuration block.
neobundle#add({repository}[, {options}]) *neobundle#add()*
The function version of |:NeoBundle|.
Note: You must call it in |neobundle#begin()| or
|neobundle#append()| block.
neobundle#add_meta({repository}[, {options}]) *neobundle#add_meta()*
Initialize a bundle from the metadata {name}.
Note: You must call it in |neobundle#begin()| or
|neobundle#append()| block. >
" It installs vimshell and vimproc
call neobundle#add_meta('vimshell')
neobundle#source({bundle-names}) *neobundle#source()*
Same as |:NeoBundleSource|.
{bundle-names} is a list of bundle names.
*neobundle#exists_not_installed_bundles()*
neobundle#exists_not_installed_bundles()
Checks if there are any bundles that are not installed.
*neobundle#get_not_installed_bundle_names()*
neobundle#get_not_installed_bundle_names()
Returns the names of bundles that are not installed.
*neobundle#is_installed()*
neobundle#is_installed({bundle-name})
Checks if bundle {bundle-name} is installed.
*neobundle#is_sourced()*
neobundle#is_sourced({bundle-name})
Checks if bundle {bundle-name} is loaded.
*neobundle#local()*
neobundle#local({directory}, [{options}, [{names}]])
Adds the subdirectories in {directory} to
'runtimepath', like |pathogen| does. See |neobundle-options|
for keys to set in {options}.
If {names} is given, {names} directories are only loaded.
{names} is |wildcards| list.
Note: |:NeoBundleLocal| is a shortcut for this function.
>
" Load plugin from "~/.vim/bundle".
call neobundle#local("~/.vim/bundle", {})
" Load plugin1 and plugin2 from "~/.vim/bundle".
call neobundle#local("~/.vim/bundle",
\ {}, ['plugin1', 'plugin2', 'vim-*', '*.vim'])
<
*neobundle#load_toml()*
neobundle#load_toml({filename}, [{options}])
Load TOML plugin configurations from {filename}. See
|neobundle-options| for keys to set in {options}.
Note: TOML parser is slow. You should use neobundle cache
feature.
TOML file format specification:
https://github.com/toml-lang/toml
Note: Original TOML parser is created by kamichidu.
https://github.com/kamichidu
>
" Load toml from "~/.vim/bundle.toml".
call neobundle#load_toml("~/.vim/bundle.toml", {})
<
TOML file sample is here:
>
# TOML sample
[[plugins]]
# repository name is required.
repo = 'kana/vim-niceblock'
on_map = '<Plug>'
[[plugins]]
repo = 'Shougo/neosnippet.vim'
depends = ['Shougo/neosnippet-snippets',
'Shougo/context_filetype.vim']
on_i = 1
on_ft = 'snippet'
[[plugins.depends]]
repo = 'honza/vim-snippet'
name = 'honza-snippet'
[[plugins]]
repo = 'Shougo/neobundle.vim'
fetch = 1
[[plugins]]
repo = 'Shougo/vimproc.vim'
[plugins.build]
windows = 'tools\\update-dll-mingw'
cygwin = 'make -f make_cygwin.mak'
mac = 'make -f make_mac.mak'
unix = 'make -f make_unix.mak'
<
neobundle#get({bundle-name}) *neobundle#get()*
Get the neobundle options dictionary for {bundle-name}.
Useful for setting hooks.
Example:
>
NeoBundle 'tyru/open-browser.vim', '', 'same', {
\ 'on_map' : '<Plug>',
\ }
nmap gs <Plug>(open-browser-wwwsearch)
let bundle = neobundle#get('open-browser.vim')
function! bundle.hooks.on_source(bundle)
nnoremap <Plug>(open-browser-wwwsearch)
\ :<C-u>call <SID>www_search()<CR>
function! s:www_search()
let search_word = input('Please input search word: ', '',
\ 'customlist,wwwsearch#cmd_Wwwsearch_complete')
if search_word != ''
execute 'OpenBrowserSearch' escape(search_word, '"')
endif
endfunction
endfunction
<
neobundle#get_hooks({bundle-name}) *neobundle#get_hooks()*
Get the neobundle "hooks" dictionary for {bundle-name}.
Useful for setting hooks.
neobundle#call_hook({hook-name}) *neobundle#call_hook()*
Calls the hook {hook-name}.
Note: If {hook-name} is "on_source", neobundle will call
"on_source" hooks in sourced bundles.
neobundle#bundle({repository}, [{options}]) *neobundle#bundle()*
Initialize a bundle.
If {repository} is list, you can initialize options in
multiple bundles.
Note: You can use this function instead of |:NeoBundle|
command.
neobundle#config({bundle-name}, {options}) *neobundle#config()*
neobundle#config({options})
Change bundle options for {bundle-name}.
It you omit {bundle-name}, it uses |neobundle#tapped|
variable.
If {bundle-name} is list, you can change options in multiple
bundles.
If {bundle-name} is not configured, it will print error
messages.
If {bundle-name} is already loaded, it will ignore.
Note: To lazy-load a plugin, you can set the "lazy" flag after
calling |:NeoBundle| or |:NeoBundleLocal|.
Note: You must call it within
|neobundle#begin()|/|neobundle#end()| block.
>
NeoBundle 'Shougo/neocomplcache'
call neobundle#config('neocomplcache', {
\ 'lazy' : 1,
\ 'on_i' : 1,
\ })
<
neobundle#tap({bundle-name}) *neobundle#tap()*
Initialize |neobundle#tapped| and |neobundle#hooks| variable
as {bundle-name} bundle.
It returns non-zero if {bundle-name} is exists and not
disabled.
>
if neobundle#tap('foo')
" If foo plugin is installed and enabled
" neobundle#hooks is syntax sugar
function! neobundle#hooks.on_source(bundle)
" Settings, Init, ...
" Timing of adding rtp
" Like vimrc time
let g:foo#bar = 1
let g:foo#path = a:bundle.path
call foo#baz()
endfunction
function! neobundle#hooks.on_post_source(bundle)
" Settings, Init, ...
" Timing of after source plugin files
" Like VimEnter time
let g:foo#bar = 3
call foo#bazbaz()
endfunction
" Define plugin mappings, commands, ...
map f <Plug>(foo)
command! FOO call foo#foo()
call neobundle#untap()
endif
<
neobundle#untap() *neobundle#untap()*
Clear current |neobundle#tapped| and |neobundle#hooks| variable.
neobundle#has_cache() *neobundle#has_cache()*
Checks if a cache file is available.
Note: It is deprecated. You should use
|neobundle#load_cache()| instead of it.
neobundle#load_cache([{vimrcs}]) *neobundle#load_cache()*
Load plugin configuration from the cache file,
which is located in `neobundle#get_rtp_dir() . '/cache'`.
{vimrcs} is a list of compared .vimrc and/or other configuration
files. The default is |$MYVIMRC|.
It returns 1, if the cache file is old or invalid or not
found.
The default cache location can be overridden through
|g:neobundle#cache_file|.
>
if neobundle#load_cache()
" My Bundles here:
" ...
NeoBundleSaveCache
endif
<
If you use multiple configuration files,
>
if neobundle#load_cache($MYVIMRC, 'plugin.vim', 'plugin.toml')
" My Bundles here or other files spcified as arguments
" ...
NeoBundleSaveCache
endif
<
------------------------------------------------------------------------------
COMMANDS *neobundle-commands*
*:NeoBundle*
:NeoBundle {repository} [[,{revision}] [,{options}]]
:NeoBundle {repository} ,{revision}, {default} [,{options}]]
Initialize a bundle.
{repository} is the repository URI. {revision} is the desired
revision or branch name. If omitted, the current latest
revision will be used. {default} is a "default options
name" (See |g:neobundle#default_options|).
Note: Don't set neobundle setting in .gvimrc!
Note: If you omit the protocol (ex: https) for a git
repo, |g:neobundle#types#git#default_protocol| is used.
Note: |neobundle-options-lazy| is set automatically.
Note: If you manage bundle by neobundle, it may be error
occurred when update bundles.
See |neobundle-options| for what to set in {options}.
:NeoBundleInstall [{name}...] *:NeoBundleInstall*
Installs plugins specified by {name}. {name} is
fuzzy-searched. If {name} is omitted, all configured plugins
are installed.
Note: {name}s are plugin names like "neobundle.vim", not
"Shougo/neobundle.vim".
Note: neobundle cannot use neovim async jobs feature in the
command. If you want to use the feature, you should use unite
interface instead.
:NeoBundleInstall! [{name}...] *:NeoBundleInstall!*
Same as |:NeoBundleUpdate|.
:NeoBundleUpdate [{name}...] *:NeoBundleUpdate*
Installs and updates plugins specified by {name}. {name} is
fuzzy-searched. If {name} is omitted, all configured plugins
are installed and updated, except if they are outdated or have
the "frozen" option set.
Note: {name}s are plugin names like "neobundle.vim", not
"Shougo/neobundle.vim".
Note: neobundle cannot use neovim async jobs feature in the
command. If you want to use the feature, you should use unite
interface instead.
:NeoBundleUpdate! [{name}...] *:NeoBundleUpdate!*
Same as |:NeoBundleUpdate|, except that it disregards the
"frozen" option.
:NeoBundleReinstall [{name}...] *:NeoBundleReinstall*
Reinstalls the bundles specified by {name}.
If the bundles are "none" type or local plugins, they are
ignored.
Note: It removes the bundles and installs them. It is the
dangerous command.
:NeoBundleList *:NeoBundleList*
Prints a list of configured bundles.
:NeoBundleLog *:NeoBundleLog*
Prints all previous install logs.
:NeoBundleUpdatesLog *:NeoBundleUpdatesLog*
Prints previous update logs.
:NeoBundleLocal {base-directory-path} *:NeoBundleLocal*
Registers a bundle from the directories in
{base-directory-path} like pathogen does.
Note: If you want to use neobundle like pathogen.vim, you
should set a different base path from the standard neobundle
bundles path.
>
NeoBundleLocal ~/.vim/bundle
<
*:NeoBundleLazy*
:NeoBundleLazy {repository} [[,{revision}] [,{options}]]
:NeoBundleLazy {repository} ,{revision}, {default} [,{options}]]
Registers a bundle, but doesn't add it to 'runtimepath'.
Note: If you want to know slow loading plugins, you should use
the external tool or |--startuptime|.
https://github.com/hyiltiz/vim-plugins-profile
>
NeoBundleLazy 'The-NERD-tree', {'augroup' : 'NERDTree'}
NeoBundleSource The-NERD-tree
<
You can use it to load plugins for specific filetypes.
>
NeoBundleLazy 'Rip-Rip/clang_complete'
autocmd FileType c,cpp NeoBundleSource clang_complete
<
:NeoBundleSource [{name}...] *:NeoBundleSource*
|:source| the bundles specified by {name}.
If {name} is omitted, |:source| all lazy bundles.
Note: This command is used to load the bundles configured with
|:NeoBundleLazy|.
:NeoBundleFetch {repository} [, {options}] *:NeoBundleFetch*
Registers a bundle, but doesn't add it to 'runtimepath'.
Unlike |:NeoBundleLazy|, you cannot load the bundle with
|:NeoBundleSource|. This command is useful for managing
non-Vim plugins using neobundle.
>
NeoBundleFetch 'davidhalter/jedi'
<
:NeoBundleDocs *:NeoBundleDocs*
Execute |:helptags| for all bundles manually.
*:NeoBundleDirectInstall*
:NeoBundleDirectInstall {repository} [, {options}]
Registers a bundle, and installs it directly.
Note: The settings are saved in "extra_bundles.vim" in
|neobundle#begin()| directory.
Note: To remove direct installed bundles, you must delete
plugin settings manually in "extra_bundles.vim" in
|neobundle#begin()| directory.
>
NeoBundleDirectInstall 'Shougo/neocomplcache'
<
*:NeoBundleExtraEdit*
:NeoBundleExtraEdit
Edit extra bundles configuration easily.
:NeoBundleDisable {name}... *:NeoBundleDisable*
Disables bundles specified by {name}. If a bundle is
disabled, its path will be removed from 'runtimepath'.
Note: This command must be executed before neobundle loads
the plugins(after |neobundle#end()|).
:NeoBundleCheck *:NeoBundleCheck*
Check plugins installation. If plugins are not installed, it
will execute |:NeoBundleInstall| automatically. This command
also check documentation directories and will execute
|:NeoBundleDocs| automatically.
:NeoBundleCheckUpdate [{name}...] *:NeoBundleCheckUpdate*
Check plugins update specified by {name}. If updates are
available, it will execute |:NeoBundleUpdate| automatically.
Note: It is supported in git type only.
*:NeoBundleCount*
:NeoBundleCount
Show bundles count. You can know how many bundles you have.
*:NeoBundleGC*
:NeoBundleGC [{bundle-names}]
Execute Garbage Collect commands in bundles.
If {bundle-name} is omit, all bundles will be GCed.
*:NeoBundleSaveCache*
:NeoBundleSaveCache
Save plugin configuration in the cache file.
Note: It cannot save functions for example "hooks" member.
Note: It is available when loading .vimrc.
*:NeoBundleLoadCache*
:NeoBundleLoadCache
Load plugin configuration from the cache file,
which is located in `neobundle#get_rtp_dir() . '/cache'`.
Note: It is deprecated. You should use
|neobundle#load_cache()| instead of it.
*:NeoBundleClearCache*
:NeoBundleClearCache
Clear the configuration cache file.
*:NeoBundleRollback*
:NeoBundleRollback {bundle-name}
Rollback {bundle-name} plugin version to previous updated
version.
Note: If you rollbacked the plugin, you cannot update it by
|:NeoBundleUpdate| command. If you want to update it, you
must reinstall the plugin by |:NeoBundleReinstall| command.
*:NeoBundleRemotePlugins*
:NeoBundleRemotePlugins
Load not loaded neovim |:remote-plugin| and execute
|:UpdateRemotePlugins| command.
It is better than |:UpdateRemotePlugins| for neobundle
autoloading feature.
Note: It is valid in neovim.
------------------------------------------------------------------------------
VARIABLES *neobundle-variables*
g:neobundle#cache_file *g:neobundle#cache_file*
The cache file to use.
The default is provided through
neobundle#commands#get_default_cache_file():
>
neobundle#get_rtp_dir() . '/cache'
<
neobundle#tapped *neobundle#tapped*
Current bundle variable set by |neobundle#tap()|.
neobundle#hooks *neobundle#hooks*
Current bundle hooks variable set by |neobundle#tap()|.
g:neobundle#default_site *g:neobundle#default_site*
The default repository site if "site" option is omitted.
Defaults to "github".
g:neobundle#log_filename *g:neobundle#log_filename*
The log filename. Set it to "" to disable logging.
Defaults to "".
*g:neobundle#enable_name_conversion*
g:neobundle#enable_name_conversion
If you set to 1 and omit bundle name,
|neobundle-options-normalized_name| is used as bundle name.
It is useful for absorbing difference of repository name.
g:neobundle#rm_command *g:neobundle#rm_command*
The command used to remove files to uninstall.
Defaults to "rmdir /S /Q" on Windows or "rm -rf" in
others.
*g:neobundle#install_max_processes*
g:neobundle#install_max_processes
The max number of processes used for neobundle/install source
asynchronous update.
Defaults to "8".
*g:neobundle#install_process_timeout*
g:neobundle#install_process_timeout
The time of timeout seconds when updating/installing bundles.
Defaults to "120".
g:neobundle#default_options *g:neobundle#default_options*
A dictionary of preconfigured sets of options to use when
options are omitted for individual commands or functions.
Keys are arbitrary names for the option sets, and values are
dictionaries themselves that store option keys and values.
Use the special key "_" to store a "default default options".
Example:
>
let g:neobundle#default_options =
\ { 'rev' : {'rev' : 'ver.8'} }
NeoBundle 'Shougo/neocomplcache', '', 'rev'
<
Defaults to "{}".
*g:neobundle#types#raw#calc_hash_command*
g:neobundle#types#raw#calc_hash_command
The hash command to use in raw repositories.
Defaults to "sha1sum" or "md5sum".
*g:neobundle#types#git#command_path*
g:neobundle#types#git#command_path
The "git" command path used for git type.
Defaults to "git".
*g:neobundle#types#git#default_protocol*
g:neobundle#types#git#default_protocol
The default protocol used for git (github).
Note: It is accepted in "https" or "ssh".
Defaults to "https".
*g:neobundle#types#git#enable_submodule*
g:neobundle#types#git#enable_submodule
If it is non-zero, neobundle enables git submodule support.
But it may be slow in Windows environment.
Defaults to 1.
*g:neobundle#types#git#clone_depth*
g:neobundle#types#git#clone_depth
The default history depth for "git clone".
If it is 1, neobundle use shallow clone feature.
See |neobundle-options-type__depth|.
Defaults to 0.
*g:neobundle#types#git#pull_command*
g:neobundle#types#git#pull_command
The git command used to pull updates.
The previous default has been "pull --rebase".
Defaults to "pull --ff --ff-only".
*g:neobundle#types#hg#command_path*
g:neobundle#types#hg#command_path
The "hg" command path used for hg type.
Defaults to "hg".
*g:neobundle#types#hg#default_protocol*
g:neobundle#types#hg#default_protocol
The default protocol used for hg (bitbucket).
Note: It is accepted in "https" or "ssh".
Defaults to "https".
*g:neobundle#types#svn#command_path*
g:neobundle#types#svn#command_path
The "svn" command path used for svn type.
Defaults to "svn".
------------------------------------------------------------------------------
OPTIONS *neobundle-options*
The {options} in neobundle commands accept the following keys:
*neobundle-options-name*
name (String)
Specify the name of the bundle. This is used for neobundle
management and other commands (like |:NeoBundleUpdate|). If
omitted, the tail of the repository name will be used.
Note: Must be unique across all bundles. If a bundle name
conflicts with another bundle, neobundle will overwrite the
previous settings with the new one. If a repo tail is bound to
conflict, you can set the "name" option manually to prevent
overwriting an existing bundle setting.
Example:
>
NeoBundle 'https://github.com/Shougo/unite.vim.git',
\ {'name' : 'unite'}
NeoBundle 'https://github.com/foo/foo.git',
\ {'name' : 'foo-foo'}
NeoBundle 'https://github.com/bar/foo.git',
\ {'name' : 'bar-foo'}
NeoBundle 'https://git.code.sf.net/p/atp-vim/code',
\ {'name': 'atp-vim'}
<
*neobundle-options-normalized_name*
normalized_name (String)
Specify the normalized name of the bundle. This is used for
neobundle management to detect dependencies. If omitted,
neobundle will normalize the tail of the repository name.
Note: Must be unique across all bundles.
Normalized name example:
name : normalized name
>
unite.vim unite
vim-quickrun quickrun
<
description (String)
Plugin description.
rev (String)
Specify a revision number or branch/tag name.
If it is "release" in "git" type, neobundle will use latest
released tag.
Note: If the type is "raw", rev is hash number.
Example:
>
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }
<
*neobundle-options-default*
default (String)
Specify a default option name. (See |g:neobundle#default_options|).
*neobundle-options-directory*
directory (String)
Specify relative directory path from the base directory (set
by |neobundle#begin()| or "base" option). If omitted, the "name"
option will be used.
Note: If you set rev "foo" when the name key is "neobundle",
the directory key is "neobundle_foo".
Example:
>
NeoBundle 'https://github.com/Shougo/unite.vim.git',
\ {'directory' : 'unite'}
<
*neobundle-options-base*
base (String)
Directory base path to use. If omitted, the path specified
with |neobundle#begin()| will be used. It is useful for
loading scripts from a different path.
*neobundle-options-type*
type (String)
Specify the repository type. If omitted, a guess is made
based on {repository}.
Available types:
"none" : None repository
"raw" : Raw plugin file ("script_type" attribute is
needed)
"git" : Git
"hg" : Mercurial
"svn" : Subversion
"vba" : Vimball
Example:
>
NeoBundle 'https://host/path/repo.git', {'type': 'hg'}
NeoBundle 'thinca/vim-localrc', {'type' : 'svn'}
<
*neobundle-options-script_type*
script_type (String)
Specify the script type. It is useful for non-official
categorized plugins.
For example: "indent", "plugin", "ftplugin", ...
Note: You must not specify it for categorized plugins.
Example:
>
NeoBundle 'https://raw.github.com/m2ym/rsense/master/etc/rsense.vim',
\ {'script_type' : 'plugin'}
NeoBundle 'https://github.com/bronzehedwick/impactjs-colorscheme',
\ {'script_type' : 'colorscheme'}
<
*neobundle-options-site*
site (String)
Specify the repository site. If you omit both the repository
URL and the "site" option, |g:neobundle#default_site| will be
used.
Note: You can specify site by "{site-name}:{path}".
For example: "github:Shougo/vimshell"
Available sites:
"github" or "gh" : github.com (git)
"bitbucket" or "bb" : bitbucket.org (hg)
"gist" : gist.github.com (git)
*neobundle-options-rtp*
rtp (String)
Specify runtime path.
Use this option when the repository has the Vim plugin
in a subdirectory.
For example: https://github.com/rstacruz/sparkup
Example:
>
NeoBundle 'rstacruz/sparkup', {'rtp': 'vim'}
NeoBundle 'https://code.google.com/p/vimwiki/', {
\ 'rtp': "~/.vim/bundle/vimwiki/src",
\ }
<
*neobundle-options-depends*
depends (List or String)
Specify a list of plugins a plugin depends on.
List items are '{plugin-name}' or ['{plugin-name}', {args}].
Those specified in the list are installed automatically. If
the {plugin-name} needs options, specify them with {args}.
Note: Type String is syntax sugar for List of {plugin-name}.
Example:
>
NeoBundle 'Shougo/vimfiler', {'depends' : 'Shougo/unite.vim' }
NeoBundle 'Shougo/neocomplcache', {'depends' :
\ [ 'Shougo/neosnippet.git',
\ ['rstacruz/sparkup', {'rtp': 'vim'}],
\ ]}
<
*neobundle-options-build*
build (Dictionary or String)
Specify the build script.
You may use this option if the plugin has to be built before
use. If the build script requires external commands, see
|neobundle-options-build_commands|.
This command is executed by |system()| or |vimproc#system()|
in plugin runtimepath.
Note: Type String is syntax sugar for Dictionary of
{"others": "cmd"}.
This dictionary accepts the following keys:
windows (String)
Specify Windows environment build script.
mac (String)
Specify Mac OS X environment build script.
cygwin (String)
Specify Cygwin environment build script.
linux (String)
Specify Linux environment build script.
Note: It is detected if "gmake" command is not
executable.
unix (String)
Specify Unix environment build script.
others (String)
Specify others environment build script.
If you don't specify other keys, it means "all".
Example:
>
NeoBundle 'Shougo/vimproc.vim', {
\ 'build' : {
\ 'windows' : 'tools\\update-dll-mingw',
\ 'cygwin' : 'make -f make_cygwin.mak',
\ 'mac' : 'make -f make_mac.mak',
\ 'linux' : 'make',
\ 'unix' : 'gmake',
\ },
\ }
<
Note: The command is executed in plugin top directory.
If you need cd command, you must use "sh -c". >
NeoBundle 'wincent/command-t', {
\ 'build': {
\ 'others' :
\ 'sh -c "cd ruby/command-t && ruby extconf.rb && make"'
\ }
\ }
<
*neobundle-options-augroup*
augroup (String)
Specify an augroup name that the plugin uses for |VimEnter| or
|GUIEnter| autocmd events.
Neobundle will call their |VimEnter| or |GUIEnter| autocmds
automatically when |:NeoBundleSource| is executed.
Note: You'll want to set this option because some plugins
rely on autocmds defined for |VimEnter| or |GUIEnter|, but by
using |:NeoBundleSource| after loading .vimrc, those autocmds
may get skipped. Some examples are, "fugitive", "NERDTree",
and "session.vim".
Examples:
>
" NERDTree uses augroup NERDTreeHijackNetrw.
NeoBundle 'scrooloose/nerdtree', { 'augroup' : 'NERDTreeHijackNetrw'}
" fugitive uses augroup fugitive.
NeoBundle 'tpope/vim-fugitive', { 'augroup' : 'fugitive'}
<
This option is also valid in |:NeoBundleLazy|.
*neobundle-options-external_commands*
external_commands (Dictionary or List or String)
Specify a list of external commands that the plugin depends
on. List items are '{command-name}' or ['{command-name}',
...] or { {dictionary} }.
The commands are checked when loading the plugin.
Note: Type String is syntax sugar for list of {command-name}s.
The {dictionary} has following keys:
windows (String)
Specify Windows environment external commands.
mac (String)
Specify Mac OS X environment external commands.
cygwin (String)
Specify Cygwin environment external commands.
unix (String)
Specify Unix environment external commands.
others (String)
Specify others environment external commands.
Example:
>
NeoBundle 'ujihisa/neco-ghc', { 'external_commands' : 'ghc-mod' }
<
*neobundle-options-build_commands*
build_commands (Dictionary or List or String)
Specify a list of external commands that are required for
building the plugin. If any of these commands are not
installed, the bundle will not be built. The list is the same
format as |neobundle-options-external_commands|.
Example:
>
NeoBundle 'Valloric/YouCompleteMe', { 'build_commands' : 'cmake' }
<
*neobundle-options-frozen*
frozen (Number)
If set to 1, neobundle doesn't update it automatically when
|:NeoBundleUpdate| or ":Unite neobundle/update" is called with
no arguments. It is useful for outdated plugins that can no
longer be updated.
>
NeoBundle 'Shougo/neobundle', { 'frozen' : 1 }
<
*neobundle-options-lazy*
lazy (Number)
If set to 1, neobundle doesn't add the path to user
runtimepath.
*neobundle-options-fetch*
fetch (Number)
If set to 1, neobundle doesn't add the path to user
runtimepath, and doesn't load the bundle.
*neobundle-options-force*
force (Number)
If set to 1, neobundle will load plugin files in the plugin
repository forcedly.
Note: It is useful for using Bundle within bundle.
https://github.com/Shougo/neobundle.vim/issues/199
*neobundle-options-gui*
gui (Number)
If set 1, neobundle will only load the plugin in GUI Vim.
Example: >
NeoBundle 'tyru/restart.vim', '', 'same', {
\ 'gui' : 1,
\ 'on_cmd' : 'Restart'
\ }
<
*neobundle-options-terminal*
terminal (Number)
If set to 1, neobundle will only load the plugin in Terminal
Vim.
*neobundle-options-vim_version*
vim_version (String)
Minimal vim version of the plugin supported.
It accepts some version formats such as "7" and "7.3" and
"7.3.885".
*neobundle-options-disabled*
disabled (Number) or (String)
If set to 1, neobundle will disable the plugin.
If it is string, neobundle will eval the string.
Note: Disabled plugins are not ignored when install/update
plugins.
Example: >
" neocomplete requires Vim 7.3.885 or above.
NeoBundle 'Shougo/neocomplete', {
\ 'depends' : 'Shougo/context_filetype.vim',
\ 'disabled' : !has('lua'),
\ 'vim_version' : '7.3.885'
\ }
<
*neobundle-options-focus*
focus (Number)
If it is > 0, neobundle will source the plugin when focus
is lost. It also is source priority.
http://d.hatena.ne.jp/osyo-manga/20140212/1392216949
Example: >
" Source all plugins when focus is lost.
let g:neobundle#default_options._ = { 'verbose' : 1, 'focus' : 1 }
<
*neobundle-options-verbose*
verbose (Number)
If set to 1, neobundle will print message when it is sourced.
*neobundle-options-install_process_timeout*
install_process_timeout (Number)
The time of timeout seconds when updating/installing bundles.
If omit it, |g:neobundle#install_process_timeout| will be used.
Note: This feature is available if you installed |vimproc|.
*neobundle-options-autoload*
autoload (Dictionary)
Specify autoload conditions.
If you set it, neobundle will execute |:NeoBundleSource|
automatically when the conditions are met.
Note: This dictionary is deprecated.
*neobundle-options-on_ft*
on_ft (List) or (String)
Filetype list. If the filetype is "all", it means all
filetypes.
Note: Using this will usually cause Neobundle to
either reset the ftplugin state, or explicitly call
the FileType autocommand another time (after adding
the lazy-loaded bundle), which results in the
autocommand to be processed twice for all other
plugins. Therefore, using "all" does not make sense
usually.
*neobundle-options-filetypes*
It is deprecated key.
*neobundle-options-on_cmd*
on_cmd (List) or (String)
Command list. The item can be following dictionary.
name (String) or (List)
Command name or the list of command names.
Example: >
NeoBundle 'Shougo/vimfiler.vim', {
\ 'depends' : 'Shougo/unite.vim',
\ 'on_cmd' : ['VimFiler', 'VimFilerEdit',
\ 'VimFilerWrite','VimFilerRead',
\ 'VimFilerSource'],
\ 'on_map' : '<Plug>',
\ 'on_path' : '.*',
\ }
<
*neobundle-options-commands*
It is deprecated key.
*neobundle-options-on_func*
on_func (List) or (String)
Functions list.
*neobundle-options-functions*
It is deprecated key.
*neobundle-options-on_map*
on_map (List) or (String)
Mappings list. The items are {mapping} or
[{mode}, {mapping1}, [{mapping2}, ...]]. If {mode} is
omitted, "nxo" is used.
Note: You can use plugin prefix mappings.
For example, you can use "<Plug>(ref-" instead of
"<Plug>(ref-back)" and so on.
Note: You can use "<Plug>" keyword as {mapping}. If
{mapping} is "<Plug>", "<Plug>(normalized_name" is
used.
For example: >
" It is same as "'mappings' : '<Plug>(anzu'
NeoBundle 'osyo-manga/vim-anzu', {
\'on_map': '<Plug>'}
<
Note: You cannot use lazy <Plug> mappings twice.
For example: >
NeoBundle 'osyo-manga/vim-anzu', {
\ 'on_map': '<Plug>(anzu-'}
" Not working!!
nmap n <Plug>(anzu-jump-n)<Plug>(anzu-echo-search-status)zv
nmap N <Plug>(anzu-jump-N)<Plug>(anzu-echo-search-status)zv
<
*neobundle-options-mappings*
It is deprecated key.
*neobundle-options-on_i*
on_i (Number)
If set to non-zero, neobundle will |:NeoBundleSource|
on |InsertEnter| autocmd.
*neobundle-options-insert*
It is deprecated key.
*neobundle-options-on_path*
on_path (String) or (List)
If set to ".*", neobundle will |:NeoBundleSource|
on editing all files.
Otherwise, neobundle will |:NeoBundleSource| if the
buffer name is matched the string pattern.
Note: It is useful for explorer behavior plugins.
Ex: vimfiler, metarw, vim-gnupg ...
Note: To autoload vimfiler, you must disable netrw in
.vimrc. >
" Disable netrw.vim
let g:loaded_netrwPlugin = 1
<
For example: >
NeoBundle 'kana/vim-meta', {
\ 'on_path' : '\h\w*:',
\ }
<
*neobundle-options-explorer*
*neobundle-options-filename_patterns*
It is deprecated key.
*neobundle-options-on_source*
on_source (List) or (String)
Load the bundle when the list bundles are loaded.
Note: If they are not autoload bundles, "on_source"
hooks are called when |VimEnter| auto command.
You can call them manually by |neobundle#call_hook()|.
Note: The plugins must be lazy loaded plugins.
For example: >
if neobundle#tap('plugin-B.vim')
call neobundle#config({
\ 'on_source' : [ 'plugin-A.vim' ]
\ })
call neobundle#untap()
endif
<
plugin-B is loaded before plugin-A is loaded.
*neobundle-options-pre_cmd*
pre_cmd (List) or (String)
Autoload command prefix in commands.
If the prefix is set, commands were loaded
automatically.
If omitted it, automatically generated prefix is used.
Example: If you use "unite.vim", "Unite" command
prefix is used.
Note: It requires Vim 7.4.414 or above.
*neobundle-options-command_prefix*
It is deprecated key.
Autoload examples:
>
NeoBundle 'Rip-Rip/clang_complete', {
\ 'on_ft' : ['c', 'cpp'],
\ }
NeoBundle 'basyura/TweetVim', { 'depends' :
\ ['basyura/twibill.vim', 'tyru/open-browser.vim'],
\ 'on_cmd' : 'TweetVimHomeTimeline' }
NeoBundle 'kana/vim-smartword', {
\ 'on_map' : [
\ '<Plug>(smartword-'']
\ }
NeoBundle 'Shougo/vimshell',{
\ 'depends' : 'Shougo/vimproc.vim',
\ 'on_cmd' : [{ 'name' : 'VimShell',
\ 'complete' : 'customlist,vimshell#complete'},
\ 'VimShellExecute', 'VimShellInteractive',
\ 'VimShellTerminal', 'VimShellPop'],
\ 'on_map' : '<Plug>'
\ })
NeoBundle 'Shougo/vimfiler', {
\ 'depends' : 'Shougo/unite.vim',
\ 'on_cmd' : [{ 'name' : 'VimFiler',
\ 'complete' : 'customlist,vimfiler#complete' },
\ 'VimFilerExplorer',
\ 'Edit', 'Read', 'Source', 'Write'],
\ 'on_map' : '<Plug>',
\ 'on_path' : '.*',
\ }
NeoBundle 'Shougo/junkfile.vim', {
\ 'on_cmd' : 'JunkfileOpen',
\ }
NeoBundle 'tyru/winmove.vim', {
\ 'on_map' : [
\ ['n', '<Plug>']],
\ 'gui' : 1,
\ 'augroup' : 'winmove',
\ }
NeoBundle 'sophacles/vim-processing', {
\'on_path': '\.pde$'
\}
NeoBundle 'LeafCage/cmdlineplus.vim', {
\ 'on_map': [['c', '<Plug>']]}
<
*neobundle-options-hooks*
hooks (Dictionary)
Specify hook functions or hook script path. The following
hooks are defined:
*neobundle-hooks-on_source*
on_source
Called or sourced before scripts are sourced. It is
useful for plugin initialization in lazy bundles.
Note: You must call the hook before |neobundle#end()|.
*neobundle-hooks-on_post_source*
on_post_source
Called or sourced after scripts are sourced.
Note: In Vim initializing, calling the hooks are
delayed until |VimEnter|.
Note: To re-call on_source hook when reloading .vimrc,
you must call the hook in end of .vimrc.
*neobundle-options-type__protocol*
type__protocol (String)
The protocol used for types.
"https" and "ssh" are available for git type.
"https" is available for hg type.
If omitted, |g:neobundle#types#git#default_protocol|
or |g:neobundle#types#hg#default_protocol| is used.
Note: This attribute is available in git and hg types only.
Examples:
>
NeoBundle 'ujihisa/neco-ghc', { 'type__protocol' : 'ssh' }
<
*neobundle-options-type__filename*
type__filename (String)
The downloaded filename.
If omitted, URI filename will be used.
It is useful for downloading vim.org scripts.
Note: This attribute is available in raw type only.
Examples: |:NeoBundle-examples|
>
NeoBundle 'git_repository_uri'
NeoBundle 'script_name'
NeoBundle 'https://github.com/tpope/vim-fugitive.git'
NeoBundle 'Shougo/neocomplcache', {'depends' :
\ [ 'Shougo/neosnippet.git',
\ ['rstacruz/sparkup', {'rtp': 'vim'}],
\ ]}
NeoBundle 'github:Shougo/vimshell'
" Pushable github repository.
NeoBundle 'git@github.com:Shougo/neocomplcache.git'
" For bitbucket hg repository.
NeoBundle 'bitbucket:ns9tks/vim-fuzzyfinder'
NeoBundle 'https://bitbucket.org/ns9tks/vim-fuzzyfinder'
" For bitbucket git repository (.git is needed).
NeoBundle 'bitbucket:kh3phr3n/vim-qt-syntax.git'
NeoBundle 'https://bitbucket.org/kh3phr3n/vim-qt-syntax.git'
" For raw repository.
NeoBundle 'https://raw.github.com/m2ym/rsense/master/etc/rsense.vim',
\ {'script_type' : 'plugin'}
" For gist repository.
NeoBundle 'gist:Shougo/656148', {
\ 'name': 'everything.vim',
\ 'script_type': 'plugin'}
NeoBundle 'gist:355360', {
\ 'name': 'ambicmd.vim',
\ 'script_type': 'plugin'}
<
Neobundle supports revision (or branch) lock.
Note: The revision (or branch) is checked out in
install/update.
Note: You can either specify the revision manually or set the
to revision "master" to restore a plugin.
>
NeoBundle 'Shougo/vimshell', '3787e5'
NeoBundle 'Shougo/vimshell', 'master'
<
If type is "none", neobundle does not update
automatically (like pathogen.vim). See also |NeoBundleLocal|.
>
NeoBundle 'muttator', {'type' : 'none', 'base' : '~/.vim/bundle'}
<
Note: To use hg commands for git repository, please use this.
>
NeoBundle 'https://github.com/Shougo/neobundle.vim.git', {'type': 'hg'}
<
*neobundle-options-type__depth*
type__depth (Number)
History depth for "git clone".
If omitted, |g:neobundle#types#git#clone_depth| is used.
If it is than 0, neobundle clones the repository by shallow
clone. Shallow clone feature saves your repository clone time.
But it have problems in some repository.
See below issues:
https://github.com/Shougo/neobundle.vim/issues/81
https://github.com/Homebrew/homebrew/issues/12024
Note: This attribute is available in git type only.
==============================================================================
EXAMPLES *neobundle-examples*
>
" Note: Skip initialization for vim-tiny or vim-small.
if 0 | endif
if has('vim_starting')
if &compatible
set nocompatible " Be iMproved
endif
set runtimepath+={path to neobundle directory}
endif
call neobundle#begin(expand('~/.vim/bundle'))
" Let neobundle manage neobundle
NeoBundleFetch 'Shougo/neobundle.vim'
" My Bundles here:
" Refer to |:NeoBundle-examples|.
" Note: You don't set neobundle setting in .gvimrc!
" ...
call neobundle#end()
filetype plugin indent on " Required!
" Installation check.
NeoBundleCheck
"...
if !has('vim_starting')
" Call on_source hook when reloading .vimrc.
call neobundle#call_hook('on_source')
endif
<
==============================================================================
MIGRATING FROM PATHOGEN *neobundle-migrate-from-pathogen*
Here are a few tips if you want to migrate from a |pathogen| based
installation to neobundle.
You might want to use a different/non-default directory for neobundle: >
set rtp+=~/.vim/bundle/neobundle
call neobundle#begin(expand('~/.vim/neobundle'))
<
This allows you to keep `~/.vim/bundle` in place while migrating.
If you are using Git submodules currently, you can use a shell command like
the following to automatically generate your NeoBundle statements: >
while read p url; do \
bundle_name="${url#*://github.com/}"; \
dir="$(command git config -f .gitmodules --get ${p%.url}.path)"; \
echo "NeoBundle '$bundle_name', { 'directory': '${dir##*/}' }"; \
done < <(command git config -f .gitmodules \
--get-regexp 'submodule.vim/bundle/\S+.(url)' | sort)
<
This uses the "submodule.*" urls and path from your .gitmodules sections that
start with `submodule.vim/bundle/`.
It sets the directory option explicitly to the name you were using before
(see |neobundle-options-directory|), which is useful if you want to compare
your old bundles directory with the one managed by neocomplete later.
The output looks like this: >
NeoBundle 'tpope/vim-abolish.git', { 'directory': 'abolish' }
>
==============================================================================
UNITE SOURCES *neobundle-unite-sources*
Here let me explain about a source for |unite| provided in neobundle.
*neobundle-unite-source-neobundle*
neobundle
Nominates bundles as a candidate.
Note:
If argument is bang(!), print plugins status.
https://github.com/Shougo/vimproc.vim
*neobundle-unite-source-neobundle-install*
neobundle/install
Install configured plugins asynchronously.
It supports neovim async jobs feature.
Note: Installing the |vimproc| plugin or using neovim is
recommended.
If argument is bang(!), it will install and update all plugins.
Source arguments:
bundle names (fuzzy searched).
Example:
>
:Unite neobundle/install:!
:Unite neobundle/install:neocomplcache
:Unite neobundle/install:neocomplcache:unite.vim
<
If you use the source with "-auto-quit" option, the unite
buffer will close automatically.
>
:Unite neobundle/install -auto-quit
<
*neobundle-unite-source-neobundle-log*
neobundle/log
Print previous neobundle install logs.
And you can jump the diff URI in github.
*neobundle-unite-source-neobundle-update*
neobundle/update
Install and update configured plugins asynchronously, except
for outdated ones or those with the "frozen" option.
It supports neovim async jobs feature.
Note: This source is the same as "neobundle/install:!".
Note: Installing the |vimproc| plugin or using neovim is
recommended.
If argument is bang(!), it will not be with fuzzy search.
If argument is "all", it will update all plugins.
If you use the source with "-auto-quit" option, the unite
buffer will close automatically.
>
:Unite neobundle/update -log -wrap -auto-quit
<
*neobundle-unite-source-neobundle-search*
neobundle/search
Search plugin settings from sources.
Note: This source requires "curl" or "wget" command.
Note: If you get errors in this source, please refresh the
cache file by |<Plug>(unite_redraw)|.
Source arguments:
source names.
Following source names are available:
"vim_scripts_org":
Search plugins settings from "http://vim-scripts.org".
"github":
Search plugins settings from "https://github.org/".
"metadata":
Search plugins settings from converted metadata in
"https://bitbucket.org/vimcommunity/vim-pi/".
*neobundle-unite-source-neobundle-lazy*
neobundle/lazy
List lazy configured plugins (not sourced by
|:NeoBundleSource|).
*unite-kind-neobundle*
neobundle An interface for neobundle bundles. It is used in
neobundle source and neobundle/lazy sources.
update Update bundles (Default action)
delete Delete bundles
preview view the plugin documentation
reinstall Reinstall bundles
narrow Narrow bundle files
edit Browse bundle directory
start Browse github plugin page
Actions for each of the sources
neobundle/search *unite-action-neobundle-search*
yank Yank plugin settings (Default action).
install Direct install plugins from repository.
Note: The settings are saved in "extra_bundles.vim" in
|neobundle#begin()| directory.
start Browse github plugin page.
Note: If you use the install action, you cannot customize the bundle
settings.
neobundle/lazy *unite-action-neobundle-lazy*
source Source plugin files (Default action)
==============================================================================
FAQ *neobundle-faq*
Q: What's the neobundle advantage for Vundle or other plugin management
system?
A: neobundle solves some problems in Vundle or other plugin management system.
But you must know they are huge and complex features.
1. Plugin prefixed command name (:Bundle vs :NeoBundle).
https://github.com/gmarik/Vundle.vim/issues/76
2. Support vimproc (asynchronous update/install).
https://github.com/gmarik/Vundle.vim/issues/259
3. Support unite.vim interface (update/install/search).
4. Support revision lock feature.
https://github.com/gmarik/Vundle.vim/issues/35
5. Support other VCS (Subversion/Git).
https://github.com/gmarik/Vundle.vim/pull/134
https://github.com/gmarik/Vundle.vim/pull/268
6. Support lazy initialization for optimizing startup time.
https://github.com/gmarik/Vundle.vim/issues/364
https://github.com/gmarik/Vundle.vim/pull/98
Q: I want to manage the rsense Vim plugin using neobundle.
A: Use |neocomplcache-rsense|. Installation and settings can be found in the
neocomplcache-rsense docs.
Note: neocomplcache-rsense depends |neocomplcache| plugin.
https://github.com/Shougo/neocomplcache-rsense
Q: Vim freezes when a NeoBundle command is run with a typo in the repo name.
A: It's a git feature. Git awaits user input when the repo name is
wrong. You can install |vimproc| to keep your Vim from freezing:
https://github.com/Shougo/vimproc.vim
Q: Duplicated error was printed when sourcing .vimrc.
A: Your .vimrc was wrong. You must reset neobundle setting by
|neobundle#begin()| in .vimrc.
Note: You must not call |neobundle#begin()| inside a "has('vim_starting')"
block.
>
if has('vim_starting')
" This is wrong neobundle#begin().
"call neobundle#begin(expand('~/.vim/bundle'))
endif
" This is OK.
call neobundle#begin(expand('~/.vim/bundle'))
<
Q: I want to compile vimproc automatically.
A:
>
NeoBundle 'Shougo/vimproc.vim', {
\ 'build' : {
\ 'windows' : 'tools\\update-dll-mingw',
\ 'cygwin' : 'make -f make_cygwin.mak',
\ 'mac' : 'make -f make_mac.mak',
\ 'unix' : 'make -f make_unix.mak',
\ },
\ }
<
Q: What's the "outdated" plugin?
A: Last update time is older than one week -> Automatic updates are disabled
until one day from the last update.
Last update time is older within one week -> Automatic updates are every time.
Note: If you use update with name or use "all" argument in neobundle/update
source or use "!" in |:NeoBundleUpdate| command, this feature will be
disabled; it forces updates them.
Q: I want to update messages in unite buffer.
A:
>
Unite -log -wrap neobundle/update
<
Q: neobundle.vim is not worked in Debian/Ubuntu Linux...
A: Did you use "debian.vim"? "debian.vim" changes 'runtimepath'.
So it conflicts with neobundle. You should not use "debian.vim".
Q: neobundle.vim fails update in submodule repository.
A: neobundle.vim supports submodule repository. But I think the repository was
changed recently from non-use submodule to use submodule. You must reinstall
the repository.
Q: I want to install github plugins with Subversion.
A:
>
NeoBundle 'thinca/vim-localrc', {'type' : 'svn'}
<
Q: I want to add absolute path in 'runtimepath' with |:NeoBundle| and
|:NeoBundleLazy|.
https://github.com/Shougo/neobundle.vim/issues/136
A: You can use "none" type. >
NeoBundle '/absolute/path/to/plugin', { 'type' : 'none' }
Q: Problem with lazy loading of matchit plugin.
https://github.com/Shougo/neobundle.vim/issues/153
A:
>
NeoBundle 'matchit.zip', {
\ 'on_map' : ['%', 'g%']
\ }
let bundle = neobundle#get('matchit.zip')
function! bundle.hooks.on_post_source(bundle)
silent! execute 'doautocmd Filetype' &filetype
endfunction
<
Q: Cannot load colorscheme when reloading .vimrc.
https://github.com/Shougo/neobundle.vim/issues/157
A: You must write :NeoBundle lines before filetype plugin indent on and syntax
enable.
>
filetype plugin indent on
NeoBundle 'tomasr/molokai'
...
syntax enable
colorscheme molokai
<
Q: Timeout on github makes Vim terribly slow if the repository is not found in
console Vim.
https://github.com/Shougo/neobundle.vim/issues/175
A: |vimproc| and |system()| uses input redirection. But git ignores it when
you used https protocol in console Vim. So it freezes. I think it is bad
feature in git. I cannot fix it. You should change
|g:neobundle#types#git#default_protocol| to "git".
Q: I want to use shallow clone in git.
A: See |neobundle-options-type__depth|.
Q: I want to use lockfile feature like "Gemfile.lock" in neobundle.
https://github.com/Shougo/neobundle.vim/issues/222
A: You can copy "NeoBundle.lock" to another machine from neobundle base path
directory. It is used when install plugins.
Q: neobundle#begin() breaks plugin function calls.
https://github.com/Shougo/neobundle.vim/issues/330
A: You must use the functions after |neobundle#end()|.
Because, the plugins are loaded when neobundle calls |neobundle#end()|.
Q: Fails submoduled repository clone like YouCompleteMe.
A: I think you use the submodule repository in proxy environment.
https://github.com/ekg/freebayes/issues/63
>
$ git config --global url.https://github.com/.insteadOf git://github.com/
<
Q: Colorscheme does not load below code. >
NeoBundle 'mrkn256.vim'
colorscheme mrkn256
...
neobundle#end()
A: 'runtimepath' is set on |neobundle#end()|. So it is not set when the
colorscheme executed. You can use |neobundle-options-force| for it or write
|:colorscheme| command after |neobundle#end()|.
Q: fugitive does not work using neobundle. Please help! >
NeoBundle 'tpope/vim-fugitive'
A: You must specify |neobundle-options-augroup| like this. >
" fugitive uses augroup fugitive.
NeoBundle 'tpope/vim-fugitive', { 'augroup' : 'fugitive'}
Q: I setup gVim-only colorscheme but neobundle doesn't load it.
A: neobundle can't load colorschemes automatically. So you can't use
|:NeoBundleLazy| for colorschemes.
Q: I want to use "git" or "http" protocol instead of "https".
A: No, you cannot.
Q: Why neobundle only accepts "https" or "ssh"?
A: https://glyph.twistedmatrix.com/2015/11/editor-malware.html
Q: I want to autoload vim-gnupg
A: vim-gnupg uses |BufReadCmd| and |FileReadCmd| autocmd. You must specify
the autocmd. >
autocmd BufReadCmd,FileReadCmd *.gpg,*.asc,*.pgp
\ NeoBundleSource vim-gnupg | doautocmd BufReadCmd
autocmd FileReadCmd *.gpg,*.asc,*.pgp
\ NeoBundleSource vim-gnupg | doautocmd FileReadCmd
Q: Where is :NeoBundleClean command?
https://github.com/Shougo/neobundle.vim/issues/501
A: It is removed because it is dangerous.
Q: Why the install script does not use "curl | bash" ?
https://github.com/Shougo/neobundle.vim/pull/515
A: https://www.idontplaydarts.com/2016/04/detecting-curl-pipe-bash-server-side/
==============================================================================
vim:tw=78:ts=8:ft=help:norl:noet:fen:

View File

@@ -0,0 +1,901 @@
*neosnippet.txt*
The neo-snippet plugin contains snippet source
Version: 5.0
Author: Shougo <Shougo.Matsu at gmail.com>
License: MIT license
CONTENTS *neosnippet-contents*
Introduction |neosnippet-introduction|
Install |neosnippet-install|
Interface |neosnippet-interface|
Commands |neosnippet-commands|
Variables |neosnippet-variables|
Key mappings |neosnippet-key-mappings|
Functions |neosnippet-functions|
Examples |neosnippet-examples|
Snippet syntax |neosnippet-snippet-syntax|
FAQ |neosnippet-faq|
==============================================================================
INTRODUCTION *neosnippet-introduction*
*neosnippet* offers functionality similar to snipMate.vim or snippetsEmu.vim.
This analyzes snippet files which you can use for the completion. Since you
can choose snippets with the deoplete interface, you might have less trouble
using them, because you do not have to remember each snippet name.
==============================================================================
INSTALL *neosnippet-install*
1: Extract the file and put files in your Vim directory
(usually ~/.vim/ or Program Files/Vim/vimfiles on Windows).
Note: If you want to complete snippets, you must install deoplete
(https://github.com/Shougo/deoplete.nvim). It's not required, but highly
recommended.
Default snippets files are available in neosnippet-snippets.
https://github.com/Shougo/neosnippet-snippets
Note: Installing the default snippets is optional. If you choose not to
install them, you must set |g:neosnippet#disable_runtime_snippets| like so:
>
let g:neosnippet#disable_runtime_snippets = {'_' : 1}
Extra snippets files are also available. e.g.:
https://github.com/honza/vim-snippets
Note: To enable context-filetype feature, you must install
context_filetype.vim. This allows you to use snippets not only depend on the
current 'filetype' of the file, but also depends on the cursor location, such
as javascript inside html, or lua inside Vim scripts.
https://github.com/Shougo/context_filetype.vim
INTERFACE *neosnippet-interface*
------------------------------------------------------------------------------
COMMANDS *neosnippet-commands*
*:NeoSnippetMakeCache*
:NeoSnippetMakeCache [filetype]
Creates a cache for the snippets of the given [filetype]. It
automatically chooses the current buffer's file type unless
you specify another one by [filetype].
*:NeoSnippetEdit*
:NeoSnippetEdit [{options}] [filetype]
Opens the snippets for a given [filetype] to edit. It
automatically selects the current buffer's filetype unless you
specify another one by [filetype].
If the path to [filetype] snippets is a directory, it
automatically selects "[filetype].snip" in the [filetype]
subdirectory.
It edits a snippet file in |g:neosnippet#snippets_directory|
with precedence. The snippets are re-cached automatically
when you save the file after edit.
The following parameters can be used as {options} to modify
the behavior of the command. Note: You must escape spaces with
a backslash "\".
Note: You must set |g:neosnippet#snippets_directory| before
using it.
*neosnippet-edit-options-vertical*
-vertical
Split the window vertically.
*neosnippet-edit-options-horizontal*
-horizontal
Split the window horizontally.
Note: The behavior is undefined when both options are set.
*neosnippet-edit-options-direction*
-direction={direction}
Define the split position rule. The default value is
"belowleft".
*neosnippet-edit-options-split*
-split
Split the buffer.
*neosnippet-edit-options-runtime*
-runtime
Edit the runtime snippets (built-in defaults) instead of the
user snippets defined by 'g:neosnippet#snippets_directory'.
*:NeoSnippetSource*
:NeoSnippetSource [filename]
Load the snippets contained in [filename].
Note: The loaded snippets are enabled in current buffer only.
*:NeoSnippetClearMarkers*
:NeoSnippetClearMarkers
Clear current markers.
Note: If you delete markers, you cannot jump to next
placeholder.
------------------------------------------------------------------------------
VARIABLES *neosnippet-variables*
g:neosnippet#snippets_directory *g:neosnippet#snippets_directory*
This variable appoints a path to user-defined snippet files.
You can set multiple values in comma-separated string or list.
Non existing directories are ignored.
Note: The directory name must not be "snippets" or
"neosnippets" under 'runtimepath'. For example,
"~/.vim/snippets" or "~/.config/nvim/neosnippets".
It is used as runtime snippet directory. It does not work as
user expected.
User defined snippet files are read after the built-in snippet
files. If redundant snippets occur they get overwritten and
only the last one remains.
Note: The neosnippet plug-in loads file type snippets from
several files if available. For example if you edit a "Vim"
file it loads the snippets from:
- "vim.snip"
- "vim.snippets"
- "vim_*.snip"
- "vim_*.snippets"
- "vim/**/*.snip"
- "vim/**/*.snippets"
The default value is ''.
*g:neosnippet#disable_select_mode_mappings*
g:neosnippet#disable_select_mode_mappings
This variable disables key-mappings in |Select-mode| where the
neosnippet performs the snippet completion. Usually it is
better to leave it as it is. But if you have troubles with the
buffer switcher LustyJuggler you can switch them off.
The default value is 1.
*g:neosnippet#disable_runtime_snippets*
g:neosnippet#disable_runtime_snippets
This is a dictionary variable which uses file types as key.
If you set the value of a file type entry to 1, this prevents
loading "neosnippets" directories from 'runtimepath'. This is
very useful to prevent snippet conflicts between self defined
snippet files and the built-in snippet files of neosnippet. If
you use an "_" as key for an entry this will treat the value
of the entry as default value for all file types.
Note: This dictionary must be set in your .vimrc.
For example:
>
let g:neosnippet#disable_runtime_snippets = {
\ 'c' : 1, 'cpp' : 1,
\ }
" which disables all runtime snippets
let g:neosnippet#disable_runtime_snippets = {
\ '_' : 1,
\ }
<
The default value is {}.
*g:neosnippet#enable_snipmate_compatibility*
g:neosnippet#enable_snipmate_compatibility
If this variable is not 0, neosnippet will enable the snipMate
compatibility features:
1. Define Filename() function.
2. Load |g:snippets_dir| and snipMate snippets files from
'runtimepath'.
3. Enable file snippets feature in snipMate.
4. snipMate optional abbr syntax.
The default value is 0.
*g:neosnippet#expand_word_boundary*
g:neosnippet#expand_word_boundary
If it is not 0, neosnippet will expand snippets by a word
boundary.
Note: It must be initialized before snippet loading.
The default value is 0.
*g:neosnippet#enable_conceal_markers*
g:neosnippet#enable_conceal_markers
If this variable is not 0, neosnippet will use the |conceal|
markers.
The default value is 1.
*g:neosnippet#enable_completed_snippet*
g:neosnippet#enable_completed_snippet
If this variable is not 0, neosnippet can expand the function
prototype.
Note: It supports |vim-lsp| or |nvim-lsp| snippets.
The default value is 0.
*g:neosnippet#enable_complete_done*
g:neosnippet#enable_complete_done
If this variable is not 0, neosnippet can expand on
|CompleteDone| or |PumCompleteDone|for |pum.vim|.
Note: If the feature is enabled, you cannot expand snippet
trigger manually when |pumvisible()| to prevent conflicts with
|CompleteDone| expand.
The default value is 0.
*g:neosnippet#enable_optional_arguments*
g:neosnippet#enable_optional_arguments
If this variable is not 0, neosnippet will conceal commas in
expanded arguments from completed snippets.
Useful for languages where arguments are optional by default.
Note: For use with |g:neosnippet#enable_completed_snippet| = 1
The default value is 1.
*g:neosnippet#enable_auto_clear_markers*
g:neosnippet#enable_auto_clear_markers
If this variable is not 0, neosnippet will clear the markers
in the buffer when |BufWritePost|, |CursorMoved| and
|CursorMovedI| autocmd.
Note: The feature does not work for multi lines snippets.
If you want to clear them, you should use
|:NeoSnippetClearMarkers| instead.
The default value is 1.
*g:neosnippet#scope_aliases*
g:neosnippet#scope_aliases
It is a dictionary that associating certain filetypes with
other snippet files.
The key is filetype, and the value is comma separated snippet
filenames excluded extensions.
It works like "g:snipMate.scope_aliases".
The default value is {}. >
let g:neosnippet#scope_aliases = {}
let g:neosnippet#scope_aliases['ruby'] = 'ruby,ruby-rails'
g:neosnippet#data_directory *g:neosnippet#data_directory*
Specifies directory for neosnippet cache. If the directory
doesn't exist the directory will be automatically generated.
Default value is "$XDG_CACHE_HOME/neosnippet" or
expand("~/.cache/neosnippet"); the absolute path of it.
g:neosnippet#conceal_char *g:neosnippet#conceal_char*
This variable can customize how the jump position is concealed
after snippet expansion.
The default value is '|'.
*b:neosnippet_disable_snippet_triggers*
b:neosnippet_disable_snippet_triggers
Specifies the triggers which disables in the buffer.
It is useful to disable some snippet triggers.
------------------------------------------------------------------------------
KEY MAPPINGS *neosnippet-key-mappings*
*<Plug>(neosnippet_expand_or_jump)*
<Plug>(neosnippet_expand_or_jump)
*<Plug>(neosnippet_jump_or_expand)*
<Plug>(neosnippet_jump_or_expand)
Jump to the next available placeholder in the buffer. If there
is no placeholder it expands a snippet in the current cursor
position.
*<Plug>(neosnippet_expand)*
<Plug>(neosnippet_expand)
Expand a snippet in current cursor position. It only takes
effect if there is a snippet text to expand or if you have
chosen a snippet from popup menu.
*<Plug>(neosnippet_jump)*
<Plug>(neosnippet_jump)
Jump to the next placeholder key. It does not expand any
snippets.
*i_<Plug>(neosnippet_start_unite_snippet)*
<Plug>(neosnippet_start_unite_snippet)
Starts the unite snippet source. You can expand a snippet by
the unite interface.
Note: The plug-in |unite.vim| is required for that feature.
*x_<Plug>(neosnippet_expand_target)*
<Plug>(neosnippet_expand_target)
Expand the input trigger by a selected target text.
*x_<Plug>(neosnippet_register_oneshot_snippet)*
<Plug>(neosnippet_register_oneshot_snippet)
Register oneshot snippet in the current buffer.
*neosnippet#expandable()*
neosnippet#expandable()
You can use this function with imap <expr>. It checks if
the cursor text is a snippet trigger. This is useful to save
key mappings.
*neosnippet#jumpable()*
neosnippet#jumpable()
You can use this function with imap <expr>. It checks if the
cursor text is an existing placeholder in current buffer. This
is useful to save key mappings.
*neosnippet#expandable_or_jumpable()*
neosnippet#expandable_or_jumpable()
You can use this function with imap <expr>. It checks if
the cursor text is a snippet trigger or a placeholder. This is
useful to save key mappings.
Note: If you don't like to jump to the next placeholder, you
must use |neosnippet#expandable()| instead of
|neosnippet#expandable_or_jumpable()|.
>
imap <expr><C-l>
\ neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<C-n>"
<
*neosnippet#anonymous()*
neosnippet#anonymous({snippet})
It defines anonymous snippet.
{snippet} is snippet definition.
{options} is snippet option.
You can expand snippet definition without defining snippet
trigger.
Note: You can use this function with |:map-<expr>|.
>
inoremap <silent> ((
\ <C-r>=neosnippet#anonymous('\left(${1}\right)${0}')<CR>
" OR
inoremap <expr><silent> ((
\ neosnippet#anonymous('\left(${1}\right)${0}')
<
*neosnippet#expand()*
neosnippet#expand({trigger})
It expands the snippet trigger.
{trigger} is snippet trigger.
Note: You can use this function with |:map-<expr>|.
>
inoremap <silent> test
\ i<C-r>=neosnippet#expand('date_english')<CR>
nnoremap <silent><expr> test
\ neosnippet#expand('date_english')
------------------------------------------------------------------------------
FUNCTIONS *neosnippet-functions*
*neosnippet#get_snippets_directory()*
neosnippet#get_snippets_directory()
Gets snippet directories. These directories contain runtime
snippets directories and |g:neosnippet#snippets_directory|
directories.
*neosnippet#complete_done()*
neosnippet#complete_done()
It expands the snippet for |CompleteDone| event.
Note: The function is deprecated.
==============================================================================
EXAMPLES *neosnippet-examples*
>
" Plugin key-mappings.
" Note: It can be "nmap", "xmap", "imap" and "smap", and don't forget
" "smap" and "imap" unless you have some specific reasons. It uses
" <Plug> mappings.
" Note: It is unrecommended to map <Plug>(neosnippet_foo) at once by
" "map", which could fail to work in some features.
" Note: Don't forget to make a "smap" out of "<Plug>(neosnippet_jump)"
" "<Plug>(neosnippet_expand_or_jump)" or
" "Plug>(neosnippet_jump_or_expand)" at least. This note is especially
" for you who are unfamiliar with Vim Script.
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
xmap <C-k> <Plug>(neosnippet_expand_or_jump)
nmap <C-k> <Plug>(neosnippet_expand_or_jump)
" SuperTab like snippets' behavior.
" Note: Be careful to map <TAB> because <TAB> is equivalent to <C-i> in
" Vim and <C-i> is a very important key especially in Normal Mode.
"imap <expr><TAB>
" \ pumvisible() ? "\<C-n>" :
" \ neosnippet#expandable_or_jumpable() ?
" \ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
"smap <expr><TAB> neosnippet#expandable_or_jumpable() ?
" \ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
" For conceal markers.
if has('conceal')
set conceallevel=2 concealcursor=niv
endif
" Enable snipMate compatibility feature.
" let g:neosnippet#enable_snipmate_compatibility = 1
" Expand the completed snippet trigger by <CR>.
"imap <expr><CR>
"\ (pumvisible() && neosnippet#expandable()) ?
"\ "\<Plug>(neosnippet_expand)" : "\<CR>"
==============================================================================
SNIPPET SYNTAX *neosnippet-snippet-syntax*
It is quite easy to create your own snippets. You can use the example below to
get started.
Note: The snippets file extension must be ".snip" or ".snippets" and its
filename corresponds to [filetype] regularly. If you want to avoid trouble
about filename, use :NeoSnippetEdit command without specifying [filetype].
Example:
>
snippet [name]
abbr [abbreviation]
alias [aliases]
regexp [pattern]
options [options]
if ${1:condition}
${2}
endif
The snippet syntax is close to the one of |snipMate|. Each snippet starts with
some keywords that define the name and modify the expansion and treatment of
the snippet.
Snippet Keywords:
- snippet [name] (Required)
Each snippet starts with the keyword "snippet". This keyword is
directly followed by the snippet name. The snippet name is used to
expand the snippet.
- abbr [name] (Optional)
You can define an abbreviation for the snippet name. It will be
displayed in the drop down selection menu.
- alias [aliases] (Optional)
Alias names can be use as additional keywords to expand the snippet.
You can define multiple aliases using either spaces ' ' or commas ','
as separator.
Example
>
alias hoge hogera hogehoge
<
- regexp [pattern] (Optional)
A pattern can be defined via a regular expression. The snippet expands
only when the expression pattern is matched.
Note: [pattern] must be quoted by "'" or '"'.
Note: It does not mean auto expand feature.
Example
>
regexp '^% '
<
- options [options] (Optional)
Options influence the snippet behavior. The possible values are:
+ word This snippet expands by a word boundary.
Note: To complete the trigger with neosnippet, it must be a
word character (digits, alphabetical characters or "_").
>
snippet date
options word
`strftime("%d %b %Y")`
<
+ head This snippet expands at the beginning of a line only.
Note: This is the same as "prev_word '^'" which is still
there for backwards compatibility.
>
snippet if
options head
if ${1:condition}
${2}
endif
<
+ indent The horizontal position of the snippet will be adjusted
to the indent of the line above the snippet after expansion.
The snippet itself starts below the part that contains the options, snippet
aliases and keywords, described above. It contains the snippet which gets
expanded which can contain several placeholders. The placeholders are used as
jump points while expanding the snippet. There are several placeholders
available providing different functionality.
The structure of a placeholder can be:
- ${number:default placeholder text}
The placeholder starts with a dollar sign "$". The number of a
placeholder and the placeholder text are separated by a colon ":".
They are surrounded by a pair of curly braces "{}". The placeholder
text is displayed after the snippet expansion and will be replaced by
your text. If you jump over the snippet and do not insert any text in
that placeholder position the text remains there. This can be used as
a default value for a certain position.
Example
>
snippet if
if ${1:condition}
${2}
endif
<
- ${number:#:optional placeholder text}
In this kind of placeholder the number is followed by the hash
character "#". If you jump over this placeholder and do not insert
any text, the placeholder text will be removed.
Example
>
snippet if
if ${1:condition}
${2}
endif
<
- ${number:TARGET}
This is the target placeholder which is replaced by text from a visual
selection.
Note: You need to make a visual selection and expand your
snippet with the key mapping below for this to work.
|x_<Plug>(neosnippet_expand_target)|.
This is very useful if you edit text and decide to put something in an
environment or some sort of brackets for folding.
Example
>
snippet if
if ${1:condition}
${2}
endif
<
- ${number}
This is a placeholder which you can use as a simple jump position.
This can be useful if you edit a placeholder inside of some sort of
brackets or environment and want to go on behind it after that.
Example
>
snippet if
if ${1:condition}
${2}
endif
${3}
<
- $number
- ${0}, $0
This is a synchronized placeholder. Sometimes it is required to repeat
a value in several positions inside a snippet. If you set the number
of this placeholder to the same number as one of the other
placeholders in the snippet, it will repeat its content. $1 is
synchronized to ${1} and so on. ${0} or $0 will be the final jump
placeholder.
Note: If you don't use ${0} in snippet, ${0} will be added
automatically.
Example
>
snippet namespace
namespace ${1:name} {
${0}
} // namespace $1
<
Note: If you like to include characters in snippets that already have
a special meaning to neosnippet you need to escape them with a
backslash.
>
snippet code
\`${1}\`${2}
snippet test
${1:escape \} value}
# Substitute "\$0" to "$0"
snippet main
options head
if __FILE__ == \$0
${1:TARGET}
end
<
A placeholder value can not contain new lines. The snippet below is
not valid.
>
snippet invalid
${1:constructor: (${2:args\}) ->
${3:# do smth}}
<
Vim has a built-in expression evaluation. You can also use this feature inside
of snippets if you use back ticks like in the example below. Here the "%:t"
gets expanded to the name of the current active file and the current time gets
inserted by expanding the output of the strftime command.
>
snippet header
File: ${1:`expand('%:t')`}
${2:Created at: `strftime("%B %d, %Y")`}
<
You can also nest placeholders if you escape the special characters.
>
snippet div
<div ${1:id="${2:someid\}"}>${3}</div>${4}
<
If you need to use literal "$" in default, you must escape the special
characters.
>
snippet test
${1:escape \\${2:foobar\} value}
In some cases you need to escape the curly brace "}" twice as shown in the
example below.
>
snippet catch
options head
catch ${1:/${2:pattern: empty, E484, Vim(cmdname):{errmsg\\}\}/}
<
This is because ${1:} substitutes the pattern to "/${2:pattern: empty, E484,
Vim(cmdname):{errmsg\}}" and ${2:} substitutes the pattern to "pattern: empty,
E484, Vim(cmdname):{errmsg}"
If you create a snippet file and prepend the filename with a "_" neosnippet
treats the snippets inside the file as global. This means that they will be
available for all file types (e.g _.snip). You can include other snippet files
from within a snippet file with.
>
include c.snip
<
Or if you want to include a whole directory with file type snippets.
>
include javascript/*
<
Neosnippet also supports "extends" syntax like snipMate.
>
extends c
<
It behaves like this:
>
include c.snip
include c.snippets
include c/*
<
If you include snippet files it can happen that the same snippet name is used
multiple times in snippet files. Neosnippet produces a warning if it detects
this. If you want to overwrite a snippet explicitly, please use:
>
delete snippets_name
<
After that you can redefine the snippet. But this does not work if you include
external snippet files. There will be no warning when snippets get
overwritten external snippet files. There will be no warning when snippets get
overwritten.
Multi snippet feature in snipMate is available. Neosnippet substitutes trigger
and descriptions spaces to '_'.
>
snippet trigger description1
hoge
snippet trigger description2
piyo
<
If you use hard-tab for indentation inside a snippet file, neosnippet will use
'shiftwidth' instead of Vim indent plugin. This feature is useful while some
languages' indent files do not work very well (e.g.: PHP, Python).
>
snippet if
if (${1:/* condition */}) {
${2:// code...}
}
<
Note: "#{string}" is comment string. But it must be in head.
>
# It is comment string
# It is not comment string!
<
Note: Neosnippet ignores empty or spaces lines in snippet end. If you want to
insert empty line in snippet end, you must insert placeholder.
>
# This is valid.
snippet #!
abbr #!/usr/bin/env ruby
alias shebang
options head
#!/usr/bin/env ruby
${0}
# This is invalid(ignores spaces lines!).
snippet #!
abbr #!/usr/bin/env ruby
alias shebang
options head
#!/usr/bin/env ruby
You can load a Vim script file for snippets.
>
source go.vim
<
UNITE SOURCES *neosnippet-unite-sources*
*neosnippet-unite-source-neosnippet*
neosnippet
The candidates of the snippet source are neosnippet snippets.
and their kind is "snippet". You can use the snippet source
with the mapping |i_<Plug>(neosnippet_start_unite_snippet)|.
But you can also execute it by ":Unite neosnippet". The
snippet source offers an edit action you can use to edit the
snippet files.
Example:
>
imap <C-s> <Plug>(neosnippet_start_unite_snippet)
<
*neosnippet-unite-source-neosnippet/user*
neosnippet/user
The candidates of the user snippet files.
*neosnippet-unite-source-neosnippet/runtime*
neosnippet/runtime
The candidates of the runtime snippet files.
source actions
neosnippet *neosnippet-unite-action-neosnippet*
expand Expand snippet (default action)
edit Edit snippet
preview View snippet definition
==============================================================================
FAQ *neosnippet-faq*
Q: How to donate money to you?
A: I have started github sponsorship to spend more time for Vim/neovim
plugins. You can donate money to help me!
https://github.com/sponsors/Shougo
Q: What if I want to expand a snippet trigger after (, [, " etc...:
A: You should use "options word" in the snippet definition. This changes the
expansion behavior to a word boundary or set
|g:neosnippet#expand_word_boundary|.
>
snippet date
options word
`strftime("%d %b %Y")`
<
Q: Why does neosnippet not indent the expanded snippet?
A: You should use "options indent" in the snippet definition. In default,
neosnippet doesn't indent the expanded line.
Q: What if Neosnippet conflicts with |LustyJuggler|.
http://www.vim.org/scripts/script.php?script_id=2050
A: Please try below settings:
Note: But you must unmap the mappings in select mode manually.
>
let g:neosnippet#disable_select_mode_mappings = 0
<
Q: Error using snipmate-snippets
Note: snipmate-snippets is currently vim-snippets.
https://github.com/Shougo/neosnippet/issues/86
A: Please try the setting below. It defines the snipMate function.
>
let g:neosnippet#enable_snipmate_compatibility = 1
<
Q: I want to disable preview window in neosnippet candidates.
A:
>
set completeopt-=preview
<
Q: I want to add snippets dynamically.
A: You can use |:NeoSnippetSource| for it.
Q: I want to delete markers when InsertLeave event.
A: You can use |:NeoSnippetClearMarkers| command. >
autocmd InsertLeave * NeoSnippetClearMarkers
snoremap <silent><ESC> <ESC>:NeoSnippetClearMarkers<CR>
Q: Why did you separate default snippets from neosnippet core?
A: Because users should choose default snippet collection.
neosnippet has many forks, but almost all forked users change default snippet
files.
https://github.com/Shougo/neosnippet.vim/network
If splitted default snippets, users can fork and change it easily.
Q: I want to complete function arguments using neosnippet like clang_complete.
A: Yes, you can. You can just complete the candidate from completion window
and expand the candidate as trigger.
Note: It works in "func(arg1, arg2, ...)" prototypes only.
Note: It is experiental feature.
Note: |v:completed_item| feature is needed.
Q: I want to expand auto completed parameters.
Q: I want to use |vim-lsp| or |nvim-lsp| snippets with neosnippet.
A: >
let g:neosnippet#enable_completed_snippet = 1
let g:neosnippet#enable_complete_done = 1
Q. How to enable neosnippet the completion in ddc.vim?
A. >
call ddc#custom#patch_global('sources', ['neosnippet'])
call ddc#custom#patch_global('sourceOptions', {
\ '_': {
\ 'matchers': ['matcher_head'],
\ 'sorters': ['sorter_rank']
\ },
\ 'neosnippet': {'mark': 'ns', 'dup': v:true},
\ })
<
==============================================================================
vim:tw=78:ts=8:ft=help:norl:noet:fen:noet:

View File

@@ -0,0 +1,533 @@
:GBrowse fugitive.txt /*:GBrowse*
:GDelete fugitive.txt /*:GDelete*
:GMove fugitive.txt /*:GMove*
:GRemove fugitive.txt /*:GRemove*
:GRename fugitive.txt /*:GRename*
:GUnlink fugitive.txt /*:GUnlink*
:Gblame fugitive.txt /*:Gblame*
:Gbrowse fugitive.txt /*:Gbrowse*
:Gcd fugitive.txt /*:Gcd*
:Gclog fugitive.txt /*:Gclog*
:Gcommit fugitive.txt /*:Gcommit*
:Gdelete fugitive.txt /*:Gdelete*
:Gdiff fugitive.txt /*:Gdiff*
:Gdiffsplit fugitive.txt /*:Gdiffsplit*
:Gdiffsplit! fugitive.txt /*:Gdiffsplit!*
:Gdrop fugitive.txt /*:Gdrop*
:Gedit fugitive.txt /*:Gedit*
:Gfetch fugitive.txt /*:Gfetch*
:Ggrep fugitive.txt /*:Ggrep*
:Ghdiffsplit fugitive.txt /*:Ghdiffsplit*
:Git fugitive.txt /*:Git*
:Git! fugitive.txt /*:Git!*
:Git_--paginate fugitive.txt /*:Git_--paginate*
:Git_-p fugitive.txt /*:Git_-p*
:Git_blame fugitive.txt /*:Git_blame*
:Git_difftool fugitive.txt /*:Git_difftool*
:Git_grep fugitive.txt /*:Git_grep*
:Git_mergetool fugitive.txt /*:Git_mergetool*
:Glcd fugitive.txt /*:Glcd*
:Glgrep fugitive.txt /*:Glgrep*
:Gllog fugitive.txt /*:Gllog*
:Glog fugitive.txt /*:Glog*
:Gmerge fugitive.txt /*:Gmerge*
:Gmove fugitive.txt /*:Gmove*
:Gpedit fugitive.txt /*:Gpedit*
:Gpedit! fugitive.txt /*:Gpedit!*
:Gpull fugitive.txt /*:Gpull*
:Gpush fugitive.txt /*:Gpush*
:Gread fugitive.txt /*:Gread*
:Grebase fugitive.txt /*:Grebase*
:Gremove fugitive.txt /*:Gremove*
:Grename fugitive.txt /*:Grename*
:Grevert fugitive.txt /*:Grevert*
:Gsdiff fugitive.txt /*:Gsdiff*
:Gsplit fugitive.txt /*:Gsplit*
:Gsplit! fugitive.txt /*:Gsplit!*
:Gstatus fugitive.txt /*:Gstatus*
:Gtabedit fugitive.txt /*:Gtabedit*
:Gtabsplit! fugitive.txt /*:Gtabsplit!*
:Gvdiff fugitive.txt /*:Gvdiff*
:Gvdiffsplit fugitive.txt /*:Gvdiffsplit*
:Gvsplit fugitive.txt /*:Gvsplit*
:Gvsplit! fugitive.txt /*:Gvsplit!*
:Gwq fugitive.txt /*:Gwq*
:Gwrite fugitive.txt /*:Gwrite*
:NeoBundle neobundle.txt /*:NeoBundle*
:NeoBundleCheck neobundle.txt /*:NeoBundleCheck*
:NeoBundleCheckUpdate neobundle.txt /*:NeoBundleCheckUpdate*
:NeoBundleClearCache neobundle.txt /*:NeoBundleClearCache*
:NeoBundleCount neobundle.txt /*:NeoBundleCount*
:NeoBundleDirectInstall neobundle.txt /*:NeoBundleDirectInstall*
:NeoBundleDisable neobundle.txt /*:NeoBundleDisable*
:NeoBundleDocs neobundle.txt /*:NeoBundleDocs*
:NeoBundleExtraEdit neobundle.txt /*:NeoBundleExtraEdit*
:NeoBundleFetch neobundle.txt /*:NeoBundleFetch*
:NeoBundleGC neobundle.txt /*:NeoBundleGC*
:NeoBundleInstall neobundle.txt /*:NeoBundleInstall*
:NeoBundleInstall! neobundle.txt /*:NeoBundleInstall!*
:NeoBundleLazy neobundle.txt /*:NeoBundleLazy*
:NeoBundleList neobundle.txt /*:NeoBundleList*
:NeoBundleLoadCache neobundle.txt /*:NeoBundleLoadCache*
:NeoBundleLocal neobundle.txt /*:NeoBundleLocal*
:NeoBundleLog neobundle.txt /*:NeoBundleLog*
:NeoBundleReinstall neobundle.txt /*:NeoBundleReinstall*
:NeoBundleRemotePlugins neobundle.txt /*:NeoBundleRemotePlugins*
:NeoBundleRollback neobundle.txt /*:NeoBundleRollback*
:NeoBundleSaveCache neobundle.txt /*:NeoBundleSaveCache*
:NeoBundleSource neobundle.txt /*:NeoBundleSource*
:NeoBundleUpdate neobundle.txt /*:NeoBundleUpdate*
:NeoBundleUpdate! neobundle.txt /*:NeoBundleUpdate!*
:NeoBundleUpdatesLog neobundle.txt /*:NeoBundleUpdatesLog*
:NeoSnippetClearMarkers neosnippet.txt /*:NeoSnippetClearMarkers*
:NeoSnippetEdit neosnippet.txt /*:NeoSnippetEdit*
:NeoSnippetMakeCache neosnippet.txt /*:NeoSnippetMakeCache*
:NeoSnippetSource neosnippet.txt /*:NeoSnippetSource*
:VimShell vimshell.txt /*:VimShell*
:VimShellCreate vimshell.txt /*:VimShellCreate*
:VimShellExecute vimshell.txt /*:VimShellExecute*
:VimShellInteractive vimshell.txt /*:VimShellInteractive*
:VimShellPop vimshell.txt /*:VimShellPop*
:VimShellSendBuffer vimshell.txt /*:VimShellSendBuffer*
:VimShellSendString vimshell.txt /*:VimShellSendString*
:VimShellTab vimshell.txt /*:VimShellTab*
:VimShellTerminal vimshell.txt /*:VimShellTerminal*
<Plug>(neosnippet_expand) neosnippet.txt /*<Plug>(neosnippet_expand)*
<Plug>(neosnippet_expand_or_jump) neosnippet.txt /*<Plug>(neosnippet_expand_or_jump)*
<Plug>(neosnippet_jump) neosnippet.txt /*<Plug>(neosnippet_jump)*
<Plug>(neosnippet_jump_or_expand) neosnippet.txt /*<Plug>(neosnippet_jump_or_expand)*
<Plug>(vimshell_append_end) vimshell.txt /*<Plug>(vimshell_append_end)*
<Plug>(vimshell_append_enter) vimshell.txt /*<Plug>(vimshell_append_enter)*
<Plug>(vimshell_change_line) vimshell.txt /*<Plug>(vimshell_change_line)*
<Plug>(vimshell_clear) vimshell.txt /*<Plug>(vimshell_clear)*
<Plug>(vimshell_create) vimshell.txt /*<Plug>(vimshell_create)*
<Plug>(vimshell_delete_line) vimshell.txt /*<Plug>(vimshell_delete_line)*
<Plug>(vimshell_delete_previous_output) vimshell.txt /*<Plug>(vimshell_delete_previous_output)*
<Plug>(vimshell_enter) vimshell.txt /*<Plug>(vimshell_enter)*
<Plug>(vimshell_execute_by_background) vimshell.txt /*<Plug>(vimshell_execute_by_background)*
<Plug>(vimshell_exit) vimshell.txt /*<Plug>(vimshell_exit)*
<Plug>(vimshell_hangup) vimshell.txt /*<Plug>(vimshell_hangup)*
<Plug>(vimshell_hide) vimshell.txt /*<Plug>(vimshell_hide)*
<Plug>(vimshell_insert_enter) vimshell.txt /*<Plug>(vimshell_insert_enter)*
<Plug>(vimshell_insert_head) vimshell.txt /*<Plug>(vimshell_insert_head)*
<Plug>(vimshell_int_append_end) vimshell.txt /*<Plug>(vimshell_int_append_end)*
<Plug>(vimshell_int_append_enter) vimshell.txt /*<Plug>(vimshell_int_append_enter)*
<Plug>(vimshell_int_change_line) vimshell.txt /*<Plug>(vimshell_int_change_line)*
<Plug>(vimshell_int_clear) vimshell.txt /*<Plug>(vimshell_int_clear)*
<Plug>(vimshell_int_delete_line) vimshell.txt /*<Plug>(vimshell_int_delete_line)*
<Plug>(vimshell_int_execute_line) vimshell.txt /*<Plug>(vimshell_int_execute_line)*
<Plug>(vimshell_int_exit) vimshell.txt /*<Plug>(vimshell_int_exit)*
<Plug>(vimshell_int_hangup) vimshell.txt /*<Plug>(vimshell_int_hangup)*
<Plug>(vimshell_int_insert_enter) vimshell.txt /*<Plug>(vimshell_int_insert_enter)*
<Plug>(vimshell_int_insert_head) vimshell.txt /*<Plug>(vimshell_int_insert_head)*
<Plug>(vimshell_int_next_prompt) vimshell.txt /*<Plug>(vimshell_int_next_prompt)*
<Plug>(vimshell_int_paste_prompt) vimshell.txt /*<Plug>(vimshell_int_paste_prompt)*
<Plug>(vimshell_int_previous_prompt) vimshell.txt /*<Plug>(vimshell_int_previous_prompt)*
<Plug>(vimshell_int_restart_command) vimshell.txt /*<Plug>(vimshell_int_restart_command)*
<Plug>(vimshell_move_end_argument) vimshell.txt /*<Plug>(vimshell_move_end_argument)*
<Plug>(vimshell_move_head) vimshell.txt /*<Plug>(vimshell_move_head)*
<Plug>(vimshell_next_prompt) vimshell.txt /*<Plug>(vimshell_next_prompt)*
<Plug>(vimshell_paste_prompt) vimshell.txt /*<Plug>(vimshell_paste_prompt)*
<Plug>(vimshell_previous_prompt) vimshell.txt /*<Plug>(vimshell_previous_prompt)*
<Plug>(vimshell_split_create) vimshell.txt /*<Plug>(vimshell_split_create)*
<Plug>(vimshell_split_switch) vimshell.txt /*<Plug>(vimshell_split_switch)*
<Plug>(vimshell_switch) vimshell.txt /*<Plug>(vimshell_switch)*
FugitiveStatusline() fugitive.txt /*FugitiveStatusline()*
User_Fugitive fugitive.txt /*User_Fugitive*
User_FugitiveBlob fugitive.txt /*User_FugitiveBlob*
User_FugitiveChanged fugitive.txt /*User_FugitiveChanged*
User_FugitiveCommit fugitive.txt /*User_FugitiveCommit*
User_FugitiveEditor fugitive.txt /*User_FugitiveEditor*
User_FugitiveIndex fugitive.txt /*User_FugitiveIndex*
User_FugitiveObject fugitive.txt /*User_FugitiveObject*
User_FugitivePager fugitive.txt /*User_FugitivePager*
User_FugitiveStageBlob fugitive.txt /*User_FugitiveStageBlob*
User_FugitiveTag fugitive.txt /*User_FugitiveTag*
User_FugitiveTree fugitive.txt /*User_FugitiveTree*
b:neosnippet_disable_snippet_triggers neosnippet.txt /*b:neosnippet_disable_snippet_triggers*
fugitive fugitive.txt /*fugitive*
fugitive#statusline() fugitive.txt /*fugitive#statusline()*
fugitive-:G fugitive.txt /*fugitive-:G*
fugitive-:Ge fugitive.txt /*fugitive-:Ge*
fugitive-:Gr fugitive.txt /*fugitive-:Gr*
fugitive-:Gw fugitive.txt /*fugitive-:Gw*
fugitive-about fugitive.txt /*fugitive-about*
fugitive-api fugitive.txt /*fugitive-api*
fugitive-autocommands fugitive.txt /*fugitive-autocommands*
fugitive-commands fugitive.txt /*fugitive-commands*
fugitive-deprecated fugitive.txt /*fugitive-deprecated*
fugitive-global-maps fugitive.txt /*fugitive-global-maps*
fugitive-maps fugitive.txt /*fugitive-maps*
fugitive-misc-maps fugitive.txt /*fugitive-misc-maps*
fugitive-navigation-maps fugitive.txt /*fugitive-navigation-maps*
fugitive-object fugitive.txt /*fugitive-object*
fugitive-revision fugitive.txt /*fugitive-revision*
fugitive-staging-maps fugitive.txt /*fugitive-staging-maps*
fugitive-statusline fugitive.txt /*fugitive-statusline*
fugitive-summary fugitive.txt /*fugitive-summary*
fugitive.txt fugitive.txt /*fugitive.txt*
fugitive_# fugitive.txt /*fugitive_#*
fugitive_( fugitive.txt /*fugitive_(*
fugitive_) fugitive.txt /*fugitive_)*
fugitive_- fugitive.txt /*fugitive_-*
fugitive_. fugitive.txt /*fugitive_.*
fugitive_< fugitive.txt /*fugitive_<*
fugitive_<CR> fugitive.txt /*fugitive_<CR>*
fugitive_= fugitive.txt /*fugitive_=*
fugitive_> fugitive.txt /*fugitive_>*
fugitive_C fugitive.txt /*fugitive_C*
fugitive_CTRL-N fugitive.txt /*fugitive_CTRL-N*
fugitive_CTRL-P fugitive.txt /*fugitive_CTRL-P*
fugitive_I fugitive.txt /*fugitive_I*
fugitive_O fugitive.txt /*fugitive_O*
fugitive_P fugitive.txt /*fugitive_P*
fugitive_U fugitive.txt /*fugitive_U*
fugitive_X fugitive.txt /*fugitive_X*
fugitive_[/ fugitive.txt /*fugitive_[\/*
fugitive_[[ fugitive.txt /*fugitive_[[*
fugitive_[] fugitive.txt /*fugitive_[]*
fugitive_[c fugitive.txt /*fugitive_[c*
fugitive_[m fugitive.txt /*fugitive_[m*
fugitive_]/ fugitive.txt /*fugitive_]\/*
fugitive_][ fugitive.txt /*fugitive_][*
fugitive_]] fugitive.txt /*fugitive_]]*
fugitive_]c fugitive.txt /*fugitive_]c*
fugitive_]m fugitive.txt /*fugitive_]m*
fugitive_c fugitive.txt /*fugitive_c*
fugitive_c_CTRL-R_CTRL-G fugitive.txt /*fugitive_c_CTRL-R_CTRL-G*
fugitive_cb fugitive.txt /*fugitive_cb*
fugitive_cm fugitive.txt /*fugitive_cm*
fugitive_co fugitive.txt /*fugitive_co*
fugitive_cr fugitive.txt /*fugitive_cr*
fugitive_cz fugitive.txt /*fugitive_cz*
fugitive_d fugitive.txt /*fugitive_d*
fugitive_d? fugitive.txt /*fugitive_d?*
fugitive_dd fugitive.txt /*fugitive_dd*
fugitive_dh fugitive.txt /*fugitive_dh*
fugitive_dp fugitive.txt /*fugitive_dp*
fugitive_dq fugitive.txt /*fugitive_dq*
fugitive_ds fugitive.txt /*fugitive_ds*
fugitive_dv fugitive.txt /*fugitive_dv*
fugitive_g? fugitive.txt /*fugitive_g?*
fugitive_gI fugitive.txt /*fugitive_gI*
fugitive_gO fugitive.txt /*fugitive_gO*
fugitive_gP fugitive.txt /*fugitive_gP*
fugitive_gU fugitive.txt /*fugitive_gU*
fugitive_gi fugitive.txt /*fugitive_gi*
fugitive_gp fugitive.txt /*fugitive_gp*
fugitive_gq fugitive.txt /*fugitive_gq*
fugitive_gr fugitive.txt /*fugitive_gr*
fugitive_gs fugitive.txt /*fugitive_gs*
fugitive_gu fugitive.txt /*fugitive_gu*
fugitive_i fugitive.txt /*fugitive_i*
fugitive_o fugitive.txt /*fugitive_o*
fugitive_p fugitive.txt /*fugitive_p*
fugitive_q fugitive.txt /*fugitive_q*
fugitive_r fugitive.txt /*fugitive_r*
fugitive_s fugitive.txt /*fugitive_s*
fugitive_star fugitive.txt /*fugitive_star*
fugitive_u fugitive.txt /*fugitive_u*
fugitive_y_CTRL-G fugitive.txt /*fugitive_y_CTRL-G*
fugitive_~ fugitive.txt /*fugitive_~*
g:fugitive_dynamic_colors fugitive.txt /*g:fugitive_dynamic_colors*
g:fugitive_no_maps fugitive.txt /*g:fugitive_no_maps*
g:neobundle#cache_file neobundle.txt /*g:neobundle#cache_file*
g:neobundle#default_options neobundle.txt /*g:neobundle#default_options*
g:neobundle#default_site neobundle.txt /*g:neobundle#default_site*
g:neobundle#enable_name_conversion neobundle.txt /*g:neobundle#enable_name_conversion*
g:neobundle#install_max_processes neobundle.txt /*g:neobundle#install_max_processes*
g:neobundle#install_process_timeout neobundle.txt /*g:neobundle#install_process_timeout*
g:neobundle#log_filename neobundle.txt /*g:neobundle#log_filename*
g:neobundle#rm_command neobundle.txt /*g:neobundle#rm_command*
g:neobundle#types#git#clone_depth neobundle.txt /*g:neobundle#types#git#clone_depth*
g:neobundle#types#git#command_path neobundle.txt /*g:neobundle#types#git#command_path*
g:neobundle#types#git#default_protocol neobundle.txt /*g:neobundle#types#git#default_protocol*
g:neobundle#types#git#enable_submodule neobundle.txt /*g:neobundle#types#git#enable_submodule*
g:neobundle#types#git#pull_command neobundle.txt /*g:neobundle#types#git#pull_command*
g:neobundle#types#hg#command_path neobundle.txt /*g:neobundle#types#hg#command_path*
g:neobundle#types#hg#default_protocol neobundle.txt /*g:neobundle#types#hg#default_protocol*
g:neobundle#types#raw#calc_hash_command neobundle.txt /*g:neobundle#types#raw#calc_hash_command*
g:neobundle#types#svn#command_path neobundle.txt /*g:neobundle#types#svn#command_path*
g:neosnippet#conceal_char neosnippet.txt /*g:neosnippet#conceal_char*
g:neosnippet#data_directory neosnippet.txt /*g:neosnippet#data_directory*
g:neosnippet#disable_runtime_snippets neosnippet.txt /*g:neosnippet#disable_runtime_snippets*
g:neosnippet#disable_select_mode_mappings neosnippet.txt /*g:neosnippet#disable_select_mode_mappings*
g:neosnippet#enable_auto_clear_markers neosnippet.txt /*g:neosnippet#enable_auto_clear_markers*
g:neosnippet#enable_complete_done neosnippet.txt /*g:neosnippet#enable_complete_done*
g:neosnippet#enable_completed_snippet neosnippet.txt /*g:neosnippet#enable_completed_snippet*
g:neosnippet#enable_conceal_markers neosnippet.txt /*g:neosnippet#enable_conceal_markers*
g:neosnippet#enable_optional_arguments neosnippet.txt /*g:neosnippet#enable_optional_arguments*
g:neosnippet#enable_snipmate_compatibility neosnippet.txt /*g:neosnippet#enable_snipmate_compatibility*
g:neosnippet#expand_word_boundary neosnippet.txt /*g:neosnippet#expand_word_boundary*
g:neosnippet#scope_aliases neosnippet.txt /*g:neosnippet#scope_aliases*
g:neosnippet#snippets_directory neosnippet.txt /*g:neosnippet#snippets_directory*
g:vimshell_cat_command vimshell.txt /*g:vimshell_cat_command*
g:vimshell_cd_command vimshell.txt /*g:vimshell_cd_command*
g:vimshell_disable_escape_highlight vimshell.txt /*g:vimshell_disable_escape_highlight*
g:vimshell_environment_term vimshell.txt /*g:vimshell_environment_term*
g:vimshell_escape_colors vimshell.txt /*g:vimshell_escape_colors*
g:vimshell_ignore_case vimshell.txt /*g:vimshell_ignore_case*
g:vimshell_interactive_command_options vimshell.txt /*g:vimshell_interactive_command_options*
g:vimshell_interactive_cygwin_commands vimshell.txt /*g:vimshell_interactive_cygwin_commands*
g:vimshell_interactive_cygwin_home vimshell.txt /*g:vimshell_interactive_cygwin_home*
g:vimshell_interactive_cygwin_path vimshell.txt /*g:vimshell_interactive_cygwin_path*
g:vimshell_interactive_encodings vimshell.txt /*g:vimshell_interactive_encodings*
g:vimshell_interactive_interpreter_commands vimshell.txt /*g:vimshell_interactive_interpreter_commands*
g:vimshell_interactive_monochrome_commands vimshell.txt /*g:vimshell_interactive_monochrome_commands*
g:vimshell_interactive_no_echoback_commands vimshell.txt /*g:vimshell_interactive_no_echoback_commands*
g:vimshell_interactive_no_save_history_commands vimshell.txt /*g:vimshell_interactive_no_save_history_commands*
g:vimshell_interactive_update_time vimshell.txt /*g:vimshell_interactive_update_time*
g:vimshell_max_command_history vimshell.txt /*g:vimshell_max_command_history*
g:vimshell_max_directory_stack vimshell.txt /*g:vimshell_max_directory_stack*
g:vimshell_max_list vimshell.txt /*g:vimshell_max_list*
g:vimshell_no_default_keymappings vimshell.txt /*g:vimshell_no_default_keymappings*
g:vimshell_no_save_history_commands vimshell.txt /*g:vimshell_no_save_history_commands*
g:vimshell_prompt vimshell.txt /*g:vimshell_prompt*
g:vimshell_right_prompt vimshell.txt /*g:vimshell_right_prompt*
g:vimshell_smart_case vimshell.txt /*g:vimshell_smart_case*
g:vimshell_split_command vimshell.txt /*g:vimshell_split_command*
g:vimshell_split_height vimshell.txt /*g:vimshell_split_height*
g:vimshell_temporary_directory vimshell.txt /*g:vimshell_temporary_directory*
g:vimshell_terminal_commands vimshell.txt /*g:vimshell_terminal_commands*
g:vimshell_terminal_cursor vimshell.txt /*g:vimshell_terminal_cursor*
g:vimshell_use_ckw vimshell.txt /*g:vimshell_use_ckw*
g:vimshell_user_prompt vimshell.txt /*g:vimshell_user_prompt*
g:vimshell_vimshrc_path vimshell.txt /*g:vimshell_vimshrc_path*
i_<Plug>(neosnippet_start_unite_snippet) neosnippet.txt /*i_<Plug>(neosnippet_start_unite_snippet)*
i_<Plug>(vimshell_another_delete_backward_char) vimshell.txt /*i_<Plug>(vimshell_another_delete_backward_char)*
i_<Plug>(vimshell_clear) vimshell.txt /*i_<Plug>(vimshell_clear)*
i_<Plug>(vimshell_command_complete) vimshell.txt /*i_<Plug>(vimshell_command_complete)*
i_<Plug>(vimshell_delete_backward_char) vimshell.txt /*i_<Plug>(vimshell_delete_backward_char)*
i_<Plug>(vimshell_delete_backward_line) vimshell.txt /*i_<Plug>(vimshell_delete_backward_line)*
i_<Plug>(vimshell_delete_backward_word) vimshell.txt /*i_<Plug>(vimshell_delete_backward_word)*
i_<Plug>(vimshell_delete_forward_line) vimshell.txt /*i_<Plug>(vimshell_delete_forward_line)*
i_<Plug>(vimshell_enter) vimshell.txt /*i_<Plug>(vimshell_enter)*
i_<Plug>(vimshell_execute_by_background) vimshell.txt /*i_<Plug>(vimshell_execute_by_background)*
i_<Plug>(vimshell_insert_last_word) vimshell.txt /*i_<Plug>(vimshell_insert_last_word)*
i_<Plug>(vimshell_int_another_delete_backward_char) vimshell.txt /*i_<Plug>(vimshell_int_another_delete_backward_char)*
i_<Plug>(vimshell_int_command_complete) vimshell.txt /*i_<Plug>(vimshell_int_command_complete)*
i_<Plug>(vimshell_int_delete_backward_char) vimshell.txt /*i_<Plug>(vimshell_int_delete_backward_char)*
i_<Plug>(vimshell_int_delete_backward_line) vimshell.txt /*i_<Plug>(vimshell_int_delete_backward_line)*
i_<Plug>(vimshell_int_delete_backward_word) vimshell.txt /*i_<Plug>(vimshell_int_delete_backward_word)*
i_<Plug>(vimshell_int_delete_forward_line) vimshell.txt /*i_<Plug>(vimshell_int_delete_forward_line)*
i_<Plug>(vimshell_int_execute_line) vimshell.txt /*i_<Plug>(vimshell_int_execute_line)*
i_<Plug>(vimshell_int_interrupt) vimshell.txt /*i_<Plug>(vimshell_int_interrupt)*
i_<Plug>(vimshell_int_move_head) vimshell.txt /*i_<Plug>(vimshell_int_move_head)*
i_<Plug>(vimshell_int_send_input) vimshell.txt /*i_<Plug>(vimshell_int_send_input)*
i_<Plug>(vimshell_interrupt) vimshell.txt /*i_<Plug>(vimshell_interrupt)*
i_<Plug>(vimshell_move_head) vimshell.txt /*i_<Plug>(vimshell_move_head)*
i_<Plug>(vimshell_move_previous_window) vimshell.txt /*i_<Plug>(vimshell_move_previous_window)*
i_<Plug>(vimshell_push_current_line) vimshell.txt /*i_<Plug>(vimshell_push_current_line)*
i_<Plug>(vimshell_run_help) vimshell.txt /*i_<Plug>(vimshell_run_help)*
neobundle neobundle.txt /*neobundle*
neobundle#add() neobundle.txt /*neobundle#add()*
neobundle#add_meta() neobundle.txt /*neobundle#add_meta()*
neobundle#append() neobundle.txt /*neobundle#append()*
neobundle#begin() neobundle.txt /*neobundle#begin()*
neobundle#bundle() neobundle.txt /*neobundle#bundle()*
neobundle#call_hook() neobundle.txt /*neobundle#call_hook()*
neobundle#config() neobundle.txt /*neobundle#config()*
neobundle#end() neobundle.txt /*neobundle#end()*
neobundle#exists_not_installed_bundles() neobundle.txt /*neobundle#exists_not_installed_bundles()*
neobundle#get() neobundle.txt /*neobundle#get()*
neobundle#get_hooks() neobundle.txt /*neobundle#get_hooks()*
neobundle#get_not_installed_bundle_names() neobundle.txt /*neobundle#get_not_installed_bundle_names()*
neobundle#has_cache() neobundle.txt /*neobundle#has_cache()*
neobundle#hooks neobundle.txt /*neobundle#hooks*
neobundle#is_installed() neobundle.txt /*neobundle#is_installed()*
neobundle#is_sourced() neobundle.txt /*neobundle#is_sourced()*
neobundle#load_cache() neobundle.txt /*neobundle#load_cache()*
neobundle#load_toml() neobundle.txt /*neobundle#load_toml()*
neobundle#local() neobundle.txt /*neobundle#local()*
neobundle#source() neobundle.txt /*neobundle#source()*
neobundle#tap() neobundle.txt /*neobundle#tap()*
neobundle#tapped neobundle.txt /*neobundle#tapped*
neobundle#untap() neobundle.txt /*neobundle#untap()*
neobundle-commands neobundle.txt /*neobundle-commands*
neobundle-contents neobundle.txt /*neobundle-contents*
neobundle-examples neobundle.txt /*neobundle-examples*
neobundle-faq neobundle.txt /*neobundle-faq*
neobundle-functions neobundle.txt /*neobundle-functions*
neobundle-hooks-on_post_source neobundle.txt /*neobundle-hooks-on_post_source*
neobundle-hooks-on_source neobundle.txt /*neobundle-hooks-on_source*
neobundle-install neobundle.txt /*neobundle-install*
neobundle-interface neobundle.txt /*neobundle-interface*
neobundle-introduction neobundle.txt /*neobundle-introduction*
neobundle-migrate-from-pathogen neobundle.txt /*neobundle-migrate-from-pathogen*
neobundle-options neobundle.txt /*neobundle-options*
neobundle-options-augroup neobundle.txt /*neobundle-options-augroup*
neobundle-options-autoload neobundle.txt /*neobundle-options-autoload*
neobundle-options-base neobundle.txt /*neobundle-options-base*
neobundle-options-build neobundle.txt /*neobundle-options-build*
neobundle-options-build_commands neobundle.txt /*neobundle-options-build_commands*
neobundle-options-command_prefix neobundle.txt /*neobundle-options-command_prefix*
neobundle-options-commands neobundle.txt /*neobundle-options-commands*
neobundle-options-default neobundle.txt /*neobundle-options-default*
neobundle-options-depends neobundle.txt /*neobundle-options-depends*
neobundle-options-directory neobundle.txt /*neobundle-options-directory*
neobundle-options-disabled neobundle.txt /*neobundle-options-disabled*
neobundle-options-explorer neobundle.txt /*neobundle-options-explorer*
neobundle-options-external_commands neobundle.txt /*neobundle-options-external_commands*
neobundle-options-fetch neobundle.txt /*neobundle-options-fetch*
neobundle-options-filename_patterns neobundle.txt /*neobundle-options-filename_patterns*
neobundle-options-filetypes neobundle.txt /*neobundle-options-filetypes*
neobundle-options-focus neobundle.txt /*neobundle-options-focus*
neobundle-options-force neobundle.txt /*neobundle-options-force*
neobundle-options-frozen neobundle.txt /*neobundle-options-frozen*
neobundle-options-functions neobundle.txt /*neobundle-options-functions*
neobundle-options-gui neobundle.txt /*neobundle-options-gui*
neobundle-options-hooks neobundle.txt /*neobundle-options-hooks*
neobundle-options-insert neobundle.txt /*neobundle-options-insert*
neobundle-options-install_process_timeout neobundle.txt /*neobundle-options-install_process_timeout*
neobundle-options-lazy neobundle.txt /*neobundle-options-lazy*
neobundle-options-mappings neobundle.txt /*neobundle-options-mappings*
neobundle-options-name neobundle.txt /*neobundle-options-name*
neobundle-options-normalized_name neobundle.txt /*neobundle-options-normalized_name*
neobundle-options-on_cmd neobundle.txt /*neobundle-options-on_cmd*
neobundle-options-on_ft neobundle.txt /*neobundle-options-on_ft*
neobundle-options-on_func neobundle.txt /*neobundle-options-on_func*
neobundle-options-on_i neobundle.txt /*neobundle-options-on_i*
neobundle-options-on_map neobundle.txt /*neobundle-options-on_map*
neobundle-options-on_path neobundle.txt /*neobundle-options-on_path*
neobundle-options-on_source neobundle.txt /*neobundle-options-on_source*
neobundle-options-pre_cmd neobundle.txt /*neobundle-options-pre_cmd*
neobundle-options-rtp neobundle.txt /*neobundle-options-rtp*
neobundle-options-script_type neobundle.txt /*neobundle-options-script_type*
neobundle-options-site neobundle.txt /*neobundle-options-site*
neobundle-options-terminal neobundle.txt /*neobundle-options-terminal*
neobundle-options-type neobundle.txt /*neobundle-options-type*
neobundle-options-type__depth neobundle.txt /*neobundle-options-type__depth*
neobundle-options-type__filename neobundle.txt /*neobundle-options-type__filename*
neobundle-options-type__protocol neobundle.txt /*neobundle-options-type__protocol*
neobundle-options-verbose neobundle.txt /*neobundle-options-verbose*
neobundle-options-vim_version neobundle.txt /*neobundle-options-vim_version*
neobundle-unite-source-neobundle neobundle.txt /*neobundle-unite-source-neobundle*
neobundle-unite-source-neobundle-install neobundle.txt /*neobundle-unite-source-neobundle-install*
neobundle-unite-source-neobundle-lazy neobundle.txt /*neobundle-unite-source-neobundle-lazy*
neobundle-unite-source-neobundle-log neobundle.txt /*neobundle-unite-source-neobundle-log*
neobundle-unite-source-neobundle-search neobundle.txt /*neobundle-unite-source-neobundle-search*
neobundle-unite-source-neobundle-update neobundle.txt /*neobundle-unite-source-neobundle-update*
neobundle-unite-sources neobundle.txt /*neobundle-unite-sources*
neobundle-usage neobundle.txt /*neobundle-usage*
neobundle-variables neobundle.txt /*neobundle-variables*
neobundle.txt neobundle.txt /*neobundle.txt*
neosnippet neosnippet.txt /*neosnippet*
neosnippet#anonymous() neosnippet.txt /*neosnippet#anonymous()*
neosnippet#complete_done() neosnippet.txt /*neosnippet#complete_done()*
neosnippet#expand() neosnippet.txt /*neosnippet#expand()*
neosnippet#expandable() neosnippet.txt /*neosnippet#expandable()*
neosnippet#expandable_or_jumpable() neosnippet.txt /*neosnippet#expandable_or_jumpable()*
neosnippet#get_snippets_directory() neosnippet.txt /*neosnippet#get_snippets_directory()*
neosnippet#jumpable() neosnippet.txt /*neosnippet#jumpable()*
neosnippet-commands neosnippet.txt /*neosnippet-commands*
neosnippet-contents neosnippet.txt /*neosnippet-contents*
neosnippet-edit-options-direction neosnippet.txt /*neosnippet-edit-options-direction*
neosnippet-edit-options-horizontal neosnippet.txt /*neosnippet-edit-options-horizontal*
neosnippet-edit-options-runtime neosnippet.txt /*neosnippet-edit-options-runtime*
neosnippet-edit-options-split neosnippet.txt /*neosnippet-edit-options-split*
neosnippet-edit-options-vertical neosnippet.txt /*neosnippet-edit-options-vertical*
neosnippet-examples neosnippet.txt /*neosnippet-examples*
neosnippet-faq neosnippet.txt /*neosnippet-faq*
neosnippet-functions neosnippet.txt /*neosnippet-functions*
neosnippet-install neosnippet.txt /*neosnippet-install*
neosnippet-interface neosnippet.txt /*neosnippet-interface*
neosnippet-introduction neosnippet.txt /*neosnippet-introduction*
neosnippet-key-mappings neosnippet.txt /*neosnippet-key-mappings*
neosnippet-snippet-syntax neosnippet.txt /*neosnippet-snippet-syntax*
neosnippet-unite-action-neosnippet neosnippet.txt /*neosnippet-unite-action-neosnippet*
neosnippet-unite-source-neosnippet neosnippet.txt /*neosnippet-unite-source-neosnippet*
neosnippet-unite-source-neosnippet/runtime neosnippet.txt /*neosnippet-unite-source-neosnippet\/runtime*
neosnippet-unite-source-neosnippet/user neosnippet.txt /*neosnippet-unite-source-neosnippet\/user*
neosnippet-unite-sources neosnippet.txt /*neosnippet-unite-sources*
neosnippet-variables neosnippet.txt /*neosnippet-variables*
neosnippet.txt neosnippet.txt /*neosnippet.txt*
unite-action-neobundle-lazy neobundle.txt /*unite-action-neobundle-lazy*
unite-action-neobundle-search neobundle.txt /*unite-action-neobundle-search*
unite-kind-neobundle neobundle.txt /*unite-kind-neobundle*
v_<Plug>(vimshell_select_next_prompt) vimshell.txt /*v_<Plug>(vimshell_select_next_prompt)*
v_<Plug>(vimshell_select_previous_prompt) vimshell.txt /*v_<Plug>(vimshell_select_previous_prompt)*
vimshell#hook#add() vimshell.txt /*vimshell#hook#add()*
vimshell#hook#get() vimshell.txt /*vimshell#hook#get()*
vimshell#hook#remove() vimshell.txt /*vimshell#hook#remove()*
vimshell#hook#set() vimshell.txt /*vimshell#hook#set()*
vimshell-alter-command vimshell.txt /*vimshell-alter-command*
vimshell-buffer-key-mappings vimshell.txt /*vimshell-buffer-key-mappings*
vimshell-changelog vimshell.txt /*vimshell-changelog*
vimshell-commands vimshell.txt /*vimshell-commands*
vimshell-contents vimshell.txt /*vimshell-contents*
vimshell-create-plugin vimshell.txt /*vimshell-create-plugin*
vimshell-examples vimshell.txt /*vimshell-examples*
vimshell-execute-options vimshell.txt /*vimshell-execute-options*
vimshell-execute-options-encoding vimshell.txt /*vimshell-execute-options-encoding*
vimshell-functions vimshell.txt /*vimshell-functions*
vimshell-hook vimshell.txt /*vimshell-hook*
vimshell-hook-chpwd vimshell.txt /*vimshell-hook-chpwd*
vimshell-hook-emptycmd vimshell.txt /*vimshell-hook-emptycmd*
vimshell-hook-notfound vimshell.txt /*vimshell-hook-notfound*
vimshell-hook-postexec vimshell.txt /*vimshell-hook-postexec*
vimshell-hook-postinput vimshell.txt /*vimshell-hook-postinput*
vimshell-hook-preexec vimshell.txt /*vimshell-hook-preexec*
vimshell-hook-preinput vimshell.txt /*vimshell-hook-preinput*
vimshell-hook-preparse vimshell.txt /*vimshell-hook-preparse*
vimshell-hook-preprompt vimshell.txt /*vimshell-hook-preprompt*
vimshell-install vimshell.txt /*vimshell-install*
vimshell-interactive-buffer-key-mappings vimshell.txt /*vimshell-interactive-buffer-key-mappings*
vimshell-interface vimshell.txt /*vimshell-interface*
vimshell-internal-bg vimshell.txt /*vimshell-internal-bg*
vimshell-internal-cd vimshell.txt /*vimshell-internal-cd*
vimshell-internal-clear vimshell.txt /*vimshell-internal-clear*
vimshell-internal-commands vimshell.txt /*vimshell-internal-commands*
vimshell-internal-dirs vimshell.txt /*vimshell-internal-dirs*
vimshell-internal-echo vimshell.txt /*vimshell-internal-echo*
vimshell-internal-eval vimshell.txt /*vimshell-internal-eval*
vimshell-internal-exe vimshell.txt /*vimshell-internal-exe*
vimshell-internal-exit vimshell.txt /*vimshell-internal-exit*
vimshell-internal-galias vimshell.txt /*vimshell-internal-galias*
vimshell-internal-gcd vimshell.txt /*vimshell-internal-gcd*
vimshell-internal-gendoc vimshell.txt /*vimshell-internal-gendoc*
vimshell-internal-gexe vimshell.txt /*vimshell-internal-gexe*
vimshell-internal-h vimshell.txt /*vimshell-internal-h*
vimshell-internal-histdel vimshell.txt /*vimshell-internal-histdel*
vimshell-internal-history vimshell.txt /*vimshell-internal-history*
vimshell-internal-iexe vimshell.txt /*vimshell-internal-iexe*
vimshell-internal-less vimshell.txt /*vimshell-internal-less*
vimshell-internal-ls vimshell.txt /*vimshell-internal-ls*
vimshell-internal-mkcd vimshell.txt /*vimshell-internal-mkcd*
vimshell-internal-nop vimshell.txt /*vimshell-internal-nop*
vimshell-internal-open vimshell.txt /*vimshell-internal-open*
vimshell-internal-popd vimshell.txt /*vimshell-internal-popd*
vimshell-internal-pwd vimshell.txt /*vimshell-internal-pwd*
vimshell-internal-repeat vimshell.txt /*vimshell-internal-repeat*
vimshell-internal-shell vimshell.txt /*vimshell-internal-shell*
vimshell-internal-source vimshell.txt /*vimshell-internal-source*
vimshell-internal-texe vimshell.txt /*vimshell-internal-texe*
vimshell-internal-time vimshell.txt /*vimshell-internal-time*
vimshell-internal-vi vimshell.txt /*vimshell-internal-vi*
vimshell-internal-view vimshell.txt /*vimshell-internal-view*
vimshell-internal-vim vimshell.txt /*vimshell-internal-vim*
vimshell-internal-vimdiff vimshell.txt /*vimshell-internal-vimdiff*
vimshell-internal-vimsh vimshell.txt /*vimshell-internal-vimsh*
vimshell-internal-whereis vimshell.txt /*vimshell-internal-whereis*
vimshell-internal-which vimshell.txt /*vimshell-internal-which*
vimshell-introduction vimshell.txt /*vimshell-introduction*
vimshell-key-mappings vimshell.txt /*vimshell-key-mappings*
vimshell-special-alias vimshell.txt /*vimshell-special-alias*
vimshell-special-commands vimshell.txt /*vimshell-special-commands*
vimshell-special-let vimshell.txt /*vimshell-special-let*
vimshell-special-sexe vimshell.txt /*vimshell-special-sexe*
vimshell-special-vexe vimshell.txt /*vimshell-special-vexe*
vimshell-tips vimshell.txt /*vimshell-tips*
vimshell-tips-auto_cd vimshell.txt /*vimshell-tips-auto_cd*
vimshell-tips-backquote vimshell.txt /*vimshell-tips-backquote*
vimshell-tips-block vimshell.txt /*vimshell-tips-block*
vimshell-tips-directory-stack vimshell.txt /*vimshell-tips-directory-stack*
vimshell-tips-fakecygpty vimshell.txt /*vimshell-tips-fakecygpty*
vimshell-tips-wildcard vimshell.txt /*vimshell-tips-wildcard*
vimshell-unite-action-vimshell-history vimshell.txt /*vimshell-unite-action-vimshell-history*
vimshell-unite-source-vimshell-history vimshell.txt /*vimshell-unite-source-vimshell-history*
vimshell-unite-sources vimshell.txt /*vimshell-unite-sources*
vimshell-usage vimshell.txt /*vimshell-usage*
vimshell-variables vimshell.txt /*vimshell-variables*
vimshell.txt vimshell.txt /*vimshell.txt*
x_<Plug>(neosnippet_expand_target) neosnippet.txt /*x_<Plug>(neosnippet_expand_target)*
x_<Plug>(neosnippet_register_oneshot_snippet) neosnippet.txt /*x_<Plug>(neosnippet_register_oneshot_snippet)*

View File

@@ -0,0 +1,190 @@
!_TAG_FILE_ENCODING utf-8 //
:VimShell vimshell.jax /*:VimShell*
:VimShellCreate vimshell.jax /*:VimShellCreate*
:VimShellExecute vimshell.jax /*:VimShellExecute*
:VimShellInteractive vimshell.jax /*:VimShellInteractive*
:VimShellPop vimshell.jax /*:VimShellPop*
:VimShellSendBuffer vimshell.jax /*:VimShellSendBuffer*
:VimShellSendString vimshell.jax /*:VimShellSendString*
:VimShellTab vimshell.jax /*:VimShellTab*
:VimShellTerminal vimshell.jax /*:VimShellTerminal*
<Plug>(vimshell_append_end) vimshell.jax /*<Plug>(vimshell_append_end)*
<Plug>(vimshell_append_enter) vimshell.jax /*<Plug>(vimshell_append_enter)*
<Plug>(vimshell_change_line) vimshell.jax /*<Plug>(vimshell_change_line)*
<Plug>(vimshell_clear) vimshell.jax /*<Plug>(vimshell_clear)*
<Plug>(vimshell_create) vimshell.jax /*<Plug>(vimshell_create)*
<Plug>(vimshell_delete_line) vimshell.jax /*<Plug>(vimshell_delete_line)*
<Plug>(vimshell_delete_previous_output) vimshell.jax /*<Plug>(vimshell_delete_previous_output)*
<Plug>(vimshell_enter) vimshell.jax /*<Plug>(vimshell_enter)*
<Plug>(vimshell_execute_by_background) vimshell.jax /*<Plug>(vimshell_execute_by_background)*
<Plug>(vimshell_exit) vimshell.jax /*<Plug>(vimshell_exit)*
<Plug>(vimshell_hangup) vimshell.jax /*<Plug>(vimshell_hangup)*
<Plug>(vimshell_hide) vimshell.jax /*<Plug>(vimshell_hide)*
<Plug>(vimshell_insert_enter) vimshell.jax /*<Plug>(vimshell_insert_enter)*
<Plug>(vimshell_insert_head) vimshell.jax /*<Plug>(vimshell_insert_head)*
<Plug>(vimshell_int_append_end) vimshell.jax /*<Plug>(vimshell_int_append_end)*
<Plug>(vimshell_int_append_enter) vimshell.jax /*<Plug>(vimshell_int_append_enter)*
<Plug>(vimshell_int_change_line) vimshell.jax /*<Plug>(vimshell_int_change_line)*
<Plug>(vimshell_int_clear) vimshell.jax /*<Plug>(vimshell_int_clear)*
<Plug>(vimshell_int_delete_line) vimshell.jax /*<Plug>(vimshell_int_delete_line)*
<Plug>(vimshell_int_execute_line) vimshell.jax /*<Plug>(vimshell_int_execute_line)*
<Plug>(vimshell_int_exit) vimshell.jax /*<Plug>(vimshell_int_exit)*
<Plug>(vimshell_int_hangup) vimshell.jax /*<Plug>(vimshell_int_hangup)*
<Plug>(vimshell_int_insert_enter) vimshell.jax /*<Plug>(vimshell_int_insert_enter)*
<Plug>(vimshell_int_insert_head) vimshell.jax /*<Plug>(vimshell_int_insert_head)*
<Plug>(vimshell_int_next_prompt) vimshell.jax /*<Plug>(vimshell_int_next_prompt)*
<Plug>(vimshell_int_paste_prompt) vimshell.jax /*<Plug>(vimshell_int_paste_prompt)*
<Plug>(vimshell_int_previous_prompt) vimshell.jax /*<Plug>(vimshell_int_previous_prompt)*
<Plug>(vimshell_int_restart_command) vimshell.jax /*<Plug>(vimshell_int_restart_command)*
<Plug>(vimshell_move_end_argument) vimshell.jax /*<Plug>(vimshell_move_end_argument)*
<Plug>(vimshell_move_head) vimshell.jax /*<Plug>(vimshell_move_head)*
<Plug>(vimshell_next_prompt) vimshell.jax /*<Plug>(vimshell_next_prompt)*
<Plug>(vimshell_paste_prompt) vimshell.jax /*<Plug>(vimshell_paste_prompt)*
<Plug>(vimshell_previous_prompt) vimshell.jax /*<Plug>(vimshell_previous_prompt)*
<Plug>(vimshell_split_create) vimshell.jax /*<Plug>(vimshell_split_create)*
<Plug>(vimshell_split_switch) vimshell.jax /*<Plug>(vimshell_split_switch)*
<Plug>(vimshell_switch) vimshell.jax /*<Plug>(vimshell_switch)*
g:vimshell_cat_command vimshell.jax /*g:vimshell_cat_command*
g:vimshell_cd_command vimshell.jax /*g:vimshell_cd_command*
g:vimshell_disable_escape_highlight vimshell.jax /*g:vimshell_disable_escape_highlight*
g:vimshell_environment_term vimshell.jax /*g:vimshell_environment_term*
g:vimshell_escape_colors vimshell.jax /*g:vimshell_escape_colors*
g:vimshell_ignore_case vimshell.jax /*g:vimshell_ignore_case*
g:vimshell_interactive_command_options vimshell.jax /*g:vimshell_interactive_command_options*
g:vimshell_interactive_cygwin_commands vimshell.jax /*g:vimshell_interactive_cygwin_commands*
g:vimshell_interactive_cygwin_home vimshell.jax /*g:vimshell_interactive_cygwin_home*
g:vimshell_interactive_cygwin_path vimshell.jax /*g:vimshell_interactive_cygwin_path*
g:vimshell_interactive_encodings vimshell.jax /*g:vimshell_interactive_encodings*
g:vimshell_interactive_interpreter_commands vimshell.jax /*g:vimshell_interactive_interpreter_commands*
g:vimshell_interactive_monochrome_commands vimshell.jax /*g:vimshell_interactive_monochrome_commands*
g:vimshell_interactive_no_echoback_commands vimshell.jax /*g:vimshell_interactive_no_echoback_commands*
g:vimshell_interactive_no_save_history_commands vimshell.jax /*g:vimshell_interactive_no_save_history_commands*
g:vimshell_interactive_update_time vimshell.jax /*g:vimshell_interactive_update_time*
g:vimshell_max_command_history vimshell.jax /*g:vimshell_max_command_history*
g:vimshell_max_directory_stack vimshell.jax /*g:vimshell_max_directory_stack*
g:vimshell_max_list vimshell.jax /*g:vimshell_max_list*
g:vimshell_no_default_keymappings vimshell.jax /*g:vimshell_no_default_keymappings*
g:vimshell_no_save_history_commands vimshell.jax /*g:vimshell_no_save_history_commands*
g:vimshell_prompt vimshell.jax /*g:vimshell_prompt*
g:vimshell_right_prompt vimshell.jax /*g:vimshell_right_prompt*
g:vimshell_smart_case vimshell.jax /*g:vimshell_smart_case*
g:vimshell_split_command vimshell.jax /*g:vimshell_split_command*
g:vimshell_split_height vimshell.jax /*g:vimshell_split_height*
g:vimshell_temporary_directory vimshell.jax /*g:vimshell_temporary_directory*
g:vimshell_terminal_commands vimshell.jax /*g:vimshell_terminal_commands*
g:vimshell_terminal_cursor vimshell.jax /*g:vimshell_terminal_cursor*
g:vimshell_use_terminal_command vimshell.jax /*g:vimshell_use_terminal_command*
g:vimshell_user_prompt vimshell.jax /*g:vimshell_user_prompt*
g:vimshell_vimshrc_path vimshell.jax /*g:vimshell_vimshrc_path*
i_<Plug>(vimshell_another_delete_backward_char) vimshell.jax /*i_<Plug>(vimshell_another_delete_backward_char)*
i_<Plug>(vimshell_clear) vimshell.jax /*i_<Plug>(vimshell_clear)*
i_<Plug>(vimshell_command_complete) vimshell.jax /*i_<Plug>(vimshell_command_complete)*
i_<Plug>(vimshell_delete_backward_char) vimshell.jax /*i_<Plug>(vimshell_delete_backward_char)*
i_<Plug>(vimshell_delete_backward_line) vimshell.jax /*i_<Plug>(vimshell_delete_backward_line)*
i_<Plug>(vimshell_delete_backward_word) vimshell.jax /*i_<Plug>(vimshell_delete_backward_word)*
i_<Plug>(vimshell_delete_forward_line) vimshell.jax /*i_<Plug>(vimshell_delete_forward_line)*
i_<Plug>(vimshell_enter) vimshell.jax /*i_<Plug>(vimshell_enter)*
i_<Plug>(vimshell_execute_by_background) vimshell.jax /*i_<Plug>(vimshell_execute_by_background)*
i_<Plug>(vimshell_insert_last_word) vimshell.jax /*i_<Plug>(vimshell_insert_last_word)*
i_<Plug>(vimshell_int_another_delete_backward_char) vimshell.jax /*i_<Plug>(vimshell_int_another_delete_backward_char)*
i_<Plug>(vimshell_int_command_complete) vimshell.jax /*i_<Plug>(vimshell_int_command_complete)*
i_<Plug>(vimshell_int_delete_backward_char) vimshell.jax /*i_<Plug>(vimshell_int_delete_backward_char)*
i_<Plug>(vimshell_int_delete_backward_line) vimshell.jax /*i_<Plug>(vimshell_int_delete_backward_line)*
i_<Plug>(vimshell_int_delete_backward_word) vimshell.jax /*i_<Plug>(vimshell_int_delete_backward_word)*
i_<Plug>(vimshell_int_delete_forward_line) vimshell.jax /*i_<Plug>(vimshell_int_delete_forward_line)*
i_<Plug>(vimshell_int_execute_line) vimshell.jax /*i_<Plug>(vimshell_int_execute_line)*
i_<Plug>(vimshell_int_interrupt) vimshell.jax /*i_<Plug>(vimshell_int_interrupt)*
i_<Plug>(vimshell_int_move_head) vimshell.jax /*i_<Plug>(vimshell_int_move_head)*
i_<Plug>(vimshell_int_send_input) vimshell.jax /*i_<Plug>(vimshell_int_send_input)*
i_<Plug>(vimshell_interrupt) vimshell.jax /*i_<Plug>(vimshell_interrupt)*
i_<Plug>(vimshell_move_head) vimshell.jax /*i_<Plug>(vimshell_move_head)*
i_<Plug>(vimshell_move_previous_window) vimshell.jax /*i_<Plug>(vimshell_move_previous_window)*
i_<Plug>(vimshell_push_current_line) vimshell.jax /*i_<Plug>(vimshell_push_current_line)*
i_<Plug>(vimshell_run_help) vimshell.jax /*i_<Plug>(vimshell_run_help)*
v_<Plug>(vimshell_select_next_prompt) vimshell.jax /*v_<Plug>(vimshell_select_next_prompt)*
v_<Plug>(vimshell_select_previous_prompt) vimshell.jax /*v_<Plug>(vimshell_select_previous_prompt)*
vimshell#hook#add() vimshell.jax /*vimshell#hook#add()*
vimshell#hook#get() vimshell.jax /*vimshell#hook#get()*
vimshell#hook#remove() vimshell.jax /*vimshell#hook#remove()*
vimshell#hook#set() vimshell.jax /*vimshell#hook#set()*
vimshell-alter-command vimshell.jax /*vimshell-alter-command*
vimshell-buffer-key-mappings vimshell.jax /*vimshell-buffer-key-mappings*
vimshell-changelog vimshell.jax /*vimshell-changelog*
vimshell-commands vimshell.jax /*vimshell-commands*
vimshell-contents vimshell.jax /*vimshell-contents*
vimshell-create-plugin vimshell.jax /*vimshell-create-plugin*
vimshell-examples vimshell.jax /*vimshell-examples*
vimshell-execute-options vimshell.jax /*vimshell-execute-options*
vimshell-execute-options-encoding vimshell.jax /*vimshell-execute-options-encoding*
vimshell-functions vimshell.jax /*vimshell-functions*
vimshell-hook vimshell.jax /*vimshell-hook*
vimshell-hook-chpwd vimshell.jax /*vimshell-hook-chpwd*
vimshell-hook-emptycmd vimshell.jax /*vimshell-hook-emptycmd*
vimshell-hook-notfound vimshell.jax /*vimshell-hook-notfound*
vimshell-hook-postexec vimshell.jax /*vimshell-hook-postexec*
vimshell-hook-postinput vimshell.jax /*vimshell-hook-postinput*
vimshell-hook-preexec vimshell.jax /*vimshell-hook-preexec*
vimshell-hook-preinput vimshell.jax /*vimshell-hook-preinput*
vimshell-hook-preparse vimshell.jax /*vimshell-hook-preparse*
vimshell-hook-preprompt vimshell.jax /*vimshell-hook-preprompt*
vimshell-install vimshell.jax /*vimshell-install*
vimshell-interactive-buffer-key-mappings vimshell.jax /*vimshell-interactive-buffer-key-mappings*
vimshell-interface vimshell.jax /*vimshell-interface*
vimshell-internal-bg vimshell.jax /*vimshell-internal-bg*
vimshell-internal-cd vimshell.jax /*vimshell-internal-cd*
vimshell-internal-clear vimshell.jax /*vimshell-internal-clear*
vimshell-internal-commands vimshell.jax /*vimshell-internal-commands*
vimshell-internal-dirs vimshell.jax /*vimshell-internal-dirs*
vimshell-internal-echo vimshell.jax /*vimshell-internal-echo*
vimshell-internal-eval vimshell.jax /*vimshell-internal-eval*
vimshell-internal-exe vimshell.jax /*vimshell-internal-exe*
vimshell-internal-exit vimshell.jax /*vimshell-internal-exit*
vimshell-internal-galias vimshell.jax /*vimshell-internal-galias*
vimshell-internal-gcd vimshell.jax /*vimshell-internal-gcd*
vimshell-internal-gendoc vimshell.jax /*vimshell-internal-gendoc*
vimshell-internal-gexe vimshell.jax /*vimshell-internal-gexe*
vimshell-internal-h vimshell.jax /*vimshell-internal-h*
vimshell-internal-histdel vimshell.jax /*vimshell-internal-histdel*
vimshell-internal-history vimshell.jax /*vimshell-internal-history*
vimshell-internal-iexe vimshell.jax /*vimshell-internal-iexe*
vimshell-internal-less vimshell.jax /*vimshell-internal-less*
vimshell-internal-ls vimshell.jax /*vimshell-internal-ls*
vimshell-internal-mkcd vimshell.jax /*vimshell-internal-mkcd*
vimshell-internal-nop vimshell.jax /*vimshell-internal-nop*
vimshell-internal-open vimshell.jax /*vimshell-internal-open*
vimshell-internal-popd vimshell.jax /*vimshell-internal-popd*
vimshell-internal-pwd vimshell.jax /*vimshell-internal-pwd*
vimshell-internal-repeat vimshell.jax /*vimshell-internal-repeat*
vimshell-internal-shell vimshell.jax /*vimshell-internal-shell*
vimshell-internal-source vimshell.jax /*vimshell-internal-source*
vimshell-internal-texe vimshell.jax /*vimshell-internal-texe*
vimshell-internal-time vimshell.jax /*vimshell-internal-time*
vimshell-internal-vi vimshell.jax /*vimshell-internal-vi*
vimshell-internal-view vimshell.jax /*vimshell-internal-view*
vimshell-internal-vim vimshell.jax /*vimshell-internal-vim*
vimshell-internal-vimdiff vimshell.jax /*vimshell-internal-vimdiff*
vimshell-internal-vimsh vimshell.jax /*vimshell-internal-vimsh*
vimshell-internal-whereis vimshell.jax /*vimshell-internal-whereis*
vimshell-internal-which vimshell.jax /*vimshell-internal-which*
vimshell-introduction vimshell.jax /*vimshell-introduction*
vimshell-key-mappings vimshell.jax /*vimshell-key-mappings*
vimshell-special-alias vimshell.jax /*vimshell-special-alias*
vimshell-special-commands vimshell.jax /*vimshell-special-commands*
vimshell-special-let vimshell.jax /*vimshell-special-let*
vimshell-special-sexe vimshell.jax /*vimshell-special-sexe*
vimshell-special-vexe vimshell.jax /*vimshell-special-vexe*
vimshell-tips vimshell.jax /*vimshell-tips*
vimshell-tips-auto_cd vimshell.jax /*vimshell-tips-auto_cd*
vimshell-tips-backquote vimshell.jax /*vimshell-tips-backquote*
vimshell-tips-block vimshell.jax /*vimshell-tips-block*
vimshell-tips-directory-stack vimshell.jax /*vimshell-tips-directory-stack*
vimshell-tips-fakecygpty vimshell.jax /*vimshell-tips-fakecygpty*
vimshell-tips-japanese vimshell.jax /*vimshell-tips-japanese*
vimshell-tips-sudo vimshell.jax /*vimshell-tips-sudo*
vimshell-tips-wildcard vimshell.jax /*vimshell-tips-wildcard*
vimshell-unite-action-vimshell-history vimshell.jax /*vimshell-unite-action-vimshell-history*
vimshell-unite-source-vimshell-history vimshell.jax /*vimshell-unite-source-vimshell-history*
vimshell-unite-sources vimshell.jax /*vimshell-unite-sources*
vimshell-usage vimshell.jax /*vimshell-usage*
vimshell-variables vimshell.jax /*vimshell-variables*
vimshell.txt vimshell.jax /*vimshell.txt*

View File

@@ -0,0 +1,1270 @@
*vimshell.txt* Vim Scriptで実装された強力なシェル
Version: 9.0
Author : Shougo <Shougo.Matsu@gmail.com>
License: MIT license {{{
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
}}}
CONTENTS *vimshell-contents*
Introduction |vimshell-introduction|
Install |vimshell-install|
Interface |vimshell-interface|
Commands |vimshell-commands|
Variables |vimshell-variables|
Functions |vimshell-functions|
Key mappings |vimshell-key-mappings|
Vimshell buffer key mappings |vimshell-buffer-key-mappings|
Interactive buffer key mappings |vimshell-interactive-buffer-key-mappings|
Examples |vimshell-examples|
Internal Commands |vimshell-internal-commands|
Special Commands |vimshell-special-commands|
Alter Command |vimshell-alter-command|
Hook |vimshell-hook|
Tips |vimshell-tips|
Unite sources |vimshell-unite-sources|
Create plugin |vimshell-create-plugin|
Changelog |vimshell-changelog|
==============================================================================
INTRODUCTION *vimshell-introduction*
vimshellは外部のシェルを使わず、100% Vim Scriptによって実装された究極のシェルで
ある。 ただしeshellとは異なり、まだまだ未完成である。 一番の特徴としては、Vimの
プラグインと連携ができることだ。特にWindowsはシェルが貧弱なのだが、vimshellは
Windowsでも動作するので安心である。ただしWindows上では一部の機能が制限されるの
で注意しなければならない。 加えて、他のシェルの便利な機能を多数取り込んでいる。
設定して当たり前の機能は標準的に使えるため、zshと比べて設定の手間も少ない。
ちなみに、使いやすいシェルを目指しているため、変数の規則などが普通のシェルと
異なる。
==============================================================================
USAGE *vimshell-usage*
vimshellを起動するには、|:VimShell|コマンドを実行する。 これが面倒なら、便利な
キーマッピングも定義されているので使用すると良い。 一部の相違点を除けば、
vimshellは他のシェルと同じように動作する。 よって、すぐに使い始めることができる
。 ただし、vimshellは\をエスケープシーケンスとして認識する。 たとえWindows環境
であってもパスは/を用いなければならない。
vimshellは初期化ファイルとして、.vimshrcを読み込む。
aliasの設定はそこで行っておくと便利である。
Note: vimshellとbash, zshは全く別のシェルであり、互換性はない。よって、vimshell
は.bashrcや.zshrcを読み込むことはない。環境変数の設定だけは、
|vimshell-internal-source|コマンドにより引き継ぐことができる。
==============================================================================
INSTALL *vimshell-install*
http://github.com/Shougo/vimshell/tree/master より、配布ファイルをそのフォルダ
ごとVimの'runtimepath'にコピーする。
さらに、vimshellを使用するにはvimprocが必要である。
私がvimshell用に修正したvimprocがあるので、それをリポジトリから取ってきくる。
http://github.com/Shougo/vimproc
そしてproc.soをmakeする。
Make方法
* Mingw: >
$ make -f make_mingw.mak
* Mac OS X: >
$ make -f make_mac.mak
* Linux BSD: >
$ make -f make_gcc.mak
* Visual Studio: >
$ make -f make_msvc.mak
* Cygwin: >
$ make -f make_cygwin.mak
コンパイルが通ったら、autoloadにあるvimproc.vim, vimproc/parser.vimとproc.soを
.vimのautoloadディレクトリにコピーする。Cygwinでコンパイルしたproc.dllは
Cygwin上のVim専用である。WindowsのVimでは使用することができない。
==============================================================================
INTERFACE *vimshell-interface*
------------------------------------------------------------------------------
COMMANDS *vimshell-commands*
:VimShell {path} *:VimShell*
{path}をカレントディレクトリとして、vimshellを起動する。
他のvimshellが起動している場合、そのvimshellにスイッ
チし、カレントディレクトリを{path}に変更する。{path}を
省略した場合、vimshellのカレントディレクトリは変更され
ない。
:VimShellCreate {path} *:VimShellCreate*
|:VimShell|と同じだが、他のvimshellが起動している
場合でも、新しいvimshellバッファを作成する。
:VimShellTab {path} *:VimShellTab*
|:VimShellCreate|と同じだが、新しいタブを生成する。
:VimShellPop {path} *:VimShellPop*
|:VimShell|と同じだが、こちらは小さいウインドウを
ポップアップする。ちょっとだけvimshellの機能を使
いたいときに便利である。ウインドウを分割する高さは
|g:vimshell_split_height|で決定される。
現在vimshellバッファに居るときは、vimshellバッファを閉
じる。
:VimShellExecute {command} *:VimShellExecute*
vimshellを起動せずに、{command}で指定された実行
ファイルをバックグラウンドで起動する。vimshellを
GNU screenのように使える。
:VimShellInteractive [{command}] *:VimShellInteractive*
vimshellを起動せずに、{command}で指定された
インタプリタを起動する。EmacsのM-x
{interpreter-name}のように使える。{command}
を省略すると、
|g:vimshell_interactive_interpreter_commands|の値が
使われる。
:VimShellTerminal {command} *:VimShellTerminal*
vimshellを起動せずに、{command}で指定された端末プログラ
ムを起動する。Emacsのansi-termのように使用できる。ただ
しまだ未完成である。
:VimShellSendString {string} *:VimShellSendString*
vimshell, iexe, texeの裏ウインドウのインタプリタに選
択文字列を送信する。まるで|quickrun|を使っているかの
ようにインタプリタを操作できる。
:VimShellSendBuffer {bufname} *:VimShellSendBuffer*
裏ウインドウを{bufname}として設定する。{bufname}が
画面に表示されていない場合、自動的に開く。
------------------------------------------------------------------------------
VARIABLES *vimshell-variables*
g:vimshell_prompt *g:vimshell_prompt*
vimshellのプロンプト文字列を設定する。これは一度し
か評価されない。
セキュリティの関係上、vimshellの関数を呼び出す前に値
を設定しなければ無効になる。
初期値は'vimshell% 'である。
g:vimshell_user_prompt *g:vimshell_user_prompt*
この変数にVim Scriptの式を文字列として代入することで、
ユーザーが追加で表示されるプロンプトを定義できる。
|g:vimshell_prompt|と違い、固定文字列でなくても良い。
ユーザープロンプトを\nで区切ることで、 複数行のユー
ザープロンプトが表示できる。
例えば、このように毎回カレントディレクトリを表示する
ようにすれば便利である。
>
let g:vimshell_user_prompt = 'getcwd()'
<
セキュリティの関係上、vimshellの関数を呼び出す前に値
を設定しなければ無効になる。
初期値は空である。
g:vimshell_right_prompt *g:vimshell_right_prompt*
zsh風の右プロンプトである。Vim Scriptの式を文字列として
代入する。|g:vimshell_user_prompt|に似ているが、ウイン
ドウの大きさを計算し、自動的に最適な位置にプロンプトを
表示する。
セキュリティの関係上、vimshellの関数を呼び出す前に値
を設定しなければ無効になる。
初期値は空である。
g:vimshell_no_default_keymappings *g:vimshell_no_default_keymappings*
vimshellのデフォルトマッピングをすべて無効化する。
新しくマッピングしない限り、vimshellの機能が使えなく
なるので、初心者にはお勧めできない。内部動作を知
り尽くしている上級者向けのオプションである。
g:vimshell_ignore_case *g:vimshell_ignore_case*
vimshellが補完候補を検索する際に、大文字小文字を無視
するかを制御する。
初期値は&ignorecaseである。
g:vimshell_smart_case *g:vimshell_smart_case*
このオプションが有効だと、vimshellが補完候補を検索する
際に、大文字が入力されていれば大文字小文字を無視しなく
なる。
初期値は0である。
g:vimshell_max_list *g:vimshell_max_list*
vimshellの補完候補の最大数である。補完候補の数がこれを
越えると、勝手に候補を切り詰める。
初期値は100である。
g:vimshell_use_terminal_command *g:vimshell_use_terminal_command*
|vimshell-internal-shell|を実行する際に、シェルを起動す
る端末プログラムを指定する。
Windows環境では、"ckw -e", Linux環境では
"gnome-terminal -e"などが値の候補となるだろう。
初期値は""である。
g:vimshell_split_height *g:vimshell_split_height*
|:VimShellPop|の分割高さを指定する。指定する値は
|winheight(0)|に対するパーセントになる。
初期値は30である。
g:vimshell_temporary_directory *g:vimshell_temporary_directory*
vimshellが使用する一時ディレクトリを指定する。ヒストリ
ファイルもこのディレクトリ下に保存される。
初期値はexpand('~/.vimshell')である。
g:vimshell_max_command_history *g:vimshell_max_command_history*
vimshellが保存するヒストリの最大数を指定する。
初期値は1000である。
g:vimshell_max_directory_stack *g:vimshell_max_directory_stack*
vimshellが保存するディレクトリスタックの最大数を指定する。
初期値は100である。
g:vimshell_vimshrc_path *g:vimshell_vimshrc_path*
vimshellが最初に読み込むシェルの設定ファイル.vimshrc
を指定する。これはbashでいう.bashrcに似ている。そ
のファイルの中でエイリアスを定義すると便利である。
初期値はexpand('~/.vimshrc')です。
g:vimshell_escape_colors *g:vimshell_escape_colors*
エスケープシーケンスの色づけにおいて、 対応する色の
リストである。0~8番目が普通の色、9~15番目が高輝度の色
に対応している。
初期値はplugin/vimshell.vimを参照せよ。
g:vimshell_disable_escape_highlight *g:vimshell_disable_escape_highlight*
エスケープシーケンスの色づけをするかどうかを制御する。
これは重い処理なので、無効化すればvimshellが高速化する。
値を真にすると無効になる。
初期値は0である。
g:vimshell_cat_command *g:vimshell_cat_command*
vimshellは外部のページャやエディタをうまく扱えないの
で、$PAGERや$EDITORに|g:vimshell_cat_command|の値を
セットする。初期値は"cat"だが、この変数の内容を
変更することで、カスタマイズできる。
初期値は"cat"である。
g:vimshell_environment_term *g:vimshell_environment_term*
vimshellが$TERMにセットする端末情報である。
初期値は"vt100"である。
g:vimshell_split_command *g:vimshell_split_command*
vimshellが画面を分割するときに用いるExコマンドである。
これを"nicely"にすると、vimshellがウインドウの大きさを
見て最適な画面分割を行う。
空文字列にすると、分割しない。
"tabnew"にすると、新しいタブで開く。
"vsplit"で縦方向に分割する。
初期値は"nicely"である。
g:vimshell_cd_command *g:vimshell_cd_command*
vimshellがカレントディレクトリを変更するときに用いるEx
コマンドである。|`=|を解釈しなければならない。
初期値は"lcd"である。
g:vimshell_no_save_history_commands *g:vimshell_no_save_history_commands*
ヒストリを保存しないコマンド名をキーとしたディクショ
ナリ。存在しないと無視される。
初期値は{ 'history' : 1, 'h' : 1, 'histdel' : 1 }です。
g:vimshell_interactive_no_save_history_commands *g:vimshell_interactive_no_save_history_commands*
|vimshell-internal-iexe|において、ヒストリを保存しな
いコマンド名をキーとしたディクショナリ。存在しな
いと無視される。
初期値は{}である。
g:vimshell_interactive_update_time *g:vimshell_interactive_update_time*
|vimshell-internal-iexe|がInsert mode中において、自
動更新を行うタイミングを制御する。
|vimshell-internal-iexe|はこのオプションに基づき、
'updatetime'を変更する。
初期値は500である。
g:vimshell_interactive_command_options *g:vimshell_interactive_command_options*
コマンド名をキーとするディクショナリ変数になっていて、
|vimshell-internal-iexe|で起動するコマンドに与えるオ
プションを指定する。 Windows環境などで特殊なオプショ
ンを与えないと、うまく対話モードにならないコマンド
に使用する。
初期値は複雑なので、autoload/vimshell/commands/iexe.vimを参照
せよ。
g:vimshell_interactive_interpreter_commands *g:vimshell_interactive_interpreter_commands*
ファイルタイプをキーとするディクショナリ変数になっていて、
|:VimShellInteractive|の引数を省略した際のインタプリ
タ名を指定する。
初期値は複雑なので、autoload/vimshell/commands/iexe.vimを参照
せよ。
g:vimshell_interactive_encodings *g:vimshell_interactive_encodings*
コマンド名をキーとするディクショナリ変数になっていて、
|vimshell-internal-iexe|で起動するコマンドのエンコー
ディングを指定する。
初期値は複雑なので、autoload/vimshell/commands/iexe.vimを参照
せよ。
g:vimshell_interactive_no_echoback_commands *g:vimshell_interactive_no_echoback_commands*
インタプリタ名をキーとするディクショナリ変数になってい
て、|vimshell-internal-iexe|実行時にエコーバックするか
どうかを指定する。1ならiexe側でエコーバック処理をする。
Windowsでのみ有効である。
初期値は複雑なので、plugin/vimshell.vimを参照
せよ。
g:vimshell_terminal_cursor *g:vimshell_terminal_cursor*
|vimshell-internal-texe|で使用するカーソル形状を指定
する。'guicursor'を一時的に変更するので、GVim環境
でのみ意味がある。
初期値は'i:block-Cursor/lCursor'である。
g:vimshell_terminal_commands *g:vimshell_terminal_commands*
コマンド名をキーとするディクショナリ変数となっている。
値が真であるコマンドを実行する際には、自動的に
|vimshell-internal-texe|が使用される。
初期値は複雑なので、plugin/vimshell.vimを参照
せよ。
g:vimshell_interactive_cygwin_commands *g:vimshell_interactive_cygwin_commands*
コマンド名をキーとするディクショナリ変数になっていて、
fakecygpty経由で起動するコマンドを指定する。sshな
ど、Cygwin上でないとうまく動作しないコマンドを
|vimshell-internal-iexe|から使用する際に使う。
fakecygptyについては、|vimshell-tips-fakecygpty|を
参照しなければならない。
初期値は複雑なので、autoload/vimshell/commands/iexe.vimを参照
せよ。
g:vimshell_interactive_cygwin_path *g:vimshell_interactive_cygwin_path*
fakecygpty経由のプログラムを実行する際に参照するパス
を指定する。 |vimshell-internal-iexe|は第一引数に
fakecygptyを指定されたとき、 $PATHではなく、
|g:vimshell_interactive_cygwin_path|からコマンドを検
索する。
初期値は'c:/cygwin/bin'である。
g:vimshell_interactive_cygwin_home *g:vimshell_interactive_cygwin_home*
fakecygpty経由のプログラムを実行する際に使用する
$HOMEを指定する。''を指定すると現在の$HOMEをそのま
ま利用する。
初期値は''である。
g:vimshell_interactive_monochrome_commands *g:vimshell_interactive_monochrome_commands*
コマンド名をキーとするディクショナリ変数になっていて、
vimshellによる色分けを無効化するコマンドを指定する。
初期値は複雑なので、autoload/vimshell/commands/iexe.vimを参照
せよ。
------------------------------------------------------------------------------
KEY MAPPINGS *vimshell-key-mappings*
<Plug>(vimshell_split_switch) *<Plug>(vimshell_split_switch)*
vimshellを画面分割して起動する。すでにvimshellバッファ
が存在する場合はそちらに切り換える。
<Plug>(vimshell_split_create) *<Plug>(vimshell_split_create)*
vimshellを画面分割して起動する。すでにvimshellバッファ
が存在していても、新しくvimshellバッファを作成する。
<Plug>(vimshell_switch) *<Plug>(vimshell_switch)*
vimshellを起動する。すでにvimshellバッファが存在する場
合はそちらに切り換える。
<Plug>(vimshell_create) *<Plug>(vimshell_create)*
vimshellを起動する。すでにvimshellバッファが存在してい
ても、新しくvimshellバッファを作成する。
VIMSHELL BUFFER KEY MAPPINGS *vimshell-buffer-key-mappings*
Normal mode key mappings.
<Plug>(vimshell_enter) *<Plug>(vimshell_enter)*
入力されたコマンドを実行する。
<Plug>(vimshell_previous_prompt) *<Plug>(vimshell_previous_prompt)*
カーソルよりも前のプロンプトへ移動する。
<Plug>(vimshell_next_prompt) *<Plug>(vimshell_next_prompt)*
カーソルよりも後のプロンプトへ移動する。
<Plug>(vimshell_delete_previous_output) *<Plug>(vimshell_delete_previous_output)*
カーソル前方の出力を削除する。
<Plug>(vimshell_paste_prompt) *<Plug>(vimshell_paste_prompt)*
カーソル行のコマンドをプロンプトにペーストする。
<Plug>(vimshell_move_end_argument) *<Plug>(vimshell_move_end_argument)*
コマンドの最終引数へ移動する。
<Plug>(vimshell_hide) *<Plug>(vimshell_hide)*
vimshellバッファを隠す。
<Plug>(vimshell_exit) *<Plug>(vimshell_exit)*
vimshellバッファを終了する。
<Plug>(vimshell_change_line) *<Plug>(vimshell_change_line)*
行全体を修正する。
<Plug>(vimshell_delete_line) *<Plug>(vimshell_delete_line)*
行全体を削除する。
<Plug>(vimshell_hangup) *<Plug>(vimshell_hangup)*
実行中のコマンドを強制的に終了する。
<Plug>(vimshell_insert_head) *<Plug>(vimshell_insert_head)*
<Plug>(vimshell_insert_enter) *<Plug>(vimshell_insert_enter)*
<Plug>(vimshell_append_enter) *<Plug>(vimshell_append_enter)*
<Plug>(vimshell_append_end) *<Plug>(vimshell_append_end)*
挿入モードへ移行する。
<Plug>(vimshell_clear) *<Plug>(vimshell_clear)*
再描画する。
<Plug>(vimshell_move_head) *<Plug>(vimshell_move_head)*
行頭へ移動する。
<Plug>(vimshell_execute_by_background) *<Plug>(vimshell_execute_by_background)*
実行中のコマンドをiexeバッファで起動する。
Visual mode key mappings.
<Plug>(vimshell_select_previous_prompt) *v_<Plug>(vimshell_select_previous_prompt)*
カーソルよりも前のプロンプトを選択する。
<Plug>(vimshell_select_next_prompt) *v_<Plug>(vimshell_select_next_prompt)*
カーソルよりも後のプロンプトを選択する。
Insert mode key mappings.
<Plug>(vimshell_command_complete) *i_<Plug>(vimshell_command_complete)*
補完を呼び出す。
<Plug>(vimshell_push_current_line) *i_<Plug>(vimshell_push_current_line)*
実行中のコマンドを一時的にスタックにpushする。
<Plug>(vimshell_insert_last_word) *i_<Plug>(vimshell_insert_last_word)*
コマンドの最終引数に文字を挿入する。
<Plug>(vimshell_run_help) *i_<Plug>(vimshell_run_help)*
内部コマンドのヘルプを見る。
<Plug>(vimshell_move_head) *i_<Plug>(vimshell_move_head)*
行の先頭へ移動する。
<Plug>(vimshell_delete_backward_line) *i_<Plug>(vimshell_delete_backward_line)*
カーソルより後方の行を削除する。
<Plug>(vimshell_delete_backward_word) *i_<Plug>(vimshell_delete_backward_word)*
コマンド行を一語削除する。
<Plug>(vimshell_enter) *i_<Plug>(vimshell_enter)*
コマンドを実行する。
<Plug>(vimshell_interrupt) *i_<Plug>(vimshell_interrupt)*
実行中のコマンドに割り込みを送信する。
<Plug>(vimshell_move_previous_window) *i_<Plug>(vimshell_move_previous_window)*
前のウインドウへ戻る。
<Plug>(vimshell_delete_backward_char) *i_<Plug>(vimshell_delete_backward_char)*
<Plug>(vimshell_another_delete_backward_char) *i_<Plug>(vimshell_another_delete_backward_char)*
コマンド行を一文字削除する。
<Plug>(vimshell_delete_forward_line) *i_<Plug>(vimshell_delete_forward_line)*
カーソルより前方の行を削除する。
<Plug>(vimshell_clear) *i_<Plug>(vimshell_clear)*
vimshellバッファを再描画する。
<Plug>(vimshell_execute_by_background) *i_<Plug>(vimshell_execute_by_background)*
実行中のコマンドをiexeバッファで実行する。
Normal mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<CR> <Plug>(vimshell_enter)
q <Plug>(vimshell_hide)
Q <Plug>(vimshell_exit)
<C-p> <Plug>(vimshell_previous_prompt)
<C-n> <Plug>(vimshell_next_prompt)
<C-k> <Plug>(vimshell_delete_previous_output)
<C-y> <Plug>(vimshell_paste_prompt)
E <Plug>(vimshell_move_end_argument)
cc <Plug>(vimshell_change_line)
dd <Plug>(vimshell_delete_line)
I <Plug>(vimshell_insert_head)
A <Plug>(vimshell_append_end)
i <Plug>(vimshell_insert_enter)
a <Plug>(vimshell_append_enter)
^ <Plug>(vimshell_move_head)
<C-c> <Plug>(vimshell_hangup)
<C-l> <Plug>(vimshell_clear)
<C-z> <Plug>(vimshell_execute_by_background)
Visual mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<C-p> <Plug>(vimshell_select_previous_prompt)
<C-n> <Plug>(vimshell_select_next_prompt)
Insert mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<CR> <Plug>(vimshell_enter)
<C-l> vimshell/history sourceの起動
<TAB> <Plug>(vimshell_command_complete)
<C-a> <Plug>(vimshell_move_head)
<C-u> <Plug>(vimshell_delete_backward_line)
<C-w> <Plug>(vimshell_delete_backward_word)
<C-z> (while execute) <Plug>(vimshell_execute_by_background)
(other) <Plug>(vimshell_push_current_line)
<C-t> <Plug>(vimshell_insert_last_word)
<C-x><C-h> <Plug>(vimshell_run_help)
<C-c> <Plug>(vimshell_interrupt)
<C-h> <Plug>(vimshell_delete_backward_char)
<BS> <Plug>(vimshell_delete_backward_char)
<C-k> <Plug>(vimshell_delete_forward_line)
<C-x> <Plug>(vimshell_move_previous_window)
VIMSHELL INTERACTIVE BUFFER KEY MAPPINGS *vimshell-interactive-buffer-key-mappings*
Normal mode key mappings.
<Plug>(vimshell_int_execute_line) *<Plug>(vimshell_int_execute_line)*
カーソル位置の入力をコマンドに送信する。
<Plug>(vimshell_int_previous_prompt) *<Plug>(vimshell_int_previous_prompt)*
カーソルよりも前のプロンプトへ移動する。
<Plug>(vimshell_int_next_prompt) *<Plug>(vimshell_int_next_prompt)*
カーソルよりも後のプロンプトへ移動する。
<Plug>(vimshell_int_paste_prompt) *<Plug>(vimshell_int_paste_prompt)*
カーソル位置の入力を最終行にペーストする。
<Plug>(vimshell_int_hangup) *<Plug>(vimshell_int_hangup)*
強制的にコマンドを終了する。
<Plug>(vimshell_int_exit) *<Plug>(vimshell_int_exit)*
バッファと実行中のコマンドを削除する。
<Plug>(vimshell_int_restart_command) *<Plug>(vimshell_int_restart_command)*
コマンドを再起動する。
<Plug>(vimshell_int_change_line) *<Plug>(vimshell_int_change_line)*
行全体を変更する。
<Plug>(vimshell_int_delete_line) *<Plug>(vimshell_int_delete_line)*
行全体を削除する。
<Plug>(vimshell_int_insert_enter) *<Plug>(vimshell_int_insert_enter)*
<Plug>(vimshell_int_insert_head) *<Plug>(vimshell_int_insert_head)*
<Plug>(vimshell_int_append_enter) *<Plug>(vimshell_int_append_enter)*
<Plug>(vimshell_int_append_end) *<Plug>(vimshell_int_append_end)*
Insert modeに移行する。
<Plug>(vimshell_int_clear) *<Plug>(vimshell_int_clear)*
バッファを再描画する。
Insert mode key mappings.
<Plug>(vimshell_int_move_head) *i_<Plug>(vimshell_int_move_head)*
コマンド行の先頭に移動する。
<Plug>(vimshell_int_delete_backward_line) *i_<Plug>(vimshell_int_delete_backward_line)*
カーソルより後方の行を削除する。
<Plug>(vimshell_int_delete_backward_word) *i_<Plug>(vimshell_int_delete_backward_word)*
コマンド行を一語削除する。
<Plug>(vimshell_int_execute_line) *i_<Plug>(vimshell_int_execute_line)*
コマンドにカーソル行を送信する。
<Plug>(vimshell_int_delete_backward_char) *i_<Plug>(vimshell_int_delete_backward_char)*
<Plug>(vimshell_int_another_delete_backward_char) *i_<Plug>(vimshell_int_another_delete_backward_char)*
コマンド行を一文字削除する。
<Plug>(vimshell_int_send_input) *i_<Plug>(vimshell_int_send_input)*
コマンドに任意の入力を送信する。
<Plug>(vimshell_int_interrupt) *i_<Plug>(vimshell_int_interrupt)*
実行中のコマンドに割り込みを送信する。
<Plug>(vimshell_int_command_complete) *i_<Plug>(vimshell_int_command_complete)*
補完を行う。
<Plug>(vimshell_int_delete_forward_line) *i_<Plug>(vimshell_int_delete_forward_line)*
カーソルより前方の行を削除する。
Normal mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<C-p> <Plug>(vimshell_int_previous_prompt)
<C-n> <Plug>(vimshell_int_next_prompt)
<CR> <Plug>(vimshell_int_execute_line)
<C-y> <Plug>(vimshell_int_paste_prompt)
<C-z> <Plug>(vimshell_int_restart_command)
<C-c> <Plug>(vimshell_int_hangup)
q <Plug>(vimshell_int_exit)
cc <Plug>(vimshell_int_change_line)
dd <Plug>(vimshell_int_delete_line)
I <Plug>(vimshell_int_insert_head)
A <Plug>(vimshell_int_append_end)
i <Plug>(vimshell_int_insert_enter)
a <Plug>(vimshell_int_append_enter)
<C-l> <Plug>(vimshell_int_clear)
Insert mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<C-h> <Plug>(vimshell_int_delete_backward_char)
<BS> <Plug>(vimshell_int_delete_backward_char)
<C-a> <Plug>(vimshell_int_move_head)
<C-u> <Plug>(vimshell_int_delete_backward_line)
<C-w> <Plug>(vimshell_int_delete_backward_word)
<C-k> <Plug>(vimshell_int_delete_forward_line)
<CR> <Plug>(vimshell_int_execute_line)
<C-c> <Plug>(vimshell_int_interrupt)
<C-l> vimshell/history sourceの起動
<C-v> <Plug>(vimshell_int_send_input)
<C-n> <C-n>
<TAB> 補完候補の選択か補完を行う
------------------------------------------------------------------------------
FUNCTIONS *vimshell-functions*
vimshell#hook#set({hook-point}, {func-list}) *vimshell#hook#set()*
{hook-point}のhook関数を{func-list}で定義する。すでに定
義されているhookは上書きされるので注意しなければなら
ない。hook関数は{func-list}で指定された順番で呼びだされる。
vimshell#hook#get({hook-point}) *vimshell#hook#get()*
{hook-point}に定義されているhookを辞書形式で返す。
vimshell#hook#add({hook-point}, {hook-name}, {func}) *vimshell#hook#add()*
{hook-point}に{hook-name}で{func}を登録する。既に存
在するhook関数は{hook-name}が同じでない限り上書きさ
れない。
vimshell#hook#remove({hook-point}, {hook-name}) *vimshell#hook#remove()*
{hook-point}の{hook-name}関数を削除する。
==============================================================================
EXAMPLES *vimshell-examples*
>
let g:vimshell_user_prompt = 'fnamemodify(getcwd(), ":~")'
"let g:vimshell_right_prompt = 'vcs#info("(%s)-[%b]", "(%s)-[%b|%a]")'
let g:vimshell_enable_smart_case = 1
if has('win32') || has('win64')
" Display user name on Windows.
let g:vimshell_prompt = $USERNAME."% "
else
" Display user name on Linux.
let g:vimshell_prompt = $USER."% "
call vimshell#set_execute_file('bmp,jpg,png,gif', 'gexe eog')
call vimshell#set_execute_file('mp3,m4a,ogg', 'gexe amarok')
let g:vimshell_execute_file_list['zip'] = 'zipinfo'
call vimshell#set_execute_file('tgz,gz', 'gzcat')
call vimshell#set_execute_file('tbz,bz2', 'bzcat')
endif
" Initialize execute file list.
let g:vimshell_execute_file_list = {}
call vimshell#set_execute_file('txt,vim,c,h,cpp,d,xml,java', 'vim')
let g:vimshell_execute_file_list['rb'] = 'ruby'
let g:vimshell_execute_file_list['pl'] = 'perl'
let g:vimshell_execute_file_list['py'] = 'python'
call vimshell#set_execute_file('html,xhtml', 'gexe firefox')
autocmd FileType vimshell
\ call vimshell#altercmd#define('g', 'git')
\| call vimshell#altercmd#define('i', 'iexe')
\| call vimshell#altercmd#define('l', 'll')
\| call vimshell#altercmd#define('ll', 'ls -l')
\| call vimshell#hook#add('chpwd', 'my_chpwd', 'g:my_chpwd')
function! g:my_chpwd(args, context)
call vimshell#execute('ls')
endfunction
autocmd FileType int-* call s:interactive_settings()
function! s:interactive_settings()
endfunction
<
プロンプトをユーザー名にしているだけで、後は凝った設定はしてないです。 ちな
みに|neocomplcache|では、vimshellのヒストリファイルを辞書として使用してます。
これはなかなか便利です。|g:vimshell_execute_file_list|による関連づけも設定
しています。 ユーザープロンプトを設定するのは一番最初にします。 vimshellを読
み込む前に設定しないと、セキュリティの関係で再設定できなくなるからです。
==============================================================================
INTERNAL COMMANDS *vimshell-internal-commands*
internal commandは普通のシェルにおける組み込みコマンドのように動作する。
引数はvimshellに解釈された後に分割して渡される。
Note: 現状、internal commandコマンドはパイプラインに対応しないことに注意しなけ
ればならない。パイプラインを使用した場合、強制的に外部コマンドが起動される。よ
って、次のコマンドはフリーズする。
>
vimshell% echo hello | vim
<
bg [{option}...] {command} *vimshell-internal-bg*
{command}をバックグラウンドで起動する。vimshellのバックグラウン
ド実行は新たにバッファを開き、そこに{command}の出力を書き出す。
bgの場合、ユーザーからの入力は一切受け付けない。 バックグラウン
ドバッファ上で<C-c>を入力すると、{command}の実行を強制的に終了
させる。
コマンドラインの最後に&を付加すると、bgを指定したことと同じとなる。
例:
>
vimshell% ls&
<
iexe, exe, bg, texe, less はオプションを解釈し、それに基づいて
挙動を変更する。詳しくは |vimshell-execute-options|を参照せよ。
ここでは、bgのみに存在するオプションを解説する。
--filetype={filetype-name}
出力バッファの'filetype'を{filetype-name}に変更する。
このオプションが省略された場合、"background"となる。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
cd {directory-path} [{substitute-pattern}] *vimshell-internal-cd*
カレントディレクトリを{directory-path}に変更する。引数が空の場
合、ホームディレクトリへ移動する。 引数が二つ与えられた場合、
{directory-path}を {substitute-pattern}へ置き換える。引数がディ
レクトリでなかった場合、ファイルの親ディレクトリへ移動する。 フ
ァイルが見つからなかった場合、'cdpath'を参照して移動しようとす
る。 引数に-で始まる数字を与えると、 |vimshell-internal-popd|と
同じ意味になる。
clear *vimshell-internal-clear*
画面を消去する。
dirs [{max}] *vimshell-internal-dirs*
ディレクトリスタックの一覧を{max}個表示する。
{max}を省略すると、10になる。
この一覧上で<Enter>を押すことで、そのディレクトリへ移動でき
る。
echo [{argument}...] *vimshell-internal-echo*
引数を出力する。
eval {expression} *vimshell-internal-eval*
{expression}をvimshell Scriptとして解釈し、評価結果を表示する。
前のバージョンのevとは動作が異なる。evの代わりが欲しいなら、
alias ev = 'vexe echo'を設定する。
exe [{option}...] {command} *vimshell-internal-exe*
{command}に引数を与えて実行する。必ず外部コマンドが実行される。
iexe, exe, bg, texe, less はオプションを解釈し、それに基づいて
挙動を変更する。詳しくは|vimshell-execute-options|を参照せよ。
コマンドを実行中はコマンドが終了するか、<C-c>で強制終了する
まで、他のコマンドを実行できないことに注意。
Note: vimshell Ver.9より、exeは入力も受けつけるように変更された。
*vimshell-execute-options*
--encoding={encoding-name} *vimshell-execute-options-encoding*
起動するプログラムのエンコーディングを{encoding-name}に変更する。
'encoding'と{encoding-name}が異なる場合、vimshellは入出力のエン
コーディング変換を自動的に行う。 このオプションが省略された場合、
'termencoding'の値が使用される。
exit *vimshell-internal-exit*
vimshellを終了する。
gcd [{directory-path}] *vimshell-internal-gcd*
vimshellのカレントディレクトリを変更し、かつグローバルなカレ
ントディレクトリも変更する。 vimshellのカレントディレクト
リはVimのカレントディレクトリとは異なっているので、 Vimのカ
レントディレクトリを変更したい場合に便利である。
{directory-path}を省略すると、vimshellのカレントディレクトリ
に移動する。
gendoc {command} {args} *vimshell-internal-gendoc*
{command}に引数{args}を与えて実行し、結果を
g:vimshell_temporary_directory/cached-docに格納する。キャッシュ
した説明文は|echodoc|により表示できる。説明文としてキャッシュさ
れるのは、コマンドの実行結果の一行目だけである。
gexe {command} *vimshell-internal-gexe*
{command}に引数を与えて実行する。必ず外部コマンドが実行される。
exeとは違い、GUIコマンドを実行することに特化している。
h [{pattern}] *vimshell-internal-h*
{pattern}に一致するヒストリを実行する。{pattern}が数字で与えら
れた場合、{pattern}をヒストリ番号として検索する。{pattern}が文
字列の場合、その文字列に最初にマッチする履歴を実行する。ヒ スト
リ番号は|vimshell-internal-history|で確認できる。{pattern}を省
略すると、 直前のコマンドを実行する。|vimshell-internal-h|によ
り実行したコマンドはヒストリに登録されない。
histdel {history-number} *vimshell-internal-histdel*
{history-number}に一致するヒストリを削除する。ヒストリ番号は
|vimshell-internal-history|で確認できる。{history-number}を省略
すると無視される。
history [{search-string}] *vimshell-internal-history*
ディレクトリスタックの一覧を{search-string}個表示する。
{search-string} を省略すると、20になる。{search-string}が文字列
の場合、その文字 列にマッチする候補を一覧できます。この一覧上で
<Enter>を押すことで、その履歴を実行できる。
iexe [{options}...] {command} *vimshell-internal-iexe*
{command}に引数を与えて実行する。必ず外部コマンドが実行される。
exeとは違い、対話コマンドを実行することに特化している。入出力を
行なうために新しいバッファが生成される。
iexeバッファは|filetype|がint-{command}となる。iexeバッファ全体
にautocmdを使用する場合は、"int-*"というパターンを使用するとよ
い。
Note:
iexeはzshの右プロンプトに対応していない。仕組み上、右プロンプト
には対応できない。iexeバッファからプロセスを起動すると、
環境変数 "$VIMSHELL" が1にセットされるので、それにより判別し右
プロンプトを無効にするとよい。
iexe, exe, bg, texe, less はオプションを解釈し、それに基づいて
挙動を変更する。詳しくは |vimshell-execute-options|を参照せよ。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
less [{options}...] {command} *vimshell-internal-less*
{command}に引数を与えて実行する。必ず外部コマンドが実行される。
vimshellがページャとなり、出力が多いコマンドを実行するときに有
用である。
シンタックスシュガーとして、次の形式も有効である。
{command1} | {command2} | less
入出力を行なうために新しいバッファが生成される。
{command}が実行コマンドでない場合、|vimshell-internal-view|を実
行する。
iexe, exe, bg, texe, less はオプションを解釈し、それに基づい
て挙動を変更する。詳しくは|vimshell-execute-options|を参
照せよ。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
ls [{argument}...] *vimshell-internal-ls*
外部コマンドのlsを適切な引数を与えて実行する。lsコマンドがイン
ストールされていない場合、エラーとなる。特にWindows環境では、ls
コマンドをどこかから入手する必要があるだろう。
mkcd {directory-name} *vimshell-internal-mkcd*
{directory-name}を作成してから、そのディレクトリへ
|vimshell-internal-cd|する。
nop *vimshell-internal-nop*
何もしない。
open {filename} *vimshell-internal-open*
{filename}を関連付け実行する。何が実行されるかはOSやデスクトッ
プ環境に依存する。
popd [{directory-stack-number}] *vimshell-internal-popd*
{directory-stack-number}で示されるディレクトリへ移動する。
{directory-stack-number}は|vimshell-internal-dirs|で確認でき
る。{directory-stack-number}を省略すると、0になる。
他のシェルとは異なり、重複しない候補はpopdからは取り除かれない。
pwd *vimshell-internal-pwd*
vimshellのカレントディレクトリを表示する。
repeat {cnt} {command} *vimshell-internal-repeat*
{command}を{cnt}回実行する。
shell *vimshell-internal-shell*
|g:vimshell_use_terminal_command|を用いて'shell'を起動する。シ
グナルやトラップなど、vimshellでは対応できない用途にも対応する
ことができる。
source {files} *vimshell-internal-source*
Windows環境では、"cmd.exe", 他の環境では、'shell'を利用して、
{files}を読み込む。{files}は環境変数を変化させるシェルスクリ
プトである。環境変数の変化は、vimshellに反映される。
texe [{options}...] {command} *vimshell-internal-texe*
{command}に引数を与えて実行する。必ず外部コマンドが実行される。
exe, iexeとは違い、端末コマンドを実行することに特化している。入
出力を行なうために新しいバッファが生成される。パイプを使うとエ
ラーになる。
Note: このコマンドは、まだ動作が不完全である。
iexe, exe, bg, texe, less はオプションを解釈し、それに基づい
て挙動を変更する。詳しくは |vimshell-execute-options|を参
照せよ。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
time {command} *vimshell-internal-time*
{command}を同期的に実行し、実行時間を表示する。
view [{options}...] {filenames}... *vimshell-internal-view*
{filenames}を読み取り専用で別バッファに開く。ファイルの行数がウ
インドウサイズよりも少ない場合、別バッファを開かず、catのように
動作する。ファイルの中身をちょっと見てみたいときに便利である。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
vi [{options}...] [{filenames}...] *vimshell-internal-vi*
|vimshell-internal-vim|と同じ動作をする。
vim [{options}...] [{filenames}...] *vimshell-internal-vim*
{filenames}を別バッファに開く。カレントディレクトリにある
ファイルを手軽に編集したいときに便利である。
{filenames}を省略すると、無名バッファを開く。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
vimdiff [{options}...] {filename1} {filename2} *vimshell-internal-vimdiff*
{filename1}と{filename2}を|:vimdiff|で比較する。vimshellから
diffを呼び出すのは不便なので、存分に活用するべきである。
--split={split-command}
バッファの分割方向を指定する。このオプションが省略された場合、
|g:vimshell_split_command|が使用される。
vimsh [{filename}] *vimshell-internal-vimsh*
{filename}で表されるvimshellスクリプトファイルを実行する。ただ
し制御構造が実装されていないため、あまり利用価値はない。
{filename}を省略すると、新しいvimshellバッファを開く。
which {command} *vimshell-internal-which*
{command}のフルパスを出力する。aliasも認識される。
whereis {command} *vimshell-internal-whereis*
{command}のフルパスをすべて出力する。
==============================================================================
SPECIAL COMMANDS *vimshell-special-commands*
special commandはinternal commandとは違い、vimshellが最小限の解釈しかせずに、
コマンドに制御が渡る。それだけ柔軟な解釈ができるが、引数をパースするのはそれ
ぞれのコマンドの責任となる。
alias {alias-name} = {command} *vimshell-special-alias*
vimshellにaliasを定義する。vimshellは{alias-name}がコマンド名と
して使用されると、自動的に{command}に置き換える。普通のシェルと
は違い、 = の前後に空白があっても動作する。
aliasは引数を取ることができる。引数は$$args変数により参照す
る。
>
vimshell% alias echo=':echo "$$args"'
vimshell% alias echo2=':echo "$$args[1]"'
vimshell% alias echo3=':echo "$$args[2:]"'
<
galias {global-alias-name} = {command} *vimshell-internal-galias*
vimshellにグローバルなaliasを定義する。vimshellは
{global-alias-name}がコマン ドライン中に現われると、自動的に
{command}に置き換える。|vimshell-internal-alias|とは違い、引数
でも展開される。zshのグローバルエイリアスと良く似た機能である。
ただし、現状次のようなパイプ付きの展開がサポートされていない。
>
vimshell% galias G = '|grep'
vimshell% ls G hoge
<
let ${var-name} = {expression} *vimshell-special-let*
{var-name}の変数へ{expression}を代入する。
{var-name}の先頭には$を付加しなければならない。
シェル変数はそれぞれのvimshellバッファ固有の変数である。
環境変数に代入するには、変数名の先頭を大文字にする。
>
vimshell% let $Hoge = $hoge
<
普通のシェルと違って、 = の間に空白があってもなくても動作する。
代入する式はVim scriptとなっているので、計算も自由自在である。
ただしvimshellでは変数名の頭に必ず$を付けなければならない。コマ
ンドの終了ステータスは$$statusに書き込まれまる。$$で始まる変数
はvimshellの内部変数である。
sexe {command} *vimshell-special-sexe*
{command}を'shell'上で実行する。 vimshellでの起動に不具合がある
ときに使用する。 'shell'が適切に設定されていないと動作がおかし
くなる。Windows環境では一瞬DOS窓が表示されてしまう。
vexe {expression} *vimshell-special-vexe*
{expression}をVim Scriptの文として実行し、出力をvimshellバッ
ファに書き出す。コマンドの実行後はvimshellバッファへと戻って
こなければならない。もしこの規則が守られない場合、vimshellの
状態は保証されない。
vexeを直接使わなくても、:をプレフィクスとして実行しても同じ
意味となる。ただし、:をプレフィクスとして実行すると、
vimshellはメタ文字の解釈を一切行わない。
例:
>
:ls
<
==============================================================================
ALTER COMMAND *vimshell-alter-command*
kana氏の作成したaltercmd.vim[http://github.com/kana/vim-altercmd]というものがあ
る。これはCommand line-modeでのコマンド名においてのみ展開される特殊なエイリアス
である。普通のエイリアスよりも、誤爆しにくいという利点がある。
それをvimshell上にも実装した。vimshellにもエイリアス機能があるが、altercmd機能
を用いると、展開結果が一目で分かる。本家とは違い、altercmdの再帰的展開にも対応
している。
使用方法は、vimshellバッファ上で|vimshell#altercmd#define|を呼びだすだけである。
autocmd FileTypeを使用すると、楽に定義できるだろう。
>
autocmd FileType vimshell
\ call vimshell#altercmd#define('g', 'git')
<
==============================================================================
HOOK *vimshell-hook*
vimshellには関数がまだ存在しないが、決められたフック地点でVim Scriptの関数が呼
べるため、 vimshellの内部構造を熟知していれば、より柔軟な処理ができる。
次の例では、chpwdにフックを設定し、カレントディレクトリ移動時にlsを実行する
ようにしている。
>
autocmd FileType vimshell
\ call vimshell#hook#add('chpwd', 'my_chpwd', 'g:my_chpwd')
function! g:my_chpwd(args, context)
call vimshell#execute('ls')
endfunction
<
vimshellでは次のようなフック地点が用意されている。フック関数はargsという引数を
表す変数と、contextというコンテキスト情報を引数に取る。フィルターとして動作する、
一部のフック関数はcmdlineを第一引数に取る。
chpwd *vimshell-hook-chpwd*
vimshellのカレントディレクトリが変更されるときに呼びだされる。
第一引数は新しいカレントディレクトリである。
preparse *vimshell-hook-preparse*
エイリアスのパース前に呼びだされる。第一引数はcmdlineというコマ
ンドライン文字列で、戻り値は変更後のコマンドライン文字列である。
preexec *vimshell-hook-preexec*
エイリアスのパース後、コマンドの実行前に呼びだされる。第一引数
はcmdlineというコマンドライン文字列で、戻り値は変更後のコマンド
ライン文字列である。
postexec *vimshell-hook-postexec*
コマンドの実行後に呼びだされる。第一引数はcmdlineという実行した
コマンドライン文字列である。
emptycmd *vimshell-hook-emptycmd*
コマンド名が空のときに呼びだされる。第一引数はcmdlineというコマ
ンドライン文字列で、戻り値は変更後のコマンドライン文字列である。
notfound *vimshell-hook-notfound*
コマンドが存在しないときに呼びだされる。第一引数はcmdlineという
コマンドライン文字列で、戻り値は変更後のコマンドライン文字列で
ある。
preprompt *vimshell-hook-preprompt*
コマンド実行後、プロンプト表示前に呼びだされる。
preinput *vimshell-hook-preinput*
コマンド実行時において、ユーザーの入力後に呼びだされる。第一引
数はinputというユーザー入力文字列で、戻り値は変更後の入力文字列
である。普通|vimshell-internal-iexe|のバッファに使う。
postinput *vimshell-hook-postinput*
コマンド実行時において、ユーザーの入力がプロセスに処理された後
に呼びだされる。第一引数はinputというユーザー入力文字列である。
普通|vimshell-internal-iexe|のバッファに使う。
cmdlineを簡易的に解析するなら、|vimproc#parser#split_args()|か、
|vimproc#parser#split_args_through()|を使用する。この関数は引数に分割するコマン
ドライン文字列を取る。|vimproc#parser#split_args()|はクォート文字列を評価するが、
|vimproc#parser#split_args_through()|はクォート文字列をそのまま残す。この関数は
;や&&, ||で表される複合文やパイプ、リダイレクト記号をうまく解析できないことに
注意しなければならない。
==============================================================================
TIPS *vimshell-tips*
ここでは、その他の便利機能について紹介する。
ディレクトリスタック *vimshell-tips-directory-stack*
vimshellでは、bashやzshのようなディレクトリスタックを完備してい
る。しかも何も設定せずにauto_pushdしてくれるので、pushdコマンド
は存在しない。ディレクトリスタックを参照するには
|vimshell-internal-dirs|コマンド、ディレクトリスタックから
|vimshell-internal-cd|するには |vimshell-internal-popd|コマンド
を使用する。他のシェルと同様に、"cd -"でも
|vimshell-internal-popd|と同じ動作になる。
auto_cd *vimshell-tips-auto_cd*
ディレクトリ名で実行すると、そのディレクトリに移動する。zshの機
能を移植した。例えば、..で上のディレクトリへ移動できる。 zshと
は違い、特に設定せずに使用できる。
ブロック *vimshell-tips-block*
ブロック構文もサポートしている。
>
vimshell% echo /hoge/piyo/{hoge,hogera}
-> /hoge/piyo/hoge /hoge/piyo/hogera
<
zshのような数値展開も実装している。
>
vimshell% echo {00..09}
-> 00 01 02 03 04 05 06 07 08 09
<
ワイルドカード *vimshell-tips-wildcard*
ワイルドカードも普通に使える。指定されたファイルが存在しない場
合、zshのようにエラーになる。
>
vimshell% ls *.htm
<
ワイルドカードの除外もサポートした。
>
vimshell% ls *~*.htm
<
'~'で区切ってパターンを記述することで、「パターンを除外したパターン」
という意味になる。
バッククオート *vimshell-tips-backquote*
コマンドの引数にコマンドの実行結果が使える。
>
vimshell% echo `ls`
<
Vim scriptの埋め込みもできる。
>
vimshell% echo `=3`
<
fakecygpty *vimshell-tips-fakecygpty*
fakecygptyとはKyotaro Horiguchiさんが開発した、Windowsのパイプ
とCygwinのptyを接続させて動作させるためのコマンドである。例えば
、次のコマンドでCygwinのsshと接続できる。
>
> fakecygpty ssh
<
Meadowのソースコードに含まれていて探すのが大変なので、私がソー
スコードを再配布している。
http://github.com/Shougo/fakecygpty
自分でコンパイルするには、Cygwin環境上で
>
$ gcc fakecygpty.c -o fakecygpty.exe
<
というコマンドを実行する。あとはfakecygptyを$PATHの通ったところ
に置けば準備完了である。
>
sudo *vimshell-tips-sudo*
vimshell Ver.9より、sudoはiexeやsudo内部コマンドを用いなくて
も、そのまま実行できるようになった。ただし、Windows環境で
sudoするためには、Windows環境ではsudo.exeが必要である。
http://bitbucket.org/wantora/sudo/wiki/Home
日本語の取り扱い *vimshell-tips-japanese*
'encoding'を自前で設定している環境(主にWindows)では、起動するコ
マンドとエンコーディングの設定が合わず、日本語の出力が文字化け
することがある。その場合、'termencoding'をコマンドのエンコーデ
ィングと揃えると文字化けは解消される。
Windows環境なら、"cp932"に設定すると良い。
さらに、コマンドによってはUTF-8で出力することがある。その場合、
exeやiexeの"--encoding"オプションを使用すると良い。
>
vimshell% iexe --encoding=utf8 ghci
<
==============================================================================
UNITE SOURCES *vimshell-unite-sources*
ここでは、vimshellに添付されている、|unite|用sourceについて解説を行なう。
*vimshell-unite-source-vimshell-history*
vimshell/history
vimshellのヒストリを候補とする。インタラクティブバッファでも
有効。候補はcompletion kindである。普通、mapping内で
|unite#sources#vimshell_history#start_complete()|を呼び出し
て使用する。
デフォルトでは、<C-l>がvimshell/historyの呼び出しとなる。
例:
>
inoremap <buffer> <expr><silent> <C-l> unite#sources#vimshell_history#start_complete()
<
source別アクション
vimshell/history *vimshell-unite-action-vimshell-history*
execute 履歴の実行
edit 履歴の編集
delete 履歴の削除
==============================================================================
CREATE PLUGIN *vimshell-create-plugin*
vimshellのinternal commandとして、autoload/internal/以下にある*.vimファイルを読
み込むため、 自分でそこにプラグインファイルを追加することで、簡単にコマンドが追
加できる。
==============================================================================
CHANGELOG *vimshell-changelog*
doc/vimshell.txtを参照せよ。
==============================================================================
vim:tw=78:ts=8:ft=help:norl:noet:fen:fdl=0:isk+=-:

View File

@@ -0,0 +1,2712 @@
*vimshell.txt* Powerful shell implemented by VimScript
Version: 9.0
Author : Shougo <Shougo.Matsu@gmail.com>
License: MIT license {{{
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
}}}
CONTENTS *vimshell-contents*
Introduction |vimshell-introduction|
Install |vimshell-install|
Interface |vimshell-interface|
Commands |vimshell-commands|
Variables |vimshell-variables|
Functions |vimshell-functions|
Key mappings |vimshell-key-mappings|
Vimshell buffer key mappings |vimshell-buffer-key-mappings|
Interactive buffer key mappings |vimshell-interactive-buffer-key-mappings|
Examples |vimshell-examples|
Internal Commands |vimshell-internal-commands|
Special Commands |vimshell-special-commands|
Alter Command |vimshell-alter-command|
Hook |vimshell-hook|
Tips |vimshell-tips|
Unite sources |vimshell-unite-sources|
Create plugin |vimshell-create-plugin|
Changelog |vimshell-changelog|
==============================================================================
INTRODUCTION *vimshell-introduction*
==============================================================================
USAGE *vimshell-usage*
You can start vimshell in ":VimShell". Because vimshell works similar with
a common shell, you may operate it intuitively. But vimshell perform the
path appointment in '/'. Vimshell is misunderstood with escape sequence when
you use '\' by Windows for a path and do not work.
ToDo
==============================================================================
INSTALL *vimshell-install*
vimshell needs |vimproc|
http://github.com/Shougo/vimproc
Please install vimproc Ver.5.0(or later) before use vimshell.
And make proc.so
Make method:
* Mingw: >
$ make -f make_mingw.mak
* Mac OS X: >
$ make -f make_mac.mak
* Linux BSD: >
$ make -f make_gcc.mak
* Visual Studio: >
$ make -f make_msvc.mak
* Cygwin: >
$ make -f make_cygwin.mak
After compile, copy autoload/vimproc.vim and autoload/vimproc/parser.vim and
autoload/proc.so(or proc.dll) to autoload directory.
Note: "proc.dll" compiled in Cygwin environment is only Cygwin Vim. Can't use
in Windows Vim.
==============================================================================
INTERFACE *vimshell-interface*
------------------------------------------------------------------------------
COMMANDS *vimshell-commands*
:VimShell *:VimShell*
Run vimshell.
:VimShellCreate {path} *:VimShellCreate*
Todo
:VimShellTab {path} *:VimShellTab*
Todo
:VimShellPop {path} *:VimShellPop*
Todo
:VimShellExecute {command} *:VimShellExecute*
Todo
:VimShellInteractive [{command}] *:VimShellInteractive*
Todo
:VimShellTerminal {command} *:VimShellTerminal*
Todo
:VimShellSendString {string} *:VimShellSendString*
Todo
:VimShellSendBuffer {bufname} *:VimShellSendBuffer*
Todo
------------------------------------------------------------------------------
VARIABLES *vimshell-variables*
g:vimshell_prompt *g:vimshell_prompt*
Todo
g:vimshell_user_prompt *g:vimshell_user_prompt*
Todo
>
let g:vimshell_user_prompt = 'getcwd()'
<
Todo
g:vimshell_right_prompt *g:vimshell_right_prompt*
Todo
>
g:vimshell_no_default_keymappings *g:vimshell_no_default_keymappings*
Todo
g:vimshell_ignore_case *g:vimshell_ignore_case*
Todo
g:vimshell_smart_case *g:vimshell_smart_case*
Todo
g:vimshell_max_list *g:vimshell_max_list*
Todo
g:vimshell_use_ckw *g:vimshell_use_ckw*
Todo
g:vimshell_split_height *g:vimshell_split_height*
Todo
g:vimshell_temporary_directory *g:vimshell_temporary_directory*
Todo
g:vimshell_max_command_history *g:vimshell_max_command_history*
Todo
g:vimshell_max_directory_stack *g:vimshell_max_directory_stack*
Todo
g:vimshell_vimshrc_path *g:vimshell_vimshrc_path*
Todo
g:vimshell_escape_colors *g:vimshell_escape_colors*
Todo
g:vimshell_disable_escape_highlight *g:vimshell_disable_escape_highlight*
Todo
g:vimshell_cat_command *g:vimshell_cat_command*
Todo
g:vimshell_environment_term *g:vimshell_environment_term*
Todo
g:vimshell_split_command *g:vimshell_split_command*
Todo
g:vimshell_cd_command *g:vimshell_cd_command*
Todo
g:vimshell_no_save_history_commands *g:vimshell_no_save_history_commands*
Todo
g:vimshell_interactive_no_save_history_commands *g:vimshell_interactive_no_save_history_commands*
Todo
g:vimshell_interactive_update_time *g:vimshell_interactive_update_time*
Todo
g:vimshell_interactive_command_options *g:vimshell_interactive_command_options*
Todo
g:vimshell_interactive_interpreter_commands *g:vimshell_interactive_interpreter_commands*
Todo
g:vimshell_interactive_encodings *g:vimshell_interactive_encodings*
Todo
g:vimshell_interactive_no_echoback_commands *g:vimshell_interactive_no_echoback_commands*
Todo
g:vimshell_terminal_cursor *g:vimshell_terminal_cursor*
Todo
g:vimshell_terminal_commands *g:vimshell_terminal_commands*
Todo
g:vimshell_interactive_cygwin_commands *g:vimshell_interactive_cygwin_commands*
Todo
g:vimshell_interactive_cygwin_path *g:vimshell_interactive_cygwin_path*
Todo
g:vimshell_interactive_cygwin_home *g:vimshell_interactive_cygwin_home*
Todo
g:vimshell_interactive_monochrome_commands *g:vimshell_interactive_monochrome_commands*
Todo
------------------------------------------------------------------------------
KEY MAPPINGS *vimshell-key-mappings*
<Plug>(vimshell_split_switch) *<Plug>(vimshell_split_switch)*
Todo
<Plug>(vimshell_split_create) *<Plug>(vimshell_split_create)*
Todo
<Plug>(vimshell_switch) *<Plug>(vimshell_switch)*
Todo
<Plug>(vimshell_create) *<Plug>(vimshell_create)*
Todo
VIMSHELL BUFFER KEY MAPPINGS *vimshell-buffer-key-mappings*
Normal mode key mappings.
<Plug>(vimshell_enter) *<Plug>(vimshell_enter)*
Execute command line.
<Plug>(vimshell_previous_prompt) *<Plug>(vimshell_previous_prompt)*
Move to previous prompt from cursor.
<Plug>(vimshell_next_prompt) *<Plug>(vimshell_next_prompt)*
Move to next prompt from cursor.
<Plug>(vimshell_delete_previous_output) *<Plug>(vimshell_delete_previous_output)*
Delete previous output form cursor.
<Plug>(vimshell_paste_prompt) *<Plug>(vimshell_paste_prompt)*
Paste cursor line to last prompt.
<Plug>(vimshell_move_end_argument) *<Plug>(vimshell_move_end_argument)*
Move to command end argument.
<Plug>(vimshell_hide) *<Plug>(vimshell_hide)*
Hide vimshell buffer.
<Plug>(vimshell_exit) *<Plug>(vimshell_exit)*
Quit vimshell buffer.
<Plug>(vimshell_change_line) *<Plug>(vimshell_change_line)*
Change whole line.
<Plug>(vimshell_delete_line) *<Plug>(vimshell_delete_line)*
Delete whole line.
<Plug>(vimshell_hangup) *<Plug>(vimshell_hangup)*
Terminate command.
<Plug>(vimshell_insert_head) *<Plug>(vimshell_insert_head)*
<Plug>(vimshell_insert_enter) *<Plug>(vimshell_insert_enter)*
<Plug>(vimshell_append_enter) *<Plug>(vimshell_append_enter)*
<Plug>(vimshell_append_end) *<Plug>(vimshell_append_end)*
Enter insert mode.
<Plug>(vimshell_clear) *<Plug>(vimshell_clear)*
Redraw vimshell buffer.
<Plug>(vimshell_move_head) *<Plug>(vimshell_move_head)*
Move to head.
<Plug>(vimshell_execute_by_background) *<Plug>(vimshell_execute_by_background)*
Execute command by iexe.
Visual mode key mappings.
<Plug>(vimshell_select_previous_prompt) *v_<Plug>(vimshell_select_previous_prompt)*
Select previous prompt from cursor.
<Plug>(vimshell_select_next_prompt) *v_<Plug>(vimshell_select_next_prompt)*
Select next prompt from cursor.
Insert mode key mappings.
<Plug>(vimshell_command_complete) *i_<Plug>(vimshell_command_complete)*
Start completion.
<Plug>(vimshell_push_current_line) *i_<Plug>(vimshell_push_current_line)*
Push current line command to command line stack.
<Plug>(vimshell_insert_last_word) *i_<Plug>(vimshell_insert_last_word)*
Insert command last word.
<Plug>(vimshell_run_help) *i_<Plug>(vimshell_run_help)*
View internal command help.
<Plug>(vimshell_move_head) *i_<Plug>(vimshell_move_head)*
Move to line head.
<Plug>(vimshell_delete_backward_line) *i_<Plug>(vimshell_delete_backward_line)*
Delete backward line from cursor.
<Plug>(vimshell_delete_backward_word) *i_<Plug>(vimshell_delete_backward_word)*
Delete backward word from cursor.
<Plug>(vimshell_enter) *i_<Plug>(vimshell_enter)*
Execute command.
<Plug>(vimshell_interrupt) *i_<Plug>(vimshell_interrupt)*
Send interrupt.
<Plug>(vimshell_move_previous_window) *i_<Plug>(vimshell_move_previous_window)*
Move to previous window.
<Plug>(vimshell_delete_backward_char) *i_<Plug>(vimshell_delete_backward_char)*
<Plug>(vimshell_another_delete_backward_char) *i_<Plug>(vimshell_another_delete_backward_char)*
Delete backward char from cursor.
<Plug>(vimshell_delete_forward_line) *i_<Plug>(vimshell_delete_forward_line)*
Delete forward line from cursor.
<Plug>(vimshell_clear) *i_<Plug>(vimshell_clear)*
Redraw vimshell buffer.
<Plug>(vimshell_execute_by_background) *i_<Plug>(vimshell_execute_by_background)*
Execute command by iexe.
Normal mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<CR> <Plug>(vimshell_enter)
q <Plug>(vimshell_hide)
Q <Plug>(vimshell_exit)
<C-p> <Plug>(vimshell_previous_prompt)
<C-n> <Plug>(vimshell_next_prompt)
<C-k> <Plug>(vimshell_delete_previous_output)
<C-y> <Plug>(vimshell_paste_prompt)
E <Plug>(vimshell_move_end_argument)
cc <Plug>(vimshell_change_line)
dd <Plug>(vimshell_delete_line)
I <Plug>(vimshell_insert_head)
A <Plug>(vimshell_append_end)
i <Plug>(vimshell_insert_enter)
a <Plug>(vimshell_append_enter)
^ <Plug>(vimshell_move_head)
<C-c> <Plug>(vimshell_hangup)
<C-l> <Plug>(vimshell_clear)
<C-z> <Plug>(vimshell_execute_by_background)
Visual mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<C-p> <Plug>(vimshell_select_previous_prompt)
<C-n> <Plug>(vimshell_select_next_prompt)
Insert mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<CR> <Plug>(vimshell_enter)
<C-l> Start vimshell/history source
<TAB> <Plug>(vimshell_command_complete)
<C-a> <Plug>(vimshell_move_head)
<C-u> <Plug>(vimshell_delete_backward_line)
<C-w> <Plug>(vimshell_delete_backward_word)
<C-z> (while execute) <Plug>(vimshell_execute_by_background)
(other) <Plug>(vimshell_push_current_line)
<C-t> <Plug>(vimshell_insert_last_word)
<C-x><C-h> <Plug>(vimshell_run_help)
<C-c> <Plug>(vimshell_interrupt)
<C-h> <Plug>(vimshell_delete_backward_char)
<BS> <Plug>(vimshell_delete_backward_char)
<C-k> <Plug>(vimshell_delete_forward_line)
<C-x> <Plug>(vimshell_move_previous_window)
VIMSHELL INTERACTIVE BUFFER KEY MAPPINGS *vimshell-interactive-buffer-key-mappings*
Normal mode key mappings.
<Plug>(vimshell_int_execute_line) *<Plug>(vimshell_int_execute_line)*
Execute cursor line.
<Plug>(vimshell_int_previous_prompt) *<Plug>(vimshell_int_previous_prompt)*
Move to previous prompt from cursor.
<Plug>(vimshell_int_next_prompt) *<Plug>(vimshell_int_next_prompt)*
Move to next prompt from cursor.
<Plug>(vimshell_int_paste_prompt) *<Plug>(vimshell_int_paste_prompt)*
Paste cursor line to last prompt.
<Plug>(vimshell_int_hangup) *<Plug>(vimshell_int_hangup)*
Exit executing command.
<Plug>(vimshell_int_exit) *<Plug>(vimshell_int_exit)*
Exit interactive buffer.
<Plug>(vimshell_int_restart_command) *<Plug>(vimshell_int_restart_command)*
Restart command.
<Plug>(vimshell_int_change_line) *<Plug>(vimshell_int_change_line)*
Change whole line.
<Plug>(vimshell_int_delete_line) *<Plug>(vimshell_int_delete_line)*
Delete whole line.
<Plug>(vimshell_int_insert_enter) *<Plug>(vimshell_int_insert_enter)*
<Plug>(vimshell_int_insert_head) *<Plug>(vimshell_int_insert_head)*
<Plug>(vimshell_int_append_enter) *<Plug>(vimshell_int_append_enter)*
<Plug>(vimshell_int_append_end) *<Plug>(vimshell_int_append_end)*
Enter insert mode.
<Plug>(vimshell_int_clear) *<Plug>(vimshell_int_clear)*
Redraw interactive buffer.
Insert mode key mappings.
<Plug>(vimshell_int_move_head) *i_<Plug>(vimshell_int_move_head)*
Move to line head.
<Plug>(vimshell_int_delete_backward_line) *i_<Plug>(vimshell_int_delete_backward_line)*
Delete backward line from cursor.
<Plug>(vimshell_int_delete_backward_word) *i_<Plug>(vimshell_int_delete_backward_word)*
Delete backward word from cursor.
<Plug>(vimshell_int_execute_line) *i_<Plug>(vimshell_int_execute_line)*
Execute current line.
<Plug>(vimshell_int_delete_backward_char) *i_<Plug>(vimshell_int_delete_backward_char)*
<Plug>(vimshell_int_another_delete_backward_char) *i_<Plug>(vimshell_int_another_delete_backward_char)*
Delete backward character from cursor.
<Plug>(vimshell_int_send_input) *i_<Plug>(vimshell_int_send_input)*
Send user input.
<Plug>(vimshell_int_interrupt) *i_<Plug>(vimshell_int_interrupt)*
Send interrupt to command.
<Plug>(vimshell_int_command_complete) *i_<Plug>(vimshell_int_command_complete)*
Start completion.
<Plug>(vimshell_int_delete_forward_line) *i_<Plug>(vimshell_int_delete_forward_line)*
Delete forward line from cursor.
Normal mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<C-p> <Plug>(vimshell_int_previous_prompt)
<C-n> <Plug>(vimshell_int_next_prompt)
<CR> <Plug>(vimshell_int_execute_line)
<C-y> <Plug>(vimshell_int_paste_prompt)
<C-z> <Plug>(vimshell_int_restart_command)
<C-c> <Plug>(vimshell_int_hangup)
q <Plug>(vimshell_int_exit)
cc <Plug>(vimshell_int_change_line)
dd <Plug>(vimshell_int_delete_line)
I <Plug>(vimshell_int_insert_head)
A <Plug>(vimshell_int_append_end)
i <Plug>(vimshell_int_insert_enter)
a <Plug>(vimshell_int_append_enter)
<C-l> <Plug>(vimshell_int_clear)
Insert mode default key mappings.
{lhs} {rhs}
-------- -----------------------------
<C-h> <Plug>(vimshell_int_delete_backward_char)
<BS> <Plug>(vimshell_int_delete_backward_char)
<C-a> <Plug>(vimshell_int_move_head)
<C-u> <Plug>(vimshell_int_delete_backward_line)
<C-w> <Plug>(vimshell_int_delete_backward_word)
<C-k> <Plug>(vimshell_int_delete_forward_line)
<CR> <Plug>(vimshell_int_execute_line)
<C-c> <Plug>(vimshell_int_interrupt)
<C-l> Start vimshell/history source
<C-v> <Plug>(vimshell_int_send_input)
<C-n> <C-n>
<TAB> Select candidate or start completion
------------------------------------------------------------------------------
FUNCTIONS *vimshell-functions*
vimshell#hook#set({hook-point}, {func-list}) *vimshell#hook#set()*
Todo
vimshell#hook#get({hook-point}) *vimshell#hook#get()*
Todo
vimshell#hook#add({hook-point}, {hook-name}, {func}) *vimshell#hook#add()*
Todo
vimshell#hook#remove({hook-point}, {hook-name}) *vimshell#hook#remove()*
Todo
==============================================================================
EXAMPLES *vimshell-examples*
>
let g:vimshell_user_prompt = 'fnamemodify(getcwd(), ":~")'
"let g:vimshell_right_prompt = 'vcs#info("(%s)-[%b]", "(%s)-[%b|%a]")'
let g:vimshell_enable_smart_case = 1
if has('win32') || has('win64')
" Display user name on Windows.
let g:vimshell_prompt = $USERNAME."% "
else
" Display user name on Linux.
let g:vimshell_prompt = $USER."% "
call vimshell#set_execute_file('bmp,jpg,png,gif', 'gexe eog')
call vimshell#set_execute_file('mp3,m4a,ogg', 'gexe amarok')
let g:vimshell_execute_file_list['zip'] = 'zipinfo'
call vimshell#set_execute_file('tgz,gz', 'gzcat')
call vimshell#set_execute_file('tbz,bz2', 'bzcat')
endif
" Initialize execute file list.
let g:vimshell_execute_file_list = {}
call vimshell#set_execute_file('txt,vim,c,h,cpp,d,xml,java', 'vim')
let g:vimshell_execute_file_list['rb'] = 'ruby'
let g:vimshell_execute_file_list['pl'] = 'perl'
let g:vimshell_execute_file_list['py'] = 'python'
call vimshell#set_execute_file('html,xhtml', 'gexe firefox')
autocmd FileType vimshell
\ call vimshell#altercmd#define('g', 'git')
\| call vimshell#altercmd#define('i', 'iexe')
\| call vimshell#altercmd#define('l', 'll')
\| call vimshell#altercmd#define('ll', 'ls -l')
\| call vimshell#hook#add('chpwd', 'my_chpwd', 'g:my_chpwd')
function! g:my_chpwd(args, context)
call vimshell#execute('ls')
endfunction
autocmd FileType int-* call s:interactive_settings()
function! s:interactive_settings()
endfunction
<
Todo
==============================================================================
INTERNAL COMMANDS *vimshell-internal-commands*
Todo
Note: Todo
>
vimshell% echo hello | vim
<
bg [{option}...] {command} *vimshell-internal-bg*
Todo
Example:
>
vimshell% ls&
<
Todo
--filetype = {filetype-name}
Todo
cd {directory-path} [{substitute-pattern}] *vimshell-internal-cd*
Todo
clear *vimshell-internal-clear*
Clear display.
dirs [{max}] *vimshell-internal-dirs*
Todo
echo [{argument}...] *vimshell-internal-echo*
print arguments.
eval {expression} *vimshell-internal-eval*
Todo
exe [{option}...] {command} *vimshell-internal-exe*
Todo
*vimshell-execute-options*
--encoding = {encoding-name} *vimshell-execute-options-encoding*
Todo
exit *vimshell-internal-exit*
Exit vimshell buffer.
gcd [{directory-path}] *vimshell-internal-gcd*
Todo
gendoc {command} {args} *vimshell-internal-gendoc*
Todo
gexe {command} *vimshell-internal-gexe*
Todo
h [{pattern}] *vimshell-internal-h*
Todo
histdel {history-number} *vimshell-internal-histdel*
Todo
history [{search-string}] *vimshell-internal-history*
Todo
iexe [{options}...] {command} *vimshell-internal-iexe*
Todo
Note:
Todo
less [{options}...] {command} *vimshell-internal-less*
Todo
ls [{argument}...] *vimshell-internal-ls*
Todo
mkcd {directory-name} *vimshell-internal-mkcd*
Todo
nop *vimshell-internal-nop*
No operation.
open {filename} *vimshell-internal-open*
Open {filename} by associated application.
popd [{directory-stack-number}] *vimshell-internal-popd*
Todo
pwd *vimshell-internal-pwd*
Print vimshell working directory.
repeat {cnt} {command} *vimshell-internal-repeat*
Execute {command} {cnt} times.
shell *vimshell-internal-shell*
Todo
source {files} *vimshell-internal-source*
Todo
texe [{options}...] {command} *vimshell-internal-texe*
Todo
Note: Todo
time {command} *vimshell-internal-time*
Todo
view [{options}...] {filenames}... *vimshell-internal-view*
Todo
vi [{options}...] [{filenames}...] *vimshell-internal-vi*
Same as |vimshell-internal-vim|.
vim [{options}...] [{filenames}...] *vimshell-internal-vim*
Todo
vimdiff {filename1} {filename2} *vimshell-internal-vimdiff*
Todo
vimsh [{filename}] *vimshell-internal-vimsh*
Todo
which {command} *vimshell-internal-which*
Todo
whereis {command} *vimshell-internal-whereis*
Print {command} by full path.
==============================================================================
SPECIAL COMMANDS *vimshell-special-commands*
Todo
alias {alias-name} = {command} *vimshell-special-alias*
Todo
>
vimshell% alias echo=':echo "$$args"'
vimshell% alias echo2=':echo "$$args[1]"'
vimshell% alias echo3=':echo "$$args[2:]"'
<
galias {global-alias-name} = {command} *vimshell-internal-galias*
Todo
>
vimshell% galias G = '|grep'
vimshell% ls G hoge
<
let ${var-name} = {expression} *vimshell-special-let*
Todo
>
vimshell% let $Hoge = $hoge
<
sexe {command} *vimshell-special-sexe*
Todo
vexe {expression} *vimshell-special-vexe*
Todo
Example:
>
:ls
<
==============================================================================
ALTER COMMAND *vimshell-alter-command*
Todo
>
autocmd FileType vimshell
\ call vimshell#altercmd#define('g', 'git')
<
==============================================================================
HOOK *vimshell-hook*
Todo
>
autocmd FileType vimshell
\ call vimshell#hook#add('chpwd', 'my_chpwd', 'g:my_chpwd')
function! g:my_chpwd(args, context)
call vimshell#execute('ls')
endfunction
<
Todo
chpwd *vimshell-hook-chpwd*
Todo
preparse *vimshell-hook-preparse*
Todo
preexec *vimshell-hook-preexec*
Todo
postexec *vimshell-hook-postexec*
Todo
emptycmd *vimshell-hook-emptycmd*
Todo
notfound *vimshell-hook-notfound*
Todo
preprompt *vimshell-hook-preprompt*
Todo
preinput *vimshell-hook-preinput*
Todo
postinput *vimshell-hook-postinput*
Todo
Todo
==============================================================================
TIPS *vimshell-tips*
Todo
directory stack *vimshell-tips-directory-stack*
Todo
auto_cd *vimshell-tips-auto_cd*
Todo
block *vimshell-tips-block*
Todo
>
vimshell% echo /hoge/piyo/{hoge,hogera}
-> /hoge/piyo/hoge /hoge/piyo/hogera
<
Todo
>
vimshell% echo {00..09}
-> 00 01 02 03 04 05 06 07 08 09
<
wild card *vimshell-tips-wildcard*
Todo
>
vimshell% ls *.htm
<
Todo
>
vimshell% ls *~*.htm
<
Todo
backquote *vimshell-tips-backquote*
コマンドの引数にコマンドの実行結果が使える。
>
vimshell% echo `ls`
<
Vim scriptの埋め込みもできる。
>
vimshell% echo `=3`
<
fakecygpty *vimshell-tips-fakecygpty*
Todo
>
> fakecygpty ssh
<
Todo
http://github.com/Shougo/fakecygpty
>
$ gcc fakecygpty.c -o fakecygpty.exe
<
Todo
>
==============================================================================
UNITE SOURCES *vimshell-unite-sources*
Todo
*vimshell-unite-source-vimshell-history*
vimshell/history
Todo
Exmaple:
>
inoremap <buffer> <expr><silent> <C-l> unite#sources#vimshell_history#start_complete()
<
actions:
vimshell/history *vimshell-unite-action-vimshell-history*
execute Execute history
edit Edit history
delete Delete history.
==============================================================================
CREATE PLUGIN *vimshell-create-plugin*
In this clause, I comment on a method to make plugin of vimshell. The
ability of vimshell will spread by creating plugin by yourself.
==============================================================================
CHANGELOG *vimshell-changelog*
2011-10-05
- Improved vimshell#terminal#print().
2011-10-04
- Improved earthquake syntax.
- Fixed history execution.
- Improved buffering.
- Fixed vimshell#interactive#exit().
- Refactored internal commands.
- Added g:vimshell_use_terminal_command option.
- Improved shell internal command.
2011-10-03
- Fixed :VimShellExecute and :VimShellInteractive split behavior.
- Improved earthquake syntax.
2011-09-28
- Added time internal command.
2011-09-25
- Fixed tags.
2011-09-24
- Improved documentation.
- Refactored mappings.
2011-09-23
- Improved documentation.
2011-09-19
- vim and view internal commands allow multiple files.
- Refactored local variable names.
- Fixed interactive output.
2011-09-18
- Fixed hangup bugs.
2011-09-17
- Improved vimshell initialize.
- Fixed vimshell examples.
2011-09-16
- Fixed stopinsert.
- Improved g:vimshell_split_command behavior.
- Fixed complete files.
- Fixed iexe.
2011-09-15
- Added <Plug>(vimshell_execute_by_background) keymapping.
2011-09-14
- Fixed next prompt.
- Fixed password input.
- Improved Japanese documentation.
2011-09-13
- Fixed history error.
2011-09-12
- Fixed inputsecret() error.
- Fixed tempname() problem.
- Deleted sudo internal command.
- Improved exe behavior.
2011-09-09
- Improved execute continuation.
- Improved commands history.
- Fixed terminal.
- Improved texe.
2011-09-08
- Supported vimproc Ver.6
- Improved error message.
- Supported iexe error output.
- exe use pty.
- Improved interactive.
2011-09-07
- Ver.9.0 development started.
------------------------------------------------------------------------------
ChangeLog 8.0
2011-09-06
- Fixed vimfiler function error.
2011-09-04
- Improved buffer name.
- Renamed save_dir.
2011-09-01
- Use unite#start_complete().
2011-08-31
- Fixed interactive history completion.
- Fixed command completion.
- Fixed manual completion error.
2011-08-29
- Improved :VimShellPop behavior.
2011-08-27
- Fixed for gdb.
- Improved vimshell/history source.
2011-08-24
- Fixed vimshell get prompt error.
2011-08-23
- Fixed execute command behavior.
- Set winfixheight.
- Improved vimshell history error.
- Improved updatetime.
2011-08-22
- Fixed parser.
2011-08-21
- Improved clear.
- Improved :VimShellPop.
2011-08-20
- Improved documentation.
2011-08-16
- Added is_listed attribute.
2011-08-14
- Fixed context error.
2011-08-13
- Deleted bcd internal command.
2011-08-12
- Fixed for complete and echodoc error.
- Fixed documentation.
2011-08-10
- Improved internal commands initialize.
- Added vi internal command.
- Improved open file mapping.
2011-08-09
- Improved vimshell switch.
2011-08-03
- Improved documentation.
2011-07-23
- Deleted obsolute option.
2011-07-22
- Fixed color table.
2011-07-21
- Fixed vimshell initialize error.
2011-07-20
- Fixed complete error in interactive buffer.
- Improved set variables.
- Implemented interrupt in interactive buffer.
- Improved interrupt in vimshell buffer.
2011-07-13
- Fixed clear bug.
2011-07-12
- Fixed :VimShellSendString error.
2011-07-11
- Fixed save interactive history.
2011-07-10
- Fixed cd internal command.
2011-07-06
- Improved open cursor file.
2011-07-05
- Improved open cursor file.
2011-07-04
- Added <Plug>(vimshell_move_head) mapping.
- Improved <Plug>(vimshell_previous_prompt) and <Plug>(vimshell_next_prompt)
2011-07-02
- Fixed preinput bug.
2011-07-01
- Improved escape sequences.
- Close popup if output.
- Improved interactive output.
2011-06-25
- Changed <Plug>(vimshell_paste_prompt) behavior.
2011-06-16
- Fixed open_file().
- Supported earthquake command.
- Added g:vimshell_interactive_monochrome_commands option.
2011-06-15
- Fixed execute_line().
- Improved vimshell description.
2011-06-14
- Fixed filename completion.
- Fixed colorscheme problem.
- Fixed :VimShellInteractive error.
2011-06-12
- Improved open cursor file.
2011-06-10
- Fixed vital error.
2011-06-08
- Fixed restart keymapping.
2011-06-04
- Fixed terminal print error.
2011-06-03
- Improved hooks.
- Added some hook functions.
2011-06-02
- Added postinput hook.
- Changed input hook to preinput hook.
- Improved iexe and texe description.
2011-06-01
- Improved hook.
- Added input hook.
- Fixed exit error.
2011-05-30
- Fixed vimshell update bug.
- Improved examples.
- Improved previous/next prompt mappings in interactive.
2011-05-29
- Improved iexe completion.
- Improved description.
- Added source internal command.
- Improved :VimShellSendString command.
2011-05-20
- Fixed vimshell error problem.
2011-05-18
- Fixed vimshell completion error.
- Fixed mappings error.
2011-05-17
- Use neocomplcache filename_complete.
2011-05-15
- Fixed conceal problem.
- Fixed quote error.
2011-05-14
- Fixed man.
2011-05-13
- Use system_gui().
- Use vimproc Ver.5.2.
2011-05-11
- Supported hash tag in termtter syntax.
2011-05-10
- Supported clojure.
2011-05-08
- Fixed set nocompatible bug.
2011-04-27
- Fixed vimshell history source.
2011-04-16
- Fixed execute command line bug.
- Improved filename completion.
- Improved complete position.
2011-04-12
- Improved history source.
2011-04-05
- Supported sbt in Windows.
2011-04-01
- Improved vimshell/history source.
- Fixed interactive command bug.
- Supported fsi interpreter.
- Improved unite source split direction.
2011-03-25
- Implemented unite highlight.
- Deleted g:vimshell_external_history_path option.
- Fixed delete action.
- Improved vimproc check.
- Fixed completion error when using neocomplcache.
- Deleted obsolute completefuncs.
- Added edit and execute actions.
- Improved default_action.
- Added unite source description.
- Refactoringed vimshell history.
2011-03-23
- Implemented vimshell history source.
2011-03-16
- Improved concealed highlight.
2011-03-14
- Deleted highlight oneline option.
2011-03-13
- Implemented &.
- Improved parser.
2011-03-08
- Improved concealed color.
2011-03-07
- Improved print.
- Improved virtual file.
- Implemented alias arguments.
2011-03-06
- Use conceal when possible.
- Fixed output error.
2011-03-05
- Fixed : parse.
- Improved vexe description.
2011-03-03
- Fixed cmdline error.
2011-03-02
- Save last executed command line.
2011-02-26
- Fixed error_line() and print_line().
- Fixed : parse.
- Changed q keymapping behavior.
2011-02-25
- Implemented Vim command execution(example :ls).
2011-02-24
- Improved error output.
2011-02-23
- Fixed output position bug.
- Improved position restore.
2011-02-22
- Improved interactive buffer update.
2011-02-16
- Improved termtter syntax.
2011-02-15
- Fixed kill.
2011-02-13
- Fixed less initialization.
2011-02-12
- Improved documentation.
2011-02-11
- Improved timeout.
2011-02-10
- Check ls command.
2011-01-28
- Fixed hook#call().
2011-01-27
- Fixed hook error.
2011-01-26
- Implemented postexec hook.
2011-01-22
- Fixed vimshell#print_line() error.
2011-01-19
- Fixed move head bug.
- Improved hooks.
- Fixed history execution bug.
- Catch hook error.
2011-01-17
- Fixed error message position.
2011-01-16
- Fixed vimshell#get_current_args() error.
- Fixed search cursor file.
2011-01-12
- Fixed English help.
2011-01-11
- Fixed for Vim 7.0 bug.
2011-01-08
- Improved vimproc error message.
2010-12-26
- Improved history output(Experimental).
2010-12-25
- Fixed :VimShellSendString.
- Supported maxima in Windows.
2010-12-24
- Improved usage.
- Fixed :VimShellExecute complete function.
2010-12-23
- Supported echodoc.
- Added gendoc command.
2010-12-14
- Implemented set winsize behavior.
2010-12-08
- Restored cd behavior.
2010-12-07
- Fixed less highlight.
- Improved delete highlight.
2010-12-06
- Changed <Plug>(vimshell_another_delete_backward_char) mapping.
2010-12-05
- Fixed cd command.
2010-11-17
- Improved less keymappings.
- Improved view internal command.
- Improved less internal command.
2010-11-16
- Supported directory_mru.
2010-11-07
- Improved modeline.
2010-11-04
- Added g:vimshell_cd_command option.
2010-11-03
- Changed <Plug>(vimshell_delete_previous_output) default mapping.
2010-10-30
- Added g:vimshell_interactive_no_echoback_commands option.
- Fixed echoback.
2010-10-28
- Fixed doc tags.
- Fixed terminal bug.
- Improved util.vim.
2010-10-26
- Fixed typo.
- Improved change current directory.
2010-10-21
- Fixed escape bug.
- Fixed filename execution.
- Check t:unite_buffer_dictionary.
2010-10-19
- Improved interactive update.
- Added g:vimshell_terminal_commands option.
2010-10-14
- Improved execute line.
- Fixed delete backward line.
- Stopinsert in vimdiff.
2010-10-12
- Fixed switch directory bug.
2010-10-08
- Improved window move.
- Improved vimshell switch.
2010-10-07
- Don't resolve link.
2010-10-05
- Fixed modifiable error.
2010-10-02
- Fixed typo.
- Fixed variables name.
2010-10-01
- Deleted completion imdisable().
- Improved iskeyword.
- Fixed clear bug.
2010-09-30
- Improved clear.
2010-09-29
- Added g:vimshell_enable_auto_slash.
- Fixed vimshell switch bug.
- Improved <Plug>(vimshell_switch).
- Fixed abbr in command completion.
2010-09-28
- Fixed <Plug>(vimshell_delete_backward_line) error.
- Fixed glob().
- Fixed conceal cursor.
- Fixed glob().
- Implemented insert / (experimental).
2010-09-27
- Improved filename completion.
- Fixed complete executable.
2010-09-23
- Fixed send_string().
- Fixed completion error.
- Fixed eof.
- Refactoringed vimshell completion.
2010-09-21
- Supported b:interactive.is_close_immediately for iexe buffers.
- Fixed typo.
- Merged from ujihisa.
- Changed completion keymappings.
- Changed clear keymappings.
2010-09-16
- Improved command split behavior.
2010-09-15
- Fixed japanese documentation.
2010-09-09
- Implemented <Plug>(vimshell_int_clear).
2010-09-05
- Ver.8.0 development started.
- Use vimproc Ver.5.
- Changed completion keymappings.
- Fixed for scala.
------------------------------------------------------------------------------
ChangeLog 7.2
2010-09-04
- Deleted VimShellBang and VimShellRead commands.
2010-09-03
- Fixed cursor.
2010-09-02
- Improved insert enter.
- Improved interactive cursor.
- Improved interactive update.
2010-09-01
- Improved insert enter.
- Improved output.
2010-08-29
- Improved syntax.
2010-08-26
- Supported grep pattern.
- Added syntax highlight.
2010-08-25
- Fixed filename completion.
2010-08-23
- Fixed alias parse.
- Fixed texe error.
- Improved save variables.
2010-08-22
- Improved iexe mappings.
- Improved vimshell mappings.
- Improved get_cur_text.
- Fixed prompt bug.
2010-08-20
- Stop insert when execute exit.
2010-08-19
- Improved column.
- Fixed update.
- Improved interactive completion.
2010-08-18
- Fixed initialization error check.
- Fixed environment variables.
- Fixed output bug.
2010-08-17
- Implemented which internal command.
- Implemented wherereis internal command.
2010-08-15
* Ver.7.2 development started.
- Improved wildcard.
- Fixed wildcard parse.
- Implemented file modifier.
------------------------------------------------------------------------------
ChangeLog 7.1:
2010-08-15
- Improved error detection.
2010-08-13
- Supported set syntax in bg and less command.
- Fixed less parse.
- Improved terminal highlight.
- Implemented user syntax.
- Fixed :VimShellBang and :VimShellRead error.
2010-08-08
- Improved redirection.
- Fixed conceal parse.
2010-08-07
- Improved vimshell#switch_shell().
- Implemented <Plug>(vimshell_move_previous_window).
2010-08-05
- Improved iexe completion.
- Improved right prompt.
- Improved cursor word check.
- Fixed delete line bug.
- Improved change line.
- Improved process exists check.
- No change $SHELL.
- Improved default settings.
2010-08-04
- Improved send_string().
- Check interactive command.
- Implemented print exit value.
2010-08-03
- Changed history mappings.
- Improved mappings name.
- Fixed conditional code bug.
- Ignore ** pattern when completion.
2010-08-02
- Implemented interactive command completion.
- Improved mappings.
- Improved send string.
- Fixed col.
- Fixed filename completion.
2010-08-01
- Deleted interactive command complete.
- Deleted terminal filter.
2010-07-31
- Fixed pipe parse bug.
- Added less internal command.
- Improved buffer name.
- Implemented <Plug>(vimshell_less_next_half_screen).
- Fixed tags error.
2010-07-30
- Set wrap.
- Improved <Plug>(vimshell_clear).
- Fixed h internal command.
- Implemented <Plug>(vimshell_select_previous_prompt) and <Plug>(vimshell_select_next_prompt) mappings.
2010-07-27
- Improved documentation.
- Fixed s:send_region().
- Fixed execute continuation.
2010-07-26
- Fixed documentation.
- Supported conceal feature in Vim 7.3.
2010-07-25
- Fixed error print.
- Added g:vimshell_interactive_interpreter_commands option.
- Fixed texe filetype.
- Improved interpreter commands.
- Improved :VimShellInteractive, :VimshellTerminal, :VimShellExecute behavior.
- Fixed get type.
- Implemented <Plug>(vimshell_interrupt).
- Fixed don't call preexec bug.
- Improved vimshell#system().
- Improved vimshell#set_dictionary_helper().
2010-07-24
- Fixed caching check.
- Implemented asyncronous exe.
- Fixed :VimShellInteractive, :VimshellTerminal, :VimShellExecute error.
- Clear previous highlight.
2010-07-23
- Implemented g:vimshell_vcs_print_null option.
- Implemented timeout in vcs.
- Improved documentation.
- Improved drawing character set.
- Improved scroll down.
- Implemented wrap around bs.
- Implemented key mappings helper function.
- Fixed default mappings bug.
2010-07-22
- Improved search cursor file.
- Added :VimShellSendBuffer command.
- Changed terminal filetype.
- Improved multibyte.
- Optimized escape sequence.
- Improved scroll region.
- Implemented reset escape sequence.
- Improved interactive.
- Fixed expand alias.
- Improved parser.
2010-07-21
- Improved initialize autoload.
2010-07-18
- Fixed <Plug>(vimshell_int_send_input) error.
2010-07-17
- Improved killed message.
- Implemented pipe.
- Optimized head match.
- Improved print error.
2010-07-15
- Improved tilde substitution.
2010-07-14
- Changed list and wrap settings.
2010-07-13
- Improved terminal update.
- Fixed scrolling region.
2010-07-12
- Fixed history count.
- Fixed for neocomplcache Ver.5.1.
- Improved eskk and vimproc check.
- Improved output check.
- Fixed 256 colors highlight bug.
- Implemented magic equal completion.
- Implemented change cursor shape.
- Added g:vimshell_terminal_cursor.
- Added some keys.
- Implemented multibyte cursor move.
2010-07-11
- ReFixed listchars.
- Improved highlight.
- Improved g:vimshell_escape_colors.
- Improved output check.
2010-07-10
- Fixed listchars.
2010-07-09
- Fixed interactive position.
- Fixed output bug.
- Fixed interactive history error.
- Improved texe update.
- Fixed iexe execute bug.
- Fixed texe mappings.
- Fixed some error.
- Added <Plug>(vimshell_term_execute_line) mapping.
- Improved listchars.
- Fixed command line completion.
- Fixed initialize bug.
- Deleted screen internal command.
- Improved commands.
- Improved args complete.
- Improved helper function name.
- Improved internal helper function.
2010-07-07
* Ver.7.1 development started.
- Fixed documentation.
- Using dictionary.
------------------------------------------------------------------------------
ChangeLog 7.0:
2010-07-07
- Fixed auto completion bug.
- Improved :VimShellInteractive and :VimShellExecute and :VimShellTerminal commands.
- Improved termtter syntax.
2010-07-06
- Fixed directory compltion bug.
2010-07-05
- Improved texe update.
2010-07-04
- Improved history.
- Added g:vimshell_external_history_path option.
- Improved history and h command.
- Highlights history output.
- Implemented texe completion.
- Improved commands completion.
- Check window size.
2010-07-03
- Improved texe update.
- Fixed terminal clear bug.
- Improved escape highlight.
- Added g:vimshell_disable_escape_highlight option.
- Detect g:neocomplcache_enable_auto_select option.
2010-07-02
- Set $COLUMNS and $LINES.
- Set $VIMSHELL_TERM.
- Added g:vimshell_environment_term option.
- Improved interactive history.
- Set nomodifiable in texe.
- Implemented send input.
- Implemented texe auto update.
2010-07-01
- Added :VimShellTerminal command.
- Improved split window.
- Fixed <Plug>(vimshell_clear) bug.
- Improved texe.
- Fixed escape error in texe.
- Fixed initial output in texe.
- Supported scroll.
2010-06-30
- Improved cursor move.
2010-06-29
- Fixed texe update.
2010-06-28
- Fixed repeat error.
- Refactoringed interactive.
- Improved update timing.
- Fixed print error.
- Improved <Plug>(vimshell_int_execute_line) behavior.
- Fixed print bug.
- Merged hamaco's change.
- Fixed dirs and bcd and clear error.
- Fixed open cursor file.
- Fixed cursor position in texe.
2010-06-27
- Added g:vimshell_split_command option.
- Improved terminal mappings.
2010-06-26
- Fixed output for gosh.
2010-06-25
- Improved mappings.
- Changed background filetype.
- Implemented change title escape sequence.
- Improved terminal information.
- Added g:vimshell_interactive_no_save_history_commands option.
- Fixed append history.
- Implemented few escape sequences.
- Implemented texe.
2010-06-24
- Fixed auto update.
2010-06-22
- Improved gexe.
- Improved iexe filetype.
- Improved command completion.
- Fixed directory stack completion.
- Added g:vimshell_interactive_encodings option.
- Changed g:vimshell_history_max_size as g:vimshell_max_command_history.
- Added g:vimshell_max_directory_stack option.
- Improved append history.
- Improved popd and cd.
2010-06-21
- Fixed command completion bug.
- Added fakecygpty description.
2010-06-20
- Use vimproc Ver.4.1.
- Added g:vimshell_interactive_command_options and g:vimshell_interactive_cygwin_commands.
- Added g:vimshell_interactive_cygwin_path and g:vimshell_interactive_cygwin_home.
- Improved vimproc check.
- Revised help file.
2010-06-19
- Improved get cur_text.
- Fixed filename completion bug.
- Fixed PATH_SEPARATOR error.
- Fixed command complete.
2010-06-18
- Fixed expand glob bug.
- Improved escape filter.
- Added g:vimshell_cat_command option.
- Refactoringed.
- Improved imdisable.
- Fixed fatal print bug.
- Fixed cdpath complete.
2010-06-16
- Improved vimshell#complete#helper#files() and vimshell#complete#helper#cdpath_directories().
- Improved highlight sequences.
- Fixed print_prompt() bug.
- Implemented delete_backword_char escape sequence.
- Added some escape sequences support.
- Improved echoback check.
2010-06-15
- Improved interactive update.
- Optimized escape sequence.
- Optimized highlight escape sequence.
- Improved highlight escape sequence.
- Improved skip prompt.
- Fixed context bug.
- Fixed window split bug.
- Fixed keyword filter error.
- Fixed escape parse bug.
2010-06-14
- Overwrite text in vimshell#terminal#print().
- Changed hook specification.
- Improved parse alias.
- Deleted auto_popd.
- Implemented vimshell#hook#get().
2010-06-13
- Fixed vimsh error.
- Improved print_prompt() behavior.
- Deleted hide internal command.
- Improved error message.
- Improved escape sequence.
2010-06-12
- Added <Plug>(vimshell_change_line) and <Plug>(vimshell_delete_line) keymappings.
- Improved auto update.
- Added <Plug>(vimshell_int_delete_word) and <Plug>(vimshell_insert_head) keymappings.
- Refactoringed mappings.
- Set $EDITOR to cat.
- Detect blocked time.
- Improved another <Plug>(vimshell_another_delete_backword_char).
- Improved popd.
- Implemented popd completion.
- Optimized filter.
- Supported symbolic link and Win32 shortcut.
- Improved resolve.
2010-06-11
- Improved undo.
- Changed <Plug>(vimshell_int_restart_command) default keymappings.
2010-06-10
- Improved iskeyword for altercmd.
- Improved skk.vim check.
- Fixed <Plug>(vimshell_int_restart_command) command.
2010-06-09
- Fixed auto update and escape sequence error bug.
- Fixed change position bug when auto update.
2010-06-08
- Call explorer in vim and view.
2010-06-07
- Optimized control sequences check.
- Refactoringed terminal functions.
- Fixed <C-g>u bug.
2010-06-06
- Fixed escape bug.
- Fixed update cursor move bug.
- Improved output routine.
- Improved highlight.
- Added some escape sequence functions.
2010-06-04
- Improved URL open in iexe.
- Improved iexe buffer update.
- Improved open file in vimshell buffer.
- Improved append history timing.
2010-06-01
- Fixed error when exe.
- Fixed popd error.
2010-05-30
- Improved update iexe buffer.
2010-05-30
- Improved echoback.
- Improved multiline input.
- Improved Japanese help.
- sudo supported Windows.
- Implemented interactive history complete.
- Added g:vimshell_no_save_history_programs variable.
- Added g:vimshell_interactive_update_time variable.
- Improved update iexe buffer.
- Fixed prompt history bug.
2010-05-29
- Improved run help.
- Check exists('*SkkDisable').
- Improved dummy move in iexe.
2010-05-28
- Disable ime when execute <Plug>(vimshell_int_execute_line).
- Supported eskk.vim.
2010-05-26
- Fixed eval back quote.
2010-05-25
- Improved iexe update.
2010-05-24
- Improved open.
- Improved vimshell#system().
- Set interactive filetype when iexe buffer is initialized.
- Added <Plug>(vimshell_interactive_another_delete_backword_char) <Plug>(vimshell_delete_backword_char) and <Plug>(vimshell_another_delete_backword_char) mappings.
- Fixed error.
2010-05-23
- Fixed cd error.
- Fixed <C-e> behavior in iexe.
- Improved interactive complete.
- Improved alias parse.
- Added :VimShellRead command.
2010-05-19
- Fixed error in output check.
- Fixed output.
- Improved error line.
2010-05-18
- Added :VimShellBang command.
- Fixed output check error.
- Improved output check.
- Improved autocmd.
2010-05-15
* Improved output check.
* Improved Cygwin detect.
2010-05-14
* Improved disable bell.
2010-05-13
* Improved environment detect.
* Deleted g:vimshell_history_path option.
* Added g:vimshell_temporary_directory option.
* Revised help file.
* Fixed h bug.
* Changed history path.
2010-05-11
* Changed variables name.
2010-05-10
* Fixed error in output check.
* Improved :VimShellSendString.
2010-05-09
* vimshell disables bell.
* Fixed <CR> bug in iexe.
* Added <Plug>(vimshell_interactive_restart_command) mapping.
* Improved :VimShellSendString.
* Improved highlight clear.
2010-05-05
* Improved encoding.
* sexe is special command.
* Added <Plug>(vimshell_exit) mapping.
* Improved exit and open.
2010-05-04
* Improved system().
2010-05-02
* Improved galias and alias parse.
* Implemented vimshell#set_alias() and vimshell#set_galias().
* Fixed wildcard.
* Fixed convert encoding.
2010-05-01
* Fixed alias parse bug.
* Deleted obsolute mappings.
* Implemented some escape sequence functions.
2010-04-30
* Improved interactive keymappings.
* Improved interactive behavior.
* Fixed bg bug.
* Ignore escape sequences.
* Improved highlight.
2010-04-27
* Fixed vimshell#print().
* Improved g:vimshell_no_default_keymappings.
* Nestable vexe.
* Deleted g:VimShell_MaxKeywordWidth.
* Fixed bcd bugs.
2010-04-26
* Improved auto complete behavior in iexe buffer.
2010-04-25
* vimshell#execute returns exit status.
* Improved prompt check.
* Added vimshell#version().
* Fixed iexe args.
* Deleted g:VimShell_EnableInteractive.
2010-04-24
* Fixed prompt check error.
* Fixed mapping <CR>.
2010-04-20
* Ver.7 development started.
* Supported vimproc Ver.4.
------------------------------------------------------------------------------
ChangeLog 6.50:
2010-04-20
* Marked as ver.6.50.
* Implemented .vimshrc quote.
* Revised Japanese help.
2010-04-18
* Implemented include Vim Script syntax.
2010-04-17
* Improved update behavior on insert mode.
* Fixed g:vimshell_ignore_case default value.
* Improved g:vimshell_ignore_case behavior.
* Detect head matches each prompt pattern.
* Fixed searchpos() bug.
* Improved prompt syntax highlight.
2010-04-16
* Improved iexe update.
* Add history when parse passed.
* Improved vimshell exception and error mechanism.
* Improved auto update behavior.
* Improved directory completion.
* Improved error catch.
2010-04-14
* Improved vimshell#start_insert().
* Implemented multiline quote.
* Improved echo.
* Improved syntax of string.
* Fixed print and vexe split <CR> bugs.
2010-04-13
* Improved quote parser.
* Revised Japanese help.
* Improved output check.
* Changed vexe as special command.
* Added eval internal command.
* Deleted ev internal command.
* Fixed vimshell#print_line().
* Improved alias and galias error message.
* Improved alias parse.
* Changed hook specification.
* Improved context.
2010-04-12
* Fixed command_complete bug.
* Improved expand wildcard.
2010-04-08
* Fixed output check when program exited.
* Call hook functions if interactive only.
* Implemented emptycmd, precmd, preexec hooks.
* Deleted g:VimShell_EnableAutoLs option.
* Fixed s:check_output() error.
* Improved vimshell#print_prompt().
2010-04-06
* Fixed help file.
* Changed galias as special command.
* Fixed popd error.
* Disable output when inputing in iexe.
* Implemented hook.
* Added chpwd hook.
2010-04-03
* Fixed autocd.
* Refactoringed.
* Implemented recursive altercmd and alias.
* Fixed auto complete bug when path contains blanks.
* Added execute option description.
* Improved bg.
* Fixed :VimShellSendString bug.
2010-04-02
* Fixed vimshell#altercmd.
2010-04-01
* Interpret escape sequence(experimental).
* Added internal command description.
* Fixed escape color.
2010-03-19
* Fixed interrupt error.
* Supported comment in .vimshrc.
* Implemented altercmd.
2010-03-03
* Improved restore current directory.
* Added scala support in iexe.
* Improved gcd command.
* Supported fakecygpty.
* Fixed error message in interactive.vim.
* Improved cd.
2010-03-02
* Fixed interactive_command_complete error.
* Fixed vimshell#interactive#get_cur_text().
------------------------------------------------------------------------------
ChangeLog 6.00-:
2010-02-26
* Print lines if one screen in view.
* Fixed nomodifiable error in view.
* Revised internal vim command.
* Marked As Ver.6.05.
2010-02-24
* Fixed interactive filetype.
* Ignore .gitignore in vcs_git.
* Added g:vimshell_right_prompt variable.
* Improved parse in argument complete.
* Fixed command parse.
* Implemented history output execution.
2010-02-18
* Fixed "E121: Undefined variable: b:prompt_history" error.
* Fixed args_complete compltion pos bug.
* Fixed filename pattern.
* Fixed s:hist_size error.
* Renamed interactive_complete.vim.
2010-02-17
* Added vimshrc syntax file.
* setlocal nolist in vimshell buffer.
6.05 : *Supported vimproc Ver.3 or later*
- Improved update timing in iexe and bg.
- Optimized history completion.
- Changed history completion keymappings.
- Improved execute line in iexe.
- Fixed <Plug>(vimshell_interactive_previous_prompt).
- Fixed no prompt behavior bug in iexe.
- Improved interactive in Windows.
- Fixed interactive option bug in iexe.
- Improved prompt in iexe.
- Improved prompt syntax.
- Fixed parse filename modifier bug.
- Improved split nicely.
- Fixed hang up bug.
- Implemented background execution and interrupt in exe.
- Fixed paste prompt bug in iexe.
- Implemented --encoding in exe and bg and iexe.
- Added :VimShellSendString command.
- Implemented vimshell#interactive#send_string().
- Fixed convert encoding in redirecting.
- Improved terminal compatiblity.
- Deleted g:VimShell_UsePopen2 option.
- Improved redraw in executing.
6.04 :
- Fixed history_complete bug.
- Truncate many candidates in history_complete.
- Changed g:vimshell_split_height default value.
- Optimized complete file.
- Improved autocmd.
- Changed buffer name.
- Improved enter directory.
- Improved move to drive.
- Implemented auto update.
- Fixed multibyte input bug.
- Improved termtter syntax.
- Fixed sexe error.
- Implemented interactive mappings.
- Improved prompt move.
- Changed omni complete keymappings.
- Improved close popup.
- Improved buffer search in <Plug>(vimshell_split_create).
- Improved detect for mac in open.
- Improved filtype and update in bg.
- Reimplemented vimshell#internal#iexe#vimshell_iexe().
- Added :VimShellExecute and :VimShellInteractive commands.
- Implemented bg and iexe and sudo completions.
- Improved execute line in Normal mode.
- Improved keymappings.
- Implemented CursorHold event in iexe.
6.03 :
- Refactoringed.
- Improved environment detect in open.
- Fixed delete escape sequence bug.
- Improved interactive print.
- Implemented execute line in iexe buffer.
- Open URI when press <Enter>.
- Improved password input.
- Implemented interactive termtter syntax.
- Fixed syntax error.
- Fixed alias parse.
- Improved start in Windows.
- Improved irb option in iexe.
- Improved vimshell split switch.
- Added :VimShellPop command.
6.02 :
- Improved autocommand in iexe.
- Improved completion in iexe.
- Improved highlight escape sequence.
- Fixed echo in iexe.
- Improved password input.
- Fixed timer.
- Added powershell.exe and cmd.exe support.
- Improved vimshell buffer settings.
- Fixed <Plug>(vimshell_delete_previous_output) error.
- Delete control sequences.
- Improved complete pattern.
- Set completion timeout.
- Fixed interactive prompt bug.
- Deleted syntax keyword.
- Improved interactive print.
- Renamed interactive_complete.
- Fixed interactive process error.
- Fixed expand tilde bug.
6.01 :
- Improved error handling.
- Improved head match.
- Use completefunc_complete if available.
- Fixed trunk string.
- Escape complete candidates.
- Improved Windows pty support.
- Improved password input.
- Improved echo back.
- Improved encoding.
- Implemented next_prompt() in iexe.
- Implemented arguments completion.
- Set interactive option in Windows iexe.
- Fixed force exit error.
6.00 :
- Deleted plugin/interactive.vim.
- Deleted ftplugin/vimshell.vim.
- Implemented vimshell#system().
- Implemented VCS information support.
- Deleted pipe inout.
- Implemented completion helper.
- Improved command completion.
- Implemented argument completion.
- Implemented expand wildcard.
- Improved get prompt.
------------------------------------------------------------------------------
ChangeLog 5.30-:
5.38 :
- Fixed stdout flush bug.
- Append last line when interactive error.
- Syntax clear in clear command.
- Ignore interactive exit error.
- Use vimproc.vim.
- Fixed error in readonly buffer.
- Deleted interactive pty code.
- Use updatetime in iexe.
- Deleted CursorHold event in iexe.
- Deleted echo in iexe.
- Fixed iexe for echoback.
- Improved filetype in iexe.
- Improved read time.
- Improved iexe wait.
- Implemented bcd internal command.
- Implemented Windows pty support.
- Fixed popd.
- Improved completion.
5.37 :
- Added g:vimshell_no_default_keymappings option.
- Unique key mappings.
- Improved echo when executing.
- Fixed delete_line error.
- Implemented pseudo device '/dev/clip'.
- Improved command completion in Windows.
- Implemented mkcd internal command.
- Append last line.
5.36 :
- Added syntax keywords.
- Echo error when you use old Vim.
- Splitted mapping functions.
- Improved run_help.
- Implemented insert history completion.
- Improved completion.
5.35 :
- Improved open behavior.
- Fixed completion column bug.
- Implemented <Plug>(vimshell_move_end_argument).
- Fixed environment variables parse bug.
- Accept null wildcard.
- Substitute modifier.
- Added VimShellCreate command.
- Save prompt variables when vimshell is initialized.
- Implemented vimshell#push_and_execute() function.
5.34 :
- Improved execute internal command.
- Fixed wildcard parse bug.
- Use startinsert!.
- Implemented vimdiff command.
- Fixed cursor pos bug in completion.
- Implemented 'vexe' and 'open' command.
- Fixed command completion bug.
5.33 :
- Deleted one command.
- Changed default prompt.
- Improved kill processes(Thanks Nico).
- Send interrupt when press <C-c> in iexe(Thanks Nico).
- Improved tab completion in iexe.
- Fixed tilde parse bug.
- Don't select in completion.
- Implemented 'cd -' and '-' command.
- Improved popd behavior.
- Don't print prompt when switch to vimshell.
- Setlocal bufhidden=hide.
- Implemented 'cd name1 name2'.
- Fixed empty argument bug.
5.32 :
- Fixed delete_line when cursor pos is end.
- Escape g:VimShell_Prompt.
- Shell escape in sexe.
- Implemented clear key-mapping.
- Improved delete previous output.
- Implemented multiline user prompt.
- Fixed suffix execution bug.
- Overwrite highlight Normal in escape sequence range.
- Execute cursor file.
5.31 :
- Check cd path.
- Mark executable file.
- Improved completion.
- Deleted normal iexe.
- Splitted complete functions.
- Catch error in vim and view.
5.30 :
- Improved execute message.
- Implemented sexe command.
- Setfiletype iexe in iexe.
- Improved key-mappings.
- Fixed expand filename bug.
- Improved command search.
- Close window in exit.
- Implemented delete line.
- Implemented delete line and move head in iexe.
------------------------------------------------------------------------------
ChangeLog 5.10-5.29
5.29 :
- Implemented filename expantion.
- Supported neocomplcache omni completion.
- Improved block expantion.
- Improved highlight of escape sequence.
- Create g:vimshell_history_path's parent directory if not exists.
- Create g:vimshell_vimshrc_path's parent directory if not exists.
- Check 'cdpath' when cd.
- Used plugin key-mappings insetead of key-mappings option.
5.28 :
- Fixed tail space bug(Thanks Nico).
- Fixed prompt history bug(Thanks Nico).
- Supported escape sequence in cd.
- Print all error.
- Improved error print format.
- Optimized print.
- Implemented user prompt.
- Implemented exclude wildcard.
- Implemented global alias.
5.27 :
- Fixed parse error.
- Optimized output.
- Deleted long lines error.
- Implemented paste prompt.
- Extend current directory.
- Applyed backspace patch(Thanks Nico!).
- Added g:VimShell_PromptPrevKey, g:VimShell_PromptNextKey, g:VimShell_PastePromptKey options.
- Improved run_help and push_current_line.
5.26 :
- Implemented iexe completion.
- Implemented iexe prompt.
- <C-c> as <C-v><C-d>.
- Added g:VimShell_HistoryPrevKey, g:VimShell_HistoryNextKey, g:VimShell_TabCompletionKey options.
- Improved pty response.
- Set filetype.
- Improved initialize on pty.
- Improved syntax highlight.
- Improved run_help.
5.25 :
- Catch kill error.
- Improved prompt in background pty(Thanks Nico!).
- Supported input empty.
- Supported completion on pty.
- Improved output in dirs command.
- Implemented command history on pty(Thanks Nico!).
- . and .. were excluded from a wildcard expand result.
5.24 :
- Improved parser.
- Fixed append_history() bug.
- Implemented block.
- Supported multiple statements.
- Fixed alias parse bug.
- Implemented repeat.
- Improved pushd timing.
5.23 :
- Improved completion.
- Added g:VimShell_EnableAutoLs option.
- Move to parent directory if argument isn't directory in cd command.
- Implemented force kill processes.
5.22 :
- Improved share history.
- Improved run_help.
- Improved alias.
- Fixed parse bug.
- Changed run_help key mappings.
- Implemented sudo vim.
- Improved iexe and bg(Tanks Nico!).
5.21 :
- Improved error highlight.
- Implemented password input.
- Implemented sudo internal command.
- Added g:VimShell_SecondaryPrompt option.
- Set COLUMNS and LINES environment variables.
- Remove dup history.
- Improved history commands.
- Splitted parser.
- Reduce blanks when append history.
- Implemented insert last word keymapping.
- Improved iexe.
- Implemented run_help.
5.20 :
- Added g:VimShell_UsePopen2 option.
- Openable directory in vim command.
- Improved bg command.
- Fixed escape sequence.
- Improved highlight timing.
- Implemented error highlight.
- Refactoringed interactive.vim.
5.19 :
- Improved variables path.
- Implemented h string.
- Added space when command completed.
- Improved escape sequence support.
5.18 :
- Improved command completion.
- Changed alias syntax.
- Improved stdin read.
- Improved pipe in external command.
5.17 :
- Fixed error when bg or iexe terminated.
- Implemented gexe command.
- Implemented pipe.
- Check pipe in ls command.
- Improved wildcard.
- Fully pipe implemented.
5.16 :
- Implemented back quote and vim quote.
- Implemented double quote escape.
- Implemented expand home directory.
- Fixed stdin redirection bug.
- Get status.
5.15 :
- Fixed for ATOK X3.
- Improved error catch.
- Implemented redirection.
- Implemented /dev/null virtual device.
- Implemented special functions.
- Improved let and ev.
5.14 :
- Implemented echo.
- Implemented wildcard.
- Executable one liner in Windows.
- Improved command search.
- Implemented command completion.
- Fixed g:vimshell_execute_file_list bug.
5.13 :
- Added command vimshell_delete_previous_prompt.
- Fixed lcd escape bug.
- Deleted process.vim.
- Deleted ! execution.
- Added gcd command.
- Optimized parse in alias and let commands.
5.12 Changed command behavior:
- Added g:VimShell_EnableInteractive option.
- Changed command behavior.
- Added exe command.
- Convert encoding for system().
- Fixed name conversion.
- Added g:vimshell_split_height option.
5.11:
- Added VimShellExecute and VimShellInteractive commands.
5.10:
- Implemented iexe.
- Improved bg.
- Improved print_prompt().
- Use neocomplcache#manual_filename_complete().
------------------------------------------------------------------------------
ChangeLog 5.9-4.0
5.9:
- Fixed background execution.
- Fixed auto_cd bug.
- Fixed error in screen command.
5.8:
- Fixed !! error.
- Implemented filename completion.
- Implemented exchange ~ into $HOME.
5.7:
- Implemented g:vimshell_execute_file_list.
- Refactoring.
- Added screen, bg internal command.
5.6:
- Escape prompt when prompt search.
- Fixed auto cd error.
5.5:
- Created ftplugin/vimshell.vim
- Added command vimshell_previous_prompt and vimshell_next_prompt.
5.4:
- Fixed alias, cd, histdel bug.
5.3:
- Improved autocmds.
- Refactoring plugin call.
5.2:
- Plugin interface changed.
- Converted special commands into internal commands.
- Deleted quick match.
5.1:
- Improved key-mappings and autocmd.
- Implemented command line stack.
5.0:
- Return previous buffer when call vimshell#switch_shell on vimshell.
- Implemented vimshell#error_line.
- Error when iexe execute without python interface.
4.9:
- Implemented exit command.
- Implemented hide command.
- Added g:vimshell_smart_case option.
4.8:
- Implemented comment.
- Not escape when cd command.
- Eval environment variables.
4.7:
- Improved vimshell#switch_shell.
- Implemented one command.
- Implemented ev command.
4.6:
- Implemented h command.
- Implemented VimShell buffer current directory.
- History execution was implemented with h command.
- Change VimShell current directory when vimshell#switch_shell.
4.5:
- Fixed popd and history bugs.
- Implemented history arguments.
- Implemented internal command.
- Improved syntax color.
4.4:
- Changed s:alias_table into b:vimshell_alias_table.
- Interpret cd of no argument as cd $HOME
- Added pwd command.
- Improved ls on Windows.
- Load ~/.vimshrc on init.
- Improved escape.
4.3:
- Implemented zsh like cd.
- Make built-in command autoload.
- Optimized special commands.
- Implemented popd, dirs command.
4.2:
- Implemented alias command.
- Implemented VimShell script.
- Optimized vimshell#process_enter.
4.1:
- Implemented history command.
- Implemented histdel command.
- Implemented nop command.
- Ignore empty command line.
4.0:
- Implemented shell background execution.
- Added g:VimShell_UseCkw option.
------------------------------------------------------------------------------
ChangeLog 3.9-1.0
3.9:
- Implemented background execution on Linux.
- Improved print prompt.
- Fixed cd bug.
- Fixed background execution bug.
3.8:
- Implemented background execution on Windows.
- Implemented shell execution.
- Implemented shell command.
- Implemented exit command.
3.7:
- Not escape quotation.
- Implemented command completion.
3.6:
- Improved command execute.
- Fixed execute program bug.
3.5:
- Implemented by autoload.
- Fixed non-Windows platform error.
- Improved history executed.
- Fixed many bugs.
3.4:
- Fixed filename escape bug.
- Fixed vimshell buffer clear when hide.
- No setlocal lazyredraw.
- Filename escape when cd.
- Implemented pseudo shell variables.
3.3:
- Changed escape sequence into \<ESC>.
- Changed autocmd timing.
- Added filename escape.
- Added vimshell_split_switch, vimshell_switch, vimshell_split_create, vimshell_create.
- Can have multiple Vimshell instance.
3.2:
- Fixed space name command bug.
- Fixed quick match bug.
- Implemented vim and view command.
3.1:
- Fixed ATOK X3 is ON when startinsert.
- Silent message if exit code isn't 0.
3.0:
- Do startinsert! after command executed.
- Added g:vimshell_QuickMatchmax_lists option.
- Added g:VimShell_QuickMatchEnable option.
- Implemented two digits quick match.
2.9:
- Trial implemented highlight escape sequence.
- Fixed history bug.
- Convert cd to lcd.
2.8:
- Dup check when quick match.
- Due to optimize, filtering len(cur_keyword_str) >.
- Ignore head spaces when completion.
2.7:
- Implemented shell history completion by omnifunc.
- Mapping omnifunc <C-j>.
- Implemented quick match.
- Improved escape.
2.6:
- Implemented shell history.
2.5:
- Set lazyredraw in vimshell buffer.
- Refactoring.
2.3:
- Code cleanup.
2.2:
- Fix syntax highlight at pipe command.
- Fix quotation highlight.
2.1:
- Fix syntax highlights.
2.0:
- Implemented syntax highlight.
1.0:
- Initial version.
==============================================================================
vim:tw=78:ts=8:ft=help:norl:noet:fen:fdl=0:isk+=-:

View File

@@ -0,0 +1,2 @@
3.0
{'vimshell': {'checked_time': 1706045295, 'installed_uri': 'https://github.com/Shougo/vimshell.git', 'installed_path': '/Users/joshp/.vim/bundle/vimshell_3787e5', 'revisions': {'1317805056': '3787e52766812d8b99a93ccdda57517bc2a0bab6'}, 'updated_time': '1317805056'}, 'neosnippet.vim': {'checked_time': 1706045295, 'installed_uri': 'https://github.com/Shougo/neosnippet.vim.git', 'installed_path': '/Users/joshp/.vim/bundle/neosnippet.vim', 'revisions': {'1690076198': 'efb2a615df2e6df9364087686dacca223fcfa16a'}, 'updated_time': '1690076198'}, 'vim-colorschemes': {'checked_time': 1706045295, 'installed_uri': 'https://github.com/flazz/vim-colorschemes.git', 'installed_path': '/Users/joshp/.vim/bundle/vim-colorschemes', 'revisions': {'1589579820': 'fd8f122cef604330c96a6a6e434682dbdfb878c9'}, 'updated_time': '1589579820'}, 'neobundle.vim': {'checked_time': 1706045293, 'installed_uri': 'https://github.com/Shougo/neobundle.vim.git', 'installed_path': '/Users/joshp/.vim/bundle/neobundle.vim', 'revisions': {}, 'updated_time': 1706045293}, 'neosnippet-snippets': {'checked_time': 1706045295, 'installed_uri': 'https://github.com/Shougo/neosnippet-snippets.git', 'installed_path': '/Users/joshp/.vim/bundle/neosnippet-snippets', 'revisions': {'1648787969': '725c989f18e9c134cddd63a7c6b15bed5c244657'}, 'updated_time': '1648787969'}, 'ctrlp.vim': {'checked_time': 1706045295, 'installed_uri': 'https://github.com/ctrlpvim/ctrlp.vim.git', 'installed_path': '/Users/joshp/.vim/bundle/ctrlp.vim', 'revisions': {'1689470507': '7c972cb19c8544c681ca345c64ec39e04f4651cc'}, 'updated_time': '1689470507'}, 'vim-fugitive': {'checked_time': 1706045295, 'installed_uri': 'https://github.com/tpope/vim-fugitive.git', 'installed_path': '/Users/joshp/.vim/bundle/vim-fugitive', 'revisions': {'1705705285': '854a8df0d06b8d3fcb30fa7f2b08c62b553eee3b'}, 'updated_time': '1705705285'}, 'vim-nerdtree-syntax-highlight': {'checked_time': 1706045484, 'installed_uri': 'https://github.com/tiagofumo/vim-nerdtree-syntax-highlight.git', 'installed_path': '/Users/joshp/.vim/bundle/vim-nerdtree-syntax-highlight', 'revisions': {'1688700398': '35e70334a2ff6e89b82a145d1ac889e82d1ddb4e'}, 'updated_time': '1688700398'}}

View File

@@ -0,0 +1,7 @@
neobundle.vim
neosnippet-snippets
neosnippet.vim
vim-colorschemes
vim-fugitive
vim-nerdtree-syntax-highlight
vimshell

View File

@@ -0,0 +1,8 @@
NeoBundleLock ctrlp.vim 7c972cb19c8544c681ca345c64ec39e04f4651cc
NeoBundleLock neobundle.vim 1306c131ff0a6cc094b7ff0727350e442b5427f1
NeoBundleLock neosnippet-snippets 725c989f18e9c134cddd63a7c6b15bed5c244657
NeoBundleLock neosnippet.vim efb2a615df2e6df9364087686dacca223fcfa16a
NeoBundleLock vim-colorschemes fd8f122cef604330c96a6a6e434682dbdfb878c9
NeoBundleLock vim-fugitive 854a8df0d06b8d3fcb30fa7f2b08c62b553eee3b
NeoBundleLock vim-nerdtree-syntax-highlight 35e70334a2ff6e89b82a145d1ac889e82d1ddb4e
NeoBundleLock vimshell 3787e52766812d8b99a93ccdda57517bc2a0bab6

Submodule vim/.vim/bundle/ctrlp.vim added at 7c972cb19c

Submodule vim/.vim/bundle/neobundle.vim added at 1306c131ff

Submodule vim/.vim/bundle/neosnippet-snippets added at 725c989f18

Submodule vim/.vim/bundle/neosnippet.vim added at efb2a615df

Submodule vim/.vim/bundle/vim-colorschemes added at fd8f122cef

Submodule vim/.vim/bundle/vim-fugitive added at 854a8df0d0

Submodule vim/.vim/bundle/vim-nerdtree-syntax-highlight added at 35e70334a2

Submodule vim/.vim/bundle/vimshell_3787e5 added at 3787e52766

713
vim/.vim/colors/onedark.vim Normal file
View File

@@ -0,0 +1,713 @@
" vim:fdm=marker
" Vim Color File
" Name: onedark.vim
" Maintainer: https://github.com/joshdick/onedark.vim/
" License: The MIT License (MIT)
" Based On: https://github.com/MaxSt/FlatColor/
" Companion statusline plugin and terminal themes are included with onedark.vim:
" * https://github.com/joshdick/onedark.vim#lightlinevim-colorscheme
" * https://github.com/joshdick/onedark.vim#vim-airline-theme
" * https://github.com/joshdick/onedark.vim/tree/main/term
" Color Reference {{{
" The following colors were measured inside Atom using its built-in inspector.
" +---------------------------------------------+
" | Color Name | RGB | Hex |
" |--------------+--------------------+---------|
" | Black | rgb(40, 44, 52) | #282c34 |
" |--------------+--------------------+---------|
" | White | rgb(171, 178, 191) | #abb2bf |
" |--------------+--------------------+---------|
" | Light Red | rgb(224, 108, 117) | #e06c75 |
" |--------------+--------------------+---------|
" | Dark Red | rgb(190, 80, 70) | #be5046 |
" |--------------+--------------------+---------|
" | Green | rgb(152, 195, 121) | #98c379 |
" |--------------+--------------------+---------|
" | Light Yellow | rgb(229, 192, 123) | #e5c07b |
" |--------------+--------------------+---------|
" | Dark Yellow | rgb(209, 154, 102) | #d19a66 |
" |--------------+--------------------+---------|
" | Blue | rgb(97, 175, 239) | #61afef |
" |--------------+--------------------+---------|
" | Magenta | rgb(198, 120, 221) | #c678dd |
" |--------------+--------------------+---------|
" | Cyan | rgb(86, 182, 194) | #56b6c2 |
" |--------------+--------------------+---------|
" | Gutter Grey | rgb(76, 82, 99) | #4b5263 |
" |--------------+--------------------+---------|
" | Comment Grey | rgb(92, 99, 112) | #5c6370 |
" +---------------------------------------------+
" }}}
" Initialization {{{
highlight clear
if exists("syntax_on")
syntax reset
endif
set t_Co=256
let g:colors_name="onedark"
" Set to "256" for 256-color terminals, or
" set to "16" to use your terminal emulator's native colors
" (a 16-color palette for this color scheme is available; see
" < https://github.com/joshdick/onedark.vim/blob/main/README.md >
" for more information.)
if !exists("g:onedark_termcolors")
let g:onedark_termcolors = 256
endif
" Not all terminals support italics properly. If yours does, opt-in.
if !exists("g:onedark_terminal_italics")
let g:onedark_terminal_italics = 0
endif
" This function is based on one from FlatColor: https://github.com/MaxSt/FlatColor/
" Which in turn was based on one found in hemisu: https://github.com/noahfrederick/vim-hemisu/
let s:group_colors = {} " Cache of default highlight group settings, for later reference via `onedark#extend_highlight`
function! s:h(group, style, ...)
if (a:0 > 0) " Will be true if we got here from onedark#extend_highlight
let s:highlight = s:group_colors[a:group]
for style_type in ["fg", "bg", "sp"]
if (has_key(a:style, style_type))
let l:default_style = (has_key(s:highlight, style_type) ? copy(s:highlight[style_type]) : { "cterm16": "NONE", "cterm": "NONE", "gui": "NONE" })
let s:highlight[style_type] = extend(l:default_style, a:style[style_type])
endif
endfor
if (has_key(a:style, "gui"))
let s:highlight.gui = a:style.gui
endif
if (has_key(a:style, "cterm"))
let s:highlight.cterm = a:style.cterm
endif
else
let s:highlight = a:style
let s:group_colors[a:group] = s:highlight " Cache default highlight group settings
endif
if g:onedark_terminal_italics == 0
if has_key(s:highlight, "cterm") && s:highlight["cterm"] == "italic"
unlet s:highlight.cterm
endif
if has_key(s:highlight, "gui") && s:highlight["gui"] == "italic"
unlet s:highlight.gui
endif
endif
if g:onedark_termcolors == 16
let l:ctermfg = (has_key(s:highlight, "fg") ? s:highlight.fg.cterm16 : "NONE")
let l:ctermbg = (has_key(s:highlight, "bg") ? s:highlight.bg.cterm16 : "NONE")
else
let l:ctermfg = (has_key(s:highlight, "fg") ? s:highlight.fg.cterm : "NONE")
let l:ctermbg = (has_key(s:highlight, "bg") ? s:highlight.bg.cterm : "NONE")
endif
execute "highlight" a:group
\ "guifg=" (has_key(s:highlight, "fg") ? s:highlight.fg.gui : "NONE")
\ "guibg=" (has_key(s:highlight, "bg") ? s:highlight.bg.gui : "NONE")
\ "guisp=" (has_key(s:highlight, "sp") ? s:highlight.sp.gui : "NONE")
\ "gui=" (has_key(s:highlight, "gui") ? s:highlight.gui : "NONE")
\ "ctermfg=" . l:ctermfg
\ "ctermbg=" . l:ctermbg
\ "cterm=" (has_key(s:highlight, "cterm") ? s:highlight.cterm : "NONE")
endfunction
" public {{{
function! onedark#set_highlight(group, style)
call s:h(a:group, a:style)
endfunction
function! onedark#extend_highlight(group, style)
call s:h(a:group, a:style, 1)
endfunction
" }}}
" }}}
" Color Variables {{{
let s:colors = onedark#GetColors()
let s:red = s:colors.red
let s:dark_red = s:colors.dark_red
let s:green = s:colors.green
let s:yellow = s:colors.yellow
let s:dark_yellow = s:colors.dark_yellow
let s:blue = s:colors.blue
let s:purple = s:colors.purple
let s:cyan = s:colors.cyan
let s:white = s:colors.white
let s:black = s:colors.black
let s:foreground = s:colors.foreground
let s:background = s:colors.background
let s:comment_grey = s:colors.comment_grey
let s:gutter_fg_grey = s:colors.gutter_fg_grey
let s:cursor_grey = s:colors.cursor_grey
let s:visual_grey = s:colors.visual_grey
let s:menu_grey = s:colors.menu_grey
let s:special_grey = s:colors.special_grey
let s:vertsplit = s:colors.vertsplit
" }}}
" Terminal Colors {{{
if has('nvim')
let g:terminal_color_0 = s:black.gui
let g:terminal_color_1 = s:red.gui
let g:terminal_color_2 = s:green.gui
let g:terminal_color_3 = s:yellow.gui
let g:terminal_color_4 = s:blue.gui
let g:terminal_color_5 = s:purple.gui
let g:terminal_color_6 = s:cyan.gui
let g:terminal_color_7 = s:comment_grey.gui
let g:terminal_color_8 = s:visual_grey.gui
let g:terminal_color_9 = s:red.gui
let g:terminal_color_10 = s:green.gui
let g:terminal_color_11 = s:yellow.gui
let g:terminal_color_12 = s:blue.gui
let g:terminal_color_13 = s:purple.gui
let g:terminal_color_14 = s:cyan.gui
let g:terminal_color_15 = s:white.gui
else
let g:terminal_ansi_colors = [
\ s:black.gui, s:red.gui, s:green.gui, s:yellow.gui,
\ s:blue.gui, s:purple.gui, s:cyan.gui, s:comment_grey.gui,
\ s:visual_grey.gui, s:red.gui, s:green.gui, s:yellow.gui,
\ s:blue.gui, s:purple.gui, s:cyan.gui, s:white.gui
\]
endif
" }}}
" Syntax Groups (descriptions and ordering from `:h w18`) {{{
call s:h("Comment", { "fg": s:comment_grey, "gui": "italic", "cterm": "italic" }) " any comment
call s:h("Constant", { "fg": s:cyan }) " any constant
call s:h("String", { "fg": s:green }) " a string constant: "this is a string"
call s:h("Character", { "fg": s:green }) " a character constant: 'c', '\n'
call s:h("Number", { "fg": s:dark_yellow }) " a number constant: 234, 0xff
call s:h("Boolean", { "fg": s:dark_yellow }) " a boolean constant: TRUE, false
call s:h("Float", { "fg": s:dark_yellow }) " a floating point constant: 2.3e10
call s:h("Identifier", { "fg": s:red }) " any variable name
call s:h("Function", { "fg": s:blue }) " function name (also: methods for classes)
call s:h("Statement", { "fg": s:purple }) " any statement
call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc.
call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc.
call s:h("Label", { "fg": s:purple }) " case, default, etc.
call s:h("Operator", { "fg": s:purple }) " sizeof", "+", "*", etc.
call s:h("Keyword", { "fg": s:purple }) " any other keyword
call s:h("Exception", { "fg": s:purple }) " try, catch, throw
call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor
call s:h("Include", { "fg": s:blue }) " preprocessor #include
call s:h("Define", { "fg": s:purple }) " preprocessor #define
call s:h("Macro", { "fg": s:purple }) " same as Define
call s:h("PreCondit", { "fg": s:yellow }) " preprocessor #if, #else, #endif, etc.
call s:h("Type", { "fg": s:yellow }) " int, long, char, etc.
call s:h("StorageClass", { "fg": s:yellow }) " static, register, volatile, etc.
call s:h("Structure", { "fg": s:yellow }) " struct, union, enum, etc.
call s:h("Typedef", { "fg": s:yellow }) " A typedef
call s:h("Special", { "fg": s:blue }) " any special symbol
call s:h("SpecialChar", { "fg": s:dark_yellow }) " special character in a constant
call s:h("Tag", {}) " you can use CTRL-] on this
call s:h("Delimiter", {}) " character that needs attention
call s:h("SpecialComment", { "fg": s:comment_grey }) " special things inside a comment
call s:h("Debug", {}) " debugging statements
call s:h("Underlined", { "gui": "underline", "cterm": "underline" }) " text that stands out, HTML links
call s:h("Ignore", {}) " left blank, hidden
call s:h("Error", { "fg": s:red }) " any erroneous construct
call s:h("Todo", { "fg": s:purple }) " anything that needs extra attention; mostly the keywords TODO FIXME and XXX
" }}}
" Highlighting Groups (descriptions and ordering from `:h highlight-groups`) {{{
call s:h("ColorColumn", { "bg": s:cursor_grey }) " used for the columns set with 'colorcolumn'
call s:h("Conceal", {}) " placeholder characters substituted for concealed text (see 'conceallevel')
call s:h("Cursor", { "fg": s:black, "bg": s:blue }) " the character under the cursor
call s:h("CursorIM", {}) " like Cursor, but used when in IME mode
call s:h("CursorColumn", { "bg": s:cursor_grey }) " the screen column that the cursor is in when 'cursorcolumn' is set
if &diff
" Don't change the background color in diff mode
call s:h("CursorLine", { "gui": "underline" }) " the screen line that the cursor is in when 'cursorline' is set
else
call s:h("CursorLine", { "bg": s:cursor_grey }) " the screen line that the cursor is in when 'cursorline' is set
endif
call s:h("Directory", { "fg": s:blue }) " directory names (and other special names in listings)
call s:h("DiffAdd", { "bg": s:green, "fg": s:black }) " diff mode: Added line
call s:h("DiffChange", { "fg": s:yellow, "gui": "underline", "cterm": "underline" }) " diff mode: Changed line
call s:h("DiffDelete", { "bg": s:red, "fg": s:black }) " diff mode: Deleted line
call s:h("DiffText", { "bg": s:yellow, "fg": s:black }) " diff mode: Changed text within a changed line
if get(g:, 'onedark_hide_endofbuffer', 0)
" If enabled, will style end-of-buffer filler lines (~) to appear to be hidden.
call s:h("EndOfBuffer", { "fg": s:black }) " filler lines (~) after the last line in the buffer
endif
call s:h("ErrorMsg", { "fg": s:red }) " error messages on the command line
call s:h("VertSplit", { "fg": s:vertsplit }) " the column separating vertically split windows
call s:h("Folded", { "fg": s:comment_grey }) " line used for closed folds
call s:h("FoldColumn", {}) " 'foldcolumn'
call s:h("SignColumn", {}) " column where signs are displayed
call s:h("IncSearch", { "fg": s:yellow, "bg": s:comment_grey }) " 'incsearch' highlighting; also used for the text replaced with ":s///c"
call s:h("LineNr", { "fg": s:gutter_fg_grey }) " Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set.
call s:h("CursorLineNr", {}) " Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line.
call s:h("MatchParen", { "fg": s:blue, "gui": "underline", "cterm": "underline" }) " The character under the cursor or just before it, if it is a paired bracket, and its match.
call s:h("ModeMsg", {}) " 'showmode' message (e.g., "-- INSERT --")
call s:h("MoreMsg", {}) " more-prompt
call s:h("NonText", { "fg": s:special_grey }) " '~' and '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line).
call s:h("Normal", { "fg": s:foreground, "bg": s:background }) " normal text
call s:h("Pmenu", { "fg": s:white, "bg": s:menu_grey }) " Popup menu: normal item.
call s:h("PmenuSel", { "fg": s:cursor_grey, "bg": s:blue }) " Popup menu: selected item.
call s:h("PmenuSbar", { "bg": s:cursor_grey }) " Popup menu: scrollbar.
call s:h("PmenuThumb", { "bg": s:white }) " Popup menu: Thumb of the scrollbar.
call s:h("Question", { "fg": s:purple }) " hit-enter prompt and yes/no questions
call s:h("QuickFixLine", { "fg": s:black, "bg": s:yellow }) " Current quickfix item in the quickfix window.
call s:h("Search", { "fg": s:black, "bg": s:yellow }) " Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out.
call s:h("SpecialKey", { "fg": s:special_grey }) " Meta and special keys listed with ":map", also for text used to show unprintable characters in the text, 'listchars'. Generally: text that is displayed differently from what it really is.
call s:h("SpellBad", { "fg": s:red, "gui": "underline", "cterm": "underline" }) " Word that is not recognized by the spellchecker. This will be combined with the highlighting used otherwise.
call s:h("SpellCap", { "fg": s:dark_yellow }) " Word that should start with a capital. This will be combined with the highlighting used otherwise.
call s:h("SpellLocal", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is used in another region. This will be combined with the highlighting used otherwise.
call s:h("SpellRare", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is hardly ever used. spell This will be combined with the highlighting used otherwise.
call s:h("StatusLine", { "fg": s:white, "bg": s:cursor_grey }) " status line of current window
call s:h("StatusLineNC", { "fg": s:comment_grey }) " status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window.
call s:h("StatusLineTerm", { "fg": s:white, "bg": s:cursor_grey }) " status line of current :terminal window
call s:h("StatusLineTermNC", { "fg": s:comment_grey }) " status line of non-current :terminal window
call s:h("TabLine", { "fg": s:comment_grey }) " tab pages line, not active tab page label
call s:h("TabLineFill", {}) " tab pages line, where there are no labels
call s:h("TabLineSel", { "fg": s:white }) " tab pages line, active tab page label
call s:h("Terminal", { "fg": s:white, "bg": s:black }) " terminal window (see terminal-size-color)
call s:h("Title", { "fg": s:green }) " titles for output from ":set all", ":autocmd" etc.
call s:h("Visual", { "bg": s:visual_grey }) " Visual mode selection
call s:h("VisualNOS", { "bg": s:visual_grey }) " Visual mode selection when vim is "Not Owning the Selection". Only X11 Gui's gui-x11 and xterm-clipboard supports this.
call s:h("WarningMsg", { "fg": s:yellow }) " warning messages
call s:h("WildMenu", { "fg": s:black, "bg": s:blue }) " current match in 'wildmenu' completion
" }}}
" Termdebug highlighting for Vim 8.1+ {{{
" See `:h hl-debugPC` and `:h hl-debugBreakpoint`.
call s:h("debugPC", { "bg": s:special_grey }) " the current position
call s:h("debugBreakpoint", { "fg": s:black, "bg": s:red }) " a breakpoint
" }}}
" Language-Specific Highlighting {{{
" CSS
call s:h("cssAttrComma", { "fg": s:purple })
call s:h("cssAttributeSelector", { "fg": s:green })
call s:h("cssBraces", { "fg": s:white })
call s:h("cssClassName", { "fg": s:dark_yellow })
call s:h("cssClassNameDot", { "fg": s:dark_yellow })
call s:h("cssDefinition", { "fg": s:purple })
call s:h("cssFontAttr", { "fg": s:dark_yellow })
call s:h("cssFontDescriptor", { "fg": s:purple })
call s:h("cssFunctionName", { "fg": s:blue })
call s:h("cssIdentifier", { "fg": s:blue })
call s:h("cssImportant", { "fg": s:purple })
call s:h("cssInclude", { "fg": s:white })
call s:h("cssIncludeKeyword", { "fg": s:purple })
call s:h("cssMediaType", { "fg": s:dark_yellow })
call s:h("cssProp", { "fg": s:white })
call s:h("cssPseudoClassId", { "fg": s:dark_yellow })
call s:h("cssSelectorOp", { "fg": s:purple })
call s:h("cssSelectorOp2", { "fg": s:purple })
call s:h("cssTagName", { "fg": s:red })
" Fish Shell
call s:h("fishKeyword", { "fg": s:purple })
call s:h("fishConditional", { "fg": s:purple })
" Go
call s:h("goDeclaration", { "fg": s:purple })
call s:h("goBuiltins", { "fg": s:cyan })
call s:h("goFunctionCall", { "fg": s:blue })
call s:h("goVarDefs", { "fg": s:red })
call s:h("goVarAssign", { "fg": s:red })
call s:h("goVar", { "fg": s:purple })
call s:h("goConst", { "fg": s:purple })
call s:h("goType", { "fg": s:yellow })
call s:h("goTypeName", { "fg": s:yellow })
call s:h("goDeclType", { "fg": s:cyan })
call s:h("goTypeDecl", { "fg": s:purple })
" HTML (keep consistent with Markdown, below)
call s:h("htmlArg", { "fg": s:dark_yellow })
call s:h("htmlBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" })
call s:h("htmlBoldItalic", { "fg": s:green, "gui": "bold,italic", "cterm": "bold,italic" })
call s:h("htmlEndTag", { "fg": s:white })
call s:h("htmlH1", { "fg": s:red })
call s:h("htmlH2", { "fg": s:red })
call s:h("htmlH3", { "fg": s:red })
call s:h("htmlH4", { "fg": s:red })
call s:h("htmlH5", { "fg": s:red })
call s:h("htmlH6", { "fg": s:red })
call s:h("htmlItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" })
call s:h("htmlLink", { "fg": s:cyan, "gui": "underline", "cterm": "underline" })
call s:h("htmlSpecialChar", { "fg": s:dark_yellow })
call s:h("htmlSpecialTagName", { "fg": s:red })
call s:h("htmlTag", { "fg": s:white })
call s:h("htmlTagN", { "fg": s:red })
call s:h("htmlTagName", { "fg": s:red })
call s:h("htmlTitle", { "fg": s:white })
" JavaScript
call s:h("javaScriptBraces", { "fg": s:white })
call s:h("javaScriptFunction", { "fg": s:purple })
call s:h("javaScriptIdentifier", { "fg": s:purple })
call s:h("javaScriptNull", { "fg": s:dark_yellow })
call s:h("javaScriptNumber", { "fg": s:dark_yellow })
call s:h("javaScriptRequire", { "fg": s:cyan })
call s:h("javaScriptReserved", { "fg": s:purple })
" https://github.com/pangloss/vim-javascript
call s:h("jsArrowFunction", { "fg": s:purple })
call s:h("jsClassKeyword", { "fg": s:purple })
call s:h("jsClassMethodType", { "fg": s:purple })
call s:h("jsDocParam", { "fg": s:blue })
call s:h("jsDocTags", { "fg": s:purple })
call s:h("jsExport", { "fg": s:purple })
call s:h("jsExportDefault", { "fg": s:purple })
call s:h("jsExtendsKeyword", { "fg": s:purple })
call s:h("jsFrom", { "fg": s:purple })
call s:h("jsFuncCall", { "fg": s:blue })
call s:h("jsFunction", { "fg": s:purple })
call s:h("jsGenerator", { "fg": s:yellow })
call s:h("jsGlobalObjects", { "fg": s:yellow })
call s:h("jsImport", { "fg": s:purple })
call s:h("jsModuleAs", { "fg": s:purple })
call s:h("jsModuleWords", { "fg": s:purple })
call s:h("jsModules", { "fg": s:purple })
call s:h("jsNull", { "fg": s:dark_yellow })
call s:h("jsOperator", { "fg": s:purple })
call s:h("jsStorageClass", { "fg": s:purple })
call s:h("jsSuper", { "fg": s:red })
call s:h("jsTemplateBraces", { "fg": s:dark_red })
call s:h("jsTemplateVar", { "fg": s:green })
call s:h("jsThis", { "fg": s:red })
call s:h("jsUndefined", { "fg": s:dark_yellow })
" https://github.com/othree/yajs.vim
call s:h("javascriptArrowFunc", { "fg": s:purple })
call s:h("javascriptClassExtends", { "fg": s:purple })
call s:h("javascriptClassKeyword", { "fg": s:purple })
call s:h("javascriptDocNotation", { "fg": s:purple })
call s:h("javascriptDocParamName", { "fg": s:blue })
call s:h("javascriptDocTags", { "fg": s:purple })
call s:h("javascriptEndColons", { "fg": s:white })
call s:h("javascriptExport", { "fg": s:purple })
call s:h("javascriptFuncArg", { "fg": s:white })
call s:h("javascriptFuncKeyword", { "fg": s:purple })
call s:h("javascriptIdentifier", { "fg": s:red })
call s:h("javascriptImport", { "fg": s:purple })
call s:h("javascriptMethodName", { "fg": s:white })
call s:h("javascriptObjectLabel", { "fg": s:white })
call s:h("javascriptOpSymbol", { "fg": s:cyan })
call s:h("javascriptOpSymbols", { "fg": s:cyan })
call s:h("javascriptPropertyName", { "fg": s:green })
call s:h("javascriptTemplateSB", { "fg": s:dark_red })
call s:h("javascriptVariable", { "fg": s:purple })
" JSON
call s:h("jsonCommentError", { "fg": s:white })
call s:h("jsonKeyword", { "fg": s:red })
call s:h("jsonBoolean", { "fg": s:dark_yellow })
call s:h("jsonNumber", { "fg": s:dark_yellow })
call s:h("jsonQuote", { "fg": s:white })
call s:h("jsonMissingCommaError", { "fg": s:red, "gui": "reverse" })
call s:h("jsonNoQuotesError", { "fg": s:red, "gui": "reverse" })
call s:h("jsonNumError", { "fg": s:red, "gui": "reverse" })
call s:h("jsonString", { "fg": s:green })
call s:h("jsonStringSQError", { "fg": s:red, "gui": "reverse" })
call s:h("jsonSemicolonError", { "fg": s:red, "gui": "reverse" })
" LESS
call s:h("lessVariable", { "fg": s:purple })
call s:h("lessAmpersandChar", { "fg": s:white })
call s:h("lessClass", { "fg": s:dark_yellow })
" Markdown (keep consistent with HTML, above)
call s:h("markdownBlockquote", { "fg": s:comment_grey })
call s:h("markdownBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" })
call s:h("markdownBoldItalic", { "fg": s:green, "gui": "bold,italic", "cterm": "bold,italic" })
call s:h("markdownCode", { "fg": s:green })
call s:h("markdownCodeBlock", { "fg": s:green })
call s:h("markdownCodeDelimiter", { "fg": s:green })
call s:h("markdownH1", { "fg": s:red })
call s:h("markdownH2", { "fg": s:red })
call s:h("markdownH3", { "fg": s:red })
call s:h("markdownH4", { "fg": s:red })
call s:h("markdownH5", { "fg": s:red })
call s:h("markdownH6", { "fg": s:red })
call s:h("markdownHeadingDelimiter", { "fg": s:red })
call s:h("markdownHeadingRule", { "fg": s:comment_grey })
call s:h("markdownId", { "fg": s:purple })
call s:h("markdownIdDeclaration", { "fg": s:blue })
call s:h("markdownIdDelimiter", { "fg": s:purple })
call s:h("markdownItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" })
call s:h("markdownLinkDelimiter", { "fg": s:purple })
call s:h("markdownLinkText", { "fg": s:blue })
call s:h("markdownListMarker", { "fg": s:red })
call s:h("markdownOrderedListMarker", { "fg": s:red })
call s:h("markdownRule", { "fg": s:comment_grey })
call s:h("markdownUrl", { "fg": s:cyan, "gui": "underline", "cterm": "underline" })
" Perl
call s:h("perlFiledescRead", { "fg": s:green })
call s:h("perlFunction", { "fg": s:purple })
call s:h("perlMatchStartEnd",{ "fg": s:blue })
call s:h("perlMethod", { "fg": s:purple })
call s:h("perlPOD", { "fg": s:comment_grey })
call s:h("perlSharpBang", { "fg": s:comment_grey })
call s:h("perlSpecialString",{ "fg": s:dark_yellow })
call s:h("perlStatementFiledesc", { "fg": s:red })
call s:h("perlStatementFlow",{ "fg": s:red })
call s:h("perlStatementInclude", { "fg": s:purple })
call s:h("perlStatementScalar",{ "fg": s:purple })
call s:h("perlStatementStorage", { "fg": s:purple })
call s:h("perlSubName",{ "fg": s:yellow })
call s:h("perlVarPlain",{ "fg": s:blue })
" PHP
call s:h("phpVarSelector", { "fg": s:red })
call s:h("phpOperator", { "fg": s:white })
call s:h("phpParent", { "fg": s:white })
call s:h("phpMemberSelector", { "fg": s:white })
call s:h("phpType", { "fg": s:purple })
call s:h("phpKeyword", { "fg": s:purple })
call s:h("phpClass", { "fg": s:yellow })
call s:h("phpUseClass", { "fg": s:white })
call s:h("phpUseAlias", { "fg": s:white })
call s:h("phpInclude", { "fg": s:purple })
call s:h("phpClassExtends", { "fg": s:green })
call s:h("phpDocTags", { "fg": s:white })
call s:h("phpFunction", { "fg": s:blue })
call s:h("phpFunctions", { "fg": s:cyan })
call s:h("phpMethodsVar", { "fg": s:dark_yellow })
call s:h("phpMagicConstants", { "fg": s:dark_yellow })
call s:h("phpSuperglobals", { "fg": s:red })
call s:h("phpConstants", { "fg": s:dark_yellow })
" Ruby
call s:h("rubyBlockParameter", { "fg": s:red})
call s:h("rubyBlockParameterList", { "fg": s:red })
call s:h("rubyClass", { "fg": s:purple})
call s:h("rubyConstant", { "fg": s:yellow})
call s:h("rubyControl", { "fg": s:purple })
call s:h("rubyEscape", { "fg": s:red})
call s:h("rubyFunction", { "fg": s:blue})
call s:h("rubyGlobalVariable", { "fg": s:red})
call s:h("rubyInclude", { "fg": s:blue})
call s:h("rubyIncluderubyGlobalVariable", { "fg": s:red})
call s:h("rubyInstanceVariable", { "fg": s:red})
call s:h("rubyInterpolation", { "fg": s:cyan })
call s:h("rubyInterpolationDelimiter", { "fg": s:red })
call s:h("rubyInterpolationDelimiter", { "fg": s:red})
call s:h("rubyRegexp", { "fg": s:cyan})
call s:h("rubyRegexpDelimiter", { "fg": s:cyan})
call s:h("rubyStringDelimiter", { "fg": s:green})
call s:h("rubySymbol", { "fg": s:cyan})
" Sass
" https://github.com/tpope/vim-haml
call s:h("sassAmpersand", { "fg": s:red })
call s:h("sassClass", { "fg": s:dark_yellow })
call s:h("sassControl", { "fg": s:purple })
call s:h("sassExtend", { "fg": s:purple })
call s:h("sassFor", { "fg": s:white })
call s:h("sassFunction", { "fg": s:cyan })
call s:h("sassId", { "fg": s:blue })
call s:h("sassInclude", { "fg": s:purple })
call s:h("sassMedia", { "fg": s:purple })
call s:h("sassMediaOperators", { "fg": s:white })
call s:h("sassMixin", { "fg": s:purple })
call s:h("sassMixinName", { "fg": s:blue })
call s:h("sassMixing", { "fg": s:purple })
call s:h("sassVariable", { "fg": s:purple })
" https://github.com/cakebaker/scss-syntax.vim
call s:h("scssExtend", { "fg": s:purple })
call s:h("scssImport", { "fg": s:purple })
call s:h("scssInclude", { "fg": s:purple })
call s:h("scssMixin", { "fg": s:purple })
call s:h("scssSelectorName", { "fg": s:dark_yellow })
call s:h("scssVariable", { "fg": s:purple })
" TeX
call s:h("texStatement", { "fg": s:purple })
call s:h("texSubscripts", { "fg": s:dark_yellow })
call s:h("texSuperscripts", { "fg": s:dark_yellow })
call s:h("texTodo", { "fg": s:dark_red })
call s:h("texBeginEnd", { "fg": s:purple })
call s:h("texBeginEndName", { "fg": s:blue })
call s:h("texMathMatcher", { "fg": s:blue })
call s:h("texMathDelim", { "fg": s:blue })
call s:h("texDelimiter", { "fg": s:dark_yellow })
call s:h("texSpecialChar", { "fg": s:dark_yellow })
call s:h("texCite", { "fg": s:blue })
call s:h("texRefZone", { "fg": s:blue })
" TypeScript
call s:h("typescriptReserved", { "fg": s:purple })
call s:h("typescriptEndColons", { "fg": s:white })
call s:h("typescriptBraces", { "fg": s:white })
" XML
call s:h("xmlAttrib", { "fg": s:dark_yellow })
call s:h("xmlEndTag", { "fg": s:red })
call s:h("xmlTag", { "fg": s:red })
call s:h("xmlTagName", { "fg": s:red })
" }}}
" Plugin Highlighting {{{
" airblade/vim-gitgutter
call s:h("GitGutterAdd", { "fg": s:green })
call s:h("GitGutterChange", { "fg": s:yellow })
call s:h("GitGutterDelete", { "fg": s:red })
" dense-analysis/ale
call s:h("ALEError", { "fg": s:red, "gui": "underline", "cterm": "underline" })
call s:h("ALEWarning", { "fg": s:yellow, "gui": "underline", "cterm": "underline" })
call s:h("ALEInfo", { "gui": "underline", "cterm": "underline" })
call s:h("ALEErrorSign", { "fg": s:red })
call s:h("ALEWarningSign", { "fg": s:yellow })
call s:h("ALEInfoSign", { })
" easymotion/vim-easymotion
call s:h("EasyMotionTarget", { "fg": s:red, "gui": "bold", "cterm": "bold" })
call s:h("EasyMotionTarget2First", { "fg": s:yellow, "gui": "bold", "cterm": "bold" })
call s:h("EasyMotionTarget2Second", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" })
call s:h("EasyMotionShade", { "fg": s:comment_grey })
" lewis6991/gitsigns.nvim
hi link GitSignsAdd GitGutterAdd
hi link GitSignsChange GitGutterChange
hi link GitSignsDelete GitGutterDelete
" mhinz/vim-signify
hi link SignifySignAdd GitGutterAdd
hi link SignifySignChange GitGutterChange
hi link SignifySignDelete GitGutterDelete
" neoclide/coc.nvim
call s:h("CocErrorSign", { "fg": s:red })
call s:h("CocWarningSign", { "fg": s:yellow })
call s:h("CocInfoSign", { "fg": s:blue })
call s:h("CocHintSign", { "fg": s:cyan })
call s:h("CocFadeOut", { "fg": s:comment_grey })
" https://github.com/joshdick/onedark.vim/issues/313
highlight! link CocMenuSel PmenuSel
" neomake/neomake
call s:h("NeomakeErrorSign", { "fg": s:red })
call s:h("NeomakeWarningSign", { "fg": s:yellow })
call s:h("NeomakeInfoSign", { "fg": s:blue })
" plasticboy/vim-markdown (keep consistent with Markdown, above)
call s:h("mkdDelimiter", { "fg": s:purple })
call s:h("mkdHeading", { "fg": s:red })
call s:h("mkdLink", { "fg": s:blue })
call s:h("mkdURL", { "fg": s:cyan, "gui": "underline", "cterm": "underline" })
" prabirshrestha/vim-lsp
call s:h("LspErrorText", { "fg": s:red })
call s:h("LspWarningText", { "fg": s:yellow })
call s:h("LspInformationText", { "fg":s:blue })
call s:h("LspHintText", { "fg":s:cyan })
call s:h("LspErrorHighlight", { "fg": s:red, "gui": "underline", "cterm": "underline" })
call s:h("LspWarningHighlight", { "fg": s:yellow, "gui": "underline", "cterm": "underline" })
call s:h("LspInformationHighlight", { "fg":s:blue, "gui": "underline", "cterm": "underline" })
call s:h("LspHintHighlight", { "fg":s:cyan, "gui": "underline", "cterm": "underline" })
" tpope/vim-fugitive
call s:h("diffAdded", { "fg": s:green })
call s:h("diffRemoved", { "fg": s:red })
" }}}
" Git Highlighting {{{
call s:h("gitcommitComment", { "fg": s:comment_grey })
call s:h("gitcommitUnmerged", { "fg": s:green })
call s:h("gitcommitOnBranch", {})
call s:h("gitcommitBranch", { "fg": s:purple })
call s:h("gitcommitDiscardedType", { "fg": s:red })
call s:h("gitcommitSelectedType", { "fg": s:green })
call s:h("gitcommitHeader", {})
call s:h("gitcommitUntrackedFile", { "fg": s:cyan })
call s:h("gitcommitDiscardedFile", { "fg": s:red })
call s:h("gitcommitSelectedFile", { "fg": s:green })
call s:h("gitcommitUnmergedFile", { "fg": s:yellow })
call s:h("gitcommitFile", {})
call s:h("gitcommitSummary", { "fg": s:white })
call s:h("gitcommitOverflow", { "fg": s:red })
hi link gitcommitNoBranch gitcommitBranch
hi link gitcommitUntracked gitcommitComment
hi link gitcommitDiscarded gitcommitComment
hi link gitcommitSelected gitcommitComment
hi link gitcommitDiscardedArrow gitcommitDiscardedFile
hi link gitcommitSelectedArrow gitcommitSelectedFile
hi link gitcommitUnmergedArrow gitcommitUnmergedFile
" }}}
" Neovim-Specific Highlighting {{{
if has("nvim")
" Neovim terminal colors {{{
let g:terminal_color_0 = s:black.gui
let g:terminal_color_1 = s:red.gui
let g:terminal_color_2 = s:green.gui
let g:terminal_color_3 = s:yellow.gui
let g:terminal_color_4 = s:blue.gui
let g:terminal_color_5 = s:purple.gui
let g:terminal_color_6 = s:cyan.gui
let g:terminal_color_7 = s:white.gui
let g:terminal_color_8 = s:visual_grey.gui
let g:terminal_color_9 = s:dark_red.gui
let g:terminal_color_10 = s:green.gui " No dark version
let g:terminal_color_11 = s:dark_yellow.gui
let g:terminal_color_12 = s:blue.gui " No dark version
let g:terminal_color_13 = s:purple.gui " No dark version
let g:terminal_color_14 = s:cyan.gui " No dark version
let g:terminal_color_15 = s:comment_grey.gui
let g:terminal_color_background = s:background.gui
let g:terminal_color_foreground = s:foreground.gui
" }}}
" Neovim Diagnostics {{{
call s:h("DiagnosticError", { "fg": s:red })
call s:h("DiagnosticWarn", { "fg": s:yellow })
call s:h("DiagnosticInfo", { "fg": s:blue })
call s:h("DiagnosticHint", { "fg": s:cyan })
call s:h("DiagnosticUnderlineError", { "fg": s:red, "gui": "underline", "cterm": "underline" })
call s:h("DiagnosticUnderlineWarn", { "fg": s:yellow, "gui": "underline", "cterm": "underline" })
call s:h("DiagnosticUnderlineInfo", { "fg": s:blue, "gui": "underline", "cterm": "underline" })
call s:h("DiagnosticUnderlineHint", { "fg": s:cyan, "gui": "underline", "cterm": "underline" })
" }}}
" Neovim LSP (for versions < 0.5.1) {{{
hi link LspDiagnosticsDefaultError DiagnosticError
hi link LspDiagnosticsDefaultWarning DiagnosticWarn
hi link LspDiagnosticsDefaultInformation DiagnosticInfo
hi link LspDiagnosticsDefaultHint DiagnosticHint
hi link LspDiagnosticsUnderlineError DiagnosticUnderlineError
hi link LspDiagnosticsUnderlineWarning DiagnosticUnderlineWarn
hi link LspDiagnosticsUnderlineInformation DiagnosticUnderlineInfo
hi link LspDiagnosticsUnderlineHint DiagnosticUnderlineHint
" }}}
endif
" }}}
" Must appear at the end of the file to work around this oddity:
" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ
set background=dark

1
vim/.vim/plugged/ale Submodule

Submodule vim/.vim/plugged/ale added at 8922478a83

Submodule vim/.vim/plugged/coc.nvim added at 7b9e1ef0a1

Submodule vim/.vim/plugged/copilot.vim added at 22fd9542e3

1
vim/.vim/plugged/fzf Submodule

Submodule vim/.vim/plugged/fzf added at da752fc9a4

Submodule vim/.vim/plugged/fzf.vim added at f6cb5b1789

Submodule vim/.vim/plugged/gruvbox added at f1ecde848f

Submodule vim/.vim/plugged/lightline.vim added at 58c97bc21c

Submodule vim/.vim/plugged/minimap.vim added at 701f4cf4b6

Submodule vim/.vim/plugged/nerdtree added at bc606c43e2

Submodule vim/.vim/plugged/tagbar added at 12edcb5944

Submodule vim/.vim/plugged/undotree added at 7df3be7a26

Submodule vim/.vim/plugged/vim-commentary added at f67e3e67ea

Submodule vim/.vim/plugged/vim-css-color added at faa6593566

Submodule vim/.vim/plugged/vim-devicons added at 71f239af28

Submodule vim/.vim/plugged/vim-fugitive added at 854a8df0d0

Submodule vim/.vim/plugged/vim-lsp added at c20c6650d3

Submodule vim/.vim/plugged/vim-lsp-settings added at df2ee3844f

Submodule vim/.vim/plugged/vim-smooth-scroll added at 0eae2367c7

Submodule vim/.vim/plugged/vim-startify added at 4e089dffda

Submodule vim/.vim/plugged/vim-surround added at 3d188ed211

2350
vim/.viminfo Normal file
View File

@@ -0,0 +1,2350 @@
# This viminfo file was generated by Vim 9.0.
# You may edit it if you're careful!
# Viminfo version
|1,4
# Value of 'encoding' when this file was written
*encoding=utf-8
# hlsearch on (H) or off (h):
~h
# Last Search Pattern:
~MSle0~/nerdtree
# Last Substitute Search Pattern:
~MSle0&\<matrixDeterminant\>
# Last Substitute String:
$
# Command Line History (newest to oldest):
:wq
|2,0,1707945903,,"wq"
:so
|2,0,1707759623,,"so"
:w
|2,0,1707759622,,"w"
:q
|2,0,1707759597,,"q"
::
|2,0,1707430602,,":"
:Ex
|2,0,1707379711,,"Ex"
:ex
|2,0,1707379704,,"ex"
:Copilot
|2,0,1707373381,,"Copilot"
:q\
|2,0,1707373095,,"q\\"
:q!
|2,0,1707336297,,"q!"
:wq!
|2,0,1707336293,,"wq!"
:terminal
|2,0,1707328622,,"terminal"
:qa
|2,0,1707328522,,"qa"
:vsplit ../third/third.c
|2,0,1707328316,,"vsplit ../third/third.c"
:vsplit terminal
|2,0,1707328092,,"vsplit terminal"
:%s/\<fifth\>/fifth/gI
|2,0,1707327514,,"%s/\\<fifth\\>/fifth/gI"
:%s/\<out\>/out/gI
|2,0,1707327513,,"%s/\\<out\\>/out/gI"
:%s/\<matrixDeterminant\>/fifth/gI
|2,0,1707327499,,"%s/\\<matrixDeterminant\\>/fifth/gI"
:!mv fifth.c fifth
|2,0,1707327474,,"!mv fifth.c fifth"
:!mv fifth/matrixDeterminant.c fifth.c
|2,0,1707327442,,"!mv fifth/matrixDeterminant.c fifth.c"
:source %
|2,0,1707296314,,"source %"
:vsplit ~/.vimrc
|2,0,1707296135,,"vsplit ~/.vimrc"
:ALEInfo
|2,0,1707296105,,"ALEInfo"
:ALEStop
|2,0,1707296099,,"ALEStop"
:ALEEnable
|2,0,1707296091,,"ALEEnable"
:ALEGoToTypeDefinition
|2,0,1707296077,,"ALEGoToTypeDefinition"
:ALEGoToImplementation
|2,0,1707296075,,"ALEGoToImplementation"
:ALEGoToDefinition
|2,0,1707296072,,"ALEGoToDefinition"
:tabclose
|2,0,1707295950,,"tabclose"
:PlugInstall
|2,0,1707295805,,"PlugInstall"
:;q
|2,0,1707295764,,";q"
:verbose func {194}
|2,0,1707292929,,"verbose func {194}"
:source ~/nvim/init.lua
|2,0,1707290837,,"source ~/nvim/init.lua"
:h rtp
|2,0,1707290556,,"h rtp"
:qa!
|2,0,1707290107,,"qa!"
:nohlsearch
|2,0,1707282079,,"nohlsearch"
:%s/\<postorder\>/postorderfree/gI
|2,0,1707282073,,"%s/\\<postorder\\>/postorderfree/gI"
:source ~/.vimrc
|2,0,1707281503,,"source ~/.vimrc"
:G pull
|2,0,1707279868,,"G pull"
:G push
|2,0,1707279853,,"G push"
:%s/\<postorder\>/post_order_free/gI
|2,0,1707279772,,"%s/\\<postorder\\>/post_order_free/gI"
:Qa
|2,0,1707279695,,"Qa"
:!make
|2,0,1707279690,,"!make"
:kk
|2,0,1707278521,,"kk"
:!./fourth file1.txt
|2,0,1707277608,,"!./fourth file1.txt"
:%s/\<NeoBundle\>/NeoBundle]/gI
|2,0,1707273603,,"%s/\\<NeoBundle\\>/NeoBundle]/gI"
:%s/\<nnoremap\>//gI
|2,0,1707273586,,"%s/\\<nnoremap\\>//gI"
:%s/\<nnoremap\>/vasdfojjodsf/gI
|2,0,1707273578,,"%s/\\<nnoremap\\>/vasdfojjodsf/gI"
:%s/\<NeoBundle\>/NeoBundle]]/gI
|2,0,1707273548,,"%s/\\<NeoBundle\\>/NeoBundle]]/gI"
:NeoBundleInstall
|2,0,1707273223,,"NeoBundleInstall"
:Copilto
|2,0,1707273020,,"Copilto"
:source
|2,0,1707272518,,"source "
:<nop>
|2,0,1707271773,,"<nop>"
:LspInst:q
|2,0,1707271335,,"LspInst:q"
:Q
|2,0,1707250936,,"Q"
:colorscheme gruvbox
|2,0,1707250857,,"colorscheme gruvbox"
:Minimap
|2,0,1707250675,,"Minimap"
:help ale-fix-configuration
|2,0,1707243986,,"help ale-fix-configuration"
:ALEFixSuggest
|2,0,1707243871,,"ALEFixSuggest"
:ALEFix
|2,0,1707243861,,"ALEFix"
:ALEDetail
|2,0,1707243855,,"ALEDetail"
:ALEToggleBuffer
|2,0,1707243779,,"ALEToggleBuffer"
:GFiles
|2,0,1707243327,,"GFiles"
:FZF
|2,0,1707243224,,"FZF"
:Gfiles?
|2,0,1707243216,,"Gfiles?"
:Gfiles
|2,0,1707243212,,"Gfiles"
:Files
|2,0,1707243167,,"Files"
:f
|2,0,1707243121,,"f"
:fzf
|2,0,1707243120,,"fzf"
:vsplit ../second/second.c
|2,0,1707241815,,"vsplit ../second/second.c"
:;
|2,0,1707200389,,";"
:LspInstallServer
|2,0,1707200311,,"LspInstallServer"
:UndotreeShow
|2,0,1707200213,,"UndotreeShow"
:Gpush
|2,0,1707199999,,"Gpush"
:suorce ~/
|2,0,1707199126,,"suorce ~/"
:source vimr
|2,0,1707199003,,"source vimr"
:h coc-action-jumpDefinition
|2,0,1707198624,,"h coc-action-jumpDefinition"
::h coc-action-jumpDefinition
|2,0,1707198613,,":h coc-action-jumpDefinition
"
:vsplit
|2,0,1707198514,,"vsplit "
:PlugClean
|2,0,1707197802,,"PlugClean"
:LspStatus
|2,0,1707197731,,"LspStatus"
:LspInstallServer`
|2,0,1707197717,,"LspInstallServer`"
:P
|2,0,1707197714,,"P"
:Q!
|2,0,1707197696,,"Q!"
:!source ~/.vimrc
|2,0,1707197593,,"!source ~/.vimrc"
:Source ~
|2,0,1707197584,,"Source ~"
:vsplit
|2,0,1707197375,,"vsplit"
:Vsplit
|2,0,1707197373,,"Vsplit"
:%s/binarySearchTree/fourth/gc
|2,0,1707197335,,"%s/binarySearchTree/fourth/gc"
:%s/binarySearchTree.out/fourth/g
|2,0,1707197309,,"%s/binarySearchTree.out/fourth/g"
:Lsp
|2,0,1707197070,,"Lsp"
:Git
|2,0,1707196487,,"Git"
:S=si
|2,0,1707196054,,"S=si"
:u
|2,0,1707196050,,"u"
:pv
|2,0,1707195977,,"pv"
:G commit -m "Fixed Third"
|2,0,1707013056,,"G commit -m \"Fixed Third\""
:G stage .
|2,0,1707013047,,"G stage ."
:G add .
|2,0,1707013038,,"G add ."
:Wq
|2,0,1707008030,,"Wq"
:G
|2,0,1707004768,,"G"
:nohlserach
|2,0,1707004341,,"nohlserach"
:%s/numRows/numRowsCols/g
|2,0,1707004335,,"%s/numRows/numRowsCols/g"
:%s/numRows/numRowsCols/ga
|2,0,1707004325,,"%s/numRows/numRowsCols/ga"
:termnial
|2,0,1707003368,,"termnial"
:Terminal
|2,0,1707003366,,"Terminal"
:swap
|2,0,1707003165,,"swap"
:G commit -m "Fixes"
|2,0,1707003043,,"G commit -m \"Fixes\""
:g stage .
|2,0,1707003034,,"g stage ."
:git
|2,0,1707003018,,"git"
:g add .
|2,0,1707003016,,"g add ."
:%s/matrixExponentiation/third/gc
|2,0,1707002351,,"%s/matrixExponentiation/third/gc"
:%s/Node/node_t/gc
|2,0,1706897965,,"%s/Node/node_t/gc"
:iw
|2,0,1706896745,,"iw"
:'<,'>q
|2,0,1706895576,,"'<,'>q"
:%s/second.out/second/g
|2,0,1706894128,,"%s/second.out/second/g"
:%s/orderedLinkedList/second/g
|2,0,1706894110,,"%s/orderedLinkedList/second/g"
:s/orderedLinkedList/second/g
|2,0,1706894097,,"s/orderedLinkedList/second/g"
:s/orderedLinkedList
|2,0,1706894075,,"s/orderedLinkedList"
:Lq
|2,0,1706642945,,"Lq"
:45
|2,0,1706639472,,"45"
:40
|2,0,1706639435,,"40"
:37
|2,0,1706639130,,"37"
:3
|2,0,1706639126,,"3"
:W
|2,0,1706636510,,"W"
:vsplit /Users/joshp/Projects/ComputerArchitecture/lecture-4/test.c
|2,0,1706636164,,"vsplit /Users/joshp/Projects/ComputerArchitecture/lecture-4/test.c"
:a;
|2,0,1706291479,,"a;"
:help 'fscanf'
|2,0,1706290881,,"help 'fscanf'"
:source ~.vimr
|2,0,1706289888,,"source ~.vimr"
:syntax on
|2,0,1706289390,,"syntax on"
:syntax off
|2,0,1706289387,,"syntax off"
:tabnext
|2,0,1706239420,,"tabnext"
::w
|2,0,1706239282,,":w"
:Lw
|2,0,1706238903,,"Lw"
:autocmd User CocStatusChange,CocDiagnosticChange call lightline#update()
|2,0,1706238428,,"autocmd User CocStatusChange,CocDiagnosticChange call lightline#update()"
:h coc-status
|2,0,1706238374,,"h coc-status"
:verbose imap <tab>
|2,0,1706238215,,"verbose imap <tab>"
:verbose imap tab
|2,0,1706238201,,"verbose imap tab"
:S
|2,0,1706237438,,"S"
:m
|2,0,1706237191,,"m"
:hsplit terminal
|2,0,1706158089,,"hsplit terminal"
:!sh hello.out
|2,0,1706158081,,"!sh hello.out"
:~./hello.out
|2,0,1706158069,,"~./hello.out"
:!Make
|2,0,1706158060,,"!Make"
:vs Makefile
|2,0,1706157956,,"vs Makefile"
:!ls
|2,0,1706157946,,"!ls"
:gcc
|2,0,1706157932,,"gcc"
:!vim ~/.vimrc
|2,0,1706143470,,"!vim ~/.vimrc"
:verbose imap <CR>
|2,0,1706142928,,"verbose imap <CR>"
:!vim --version
|2,0,1706142872,,"!vim --version"
:CocInstall coc-json coc-jedi
|2,0,1706142226,,"CocInstall coc-json coc-jedi"
:CocInstall coc-rust-analyzer coc-pylsp coc-clangd coc-clang-format-style-options
|2,0,1706142180,,"CocInstall coc-rust-analyzer coc-pylsp coc-clangd coc-clang-format-style-options"
:verbose imap <Tab>
|2,0,1706141981,,"verbose imap <Tab>"
:scriptnames
|2,0,1706141872,,"scriptnames"
:vsplit .vimrc
|2,0,1706141589,,"vsplit .vimrc"
:CocInstall
|2,0,1706141326,,"CocInstall "
:vsplit Projects/a2zsoftware/src/App.js
|2,0,1706140822,,"vsplit Projects/a2zsoftware/src/App.js"
:!la
|2,0,1706140796,,"!la"
:!cd Projects/a2zsoftware/
|2,0,1706140792,,"!cd Projects/a2zsoftware/"
:!cd a2zsoftware
|2,0,1706140782,,"!cd a2zsoftware"
:!cd Projects/
|2,0,1706140774,,"!cd Projects/"
:vsplit ~/Projects/a2zsoftware:cd
|2,0,1706140764,,"vsplit ~/Projects/a2zsoftware:cd"
:vs
|2,0,1706140729,,"vs"
:CocList
|2,0,1706128885,,"CocList"
:CocInstall coc-java
|2,0,1706128838,,"CocInstall coc-java"
:q!:CocInstall coc-java
|2,0,1706128838,,"q!:CocInstall coc-java"
:CocInfo
|2,0,1706128793,,"CocInfo"
:tsser
|2,0,1706128785,,"tsser"
:CocInstall coc-tsserver
|2,0,1706128777,,"CocInstall coc-tsserver"
:CocInstall coc-js
|2,0,1706128728,,"CocInstall coc-js"
:CocInstall coc-vimlsp
|2,0,1706128655,,"CocInstall coc-vimlsp"
:CocInstall coc-json coc-tsserver
|2,0,1706128617,,"CocInstall coc-json coc-tsserver"
:CocInstall coc-clangd
|2,0,1706128607,,"CocInstall coc-clangd"
:~/.vim/plugged/coc.nvim
|2,0,1706128403,,"~/.vim/plugged/coc.nvim"
::CocInstall coc-json coc-tsserver
|2,0,1706128358,,":CocInstall coc-json coc-tsserver"
:PlugIn
|2,0,1706128335,,"PlugIn"
::CocInstall coc-clangd
|2,0,1706128281,,":CocInstall coc-clangd"
:PlugStatus
|2,0,1706128226,,"PlugStatus"
:CocInstall coc-clangd
|2,0,1706119364,,"CocInstall coc-clangd
"
:CocEnable
|2,0,1706119275,,"CocEnable"
:!npm ci
|2,0,1706119267,,"!npm ci"
:exit
|2,0,1706046239,,"exit"
:split
|2,0,1706046150,,"split"
:colorscheme wombat
|2,0,1706045590,,"colorscheme wombat"
:colorscheme molokai_dark
|2,0,1706045580,,"colorscheme molokai_dark"
:NERDTreeToggle
|2,0,1706045488,,"NERDTreeToggle"
:{
|2,0,1706045229,,"{"
:NERDTree
|2,0,1706044952,,"NERDTree"
:NERDTRee
|2,0,1706044943,,"NERDTRee"
:help devicons
|2,0,1706044785,,"help devicons"
:helpdevicons
|2,0,1706044780,,"helpdevicons"
:exiut
|2,0,1706044735,,"exiut"
:quit
|2,0,1706044450,,"quit"
:termina
|2,0,1706044309,,"termina"
:help folding
|2,0,1706043782,,"help folding"
# Search String History (newest to oldest):
?/nerdtree
|2,1,1707621168,47,"nerdtree"
? @$
|2,1,1707379732,,"@$"
? \<matrixDeterminant\>
|2,1,1707327499,,"\\<matrixDeterminant\\>"
?/name
|2,1,1707327418,47,"name"
? searchNum
|2,1,1707296039,,"searchNum"
?/nvim
|2,1,1707290566,47,"nvim"
?/postorder
|2,1,1707282077,47,"postorder"
? \<postorder\>
|2,1,1707282073,,"\\<postorder\\>"
?/print2d
|2,1,1707279443,47,"print2d"
?/duplicate
|2,1,1707278584,47,"duplicate"
?/absent
|2,1,1707278401,47,"absent"
? \<nnoremap\>
|2,1,1707273578,,"\\<nnoremap\\>"
?/clip
|2,1,1707272539,47,"clip"
?/c
|2,1,1707272534,47,"c"
?/fix
|2,1,1707243962,47,"fix"
?/let
|2,1,1707243940,47,"let"
?/'c'
|2,1,1707243919,47,"'c'"
? ){
|2,1,1707241173,,"){"
?/Buf*
|2,1,1707200491,47,"Buf*"
?/buf
|2,1,1707200483,47,"buf"
?/version
|2,1,1707200404,47,"version"
?/commit
|2,1,1707199968,47,"commit"
?/set.*=
|2,1,1707198982,47,"set.*="
?/jump
|2,1,1707198825,47,"jump"
?/.
|2,1,1707198515,47,"."
?/push
|2,1,1707198398,47,"push"
?/pis
|2,1,1707198338,47,"pis"
? \<284\>
|2,1,1707197790,,"\\<284\\>"
? binarySearchTree
|2,1,1707197335,,"binarySearchTree"
?/m
|2,1,1707197329,47,"m"
? binarySearchTree.out
|2,1,1707197309,,"binarySearchTree.out"
?/lsp
|2,1,1707197051,47,"lsp"
?/crago
|2,1,1707167213,47,"crago"
?/x
|2,1,1707007653,47,"x"
?/m,
|2,1,1707007634,47,"m,"
?//
|2,1,1707007484,47,"/"
? \*
|2,1,1707006526,,"\\*"
? numRows
|2,1,1707004335,,"numRows"
? matrixExponentiation
|2,1,1707002351,,"matrixExponentiation"
?/empty
|2,1,1706984504,47,"empty"
? Node
|2,1,1706897965,,"Node"
?/fclose
|2,1,1706895775,47,"fclose"
?/
|2,1,1706894855,47," "
? second.out
|2,1,1706894128,,"second.out"
? orderedLinkedList
|2,1,1706894110,,"orderedLinkedList"
?/yes
|2,1,1706645728,47,"yes"
?/no
|2,1,1706645391,47,"no"
?/what
|2,1,1706643578,47,"what"
?/worked
|2,1,1706643538,47,"worked"
?/k
|2,1,1706291315,47,"k"
?/plug
|2,1,1706289562,47,"plug"
?/plgu
|2,1,1706289560,47,"plgu"
?/set
|2,1,1706238440,47,"set"
?/statusline
|2,1,1706238354,47,"statusline"
?/encoding
|2,1,1706238097,47,"encoding"
?/supertab
|2,1,1706238061,47,"supertab"
?/map
|2,1,1706238050,47,"map"
?/amp
|2,1,1706142723,47,"amp"
?/remap
|2,1,1706142718,47,"remap"
?/Su
|2,1,1706141891,47,"Su"
?/supertab;..;;;
|2,1,1706141888,47,"supertab;..;;;"
?/vim
|2,1,1706043335,47,"vim"
?/minAsset
|2,1,1704049503,47,"minAsset"
?/min
|2,1,1704049495,47,"min"
# Expression History (newest to oldest):
# Input Line History (newest to oldest):
@init.lua
|2,3,1707379740,,"init.lua"
@/Users/joshp/Projects/ComputerArchitecture/pa1/fifth/k
|2,3,1707328279,,"/Users/joshp/Projects/ComputerArchitecture/pa1/fifth/k"
@y
|2,3,1707197615,,"y"
@/Users/joshp/Projects/ComputerArchitecture/pa1/third
|2,3,1707006805,,"/Users/joshp/Projects/ComputerArchitecture/pa1/third"
# Debug Line History (newest to oldest):
# Registers:
"0 LINE 0
|3,0,0,1,1,0,1707379740,""
""1 LINE 0
"folke/lsp-colors.nvim",
|3,1,1,1,1,0,1707758335," \"folke/lsp-colors.nvim\","
"2 LINE 0
"folke/lsp-trouble",
|3,0,2,1,1,0,1707758309," \"folke/lsp-trouble\","
"3 LINE 0
"folke/lsp-trouble",
|3,0,3,1,1,0,1707758308," \"folke/lsp-trouble\","
"4 LINE 0
"folke/which-key.nvim",
|3,0,4,1,1,0,1707758292," \"folke/which-key.nvim\","
"5 LINE 0
mode = "n", -- mode to trigger which-key
window = { border = "single" }, -- set a border, see `|help nvim_open_win|`
layout = {
height = { min = 4, max = 25 }, -- min and max height of the columns
width = { min = 20, max = 50 }, -- min and max width of the columns
spacing = 3, -- spacing between columns
},
triggers = "auto", -- automatically setup triggers
triggers_blacklist = {
-- list of mode / prefixes that should never be hooked by WhichKey
-- this is mostly relevant for key maps that start with a native binding
-- most people should not need to change this
i = { "j", "k" },
v = { "j", "k" },
},
|3,0,5,1,15,0,1707758284," mode = \"n\", -- mode to trigger which-key"," window = { border = \"single\" }, -- set a border, see `|help nvim_open_win|`"," layout = {"," height = { min = 4, max = 25 }, -- min and max height of the columns"," width = { min = 20, max = 50 }, -- min and max width of the columns"," spacing = 3, -- spacing between columns"," },"," triggers = \"auto\", -- automatically setup triggers"," triggers_blacklist = {",>70
|<" -- list of mode / prefixes that should never be hooked by WhichKey"," -- this is mostly relevant for key maps that start with a native binding"," -- most people should not need to change this"," i = { \"j\", \"k\" },"," v = { \"j\", \"k\" },"," },"
"6 LINE 0
mode = "n", -- mode to trigger which-key
window = { border = "single" }, -- set a border, see `|help nvim_open_win|`
layout = {
height = { min = 4, max = 25 }, -- min and max height of the columns
width = { min = 20, max = 50 }, -- min and max width of the columns
spacing = 3, -- spacing between columns
},
triggers = "auto", -- automatically setup triggers
triggers_blacklist = {
-- list of mode / prefixes that should never be hooked by WhichKey
-- this is mostly relevant for key maps that start with a native binding
-- most people should not need to change this
i = { "j", "k" },
v = { "j", "k" },
|3,0,6,1,14,0,1707758282," mode = \"n\", -- mode to trigger which-key"," window = { border = \"single\" }, -- set a border, see `|help nvim_open_win|`"," layout = {"," height = { min = 4, max = 25 }, -- min and max height of the columns"," width = { min = 20, max = 50 }, -- min and max width of the columns"," spacing = 3, -- spacing between columns"," },"," triggers = \"auto\", -- automatically setup triggers"," triggers_blacklist = {",>70
|<" -- list of mode / prefixes that should never be hooked by WhichKey"," -- this is mostly relevant for key maps that start with a native binding"," -- most people should not need to change this"," i = { \"j\", \"k\" },"," v = { \"j\", \"k\" },"
"7 LINE 0
fund
|3,0,7,1,1,0,1707671806," fund"
"8 LINE 0
},
|3,0,8,1,1,0,1707671801," },"
"9 LINE 0
{
"folke/noice.nvim",
event = "VeryLazy",
dependencies = {
-- if you lazy-load any plugin below, make sure to add proper `module="..."` entries
"MunifTanjim/nui.nvim",
-- OPTIONAL:
-- `nvim-notify` is only needed, if you want to use the notification view.
-- If not available, we use `mini` as the fallback
"rcarriga/nvim-notify",
},
|3,0,9,1,11,0,1707671800," {"," \"folke/noice.nvim\","," event = \"VeryLazy\","," dependencies = {"," -- if you lazy-load any plugin below, make sure to add proper `module=\"...\"` entries"," \"MunifTanjim/nui.nvim\","," -- OPTIONAL:"," -- `nvim-notify` is only needed, if you want to use the notification view."," -- If not available, we use `mini` as the fallback"," \"rcarriga/nvim-notify\","," },"
"v CHAR 0
y
|3,0,31,0,1,0,1707328307,"y"
"- CHAR 0
j
|3,0,36,0,1,0,1707758241,"j"
# File marks:
'0 1 12 ~/.config/nvim/.git/MERGE_MSG
|4,48,1,12,1707945903,"~/.config/nvim/.git/MERGE_MSG"
'1 14 2 ~/.config/nvim/init.lua
|4,49,14,2,1707862893,"~/.config/nvim/init.lua"
'2 11 50 ~/.config/nvim/lua/vim-remaps.lua
|4,50,11,50,1707759629,"~/.config/nvim/lua/vim-remaps.lua"
'3 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,51,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
'4 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,52,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
'5 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,53,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
'6 1 0 ~/.config/nvim/init.lua
|4,54,1,0,1707758357,"~/.config/nvim/init.lua"
'7 1 0 ~/.config/nvim/init.lua
|4,55,1,0,1707758357,"~/.config/nvim/init.lua"
'8 17 0 ~/.config/nvim/init.lua
|4,56,17,0,1707758354,"~/.config/nvim/init.lua"
'9 17 0 ~/.config/nvim/init.lua
|4,57,17,0,1707758354,"~/.config/nvim/init.lua"
# Jumplist (newest first):
-' 1 12 ~/.config/nvim/.git/MERGE_MSG
|4,39,1,12,1707945903,"~/.config/nvim/.git/MERGE_MSG"
-' 14 2 ~/.config/nvim/init.lua
|4,39,14,2,1707862893,"~/.config/nvim/init.lua"
-' 14 2 ~/.config/nvim/init.lua
|4,39,14,2,1707862893,"~/.config/nvim/init.lua"
-' 15 0 ~/.config/nvim/init.lua
|4,39,15,0,1707862891,"~/.config/nvim/init.lua"
-' 15 0 ~/.config/nvim/init.lua
|4,39,15,0,1707862891,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707862887,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707862887,"~/.config/nvim/init.lua"
-' 11 50 ~/.config/nvim/lua/vim-remaps.lua
|4,39,11,50,1707759629,"~/.config/nvim/lua/vim-remaps.lua"
-' 11 50 ~/.config/nvim/lua/vim-remaps.lua
|4,39,11,50,1707759629,"~/.config/nvim/lua/vim-remaps.lua"
-' 11 50 ~/.config/nvim/lua/vim-remaps.lua
|4,39,11,50,1707759629,"~/.config/nvim/lua/vim-remaps.lua"
-' 11 50 ~/.config/nvim/lua/vim-remaps.lua
|4,39,11,50,1707759629,"~/.config/nvim/lua/vim-remaps.lua"
-' 1 0 ~/.config/nvim/lua/vim-remaps.lua
|4,39,1,0,1707759606,"~/.config/nvim/lua/vim-remaps.lua"
-' 1 0 ~/.config/nvim/lua/vim-remaps.lua
|4,39,1,0,1707759606,"~/.config/nvim/lua/vim-remaps.lua"
-' 1 0 ~/.config/nvim/lua/vim-remaps.lua
|4,39,1,0,1707759606,"~/.config/nvim/lua/vim-remaps.lua"
-' 1 0 ~/.config/nvim/lua/vim-remaps.lua
|4,39,1,0,1707759606,"~/.config/nvim/lua/vim-remaps.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759597,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 10 22 ~/.config/nvim/lua/vim-undo.lua
|4,39,10,22,1707759570,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/lua/vim-undo.lua
|4,39,1,0,1707759561,"~/.config/nvim/lua/vim-undo.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 1 0 ~/.config/nvim/init.lua
|4,39,1,0,1707758357,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 17 0 ~/.config/nvim/init.lua
|4,39,17,0,1707758354,"~/.config/nvim/init.lua"
-' 18 0 ~/.config/nvim/init.lua
|4,39,18,0,1707758308,"~/.config/nvim/init.lua"
-' 18 0 ~/.config/nvim/init.lua
|4,39,18,0,1707758308,"~/.config/nvim/init.lua"
-' 18 0 ~/.config/nvim/init.lua
|4,39,18,0,1707758308,"~/.config/nvim/init.lua"
# History of marks within files (newest to oldest):
> ~/.config/nvim/.git/MERGE_MSG
* 1707945902 0
" 1 12
> ~/.config/nvim/init.lua
* 1707862893 0
" 14 2
^ 14 3
. 14 2
+ 1 60
+ 12 28
+ 13 0
+ 23 35
+ 22 0
+ 13 0
+ 14 0
+ 18 19
+ 22 0
+ 18 1
+ 19 11
+ 18 19
+ 21 0
+ 20 0
+ 17 0
+ 18 0
+ 15 0
+ 14 2
> ~/.config/nvim/lua/vim-remaps.lua
* 1707759627 0
" 11 50
^ 11 51
. 11 50
+ 10 32
+ 11 50
> ~/.config/nvim/lua/vim-undo.lua
* 1707759583 0
" 1 0
^ 10 23
. 10 22
+ 10 22
> ~/.config/nvim/lua/plugins.lua
* 1707671806 0
" 31 1
. 31 0
+ 109 0
+ 111 1
+ 111 0
+ 109 0
+ 111 0
+ 110 0
+ 53 0
+ 34 0
+ 31 0
> ~/.config/nvim/lua/plugins/plugins.lua
* 1707621180 0
" 1 0
. 74 0
+ 74 0
> ~/.config/nvim/lua/joshp/lazy.lua
* 1707611015 0
" 18 23
. 18 23
+ 19 0
+ 16 0
+ 18 23
> ~/.config/nvim/lua/joshp/laz
* 1707611002 0
" 1 0
> ~/.config/nvim/lua/joshp/lua/plugins/init.lua
* 1707610843 0
" 149 0
^ 149 1
. 149 0
+ 149 0
> ~/.config/nvim/lua/joshp/plugins/init.lua
* 1707610349 0
" 149 0
^ 149 1
. 149 0
+ 149 0
> ~/.config/nvim/lua/joshp/init.lua
* 1707608682 0
" 14 0
^ 3 19
. 15 0
+ 1 13
+ 3 18
+ 15 0
> ~/.config/nvim/lua/joshp/packer.lua
* 1707591572 0
" 19 0
. 19 0
+ 19 0
> ~/Projects/ComputerArchitecture/pa1/fifth/uninstall_macos.sh
* 1707430602 0
" 1 34
> ~/Projects/ComputerArchitecture/pa1/fifth/__Tagbar__.1
* 1707430594 0
" 1 0
. 4 0
+ 9 0
+ 8 0
+ 4 0
> ~/.config/nvim/after/plugin/illuminate.lua
* 1707430273 0
" 55 1
^ 55 2
. 55 1
+ 1 24
+ 55 1
> ~/.zshrc
* 1707409082 0
" 11 16
^ 8 43
. 8 42
+ 5 17
+ 5 0
+ 9 0
+ 7 0
+ 9 0
+ 8 42
> ~/.vimrc
* 1707382046 0
" 88 6
^ 87 20
. 87 0
+ 99 0
+ 118 0
+ 110 0
+ 118 0
+ 112 0
+ 113 0
+ 114 0
+ 97 0
+ 55 0
+ 90 8
+ 97 0
+ 91 0
+ 91 18
+ 90 22
+ 51 0
+ 59 0
+ 221 0
+ 221 32
+ 221 22
+ 221 3
+ 221 2
+ 221 0
+ 54 0
+ 92 32
+ 1 0
+ 209 18
+ 212 24
+ 209 0
+ 54 24
+ 55 0
+ 51 0
+ 50 0
+ 51 0
+ 54 0
+ 52 0
+ 51 0
+ 53 0
+ 58 21
+ 180 22
+ 230 0
+ 209 18
+ 212 27
+ 212 0
+ 180 22
+ 97 11
+ 202 0
+ 87 0
+ 87 23
+ 87 0
+ 87 25
+ 87 0
+ 87 25
+ 88 0
+ 87 0
+ 88 0
+ 87 0
+ 87 24
+ 209 0
+ 41 0
+ 87 2
+ 87 0
+ 97 23
+ 97 0
+ 97 16
+ 97 21
+ 87 0
+ 92 0
+ 87 16
+ 84 2
+ 80 0
+ 78 0
+ 80 10
+ 77 0
+ 97 9
+ 99 5
+ 97 19
+ 97 0
+ 99 0
+ 97 0
+ 208 21
+ 209 15
+ 209 0
+ 203 0
+ 221 0
+ 226 6
+ 230 0
+ 95 69
+ 93 0
+ 209 0
+ 57 23
+ 58 0
+ 76 0
+ 94 37
+ 223 0
+ 90 18
+ 94 18
+ 87 18
+ 88 18
+ 93 18
+ 87 0
j 184 0
u 34 16
z 1 0
> ~/.config/nvim/NERD_tree_1
* 1707379773 0
" 1 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fifth/fifth.c
* 1707373963 0
" 39 0
^ 72 62
. 72 48
+ 62 53
+ 66 1
+ 71 2
+ 71 0
+ 71 2
+ 71 3
+ 71 0
+ 67 5
+ 73 15
+ 74 1
+ 75 0
+ 79 0
+ 75 5
+ 68 18
+ 71 4
+ 78 0
+ 62 0
+ 71 2
+ 63 1
+ 63 0
+ 62 0
+ 66 0
+ 64 0
+ 66 0
+ 62 33
+ 64 30
+ 63 29
+ 68 31
+ 76 22
+ 77 0
+ 44 0
+ 80 0
+ 4 31
+ 42 208
+ 42 209
+ 5 12
+ 42 224
+ 42 225
+ 42 224
+ 42 251
+ 42 224
+ 42 251
+ 42 250
+ 42 211
+ 42 208
+ 6 1
+ 9 0
+ 42 216
+ 42 272
+ 42 208
+ 42 211
+ 42 208
+ 42 214
+ 42 208
+ 42 214
+ 42 208
+ 41 0
+ 42 1
+ 41 0
+ 42 0
+ 43 0
+ 42 0
+ 41 0
+ 11 44
+ 12 46
+ 13 2
+ 13 63
+ 14 51
+ 41 18
+ 41 14
+ 41 0
+ 15 18
+ 16 22
+ 41 18
+ 41 22
+ 41 0
+ 17 2
+ 18 14
+ 19 64
+ 20 2
+ 23 2
+ 33 2
+ 36 2
+ 39 18
+ 39 13
+ 41 0
+ 29 0
+ 23 0
+ 29 0
+ 23 0
+ 29 0
+ 4 22
+ 8 0
+ 7 20
+ 72 9
+ 36 35
+ 4 40
+ 34 55
+ 72 48
> ~/Projects/ComputerArchitecture/pa1/fifth/fifth.
* 1707373096 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/fifth/NERD_tree_1
* 1707336296 0
" 4 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fifth/file1.txt
* 1707328575 0
" 1 0
^ 1 1
. 1 0
+ 11 4
+ 11 0
+ 1 0
+ 11 0
+ 3 17
+ 4 17
+ 5 17
+ 6 17
+ 7 1
+ 7 17
+ 8 17
+ 9 0
+ 11 0
+ 10 0
+ 10 1
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/third/third.c
* 1707328346 0
" 31 0
. 11 0
+ 48 26
+ 93 1
+ 48 0
+ 52 7
+ 57 0
+ 53 8
+ 56 0
+ 52 36
+ 53 37
+ 55 0
+ 93 1
+ 56 0
+ 52 0
+ 50 0
+ 93 1
+ 55 28
+ 54 46
+ 59 35
+ 93 1
+ 60 10
+ 59 36
+ 60 14
+ 56 0
+ 60 0
+ 61 0
+ 62 0
+ 63 0
+ 63 2
+ 93 0
+ 93 1
+ 58 0
+ 61 0
+ 63 0
+ 62 8
+ 63 25
+ 93 1
+ 93 17
+ 63 8
+ 62 7
+ 63 23
+ 93 1
+ 93 15
+ 63 16
+ 62 0
+ 63 17
+ 5 38
+ 12 0
+ 10 1
+ 5 45
+ 46 0
+ 47 21
+ 93 21
+ 59 24
+ 46 8
+ 93 30
+ 93 40
+ 93 1
+ 100 11
+ 104 0
+ 109 0
+ 104 0
+ 105 12
+ 111 12
+ 95 0
+ 94 0
+ 93 0
+ 63 3
+ 16 0
+ 17 65
+ 1 0
+ 17 0
+ 17 13
+ 17 0
+ 63 51
+ 72 0
+ 63 90
+ 70 0
+ 63 128
+ 69 0
+ 68 20
+ 63 123
+ 63 47
+ 71 15
+ 72 0
+ 73 6
+ 92 0
+ 94 0
+ 91 34
+ 92 0
+ 71 0
+ 63 2
+ 63 33
+ 63 52
+ 63 0
+ 63 2
+ 63 33
+ 63 52
+ 63 0
+ 11 0
> ~/Projects/ComputerArchitecture/pa1/fifth/undotree_2
* 1707328243 0
" 6 1
. 3 0
+ 50 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/fifth/diffpanel_3
* 1707328243 0
" 1 0
. 8 0
+ 14 0
+ 8 0
> ~/Projects/ComputerArchitecture/pa1/__Tagbar__.1
* 1707328189 0
" 1 0
. 11 0
+ 40 0
+ 11 0
> ~/Projects/ComputerArchitecture/pa1/fifth/terminal
* 1707328092 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/NERD_tree_1
* 1707327547 0
" 7 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fifth/Makefile
* 1707327545 0
" 4 66
^ 4 67
. 4 66
+ 1 0
+ 7 13
+ 4 66
> ~/Projects/ComputerArchitecture/pa1/-MINIMAP-
* 1707296404 0
" 1 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/undotree_2
* 1707296401 0
" 3 1
. 3 0
+ 2288 0
+ 2286 0
+ 2285 0
+ 1779 0
+ 1273 0
+ 674 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/diffpanel_3
* 1707296395 0
" 1 0
. 6 0
+ 12 0
+ 8 0
+ 6 0
> ~/Projects/ComputerArchitecture/pa1/fourth/fourth.c
* 1707296285 0
" 15 5
^ 1 6
. 1 0
+ 49 13
+ 49 19
+ 89 11
+ 86 41
+ 49 15
+ 49 14
+ 58 0
+ 49 3
+ 4 16
+ 4 0
+ 4 16
+ 60 0
+ 58 0
+ 59 0
+ 58 0
+ 49 0
+ 58 2
+ 58 0
+ 49 2
+ 58 0
+ 82 11
+ 80 0
+ 49 9
+ 80 0
+ 79 0
+ 49 9
+ 49 0
+ 49 27
+ 49 0
+ 49 24
+ 49 0
+ 49 9
+ 49 33
+ 49 0
+ 49 1
+ 49 0
+ 81 28
+ 84 28
+ 49 47
+ 57 38
+ 59 35
+ 51 16
+ 49 25
+ 49 0
+ 50 14
+ 52 0
+ 49 29
+ 49 0
+ 49 8
+ 49 0
+ 54 32
+ 53 27
+ 55 0
+ 49 26
+ 81 28
+ 84 28
+ 6 0
+ 51 17
+ 84 27
+ 85 0
+ 84 27
+ 49 3
+ 52 0
+ 55 0
+ 89 0
+ 90 0
+ 49 27
+ 4 0
+ 89 0
+ 49 0
+ 25 0
+ 28 0
+ 25 0
+ 27 0
+ 20 13
+ 24 10
+ 25 10
+ 89 9
+ 90 0
+ 89 1
+ 49 0
+ 27 0
+ 27 6
+ 27 0
+ 49 0
+ 31 0
+ 20 0
+ 79 23
+ 36 0
+ 43 8
+ 43 6
+ 43 0
+ 40 29
+ 40 27
+ 79 0
+ 20 0
+ 19 0
+ 89 0
+ 14 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fourth/__Tagbar__.1
* 1707296278 0
" 44 4
. 47 0
+ 51 0
+ 47 0
> ~/Projects/ComputerArchitecture/pa1/fourth/NERD_tree_1
* 1707296231 0
" 5 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fourth/ALEPreviewWindow
* 1707296187 0
" 4 18
. 2 0
+ 2 0
> ~/Projects/ComputerArchitecture/pa1/fourth/test1.txt
* 1707295957 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/fourth/-MINIMAP-
* 1707295919 0
" 1 0
. 1 0
+ 1 0
> ~/__Tagbar__.1
* 1707295851 0
" 1 0
. 11 0
+ 11 0
> ~/nvim/lua/joshp/init.lua
* 1707293069 0
" 1 0
^ 1 25
. 1 24
+ 1 24
> ~/nvim/init.lua
* 1707292932 0
" 1 0
^ 1 19
. 1 0
+ 1 0
+ 1 21
+ 1 44
+ 1 0
+ 1 13
+ 1 0
> ~/nvim/NERD_tree_1
* 1707292753 0
" 1 0
. 1 0
+ 1 0
> /usr/share/vim/vim90/doc/options.txt
* 1707290570 0
" 6683 14
> ~/Projects/ComputerArchitecture/pa1/fourth/test5.txt
* 1707290100 0
" 2 0
> ~/Projects/ComputerArchitecture/pa1/fourth/test2.txt
* 1707290098 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/fourth/test4.txt
* 1707290057 0
" 2 0
> ~/Projects/ComputerArchitecture/pa1/fourth/undotree_2
* 1707290010 0
" 3 1
. 3 0
+ 2146 0
+ 2145 0
+ 2127 0
+ 2125 0
+ 2108 0
+ 2090 0
+ 2084 0
+ 2078 0
+ 2079 0
+ 2078 0
+ 2018 0
+ 2024 0
+ 2018 0
+ 1531 0
+ 1022 0
+ 513 0
+ 4 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/fourth/diffpanel_3
* 1707290010 0
" 1 0
. 2 0
+ 46 0
+ 44 0
+ 42 0
+ 33 0
+ 26 0
+ 7 0
+ 5 0
+ 3 0
+ 2 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/fifth/Makefile
* 1707281291 0
" 7 13
. 7 13
+ 1 0
+ 4 67
+ 7 13
> fugitive:///Users/joshp/Projects/ComputerArchitecture/pa1/.git//4bc68fbfaf8ab95dceba0606208c6b09e90cbacb
* 1707279863 0
" 29 0
. 1 0
+ 1 0
> fugitive:///Users/joshp/Projects/ComputerArchitecture/pa1/.git//697d3efed3e8db10845a2a56fa19b67c2b6f51e8
* 1707278523 0
" 1 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fourth/file1.txt
* 1707277932 0
" 1 0
^ 6 3
. 6 2
+ 7 0
+ 1 0
+ 6 2
> ~/Projects/ComputerArchitecture/pa1/file1
* 1707277634 0
" 1 0
> ~/.vim/plugged/ale/doc/ale.txt
* 1707244027 0
" 400 0
> /Library/Developer/CommandLineTools/SDKs/MacOSX14.2.sdk/usr/include/malloc/_malloc.h
* 1707243828 0
" 45 7
> ~/Projects/ComputerArchitecture/pa1/first/file1.txt
* 1707243364 0
" 1 0
. 3 0
+ 8 0
+ 3 0
+ 5 0
+ 8 0
+ 4 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/second/second.c
* 1707241817 0
" 104 0
^ 17 2
. 18 0
+ 36 0
+ 33 0
+ 35 0
+ 34 0
+ 35 0
+ 48 27
+ 49 0
+ 48 1
+ 48 0
+ 37 0
+ 37 33
+ 37 34
+ 43 0
+ 41 0
+ 37 47
+ 41 25
+ 41 0
+ 38 19
+ 39 11
+ 40 0
+ 41 49
+ 37 39
+ 41 55
+ 43 0
+ 43 14
+ 43 19
+ 5 18
+ 7 14
+ 7 0
+ 8 7
+ 34 0
+ 10 0
+ 11 0
+ 17 0
+ 18 0
+ 19 0
+ 20 0
+ 37 0
+ 38 0
+ 39 0
+ 48 0
+ 18 30
+ 4 43
+ 10 0
+ 11 0
+ 9 0
+ 43 1
+ 43 19
+ 43 9
+ 43 0
+ 43 1
+ 43 24
+ 43 11
+ 43 0
+ 65 0
+ 43 11
+ 43 0
+ 42 21
+ 43 13
+ 43 8
+ 43 0
+ 43 1
+ 43 17
+ 43 0
+ 43 56
+ 43 0
+ 43 14
+ 43 19
+ 46 0
+ 43 28
+ 44 1
+ 43 0
+ 43 20
+ 43 30
+ 73 14
+ 72 14
+ 73 0
+ 72 9
+ 73 0
+ 70 19
+ 71 0
+ 70 0
+ 44 20
+ 44 0
+ 44 8
+ 43 18
+ 44 0
+ 43 0
+ 43 16
+ 43 18
+ 43 14
+ 43 18
+ 11 28
+ 26 0
+ 25 1
+ 43 0
+ 85 0
+ 106 0
+ 18 0
a 1 0
j 53 1
> ~/Projects/ComputerArchitecture/pa1/first/first.c
* 1707240263 0
" 59 0
. 4 0
+ 45 0
+ 49 68
+ 68 62
+ 72 70
+ 78 71
+ 45 35
+ 49 46
+ 57 0
+ 58 5
+ 62 0
+ 59 26
+ 60 11
+ 61 0
+ 68 35
+ 72 49
+ 78 48
+ 82 0
+ 86 0
+ 89 0
+ 94 4
+ 94 0
+ 91 26
+ 93 4
+ 92 10
+ 93 0
+ 94 0
+ 93 11
+ 93 0
+ 93 11
+ 94 0
+ 57 0
+ 61 10
+ 62 0
+ 57 0
+ 62 10
+ 93 0
+ 50 22
+ 62 19
+ 78 24
+ 93 0
+ 102 24
+ 104 4
+ 102 22
+ 103 16
+ 105 7
+ 106 16
+ 107 0
+ 93 0
+ 103 15
+ 106 14
+ 77 0
+ 78 0
+ 62 0
+ 50 0
+ 61 0
+ 93 0
+ 61 0
+ 53 0
+ 7 38
+ 12 18
+ 15 39
+ 20 33
+ 20 44
+ 30 44
+ 35 18
+ 37 46
+ 39 19
+ 41 19
+ 64 27
+ 44 83
+ 47 144
+ 51 56
+ 96 25
+ 101 35
+ 108 27
+ 66 23
+ 70 31
+ 74 106
+ 75 53
+ 113 0
+ 113 9
+ 25 0
+ 45 0
+ 26 0
+ 115 0
+ 114 21
+ 115 0
+ 25 22
+ 5 0
+ 4 0
> ~/Projects/ComputerArchitecture/pa1/third/file1.txt
* 1707201273 0
" 5 0
. 5 0
+ 5 0
> ~/Projects/ComputerArchitecture/pa1/third/undotree_2
* 1707200532 0
" 13 1
. 3 0
+ 78 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/third/diffpanel_3
* 1707200532 0
" 1 0
. 4 0
+ 4 0
> ~/.viomr
* 1707200477 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/first/undotree_2
* 1707200452 0
" 4 1
. 3 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/first/diffpanel_3
* 1707200440 0
" 1 0
. 4 0
+ 4 0
> ~/Projects/ComputerArchitecture/pa1/first/first.
* 1707200437 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/undotree_2
* 1707200389 0
" 23 1
. 23 0
+ 777 0
+ 401 0
+ 23 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/diffpanel_3
* 1707200350 0
" 1 0
. 4 0
+ 4 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/third/third.c
* 1707200238 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/third/undotree_2
* 1707200233 0
" 1 5
. 23 0
+ 24 0
+ 23 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/third/diffpanel_3
* 1707200224 0
" 1 0
. 2 0
+ 2 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/fourth/fourth.c
* 1707200216 0
" 15 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/fourth/NERD_tree_1
* 1707200216 0
" 6 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/fourth/undotree_2
* 1707200215 0
" 3 1
. 3 0
+ 5 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/fourth/diffpanel_3
* 1707200214 0
" 1 0
. 2 0
+ 2 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/fourth/fourth.viom
* 1707200183 0
" 1 0
> ~/.vim/plugged/vim-fugitive/doc/fugitive.txt
* 1707199972 0
" 461 0
> ~/Projects/ComputerArchitecture/pa1/third/NERD_tree_1
* 1707199953 0
" 7 2
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/fourth/Makefile
* 1707197365 0
" 1 0
^ 1 11
. 4 0
+ 1 0
+ 4 0
+ 1 0
+ 3 0
+ 4 0
> ~/Projects/ComputerArchitecture/pa1/fourth/binarySearchTree.c
* 1707197273 0
" 4 1
> ~/Projects/ComputerArchitecture/pa1/third/third.
* 1707197238 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/second/undotree_2
* 1707196519 0
" 3 1
. 3 0
+ 1253 0
+ 1251 0
+ 1249 0
+ 1247 0
+ 944 0
+ 641 0
+ 338 0
+ 336 0
+ 17 0
+ 3 0
+ 13 0
+ 7 0
+ 3 0
> ~/Projects/ComputerArchitecture/pa1/second/diffpanel_3
* 1707196508 0
" 1 0
. 48 0
+ 128 0
+ 124 0
+ 120 0
+ 116 0
+ 48 0
> /private/etc/hosts
* 1707093614 0
" 9 0
. 10 0
+ 10 1
+ 10 25
+ 10 0
+ 10 25
+ 10 0
> ~/Projects/ComputerArchitecture/pa1/NERD_tree_2
* 1707006706 0
" 1 0
. 1 0
+ 1 0
> ~/Projects/ComputerArchitecture/pa1/third/Makefile
* 1707003079 0
" 5 0
. 4 67
+ 1 0
+ 3 0
+ 4 0
+ 7 13
+ 4 67
> ~/Projects/ComputerArchitecture/pa1/second/second.
* 1706985176 0
" 1 0
> ~/Projects/ComputerArchitecture/pa1/first/test1.txt
* 1706937004 0
" 10 0
^ 10 0
. 9 0
+ 9 0
> ~/Projects/ComputerArchitecture/pa1/second/file2.txt
* 1706895603 0
" 10 7
^ 10 8
. 10 7
+ 10 7
> ~/Projects/ComputerArchitecture/pa1/second/file1.txt
* 1706895591 0
" 8 7
^ 8 8
. 8 7
+ 1 0
+ 8 7
> ~/Projects/ComputerArchitecture/pa1/second/Makefile
* 1706894130 0
" 3 2
^ 1 11
. 4 0
+ 4 56
+ 3 5
+ 4 0
+ 1 0
+ 4 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/first/aaa.txt
* 1706687254 0
" 6 0
. 7 0
+ 6 4
+ 7 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/first/tes1.txt
* 1706687213 0
" 6 0
. 8 0
+ 7 4
+ 8 0
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/first/tesss.txt
* 1706687190 0
" 6 0
. 7 0
+ 6 4
+ 7 0
> ~/Projects/ComputerArchitecture/PA1/first/Makefile
* 1706647765 0
" 7 13
^ 7 13
. 7 13
+ 1 9
+ 3 11
+ 4 66
+ 7 12
+ 4 67
+ 7 13
> ~/Projects/ComputerArchitecture/pa1_autograder/pa1/first/Makefile
* 1706646294 0
" 4 66
. 4 67
+ 4 67
> ~/Projects/ComputerArchitecture/PA1/ProdNums/prodNums.c
* 1706645736 0
" 83 17
^ 83 18
. 83 17
+ 36 37
+ 38 0
+ 36 33
+ 36 41
+ 87 0
+ 33 22
+ 60 1
+ 87 0
+ 1 0
+ 7 0
+ 87 0
+ 57 4
+ 38 9
+ 38 0
+ 33 36
+ 38 14
+ 38 29
+ 40 30
+ 42 35
+ 45 96
+ 47 38
+ 36 0
+ 38 0
+ 36 0
+ 31 0
+ 32 0
+ 58 15
+ 59 2
+ 58 2
+ 47 0
+ 42 23
+ 43 33
+ 42 19
+ 45 28
+ 34 17
+ 47 22
+ 49 0
+ 48 13
+ 35 0
+ 36 0
+ 37 35
+ 36 20
+ 37 16
+ 26 0
+ 39 10
+ 51 14
+ 56 0
+ 51 0
+ 52 0
+ 39 19
+ 52 22
+ 36 0
+ 37 0
+ 39 22
+ 42 28
+ 44 13
+ 45 0
+ 38 0
+ 41 27
+ 48 20
+ 47 0
+ 48 20
+ 44 21
+ 46 11
+ 60 23
+ 87 0
+ 67 0
+ 61 37
+ 62 36
+ 64 0
+ 62 27
+ 65 13
+ 63 6
+ 66 26
+ 69 128
+ 85 3
+ 86 3
+ 62 0
+ 48 18
+ 80 27
+ 81 12
+ 82 0
+ 72 9
+ 82 11
+ 83 28
+ 84 0
+ 48 0
+ 52 11
+ 55 0
+ 53 0
+ 84 0
+ 72 9
+ 72 0
+ 29 0
+ 38 0
+ 44 19
+ 69 21
+ 44 19
+ 69 21
+ 83 17
> ~/Projects/ComputerArchitecture/PA1/ProdNums/file1.txt
* 1706645722 0
" 1 0
^ 10 6
. 3 0
+ 6 3
+ 5 0
+ 8 5
+ 9 5
+ 10 5
+ 3 0
> ~/Projects/ComputerArchitecture/PA1/ProdNums/prodNums.
* 1706639467 0
" 1 0
> ~/Projects/ComputerArchitecture/lecture-4/test.c
* 1706637951 0
" 44 0
^ 42 20
. 42 19
+ 1 18
+ 1 0
+ 1 15
+ 1 8
+ 1 15
+ 1 12
+ 1 1
+ 1 0
+ 1 23
+ 1 1
+ 1 0
+ 1 1
+ 1 17
+ 1 18
+ 1 0
+ 1 28
+ 1 21
+ 1 46
+ 1 0
+ 1 46
+ 1 26
+ 1 0
+ 1 29
+ 1 33
+ 1 42
+ 1 46
+ 1 0
+ 1 26
+ 1 33
+ 1 0
+ 1 16
+ 1 41
+ 1 21
+ 1 0
+ 1 16
+ 1 0
+ 1 1
+ 1 14
+ 1 1
+ 1 0
+ 1 14
+ 1 8
+ 1 0
+ 1 1
+ 1 8
+ 1 36
+ 1 1
+ 1 0
+ 1 21
+ 1 27
+ 1 0
+ 1 23
+ 1 0
+ 1 17
+ 1 0
+ 1 24
+ 1 32
+ 1 1
+ 1 35
+ 1 2
+ 1 73
+ 1 0
+ 1 37
+ 1 11
+ 1 0
+ 1 17
+ 1 0
+ 21 0
+ 33 35
+ 42 19
> ~/Projects/ComputerArchitecture/lecture-4/file1.txt
* 1706636700 0
" 1 0
^ 1 1
. 1 0

229
vim/.vimrc Normal file
View File

@@ -0,0 +1,229 @@
"NeoBundle Scripts----------------------------- {{{
if &compatible
set nocompatible " Be iMproved
endif
" Required:
set runtimepath+=/Users/joshp/.vim/bundle/neobundle.vim/
" Required:
call neobundle#begin(expand('/Users/joshp/.vim/bundle'))
" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'
" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'tiagofumo/vim-nerdtree-syntax-highlight'
" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }
" Required:
call neobundle#end()
" Required:
filetype plugin indent on
" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
"End NeoBundle Scripts------------------------- }}}
" PLUGINS ----------------------------------------- {{{
call plug#begin('~/.vim/plugged')
Plug 'dense-analysis/ale'
Plug 'ryanoasis/vim-devicons'
Plug 'preservim/nerdtree'
Plug 'tpope/vim-fugitive'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'itchyny/lightline.vim'
Plug 'ap/vim-css-color'
Plug 'terryma/vim-smooth-scroll'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'mbbill/undotree'
Plug 'tpope/vim-surround'
Plug 'wfxr/minimap.vim'
Plug 'mhinz/vim-startify'
Plug 'github/copilot.vim'
Plug 'tpope/vim-commentary'
Plug 'morhetz/gruvbox'
Plug 'preservim/tagbar'
if has("persistent_undo")
let target_path = expand('~/.undodir')
" create the directory and any parent directories
" if the location does not exist.
if !isdirectory(target_path)
call mkdir(target_path, "p", 0700)
endif
let &undodir=target_path
set undofile
endif
call plug#end()
" }}}
" MAPPINGS --------------------------------------------------------------- {{{
" Use space as leader key
let mapleader = " "
" J and K to move lines up and down
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv
" Use jk to escape from insert mode
inoremap jk <Esc>
" leader mappings
nnoremap <leader>nt :NERDTreeToggle<cr>
nnoremap <leader>ut :UndotreeToggle<CR>
nnoremap <leader>gs :Git<CR>
nnoremap <leader>f :Files<CR>
nnoremap <leader>gf :GFiles<CR>
nnoremap <leader>m :MinimapToggle<CR>
nnoremap <leader>sr :%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>
nnoremap <leader>t :TagbarToggle<CR>
" no more Q
nnoremap Q <nop>
" Smooth scroll
noremap <silent> <c-u> :call smooth_scroll#up(&scroll, 40, 2)<CR>
noremap <silent> <c-d> :call smooth_scroll#down(&scroll, 40, 2)<CR>
noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 40, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 40, 4)<CR>
" Use tab for trigger completion with characters ahead and navigate
" NOTE: There's always complete item selected by default, you may want to enable
" no select by `"suggest.noselect": true` in your configuration file
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
" Make <CR> to accept selected completion item or notify coc.nvim to format
" <C-g>u breaks current undo, please make your own choice
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
function! CheckBackspace() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" Use <c-space> to trigger completion
if has('nvim')
inoremap <silent><expr> <c-space> coc#refresh()
else
inoremap <silent><expr> <c-@> coc#refresh()
endif
" }}}
" VIMSCRIPT -------------------------------------------------------------- {{{
" This will enable code folding.
" Use the marker method of folding.
augroup filetype_vim
autocmd!
autocmd FileType vim setlocal foldmethod=marker
augroup END
"
" If the current file type is HTML, set indentation to 2 spaces.
autocmd Filetype html setlocal tabstop=2 shiftwidth=2 expandtab
" If Vim version is equal to or greater than 7.3 enable undofile.
" This allows you to undo changes to a file even after saving it.
if version >= 703
set undodir=~/.vim/backup
set undofile
set undoreload=10000
endif
augroup cursor_off
autocmd!
autocmd WinLeave * set nocursorline nocursorcolumn
autocmd WinEnter * set cursorline cursorcolumn
augroup END
" }}}
" STATUS LINE ------------------------------------------------------------ {{{
" Clear status line when vimrc is reloaded.
set statusline=
" Status line left side.
set statusline+=\ %F\ %M\ %Y\ %R
" Use a divider to separate the left side from the right side.
set statusline+=%=
" Status line right side.
set statusline+=\ ascii:\ %b\ hex:\ 0x%B\ row:\ %l\ col:\ %c\ percent:\ %p%%
" Show the status on the second to last line.
set laststatus=2
" }}}
" SETTINGS ------------------------------------------------------- {{{
set nocompatible
filetype on
syntax on
set number
set cursorline
set cursorcolumn
set shiftwidth=2
set tabstop=2
set incsearch
set ignorecase
set smartcase
set showcmd
set showmode
set showmatch
set hlsearch
set history=1000
set wildmenu
set wildmode=list:longest
set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx
set encoding=UTF-8
set updatetime=300
set signcolumn=yes
set relativenumber
set termguicolors
set scrolloff=8
set updatetime=50
set clipboard=unnamed
colorscheme gruvbox
let g:lightline = {
\ 'colorscheme': 'gruvbox',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'cocstatus', 'readonly', 'filename', 'modified' ] ]
\ },
\ 'component_function': {
\ 'cocstatus': 'coc#status'
\ },
\ }
let g:ale_linters = {
\ 'c': ['clang' , 'gcc'],
\ 'python': ['mypy'],
\ 'javascript': ['eslint']
\ }
" }}}

21
zsh/.zprofile Normal file
View File

@@ -0,0 +1,21 @@
eval "$(/opt/homebrew/bin/brew shellenv)"
# Added by Toolbox App
export PATH="$PATH:/Users/joshp/Library/Application Support/JetBrains/Toolbox/scripts"
##
# Your previous /Users/joshp/.zprofile file was backed up as /Users/joshp/.zprofile.macports-saved_2024-01-16_at_13:27:44
##
# MacPorts Installer addition on 2024-01-16_at_13:27:44: adding an appropriate PATH variable for use with MacPorts.
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.
# MacPorts Installer addition on 2024-01-16_at_13:27:44: adding an appropriate MANPATH variable for use with MacPorts.
export MANPATH="/opt/local/share/man:$MANPATH"
# Finished adapting your MANPATH environment variable for use with MacPorts.

2
zsh/.zprofile.bak Normal file
View File

@@ -0,0 +1,2 @@
eval "$(/opt/homebrew/bin/brew shellenv)"

View File

@@ -1,8 +0,0 @@
export HISTSIZE=5000
export SAVEHIST=10000
HISTFILE=~/.cache/zsh/history
setopt EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format.
setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits.
setopt SHARE_HISTORY # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST # Expire duplicate entries first when trimming history.
setopt HIST_IGNORE_DUPS # Don't record an entry that was just recorded again.

View File

@@ -2,6 +2,16 @@ export GPG_TTY=$TTY
gpgconf --launch gpg-agent
export BAT_THEME="Enki-Tokyo-Night"
# history stuff
export HISTSIZE=5000
export SAVEHIST=10000
export HISTFILE=~/.cache/zsh/.zsh_history
setopt EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format.
setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits.
setopt SHARE_HISTORY # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST # Expire duplicate entries first when trimming history.
setopt HIST_IGNORE_DUPS # Don't record an entry that was just recorded again.
source ~/Projects/zsh-autocomplete/zsh-autocomplete.plugin.zsh
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]