├── .gitignore ├── README.md ├── autoload ├── netrw.vim ├── netrwFileHandlers.vim ├── netrwSettings.vim ├── netrw_gitignore.vim └── plug.vim ├── coc-settings.json ├── colors ├── .swp ├── default.vim ├── emacs.vim ├── pink.vim ├── railscasts.vim ├── topfunky-light.vim └── vividchalk.vim ├── doc ├── pi_netrw.txt └── tags ├── gvimrc ├── init.vim ├── package.json ├── plugin └── netrwPlugin.vim ├── snippets ├── java.snippets └── javascript.snippets ├── syntax └── netrw.vim ├── tmp └── .keep ├── vimrc └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | tmp/ 2 | bundle/ 3 | !bundle/Vundle.vim 4 | *.swp 5 | .netrwhist 6 | .init.vim-rplugin~ 7 | .-rplugin~ 8 | plugged 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Installing (step by step) 2 | 3 | Clone vimfiles repo: 4 | 5 | git clone --recursive https://github.com/derekstavis/vimfiles.git ~/.config/nvim 6 | 7 | Open NeoVim: 8 | 9 | nvim 10 | 11 | Install bundles by typing 12 | 13 | :PluginInstall 14 | 15 | Restart vim and enjoy! :) 16 | 17 | -------------------------------------------------------------------------------- /autoload/netrwFileHandlers.vim: -------------------------------------------------------------------------------- 1 | " netrwFileHandlers: contains various extension-based file handlers for 2 | " netrw's browsers' x command ("eXecute launcher") 3 | " Author: Charles E. Campbell 4 | " Date: May 03, 2013 5 | " Version: 11b ASTRO-ONLY 6 | " Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1 7 | " Permission is hereby granted to use and distribute this code, 8 | " with or without modifications, provided that this copyright 9 | " notice is copied with it. Like anything else that's free, 10 | " netrwFileHandlers.vim is provided *as is* and comes with no 11 | " warranty of any kind, either expressed or implied. In no 12 | " event will the copyright holder be liable for any damages 13 | " resulting from the use of this software. 14 | " 15 | " Rom 6:23 (WEB) For the wages of sin is death, but the free gift of God {{{1 16 | " is eternal life in Christ Jesus our Lord. 17 | 18 | " --------------------------------------------------------------------- 19 | " Load Once: {{{1 20 | if exists("g:loaded_netrwFileHandlers") || &cp 21 | finish 22 | endif 23 | let g:loaded_netrwFileHandlers= "v11b" 24 | if v:version < 702 25 | echohl WarningMsg 26 | echo "***warning*** this version of netrwFileHandlers needs vim 7.2" 27 | echohl Normal 28 | finish 29 | endif 30 | let s:keepcpo= &cpo 31 | set cpo&vim 32 | 33 | " --------------------------------------------------------------------- 34 | " netrwFileHandlers#Invoke: {{{1 35 | fun! netrwFileHandlers#Invoke(exten,fname) 36 | " call Dfunc("netrwFileHandlers#Invoke(exten<".a:exten."> fname<".a:fname.">)") 37 | let exten= a:exten 38 | " list of supported special characters. Consider rcs,v --- that can be 39 | " supported with a NFH_rcsCOMMAv() handler 40 | if exten =~ '[@:,$!=\-+%?;~]' 41 | let specials= { 42 | \ '@' : 'AT', 43 | \ ':' : 'COLON', 44 | \ ',' : 'COMMA', 45 | \ '$' : 'DOLLAR', 46 | \ '!' : 'EXCLAMATION', 47 | \ '=' : 'EQUAL', 48 | \ '-' : 'MINUS', 49 | \ '+' : 'PLUS', 50 | \ '%' : 'PERCENT', 51 | \ '?' : 'QUESTION', 52 | \ ';' : 'SEMICOLON', 53 | \ '~' : 'TILDE'} 54 | let exten= substitute(a:exten,'[@:,$!=\-+%?;~]','\=specials[submatch(0)]','ge') 55 | " call Decho('fname<'.fname.'> done with dictionary') 56 | endif 57 | 58 | if a:exten != "" && exists("*NFH_".exten) 59 | " support user NFH_*() functions 60 | " call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")') 61 | exe "let ret= NFH_".exten.'("'.a:fname.'")' 62 | elseif a:exten != "" && exists("*s:NFH_".exten) 63 | " use builtin-NFH_*() functions 64 | " call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")') 65 | exe "let ret= s:NFH_".a:exten.'("'.a:fname.'")' 66 | endif 67 | 68 | " call Dret("netrwFileHandlers#Invoke 0 : ret=".ret) 69 | return 0 70 | endfun 71 | 72 | " --------------------------------------------------------------------- 73 | " s:NFH_html: handles html when the user hits "x" when the {{{1 74 | " cursor is atop a *.html file 75 | fun! s:NFH_html(pagefile) 76 | " call Dfunc("s:NFH_html(".a:pagefile.")") 77 | 78 | let page= substitute(a:pagefile,'^','file://','') 79 | 80 | if executable("mozilla") 81 | " call Decho("executing !mozilla ".page) 82 | exe "!mozilla ".shellescape(page,1) 83 | elseif executable("netscape") 84 | " call Decho("executing !netscape ".page) 85 | exe "!netscape ".shellescape(page,1) 86 | else 87 | " call Dret("s:NFH_html 0") 88 | return 0 89 | endif 90 | 91 | " call Dret("s:NFH_html 1") 92 | return 1 93 | endfun 94 | 95 | " --------------------------------------------------------------------- 96 | " s:NFH_htm: handles html when the user hits "x" when the {{{1 97 | " cursor is atop a *.htm file 98 | fun! s:NFH_htm(pagefile) 99 | " call Dfunc("s:NFH_htm(".a:pagefile.")") 100 | 101 | let page= substitute(a:pagefile,'^','file://','') 102 | 103 | if executable("mozilla") 104 | " call Decho("executing !mozilla ".page) 105 | exe "!mozilla ".shellescape(page,1) 106 | elseif executable("netscape") 107 | " call Decho("executing !netscape ".page) 108 | exe "!netscape ".shellescape(page,1) 109 | else 110 | " call Dret("s:NFH_htm 0") 111 | return 0 112 | endif 113 | 114 | " call Dret("s:NFH_htm 1") 115 | return 1 116 | endfun 117 | 118 | " --------------------------------------------------------------------- 119 | " s:NFH_jpg: {{{1 120 | fun! s:NFH_jpg(jpgfile) 121 | " call Dfunc("s:NFH_jpg(jpgfile<".a:jpgfile.">)") 122 | 123 | if executable("gimp") 124 | exe "silent! !gimp -s ".shellescape(a:jpgfile,1) 125 | elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") 126 | " call Decho("silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".escape(a:jpgfile," []|'")) 127 | exe "!".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:jpgfile,1) 128 | else 129 | " call Dret("s:NFH_jpg 0") 130 | return 0 131 | endif 132 | 133 | " call Dret("s:NFH_jpg 1") 134 | return 1 135 | endfun 136 | 137 | " --------------------------------------------------------------------- 138 | " s:NFH_gif: {{{1 139 | fun! s:NFH_gif(giffile) 140 | " call Dfunc("s:NFH_gif(giffile<".a:giffile.">)") 141 | 142 | if executable("gimp") 143 | exe "silent! !gimp -s ".shellescape(a:giffile,1) 144 | elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") 145 | exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:giffile,1) 146 | else 147 | " call Dret("s:NFH_gif 0") 148 | return 0 149 | endif 150 | 151 | " call Dret("s:NFH_gif 1") 152 | return 1 153 | endfun 154 | 155 | " --------------------------------------------------------------------- 156 | " s:NFH_png: {{{1 157 | fun! s:NFH_png(pngfile) 158 | " call Dfunc("s:NFH_png(pngfile<".a:pngfile.">)") 159 | 160 | if executable("gimp") 161 | exe "silent! !gimp -s ".shellescape(a:pngfile,1) 162 | elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") 163 | exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pngfile,1) 164 | else 165 | " call Dret("s:NFH_png 0") 166 | return 0 167 | endif 168 | 169 | " call Dret("s:NFH_png 1") 170 | return 1 171 | endfun 172 | 173 | " --------------------------------------------------------------------- 174 | " s:NFH_pnm: {{{1 175 | fun! s:NFH_pnm(pnmfile) 176 | " call Dfunc("s:NFH_pnm(pnmfile<".a:pnmfile.">)") 177 | 178 | if executable("gimp") 179 | exe "silent! !gimp -s ".shellescape(a:pnmfile,1) 180 | elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") 181 | exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pnmfile,1) 182 | else 183 | " call Dret("s:NFH_pnm 0") 184 | return 0 185 | endif 186 | 187 | " call Dret("s:NFH_pnm 1") 188 | return 1 189 | endfun 190 | 191 | " --------------------------------------------------------------------- 192 | " s:NFH_bmp: visualize bmp files {{{1 193 | fun! s:NFH_bmp(bmpfile) 194 | " call Dfunc("s:NFH_bmp(bmpfile<".a:bmpfile.">)") 195 | 196 | if executable("gimp") 197 | exe "silent! !gimp -s ".a:bmpfile 198 | elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE") 199 | exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:bmpfile,1) 200 | else 201 | " call Dret("s:NFH_bmp 0") 202 | return 0 203 | endif 204 | 205 | " call Dret("s:NFH_bmp 1") 206 | return 1 207 | endfun 208 | 209 | " --------------------------------------------------------------------- 210 | " s:NFH_pdf: visualize pdf files {{{1 211 | fun! s:NFH_pdf(pdf) 212 | " call Dfunc("s:NFH_pdf(pdf<".a:pdf.">)") 213 | if executable("gs") 214 | exe 'silent! !gs '.shellescape(a:pdf,1) 215 | elseif executable("pdftotext") 216 | exe 'silent! pdftotext -nopgbrk '.shellescape(a:pdf,1) 217 | else 218 | " call Dret("s:NFH_pdf 0") 219 | return 0 220 | endif 221 | 222 | " call Dret("s:NFH_pdf 1") 223 | return 1 224 | endfun 225 | 226 | " --------------------------------------------------------------------- 227 | " s:NFH_doc: visualize doc files {{{1 228 | fun! s:NFH_doc(doc) 229 | " call Dfunc("s:NFH_doc(doc<".a:doc.">)") 230 | 231 | if executable("oowriter") 232 | exe 'silent! !oowriter '.shellescape(a:doc,1) 233 | redraw! 234 | else 235 | " call Dret("s:NFH_doc 0") 236 | return 0 237 | endif 238 | 239 | " call Dret("s:NFH_doc 1") 240 | return 1 241 | endfun 242 | 243 | " --------------------------------------------------------------------- 244 | " s:NFH_sxw: visualize sxw files {{{1 245 | fun! s:NFH_sxw(sxw) 246 | " call Dfunc("s:NFH_sxw(sxw<".a:sxw.">)") 247 | 248 | if executable("oowriter") 249 | exe 'silent! !oowriter '.shellescape(a:sxw,1) 250 | redraw! 251 | else 252 | " call Dret("s:NFH_sxw 0") 253 | return 0 254 | endif 255 | 256 | " call Dret("s:NFH_sxw 1") 257 | return 1 258 | endfun 259 | 260 | " --------------------------------------------------------------------- 261 | " s:NFH_xls: visualize xls files {{{1 262 | fun! s:NFH_xls(xls) 263 | " call Dfunc("s:NFH_xls(xls<".a:xls.">)") 264 | 265 | if executable("oocalc") 266 | exe 'silent! !oocalc '.shellescape(a:xls,1) 267 | redraw! 268 | else 269 | " call Dret("s:NFH_xls 0") 270 | return 0 271 | endif 272 | 273 | " call Dret("s:NFH_xls 1") 274 | return 1 275 | endfun 276 | 277 | " --------------------------------------------------------------------- 278 | " s:NFH_ps: handles PostScript files {{{1 279 | fun! s:NFH_ps(ps) 280 | " call Dfunc("s:NFH_ps(ps<".a:ps.">)") 281 | if executable("gs") 282 | " call Decho("exe silent! !gs ".a:ps) 283 | exe "silent! !gs ".shellescape(a:ps,1) 284 | redraw! 285 | elseif executable("ghostscript") 286 | " call Decho("exe silent! !ghostscript ".a:ps) 287 | exe "silent! !ghostscript ".shellescape(a:ps,1) 288 | redraw! 289 | elseif executable("gswin32") 290 | " call Decho("exe silent! !gswin32 ".shellescape(a:ps,1)) 291 | exe "silent! !gswin32 ".shellescape(a:ps,1) 292 | redraw! 293 | else 294 | " call Dret("s:NFH_ps 0") 295 | return 0 296 | endif 297 | 298 | " call Dret("s:NFH_ps 1") 299 | return 1 300 | endfun 301 | 302 | " --------------------------------------------------------------------- 303 | " s:NFH_eps: handles encapsulated PostScript files {{{1 304 | fun! s:NFH_eps(eps) 305 | " call Dfunc("s:NFH_eps()") 306 | if executable("gs") 307 | exe "silent! !gs ".shellescape(a:eps,1) 308 | redraw! 309 | elseif executable("ghostscript") 310 | exe "silent! !ghostscript ".shellescape(a:eps,1) 311 | redraw! 312 | elseif executable("ghostscript") 313 | exe "silent! !ghostscript ".shellescape(a:eps,1) 314 | redraw! 315 | elseif executable("gswin32") 316 | exe "silent! !gswin32 ".shellescape(a:eps,1) 317 | redraw! 318 | else 319 | " call Dret("s:NFH_eps 0") 320 | return 0 321 | endif 322 | " call Dret("s:NFH_eps 0") 323 | return 1 324 | endfun 325 | 326 | " --------------------------------------------------------------------- 327 | " s:NFH_fig: handles xfig files {{{1 328 | fun! s:NFH_fig(fig) 329 | " call Dfunc("s:NFH_fig()") 330 | if executable("xfig") 331 | exe "silent! !xfig ".a:fig 332 | redraw! 333 | else 334 | " call Dret("s:NFH_fig 0") 335 | return 0 336 | endif 337 | 338 | " call Dret("s:NFH_fig 1") 339 | return 1 340 | endfun 341 | 342 | " --------------------------------------------------------------------- 343 | " s:NFH_obj: handles tgif's obj files {{{1 344 | fun! s:NFH_obj(obj) 345 | " call Dfunc("s:NFH_obj()") 346 | if has("unix") && executable("tgif") 347 | exe "silent! !tgif ".a:obj 348 | redraw! 349 | else 350 | " call Dret("s:NFH_obj 0") 351 | return 0 352 | endif 353 | 354 | " call Dret("s:NFH_obj 1") 355 | return 1 356 | endfun 357 | 358 | let &cpo= s:keepcpo 359 | unlet s:keepcpo 360 | " --------------------------------------------------------------------- 361 | " Modelines: {{{1 362 | " vim: fdm=marker 363 | -------------------------------------------------------------------------------- /autoload/netrwSettings.vim: -------------------------------------------------------------------------------- 1 | " netrwSettings.vim: makes netrw settings simpler 2 | " Date: Dec 30, 2014 3 | " Maintainer: Charles E Campbell 4 | " Version: 15 5 | " Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1 6 | " Permission is hereby granted to use and distribute this code, 7 | " with or without modifications, provided that this copyright 8 | " notice is copied with it. Like anything else that's free, 9 | " netrwSettings.vim is provided *as is* and comes with no 10 | " warranty of any kind, either expressed or implied. By using 11 | " this plugin, you agree that in no event will the copyright 12 | " holder be liable for any damages resulting from the use 13 | " of this software. 14 | " 15 | " Mat 4:23 (WEB) Jesus went about in all Galilee, teaching in their {{{1 16 | " synagogues, preaching the gospel of the kingdom, and healing 17 | " every disease and every sickness among the people. 18 | " Load Once: {{{1 19 | if exists("g:loaded_netrwSettings") || &cp 20 | finish 21 | endif 22 | let g:loaded_netrwSettings = "v15" 23 | if v:version < 700 24 | echohl WarningMsg 25 | echo "***warning*** this version of netrwSettings needs vim 7.0" 26 | echohl Normal 27 | finish 28 | endif 29 | 30 | " --------------------------------------------------------------------- 31 | " NetrwSettings: {{{1 32 | fun! netrwSettings#NetrwSettings() 33 | " this call is here largely just to insure that netrw has been loaded 34 | call netrw#SavePosn() 35 | if !exists("g:loaded_netrw") 36 | echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None 37 | return 38 | endif 39 | 40 | above wincmd s 41 | enew 42 | setlocal noswapfile bh=wipe 43 | set ft=vim 44 | file Netrw\ Settings 45 | 46 | " these variables have the following default effects when they don't 47 | " exist (ie. have not been set by the user in his/her .vimrc) 48 | if !exists("g:netrw_liststyle") 49 | let g:netrw_liststyle= 0 50 | let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa" 51 | endif 52 | if !exists("g:netrw_silent") 53 | let g:netrw_silent= 0 54 | endif 55 | if !exists("g:netrw_use_nt_rcp") 56 | let g:netrw_use_nt_rcp= 0 57 | endif 58 | if !exists("g:netrw_ftp") 59 | let g:netrw_ftp= 0 60 | endif 61 | if !exists("g:netrw_ignorenetrc") 62 | let g:netrw_ignorenetrc= 0 63 | endif 64 | 65 | put ='+ ---------------------------------------------' 66 | put ='+ NetrwSettings: by Charles E. Campbell' 67 | put ='+ Press with cursor atop any line for help' 68 | put ='+ ---------------------------------------------' 69 | let s:netrw_settings_stop= line(".") 70 | 71 | put ='' 72 | put ='+ Netrw Protocol Commands' 73 | put = 'let g:netrw_dav_cmd = '.g:netrw_dav_cmd 74 | put = 'let g:netrw_fetch_cmd = '.g:netrw_fetch_cmd 75 | put = 'let g:netrw_ftp_cmd = '.g:netrw_ftp_cmd 76 | put = 'let g:netrw_http_cmd = '.g:netrw_http_cmd 77 | put = 'let g:netrw_rcp_cmd = '.g:netrw_rcp_cmd 78 | put = 'let g:netrw_rsync_cmd = '.g:netrw_rsync_cmd 79 | put = 'let g:netrw_scp_cmd = '.g:netrw_scp_cmd 80 | put = 'let g:netrw_sftp_cmd = '.g:netrw_sftp_cmd 81 | put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd 82 | let s:netrw_protocol_stop= line(".") 83 | put = '' 84 | 85 | put ='+Netrw Transfer Control' 86 | put = 'let g:netrw_cygwin = '.g:netrw_cygwin 87 | put = 'let g:netrw_ftp = '.g:netrw_ftp 88 | put = 'let g:netrw_ftpmode = '.g:netrw_ftpmode 89 | put = 'let g:netrw_ignorenetrc = '.g:netrw_ignorenetrc 90 | put = 'let g:netrw_sshport = '.g:netrw_sshport 91 | put = 'let g:netrw_silent = '.g:netrw_silent 92 | put = 'let g:netrw_use_nt_rcp = '.g:netrw_use_nt_rcp 93 | put = 'let g:netrw_win95ftp = '.g:netrw_win95ftp 94 | let s:netrw_xfer_stop= line(".") 95 | put ='' 96 | put ='+ Netrw Messages' 97 | put ='let g:netrw_use_errorwindow = '.g:netrw_use_errorwindow 98 | 99 | put = '' 100 | put ='+ Netrw Browser Control' 101 | if exists("g:netrw_altfile") 102 | put = 'let g:netrw_altfile = '.g:netrw_altfile 103 | else 104 | put = 'let g:netrw_altfile = 0' 105 | endif 106 | put = 'let g:netrw_alto = '.g:netrw_alto 107 | put = 'let g:netrw_altv = '.g:netrw_altv 108 | put = 'let g:netrw_banner = '.g:netrw_banner 109 | if exists("g:netrw_bannerbackslash") 110 | put = 'let g:netrw_bannerbackslash = '.g:netrw_bannerbackslash 111 | else 112 | put = '\" let g:netrw_bannerbackslash = (not defined)' 113 | endif 114 | put = 'let g:netrw_browse_split = '.g:netrw_browse_split 115 | if exists("g:netrw_browsex_viewer") 116 | put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer 117 | else 118 | put = '\" let g:netrw_browsex_viewer = (not defined)' 119 | endif 120 | put = 'let g:netrw_compress = '.g:netrw_compress 121 | if exists("g:Netrw_corehandler") 122 | put = 'let g:Netrw_corehandler = '.g:Netrw_corehandler 123 | else 124 | put = '\" let g:Netrw_corehandler = (not defined)' 125 | endif 126 | put = 'let g:netrw_ctags = '.g:netrw_ctags 127 | put = 'let g:netrw_cursor = '.g:netrw_cursor 128 | let decompressline= line("$") 129 | put = 'let g:netrw_decompress = '.string(g:netrw_decompress) 130 | if exists("g:netrw_dynamic_maxfilenamelen") 131 | put = 'let g:netrw_dynamic_maxfilenamelen='.g:netrw_dynamic_maxfilenamelen 132 | else 133 | put = '\" let g:netrw_dynamic_maxfilenamelen= (not defined)' 134 | endif 135 | put = 'let g:netrw_dirhistmax = '.g:netrw_dirhistmax 136 | put = 'let g:netrw_errorlvl = '.g:netrw_errorlvl 137 | put = 'let g:netrw_fastbrowse = '.g:netrw_fastbrowse 138 | let fnameescline= line("$") 139 | put = 'let g:netrw_fname_escape = '.string(g:netrw_fname_escape) 140 | put = 'let g:netrw_ftp_browse_reject = '.g:netrw_ftp_browse_reject 141 | put = 'let g:netrw_ftp_list_cmd = '.g:netrw_ftp_list_cmd 142 | put = 'let g:netrw_ftp_sizelist_cmd = '.g:netrw_ftp_sizelist_cmd 143 | put = 'let g:netrw_ftp_timelist_cmd = '.g:netrw_ftp_timelist_cmd 144 | let globescline= line("$") 145 | put = 'let g:netrw_glob_escape = '.string(g:netrw_glob_escape) 146 | put = 'let g:netrw_hide = '.g:netrw_hide 147 | if exists("g:netrw_home") 148 | put = 'let g:netrw_home = '.g:netrw_home 149 | else 150 | put = '\" let g:netrw_home = (not defined)' 151 | endif 152 | put = 'let g:netrw_keepdir = '.g:netrw_keepdir 153 | put = 'let g:netrw_list_cmd = '.g:netrw_list_cmd 154 | put = 'let g:netrw_list_hide = '.g:netrw_list_hide 155 | put = 'let g:netrw_liststyle = '.g:netrw_liststyle 156 | put = 'let g:netrw_localcopycmd = '.g:netrw_localcopycmd 157 | put = 'let g:netrw_localmkdir = '.g:netrw_localmkdir 158 | put = 'let g:netrw_localmovecmd = '.g:netrw_localmovecmd 159 | put = 'let g:netrw_localrmdir = '.g:netrw_localrmdir 160 | put = 'let g:netrw_maxfilenamelen = '.g:netrw_maxfilenamelen 161 | put = 'let g:netrw_menu = '.g:netrw_menu 162 | put = 'let g:netrw_mousemaps = '.g:netrw_mousemaps 163 | put = 'let g:netrw_mkdir_cmd = '.g:netrw_mkdir_cmd 164 | if exists("g:netrw_nobeval") 165 | put = 'let g:netrw_nobeval = '.g:netrw_nobeval 166 | else 167 | put = '\" let g:netrw_nobeval = (not defined)' 168 | endif 169 | put = 'let g:netrw_remote_mkdir = '.g:netrw_remote_mkdir 170 | put = 'let g:netrw_preview = '.g:netrw_preview 171 | put = 'let g:netrw_rename_cmd = '.g:netrw_rename_cmd 172 | put = 'let g:netrw_retmap = '.g:netrw_retmap 173 | put = 'let g:netrw_rm_cmd = '.g:netrw_rm_cmd 174 | put = 'let g:netrw_rmdir_cmd = '.g:netrw_rmdir_cmd 175 | put = 'let g:netrw_rmf_cmd = '.g:netrw_rmf_cmd 176 | put = 'let g:netrw_sort_by = '.g:netrw_sort_by 177 | put = 'let g:netrw_sort_direction = '.g:netrw_sort_direction 178 | put = 'let g:netrw_sort_options = '.g:netrw_sort_options 179 | put = 'let g:netrw_sort_sequence = '.g:netrw_sort_sequence 180 | put = 'let g:netrw_servername = '.g:netrw_servername 181 | put = 'let g:netrw_special_syntax = '.g:netrw_special_syntax 182 | put = 'let g:netrw_ssh_browse_reject = '.g:netrw_ssh_browse_reject 183 | put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd 184 | put = 'let g:netrw_scpport = '.g:netrw_scpport 185 | put = 'let g:netrw_sepchr = '.g:netrw_sepchr 186 | put = 'let g:netrw_sshport = '.g:netrw_sshport 187 | put = 'let g:netrw_timefmt = '.g:netrw_timefmt 188 | let tmpfileescline= line("$") 189 | put ='let g:netrw_tmpfile_escape...' 190 | put = 'let g:netrw_use_noswf = '.g:netrw_use_noswf 191 | put = 'let g:netrw_xstrlen = '.g:netrw_xstrlen 192 | put = 'let g:netrw_winsize = '.g:netrw_winsize 193 | 194 | put ='' 195 | put ='+ For help, place cursor on line and press ' 196 | 197 | 1d 198 | silent %s/^+/"/e 199 | res 99 200 | silent %s/= \([^0-9].*\)$/= '\1'/e 201 | silent %s/= $/= ''/e 202 | 1 203 | 204 | call setline(decompressline,"let g:netrw_decompress = ".substitute(string(g:netrw_decompress),"^'\\(.*\\)'$",'\1','')) 205 | call setline(fnameescline, "let g:netrw_fname_escape = '".escape(g:netrw_fname_escape,"'")."'") 206 | call setline(globescline, "let g:netrw_glob_escape = '".escape(g:netrw_glob_escape,"'")."'") 207 | call setline(tmpfileescline,"let g:netrw_tmpfile_escape = '".escape(g:netrw_tmpfile_escape,"'")."'") 208 | 209 | set nomod 210 | 211 | nmap :call NetrwSettingHelp() 212 | nnoremap :call NetrwSettingHelp() 213 | let tmpfile= tempname() 214 | exe 'au BufWriteCmd Netrw\ Settings silent w! '.tmpfile.'|so '.tmpfile.'|call delete("'.tmpfile.'")|set nomod' 215 | endfun 216 | 217 | " --------------------------------------------------------------------- 218 | " NetrwSettingHelp: {{{2 219 | fun! NetrwSettingHelp() 220 | " call Dfunc("NetrwSettingHelp()") 221 | let curline = getline(".") 222 | if curline =~ '=' 223 | let varhelp = substitute(curline,'^\s*let ','','e') 224 | let varhelp = substitute(varhelp,'\s*=.*$','','e') 225 | " call Decho("trying help ".varhelp) 226 | try 227 | exe "he ".varhelp 228 | catch /^Vim\%((\a\+)\)\=:E149/ 229 | echo "***sorry*** no help available for <".varhelp.">" 230 | endtry 231 | elseif line(".") < s:netrw_settings_stop 232 | he netrw-settings 233 | elseif line(".") < s:netrw_protocol_stop 234 | he netrw-externapp 235 | elseif line(".") < s:netrw_xfer_stop 236 | he netrw-variables 237 | else 238 | he netrw-browse-var 239 | endif 240 | " call Dret("NetrwSettingHelp") 241 | endfun 242 | 243 | " --------------------------------------------------------------------- 244 | " Modelines: {{{1 245 | " vim:ts=8 fdm=marker 246 | -------------------------------------------------------------------------------- /autoload/netrw_gitignore.vim: -------------------------------------------------------------------------------- 1 | " netrw_gitignore#Hide: gitignore-based hiding 2 | " Function returns a string of comma separated patterns convenient for 3 | " assignment to `g:netrw_list_hide` option. 4 | " Function can take additional filenames as arguments, example: 5 | " netrw_gitignore#Hide('custom_gitignore1', 'custom_gitignore2') 6 | " 7 | " Usage examples: 8 | " let g:netrw_list_hide = netrw_gitignore#Hide() 9 | " let g:netrw_list_hide = netrw_gitignore#Hide() . 'more,hide,patterns' 10 | " 11 | " Copyright: Copyright (C) 2013 Bruno Sutic {{{1 12 | " Permission is hereby granted to use and distribute this code, 13 | " with or without modifications, provided that this copyright 14 | " notice is copied with it. Like anything else that's free, 15 | " netrw_gitignore.vim is provided *as is* and comes with no 16 | " warranty of any kind, either expressed or implied. By using 17 | " this plugin, you agree that in no event will the copyright 18 | " holder be liable for any damages resulting from the use 19 | " of this software. 20 | function! netrw_gitignore#Hide(...) 21 | let additional_files = a:000 22 | 23 | let default_files = ['.gitignore', '.git/info/exclude'] 24 | 25 | " get existing global/system gitignore files 26 | let global_gitignore = expand(substitute(system("git config --global core.excludesfile"), '\n', '', 'g')) 27 | if global_gitignore !=# '' 28 | let default_files = add(default_files, global_gitignore) 29 | endif 30 | let system_gitignore = expand(substitute(system("git config --system core.excludesfile"), '\n', '', 'g')) 31 | if system_gitignore !=# '' 32 | let default_files = add(default_files, system_gitignore) 33 | endif 34 | 35 | " append additional files if given as function arguments 36 | if additional_files !=# [] 37 | let files = extend(default_files, additional_files) 38 | else 39 | let files = default_files 40 | endif 41 | 42 | " keep only existing/readable files 43 | let gitignore_files = [] 44 | for file in files 45 | if filereadable(file) 46 | let gitignore_files = add(gitignore_files, file) 47 | endif 48 | endfor 49 | 50 | " get contents of gitignore patterns from those files 51 | let gitignore_lines = [] 52 | for file in gitignore_files 53 | for line in readfile(file) 54 | " filter empty lines and comments 55 | if line !~# '^#' && line !~# '^$' 56 | let gitignore_lines = add(gitignore_lines, line) 57 | endif 58 | endfor 59 | endfor 60 | 61 | " convert gitignore patterns to Netrw/Vim regex patterns 62 | let escaped_lines = [] 63 | for line in gitignore_lines 64 | let escaped = line 65 | let escaped = substitute(escaped, '\*\*', '*', 'g') 66 | let escaped = substitute(escaped, '\.', '\\.', 'g') 67 | let escaped = substitute(escaped, '\$', '\\$', 'g') 68 | let escaped = substitute(escaped, '*', '.*', 'g') 69 | " correction: dot, dollar and asterisks chars shouldn't be escaped when 70 | " within regex matching groups. 71 | let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\.', '\.', 'g') 72 | let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\$', '\$', 'g') 73 | let escaped = substitute(escaped, '\(\[[^]]*\)\zs\.\*', '*', 'g') 74 | let escaped_lines = add(escaped_lines, escaped) 75 | endfor 76 | 77 | return join(escaped_lines, ',') 78 | endfunction 79 | -------------------------------------------------------------------------------- /autoload/plug.vim: -------------------------------------------------------------------------------- 1 | " vim-plug: Vim plugin manager 2 | " ============================ 3 | " 4 | " 1. Download plug.vim and put it in 'autoload' directory 5 | " 6 | " # Vim 7 | " curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ 8 | " https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 9 | " 10 | " # Neovim 11 | " sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ 12 | " https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' 13 | " 14 | " 2. Add a vim-plug section to your ~/.vimrc (or ~/.config/nvim/init.vim for Neovim) 15 | " 16 | " call plug#begin() 17 | " 18 | " " List your plugins here 19 | " Plug 'tpope/vim-sensible' 20 | " 21 | " call plug#end() 22 | " 23 | " 3. Reload the file or restart Vim, then you can, 24 | " 25 | " :PlugInstall to install plugins 26 | " :PlugUpdate to update plugins 27 | " :PlugDiff to review the changes from the last update 28 | " :PlugClean to remove plugins no longer in the list 29 | " 30 | " For more information, see https://github.com/junegunn/vim-plug 31 | " 32 | " 33 | " Copyright (c) 2024 Junegunn Choi 34 | " 35 | " MIT License 36 | " 37 | " Permission is hereby granted, free of charge, to any person obtaining 38 | " a copy of this software and associated documentation files (the 39 | " "Software"), to deal in the Software without restriction, including 40 | " without limitation the rights to use, copy, modify, merge, publish, 41 | " distribute, sublicense, and/or sell copies of the Software, and to 42 | " permit persons to whom the Software is furnished to do so, subject to 43 | " the following conditions: 44 | " 45 | " The above copyright notice and this permission notice shall be 46 | " included in all copies or substantial portions of the Software. 47 | " 48 | " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 49 | " EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 50 | " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 51 | " NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 52 | " LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 53 | " OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 54 | " WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 55 | 56 | if exists('g:loaded_plug') 57 | finish 58 | endif 59 | let g:loaded_plug = 1 60 | 61 | let s:cpo_save = &cpo 62 | set cpo&vim 63 | 64 | let s:plug_src = 'https://github.com/junegunn/vim-plug.git' 65 | let s:plug_tab = get(s:, 'plug_tab', -1) 66 | let s:plug_buf = get(s:, 'plug_buf', -1) 67 | let s:mac_gui = has('gui_macvim') && has('gui_running') 68 | let s:is_win = has('win32') 69 | let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) 70 | let s:vim8 = has('patch-8.0.0039') && exists('*job_start') 71 | if s:is_win && &shellslash 72 | set noshellslash 73 | let s:me = resolve(expand(':p')) 74 | set shellslash 75 | else 76 | let s:me = resolve(expand(':p')) 77 | endif 78 | let s:base_spec = { 'branch': '', 'frozen': 0 } 79 | let s:TYPE = { 80 | \ 'string': type(''), 81 | \ 'list': type([]), 82 | \ 'dict': type({}), 83 | \ 'funcref': type(function('call')) 84 | \ } 85 | let s:loaded = get(s:, 'loaded', {}) 86 | let s:triggers = get(s:, 'triggers', {}) 87 | 88 | function! s:is_powershell(shell) 89 | return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$' 90 | endfunction 91 | 92 | function! s:isabsolute(dir) abort 93 | return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') 94 | endfunction 95 | 96 | function! s:git_dir(dir) abort 97 | let gitdir = s:trim(a:dir) . '/.git' 98 | if isdirectory(gitdir) 99 | return gitdir 100 | endif 101 | if !filereadable(gitdir) 102 | return '' 103 | endif 104 | let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') 105 | if len(gitdir) && !s:isabsolute(gitdir) 106 | let gitdir = a:dir . '/' . gitdir 107 | endif 108 | return isdirectory(gitdir) ? gitdir : '' 109 | endfunction 110 | 111 | function! s:git_origin_url(dir) abort 112 | let gitdir = s:git_dir(a:dir) 113 | let config = gitdir . '/config' 114 | if empty(gitdir) || !filereadable(config) 115 | return '' 116 | endif 117 | return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') 118 | endfunction 119 | 120 | function! s:git_revision(dir) abort 121 | let gitdir = s:git_dir(a:dir) 122 | let head = gitdir . '/HEAD' 123 | if empty(gitdir) || !filereadable(head) 124 | return '' 125 | endif 126 | 127 | let line = get(readfile(head), 0, '') 128 | let ref = matchstr(line, '^ref: \zs.*') 129 | if empty(ref) 130 | return line 131 | endif 132 | 133 | if filereadable(gitdir . '/' . ref) 134 | return get(readfile(gitdir . '/' . ref), 0, '') 135 | endif 136 | 137 | if filereadable(gitdir . '/packed-refs') 138 | for line in readfile(gitdir . '/packed-refs') 139 | if line =~# ' ' . ref 140 | return matchstr(line, '^[0-9a-f]*') 141 | endif 142 | endfor 143 | endif 144 | 145 | return '' 146 | endfunction 147 | 148 | function! s:git_local_branch(dir) abort 149 | let gitdir = s:git_dir(a:dir) 150 | let head = gitdir . '/HEAD' 151 | if empty(gitdir) || !filereadable(head) 152 | return '' 153 | endif 154 | let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') 155 | return len(branch) ? branch : 'HEAD' 156 | endfunction 157 | 158 | function! s:git_origin_branch(spec) 159 | if len(a:spec.branch) 160 | return a:spec.branch 161 | endif 162 | 163 | " The file may not be present if this is a local repository 164 | let gitdir = s:git_dir(a:spec.dir) 165 | let origin_head = gitdir.'/refs/remotes/origin/HEAD' 166 | if len(gitdir) && filereadable(origin_head) 167 | return matchstr(get(readfile(origin_head), 0, ''), 168 | \ '^ref: refs/remotes/origin/\zs.*') 169 | endif 170 | 171 | " The command may not return the name of a branch in detached HEAD state 172 | let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) 173 | return v:shell_error ? '' : result[-1] 174 | endfunction 175 | 176 | if s:is_win 177 | function! s:plug_call(fn, ...) 178 | let shellslash = &shellslash 179 | try 180 | set noshellslash 181 | return call(a:fn, a:000) 182 | finally 183 | let &shellslash = shellslash 184 | endtry 185 | endfunction 186 | else 187 | function! s:plug_call(fn, ...) 188 | return call(a:fn, a:000) 189 | endfunction 190 | endif 191 | 192 | function! s:plug_getcwd() 193 | return s:plug_call('getcwd') 194 | endfunction 195 | 196 | function! s:plug_fnamemodify(fname, mods) 197 | return s:plug_call('fnamemodify', a:fname, a:mods) 198 | endfunction 199 | 200 | function! s:plug_expand(fmt) 201 | return s:plug_call('expand', a:fmt, 1) 202 | endfunction 203 | 204 | function! s:plug_tempname() 205 | return s:plug_call('tempname') 206 | endfunction 207 | 208 | function! plug#begin(...) 209 | if a:0 > 0 210 | let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) 211 | elseif exists('g:plug_home') 212 | let home = s:path(g:plug_home) 213 | elseif has('nvim') 214 | let home = stdpath('data') . '/plugged' 215 | elseif !empty(&rtp) 216 | let home = s:path(split(&rtp, ',')[0]) . '/plugged' 217 | else 218 | return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') 219 | endif 220 | if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp 221 | return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') 222 | endif 223 | 224 | let g:plug_home = home 225 | let g:plugs = {} 226 | let g:plugs_order = [] 227 | let s:triggers = {} 228 | 229 | call s:define_commands() 230 | return 1 231 | endfunction 232 | 233 | function! s:define_commands() 234 | command! -nargs=+ -bar Plug call plug#() 235 | if !executable('git') 236 | return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') 237 | endif 238 | if has('win32') 239 | \ && &shellslash 240 | \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell)) 241 | return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') 242 | endif 243 | if !has('nvim') 244 | \ && (has('win32') || has('win32unix')) 245 | \ && !has('multi_byte') 246 | return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') 247 | endif 248 | command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) 249 | command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) 250 | command! -nargs=0 -bar -bang PlugClean call s:clean(0) 251 | command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif 252 | command! -nargs=0 -bar PlugStatus call s:status() 253 | command! -nargs=0 -bar PlugDiff call s:diff() 254 | command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) 255 | endfunction 256 | 257 | function! s:to_a(v) 258 | return type(a:v) == s:TYPE.list ? a:v : [a:v] 259 | endfunction 260 | 261 | function! s:to_s(v) 262 | return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" 263 | endfunction 264 | 265 | function! s:glob(from, pattern) 266 | return s:lines(globpath(a:from, a:pattern)) 267 | endfunction 268 | 269 | function! s:source(from, ...) 270 | let found = 0 271 | for pattern in a:000 272 | for vim in s:glob(a:from, pattern) 273 | execute 'source' s:esc(vim) 274 | let found = 1 275 | endfor 276 | endfor 277 | return found 278 | endfunction 279 | 280 | function! s:assoc(dict, key, val) 281 | let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) 282 | endfunction 283 | 284 | function! s:ask(message, ...) 285 | call inputsave() 286 | echohl WarningMsg 287 | let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) 288 | echohl None 289 | call inputrestore() 290 | echo "\r" 291 | return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 292 | endfunction 293 | 294 | function! s:ask_no_interrupt(...) 295 | try 296 | return call('s:ask', a:000) 297 | catch 298 | return 0 299 | endtry 300 | endfunction 301 | 302 | function! s:lazy(plug, opt) 303 | return has_key(a:plug, a:opt) && 304 | \ (empty(s:to_a(a:plug[a:opt])) || 305 | \ !isdirectory(a:plug.dir) || 306 | \ len(s:glob(s:rtp(a:plug), 'plugin')) || 307 | \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) 308 | endfunction 309 | 310 | function! plug#end() 311 | if !exists('g:plugs') 312 | return s:err('plug#end() called without calling plug#begin() first') 313 | endif 314 | 315 | if exists('#PlugLOD') 316 | augroup PlugLOD 317 | autocmd! 318 | augroup END 319 | augroup! PlugLOD 320 | endif 321 | let lod = { 'ft': {}, 'map': {}, 'cmd': {} } 322 | 323 | if get(g:, 'did_load_filetypes', 0) 324 | filetype off 325 | endif 326 | for name in g:plugs_order 327 | if !has_key(g:plugs, name) 328 | continue 329 | endif 330 | let plug = g:plugs[name] 331 | if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') 332 | let s:loaded[name] = 1 333 | continue 334 | endif 335 | 336 | if has_key(plug, 'on') 337 | let s:triggers[name] = { 'map': [], 'cmd': [] } 338 | for cmd in s:to_a(plug.on) 339 | if cmd =~? '^.\+' 340 | if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) 341 | call s:assoc(lod.map, cmd, name) 342 | endif 343 | call add(s:triggers[name].map, cmd) 344 | elseif cmd =~# '^[A-Z]' 345 | let cmd = substitute(cmd, '!*$', '', '') 346 | if exists(':'.cmd) != 2 347 | call s:assoc(lod.cmd, cmd, name) 348 | endif 349 | call add(s:triggers[name].cmd, cmd) 350 | else 351 | call s:err('Invalid `on` option: '.cmd. 352 | \ '. Should start with an uppercase letter or ``.') 353 | endif 354 | endfor 355 | endif 356 | 357 | if has_key(plug, 'for') 358 | let types = s:to_a(plug.for) 359 | if !empty(types) 360 | augroup filetypedetect 361 | call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') 362 | if has('nvim-0.5.0') 363 | call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua') 364 | endif 365 | augroup END 366 | endif 367 | for type in types 368 | call s:assoc(lod.ft, type, name) 369 | endfor 370 | endif 371 | endfor 372 | 373 | for [cmd, names] in items(lod.cmd) 374 | execute printf( 375 | \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', 376 | \ cmd, string(cmd), string(names)) 377 | endfor 378 | 379 | for [map, names] in items(lod.map) 380 | for [mode, map_prefix, key_prefix] in 381 | \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] 382 | execute printf( 383 | \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', 384 | \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) 385 | endfor 386 | endfor 387 | 388 | for [ft, names] in items(lod.ft) 389 | augroup PlugLOD 390 | execute printf('autocmd FileType %s call lod_ft(%s, %s)', 391 | \ ft, string(ft), string(names)) 392 | augroup END 393 | endfor 394 | 395 | call s:reorg_rtp() 396 | filetype plugin indent on 397 | if has('vim_starting') 398 | if has('syntax') && !exists('g:syntax_on') 399 | syntax enable 400 | end 401 | else 402 | call s:reload_plugins() 403 | endif 404 | endfunction 405 | 406 | function! s:loaded_names() 407 | return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') 408 | endfunction 409 | 410 | function! s:load_plugin(spec) 411 | call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') 412 | if has('nvim-0.5.0') 413 | call s:source(s:rtp(a:spec), 'plugin/**/*.lua', 'after/plugin/**/*.lua') 414 | endif 415 | endfunction 416 | 417 | function! s:reload_plugins() 418 | for name in s:loaded_names() 419 | call s:load_plugin(g:plugs[name]) 420 | endfor 421 | endfunction 422 | 423 | function! s:trim(str) 424 | return substitute(a:str, '[\/]\+$', '', '') 425 | endfunction 426 | 427 | function! s:version_requirement(val, min) 428 | for idx in range(0, len(a:min) - 1) 429 | let v = get(a:val, idx, 0) 430 | if v < a:min[idx] | return 0 431 | elseif v > a:min[idx] | return 1 432 | endif 433 | endfor 434 | return 1 435 | endfunction 436 | 437 | function! s:git_version_requirement(...) 438 | if !exists('s:git_version') 439 | let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') 440 | endif 441 | return s:version_requirement(s:git_version, a:000) 442 | endfunction 443 | 444 | function! s:progress_opt(base) 445 | return a:base && !s:is_win && 446 | \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' 447 | endfunction 448 | 449 | function! s:rtp(spec) 450 | return s:path(a:spec.dir . get(a:spec, 'rtp', '')) 451 | endfunction 452 | 453 | if s:is_win 454 | function! s:path(path) 455 | return s:trim(substitute(a:path, '/', '\', 'g')) 456 | endfunction 457 | 458 | function! s:dirpath(path) 459 | return s:path(a:path) . '\' 460 | endfunction 461 | 462 | function! s:is_local_plug(repo) 463 | return a:repo =~? '^[a-z]:\|^[%~]' 464 | endfunction 465 | 466 | " Copied from fzf 467 | function! s:wrap_cmds(cmds) 468 | let cmds = [ 469 | \ '@echo off', 470 | \ 'setlocal enabledelayedexpansion'] 471 | \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) 472 | \ + ['endlocal'] 473 | if has('iconv') 474 | if !exists('s:codepage') 475 | let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) 476 | endif 477 | return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) 478 | endif 479 | return map(cmds, 'v:val."\r"') 480 | endfunction 481 | 482 | function! s:batchfile(cmd) 483 | let batchfile = s:plug_tempname().'.bat' 484 | call writefile(s:wrap_cmds(a:cmd), batchfile) 485 | let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) 486 | if s:is_powershell(&shell) 487 | let cmd = '& ' . cmd 488 | endif 489 | return [batchfile, cmd] 490 | endfunction 491 | else 492 | function! s:path(path) 493 | return s:trim(a:path) 494 | endfunction 495 | 496 | function! s:dirpath(path) 497 | return substitute(a:path, '[/\\]*$', '/', '') 498 | endfunction 499 | 500 | function! s:is_local_plug(repo) 501 | return a:repo[0] =~ '[/$~]' 502 | endfunction 503 | endif 504 | 505 | function! s:err(msg) 506 | echohl ErrorMsg 507 | echom '[vim-plug] '.a:msg 508 | echohl None 509 | endfunction 510 | 511 | function! s:warn(cmd, msg) 512 | echohl WarningMsg 513 | execute a:cmd 'a:msg' 514 | echohl None 515 | endfunction 516 | 517 | function! s:esc(path) 518 | return escape(a:path, ' ') 519 | endfunction 520 | 521 | function! s:escrtp(path) 522 | return escape(a:path, ' ,') 523 | endfunction 524 | 525 | function! s:remove_rtp() 526 | for name in s:loaded_names() 527 | let rtp = s:rtp(g:plugs[name]) 528 | execute 'set rtp-='.s:escrtp(rtp) 529 | let after = globpath(rtp, 'after') 530 | if isdirectory(after) 531 | execute 'set rtp-='.s:escrtp(after) 532 | endif 533 | endfor 534 | endfunction 535 | 536 | function! s:reorg_rtp() 537 | if !empty(s:first_rtp) 538 | execute 'set rtp-='.s:first_rtp 539 | execute 'set rtp-='.s:last_rtp 540 | endif 541 | 542 | " &rtp is modified from outside 543 | if exists('s:prtp') && s:prtp !=# &rtp 544 | call s:remove_rtp() 545 | unlet! s:middle 546 | endif 547 | 548 | let s:middle = get(s:, 'middle', &rtp) 549 | let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') 550 | let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') 551 | let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') 552 | \ . ','.s:middle.',' 553 | \ . join(map(afters, 'escape(v:val, ",")'), ',') 554 | let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') 555 | let s:prtp = &rtp 556 | 557 | if !empty(s:first_rtp) 558 | execute 'set rtp^='.s:first_rtp 559 | execute 'set rtp+='.s:last_rtp 560 | endif 561 | endfunction 562 | 563 | function! s:doautocmd(...) 564 | if exists('#'.join(a:000, '#')) 565 | execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) 566 | endif 567 | endfunction 568 | 569 | function! s:dobufread(names) 570 | for name in a:names 571 | let path = s:rtp(g:plugs[name]) 572 | for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] 573 | if len(finddir(dir, path)) 574 | if exists('#BufRead') 575 | doautocmd BufRead 576 | endif 577 | return 578 | endif 579 | endfor 580 | endfor 581 | endfunction 582 | 583 | function! plug#load(...) 584 | if a:0 == 0 585 | return s:err('Argument missing: plugin name(s) required') 586 | endif 587 | if !exists('g:plugs') 588 | return s:err('plug#begin was not called') 589 | endif 590 | let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 591 | let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') 592 | if !empty(unknowns) 593 | let s = len(unknowns) > 1 ? 's' : '' 594 | return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) 595 | end 596 | let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') 597 | if !empty(unloaded) 598 | for name in unloaded 599 | call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) 600 | endfor 601 | call s:dobufread(unloaded) 602 | return 1 603 | end 604 | return 0 605 | endfunction 606 | 607 | function! s:remove_triggers(name) 608 | if !has_key(s:triggers, a:name) 609 | return 610 | endif 611 | for cmd in s:triggers[a:name].cmd 612 | execute 'silent! delc' cmd 613 | endfor 614 | for map in s:triggers[a:name].map 615 | execute 'silent! unmap' map 616 | execute 'silent! iunmap' map 617 | endfor 618 | call remove(s:triggers, a:name) 619 | endfunction 620 | 621 | function! s:lod(names, types, ...) 622 | for name in a:names 623 | call s:remove_triggers(name) 624 | let s:loaded[name] = 1 625 | endfor 626 | call s:reorg_rtp() 627 | 628 | for name in a:names 629 | let rtp = s:rtp(g:plugs[name]) 630 | for dir in a:types 631 | call s:source(rtp, dir.'/**/*.vim') 632 | if has('nvim-0.5.0') " see neovim#14686 633 | call s:source(rtp, dir.'/**/*.lua') 634 | endif 635 | endfor 636 | if a:0 637 | if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) 638 | execute 'runtime' a:1 639 | endif 640 | call s:source(rtp, a:2) 641 | endif 642 | call s:doautocmd('User', name) 643 | endfor 644 | endfunction 645 | 646 | function! s:lod_ft(pat, names) 647 | let syn = 'syntax/'.a:pat.'.vim' 648 | call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) 649 | execute 'autocmd! PlugLOD FileType' a:pat 650 | call s:doautocmd('filetypeplugin', 'FileType') 651 | call s:doautocmd('filetypeindent', 'FileType') 652 | endfunction 653 | 654 | function! s:lod_cmd(cmd, bang, l1, l2, args, names) 655 | call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) 656 | call s:dobufread(a:names) 657 | execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) 658 | endfunction 659 | 660 | function! s:lod_map(map, names, with_prefix, prefix) 661 | call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) 662 | call s:dobufread(a:names) 663 | let extra = '' 664 | while 1 665 | let c = getchar(0) 666 | if c == 0 667 | break 668 | endif 669 | let extra .= nr2char(c) 670 | endwhile 671 | 672 | if a:with_prefix 673 | let prefix = v:count ? v:count : '' 674 | let prefix .= '"'.v:register.a:prefix 675 | if mode(1) == 'no' 676 | if v:operator == 'c' 677 | let prefix = "\" . prefix 678 | endif 679 | let prefix .= v:operator 680 | endif 681 | call feedkeys(prefix, 'n') 682 | endif 683 | call feedkeys(substitute(a:map, '^', "\", '') . extra) 684 | endfunction 685 | 686 | function! plug#(repo, ...) 687 | if a:0 > 1 688 | return s:err('Invalid number of arguments (1..2)') 689 | endif 690 | 691 | try 692 | let repo = s:trim(a:repo) 693 | let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec 694 | let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) 695 | let spec = extend(s:infer_properties(name, repo), opts) 696 | if !has_key(g:plugs, name) 697 | call add(g:plugs_order, name) 698 | endif 699 | let g:plugs[name] = spec 700 | let s:loaded[name] = get(s:loaded, name, 0) 701 | catch 702 | return s:err(repo . ' ' . v:exception) 703 | endtry 704 | endfunction 705 | 706 | function! s:parse_options(arg) 707 | let opts = copy(s:base_spec) 708 | let type = type(a:arg) 709 | let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' 710 | if type == s:TYPE.string 711 | if empty(a:arg) 712 | throw printf(opt_errfmt, 'tag', 'string') 713 | endif 714 | let opts.tag = a:arg 715 | elseif type == s:TYPE.dict 716 | for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] 717 | if has_key(a:arg, opt) 718 | \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) 719 | throw printf(opt_errfmt, opt, 'string') 720 | endif 721 | endfor 722 | for opt in ['on', 'for'] 723 | if has_key(a:arg, opt) 724 | \ && type(a:arg[opt]) != s:TYPE.list 725 | \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) 726 | throw printf(opt_errfmt, opt, 'string or list') 727 | endif 728 | endfor 729 | if has_key(a:arg, 'do') 730 | \ && type(a:arg.do) != s:TYPE.funcref 731 | \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) 732 | throw printf(opt_errfmt, 'do', 'string or funcref') 733 | endif 734 | call extend(opts, a:arg) 735 | if has_key(opts, 'dir') 736 | let opts.dir = s:dirpath(s:plug_expand(opts.dir)) 737 | endif 738 | else 739 | throw 'Invalid argument type (expected: string or dictionary)' 740 | endif 741 | return opts 742 | endfunction 743 | 744 | function! s:infer_properties(name, repo) 745 | let repo = a:repo 746 | if s:is_local_plug(repo) 747 | return { 'dir': s:dirpath(s:plug_expand(repo)) } 748 | else 749 | if repo =~ ':' 750 | let uri = repo 751 | else 752 | if repo !~ '/' 753 | throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) 754 | endif 755 | let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') 756 | let uri = printf(fmt, repo) 757 | endif 758 | return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } 759 | endif 760 | endfunction 761 | 762 | function! s:install(force, names) 763 | call s:update_impl(0, a:force, a:names) 764 | endfunction 765 | 766 | function! s:update(force, names) 767 | call s:update_impl(1, a:force, a:names) 768 | endfunction 769 | 770 | function! plug#helptags() 771 | if !exists('g:plugs') 772 | return s:err('plug#begin was not called') 773 | endif 774 | for spec in values(g:plugs) 775 | let docd = join([s:rtp(spec), 'doc'], '/') 776 | if isdirectory(docd) 777 | silent! execute 'helptags' s:esc(docd) 778 | endif 779 | endfor 780 | return 1 781 | endfunction 782 | 783 | function! s:syntax() 784 | syntax clear 785 | syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber 786 | syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX,plugAbort 787 | syn match plugNumber /[0-9]\+[0-9.]*/ contained 788 | syn match plugBracket /[[\]]/ contained 789 | syn match plugX /x/ contained 790 | syn match plugAbort /\~/ contained 791 | syn match plugDash /^-\{1}\ / 792 | syn match plugPlus /^+/ 793 | syn match plugStar /^*/ 794 | syn match plugMessage /\(^- \)\@<=.*/ 795 | syn match plugName /\(^- \)\@<=[^ ]*:/ 796 | syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ 797 | syn match plugTag /(tag: [^)]\+)/ 798 | syn match plugInstall /\(^+ \)\@<=[^:]*/ 799 | syn match plugUpdate /\(^* \)\@<=[^:]*/ 800 | syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag 801 | syn match plugEdge /^ \X\+$/ 802 | syn match plugEdge /^ \X*/ contained nextgroup=plugSha 803 | syn match plugSha /[0-9a-f]\{7,9}/ contained 804 | syn match plugRelDate /([^)]*)$/ contained 805 | syn match plugNotLoaded /(not loaded)$/ 806 | syn match plugError /^x.*/ 807 | syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ 808 | syn match plugH2 /^.*:\n-\+$/ 809 | syn match plugH2 /^-\{2,}/ 810 | syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean 811 | hi def link plug1 Title 812 | hi def link plug2 Repeat 813 | hi def link plugH2 Type 814 | hi def link plugX Exception 815 | hi def link plugAbort Ignore 816 | hi def link plugBracket Structure 817 | hi def link plugNumber Number 818 | 819 | hi def link plugDash Special 820 | hi def link plugPlus Constant 821 | hi def link plugStar Boolean 822 | 823 | hi def link plugMessage Function 824 | hi def link plugName Label 825 | hi def link plugInstall Function 826 | hi def link plugUpdate Type 827 | 828 | hi def link plugError Error 829 | hi def link plugDeleted Ignore 830 | hi def link plugRelDate Comment 831 | hi def link plugEdge PreProc 832 | hi def link plugSha Identifier 833 | hi def link plugTag Constant 834 | 835 | hi def link plugNotLoaded Comment 836 | endfunction 837 | 838 | function! s:lpad(str, len) 839 | return a:str . repeat(' ', a:len - len(a:str)) 840 | endfunction 841 | 842 | function! s:lines(msg) 843 | return split(a:msg, "[\r\n]") 844 | endfunction 845 | 846 | function! s:lastline(msg) 847 | return get(s:lines(a:msg), -1, '') 848 | endfunction 849 | 850 | function! s:new_window() 851 | execute get(g:, 'plug_window', '-tabnew') 852 | endfunction 853 | 854 | function! s:plug_window_exists() 855 | let buflist = tabpagebuflist(s:plug_tab) 856 | return !empty(buflist) && index(buflist, s:plug_buf) >= 0 857 | endfunction 858 | 859 | function! s:switch_in() 860 | if !s:plug_window_exists() 861 | return 0 862 | endif 863 | 864 | if winbufnr(0) != s:plug_buf 865 | let s:pos = [tabpagenr(), winnr(), winsaveview()] 866 | execute 'normal!' s:plug_tab.'gt' 867 | let winnr = bufwinnr(s:plug_buf) 868 | execute winnr.'wincmd w' 869 | call add(s:pos, winsaveview()) 870 | else 871 | let s:pos = [winsaveview()] 872 | endif 873 | 874 | setlocal modifiable 875 | return 1 876 | endfunction 877 | 878 | function! s:switch_out(...) 879 | call winrestview(s:pos[-1]) 880 | setlocal nomodifiable 881 | if a:0 > 0 882 | execute a:1 883 | endif 884 | 885 | if len(s:pos) > 1 886 | execute 'normal!' s:pos[0].'gt' 887 | execute s:pos[1] 'wincmd w' 888 | call winrestview(s:pos[2]) 889 | endif 890 | endfunction 891 | 892 | function! s:finish_bindings() 893 | nnoremap R :call retry() 894 | nnoremap D :PlugDiff 895 | nnoremap S :PlugStatus 896 | nnoremap U :call status_update() 897 | xnoremap U :call status_update() 898 | nnoremap ]] :silent! call section('') 899 | nnoremap [[ :silent! call section('b') 900 | endfunction 901 | 902 | function! s:prepare(...) 903 | if empty(s:plug_getcwd()) 904 | throw 'Invalid current working directory. Cannot proceed.' 905 | endif 906 | 907 | for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] 908 | if exists(evar) 909 | throw evar.' detected. Cannot proceed.' 910 | endif 911 | endfor 912 | 913 | call s:job_abort(0) 914 | if s:switch_in() 915 | if b:plug_preview == 1 916 | pc 917 | endif 918 | enew 919 | else 920 | call s:new_window() 921 | endif 922 | 923 | nnoremap q :call close_pane() 924 | if a:0 == 0 925 | call s:finish_bindings() 926 | endif 927 | let b:plug_preview = -1 928 | let s:plug_tab = tabpagenr() 929 | let s:plug_buf = winbufnr(0) 930 | call s:assign_name() 931 | 932 | for k in ['', 'L', 'o', 'X', 'd', 'dd'] 933 | execute 'silent! unmap ' k 934 | endfor 935 | setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell 936 | if exists('+colorcolumn') 937 | setlocal colorcolumn= 938 | endif 939 | setf vim-plug 940 | if exists('g:syntax_on') 941 | call s:syntax() 942 | endif 943 | endfunction 944 | 945 | function! s:close_pane() 946 | if b:plug_preview == 1 947 | pc 948 | let b:plug_preview = -1 949 | elseif exists('s:jobs') && !empty(s:jobs) 950 | call s:job_abort(1) 951 | else 952 | bd 953 | endif 954 | endfunction 955 | 956 | function! s:assign_name() 957 | " Assign buffer name 958 | let prefix = '[Plugins]' 959 | let name = prefix 960 | let idx = 2 961 | while bufexists(name) 962 | let name = printf('%s (%s)', prefix, idx) 963 | let idx = idx + 1 964 | endwhile 965 | silent! execute 'f' fnameescape(name) 966 | endfunction 967 | 968 | function! s:chsh(swap) 969 | let prev = [&shell, &shellcmdflag, &shellredir] 970 | if !s:is_win 971 | set shell=sh 972 | endif 973 | if a:swap 974 | if s:is_powershell(&shell) 975 | let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' 976 | elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' 977 | set shellredir=>%s\ 2>&1 978 | endif 979 | endif 980 | return prev 981 | endfunction 982 | 983 | function! s:bang(cmd, ...) 984 | let batchfile = '' 985 | try 986 | let [sh, shellcmdflag, shrd] = s:chsh(a:0) 987 | " FIXME: Escaping is incomplete. We could use shellescape with eval, 988 | " but it won't work on Windows. 989 | let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd 990 | if s:is_win 991 | let [batchfile, cmd] = s:batchfile(cmd) 992 | endif 993 | let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') 994 | execute "normal! :execute g:_plug_bang\\" 995 | finally 996 | unlet g:_plug_bang 997 | let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] 998 | if s:is_win && filereadable(batchfile) 999 | call delete(batchfile) 1000 | endif 1001 | endtry 1002 | return v:shell_error ? 'Exit status: ' . v:shell_error : '' 1003 | endfunction 1004 | 1005 | function! s:regress_bar() 1006 | let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') 1007 | call s:progress_bar(2, bar, len(bar)) 1008 | endfunction 1009 | 1010 | function! s:is_updated(dir) 1011 | return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) 1012 | endfunction 1013 | 1014 | function! s:do(pull, force, todo) 1015 | if has('nvim') 1016 | " Reset &rtp to invalidate Neovim cache of loaded Lua modules 1017 | " See https://github.com/junegunn/vim-plug/pull/1157#issuecomment-1809226110 1018 | let &rtp = &rtp 1019 | endif 1020 | for [name, spec] in items(a:todo) 1021 | if !isdirectory(spec.dir) 1022 | continue 1023 | endif 1024 | let installed = has_key(s:update.new, name) 1025 | let updated = installed ? 0 : 1026 | \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) 1027 | if a:force || installed || updated 1028 | execute 'cd' s:esc(spec.dir) 1029 | call append(3, '- Post-update hook for '. name .' ... ') 1030 | let error = '' 1031 | let type = type(spec.do) 1032 | if type == s:TYPE.string 1033 | if spec.do[0] == ':' 1034 | if !get(s:loaded, name, 0) 1035 | let s:loaded[name] = 1 1036 | call s:reorg_rtp() 1037 | endif 1038 | call s:load_plugin(spec) 1039 | try 1040 | execute spec.do[1:] 1041 | catch 1042 | let error = v:exception 1043 | endtry 1044 | if !s:plug_window_exists() 1045 | cd - 1046 | throw 'Warning: vim-plug was terminated by the post-update hook of '.name 1047 | endif 1048 | else 1049 | let error = s:bang(spec.do) 1050 | endif 1051 | elseif type == s:TYPE.funcref 1052 | try 1053 | call s:load_plugin(spec) 1054 | let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') 1055 | call spec.do({ 'name': name, 'status': status, 'force': a:force }) 1056 | catch 1057 | let error = v:exception 1058 | endtry 1059 | else 1060 | let error = 'Invalid hook type' 1061 | endif 1062 | call s:switch_in() 1063 | call setline(4, empty(error) ? (getline(4) . 'OK') 1064 | \ : ('x' . getline(4)[1:] . error)) 1065 | if !empty(error) 1066 | call add(s:update.errors, name) 1067 | call s:regress_bar() 1068 | endif 1069 | cd - 1070 | endif 1071 | endfor 1072 | endfunction 1073 | 1074 | function! s:hash_match(a, b) 1075 | return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 1076 | endfunction 1077 | 1078 | function! s:checkout(spec) 1079 | let sha = a:spec.commit 1080 | let output = s:git_revision(a:spec.dir) 1081 | let error = 0 1082 | if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) 1083 | let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : '' 1084 | let output = s:system( 1085 | \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) 1086 | let error = v:shell_error 1087 | endif 1088 | return [output, error] 1089 | endfunction 1090 | 1091 | function! s:finish(pull) 1092 | let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) 1093 | if new_frozen 1094 | let s = new_frozen > 1 ? 's' : '' 1095 | call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) 1096 | endif 1097 | call append(3, '- Finishing ... ') | 4 1098 | redraw 1099 | call plug#helptags() 1100 | call plug#end() 1101 | call setline(4, getline(4) . 'Done!') 1102 | redraw 1103 | let msgs = [] 1104 | if !empty(s:update.errors) 1105 | call add(msgs, "Press 'R' to retry.") 1106 | endif 1107 | if a:pull && len(s:update.new) < len(filter(getline(5, '$'), 1108 | \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) 1109 | call add(msgs, "Press 'D' to see the updated changes.") 1110 | endif 1111 | echo join(msgs, ' ') 1112 | call s:finish_bindings() 1113 | endfunction 1114 | 1115 | function! s:retry() 1116 | if empty(s:update.errors) 1117 | return 1118 | endif 1119 | echo 1120 | call s:update_impl(s:update.pull, s:update.force, 1121 | \ extend(copy(s:update.errors), [s:update.threads])) 1122 | endfunction 1123 | 1124 | function! s:is_managed(name) 1125 | return has_key(g:plugs[a:name], 'uri') 1126 | endfunction 1127 | 1128 | function! s:names(...) 1129 | return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) 1130 | endfunction 1131 | 1132 | function! s:check_ruby() 1133 | silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") 1134 | if !exists('g:plug_ruby') 1135 | redraw! 1136 | return s:warn('echom', 'Warning: Ruby interface is broken') 1137 | endif 1138 | let ruby_version = split(g:plug_ruby, '\.') 1139 | unlet g:plug_ruby 1140 | return s:version_requirement(ruby_version, [1, 8, 7]) 1141 | endfunction 1142 | 1143 | function! s:update_impl(pull, force, args) abort 1144 | let sync = index(a:args, '--sync') >= 0 || has('vim_starting') 1145 | let args = filter(copy(a:args), 'v:val != "--sync"') 1146 | let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? 1147 | \ remove(args, -1) : get(g:, 'plug_threads', 16) 1148 | 1149 | let managed = filter(deepcopy(g:plugs), 's:is_managed(v:key)') 1150 | let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : 1151 | \ filter(managed, 'index(args, v:key) >= 0') 1152 | 1153 | if empty(todo) 1154 | return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) 1155 | endif 1156 | 1157 | if !s:is_win && s:git_version_requirement(2, 3) 1158 | let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' 1159 | let $GIT_TERMINAL_PROMPT = 0 1160 | for plug in values(todo) 1161 | let plug.uri = substitute(plug.uri, 1162 | \ '^https://git::@github\.com', 'https://github.com', '') 1163 | endfor 1164 | endif 1165 | 1166 | if !isdirectory(g:plug_home) 1167 | try 1168 | call mkdir(g:plug_home, 'p') 1169 | catch 1170 | return s:err(printf('Invalid plug directory: %s. '. 1171 | \ 'Try to call plug#begin with a valid directory', g:plug_home)) 1172 | endtry 1173 | endif 1174 | 1175 | if has('nvim') && !exists('*jobwait') && threads > 1 1176 | call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') 1177 | endif 1178 | 1179 | let use_job = s:nvim || s:vim8 1180 | let python = (has('python') || has('python3')) && !use_job 1181 | 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() 1182 | 1183 | let s:update = { 1184 | \ 'start': reltime(), 1185 | \ 'all': todo, 1186 | \ 'todo': copy(todo), 1187 | \ 'errors': [], 1188 | \ 'pull': a:pull, 1189 | \ 'force': a:force, 1190 | \ 'new': {}, 1191 | \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, 1192 | \ 'bar': '', 1193 | \ 'fin': 0 1194 | \ } 1195 | 1196 | call s:prepare(1) 1197 | call append(0, ['', '']) 1198 | normal! 2G 1199 | silent! redraw 1200 | 1201 | " Set remote name, overriding a possible user git config's clone.defaultRemoteName 1202 | let s:clone_opt = ['--origin', 'origin'] 1203 | if get(g:, 'plug_shallow', 1) 1204 | call extend(s:clone_opt, ['--depth', '1']) 1205 | if s:git_version_requirement(1, 7, 10) 1206 | call add(s:clone_opt, '--no-single-branch') 1207 | endif 1208 | endif 1209 | 1210 | if has('win32unix') || has('wsl') 1211 | call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) 1212 | endif 1213 | 1214 | let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' 1215 | 1216 | " Python version requirement (>= 2.7) 1217 | if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 1218 | redir => pyv 1219 | silent python import platform; print platform.python_version() 1220 | redir END 1221 | let python = s:version_requirement( 1222 | \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) 1223 | endif 1224 | 1225 | if (python || ruby) && s:update.threads > 1 1226 | try 1227 | let imd = &imd 1228 | if s:mac_gui 1229 | set noimd 1230 | endif 1231 | if ruby 1232 | call s:update_ruby() 1233 | else 1234 | call s:update_python() 1235 | endif 1236 | catch 1237 | let lines = getline(4, '$') 1238 | let printed = {} 1239 | silent! 4,$d _ 1240 | for line in lines 1241 | let name = s:extract_name(line, '.', '') 1242 | if empty(name) || !has_key(printed, name) 1243 | call append('$', line) 1244 | if !empty(name) 1245 | let printed[name] = 1 1246 | if line[0] == 'x' && index(s:update.errors, name) < 0 1247 | call add(s:update.errors, name) 1248 | end 1249 | endif 1250 | endif 1251 | endfor 1252 | finally 1253 | let &imd = imd 1254 | call s:update_finish() 1255 | endtry 1256 | else 1257 | call s:update_vim() 1258 | while use_job && sync 1259 | sleep 100m 1260 | if s:update.fin 1261 | break 1262 | endif 1263 | endwhile 1264 | endif 1265 | endfunction 1266 | 1267 | function! s:log4(name, msg) 1268 | call setline(4, printf('- %s (%s)', a:msg, a:name)) 1269 | redraw 1270 | endfunction 1271 | 1272 | function! s:update_finish() 1273 | if exists('s:git_terminal_prompt') 1274 | let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt 1275 | endif 1276 | if s:switch_in() 1277 | call append(3, '- Updating ...') | 4 1278 | 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))')) 1279 | let [pos, _] = s:logpos(name) 1280 | if !pos 1281 | continue 1282 | endif 1283 | let out = '' 1284 | let error = 0 1285 | if has_key(spec, 'commit') 1286 | call s:log4(name, 'Checking out '.spec.commit) 1287 | let [out, error] = s:checkout(spec) 1288 | elseif has_key(spec, 'tag') 1289 | let tag = spec.tag 1290 | if tag =~ '\*' 1291 | let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) 1292 | if !v:shell_error && !empty(tags) 1293 | let tag = tags[0] 1294 | call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) 1295 | call append(3, '') 1296 | endif 1297 | endif 1298 | call s:log4(name, 'Checking out '.tag) 1299 | let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) 1300 | let error = v:shell_error 1301 | endif 1302 | if !error && filereadable(spec.dir.'/.gitmodules') && 1303 | \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) 1304 | call s:log4(name, 'Updating submodules. This may take a while.') 1305 | let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) 1306 | let error = v:shell_error 1307 | endif 1308 | let msg = s:format_message(v:shell_error ? 'x': '-', name, out) 1309 | if error 1310 | call add(s:update.errors, name) 1311 | call s:regress_bar() 1312 | silent execute pos 'd _' 1313 | call append(4, msg) | 4 1314 | elseif !empty(out) 1315 | call setline(pos, msg[0]) 1316 | endif 1317 | redraw 1318 | endfor 1319 | silent 4 d _ 1320 | try 1321 | 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")')) 1322 | catch 1323 | call s:warn('echom', v:exception) 1324 | call s:warn('echo', '') 1325 | return 1326 | endtry 1327 | call s:finish(s:update.pull) 1328 | call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') 1329 | call s:switch_out('normal! gg') 1330 | endif 1331 | endfunction 1332 | 1333 | function! s:mark_aborted(name, message) 1334 | let attrs = { 'running': 0, 'error': 1, 'abort': 1, 'lines': [a:message] } 1335 | let s:jobs[a:name] = extend(get(s:jobs, a:name, {}), attrs) 1336 | endfunction 1337 | 1338 | function! s:job_abort(cancel) 1339 | if (!s:nvim && !s:vim8) || !exists('s:jobs') 1340 | return 1341 | endif 1342 | 1343 | for [name, j] in items(s:jobs) 1344 | if s:nvim 1345 | silent! call jobstop(j.jobid) 1346 | elseif s:vim8 1347 | silent! call job_stop(j.jobid) 1348 | endif 1349 | if j.new 1350 | call s:rm_rf(g:plugs[name].dir) 1351 | endif 1352 | if a:cancel 1353 | call s:mark_aborted(name, 'Aborted') 1354 | endif 1355 | endfor 1356 | 1357 | if a:cancel 1358 | for todo in values(s:update.todo) 1359 | let todo.abort = 1 1360 | endfor 1361 | else 1362 | let s:jobs = {} 1363 | endif 1364 | endfunction 1365 | 1366 | function! s:last_non_empty_line(lines) 1367 | let len = len(a:lines) 1368 | for idx in range(len) 1369 | let line = a:lines[len-idx-1] 1370 | if !empty(line) 1371 | return line 1372 | endif 1373 | endfor 1374 | return '' 1375 | endfunction 1376 | 1377 | function! s:bullet_for(job, ...) 1378 | if a:job.running 1379 | return a:job.new ? '+' : '*' 1380 | endif 1381 | if get(a:job, 'abort', 0) 1382 | return '~' 1383 | endif 1384 | return a:job.error ? 'x' : get(a:000, 0, '-') 1385 | endfunction 1386 | 1387 | function! s:job_out_cb(self, data) abort 1388 | let self = a:self 1389 | let data = remove(self.lines, -1) . a:data 1390 | let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') 1391 | call extend(self.lines, lines) 1392 | " To reduce the number of buffer updates 1393 | let self.tick = get(self, 'tick', -1) + 1 1394 | if !self.running || self.tick % len(s:jobs) == 0 1395 | let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) 1396 | if len(result) 1397 | call s:log(s:bullet_for(self), self.name, result) 1398 | endif 1399 | endif 1400 | endfunction 1401 | 1402 | function! s:job_exit_cb(self, data) abort 1403 | let a:self.running = 0 1404 | let a:self.error = a:data != 0 1405 | call s:reap(a:self.name) 1406 | call s:tick() 1407 | endfunction 1408 | 1409 | function! s:job_cb(fn, job, ch, data) 1410 | if !s:plug_window_exists() " plug window closed 1411 | return s:job_abort(0) 1412 | endif 1413 | call call(a:fn, [a:job, a:data]) 1414 | endfunction 1415 | 1416 | function! s:nvim_cb(job_id, data, event) dict abort 1417 | return (a:event == 'stdout' || a:event == 'stderr') ? 1418 | \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : 1419 | \ s:job_cb('s:job_exit_cb', self, 0, a:data) 1420 | endfunction 1421 | 1422 | function! s:spawn(name, spec, queue, opts) 1423 | let job = { 'name': a:name, 'spec': a:spec, 'running': 1, 'error': 0, 'lines': [''], 1424 | \ 'new': get(a:opts, 'new', 0), 'queue': copy(a:queue) } 1425 | let Item = remove(job.queue, 0) 1426 | let argv = type(Item) == s:TYPE.funcref ? call(Item, [a:spec]) : Item 1427 | let s:jobs[a:name] = job 1428 | 1429 | if s:nvim 1430 | if has_key(a:opts, 'dir') 1431 | let job.cwd = a:opts.dir 1432 | endif 1433 | call extend(job, { 1434 | \ 'on_stdout': function('s:nvim_cb'), 1435 | \ 'on_stderr': function('s:nvim_cb'), 1436 | \ 'on_exit': function('s:nvim_cb'), 1437 | \ }) 1438 | let jid = s:plug_call('jobstart', argv, job) 1439 | if jid > 0 1440 | let job.jobid = jid 1441 | else 1442 | let job.running = 0 1443 | let job.error = 1 1444 | let job.lines = [jid < 0 ? argv[0].' is not executable' : 1445 | \ 'Invalid arguments (or job table is full)'] 1446 | endif 1447 | elseif s:vim8 1448 | let cmd = join(map(copy(argv), 'plug#shellescape(v:val, {"script": 0})')) 1449 | if has_key(a:opts, 'dir') 1450 | let cmd = s:with_cd(cmd, a:opts.dir, 0) 1451 | endif 1452 | let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] 1453 | let jid = job_start(s:is_win ? join(argv, ' ') : argv, { 1454 | \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), 1455 | \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), 1456 | \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), 1457 | \ 'err_mode': 'raw', 1458 | \ 'out_mode': 'raw' 1459 | \}) 1460 | if job_status(jid) == 'run' 1461 | let job.jobid = jid 1462 | else 1463 | let job.running = 0 1464 | let job.error = 1 1465 | let job.lines = ['Failed to start job'] 1466 | endif 1467 | else 1468 | let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [argv, a:opts.dir] : [argv])) 1469 | let job.error = v:shell_error != 0 1470 | let job.running = 0 1471 | endif 1472 | endfunction 1473 | 1474 | function! s:reap(name) 1475 | let job = remove(s:jobs, a:name) 1476 | if job.error 1477 | call add(s:update.errors, a:name) 1478 | elseif get(job, 'new', 0) 1479 | let s:update.new[a:name] = 1 1480 | endif 1481 | 1482 | let more = len(get(job, 'queue', [])) 1483 | let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) 1484 | if len(result) 1485 | call s:log(s:bullet_for(job), a:name, result) 1486 | endif 1487 | 1488 | if !job.error && more 1489 | let job.spec.queue = job.queue 1490 | let s:update.todo[a:name] = job.spec 1491 | else 1492 | let s:update.bar .= s:bullet_for(job, '=') 1493 | call s:bar() 1494 | endif 1495 | endfunction 1496 | 1497 | function! s:bar() 1498 | if s:switch_in() 1499 | let total = len(s:update.all) 1500 | call setline(1, (s:update.pull ? 'Updating' : 'Installing'). 1501 | \ ' plugins ('.len(s:update.bar).'/'.total.')') 1502 | call s:progress_bar(2, s:update.bar, total) 1503 | call s:switch_out() 1504 | endif 1505 | endfunction 1506 | 1507 | function! s:logpos(name) 1508 | let max = line('$') 1509 | for i in range(4, max > 4 ? max : 4) 1510 | if getline(i) =~# '^[-+x*] '.a:name.':' 1511 | for j in range(i + 1, max > 5 ? max : 5) 1512 | if getline(j) !~ '^ ' 1513 | return [i, j - 1] 1514 | endif 1515 | endfor 1516 | return [i, i] 1517 | endif 1518 | endfor 1519 | return [0, 0] 1520 | endfunction 1521 | 1522 | function! s:log(bullet, name, lines) 1523 | if s:switch_in() 1524 | let [b, e] = s:logpos(a:name) 1525 | if b > 0 1526 | silent execute printf('%d,%d d _', b, e) 1527 | if b > winheight('.') 1528 | let b = 4 1529 | endif 1530 | else 1531 | let b = 4 1532 | endif 1533 | " FIXME For some reason, nomodifiable is set after :d in vim8 1534 | setlocal modifiable 1535 | call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) 1536 | call s:switch_out() 1537 | endif 1538 | endfunction 1539 | 1540 | function! s:update_vim() 1541 | let s:jobs = {} 1542 | 1543 | call s:bar() 1544 | call s:tick() 1545 | endfunction 1546 | 1547 | function! s:checkout_command(spec) 1548 | let a:spec.branch = s:git_origin_branch(a:spec) 1549 | return ['git', 'checkout', '-q', a:spec.branch, '--'] 1550 | endfunction 1551 | 1552 | function! s:merge_command(spec) 1553 | let a:spec.branch = s:git_origin_branch(a:spec) 1554 | return ['git', 'merge', '--ff-only', 'origin/'.a:spec.branch] 1555 | endfunction 1556 | 1557 | function! s:tick() 1558 | let pull = s:update.pull 1559 | let prog = s:progress_opt(s:nvim || s:vim8) 1560 | while 1 " Without TCO, Vim stack is bound to explode 1561 | if empty(s:update.todo) 1562 | if empty(s:jobs) && !s:update.fin 1563 | call s:update_finish() 1564 | let s:update.fin = 1 1565 | endif 1566 | return 1567 | endif 1568 | 1569 | let name = keys(s:update.todo)[0] 1570 | let spec = remove(s:update.todo, name) 1571 | if get(spec, 'abort', 0) 1572 | call s:mark_aborted(name, 'Skipped') 1573 | call s:reap(name) 1574 | continue 1575 | endif 1576 | 1577 | let queue = get(spec, 'queue', []) 1578 | let new = empty(globpath(spec.dir, '.git', 1)) 1579 | 1580 | if empty(queue) 1581 | call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') 1582 | redraw 1583 | endif 1584 | 1585 | let has_tag = has_key(spec, 'tag') 1586 | if len(queue) 1587 | call s:spawn(name, spec, queue, { 'dir': spec.dir }) 1588 | elseif !new 1589 | let [error, _] = s:git_validate(spec, 0) 1590 | if empty(error) 1591 | if pull 1592 | let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch'] 1593 | if has_tag && !empty(globpath(spec.dir, '.git/shallow')) 1594 | call extend(cmd, ['--depth', '99999999']) 1595 | endif 1596 | if !empty(prog) 1597 | call add(cmd, prog) 1598 | endif 1599 | let queue = [cmd, split('git remote set-head origin -a')] 1600 | if !has_tag && !has_key(spec, 'commit') 1601 | call extend(queue, [function('s:checkout_command'), function('s:merge_command')]) 1602 | endif 1603 | call s:spawn(name, spec, queue, { 'dir': spec.dir }) 1604 | else 1605 | let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } 1606 | endif 1607 | else 1608 | let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } 1609 | endif 1610 | else 1611 | let cmd = ['git', 'clone'] 1612 | if !has_tag 1613 | call extend(cmd, s:clone_opt) 1614 | endif 1615 | if !empty(prog) 1616 | call add(cmd, prog) 1617 | endif 1618 | call s:spawn(name, spec, [extend(cmd, [spec.uri, s:trim(spec.dir)]), function('s:checkout_command'), function('s:merge_command')], { 'new': 1 }) 1619 | endif 1620 | 1621 | if !s:jobs[name].running 1622 | call s:reap(name) 1623 | endif 1624 | if len(s:jobs) >= s:update.threads 1625 | break 1626 | endif 1627 | endwhile 1628 | endfunction 1629 | 1630 | function! s:update_python() 1631 | let py_exe = has('python') ? 'python' : 'python3' 1632 | execute py_exe "<< EOF" 1633 | import datetime 1634 | import functools 1635 | import os 1636 | try: 1637 | import queue 1638 | except ImportError: 1639 | import Queue as queue 1640 | import random 1641 | import re 1642 | import shutil 1643 | import signal 1644 | import subprocess 1645 | import tempfile 1646 | import threading as thr 1647 | import time 1648 | import traceback 1649 | import vim 1650 | 1651 | G_NVIM = vim.eval("has('nvim')") == '1' 1652 | G_PULL = vim.eval('s:update.pull') == '1' 1653 | G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 1654 | G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) 1655 | G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) 1656 | G_PROGRESS = vim.eval('s:progress_opt(1)') 1657 | G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) 1658 | G_STOP = thr.Event() 1659 | G_IS_WIN = vim.eval('s:is_win') == '1' 1660 | 1661 | class PlugError(Exception): 1662 | def __init__(self, msg): 1663 | self.msg = msg 1664 | class CmdTimedOut(PlugError): 1665 | pass 1666 | class CmdFailed(PlugError): 1667 | pass 1668 | class InvalidURI(PlugError): 1669 | pass 1670 | class Action(object): 1671 | INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] 1672 | 1673 | class Buffer(object): 1674 | def __init__(self, lock, num_plugs, is_pull): 1675 | self.bar = '' 1676 | self.event = 'Updating' if is_pull else 'Installing' 1677 | self.lock = lock 1678 | self.maxy = int(vim.eval('winheight(".")')) 1679 | self.num_plugs = num_plugs 1680 | 1681 | def __where(self, name): 1682 | """ Find first line with name in current buffer. Return line num. """ 1683 | found, lnum = False, 0 1684 | matcher = re.compile('^[-+x*] {0}:'.format(name)) 1685 | for line in vim.current.buffer: 1686 | if matcher.search(line) is not None: 1687 | found = True 1688 | break 1689 | lnum += 1 1690 | 1691 | if not found: 1692 | lnum = -1 1693 | return lnum 1694 | 1695 | def header(self): 1696 | curbuf = vim.current.buffer 1697 | curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) 1698 | 1699 | num_spaces = self.num_plugs - len(self.bar) 1700 | curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') 1701 | 1702 | with self.lock: 1703 | vim.command('normal! 2G') 1704 | vim.command('redraw') 1705 | 1706 | def write(self, action, name, lines): 1707 | first, rest = lines[0], lines[1:] 1708 | msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] 1709 | msg.extend([' ' + line for line in rest]) 1710 | 1711 | try: 1712 | if action == Action.ERROR: 1713 | self.bar += 'x' 1714 | vim.command("call add(s:update.errors, '{0}')".format(name)) 1715 | elif action == Action.DONE: 1716 | self.bar += '=' 1717 | 1718 | curbuf = vim.current.buffer 1719 | lnum = self.__where(name) 1720 | if lnum != -1: # Found matching line num 1721 | del curbuf[lnum] 1722 | if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): 1723 | lnum = 3 1724 | else: 1725 | lnum = 3 1726 | curbuf.append(msg, lnum) 1727 | 1728 | self.header() 1729 | except vim.error: 1730 | pass 1731 | 1732 | class Command(object): 1733 | CD = 'cd /d' if G_IS_WIN else 'cd' 1734 | 1735 | def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): 1736 | self.cmd = cmd 1737 | if cmd_dir: 1738 | self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) 1739 | self.timeout = timeout 1740 | self.callback = cb if cb else (lambda msg: None) 1741 | self.clean = clean if clean else (lambda: None) 1742 | self.proc = None 1743 | 1744 | @property 1745 | def alive(self): 1746 | """ Returns true only if command still running. """ 1747 | return self.proc and self.proc.poll() is None 1748 | 1749 | def execute(self, ntries=3): 1750 | """ Execute the command with ntries if CmdTimedOut. 1751 | Returns the output of the command if no Exception. 1752 | """ 1753 | attempt, finished, limit = 0, False, self.timeout 1754 | 1755 | while not finished: 1756 | try: 1757 | attempt += 1 1758 | result = self.try_command() 1759 | finished = True 1760 | return result 1761 | except CmdTimedOut: 1762 | if attempt != ntries: 1763 | self.notify_retry() 1764 | self.timeout += limit 1765 | else: 1766 | raise 1767 | 1768 | def notify_retry(self): 1769 | """ Retry required for command, notify user. """ 1770 | for count in range(3, 0, -1): 1771 | if G_STOP.is_set(): 1772 | raise KeyboardInterrupt 1773 | msg = 'Timeout. Will retry in {0} second{1} ...'.format( 1774 | count, 's' if count != 1 else '') 1775 | self.callback([msg]) 1776 | time.sleep(1) 1777 | self.callback(['Retrying ...']) 1778 | 1779 | def try_command(self): 1780 | """ Execute a cmd & poll for callback. Returns list of output. 1781 | Raises CmdFailed -> return code for Popen isn't 0 1782 | Raises CmdTimedOut -> command exceeded timeout without new output 1783 | """ 1784 | first_line = True 1785 | 1786 | try: 1787 | tfile = tempfile.NamedTemporaryFile(mode='w+b') 1788 | preexec_fn = not G_IS_WIN and os.setsid or None 1789 | self.proc = subprocess.Popen(self.cmd, stdout=tfile, 1790 | stderr=subprocess.STDOUT, 1791 | stdin=subprocess.PIPE, shell=True, 1792 | preexec_fn=preexec_fn) 1793 | thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) 1794 | thrd.start() 1795 | 1796 | thread_not_started = True 1797 | while thread_not_started: 1798 | try: 1799 | thrd.join(0.1) 1800 | thread_not_started = False 1801 | except RuntimeError: 1802 | pass 1803 | 1804 | while self.alive: 1805 | if G_STOP.is_set(): 1806 | raise KeyboardInterrupt 1807 | 1808 | if first_line or random.random() < G_LOG_PROB: 1809 | first_line = False 1810 | line = '' if G_IS_WIN else nonblock_read(tfile.name) 1811 | if line: 1812 | self.callback([line]) 1813 | 1814 | time_diff = time.time() - os.path.getmtime(tfile.name) 1815 | if time_diff > self.timeout: 1816 | raise CmdTimedOut(['Timeout!']) 1817 | 1818 | thrd.join(0.5) 1819 | 1820 | tfile.seek(0) 1821 | result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] 1822 | 1823 | if self.proc.returncode != 0: 1824 | raise CmdFailed([''] + result) 1825 | 1826 | return result 1827 | except: 1828 | self.terminate() 1829 | raise 1830 | 1831 | def terminate(self): 1832 | """ Terminate process and cleanup. """ 1833 | if self.alive: 1834 | if G_IS_WIN: 1835 | os.kill(self.proc.pid, signal.SIGINT) 1836 | else: 1837 | os.killpg(self.proc.pid, signal.SIGTERM) 1838 | self.clean() 1839 | 1840 | class Plugin(object): 1841 | def __init__(self, name, args, buf_q, lock): 1842 | self.name = name 1843 | self.args = args 1844 | self.buf_q = buf_q 1845 | self.lock = lock 1846 | self.tag = args.get('tag', 0) 1847 | 1848 | def manage(self): 1849 | try: 1850 | if os.path.exists(self.args['dir']): 1851 | self.update() 1852 | else: 1853 | self.install() 1854 | with self.lock: 1855 | thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) 1856 | except PlugError as exc: 1857 | self.write(Action.ERROR, self.name, exc.msg) 1858 | except KeyboardInterrupt: 1859 | G_STOP.set() 1860 | self.write(Action.ERROR, self.name, ['Interrupted!']) 1861 | except: 1862 | # Any exception except those above print stack trace 1863 | msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) 1864 | self.write(Action.ERROR, self.name, msg.split('\n')) 1865 | raise 1866 | 1867 | def install(self): 1868 | target = self.args['dir'] 1869 | if target[-1] == '\\': 1870 | target = target[0:-1] 1871 | 1872 | def clean(target): 1873 | def _clean(): 1874 | try: 1875 | shutil.rmtree(target) 1876 | except OSError: 1877 | pass 1878 | return _clean 1879 | 1880 | self.write(Action.INSTALL, self.name, ['Installing ...']) 1881 | callback = functools.partial(self.write, Action.INSTALL, self.name) 1882 | cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( 1883 | '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], 1884 | esc(target)) 1885 | com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) 1886 | result = com.execute(G_RETRIES) 1887 | self.write(Action.DONE, self.name, result[-1:]) 1888 | 1889 | def repo_uri(self): 1890 | cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' 1891 | command = Command(cmd, self.args['dir'], G_TIMEOUT,) 1892 | result = command.execute(G_RETRIES) 1893 | return result[-1] 1894 | 1895 | def update(self): 1896 | actual_uri = self.repo_uri() 1897 | expect_uri = self.args['uri'] 1898 | regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') 1899 | ma = regex.match(actual_uri) 1900 | mb = regex.match(expect_uri) 1901 | if ma is None or mb is None or ma.groups() != mb.groups(): 1902 | msg = ['', 1903 | 'Invalid URI: {0}'.format(actual_uri), 1904 | 'Expected {0}'.format(expect_uri), 1905 | 'PlugClean required.'] 1906 | raise InvalidURI(msg) 1907 | 1908 | if G_PULL: 1909 | self.write(Action.UPDATE, self.name, ['Updating ...']) 1910 | callback = functools.partial(self.write, Action.UPDATE, self.name) 1911 | fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' 1912 | cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) 1913 | com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) 1914 | result = com.execute(G_RETRIES) 1915 | self.write(Action.DONE, self.name, result[-1:]) 1916 | else: 1917 | self.write(Action.DONE, self.name, ['Already installed']) 1918 | 1919 | def write(self, action, name, msg): 1920 | self.buf_q.put((action, name, msg)) 1921 | 1922 | class PlugThread(thr.Thread): 1923 | def __init__(self, tname, args): 1924 | super(PlugThread, self).__init__() 1925 | self.tname = tname 1926 | self.args = args 1927 | 1928 | def run(self): 1929 | thr.current_thread().name = self.tname 1930 | buf_q, work_q, lock = self.args 1931 | 1932 | try: 1933 | while not G_STOP.is_set(): 1934 | name, args = work_q.get_nowait() 1935 | plug = Plugin(name, args, buf_q, lock) 1936 | plug.manage() 1937 | work_q.task_done() 1938 | except queue.Empty: 1939 | pass 1940 | 1941 | class RefreshThread(thr.Thread): 1942 | def __init__(self, lock): 1943 | super(RefreshThread, self).__init__() 1944 | self.lock = lock 1945 | self.running = True 1946 | 1947 | def run(self): 1948 | while self.running: 1949 | with self.lock: 1950 | thread_vim_command('noautocmd normal! a') 1951 | time.sleep(0.33) 1952 | 1953 | def stop(self): 1954 | self.running = False 1955 | 1956 | if G_NVIM: 1957 | def thread_vim_command(cmd): 1958 | vim.session.threadsafe_call(lambda: vim.command(cmd)) 1959 | else: 1960 | def thread_vim_command(cmd): 1961 | vim.command(cmd) 1962 | 1963 | def esc(name): 1964 | return '"' + name.replace('"', '\"') + '"' 1965 | 1966 | def nonblock_read(fname): 1967 | """ Read a file with nonblock flag. Return the last line. """ 1968 | fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) 1969 | buf = os.read(fread, 100000).decode('utf-8', 'replace') 1970 | os.close(fread) 1971 | 1972 | line = buf.rstrip('\r\n') 1973 | left = max(line.rfind('\r'), line.rfind('\n')) 1974 | if left != -1: 1975 | left += 1 1976 | line = line[left:] 1977 | 1978 | return line 1979 | 1980 | def main(): 1981 | thr.current_thread().name = 'main' 1982 | nthreads = int(vim.eval('s:update.threads')) 1983 | plugs = vim.eval('s:update.todo') 1984 | mac_gui = vim.eval('s:mac_gui') == '1' 1985 | 1986 | lock = thr.Lock() 1987 | buf = Buffer(lock, len(plugs), G_PULL) 1988 | buf_q, work_q = queue.Queue(), queue.Queue() 1989 | for work in plugs.items(): 1990 | work_q.put(work) 1991 | 1992 | start_cnt = thr.active_count() 1993 | for num in range(nthreads): 1994 | tname = 'PlugT-{0:02}'.format(num) 1995 | thread = PlugThread(tname, (buf_q, work_q, lock)) 1996 | thread.start() 1997 | if mac_gui: 1998 | rthread = RefreshThread(lock) 1999 | rthread.start() 2000 | 2001 | while not buf_q.empty() or thr.active_count() != start_cnt: 2002 | try: 2003 | action, name, msg = buf_q.get(True, 0.25) 2004 | buf.write(action, name, ['OK'] if not msg else msg) 2005 | buf_q.task_done() 2006 | except queue.Empty: 2007 | pass 2008 | except KeyboardInterrupt: 2009 | G_STOP.set() 2010 | 2011 | if mac_gui: 2012 | rthread.stop() 2013 | rthread.join() 2014 | 2015 | main() 2016 | EOF 2017 | endfunction 2018 | 2019 | function! s:update_ruby() 2020 | ruby << EOF 2021 | module PlugStream 2022 | SEP = ["\r", "\n", nil] 2023 | def get_line 2024 | buffer = '' 2025 | loop do 2026 | char = readchar rescue return 2027 | if SEP.include? char.chr 2028 | buffer << $/ 2029 | break 2030 | else 2031 | buffer << char 2032 | end 2033 | end 2034 | buffer 2035 | end 2036 | end unless defined?(PlugStream) 2037 | 2038 | def esc arg 2039 | %["#{arg.gsub('"', '\"')}"] 2040 | end 2041 | 2042 | def killall pid 2043 | pids = [pid] 2044 | if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM 2045 | pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } 2046 | else 2047 | unless `which pgrep 2> /dev/null`.empty? 2048 | children = pids 2049 | until children.empty? 2050 | children = children.map { |pid| 2051 | `pgrep -P #{pid}`.lines.map { |l| l.chomp } 2052 | }.flatten 2053 | pids += children 2054 | end 2055 | end 2056 | pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } 2057 | end 2058 | end 2059 | 2060 | def compare_git_uri a, b 2061 | regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} 2062 | regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) 2063 | end 2064 | 2065 | require 'thread' 2066 | require 'fileutils' 2067 | require 'timeout' 2068 | running = true 2069 | iswin = VIM::evaluate('s:is_win').to_i == 1 2070 | pull = VIM::evaluate('s:update.pull').to_i == 1 2071 | base = VIM::evaluate('g:plug_home') 2072 | all = VIM::evaluate('s:update.todo') 2073 | limit = VIM::evaluate('get(g:, "plug_timeout", 60)') 2074 | tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 2075 | nthr = VIM::evaluate('s:update.threads').to_i 2076 | maxy = VIM::evaluate('winheight(".")').to_i 2077 | vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ 2078 | cd = iswin ? 'cd /d' : 'cd' 2079 | tot = VIM::evaluate('len(s:update.todo)') || 0 2080 | bar = '' 2081 | skip = 'Already installed' 2082 | mtx = Mutex.new 2083 | take1 = proc { mtx.synchronize { running && all.shift } } 2084 | logh = proc { 2085 | cnt = bar.length 2086 | $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" 2087 | $curbuf[2] = '[' + bar.ljust(tot) + ']' 2088 | VIM::command('normal! 2G') 2089 | VIM::command('redraw') 2090 | } 2091 | where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } 2092 | log = proc { |name, result, type| 2093 | mtx.synchronize do 2094 | ing = ![true, false].include?(type) 2095 | bar += type ? '=' : 'x' unless ing 2096 | b = case type 2097 | when :install then '+' when :update then '*' 2098 | when true, nil then '-' else 2099 | VIM::command("call add(s:update.errors, '#{name}')") 2100 | 'x' 2101 | end 2102 | result = 2103 | if type || type.nil? 2104 | ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] 2105 | elsif result =~ /^Interrupted|^Timeout/ 2106 | ["#{b} #{name}: #{result}"] 2107 | else 2108 | ["#{b} #{name}"] + result.lines.map { |l| " " << l } 2109 | end 2110 | if lnum = where.call(name) 2111 | $curbuf.delete lnum 2112 | lnum = 4 if ing && lnum > maxy 2113 | end 2114 | result.each_with_index do |line, offset| 2115 | $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) 2116 | end 2117 | logh.call 2118 | end 2119 | } 2120 | bt = proc { |cmd, name, type, cleanup| 2121 | tried = timeout = 0 2122 | begin 2123 | tried += 1 2124 | timeout += limit 2125 | fd = nil 2126 | data = '' 2127 | if iswin 2128 | Timeout::timeout(timeout) do 2129 | tmp = VIM::evaluate('tempname()') 2130 | system("(#{cmd}) > #{tmp}") 2131 | data = File.read(tmp).chomp 2132 | File.unlink tmp rescue nil 2133 | end 2134 | else 2135 | fd = IO.popen(cmd).extend(PlugStream) 2136 | first_line = true 2137 | log_prob = 1.0 / nthr 2138 | while line = Timeout::timeout(timeout) { fd.get_line } 2139 | data << line 2140 | log.call name, line.chomp, type if name && (first_line || rand < log_prob) 2141 | first_line = false 2142 | end 2143 | fd.close 2144 | end 2145 | [$? == 0, data.chomp] 2146 | rescue Timeout::Error, Interrupt => e 2147 | if fd && !fd.closed? 2148 | killall fd.pid 2149 | fd.close 2150 | end 2151 | cleanup.call if cleanup 2152 | if e.is_a?(Timeout::Error) && tried < tries 2153 | 3.downto(1) do |countdown| 2154 | s = countdown > 1 ? 's' : '' 2155 | log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type 2156 | sleep 1 2157 | end 2158 | log.call name, 'Retrying ...', type 2159 | retry 2160 | end 2161 | [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] 2162 | end 2163 | } 2164 | main = Thread.current 2165 | threads = [] 2166 | watcher = Thread.new { 2167 | if vim7 2168 | while VIM::evaluate('getchar(1)') 2169 | sleep 0.1 2170 | end 2171 | else 2172 | require 'io/console' # >= Ruby 1.9 2173 | nil until IO.console.getch == 3.chr 2174 | end 2175 | mtx.synchronize do 2176 | running = false 2177 | threads.each { |t| t.raise Interrupt } unless vim7 2178 | end 2179 | threads.each { |t| t.join rescue nil } 2180 | main.kill 2181 | } 2182 | refresh = Thread.new { 2183 | while true 2184 | mtx.synchronize do 2185 | break unless running 2186 | VIM::command('noautocmd normal! a') 2187 | end 2188 | sleep 0.2 2189 | end 2190 | } if VIM::evaluate('s:mac_gui') == 1 2191 | 2192 | clone_opt = VIM::evaluate('s:clone_opt').join(' ') 2193 | progress = VIM::evaluate('s:progress_opt(1)') 2194 | nthr.times do 2195 | mtx.synchronize do 2196 | threads << Thread.new { 2197 | while pair = take1.call 2198 | name = pair.first 2199 | dir, uri, tag = pair.last.values_at *%w[dir uri tag] 2200 | exists = File.directory? dir 2201 | ok, result = 2202 | if exists 2203 | chdir = "#{cd} #{iswin ? dir : esc(dir)}" 2204 | ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil 2205 | current_uri = data.lines.to_a.last 2206 | if !ret 2207 | if data =~ /^Interrupted|^Timeout/ 2208 | [false, data] 2209 | else 2210 | [false, [data.chomp, "PlugClean required."].join($/)] 2211 | end 2212 | elsif !compare_git_uri(current_uri, uri) 2213 | [false, ["Invalid URI: #{current_uri}", 2214 | "Expected: #{uri}", 2215 | "PlugClean required."].join($/)] 2216 | else 2217 | if pull 2218 | log.call name, 'Updating ...', :update 2219 | fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' 2220 | bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil 2221 | else 2222 | [true, skip] 2223 | end 2224 | end 2225 | else 2226 | d = esc dir.sub(%r{[\\/]+$}, '') 2227 | log.call name, 'Installing ...', :install 2228 | bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { 2229 | FileUtils.rm_rf dir 2230 | } 2231 | end 2232 | mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok 2233 | log.call name, result, ok 2234 | end 2235 | } if running 2236 | end 2237 | end 2238 | threads.each { |t| t.join rescue nil } 2239 | logh.call 2240 | refresh.kill if refresh 2241 | watcher.kill 2242 | EOF 2243 | endfunction 2244 | 2245 | function! s:shellesc_cmd(arg, script) 2246 | let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') 2247 | return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') 2248 | endfunction 2249 | 2250 | function! s:shellesc_ps1(arg) 2251 | return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" 2252 | endfunction 2253 | 2254 | function! s:shellesc_sh(arg) 2255 | return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" 2256 | endfunction 2257 | 2258 | " Escape the shell argument based on the shell. 2259 | " Vim and Neovim's shellescape() are insufficient. 2260 | " 1. shellslash determines whether to use single/double quotes. 2261 | " Double-quote escaping is fragile for cmd.exe. 2262 | " 2. It does not work for powershell. 2263 | " 3. It does not work for *sh shells if the command is executed 2264 | " via cmd.exe (ie. cmd.exe /c sh -c command command_args) 2265 | " 4. It does not support batchfile syntax. 2266 | " 2267 | " Accepts an optional dictionary with the following keys: 2268 | " - shell: same as Vim/Neovim 'shell' option. 2269 | " If unset, fallback to 'cmd.exe' on Windows or 'sh'. 2270 | " - script: If truthy and shell is cmd.exe, escape for batchfile syntax. 2271 | function! plug#shellescape(arg, ...) 2272 | if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' 2273 | return a:arg 2274 | endif 2275 | let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} 2276 | let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') 2277 | let script = get(opts, 'script', 1) 2278 | if shell =~# 'cmd\(\.exe\)\?$' 2279 | return s:shellesc_cmd(a:arg, script) 2280 | elseif s:is_powershell(shell) 2281 | return s:shellesc_ps1(a:arg) 2282 | endif 2283 | return s:shellesc_sh(a:arg) 2284 | endfunction 2285 | 2286 | function! s:glob_dir(path) 2287 | return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') 2288 | endfunction 2289 | 2290 | function! s:progress_bar(line, bar, total) 2291 | call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') 2292 | endfunction 2293 | 2294 | function! s:compare_git_uri(a, b) 2295 | " See `git help clone' 2296 | " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] 2297 | " [git@] github.com[:port] : junegunn/vim-plug [.git] 2298 | " file:// / junegunn/vim-plug [/] 2299 | " / junegunn/vim-plug [/] 2300 | let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' 2301 | let ma = matchlist(a:a, pat) 2302 | let mb = matchlist(a:b, pat) 2303 | return ma[1:2] ==# mb[1:2] 2304 | endfunction 2305 | 2306 | function! s:format_message(bullet, name, message) 2307 | if a:bullet != 'x' 2308 | return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] 2309 | else 2310 | let lines = map(s:lines(a:message), '" ".v:val') 2311 | return extend([printf('x %s:', a:name)], lines) 2312 | endif 2313 | endfunction 2314 | 2315 | function! s:with_cd(cmd, dir, ...) 2316 | let script = a:0 > 0 ? a:1 : 1 2317 | let pwsh = s:is_powershell(&shell) 2318 | let cd = s:is_win && !pwsh ? 'cd /d' : 'cd' 2319 | let sep = pwsh ? ';' : '&&' 2320 | return printf('%s %s %s %s', cd, plug#shellescape(a:dir, {'script': script, 'shell': &shell}), sep, a:cmd) 2321 | endfunction 2322 | 2323 | function! s:system(cmd, ...) 2324 | let batchfile = '' 2325 | try 2326 | let [sh, shellcmdflag, shrd] = s:chsh(1) 2327 | if type(a:cmd) == s:TYPE.list 2328 | " Neovim's system() supports list argument to bypass the shell 2329 | " but it cannot set the working directory for the command. 2330 | " Assume that the command does not rely on the shell. 2331 | if has('nvim') && a:0 == 0 2332 | return system(a:cmd) 2333 | endif 2334 | let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) 2335 | if s:is_powershell(&shell) 2336 | let cmd = '& ' . cmd 2337 | endif 2338 | else 2339 | let cmd = a:cmd 2340 | endif 2341 | if a:0 > 0 2342 | let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) 2343 | endif 2344 | if s:is_win && type(a:cmd) != s:TYPE.list 2345 | let [batchfile, cmd] = s:batchfile(cmd) 2346 | endif 2347 | return system(cmd) 2348 | finally 2349 | let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] 2350 | if s:is_win && filereadable(batchfile) 2351 | call delete(batchfile) 2352 | endif 2353 | endtry 2354 | endfunction 2355 | 2356 | function! s:system_chomp(...) 2357 | let ret = call('s:system', a:000) 2358 | return v:shell_error ? '' : substitute(ret, '\n$', '', '') 2359 | endfunction 2360 | 2361 | function! s:git_validate(spec, check_branch) 2362 | let err = '' 2363 | if isdirectory(a:spec.dir) 2364 | let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] 2365 | let remote = result[-1] 2366 | if empty(remote) 2367 | let err = join([remote, 'PlugClean required.'], "\n") 2368 | elseif !s:compare_git_uri(remote, a:spec.uri) 2369 | let err = join(['Invalid URI: '.remote, 2370 | \ 'Expected: '.a:spec.uri, 2371 | \ 'PlugClean required.'], "\n") 2372 | elseif a:check_branch && has_key(a:spec, 'commit') 2373 | let sha = s:git_revision(a:spec.dir) 2374 | if empty(sha) 2375 | let err = join(add(result, 'PlugClean required.'), "\n") 2376 | elseif !s:hash_match(sha, a:spec.commit) 2377 | let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', 2378 | \ a:spec.commit[:6], sha[:6]), 2379 | \ 'PlugUpdate required.'], "\n") 2380 | endif 2381 | elseif a:check_branch 2382 | let current_branch = result[0] 2383 | " Check tag 2384 | let origin_branch = s:git_origin_branch(a:spec) 2385 | if has_key(a:spec, 'tag') 2386 | let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) 2387 | if a:spec.tag !=# tag && a:spec.tag !~ '\*' 2388 | let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', 2389 | \ (empty(tag) ? 'N/A' : tag), a:spec.tag) 2390 | endif 2391 | " Check branch 2392 | elseif origin_branch !=# current_branch 2393 | let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', 2394 | \ current_branch, origin_branch) 2395 | endif 2396 | if empty(err) 2397 | let ahead_behind = split(s:lastline(s:system([ 2398 | \ 'git', 'rev-list', '--count', '--left-right', 2399 | \ printf('HEAD...origin/%s', origin_branch) 2400 | \ ], a:spec.dir)), '\t') 2401 | if v:shell_error || len(ahead_behind) != 2 2402 | let err = "Failed to compare with the origin. The default branch might have changed.\nPlugClean required." 2403 | else 2404 | let [ahead, behind] = ahead_behind 2405 | if ahead && behind 2406 | " Only mention PlugClean if diverged, otherwise it's likely to be 2407 | " pushable (and probably not that messed up). 2408 | let err = printf( 2409 | \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" 2410 | \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) 2411 | elseif ahead 2412 | let err = printf("Ahead of origin/%s by %d commit(s).\n" 2413 | \ .'Cannot update until local changes are pushed.', 2414 | \ origin_branch, ahead) 2415 | endif 2416 | endif 2417 | endif 2418 | endif 2419 | else 2420 | let err = 'Not found' 2421 | endif 2422 | return [err, err =~# 'PlugClean'] 2423 | endfunction 2424 | 2425 | function! s:rm_rf(dir) 2426 | if isdirectory(a:dir) 2427 | return s:system(s:is_win 2428 | \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) 2429 | \ : ['rm', '-rf', a:dir]) 2430 | endif 2431 | endfunction 2432 | 2433 | function! s:clean(force) 2434 | call s:prepare() 2435 | call append(0, 'Searching for invalid plugins in '.g:plug_home) 2436 | call append(1, '') 2437 | 2438 | " List of valid directories 2439 | let dirs = [] 2440 | let errs = {} 2441 | let [cnt, total] = [0, len(g:plugs)] 2442 | for [name, spec] in items(g:plugs) 2443 | if !s:is_managed(name) || get(spec, 'frozen', 0) 2444 | call add(dirs, spec.dir) 2445 | else 2446 | let [err, clean] = s:git_validate(spec, 1) 2447 | if clean 2448 | let errs[spec.dir] = s:lines(err)[0] 2449 | else 2450 | call add(dirs, spec.dir) 2451 | endif 2452 | endif 2453 | let cnt += 1 2454 | call s:progress_bar(2, repeat('=', cnt), total) 2455 | normal! 2G 2456 | redraw 2457 | endfor 2458 | 2459 | let allowed = {} 2460 | for dir in dirs 2461 | let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 2462 | let allowed[dir] = 1 2463 | for child in s:glob_dir(dir) 2464 | let allowed[child] = 1 2465 | endfor 2466 | endfor 2467 | 2468 | let todo = [] 2469 | let found = sort(s:glob_dir(g:plug_home)) 2470 | while !empty(found) 2471 | let f = remove(found, 0) 2472 | if !has_key(allowed, f) && isdirectory(f) 2473 | call add(todo, f) 2474 | call append(line('$'), '- ' . f) 2475 | if has_key(errs, f) 2476 | call append(line('$'), ' ' . errs[f]) 2477 | endif 2478 | let found = filter(found, 'stridx(v:val, f) != 0') 2479 | end 2480 | endwhile 2481 | 2482 | 4 2483 | redraw 2484 | if empty(todo) 2485 | call append(line('$'), 'Already clean.') 2486 | else 2487 | let s:clean_count = 0 2488 | call append(3, ['Directories to delete:', '']) 2489 | redraw! 2490 | if a:force || s:ask_no_interrupt('Delete all directories?') 2491 | call s:delete([6, line('$')], 1) 2492 | else 2493 | call setline(4, 'Cancelled.') 2494 | nnoremap d :set opfunc=delete_opg@ 2495 | nmap dd d_ 2496 | xnoremap d :call delete_op(visualmode(), 1) 2497 | echo 'Delete the lines (d{motion}) to delete the corresponding directories' 2498 | endif 2499 | endif 2500 | 4 2501 | setlocal nomodifiable 2502 | endfunction 2503 | 2504 | function! s:delete_op(type, ...) 2505 | call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) 2506 | endfunction 2507 | 2508 | function! s:delete(range, force) 2509 | let [l1, l2] = a:range 2510 | let force = a:force 2511 | let err_count = 0 2512 | while l1 <= l2 2513 | let line = getline(l1) 2514 | if line =~ '^- ' && isdirectory(line[2:]) 2515 | execute l1 2516 | redraw! 2517 | let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) 2518 | let force = force || answer > 1 2519 | if answer 2520 | let err = s:rm_rf(line[2:]) 2521 | setlocal modifiable 2522 | if empty(err) 2523 | call setline(l1, '~'.line[1:]) 2524 | let s:clean_count += 1 2525 | else 2526 | delete _ 2527 | call append(l1 - 1, s:format_message('x', line[1:], err)) 2528 | let l2 += len(s:lines(err)) 2529 | let err_count += 1 2530 | endif 2531 | let msg = printf('Removed %d directories.', s:clean_count) 2532 | if err_count > 0 2533 | let msg .= printf(' Failed to remove %d directories.', err_count) 2534 | endif 2535 | call setline(4, msg) 2536 | setlocal nomodifiable 2537 | endif 2538 | endif 2539 | let l1 += 1 2540 | endwhile 2541 | endfunction 2542 | 2543 | function! s:upgrade() 2544 | echo 'Downloading the latest version of vim-plug' 2545 | redraw 2546 | let tmp = s:plug_tempname() 2547 | let new = tmp . '/plug.vim' 2548 | 2549 | try 2550 | let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) 2551 | if v:shell_error 2552 | return s:err('Error upgrading vim-plug: '. out) 2553 | endif 2554 | 2555 | if readfile(s:me) ==# readfile(new) 2556 | echo 'vim-plug is already up-to-date' 2557 | return 0 2558 | else 2559 | call rename(s:me, s:me . '.old') 2560 | call rename(new, s:me) 2561 | unlet g:loaded_plug 2562 | echo 'vim-plug has been upgraded' 2563 | return 1 2564 | endif 2565 | finally 2566 | silent! call s:rm_rf(tmp) 2567 | endtry 2568 | endfunction 2569 | 2570 | function! s:upgrade_specs() 2571 | for spec in values(g:plugs) 2572 | let spec.frozen = get(spec, 'frozen', 0) 2573 | endfor 2574 | endfunction 2575 | 2576 | function! s:status() 2577 | call s:prepare() 2578 | call append(0, 'Checking plugins') 2579 | call append(1, '') 2580 | 2581 | let ecnt = 0 2582 | let unloaded = 0 2583 | let [cnt, total] = [0, len(g:plugs)] 2584 | for [name, spec] in items(g:plugs) 2585 | let is_dir = isdirectory(spec.dir) 2586 | if has_key(spec, 'uri') 2587 | if is_dir 2588 | let [err, _] = s:git_validate(spec, 1) 2589 | let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] 2590 | else 2591 | let [valid, msg] = [0, 'Not found. Try PlugInstall.'] 2592 | endif 2593 | else 2594 | if is_dir 2595 | let [valid, msg] = [1, 'OK'] 2596 | else 2597 | let [valid, msg] = [0, 'Not found.'] 2598 | endif 2599 | endif 2600 | let cnt += 1 2601 | let ecnt += !valid 2602 | " `s:loaded` entry can be missing if PlugUpgraded 2603 | if is_dir && get(s:loaded, name, -1) == 0 2604 | let unloaded = 1 2605 | let msg .= ' (not loaded)' 2606 | endif 2607 | call s:progress_bar(2, repeat('=', cnt), total) 2608 | call append(3, s:format_message(valid ? '-' : 'x', name, msg)) 2609 | normal! 2G 2610 | redraw 2611 | endfor 2612 | call setline(1, 'Finished. '.ecnt.' error(s).') 2613 | normal! gg 2614 | setlocal nomodifiable 2615 | if unloaded 2616 | echo "Press 'L' on each line to load plugin, or 'U' to update" 2617 | nnoremap L :call status_load(line('.')) 2618 | xnoremap L :call status_load(line('.')) 2619 | end 2620 | endfunction 2621 | 2622 | function! s:extract_name(str, prefix, suffix) 2623 | return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') 2624 | endfunction 2625 | 2626 | function! s:status_load(lnum) 2627 | let line = getline(a:lnum) 2628 | let name = s:extract_name(line, '-', '(not loaded)') 2629 | if !empty(name) 2630 | call plug#load(name) 2631 | setlocal modifiable 2632 | call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) 2633 | setlocal nomodifiable 2634 | endif 2635 | endfunction 2636 | 2637 | function! s:status_update() range 2638 | let lines = getline(a:firstline, a:lastline) 2639 | let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') 2640 | if !empty(names) 2641 | echo 2642 | execute 'PlugUpdate' join(names) 2643 | endif 2644 | endfunction 2645 | 2646 | function! s:is_preview_window_open() 2647 | silent! wincmd P 2648 | if &previewwindow 2649 | wincmd p 2650 | return 1 2651 | endif 2652 | endfunction 2653 | 2654 | function! s:find_name(lnum) 2655 | for lnum in reverse(range(1, a:lnum)) 2656 | let line = getline(lnum) 2657 | if empty(line) 2658 | return '' 2659 | endif 2660 | let name = s:extract_name(line, '-', '') 2661 | if !empty(name) 2662 | return name 2663 | endif 2664 | endfor 2665 | return '' 2666 | endfunction 2667 | 2668 | function! s:preview_commit() 2669 | if b:plug_preview < 0 2670 | let b:plug_preview = !s:is_preview_window_open() 2671 | endif 2672 | 2673 | let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') 2674 | if empty(sha) 2675 | let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$') 2676 | if empty(name) 2677 | return 2678 | endif 2679 | let title = 'HEAD@{1}..' 2680 | let command = 'git diff --no-color HEAD@{1}' 2681 | else 2682 | let title = sha 2683 | let command = 'git show --no-color --pretty=medium '.sha 2684 | let name = s:find_name(line('.')) 2685 | endif 2686 | 2687 | if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) 2688 | return 2689 | endif 2690 | 2691 | if !s:is_preview_window_open() 2692 | execute get(g:, 'plug_pwindow', 'vertical rightbelow new') 2693 | execute 'e' title 2694 | else 2695 | execute 'pedit' title 2696 | wincmd P 2697 | endif 2698 | setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable 2699 | let batchfile = '' 2700 | try 2701 | let [sh, shellcmdflag, shrd] = s:chsh(1) 2702 | let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command 2703 | if s:is_win 2704 | let [batchfile, cmd] = s:batchfile(cmd) 2705 | endif 2706 | execute 'silent %!' cmd 2707 | finally 2708 | let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] 2709 | if s:is_win && filereadable(batchfile) 2710 | call delete(batchfile) 2711 | endif 2712 | endtry 2713 | setlocal nomodifiable 2714 | nnoremap q :q 2715 | wincmd p 2716 | endfunction 2717 | 2718 | function! s:section(flags) 2719 | call search('\(^[x-] \)\@<=[^:]\+:', a:flags) 2720 | endfunction 2721 | 2722 | function! s:format_git_log(line) 2723 | let indent = ' ' 2724 | let tokens = split(a:line, nr2char(1)) 2725 | if len(tokens) != 5 2726 | return indent.substitute(a:line, '\s*$', '', '') 2727 | endif 2728 | let [graph, sha, refs, subject, date] = tokens 2729 | let tag = matchstr(refs, 'tag: [^,)]\+') 2730 | let tag = empty(tag) ? ' ' : ' ('.tag.') ' 2731 | return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) 2732 | endfunction 2733 | 2734 | function! s:append_ul(lnum, text) 2735 | call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) 2736 | endfunction 2737 | 2738 | function! s:diff() 2739 | call s:prepare() 2740 | call append(0, ['Collecting changes ...', '']) 2741 | let cnts = [0, 0] 2742 | let bar = '' 2743 | let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') 2744 | call s:progress_bar(2, bar, len(total)) 2745 | for origin in [1, 0] 2746 | let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) 2747 | if empty(plugs) 2748 | continue 2749 | endif 2750 | call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') 2751 | for [k, v] in plugs 2752 | let branch = s:git_origin_branch(v) 2753 | if len(branch) 2754 | let range = origin ? '..origin/'.branch : 'HEAD@{1}..' 2755 | let cmd = ['git', 'log', '--graph', '--color=never'] 2756 | if s:git_version_requirement(2, 10, 0) 2757 | call add(cmd, '--no-show-signature') 2758 | endif 2759 | call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) 2760 | if has_key(v, 'rtp') 2761 | call extend(cmd, ['--', v.rtp]) 2762 | endif 2763 | let diff = s:system_chomp(cmd, v.dir) 2764 | if !empty(diff) 2765 | let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' 2766 | call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) 2767 | let cnts[origin] += 1 2768 | endif 2769 | endif 2770 | let bar .= '=' 2771 | call s:progress_bar(2, bar, len(total)) 2772 | normal! 2G 2773 | redraw 2774 | endfor 2775 | if !cnts[origin] 2776 | call append(5, ['', 'N/A']) 2777 | endif 2778 | endfor 2779 | call setline(1, printf('%d plugin(s) updated.', cnts[0]) 2780 | \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) 2781 | 2782 | if cnts[0] || cnts[1] 2783 | nnoremap (plug-preview) :silent! call preview_commit() 2784 | if empty(maparg("\", 'n')) 2785 | nmap (plug-preview) 2786 | endif 2787 | if empty(maparg('o', 'n')) 2788 | nmap o (plug-preview) 2789 | endif 2790 | endif 2791 | if cnts[0] 2792 | nnoremap X :call revert() 2793 | echo "Press 'X' on each block to revert the update" 2794 | endif 2795 | normal! gg 2796 | setlocal nomodifiable 2797 | endfunction 2798 | 2799 | function! s:revert() 2800 | if search('^Pending updates', 'bnW') 2801 | return 2802 | endif 2803 | 2804 | let name = s:find_name(line('.')) 2805 | if empty(name) || !has_key(g:plugs, name) || 2806 | \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' 2807 | return 2808 | endif 2809 | 2810 | call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) 2811 | setlocal modifiable 2812 | normal! "_dap 2813 | setlocal nomodifiable 2814 | echo 'Reverted' 2815 | endfunction 2816 | 2817 | function! s:snapshot(force, ...) abort 2818 | call s:prepare() 2819 | setf vim 2820 | call append(0, ['" Generated by vim-plug', 2821 | \ '" '.strftime("%c"), 2822 | \ '" :source this file in vim to restore the snapshot', 2823 | \ '" or execute: vim -S snapshot.vim', 2824 | \ '', '', 'PlugUpdate!']) 2825 | 1 2826 | let anchor = line('$') - 3 2827 | let names = sort(keys(filter(copy(g:plugs), 2828 | \'has_key(v:val, "uri") && isdirectory(v:val.dir)'))) 2829 | for name in reverse(names) 2830 | let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir) 2831 | if !empty(sha) 2832 | call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) 2833 | redraw 2834 | endif 2835 | endfor 2836 | 2837 | if a:0 > 0 2838 | let fn = s:plug_expand(a:1) 2839 | if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) 2840 | return 2841 | endif 2842 | call writefile(getline(1, '$'), fn) 2843 | echo 'Saved as '.a:1 2844 | silent execute 'e' s:esc(fn) 2845 | setf vim 2846 | endif 2847 | endfunction 2848 | 2849 | function! s:split_rtp() 2850 | return split(&rtp, '\\\@": "noop", 59 | 60 | "*": "toggleSelection", 61 | "m": ["wait", "actionMenu"], 62 | 63 | "gk": ["wait", "expandablePrev"], 64 | "gj": ["wait", "expandableNext"], 65 | "h": ["wait", "collapse"], 66 | "l": ["wait", "expandable?", "expand", "open"], 67 | "J": ["wait", "toggleSelection", "normal:j"], 68 | "K": ["wait", "toggleSelection", "normal:k"], 69 | "gl": ["wait", "expand:recursive"], 70 | "gh": ["wait", "collapse:recursive"], 71 | "o": ["wait", "open"], 72 | "": ["expandable?", ["expanded?", "collapse", "expand"], "open"], 73 | "e": "open", 74 | "es": "open:split", 75 | "ev": "open:vsplit", 76 | "et": "open:tab", 77 | "": ["wait", "gotoParent"], 78 | "gs": ["wait", "reveal:select"], 79 | "il": "preview:labeling", 80 | "ic": "preview:content", 81 | "Il": "previewOnHover:toggle:labeling", 82 | "Ic": "previewOnHover:toggle:content", 83 | "II": "previewOnHover:disable", 84 | 85 | "yp": "copyFilepath", 86 | "yn": "copyFilename", 87 | "yy": "copyFile", 88 | "dd": "cutFile", 89 | "p": "pasteFile", 90 | "df": "delete", 91 | "dF": "deleteForever", 92 | 93 | "a": "addFile", 94 | "A": "addDirectory", 95 | "r": "rename", 96 | 97 | "zh": "toggleHidden", 98 | "g": "toggleHidden", 99 | "R": "refresh", 100 | 101 | "?": "help", 102 | "q": "quit", 103 | "": "esc", 104 | "X": "systemExecute", 105 | "gd": "listDrive", 106 | 107 | "f": "search", 108 | "F": "searchRecursive", 109 | 110 | "gf": "gotoSource:file", 111 | "gb": "gotoSource:buffer", 112 | 113 | "[[": ["wait", "sourcePrev"], 114 | "]]": ["wait", "sourceNext"], 115 | 116 | "[i": ["wait", "indentPrev"], 117 | "]i": ["wait", "indentNext"], 118 | 119 | "[m": ["wait", "markPrev:modified"], 120 | "]m": ["wait", "markNext:modified"], 121 | 122 | "[d": ["wait", "markPrev:diagnosticError:diagnosticWarning"], 123 | "]d": ["wait", "markNext:diagnosticError:diagnosticWarning"], 124 | "[D": ["wait", "markPrev:diagnosticError"], 125 | "]D": ["wait", "markNext:diagnosticError"], 126 | 127 | "[c": ["wait", "markPrev:git"], 128 | "]c": ["wait", "markNext:git"], 129 | "<<": "gitStage", 130 | ">>": "gitUnstage" 131 | }, 132 | "cSpell.userWords": ["rssi", "wifi"] 133 | } 134 | -------------------------------------------------------------------------------- /colors/.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/derekstavis/vimfiles/d61d279d2a05ab8d5b6f3a3f4ce9f57027d1a947/colors/.swp -------------------------------------------------------------------------------- /colors/default.vim: -------------------------------------------------------------------------------- 1 | " Vim color file 2 | " Maintainer: Bram Moolenaar 3 | " Last Change: 2001 Jul 23 4 | 5 | " This is the default color scheme. It doesn't define the Normal 6 | " highlighting, it uses whatever the colors used to be. 7 | 8 | " Set 'background' back to the default. The value can't always be estimated 9 | " and is then guessed. 10 | hi clear Normal 11 | set bg& 12 | 13 | " Remove all existing highlighting and set the defaults. 14 | hi clear 15 | 16 | " Load the syntax highlighting defaults, if it's enabled. 17 | if exists("syntax_on") 18 | syntax reset 19 | endif 20 | 21 | let colors_name = "default" 22 | 23 | " vim: sw=2 24 | -------------------------------------------------------------------------------- /colors/emacs.vim: -------------------------------------------------------------------------------- 1 | " Vim color file 2 | " Maintainer: Michael Piefel 3 | " Last Change: 2001 Aug 16 4 | " Licence: Public Domain 5 | 6 | " This color scheme uses a White background. It's based on Bram's 7 | " morning theme, but doesn't try to work for non-GUI editing. 8 | " 9 | " It's supposed to look like the Emacs standard colors, at least 10 | " for C. But Emacs has different categories, so it's not very good. 11 | 12 | " First remove all existing highlighting. 13 | set background=light 14 | hi clear 15 | if exists("syntax_on") 16 | syntax reset 17 | endif 18 | 19 | let colors_name = "emacs" 20 | 21 | hi Normal guifg=Black guibg=White 22 | 23 | " Groups used in the 'highlight' and 'guicursor' options default value. 24 | hi ErrorMsg guibg=Red guifg=White 25 | hi IncSearch gui=reverse 26 | hi ModeMsg gui=bold 27 | hi StatusLine gui=reverse,bold 28 | hi StatusLineNC gui=reverse 29 | hi VertSplit gui=reverse 30 | hi Visual gui=reverse guifg=Grey guibg=fg 31 | hi VisualNOS gui=underline,bold 32 | hi DiffText gui=bold guibg=Red 33 | hi Cursor guibg=Black guifg=NONE 34 | hi lCursor guibg=Cyan guifg=NONE 35 | hi Directory guifg=Blue 36 | hi LineNr guifg=Brown 37 | hi MoreMsg gui=bold guifg=SeaGreen 38 | hi NonText gui=bold guifg=Blue guibg=grey90 39 | hi Question gui=bold guifg=SeaGreen 40 | hi Search guibg=Yellow guifg=NONE 41 | hi SpecialKey guifg=Blue 42 | hi Title gui=bold guifg=Magenta 43 | hi WarningMsg guifg=Red 44 | hi WildMenu guibg=Yellow guifg=Black 45 | hi Folded guibg=White guifg=DarkBlue 46 | hi FoldColumn guibg=Grey guifg=DarkBlue 47 | hi DiffAdd guibg=LightBlue 48 | hi DiffChange guibg=LightMagenta 49 | hi DiffDelete gui=bold guifg=Blue guibg=LightCyan 50 | 51 | " Colors for syntax highlighting 52 | hi Comment guifg=#AC2020 guibg=White 53 | hi Constant guifg=#C28F8F guibg=White 54 | hi PreProc guifg=#D569D5 guibg=White 55 | hi Statement gui=NONE guifg=#9C20EE guibg=White 56 | hi Type guifg=#9C20EE guibg=White 57 | hi Special guifg=SlateBlue guibg=White 58 | hi Ignore guifg=White 59 | 60 | " Some specials (override hilinks) 61 | 62 | 63 | " vim: sw=2 64 | -------------------------------------------------------------------------------- /colors/pink.vim: -------------------------------------------------------------------------------- 1 | " Maintainer: paddynewman@gmail.com 2 | " License: BSD 3 | 4 | if &t_Co != 256 && !has("gui_running") 5 | echomsg "" 6 | echomsg "write 'set t_Co=256' in your .vimrc or this file won't load" 7 | echomsg "" 8 | finish 9 | endif 10 | 11 | set background=dark 12 | hi clear 13 | if exists("syntax_on") 14 | syntax reset 15 | endif 16 | 17 | let g:colors_name = "pink" 18 | let s:save_cpo = &cpo 19 | set cpo&vim 20 | 21 | let s:colors256 = [ 22 | \ ["Normal", "NONE", "238", "225" ], 23 | \ ["Cursor", "NONE", "NONE", "160" ], 24 | \ ["CursorLine", "NONE", "NONE", "222" ], 25 | \ ["CursorColumn", "NONE", "NONE", "223" ], 26 | \ ["Incsearch", "NONE", "NONE", "11" ], 27 | \ ["Search", "NONE", "NONE", "11" ], 28 | \ ["ErrorMsg", "BOLD", "16", "9" ], 29 | \ ["WarningMsg", "BOLD", "16", "11" ], 30 | \ ["ModeMsg", "BOLD", "NONE", "11" ], 31 | \ ["MoreMsg", "BOLD", "16", "11" ], 32 | \ ["Question", "BOLD", "27", "NONE" ], 33 | \ ["StatusLine", "NONE", "0", "219" ], 34 | \ ["StatusLineNC", "NONE", "238", "219" ], 35 | \ ["User1", "BOLD", "28", "NONE" ], 36 | \ ["User2", "BOLD", "39", "NONE" ], 37 | \ ["VertSplit", "NONE", "84", "22" ], 38 | \ ["WildMenu", "BOLD", "87", "35" ], 39 | \ ["DiffText", "NONE", "16", "190" ], 40 | \ ["DiffChange", "NONE", "16", "83" ], 41 | \ ["DiffDelete", "NONE", "79", "124" ], 42 | \ ["DiffAdd", "NONE", "79", "21" ], 43 | \ ["Folded", "NONE", "238", "255" ], 44 | \ ["FoldedColumn", "NONE", "238", "255" ], 45 | \ ["FoldColumn", "NONE", "225", "255" ], 46 | \ ["Directory", "NONE", "28", "NONE" ], 47 | \ ["LineNr", "NONE", "63", "228" ], 48 | \ ["NonText", "NONE", "238", "225" ], 49 | \ ["SpecialKey", "NONE", "9", "NONE" ], 50 | \ ["Title", "BOLD", "18", "NONE" ], 51 | \ ["Visual", "NONE", "NONE", "220" ], 52 | \ ["Comment", "NONE", "238", "255" ], 53 | \ ["Costant", "NONE", "58", "NONE" ], 54 | \ ["String", "NONE", "160", "NONE" ], 55 | \ ["Error", "NONE", "130", "NONE" ], 56 | \ ["Identifier", "NONE", "31", "NONE" ], 57 | \ ["Ignore", "NONE", "NONE", "NONE" ], 58 | \ ["Number", "NONE", "23", "NONE" ], 59 | \ ["PreProc", "NONE", "26", "255" ], 60 | \ ["Special", "NONE", "238", "NONE" ], 61 | \ ["SpecialChar", "NONE", "22", "NONE" ], 62 | \ ["Statement", "NONE", "36", "NONE" ], 63 | \ ["Todo", "NONE", "NONE", "229" ], 64 | \ ["Type", "NONE", "20", "NONE" ], 65 | \ ["Underlined", "BOLD", "25", "NONE" ], 66 | \ ["TaglistTagName","BOLD", "29", "118" ]] 67 | 68 | let s:colorvim7 = [ 69 | \ ["Pmenu", "NONE", "238", "219" ], 70 | \ ["PmenuSel", "NONE", "238", "11" ], 71 | \ ["PmenuSbar", "NONE", "238", "11" ], 72 | \ ["PmenuThumb", "NONE", "238", "11" ], 73 | \ ["SpellBad", "NONE", "238", "9" ], 74 | \ ["SpellRare", "NONE", "NONE", "228" ], 75 | \ ["SpellLocal", "NONE", "NONE", "224" ], 76 | \ ["SpellCap", "NONE", "NONE", "247" ], 77 | \ ["MatchParen", "NONE", "NONE", "11" ], 78 | \ ["TabLine", "NONE", "238", "219" ], 79 | \ ["TabLineSel", "NONE", "0", "225" ], 80 | \ ["TabLineFill", "NONE", "219", "219" ]] 81 | 82 | function! s:checkargs(arg) 83 | if a:arg+0 == 0 && a:arg != "0" "its a string 84 | return a:arg 85 | else 86 | return s:cmap[a:arg+0] "get rgb color based on the number 87 | endif 88 | endfunction 89 | 90 | if !has("gui_running") 91 | for s:col in s:colors256 92 | exec "hi " . s:col[0] . " cterm=" . s:col[1] . 93 | \ " ctermfg=" . s:col[2] . " ctermbg=" . s:col[3] 94 | endfor 95 | if v:version >= 700 96 | for s:col in s:colorvim7 97 | exec "hi " .s:col[0] . " cterm=" . s:col[1] . 98 | \ " ctermfg=" . s:col[2] . " ctermbg=" . s:col[3] 99 | endfor 100 | endif 101 | else 102 | let s:cmap = [ 103 | \ "#000000", "#800000", "#008000", "#808000", 104 | \ "#000080", "#800080", "#008080", "#c0c0c0", 105 | \ "#808080", "#ff0000", "#00ff00", "#ffff00", 106 | \ "#0000ff", "#ff00ff", "#00ffff", "#ffffff", 107 | \ 108 | \ "#000000", "#00005f", "#00008f", "#0000af", "#0000d7", "#0000ff", 109 | \ "#005f00", "#005f5f", "#005f8f", "#005faf", "#005fd7", "#005fff", 110 | \ "#008f00", "#008f5f", "#008f8f", "#008faf", "#008fd7", "#008fff", 111 | \ "#00af00", "#00af5f", "#00af8f", "#00afaf", "#00afd7", "#00afff", 112 | \ "#00d700", "#00d75f", "#00d78f", "#00d7af", "#00d7d7", "#00d7ff", 113 | \ "#00ff00", "#00ff5f", "#00ff8f", "#00ffaf", "#00ffd7", "#00ffff", 114 | \ "#5f0000", "#5f005f", "#5f008f", "#5f00af", "#5f00d7", "#5f00ff", 115 | \ "#5f5f00", "#5f5f5f", "#5f5f8f", "#5f5faf", "#5f5fd7", "#5f5fff", 116 | \ "#5f8f00", "#5f8f5f", "#5f8f8f", "#5f8faf", "#5f8fd7", "#5f8fff", 117 | \ "#5faf00", "#5faf5f", "#5faf8f", "#5fafaf", "#5fafd7", "#5fafff", 118 | \ "#5fd700", "#5fd75f", "#5fd78f", "#5fd7af", "#5fd7d7", "#5fd7ff", 119 | \ "#5fff00", "#5fff5f", "#5fff8f", "#5fffaf", "#5fffd7", "#5fffff", 120 | \ "#8f0000", "#8f005f", "#8f008f", "#8f00af", "#8f00d7", "#8f00ff", 121 | \ "#8f5f00", "#8f5f5f", "#8f5f8f", "#8f5faf", "#8f5fd7", "#8f5fff", 122 | \ "#8f8f00", "#8f8f5f", "#8f8f8f", "#8f8faf", "#8f8fd7", "#8f8fff", 123 | \ "#8faf00", "#8faf5f", "#8faf8f", "#8fafaf", "#8fafd7", "#8fafff", 124 | \ "#8fd700", "#8fd75f", "#8fd78f", "#8fd7af", "#8fd7d7", "#8fd7ff", 125 | \ "#8fff00", "#8fff5f", "#8fff8f", "#8fffaf", "#8fffd7", "#8fffff", 126 | \ "#af0000", "#af005f", "#af008f", "#af00af", "#af00d7", "#af00ff", 127 | \ "#af5f00", "#af5f5f", "#af5f8f", "#af5faf", "#af5fd7", "#af5fff", 128 | \ "#af8f00", "#af8f5f", "#af8f8f", "#af8faf", "#af8fd7", "#af8fff", 129 | \ "#afaf00", "#afaf5f", "#afaf8f", "#afafaf", "#afafd7", "#afafff", 130 | \ "#afd700", "#afd75f", "#afd78f", "#afd7af", "#afd7d7", "#afd7ff", 131 | \ "#afff00", "#afff5f", "#afff8f", "#afffaf", "#afffd7", "#afffff", 132 | \ "#d70000", "#d7005f", "#d7008f", "#d700af", "#d700d7", "#d700ff", 133 | \ "#d75f00", "#d75f5f", "#d75f8f", "#d75faf", "#d75fd7", "#d75fff", 134 | \ "#d78f00", "#d78f5f", "#d78f8f", "#d78faf", "#d78fd7", "#d78fff", 135 | \ "#d7af00", "#d7af5f", "#d7af8f", "#d7afaf", "#d7afd7", "#d7afff", 136 | \ "#d7d700", "#d7d75f", "#d7d78f", "#d7d7af", "#d7d7d7", "#d7d7ff", 137 | \ "#d7ff00", "#d7ff5f", "#d7ff8f", "#d7ffaf", "#d7ffd7", "#d7ffff", 138 | \ "#ff0000", "#ff005f", "#ff008f", "#ff00af", "#ff00d7", "#ff00ff", 139 | \ "#ff5f00", "#ff5f5f", "#ff5f8f", "#ff5faf", "#ff5fd7", "#ff5fff", 140 | \ "#ff8f00", "#ff8f5f", "#ff8f8f", "#ff8faf", "#ff8fd7", "#ff8fff", 141 | \ "#ffaf00", "#ffaf5f", "#ffaf8f", "#ffafaf", "#ffafd7", "#ffafff", 142 | \ "#ffd700", "#ffd75f", "#ffd78f", "#ffd7af", "#ffd7d7", "#ffd7ff", 143 | \ "#ffff00", "#ffff5f", "#ffff8f", "#ffffaf", "#ffffd7", "#ffffff", 144 | \ 145 | \ "#080808", "#121212", "#1c1c1c", "#262626", "#303030", "#3a3a3a", 146 | \ "#444444", "#4e4e4e", "#585858", "#606060", "#666666", "#767676", 147 | \ "#808080", "#8a8a8a", "#949494", "#9e9e9e", "#a8a8a8", "#b2b2b2", 148 | \ "#bcbcbc", "#c6c6c6", "#d0d0d0", "#dadada", "#e4e4e4", "#eeeeee" ] 149 | 150 | for s:col in s:colors256 151 | let fg = s:checkargs(s:col[2]) 152 | let bg = s:checkargs(s:col[3]) 153 | exec "hi " .s:col[0] . " gui=" . s:col[1] . " guifg=" . 154 | \ fg . " guibg=" .bg 155 | endfor 156 | 157 | if v:version >= 700 158 | for s:col in s:colorvim7 159 | let fg = s:checkargs(s:col[2]) 160 | let bg = s:checkargs(s:col[3]) 161 | exec "hi " . s:col[0] . " gui=" . s:col[1] . 162 | \ " guifg=" . fg . " guibg=" . bg 163 | endfor 164 | endif 165 | endif 166 | 167 | let &cpo = s:save_cpo " restoring &cpo value 168 | 169 | -------------------------------------------------------------------------------- /colors/railscasts.vim: -------------------------------------------------------------------------------- 1 | " Vim color scheme based on http://github.com/jpo/vim-railscasts-theme 2 | " 3 | " Name: railscasts.vim 4 | " Maintainer: Ryan Bates 5 | " License: MIT 6 | 7 | set background=dark 8 | hi clear 9 | if exists("syntax_on") 10 | syntax reset 11 | endif 12 | let g:colors_name = "railscasts" 13 | 14 | " Colors 15 | " Brown #BC9357 16 | " Dark Blue #6D9CBD 17 | " Dark Green #509E50 18 | " Dark Orange #CC7733 19 | " Light Blue #CFCFFF 20 | " Light Green #A5C160 21 | " Tan #FFC66D 22 | " Red #DA4938 23 | 24 | hi Normal guifg=#E6E1DC guibg=#232323 25 | hi Cursor guibg=#FFFFFF 26 | hi CursorLine guibg=#333435 27 | hi LineNr guifg=#666666 28 | hi Visual guibg=#5A647E 29 | hi Search guifg=NONE guibg=#131313 gui=NONE 30 | hi Folded guifg=#F6F3E8 guibg=#444444 gui=NONE 31 | hi Directory guifg=#A5C160 gui=NONE 32 | hi Error guifg=#FFFFFF guibg=#990000 33 | hi MatchParen guifg=NONE guibg=#131313 34 | hi Title guifg=#E6E1DC 35 | 36 | hi Comment guifg=#BC9357 guibg=NONE gui=italic 37 | hi! link Todo Comment 38 | 39 | hi String guifg=#A5C160 40 | hi! link Number String 41 | hi! link rubyStringDelimiter String 42 | 43 | " nil, self, symbols 44 | hi Constant guifg=#6D9CBD 45 | 46 | " def, end, include, load, require, alias, super, yield, lambda, proc 47 | hi Define guifg=#CC7733 gui=NONE 48 | hi! link Include Define 49 | hi! link Keyword Define 50 | hi! link Macro Define 51 | 52 | " #{foo}, <%= bar %> 53 | hi Delimiter guifg=#509E50 54 | " hi erubyDelimiter guifg=NONE 55 | 56 | " function name (after def) 57 | hi Function guifg=#FFC66D gui=NONE 58 | 59 | "@var, @@var, $var 60 | hi Identifier guifg=#CFCFFF gui=NONE 61 | 62 | " #if, #else, #endif 63 | 64 | " case, begin, do, for, if, unless, while, until, else 65 | hi Statement guifg=#CC7733 gui=NONE 66 | hi! link PreProc Statement 67 | hi! link PreCondit Statement 68 | 69 | " SomeClassName 70 | hi Type guifg=NONE gui=NONE 71 | 72 | " has_many, respond_to, params 73 | hi railsMethod guifg=#DA4938 gui=NONE 74 | 75 | hi DiffAdd guifg=#E6E1DC guibg=#144212 76 | hi DiffDelete guifg=#E6E1DC guibg=#660000 77 | 78 | hi xmlTag guifg=#E8BF6A 79 | hi! link xmlTagName xmlTag 80 | hi! link xmlEndTag xmlTag 81 | hi! link xmlArg xmlTag 82 | hi! link htmlTag xmlTag 83 | hi! link htmlTagName xmlTagName 84 | hi! link htmlEndTag xmlEndTag 85 | hi! link htmlArg xmlArg 86 | 87 | " Popup Menu 88 | " ---------- 89 | " normal item in popup 90 | hi Pmenu guifg=#F6F3E8 guibg=#444444 gui=NONE 91 | " selected item in popup 92 | hi PmenuSel guifg=#000000 guibg=#A5C160 gui=NONE 93 | " scrollbar in popup 94 | hi PMenuSbar guibg=#5A647E gui=NONE 95 | " thumb of the scrollbar in the popup 96 | hi PMenuThumb guibg=#AAAAAA gui=NONE 97 | 98 | -------------------------------------------------------------------------------- /colors/topfunky-light.vim: -------------------------------------------------------------------------------- 1 | " Vim color file 2 | " Maintainer: Michael Piefel 3 | " Last Change: 2001 Aug 16 4 | " License: Public Domain 5 | 6 | " This color scheme uses a White background. It's based on Bram's 7 | " morning theme, but doesn't try to work for non-GUI editing. 8 | " 9 | " It's supposed to look like the Emacs standard colors, at least 10 | " for C. But Emacs has different categories, so it's not very good. 11 | 12 | " First remove all existing highlighting. 13 | set background=light 14 | hi clear 15 | if exists("syntax_on") 16 | syntax reset 17 | endif 18 | 19 | let colors_name = "topfunky-light" 20 | 21 | hi Normal guifg=#222222 guibg=White 22 | 23 | " Groups used in the 'highlight' and 'guicursor' options default value. 24 | hi ErrorMsg guibg=Red guifg=White 25 | hi IncSearch gui=reverse 26 | hi ModeMsg gui=bold 27 | hi StatusLine gui=reverse,bold guifg=#bbbbbb 28 | hi StatusLineNC gui=reverse 29 | hi VertSplit gui=reverse 30 | hi Visual gui=reverse guifg=#eeeeee guibg=fg 31 | hi VisualNOS gui=underline,bold 32 | hi DiffText gui=bold guibg=Red 33 | hi Cursor guibg=Black guifg=#cccccc 34 | hi lCursor guibg=Cyan guifg=NONE 35 | hi Directory guifg=Blue 36 | hi LineNr guifg=#dddddd 37 | hi MoreMsg gui=bold guifg=SeaGreen 38 | hi NonText gui=bold guifg=Blue guibg=grey90 39 | hi Question gui=bold guifg=SeaGreen 40 | hi Search guibg=#dddddd guifg=NONE 41 | hi SpecialKey guifg=Blue 42 | hi Title gui=bold guifg=Magenta 43 | hi WarningMsg guifg=Red 44 | hi WildMenu guibg=Yellow guifg=Black 45 | hi Folded guibg=White guifg=DarkBlue 46 | hi FoldColumn guibg=Grey guifg=DarkBlue 47 | hi DiffAdd guibg=LightBlue 48 | hi DiffChange guibg=LightMagenta 49 | hi DiffDelete gui=bold guifg=Blue guibg=LightCyan 50 | 51 | " Colors for syntax highlighting 52 | hi Comment guifg=#aaaaaa guibg=White 53 | hi Constant guifg=#0000ff guibg=White 54 | hi PreProc guifg=#c6522b guibg=White 55 | hi Statement gui=NONE guifg=#52c62b guibg=White 56 | hi Type guifg=#522bc6 guibg=White 57 | hi Special guifg=SlateBlue guibg=White 58 | hi Ignore guifg=White 59 | 60 | " Some specials (override hilinks) 61 | 62 | 63 | " vim: sw=2 64 | -------------------------------------------------------------------------------- /colors/vividchalk.vim: -------------------------------------------------------------------------------- 1 | " Vim color scheme 2 | " Name: vividchalk.vim 3 | " Author: Tim Pope 4 | " Version: 2.0 5 | " GetLatestVimScripts: 1891 1 :AutoInstall: vividchalk.vim 6 | 7 | " Based on the Vibrank Ink theme for TextMate 8 | " Distributable under the same terms as Vim itself (see :help license) 9 | 10 | if has("gui_running") 11 | set background=dark 12 | endif 13 | hi clear 14 | if exists("syntax_on") 15 | syntax reset 16 | endif 17 | 18 | let colors_name = "vividchalk" 19 | 20 | " First two functions adapted from inkpot.vim 21 | 22 | " map a urxvt cube number to an xterm-256 cube number 23 | fun! s:M(a) 24 | return strpart("0245", a:a, 1) + 0 25 | endfun 26 | 27 | " map a urxvt colour to an xterm-256 colour 28 | fun! s:X(a) 29 | if &t_Co == 88 30 | return a:a 31 | else 32 | if a:a == 8 33 | return 237 34 | elseif a:a < 16 35 | return a:a 36 | elseif a:a > 79 37 | return 232 + (3 * (a:a - 80)) 38 | else 39 | let l:b = a:a - 16 40 | let l:x = l:b % 4 41 | let l:y = (l:b / 4) % 4 42 | let l:z = (l:b / 16) 43 | return 16 + s:M(l:x) + (6 * s:M(l:y)) + (36 * s:M(l:z)) 44 | endif 45 | endif 46 | endfun 47 | 48 | function! E2T(a) 49 | return s:X(a:a) 50 | endfunction 51 | 52 | function! s:choose(mediocre,good) 53 | if &t_Co != 88 && &t_Co != 256 54 | return a:mediocre 55 | else 56 | return s:X(a:good) 57 | endif 58 | endfunction 59 | 60 | function! s:hifg(group,guifg,first,second,...) 61 | if a:0 && &t_Co == 256 62 | let ctermfg = a:1 63 | else 64 | let ctermfg = s:choose(a:first,a:second) 65 | endif 66 | exe "highlight ".a:group." guifg=".a:guifg." ctermfg=".ctermfg 67 | endfunction 68 | 69 | function! s:hibg(group,guibg,first,second) 70 | let ctermbg = s:choose(a:first,a:second) 71 | exe "highlight ".a:group." guibg=".a:guibg." ctermbg=".ctermbg 72 | endfunction 73 | 74 | hi link railsMethod PreProc 75 | hi link rubyDefine Keyword 76 | hi link rubySymbol Constant 77 | hi link rubyAccess rubyMethod 78 | hi link rubyAttribute rubyMethod 79 | hi link rubyEval rubyMethod 80 | hi link rubyException rubyMethod 81 | hi link rubyInclude rubyMethod 82 | hi link rubyStringDelimiter rubyString 83 | hi link rubyRegexp Regexp 84 | hi link rubyRegexpDelimiter rubyRegexp 85 | "hi link rubyConstant Variable 86 | "hi link rubyGlobalVariable Variable 87 | "hi link rubyClassVariable Variable 88 | "hi link rubyInstanceVariable Variable 89 | hi link javascriptRegexpString Regexp 90 | hi link javascriptNumber Number 91 | hi link javascriptNull Constant 92 | highlight link diffAdded String 93 | highlight link diffRemoved Statement 94 | highlight link diffLine PreProc 95 | highlight link diffSubname Comment 96 | 97 | call s:hifg("Normal","#EEEEEE","White",87) 98 | if &background == "light" || has("gui_running") 99 | hi Normal guibg=Black ctermbg=Black 100 | else 101 | hi Normal guibg=Black ctermbg=NONE 102 | endif 103 | highlight StatusLine guifg=Black guibg=#aabbee gui=bold ctermfg=Black ctermbg=White cterm=bold 104 | highlight StatusLineNC guifg=#444444 guibg=#aaaaaa gui=none ctermfg=Black ctermbg=Grey cterm=none 105 | "if &t_Co == 256 106 | "highlight StatusLine ctermbg=117 107 | "else 108 | "highlight StatusLine ctermbg=43 109 | "endif 110 | 111 | highlight Ignore ctermfg=Black 112 | highlight WildMenu guifg=Black guibg=#ffff00 gui=bold ctermfg=Black ctermbg=Yellow cterm=bold 113 | highlight Cursor guifg=Black guibg=White ctermfg=Black ctermbg=White 114 | highlight CursorLine guibg=#333333 guifg=NONE 115 | highlight CursorColumn guibg=#333333 guifg=NONE 116 | highlight NonText guifg=#404040 ctermfg=8 117 | highlight SpecialKey guifg=#404040 ctermfg=8 118 | highlight Directory none 119 | high link Directory Identifier 120 | highlight ErrorMsg guibg=Red ctermbg=DarkRed guifg=NONE ctermfg=NONE 121 | highlight Search guifg=NONE ctermfg=NONE gui=none cterm=none 122 | call s:hibg("Search" ,"#555555","DarkBlue",81) 123 | highlight IncSearch guifg=White guibg=Black ctermfg=White ctermbg=Black 124 | highlight MoreMsg guifg=#00AA00 ctermfg=Green 125 | highlight LineNr guifg=#DDEEFF ctermfg=White 126 | call s:hibg("LineNr" ,"#222222","DarkBlue",80) 127 | highlight Question none 128 | high link Question MoreMsg 129 | highlight Title guifg=Magenta ctermfg=Magenta 130 | highlight VisualNOS gui=none cterm=none 131 | call s:hibg("Visual" ,"#555577","LightBlue",83) 132 | call s:hibg("VisualNOS" ,"#444444","DarkBlue",81) 133 | call s:hibg("MatchParen","#1100AA","DarkBlue",18) 134 | highlight WarningMsg guifg=Red ctermfg=Red 135 | highlight Error ctermbg=DarkRed 136 | highlight SpellBad ctermbg=DarkRed 137 | " FIXME: Comments 138 | highlight SpellRare ctermbg=DarkMagenta 139 | highlight SpellCap ctermbg=DarkBlue 140 | highlight SpellLocal ctermbg=DarkCyan 141 | 142 | call s:hibg("Folded" ,"#110077","DarkBlue",17) 143 | call s:hifg("Folded" ,"#aaddee","LightCyan",63) 144 | highlight FoldColumn none 145 | high link FoldColumn Folded 146 | highlight DiffAdd ctermbg=4 guibg=DarkBlue 147 | highlight DiffChange ctermbg=5 guibg=DarkMagenta 148 | highlight DiffDelete ctermfg=12 ctermbg=6 gui=bold guifg=Blue guibg=DarkCyan 149 | highlight DiffText ctermbg=DarkRed 150 | highlight DiffText cterm=bold ctermbg=9 gui=bold guibg=Red 151 | 152 | highlight Pmenu guifg=White ctermfg=White gui=bold cterm=bold 153 | highlight PmenuSel guifg=White ctermfg=White gui=bold cterm=bold 154 | call s:hibg("Pmenu" ,"#000099","Blue",18) 155 | call s:hibg("PmenuSel" ,"#5555ff","DarkCyan",39) 156 | highlight PmenuSbar guibg=Grey ctermbg=Grey 157 | highlight PmenuThumb guibg=White ctermbg=White 158 | highlight TabLine gui=underline cterm=underline 159 | call s:hifg("TabLine" ,"#bbbbbb","LightGrey",85) 160 | call s:hibg("TabLine" ,"#333333","DarkGrey",80) 161 | highlight TabLineSel guifg=White guibg=Black ctermfg=White ctermbg=Black 162 | highlight TabLineFill gui=underline cterm=underline 163 | call s:hifg("TabLineFill","#bbbbbb","LightGrey",85) 164 | call s:hibg("TabLineFill","#808080","Grey",83) 165 | 166 | hi Type gui=none 167 | hi Statement gui=none 168 | if !has("gui_mac") 169 | " Mac GUI degrades italics to ugly underlining. 170 | hi Comment gui=italic 171 | hi railsUserClass gui=italic 172 | hi railsUserMethod gui=italic 173 | endif 174 | hi Identifier cterm=none 175 | " Commented numbers at the end are *old* 256 color values 176 | "highlight PreProc guifg=#EDF8F9 177 | call s:hifg("Comment" ,"#9933CC","DarkMagenta",34) " 92 178 | " 26 instead? 179 | call s:hifg("Constant" ,"#339999","DarkCyan",21) " 30 180 | call s:hifg("rubyNumber" ,"#CCFF33","Yellow",60) " 190 181 | call s:hifg("String" ,"#66FF00","LightGreen",44,82) " 82 182 | call s:hifg("Identifier" ,"#FFCC00","Yellow",72) " 220 183 | call s:hifg("Statement" ,"#FF6600","Brown",68) " 202 184 | call s:hifg("PreProc" ,"#AAFFFF","LightCyan",47) " 213 185 | call s:hifg("railsUserMethod","#AACCFF","LightCyan",27) 186 | call s:hifg("Type" ,"#AAAA77","Grey",57) " 101 187 | call s:hifg("railsUserClass" ,"#AAAAAA","Grey",7) " 101 188 | call s:hifg("Special" ,"#33AA00","DarkGreen",24) " 7 189 | call s:hifg("Regexp" ,"#44B4CC","DarkCyan",21) " 74 190 | call s:hifg("rubyMethod" ,"#DDE93D","Yellow",77) " 191 191 | "highlight railsMethod guifg=#EE1122 ctermfg=1 192 | -------------------------------------------------------------------------------- /doc/tags: -------------------------------------------------------------------------------- 1 | .netrwbook pi_netrw.txt /*.netrwbook* 2 | .netrwhist pi_netrw.txt /*.netrwhist* 3 | :Explore pi_netrw.txt /*:Explore* 4 | :Hexplore pi_netrw.txt /*:Hexplore* 5 | :Lexplore pi_netrw.txt /*:Lexplore* 6 | :NetrwClean pi_netrw.txt /*:NetrwClean* 7 | :Nexplore pi_netrw.txt /*:Nexplore* 8 | :Nr pi_netrw.txt /*:Nr* 9 | :Nread pi_netrw.txt /*:Nread* 10 | :Ns pi_netrw.txt /*:Ns* 11 | :Nsource pi_netrw.txt /*:Nsource* 12 | :Ntree pi_netrw.txt /*:Ntree* 13 | :Nw pi_netrw.txt /*:Nw* 14 | :Nwrite pi_netrw.txt /*:Nwrite* 15 | :Pexplore pi_netrw.txt /*:Pexplore* 16 | :Rexplore pi_netrw.txt /*:Rexplore* 17 | :Sexplore pi_netrw.txt /*:Sexplore* 18 | :Texplore pi_netrw.txt /*:Texplore* 19 | :Vexplore pi_netrw.txt /*:Vexplore* 20 | NetUserPass() pi_netrw.txt /*NetUserPass()* 21 | b:netrw_lastfile pi_netrw.txt /*b:netrw_lastfile* 22 | dav pi_netrw.txt /*dav* 23 | davs pi_netrw.txt /*davs* 24 | fetch pi_netrw.txt /*fetch* 25 | ftp pi_netrw.txt /*ftp* 26 | g:NetrwTopLvlMenu pi_netrw.txt /*g:NetrwTopLvlMenu* 27 | g:Netrw_UserMaps pi_netrw.txt /*g:Netrw_UserMaps* 28 | g:Netrw_corehandler pi_netrw.txt /*g:Netrw_corehandler* 29 | g:Netrw_funcref pi_netrw.txt /*g:Netrw_funcref* 30 | g:netrw_altfile pi_netrw.txt /*g:netrw_altfile* 31 | g:netrw_alto pi_netrw.txt /*g:netrw_alto* 32 | g:netrw_altv pi_netrw.txt /*g:netrw_altv* 33 | g:netrw_banner pi_netrw.txt /*g:netrw_banner* 34 | g:netrw_bannerbackslash pi_netrw.txt /*g:netrw_bannerbackslash* 35 | g:netrw_browse_split pi_netrw.txt /*g:netrw_browse_split* 36 | g:netrw_browsex_viewer pi_netrw.txt /*g:netrw_browsex_viewer* 37 | g:netrw_bufsettings pi_netrw.txt /*g:netrw_bufsettings* 38 | g:netrw_chgperm pi_netrw.txt /*g:netrw_chgperm* 39 | g:netrw_chgwin pi_netrw.txt /*g:netrw_chgwin* 40 | g:netrw_compress pi_netrw.txt /*g:netrw_compress* 41 | g:netrw_ctags pi_netrw.txt /*g:netrw_ctags* 42 | g:netrw_cursor pi_netrw.txt /*g:netrw_cursor* 43 | g:netrw_cygwin pi_netrw.txt /*g:netrw_cygwin* 44 | g:netrw_dav_cmd pi_netrw.txt /*g:netrw_dav_cmd* 45 | g:netrw_decompress pi_netrw.txt /*g:netrw_decompress* 46 | g:netrw_dirhistmax pi_netrw.txt /*g:netrw_dirhistmax* 47 | g:netrw_dynamic_maxfilenamelen pi_netrw.txt /*g:netrw_dynamic_maxfilenamelen* 48 | g:netrw_errorlvl pi_netrw.txt /*g:netrw_errorlvl* 49 | g:netrw_fastbrowse pi_netrw.txt /*g:netrw_fastbrowse* 50 | g:netrw_fetch_cmd pi_netrw.txt /*g:netrw_fetch_cmd* 51 | g:netrw_ffkeep pi_netrw.txt /*g:netrw_ffkeep* 52 | g:netrw_file_cmd pi_netrw.txt /*g:netrw_file_cmd* 53 | g:netrw_fname_escape pi_netrw.txt /*g:netrw_fname_escape* 54 | g:netrw_ftp pi_netrw.txt /*g:netrw_ftp* 55 | g:netrw_ftp_browse_reject pi_netrw.txt /*g:netrw_ftp_browse_reject* 56 | g:netrw_ftp_cmd pi_netrw.txt /*g:netrw_ftp_cmd* 57 | g:netrw_ftp_list_cmd pi_netrw.txt /*g:netrw_ftp_list_cmd* 58 | g:netrw_ftp_options pi_netrw.txt /*g:netrw_ftp_options* 59 | g:netrw_ftp_sizelist_cmd pi_netrw.txt /*g:netrw_ftp_sizelist_cmd* 60 | g:netrw_ftp_timelist_cmd pi_netrw.txt /*g:netrw_ftp_timelist_cmd* 61 | g:netrw_ftpextracmd pi_netrw.txt /*g:netrw_ftpextracmd* 62 | g:netrw_ftpmode pi_netrw.txt /*g:netrw_ftpmode* 63 | g:netrw_glob_escape pi_netrw.txt /*g:netrw_glob_escape* 64 | g:netrw_gx pi_netrw.txt /*g:netrw_gx* 65 | g:netrw_hide pi_netrw.txt /*g:netrw_hide* 66 | g:netrw_home pi_netrw.txt /*g:netrw_home* 67 | g:netrw_http_cmd pi_netrw.txt /*g:netrw_http_cmd* 68 | g:netrw_http_put_cmd pi_netrw.txt /*g:netrw_http_put_cmd* 69 | g:netrw_http_xcmd pi_netrw.txt /*g:netrw_http_xcmd* 70 | g:netrw_ignorenetrc pi_netrw.txt /*g:netrw_ignorenetrc* 71 | g:netrw_keepdir pi_netrw.txt /*g:netrw_keepdir* 72 | g:netrw_keepj pi_netrw.txt /*g:netrw_keepj* 73 | g:netrw_list_cmd pi_netrw.txt /*g:netrw_list_cmd* 74 | g:netrw_list_cmd_options pi_netrw.txt /*g:netrw_list_cmd_options* 75 | g:netrw_list_hide pi_netrw.txt /*g:netrw_list_hide* 76 | g:netrw_liststyle pi_netrw.txt /*g:netrw_liststyle* 77 | g:netrw_localcopycmd pi_netrw.txt /*g:netrw_localcopycmd* 78 | g:netrw_localcopydircmd pi_netrw.txt /*g:netrw_localcopydircmd* 79 | g:netrw_localmkdir pi_netrw.txt /*g:netrw_localmkdir* 80 | g:netrw_localmovecmd pi_netrw.txt /*g:netrw_localmovecmd* 81 | g:netrw_localrmdir pi_netrw.txt /*g:netrw_localrmdir* 82 | g:netrw_maxfilenamelen pi_netrw.txt /*g:netrw_maxfilenamelen* 83 | g:netrw_menu pi_netrw.txt /*g:netrw_menu* 84 | g:netrw_mkdir_cmd pi_netrw.txt /*g:netrw_mkdir_cmd* 85 | g:netrw_mousemaps pi_netrw.txt /*g:netrw_mousemaps* 86 | g:netrw_nobeval pi_netrw.txt /*g:netrw_nobeval* 87 | g:netrw_nogx pi_netrw.txt /*g:netrw_nogx* 88 | g:netrw_preview pi_netrw.txt /*g:netrw_preview* 89 | g:netrw_rcp_cmd pi_netrw.txt /*g:netrw_rcp_cmd* 90 | g:netrw_remote_mkdir pi_netrw.txt /*g:netrw_remote_mkdir* 91 | g:netrw_retmap pi_netrw.txt /*g:netrw_retmap* 92 | g:netrw_rm_cmd pi_netrw.txt /*g:netrw_rm_cmd* 93 | g:netrw_rmdir_cmd pi_netrw.txt /*g:netrw_rmdir_cmd* 94 | g:netrw_rmf_cmd pi_netrw.txt /*g:netrw_rmf_cmd* 95 | g:netrw_rsync_cmd pi_netrw.txt /*g:netrw_rsync_cmd* 96 | g:netrw_scp_cmd pi_netrw.txt /*g:netrw_scp_cmd* 97 | g:netrw_scpport pi_netrw.txt /*g:netrw_scpport* 98 | g:netrw_sepchr pi_netrw.txt /*g:netrw_sepchr* 99 | g:netrw_servername pi_netrw.txt /*g:netrw_servername* 100 | g:netrw_sftp_cmd pi_netrw.txt /*g:netrw_sftp_cmd* 101 | g:netrw_silent pi_netrw.txt /*g:netrw_silent* 102 | g:netrw_sizestyle pi_netrw.txt /*g:netrw_sizestyle* 103 | g:netrw_sort_by pi_netrw.txt /*g:netrw_sort_by* 104 | g:netrw_sort_direction pi_netrw.txt /*g:netrw_sort_direction* 105 | g:netrw_sort_options pi_netrw.txt /*g:netrw_sort_options* 106 | g:netrw_sort_sequence pi_netrw.txt /*g:netrw_sort_sequence* 107 | g:netrw_special_syntax pi_netrw.txt /*g:netrw_special_syntax* 108 | g:netrw_ssh_browse_reject pi_netrw.txt /*g:netrw_ssh_browse_reject* 109 | g:netrw_ssh_cmd pi_netrw.txt /*g:netrw_ssh_cmd* 110 | g:netrw_sshport pi_netrw.txt /*g:netrw_sshport* 111 | g:netrw_suppress_gx_mesg pi_netrw.txt /*g:netrw_suppress_gx_mesg* 112 | g:netrw_timefmt pi_netrw.txt /*g:netrw_timefmt* 113 | g:netrw_tmpfile_escape pi_netrw.txt /*g:netrw_tmpfile_escape* 114 | g:netrw_uid pi_netrw.txt /*g:netrw_uid* 115 | g:netrw_use_errorwindow pi_netrw.txt /*g:netrw_use_errorwindow* 116 | g:netrw_use_noswf pi_netrw.txt /*g:netrw_use_noswf* 117 | g:netrw_use_nt_rcp pi_netrw.txt /*g:netrw_use_nt_rcp* 118 | g:netrw_usetab pi_netrw.txt /*g:netrw_usetab* 119 | g:netrw_win95ftp pi_netrw.txt /*g:netrw_win95ftp* 120 | g:netrw_winsize pi_netrw.txt /*g:netrw_winsize* 121 | g:netrw_wiw pi_netrw.txt /*g:netrw_wiw* 122 | g:netrw_xstrlen pi_netrw.txt /*g:netrw_xstrlen* 123 | global_markfilelist pi_netrw.txt /*global_markfilelist* 124 | http pi_netrw.txt /*http* 125 | local_markfilelist pi_netrw.txt /*local_markfilelist* 126 | markfilelist pi_netrw.txt /*markfilelist* 127 | netreadfixup pi_netrw.txt /*netreadfixup* 128 | netrw pi_netrw.txt /*netrw* 129 | netrw-% pi_netrw.txt /*netrw-%* 130 | netrw-- pi_netrw.txt /*netrw--* 131 | netrw-:Explore pi_netrw.txt /*netrw-:Explore* 132 | netrw-:Hexplore pi_netrw.txt /*netrw-:Hexplore* 133 | netrw-:Lexplore pi_netrw.txt /*netrw-:Lexplore* 134 | netrw-:MF pi_netrw.txt /*netrw-:MF* 135 | netrw-:MT pi_netrw.txt /*netrw-:MT* 136 | netrw-:NetrwC pi_netrw.txt /*netrw-:NetrwC* 137 | netrw-:NetrwMB pi_netrw.txt /*netrw-:NetrwMB* 138 | netrw-:Rexplore pi_netrw.txt /*netrw-:Rexplore* 139 | netrw-:Sexplore pi_netrw.txt /*netrw-:Sexplore* 140 | netrw-:Texplore pi_netrw.txt /*netrw-:Texplore* 141 | netrw-:Vexplore pi_netrw.txt /*netrw-:Vexplore* 142 | netrw-C pi_netrw.txt /*netrw-C* 143 | netrw-D pi_netrw.txt /*netrw-D* 144 | netrw-I pi_netrw.txt /*netrw-I* 145 | netrw-O pi_netrw.txt /*netrw-O* 146 | netrw-P pi_netrw.txt /*netrw-P* 147 | netrw-P18 pi_netrw.txt /*netrw-P18* 148 | netrw-P19 pi_netrw.txt /*netrw-P19* 149 | netrw-P20 pi_netrw.txt /*netrw-P20* 150 | netrw-P21 pi_netrw.txt /*netrw-P21* 151 | netrw-P22 pi_netrw.txt /*netrw-P22* 152 | netrw-R pi_netrw.txt /*netrw-R* 153 | netrw-S pi_netrw.txt /*netrw-S* 154 | netrw-Tb pi_netrw.txt /*netrw-Tb* 155 | netrw-Th pi_netrw.txt /*netrw-Th* 156 | netrw-U pi_netrw.txt /*netrw-U* 157 | netrw-X pi_netrw.txt /*netrw-X* 158 | netrw-a pi_netrw.txt /*netrw-a* 159 | netrw-activate pi_netrw.txt /*netrw-activate* 160 | netrw-bookmark pi_netrw.txt /*netrw-bookmark* 161 | netrw-bookmarks pi_netrw.txt /*netrw-bookmarks* 162 | netrw-browse pi_netrw.txt /*netrw-browse* 163 | netrw-browse-cmds pi_netrw.txt /*netrw-browse-cmds* 164 | netrw-browse-maps pi_netrw.txt /*netrw-browse-maps* 165 | netrw-browser pi_netrw.txt /*netrw-browser* 166 | netrw-browser-options pi_netrw.txt /*netrw-browser-options* 167 | netrw-browser-settings pi_netrw.txt /*netrw-browser-settings* 168 | netrw-browser-var pi_netrw.txt /*netrw-browser-var* 169 | netrw-browsing pi_netrw.txt /*netrw-browsing* 170 | netrw-c pi_netrw.txt /*netrw-c* 171 | netrw-c-tab pi_netrw.txt /*netrw-c-tab* 172 | netrw-cadaver pi_netrw.txt /*netrw-cadaver* 173 | netrw-chgup pi_netrw.txt /*netrw-chgup* 174 | netrw-clean pi_netrw.txt /*netrw-clean* 175 | netrw-contents pi_netrw.txt /*netrw-contents* 176 | netrw-copyright pi_netrw.txt /*netrw-copyright* 177 | netrw-cr pi_netrw.txt /*netrw-cr* 178 | netrw-createfile pi_netrw.txt /*netrw-createfile* 179 | netrw-credits pi_netrw.txt /*netrw-credits* 180 | netrw-ctrl-h pi_netrw.txt /*netrw-ctrl-h* 181 | netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l* 182 | netrw-ctrl-r pi_netrw.txt /*netrw-ctrl-r* 183 | netrw-ctrl_l pi_netrw.txt /*netrw-ctrl_l* 184 | netrw-curdir pi_netrw.txt /*netrw-curdir* 185 | netrw-d pi_netrw.txt /*netrw-d* 186 | netrw-debug pi_netrw.txt /*netrw-debug* 187 | netrw-del pi_netrw.txt /*netrw-del* 188 | netrw-delete pi_netrw.txt /*netrw-delete* 189 | netrw-dir pi_netrw.txt /*netrw-dir* 190 | netrw-dirlist pi_netrw.txt /*netrw-dirlist* 191 | netrw-downdir pi_netrw.txt /*netrw-downdir* 192 | netrw-edithide pi_netrw.txt /*netrw-edithide* 193 | netrw-editwindow pi_netrw.txt /*netrw-editwindow* 194 | netrw-enter pi_netrw.txt /*netrw-enter* 195 | netrw-ex pi_netrw.txt /*netrw-ex* 196 | netrw-explore pi_netrw.txt /*netrw-explore* 197 | netrw-explore-cmds pi_netrw.txt /*netrw-explore-cmds* 198 | netrw-externapp pi_netrw.txt /*netrw-externapp* 199 | netrw-file pi_netrw.txt /*netrw-file* 200 | netrw-filigree pi_netrw.txt /*netrw-filigree* 201 | netrw-fixup pi_netrw.txt /*netrw-fixup* 202 | netrw-ftp pi_netrw.txt /*netrw-ftp* 203 | netrw-ftype pi_netrw.txt /*netrw-ftype* 204 | netrw-gb pi_netrw.txt /*netrw-gb* 205 | netrw-gd pi_netrw.txt /*netrw-gd* 206 | netrw-getftype pi_netrw.txt /*netrw-getftype* 207 | netrw-gf pi_netrw.txt /*netrw-gf* 208 | netrw-gh pi_netrw.txt /*netrw-gh* 209 | netrw-gitignore pi_netrw.txt /*netrw-gitignore* 210 | netrw-gn pi_netrw.txt /*netrw-gn* 211 | netrw-gp pi_netrw.txt /*netrw-gp* 212 | netrw-grep pi_netrw.txt /*netrw-grep* 213 | netrw-gx pi_netrw.txt /*netrw-gx* 214 | netrw-handler pi_netrw.txt /*netrw-handler* 215 | netrw-help pi_netrw.txt /*netrw-help* 216 | netrw-hexplore pi_netrw.txt /*netrw-hexplore* 217 | netrw-hide pi_netrw.txt /*netrw-hide* 218 | netrw-hiding pi_netrw.txt /*netrw-hiding* 219 | netrw-history pi_netrw.txt /*netrw-history* 220 | netrw-horiz pi_netrw.txt /*netrw-horiz* 221 | netrw-i pi_netrw.txt /*netrw-i* 222 | netrw-incompatible pi_netrw.txt /*netrw-incompatible* 223 | netrw-internal-variables pi_netrw.txt /*netrw-internal-variables* 224 | netrw-intro-browse pi_netrw.txt /*netrw-intro-browse* 225 | netrw-leftmouse pi_netrw.txt /*netrw-leftmouse* 226 | netrw-lexplore pi_netrw.txt /*netrw-lexplore* 227 | netrw-list pi_netrw.txt /*netrw-list* 228 | netrw-listbookmark pi_netrw.txt /*netrw-listbookmark* 229 | netrw-listhack pi_netrw.txt /*netrw-listhack* 230 | netrw-login pi_netrw.txt /*netrw-login* 231 | netrw-mA pi_netrw.txt /*netrw-mA* 232 | netrw-mB pi_netrw.txt /*netrw-mB* 233 | netrw-mF pi_netrw.txt /*netrw-mF* 234 | netrw-mT pi_netrw.txt /*netrw-mT* 235 | netrw-mX pi_netrw.txt /*netrw-mX* 236 | netrw-ma pi_netrw.txt /*netrw-ma* 237 | netrw-mb pi_netrw.txt /*netrw-mb* 238 | netrw-mc pi_netrw.txt /*netrw-mc* 239 | netrw-md pi_netrw.txt /*netrw-md* 240 | netrw-me pi_netrw.txt /*netrw-me* 241 | netrw-mf pi_netrw.txt /*netrw-mf* 242 | netrw-mg pi_netrw.txt /*netrw-mg* 243 | netrw-mh pi_netrw.txt /*netrw-mh* 244 | netrw-middlemouse pi_netrw.txt /*netrw-middlemouse* 245 | netrw-ml_get pi_netrw.txt /*netrw-ml_get* 246 | netrw-mm pi_netrw.txt /*netrw-mm* 247 | netrw-mouse pi_netrw.txt /*netrw-mouse* 248 | netrw-move pi_netrw.txt /*netrw-move* 249 | netrw-mp pi_netrw.txt /*netrw-mp* 250 | netrw-mr pi_netrw.txt /*netrw-mr* 251 | netrw-ms pi_netrw.txt /*netrw-ms* 252 | netrw-mt pi_netrw.txt /*netrw-mt* 253 | netrw-mu pi_netrw.txt /*netrw-mu* 254 | netrw-mv pi_netrw.txt /*netrw-mv* 255 | netrw-mx pi_netrw.txt /*netrw-mx* 256 | netrw-mz pi_netrw.txt /*netrw-mz* 257 | netrw-netrc pi_netrw.txt /*netrw-netrc* 258 | netrw-newfile pi_netrw.txt /*netrw-newfile* 259 | netrw-nexplore pi_netrw.txt /*netrw-nexplore* 260 | netrw-noload pi_netrw.txt /*netrw-noload* 261 | netrw-nread pi_netrw.txt /*netrw-nread* 262 | netrw-ntree pi_netrw.txt /*netrw-ntree* 263 | netrw-nwrite pi_netrw.txt /*netrw-nwrite* 264 | netrw-o pi_netrw.txt /*netrw-o* 265 | netrw-obtain pi_netrw.txt /*netrw-obtain* 266 | netrw-options pi_netrw.txt /*netrw-options* 267 | netrw-p pi_netrw.txt /*netrw-p* 268 | netrw-p1 pi_netrw.txt /*netrw-p1* 269 | netrw-p10 pi_netrw.txt /*netrw-p10* 270 | netrw-p11 pi_netrw.txt /*netrw-p11* 271 | netrw-p12 pi_netrw.txt /*netrw-p12* 272 | netrw-p13 pi_netrw.txt /*netrw-p13* 273 | netrw-p14 pi_netrw.txt /*netrw-p14* 274 | netrw-p15 pi_netrw.txt /*netrw-p15* 275 | netrw-p16 pi_netrw.txt /*netrw-p16* 276 | netrw-p17 pi_netrw.txt /*netrw-p17* 277 | netrw-p2 pi_netrw.txt /*netrw-p2* 278 | netrw-p3 pi_netrw.txt /*netrw-p3* 279 | netrw-p4 pi_netrw.txt /*netrw-p4* 280 | netrw-p5 pi_netrw.txt /*netrw-p5* 281 | netrw-p6 pi_netrw.txt /*netrw-p6* 282 | netrw-p7 pi_netrw.txt /*netrw-p7* 283 | netrw-p8 pi_netrw.txt /*netrw-p8* 284 | netrw-p9 pi_netrw.txt /*netrw-p9* 285 | netrw-passwd pi_netrw.txt /*netrw-passwd* 286 | netrw-password pi_netrw.txt /*netrw-password* 287 | netrw-path pi_netrw.txt /*netrw-path* 288 | netrw-pexplore pi_netrw.txt /*netrw-pexplore* 289 | netrw-preview pi_netrw.txt /*netrw-preview* 290 | netrw-problems pi_netrw.txt /*netrw-problems* 291 | netrw-protocol pi_netrw.txt /*netrw-protocol* 292 | netrw-prvwin pi_netrw.txt /*netrw-prvwin* 293 | netrw-pscp pi_netrw.txt /*netrw-pscp* 294 | netrw-psftp pi_netrw.txt /*netrw-psftp* 295 | netrw-putty pi_netrw.txt /*netrw-putty* 296 | netrw-qF pi_netrw.txt /*netrw-qF* 297 | netrw-qL pi_netrw.txt /*netrw-qL* 298 | netrw-qb pi_netrw.txt /*netrw-qb* 299 | netrw-qf pi_netrw.txt /*netrw-qf* 300 | netrw-quickcom pi_netrw.txt /*netrw-quickcom* 301 | netrw-quickcoms pi_netrw.txt /*netrw-quickcoms* 302 | netrw-quickhelp pi_netrw.txt /*netrw-quickhelp* 303 | netrw-quickmap pi_netrw.txt /*netrw-quickmap* 304 | netrw-quickmaps pi_netrw.txt /*netrw-quickmaps* 305 | netrw-r pi_netrw.txt /*netrw-r* 306 | netrw-read pi_netrw.txt /*netrw-read* 307 | netrw-ref pi_netrw.txt /*netrw-ref* 308 | netrw-refresh pi_netrw.txt /*netrw-refresh* 309 | netrw-rename pi_netrw.txt /*netrw-rename* 310 | netrw-reverse pi_netrw.txt /*netrw-reverse* 311 | netrw-rexplore pi_netrw.txt /*netrw-rexplore* 312 | netrw-rightmouse pi_netrw.txt /*netrw-rightmouse* 313 | netrw-s pi_netrw.txt /*netrw-s* 314 | netrw-s-cr pi_netrw.txt /*netrw-s-cr* 315 | netrw-settings pi_netrw.txt /*netrw-settings* 316 | netrw-settings-window pi_netrw.txt /*netrw-settings-window* 317 | netrw-sexplore pi_netrw.txt /*netrw-sexplore* 318 | netrw-sort pi_netrw.txt /*netrw-sort* 319 | netrw-sort-sequence pi_netrw.txt /*netrw-sort-sequence* 320 | netrw-sortsequence pi_netrw.txt /*netrw-sortsequence* 321 | netrw-source pi_netrw.txt /*netrw-source* 322 | netrw-ssh-hack pi_netrw.txt /*netrw-ssh-hack* 323 | netrw-star pi_netrw.txt /*netrw-star* 324 | netrw-starpat pi_netrw.txt /*netrw-starpat* 325 | netrw-starstar pi_netrw.txt /*netrw-starstar* 326 | netrw-starstarpat pi_netrw.txt /*netrw-starstarpat* 327 | netrw-start pi_netrw.txt /*netrw-start* 328 | netrw-t pi_netrw.txt /*netrw-t* 329 | netrw-texplore pi_netrw.txt /*netrw-texplore* 330 | netrw-todo pi_netrw.txt /*netrw-todo* 331 | netrw-trailingslash pi_netrw.txt /*netrw-trailingslash* 332 | netrw-transparent pi_netrw.txt /*netrw-transparent* 333 | netrw-u pi_netrw.txt /*netrw-u* 334 | netrw-updir pi_netrw.txt /*netrw-updir* 335 | netrw-urls pi_netrw.txt /*netrw-urls* 336 | netrw-usermaps pi_netrw.txt /*netrw-usermaps* 337 | netrw-userpass pi_netrw.txt /*netrw-userpass* 338 | netrw-v pi_netrw.txt /*netrw-v* 339 | netrw-var pi_netrw.txt /*netrw-var* 340 | netrw-variables pi_netrw.txt /*netrw-variables* 341 | netrw-vexplore pi_netrw.txt /*netrw-vexplore* 342 | netrw-windows-netrc pi_netrw.txt /*netrw-windows-netrc* 343 | netrw-windows-s pi_netrw.txt /*netrw-windows-s* 344 | netrw-write pi_netrw.txt /*netrw-write* 345 | netrw-x pi_netrw.txt /*netrw-x* 346 | netrw-xfer pi_netrw.txt /*netrw-xfer* 347 | netrw.vim pi_netrw.txt /*netrw.vim* 348 | netrw_filehandler pi_netrw.txt /*netrw_filehandler* 349 | network pi_netrw.txt /*network* 350 | pi_netrw.txt pi_netrw.txt /*pi_netrw.txt* 351 | rcp pi_netrw.txt /*rcp* 352 | rsync pi_netrw.txt /*rsync* 353 | s:netrw_passwd pi_netrw.txt /*s:netrw_passwd* 354 | scp pi_netrw.txt /*scp* 355 | sftp pi_netrw.txt /*sftp* 356 | -------------------------------------------------------------------------------- /gvimrc: -------------------------------------------------------------------------------- 1 | " Example Vim graphical configuration. 2 | " Copy to ~/.gvimrc or ~/_gvimrc. 3 | 4 | set macligatures 5 | set guifont=Fira\ Code:h12 6 | set antialias " MacVim: smooth fonts. 7 | set encoding=utf-8 " Use UTF-8 everywhere. 8 | set guioptions-=T " Hide toolbar. 9 | set background=light " Background. 10 | set lines=25 columns=100 " Window dimensions. 11 | 12 | " Uncomment to use. 13 | " set guioptions-=r " Don't show right scrollbar 14 | 15 | colorscheme dracula 16 | 17 | " Save using Command-S on MacVim without replacing 18 | noremap :w 19 | -------------------------------------------------------------------------------- /init.vim: -------------------------------------------------------------------------------- 1 | vimrc -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vimfiles", 3 | "version": "UNVERSIONED", 4 | "repository": "git@github.com:derekstavis/vimfiles.git", 5 | "author": "Derek Stavis ", 6 | "license": "MIT", 7 | "devDependencies": { 8 | "@slonoed/jsref": "^1.1.10", 9 | "apollo-language-server": "^1.17.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /plugin/netrwPlugin.vim: -------------------------------------------------------------------------------- 1 | " netrwPlugin.vim: Handles file transfer and remote directory listing across a network 2 | " PLUGIN SECTION 3 | " Date: Feb 08, 2016 4 | " Maintainer: Charles E Campbell 5 | " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim 6 | " Copyright: Copyright (C) 1999-2013 Charles E. Campbell {{{1 7 | " Permission is hereby granted to use and distribute this code, 8 | " with or without modifications, provided that this copyright 9 | " notice is copied with it. Like anything else that's free, 10 | " netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided 11 | " *as is* and comes with no warranty of any kind, either 12 | " expressed or implied. By using this plugin, you agree that 13 | " in no event will the copyright holder be liable for any damages 14 | " resulting from the use of this software. 15 | " 16 | " But be doers of the Word, and not only hearers, deluding your own selves {{{1 17 | " (James 1:22 RSV) 18 | " =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 19 | " Load Once: {{{1 20 | if &cp || exists("g:loaded_netrwPlugin") 21 | finish 22 | endif 23 | let g:loaded_netrwPlugin = "v157a" 24 | let s:keepcpo = &cpo 25 | set cpo&vim 26 | "DechoRemOn 27 | 28 | " --------------------------------------------------------------------- 29 | " Public Interface: {{{1 30 | 31 | " Local Browsing Autocmds: {{{2 32 | augroup FileExplorer 33 | au! 34 | au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif 35 | au BufEnter * sil call s:LocalBrowse(expand("")) 36 | au VimEnter * sil call s:VimEnter(expand("")) 37 | if has("win32") || has("win95") || has("win64") || has("win16") 38 | au BufEnter .* sil call s:LocalBrowse(expand("")) 39 | endif 40 | augroup END 41 | 42 | " Network Browsing Reading Writing: {{{2 43 | augroup Network 44 | au! 45 | au BufReadCmd file://* call netrw#FileUrlRead(expand("")) 46 | au BufReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufReadPre ".fnameescape(expand(""))|call netrw#Nread(2,expand(""))|exe "sil doau BufReadPost ".fnameescape(expand("")) 47 | au FileReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileReadPre ".fnameescape(expand(""))|call netrw#Nread(1,expand(""))|exe "sil doau FileReadPost ".fnameescape(expand("")) 48 | au BufWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufWritePre ".fnameescape(expand(""))|exe 'Nwrite '.fnameescape(expand(""))|exe "sil doau BufWritePost ".fnameescape(expand("")) 49 | au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileWritePre ".fnameescape(expand(""))|exe "'[,']".'Nwrite '.fnameescape(expand(""))|exe "sil doau FileWritePost ".fnameescape(expand("")) 50 | try 51 | au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("")) 52 | catch /^Vim\%((\a\+)\)\=:E216/ 53 | au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("")) 54 | endtry 55 | augroup END 56 | 57 | " Commands: :Nread, :Nwrite, :NetUserPass {{{2 58 | com! -count=1 -nargs=* Nread let s:svpos= winsaveview()call netrw#NetRead(,)call winrestview(s:svpos) 59 | com! -range=% -nargs=* Nwrite let s:svpos= winsaveview(),call netrw#NetWrite()call winrestview(s:svpos) 60 | com! -nargs=* NetUserPass call NetUserPass() 61 | com! -nargs=* Nsource let s:svpos= winsaveview()call netrw#NetSource()call winrestview(s:svpos) 62 | com! -nargs=? Ntree call netrw#SetTreetop() 63 | 64 | " Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2 65 | com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(,0,0+0,) 66 | com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(,1,0+0,) 67 | com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(,1,2+0,) 68 | com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(,1,4+0,) 69 | com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(,0,6 ,) 70 | com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,) 71 | com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,) 72 | com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(,0,) 73 | 74 | " Commands: NetrwSettings {{{2 75 | com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings() 76 | com! -bang NetrwClean call netrw#Clean(0) 77 | 78 | " Maps: 79 | if !exists("g:netrw_nogx") 80 | if maparg('gx','n') == "" 81 | if !hasmapto('NetrwBrowseX') 82 | nmap gx NetrwBrowseX 83 | endif 84 | nno NetrwBrowseX :call netrw#BrowseX(expand((exists("g:netrw_gx")? g:netrw_gx : '')),netrw#CheckIfRemote()) 85 | endif 86 | if maparg('gx','v') == "" 87 | if !hasmapto('NetrwBrowseXVis') 88 | vmap gx NetrwBrowseXVis 89 | endif 90 | vno NetrwBrowseXVis :call netrw#BrowseXVis() 91 | endif 92 | endif 93 | if exists("g:netrw_usetab") && g:netrw_usetab 94 | if maparg('','n') == "" 95 | nmap NetrwShrink 96 | endif 97 | nno NetrwShrink :call netrw#Shrink() 98 | endif 99 | 100 | " --------------------------------------------------------------------- 101 | " LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2 102 | fun! s:LocalBrowse(dirname) 103 | " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here. 104 | " Otherwise, the BufEnter event gets triggered when attempts to write to 105 | " the DBG buffer are made. 106 | 107 | if !exists("s:vimentered") 108 | " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will, 109 | " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined. 110 | " call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)") 111 | " call Dret("s:LocalBrowse") 112 | return 113 | endif 114 | 115 | " call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")") 116 | 117 | if has("amiga") 118 | " The check against '' is made for the Amiga, where the empty 119 | " string is the current directory and not checking would break 120 | " things such as the help command. 121 | " call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)") 122 | if a:dirname != '' && isdirectory(a:dirname) 123 | sil! call netrw#LocalBrowseCheck(a:dirname) 124 | if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 125 | exe w:netrw_bannercnt 126 | endif 127 | endif 128 | 129 | elseif isdirectory(a:dirname) 130 | " call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)") 131 | " call Dredir("LocalBrowse ft last set: ","verbose set ft") 132 | " call Decho("(s:LocalBrowse) COMBAK#23: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col(".")) 133 | sil! call netrw#LocalBrowseCheck(a:dirname) 134 | " call Decho("(s:LocalBrowse) COMBAK#24: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col(".")) 135 | if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 136 | exe w:netrw_bannercnt 137 | " call Decho("(s:LocalBrowse) COMBAK#25: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col(".")) 138 | endif 139 | 140 | else 141 | " not a directory, ignore it 142 | " call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...") 143 | endif 144 | " call Decho("(s:LocalBrowse) COMBAK#26: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col(".")) 145 | 146 | " call Dret("s:LocalBrowse") 147 | endfun 148 | 149 | " --------------------------------------------------------------------- 150 | " s:VimEnter: after all vim startup stuff is done, this function is called. {{{2 151 | " Its purpose: to look over all windows and run s:LocalBrowse() on 152 | " them, which checks if they're directories and will create a directory 153 | " listing when appropriate. 154 | " It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter() 155 | " has already been called. 156 | fun! s:VimEnter(dirname) 157 | " call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">") 158 | let curwin = winnr() 159 | let s:vimentered = 1 160 | windo call s:LocalBrowse(expand("%:p")) 161 | exe curwin."wincmd w" 162 | " call Dret("s:VimEnter") 163 | endfun 164 | 165 | " --------------------------------------------------------------------- 166 | " NetrwStatusLine: {{{1 167 | fun! NetrwStatusLine() 168 | " let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".") 169 | if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list") 170 | let &stl= s:netrw_explore_stl 171 | if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif 172 | if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif 173 | return "" 174 | else 175 | return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen 176 | endif 177 | endfun 178 | 179 | " ------------------------------------------------------------------------ 180 | " NetUserPass: set username and password for subsequent ftp transfer {{{1 181 | " Usage: :call NetUserPass() -- will prompt for userid and password 182 | " :call NetUserPass("uid") -- will prompt for password 183 | " :call NetUserPass("uid","password") -- sets global userid and password 184 | fun! NetUserPass(...) 185 | 186 | " get/set userid 187 | if a:0 == 0 188 | " call Dfunc("NetUserPass(a:0<".a:0.">)") 189 | if !exists("g:netrw_uid") || g:netrw_uid == "" 190 | " via prompt 191 | let g:netrw_uid= input('Enter username: ') 192 | endif 193 | else " from command line 194 | " call Dfunc("NetUserPass(a:1<".a:1.">) {") 195 | let g:netrw_uid= a:1 196 | endif 197 | 198 | " get password 199 | if a:0 <= 1 " via prompt 200 | " call Decho("a:0=".a:0." case <=1:") 201 | let g:netrw_passwd= inputsecret("Enter Password: ") 202 | else " from command line 203 | " call Decho("a:0=".a:0." case >1: a:2<".a:2.">") 204 | let g:netrw_passwd=a:2 205 | endif 206 | " call Dret("NetUserPass") 207 | endfun 208 | 209 | " ------------------------------------------------------------------------ 210 | " Modelines And Restoration: {{{1 211 | let &cpo= s:keepcpo 212 | unlet s:keepcpo 213 | " vim:ts=8 fdm=marker 214 | -------------------------------------------------------------------------------- /snippets/java.snippets: -------------------------------------------------------------------------------- 1 | snippet log 2 | System.out.println(${1}); 3 | -------------------------------------------------------------------------------- /snippets/javascript.snippets: -------------------------------------------------------------------------------- 1 | snippet log 2 | console.log(${1}); 3 | snippet setTimeout 4 | setTimeout(function(){ 5 | ${1} 6 | }, ${2}); 7 | 8 | snippet < 9 | <${1:tag}> 10 | ${VISUAL:\{children\}} 11 | 12 | -------------------------------------------------------------------------------- /syntax/netrw.vim: -------------------------------------------------------------------------------- 1 | " Language : Netrw Remote-Directory Listing Syntax 2 | " Maintainer : Charles E. Campbell 3 | " Last change: Oct 06, 2014 4 | " Version : 19 5 | " --------------------------------------------------------------------- 6 | 7 | " Syntax Clearing: {{{1 8 | if version < 600 9 | syntax clear 10 | elseif exists("b:current_syntax") 11 | finish 12 | endif 13 | 14 | " --------------------------------------------------------------------- 15 | " Directory List Syntax Highlighting: {{{1 16 | syn cluster NetrwGroup contains=netrwHide,netrwSortBy,netrwSortSeq,netrwQuickHelp,netrwVersion,netrwCopyTgt 17 | syn cluster NetrwTreeGroup contains=netrwDir,netrwSymLink,netrwExe 18 | 19 | syn match netrwPlain "\(\S\+ \)*\S\+" contains=netrwLink,@NoSpell 20 | syn match netrwSpecial "\%(\S\+ \)*\S\+[*|=]\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell 21 | syn match netrwDir "\.\{1,2}/" contains=netrwClassify,@NoSpell 22 | syn match netrwDir "\%(\S\+ \)*\S\+/\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell 23 | syn match netrwSizeDate "\<\d\+\s\d\{1,2}/\d\{1,2}/\d\{4}\s" skipwhite contains=netrwDateSep,@NoSpell nextgroup=netrwTime 24 | syn match netrwSymLink "\%(\S\+ \)*\S\+@\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell 25 | syn match netrwExe "\%(\S\+ \)*\S*[^~]\*\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell 26 | if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4') 27 | syn match netrwTreeBar "^\%([-+|│] \)\+" contains=netrwTreeBarSpace nextgroup=@netrwTreeGroup 28 | else 29 | syn match netrwTreeBar "^\%([-+|] \)\+" contains=netrwTreeBarSpace nextgroup=@netrwTreeGroup 30 | endif 31 | syn match netrwTreeBarSpace " " contained 32 | 33 | syn match netrwClassify "[*=|@/]\ze\%(\s\{2,}\|$\)" contained 34 | syn match netrwDateSep "/" contained 35 | syn match netrwTime "\d\{1,2}:\d\{2}:\d\{2}" contained contains=netrwTimeSep 36 | syn match netrwTimeSep ":" 37 | 38 | syn match netrwComment '".*\%(\t\|$\)' contains=@NetrwGroup,@NoSpell 39 | syn match netrwHide '^"\s*\(Hid\|Show\)ing:' skipwhite contains=@NoSpell nextgroup=netrwHidePat 40 | syn match netrwSlash "/" contained 41 | syn match netrwHidePat "[^,]\+" contained skipwhite contains=@NoSpell nextgroup=netrwHideSep 42 | syn match netrwHideSep "," contained skipwhite nextgroup=netrwHidePat 43 | syn match netrwSortBy "Sorted by" contained transparent skipwhite nextgroup=netrwList 44 | syn match netrwSortSeq "Sort sequence:" contained transparent skipwhite nextgroup=netrwList 45 | syn match netrwCopyTgt "Copy/Move Tgt:" contained transparent skipwhite nextgroup=netrwList 46 | syn match netrwList ".*$" contained contains=netrwComma,@NoSpell 47 | syn match netrwComma "," contained 48 | syn region netrwQuickHelp matchgroup=Comment start="Quick Help:\s\+" end="$" contains=netrwHelpCmd,netrwQHTopic,@NoSpell keepend contained 49 | syn match netrwHelpCmd "\S\+\ze:" contained skipwhite contains=@NoSpell nextgroup=netrwCmdSep 50 | syn match netrwQHTopic "([a-zA-Z &]\+)" contained skipwhite 51 | syn match netrwCmdSep ":" contained nextgroup=netrwCmdNote 52 | syn match netrwCmdNote ".\{-}\ze " contained contains=@NoSpell 53 | syn match netrwVersion "(netrw.*)" contained contains=@NoSpell 54 | syn match netrwLink "-->" contained skipwhite 55 | 56 | " ----------------------------- 57 | " Special filetype highlighting {{{1 58 | " ----------------------------- 59 | if exists("g:netrw_special_syntax") && netrw_special_syntax 60 | syn match netrwBak "\(\S\+ \)*\S\+\.bak\>" contains=netrwTreeBar,@NoSpell 61 | syn match netrwCompress "\(\S\+ \)*\S\+\.\%(gz\|bz2\|Z\|zip\)\>" contains=netrwTreeBar,@NoSpell 62 | if has("unix") 63 | syn match netrwCoreDump "\" contains=netrwTreeBar,@NoSpell 64 | endif 65 | syn match netrwLex "\(\S\+ \)*\S\+\.\%(l\|lex\)\>" contains=netrwTreeBar,@NoSpell 66 | syn match netrwYacc "\(\S\+ \)*\S\+\.y\>" contains=netrwTreeBar,@NoSpell 67 | syn match netrwData "\(\S\+ \)*\S\+\.dat\>" contains=netrwTreeBar,@NoSpell 68 | syn match netrwDoc "\(\S\+ \)*\S\+\.\%(doc\|txt\|pdf\|ps\)" contains=netrwTreeBar,@NoSpell 69 | syn match netrwHdr "\(\S\+ \)*\S\+\.\%(h\|hpp\)\>" contains=netrwTreeBar,@NoSpell 70 | syn match netrwLib "\(\S\+ \)*\S*\.\%(a\|so\|lib\|dll\)\>" contains=netrwTreeBar,@NoSpell 71 | syn match netrwMakeFile "\<[mM]akefile\>\|\(\S\+ \)*\S\+\.mak\>" contains=netrwTreeBar,@NoSpell 72 | syn match netrwObj "\(\S\+ \)*\S*\.\%(o\|obj\)\>" contains=netrwTreeBar,@NoSpell 73 | syn match netrwTags "\<\(ANmenu\|ANtags\)\>" contains=netrwTreeBar,@NoSpell 74 | syn match netrwTags "\" contains=netrwTreeBar,@NoSpell 75 | syn match netrwTilde "\(\S\+ \)*\S\+\~\*\=\>" contains=netrwTreeBar,@NoSpell 76 | syn match netrwTmp "\\|\(\S\+ \)*\S*tmp\>" contains=netrwTreeBar,@NoSpell 77 | endif 78 | 79 | " --------------------------------------------------------------------- 80 | " Highlighting Links: {{{1 81 | if !exists("did_drchip_netrwlist_syntax") 82 | let did_drchip_netrwlist_syntax= 1 83 | hi default link netrwClassify Function 84 | hi default link netrwCmdSep Delimiter 85 | hi default link netrwComment Comment 86 | hi default link netrwDir Directory 87 | hi default link netrwHelpCmd Function 88 | hi default link netrwQHTopic Number 89 | hi default link netrwHidePat Statement 90 | hi default link netrwHideSep netrwComment 91 | hi default link netrwList Statement 92 | hi default link netrwVersion Identifier 93 | hi default link netrwSymLink Question 94 | hi default link netrwExe PreProc 95 | hi default link netrwDateSep Delimiter 96 | 97 | hi default link netrwTreeBar Special 98 | hi default link netrwTimeSep netrwDateSep 99 | hi default link netrwComma netrwComment 100 | hi default link netrwHide netrwComment 101 | hi default link netrwMarkFile TabLineSel 102 | hi default link netrwLink Special 103 | 104 | " special syntax highlighting (see :he g:netrw_special_syntax) 105 | hi default link netrwBak NonText 106 | hi default link netrwCompress Folded 107 | hi default link netrwCoreDump WarningMsg 108 | hi default link netrwData DiffChange 109 | hi default link netrwHdr netrwPlain 110 | hi default link netrwLex netrwPlain 111 | hi default link netrwLib DiffChange 112 | hi default link netrwMakefile DiffChange 113 | hi default link netrwObj Folded 114 | hi default link netrwTilde Folded 115 | hi default link netrwTmp Folded 116 | hi default link netrwTags Folded 117 | hi default link netrwYacc netrwPlain 118 | endif 119 | 120 | " Current Syntax: {{{1 121 | let b:current_syntax = "netrwlist" 122 | " --------------------------------------------------------------------- 123 | " vim: ts=8 fdm=marker 124 | -------------------------------------------------------------------------------- /tmp/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/derekstavis/vimfiles/d61d279d2a05ab8d5b6f3a3f4ce9f57027d1a947/tmp/.keep -------------------------------------------------------------------------------- /vimrc: -------------------------------------------------------------------------------- 1 | " .vimrc 2 | " Forked from: Jonathan Lima 3 | " Adapted by: Derek Stavis 4 | " Source http://github.com/derekstavis/vimfiles 5 | 6 | " ##### Fix vim with fish {{{ 7 | set shell=sh 8 | 9 | " "}}} 10 | 11 | " ##### Fix Terminal enter/exit {{{ 12 | tnoremap 13 | tnoremap 14 | tnoremap 15 | tnoremap 16 | " autocmd BufWinEnter,WinEnter term://* startinsert 17 | autocmd BufLeave term://* stopinsert 18 | " "}}} 19 | 20 | " ##### Plug setup {{{ 21 | call plug#begin('~/.vim/plugged') 22 | " "}}} 23 | " ##### Plugs {{{ 24 | " Base 25 | Plug 'nvim-tree/nvim-web-devicons' 26 | Plug 'nvim-lualine/lualine.nvim' 27 | Plug 'teranex/jk-jumps.vim' 28 | Plug 'mg979/vim-visual-multi' 29 | Plug 'ryanoasis/vim-devicons' 30 | Plug 'milkypostman/vim-togglelist' 31 | Plug 'jeffkreeftmeijer/vim-numbertoggle' 32 | Plug 'ckarnell/history-traverse' 33 | Plug 'bit101/bufkill' 34 | Plug 'ConradIrwin/vim-bracketed-paste' 35 | Plug 'HiPhish/rainbow-delimiters.nvim' 36 | Plug 'AndrewRadev/splitjoin.vim' 37 | Plug 'ntpeters/vim-better-whitespace' 38 | Plug 'machakann/vim-highlightedyank' 39 | Plug 'troydm/zoomwintab.vim' 40 | Plug 'talek/obvious-resize' 41 | Plug 'wesQ3/vim-windowswap' 42 | Plug 'wfxr/minimap.vim' 43 | Plug 'm4xshen/smartcolumn.nvim' 44 | 45 | " Support 46 | Plug 'embear/vim-localvimrc' 47 | Plug 'editorconfig/editorconfig-vim' 48 | Plug 'tpope/vim-surround' 49 | Plug 'tomtom/tcomment_vim' 50 | Plug 'bfredl/nvim-miniyank' 51 | Plug 'skanehira/vsession' 52 | Plug 'wakatime/vim-wakatime' 53 | Plug 'ruanyl/vim-gh-line' 54 | Plug 'ap/vim-css-color' 55 | 56 | " Colorschemes 57 | Plug 'morhetz/gruvbox' 58 | 59 | " Languages 60 | Plug 'b4winckler/vim-objc' 61 | Plug 'rodjek/vim-puppet' 62 | Plug 'fatih/vim-go' 63 | Plug 'dag/vim-fish' 64 | Plug 'HerringtonDarkholme/yats.vim' 65 | Plug 'othree/yajs' 66 | Plug 'jparise/vim-graphql' 67 | Plug 'gkz/vim-ls' 68 | Plug 'chemzqm/vim-jsx-improve' 69 | Plug 'kchmck/vim-coffee-script' 70 | Plug 'hashivim/vim-terraform' 71 | Plug 'hashivim/vim-packer' 72 | Plug 'hashivim/vim-consul' 73 | Plug 'hashivim/vim-vaultproject' 74 | Plug 'juliosueiras/vim-terraform-completion' 75 | Plug 'mustache/vim-mustache-handlebars' 76 | Plug 'ekalinin/Dockerfile.vim' 77 | Plug 'digitaltoad/vim-pug' 78 | Plug 'uarun/vim-protobuf' 79 | Plug 'tpope/vim-markdown' 80 | Plug 'jtratner/vim-flavored-markdown' 81 | Plug 'elixir-editors/vim-elixir' 82 | Plug 'Matt-Deacalion/vim-systemd-syntax' 83 | Plug 'RaafatTurki/hex.nvim' 84 | Plug 'OmniSharp/omnisharp-vim' 85 | Plug 'mfussenegger/nvim-dap' 86 | Plug 'zbirenbaum/copilot.lua' 87 | 88 | " Search 89 | Plug 'haya14busa/incsearch.vim' 90 | Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': { -> fzf#install() } } 91 | Plug 'junegunn/fzf.vim' 92 | Plug 'liuchengxu/vista.vim' 93 | 94 | " Git 95 | Plug 'tpope/vim-fugitive' 96 | Plug 'tpope/vim-rhubarb' 97 | 98 | Plug 'neoclide/coc.nvim', {'branch': 'master', 'do': 'yarn install --frozen-lockfile'} 99 | Plug 'nvim-lua/plenary.nvim' 100 | Plug 'nvim-treesitter/nvim-treesitter' 101 | Plug 'stevearc/dressing.nvim' 102 | Plug 'MunifTanjim/nui.nvim' 103 | Plug 'MeanderingProgrammer/render-markdown.nvim' 104 | 105 | " Optional deps 106 | Plug 'hrsh7th/nvim-cmp' 107 | Plug 'HakonHarnes/img-clip.nvim' 108 | 109 | " Yay, pass source=true if you want to build from source 110 | Plug 'yetone/avante.nvim', { 'branch': 'main', 'do': 'make' } 111 | " }}} 112 | " ##### Plug post-setup {{{ 113 | call plug#end() 114 | " }}} 115 | " ##### Basic options {{{ 116 | " Faster redraws 117 | set lazyredraw 118 | " Use colors on GUI like VimR 119 | set termguicolors 120 | " Don't resize splits on change 121 | set eadirection=hor 122 | " Display incomplete commands. 123 | set noshowcmd 124 | " Display the mode you're in. 125 | set showmode 126 | " Persist only visible buffers. 127 | set sessionoptions-=buffers 128 | 129 | " Intuitive backspacing. 130 | set backspace=indent,eol,start 131 | " Dont keep buffers forever. 132 | set nohidden 133 | 134 | " Enhanced command line completion. 135 | set wildmenu 136 | 137 | " Case-insensitive searching. 138 | set ignorecase 139 | " But case-sensitive if expression contains a capital letter. 140 | set smartcase 141 | 142 | " Show line numbers. 143 | set number 144 | " Show cursor position. 145 | set ruler 146 | " Highlight ruler at colum 72. 147 | set colorcolumn=72 148 | " Highlight current line 149 | set cursorline 150 | 151 | " Highlight matches as you type. 152 | set incsearch 153 | " Don't highlight matches. 154 | set nohlsearch 155 | 156 | " Turn off line wrapping. 157 | set nowrap 158 | " Show 3 lines of context around the cursor. 159 | set scrolloff=3 160 | 161 | " Set the terminal's title 162 | set title 163 | " Set the terminal's title to filename. 164 | set titlestring=%t 165 | " Don't blink screen on stuff 166 | set novb 167 | " Limit terminal's scrollback. 168 | set scrollback=65535 169 | 170 | " Don't make a backup before overwriting a file. 171 | set nobackup 172 | " And again. 173 | set nowritebackup 174 | " Keep swap files in one location 175 | set directory=$HOME/.vim/tmp// 176 | 177 | " Global tab width. 178 | set tabstop=2 179 | " And again, related. 180 | set shiftwidth=2 181 | " And also expand tabs. 182 | set expandtab 183 | 184 | " Files open expanded 185 | set foldlevelstart=50 186 | " Use decent folding 187 | set foldmethod=indent 188 | 189 | " Show the status line all the time 190 | set laststatus=2 191 | 192 | " Always diff using vertical mode 193 | set diffopt+=vertical 194 | 195 | " Automatically reads changed files 196 | set autoread 197 | 198 | " Enable syntax highlighting 199 | syntax on 200 | 201 | " Use a better separator for splits 202 | set fillchars+=eob:\ ,vert:│ 203 | 204 | " Sets the colorscheme for terminal sessions too. 205 | set background=dark 206 | let g:gruvbox_contrast_dark = 'hard' 207 | colorscheme gruvbox 208 | 209 | " Leader = , 210 | let mapleader = "," 211 | let maplocalleader = "'" 212 | 213 | " Fix split opening direction 214 | set splitbelow 215 | set splitright 216 | 217 | " Remove 'press any key to continue' 218 | set cmdheight=2 219 | 220 | " Disable fucked-up SQL completion 221 | let g:omni_sql_no_default_maps = 1 222 | 223 | " Completion 224 | set completeopt=menu,noselect 225 | 226 | " Live replacement 227 | if exists("&inccommand") 228 | set inccommand=split 229 | endif 230 | 231 | " }}} 232 | " ##### General mappings {{{ 233 | " ##### IDE Like {{{ 234 | nmap 1 CocCommand explorer --toggle --focus 235 | nmap 2 :Vista!! 236 | 237 | let g:minimap_auto_start = 1 238 | let g:minimap_fixed_width = 10 239 | let g:minimap_winid = -1 240 | 241 | " Function to enforce fixed width on the minimap window 242 | function! s:EnforceMinimapWidth() 243 | if win_id2win(g:minimap_winid) > 0 244 | call win_execute(g:minimap_winid, 'vertical resize ' . g:minimap_fixed_width) 245 | endif 246 | endfunction 247 | 248 | " Setup when a minimap filetype is detected 249 | function! s:SetupMinimapSplit() 250 | let g:minimap_winid = win_getid() 251 | call s:EnforceMinimapWidth() 252 | endfunction 253 | 254 | " Autocommands 255 | augroup MinimapFixedWidth 256 | autocmd! 257 | autocmd FileType minimap call s:SetupMinimapSplit() 258 | autocmd WinEnter,WinResized * call s:EnforceMinimapWidth() 259 | augroup END 260 | 261 | " }}} 262 | " ##### Line movement {{{ 263 | " Go to start of line with H and to the end with $ 264 | noremap H ^ 265 | noremap L $ 266 | 267 | " Emacs bindings in command-line mode 268 | cnoremap 269 | cnoremap 270 | " }}} 271 | " ##### Tabs {{{ 272 | nnoremap tn :tabnew 273 | nnoremap th :tabprev 274 | nnoremap tl :tabnext 275 | " }}} 276 | " ##### Focus {{{ 277 | nnoremap fs :ZoomWinTabToggle 278 | " }}} 279 | " ##### Folding {{{ 280 | " Toggles folding with space 281 | nnoremap za 282 | " Open all folds 283 | nnoremap zO zR 284 | " Close all folds 285 | nnoremap zM 286 | " Close current fold 287 | nnoremap zc zc 288 | " Close all folds except the current one 289 | nnoremap zf mzzMzvzz 290 | " }}} 291 | " ##### Search {{{ 292 | map / (incsearch-forward) 293 | map ? (incsearch-backward) 294 | map g/ (incsearch-stay) 295 | " }}} 296 | " ##### Spell {{{ 297 | set spelllang=en_us 298 | 299 | nnoremap ,sc :set spell! 300 | " }}} 301 | " ##### Misc {{{ 302 | " Edit and load vimrc 303 | nnoremap ev :vsplit $MYVIMRC 304 | nnoremap sv :source $MYVIMRC 305 | 306 | " Terminal shortcuts 307 | let termshell = systemlist('echo term://`which fish`')[0] 308 | 309 | execute 'noremap tsh :tabnew ' . termshell . '' 310 | execute 'noremap vsh :vsplit ' . termshell . '' 311 | execute 'noremap sh :10split ' . termshell . '' 312 | autocmd FileType gitcommit set bufhidden=delete 313 | command BD bp|bd# 314 | 315 | " Toggles hlsearch 316 | nnoremap hs :set hlsearch! 317 | 318 | " Maps to 319 | noremap 320 | 321 | " Set current file executable 322 | nnoremap xx :!chmod +x % 323 | 324 | " Close Quickfix and Preview 325 | nnoremap q :pclose:cclose 326 | 327 | let g:obvious_resize_default = 8 328 | nnoremap :ObviousResizeLeft 329 | nnoremap :ObviousResizeDown 330 | nnoremap :ObviousResizeUp 331 | nnoremap :ObviousResizeRight 332 | 333 | " OS Clipboard 334 | if has('clipboard') 335 | set clipboard=unnamedplus 336 | endif 337 | 338 | " Navigate splits 339 | nnoremap h 340 | nnoremap l 341 | nnoremap k 342 | nnoremap j 343 | 344 | " Navigate buffer history 345 | noremap :HisTravBack 346 | noremap :HisTravForward 347 | " }}} 348 | " }}} 349 | " ##### Plugin settings {{{ 350 | " ##### Devicons {{{ 351 | let g:webdevicons_enable = 1 352 | let g:WebDevIconsUnicodeGlyphDoubleWidth = 0 353 | 354 | if exists('g:loaded_webdevicons') 355 | call webdevicons#refresh() 356 | endif 357 | " }}} 358 | " ##### VISTA {{{ 359 | let g:vista_default_executive = 'coc' 360 | let g:vista_echo_cursor_strategy = 'both' 361 | let g:vista_sidebar_open_cmd = 'rightbelow30vsplit' 362 | " }}} 363 | " ##### FZF {{{ 364 | let $FZF_DEFAULT_OPTS = '--layout=reverse' 365 | 366 | function! NewFloat() 367 | let opts = { 368 | \ 'relative': 'editor', 369 | \ 'anchor': 'NW', 370 | \ 'col': float2nr((&columns - (&columns * 0.8))/2), 371 | \ 'row': 1, 372 | \ 'width': float2nr(&columns * 0.8), 373 | \ 'height': float2nr(&lines * 0.6) 374 | \} 375 | 376 | let b = nvim_create_buf(v:false, v:true) 377 | let w = nvim_open_win(b, v:true, opts) 378 | startinsert 379 | 380 | call setwinvar(w, '&winhl', 'Normal:Pmenu') 381 | 382 | setlocal 383 | \ buftype=nofile 384 | \ nobuflisted 385 | \ bufhidden=hide 386 | \ nonumber 387 | \ norelativenumber 388 | \ signcolumn=no 389 | 390 | endfunction 391 | 392 | let g:fzf_layout = { 'window': 'call NewFloat()' } 393 | 394 | " Likewise, Files command with preview window 395 | command! -bang -nargs=? -complete=dir GFiles 396 | \ call fzf#vim#gitfiles( 397 | \ getcwd(), 398 | \ fzf#vim#with_preview() 399 | \ ) 400 | " Similarly, we can apply it to fzf#vim#grep. To use ripgrep instead of ag: 401 | command! -bang -nargs=* Rg 402 | \ call fzf#vim#grep( 403 | \ 'rg --column --line-number --no-heading --color=always '.shellescape(), 1, 404 | \ fzf#vim#with_preview(), 405 | \ 0) 406 | nnoremap :GFiles 407 | nnoremap :Rg 408 | nnoremap :Buffers 409 | " }}} 410 | " ##### Yankstack {{{ 411 | " Don't use default mappings 412 | nmap p (miniyank-autoput) 413 | nmap P (miniyank-autoPut) 414 | 415 | nmap (miniyank-cycle) 416 | nmap (miniyank-cycleback) 417 | " }}} 418 | " ##### Closetag {{{ 419 | let g:closetag_filenames = '*.xhtml,*.js,*.jsx' 420 | " }}} 421 | " ##### Number toggle {{{ 422 | let g:NumberToggleTrigger="ll" 423 | "}}} 424 | " ##### Javascript JSX {{{ 425 | let g:jsx_ext_required = 0 " Allow JSX in normal JS files 426 | "}}} 427 | " ##### Terraform {{{ 428 | let g:terraform_fmt_on_save = 1 429 | " }}} 430 | " ##### indent guides {{{ 431 | let g:indentguides_spacechar = '┆' 432 | let g:indentguides_tabchar = '|' 433 | let g:indentguides_ignorelist = ['help', 'text'] 434 | 435 | " }}} 436 | " ##### togglelist {{{ 437 | let g:toggle_list_copen_command="Copen" 438 | " }}} 439 | " ##### localvimrc {{{ 440 | let g:localvimrc_whitelist=$HOME.'/Documents' 441 | let g:localvimrc_persistent=1 442 | " }}} 443 | " ##### editorconfig {{{ 444 | let g:EditorConfig_exclude_patterns = ['fugitive://.*', 'scp://.*', 'term://.*'] 445 | " }}} 446 | " ##### echodoc {{{ 447 | let g:echodoc_enable_at_startup = 1 448 | " }}} 449 | " ##### display images {{{ 450 | "autocmd BufEnter *.png,*.jpg,*.gif exec "! kitty +kitten icat --transfer-mode=stream ".expand("%") | :bw 451 | " }}} 452 | " ##### language client {{{ 453 | 454 | " Required for operations modifying multiple buffers like rename. 455 | set hidden 456 | " Better visibility of messages 457 | set cmdheight=2 458 | " Smaller updatetime for CursorHold & CursorHoldI 459 | set updatetime=300 460 | " don't give |ins-completion-menu| messages. 461 | set shortmess+=c 462 | " always show signcolumns 463 | set signcolumn=yes 464 | " ##### Language Client 465 | 466 | " Give more memory to Node 467 | let g:coc_node_args = ['--max-old-space-size=16384'] 468 | 469 | " Use `[c` and `]c` for navigate diagnostics 470 | nmap [ (coc-diagnostic-prev) 471 | nmap ] (coc-diagnostic-next) 472 | nmap wtf (coc-diagnostic-info) 473 | 474 | " Remap keys for gotos 475 | nmap gd (coc-definition) 476 | nmap gy (coc-type-definition) 477 | nmap gi (coc-implementation) 478 | nmap gr (coc-references) 479 | 480 | " Use K for show documentation in preview window 481 | nnoremap K :call show_documentation() 482 | 483 | " Remap for rename current word 484 | nmap rn (coc-rename) 485 | 486 | " Remap for format selected region 487 | vmap f (coc-format-selected) 488 | nmap f (coc-format-selected) 489 | 490 | " Remap Prettier 491 | nmap pp :CocCommand prettier.formatFile 492 | 493 | function! CheckBackspace() abort 494 | let col = col('.') - 1 495 | return !col || getline('.')[col - 1] =~# '\s' 496 | endfunction 497 | 498 | " Use tab for trigger completion with characters ahead and navigate. 499 | " NOTE: There's always complete item selected by default, you may want to enable 500 | " no select by `"suggest.noselect": true` in your configuration file. 501 | " NOTE: Use command ':verbose imap ' to make sure tab is not mapped by 502 | " other plugin before putting this into your config. 503 | inoremap 504 | \ coc#pum#visible() ? coc#pum#next(1) : 505 | \ CheckBackspace() ? "\" : 506 | \ coc#refresh() 507 | inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" 508 | 509 | " Make to accept selected completion item or notify coc.nvim to format 510 | " u breaks current undo, please make your own choice. 511 | inoremap coc#pum#visible() ? coc#pum#confirm() 512 | \: "\u\\=coc#on_enter()\" 513 | 514 | " Use to trigger completion. 515 | if has('nvim') 516 | inoremap coc#refresh() 517 | else 518 | inoremap coc#refresh() 519 | endif 520 | 521 | function! s:show_documentation() 522 | if &filetype == 'vim' 523 | execute 'h '.expand('') 524 | else 525 | call CocAction('doHover') 526 | endif 527 | endfunction 528 | 529 | " Highlight symbol under cursor on CursorHold 530 | hi CocHighlightText cterm=underline 531 | hi link CocHighlightRead CocHighlightText 532 | hi link CocHighlightWrite CocHighlightText 533 | 534 | autocmd CursorHold * silent call CocActionAsync('highlight') 535 | 536 | augroup mygroup 537 | autocmd! 538 | " Setup formatexpr specified filetype(s). 539 | autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') 540 | " Update signature help on jump placeholder 541 | autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') 542 | augroup end 543 | 544 | " Remap for do codeAction of selected region 545 | vmap vca (coc-codeaction-selected) 546 | nmap vca (coc-codeaction-selected) 547 | 548 | " Remap for do codeAction of current line 549 | nmap ca (coc-codeaction) 550 | " Fix autofix problem of current line 551 | nmap qf (coc-fix-current) 552 | 553 | " Use `:Format` for format current buffer 554 | command! -nargs=0 Format :call CocAction('format') 555 | 556 | " Use `:Fold` for fold current buffer 557 | command! -nargs=? Fold :call CocAction('fold', ) 558 | 559 | " Mappings for CoCList 560 | " Show all diagnostics. 561 | nnoremap d :CocList diagnostics 562 | " Manage extensions. 563 | nnoremap e :CocList extensions 564 | " Show commands. 565 | nnoremap c :CocList commands 566 | " Find symbol of current document. 567 | nnoremap o :CocList outline 568 | " Search workspace symbols. 569 | nnoremap s :CocList -I symbols 570 | " Resume latest coc list. 571 | nnoremap p :CocListResume 572 | " Open coc marketplace. 573 | nnoremap m :CocList marketplace 574 | 575 | """ Multiple cursors 576 | let g:VM_maps = {} 577 | let g:VM_maps["Add Cursor Down"] = '' 578 | let g:VM_maps["Add Cursor Up"] = '' 579 | let g:VM_maps["Undo"] = 'u' 580 | let g:VM_maps["Redo"] = '' 581 | let g:VM_maps["Select l"] = '' 582 | let g:VM_maps["Select h"] = '' 583 | 584 | " }}} 585 | 586 | lua << EOF 587 | 588 | require('copilot').setup({ 589 | suggestion = { 590 | auto_trigger = true, 591 | keymap = { 592 | accept = "" 593 | } 594 | } 595 | }) 596 | 597 | require('avante').setup({ 598 | provider = 'ollama', 599 | ollama = { 600 | endpoint = "http://127.0.0.1:11434", -- Note that there is no /v1 at the end. 601 | model = "codestral", 602 | stream = true 603 | }, 604 | }) 605 | 606 | require('lualine').setup { 607 | options = { 608 | icons_enabled = true, 609 | theme = 'gruvbox_dark', 610 | component_separators = { left = '', right = '' }, 611 | section_separators = { left = '', right = '' }, 612 | disabled_filetypes = { 'minimap', 'coc-explorer', 'vista' }, 613 | always_divide_middle = true, 614 | globalstatus = false, 615 | refresh = { statusline = 100, tabline = 100, winbar = 100 }, 616 | ignore_focus = {'minimap', 'coc-explorer', 'vista'}, 617 | }, 618 | sections = { 619 | lualine_a = { 620 | { 621 | 'mode', 622 | fmt = function(str) return str:sub(1,1) end, 623 | } 624 | }, 625 | lualine_b = { 626 | { 627 | function() 628 | local icon = vim.fn['WebDevIconsGetFileTypeSymbol']() 629 | -- Use term title if available, else fallback to file name 630 | local title = vim.b.term_title or vim.fn.expand('%:t') 631 | local modified = vim.bo.modified and ' ●' or '' 632 | return icon .. ' ' .. title .. modified 633 | end, 634 | }, 635 | { 636 | 'location', 637 | cond = function() 638 | return vim.bo.buftype ~= 'terminal' 639 | end, 640 | }, 641 | }, 642 | lualine_c = {}, 643 | lualine_x = { 644 | { 645 | function() 646 | return vim.b.coc_current_function or '' 647 | end, 648 | }, 649 | }, 650 | lualine_y = {}, 651 | lualine_z = { 652 | { 'branch' }, 653 | }, 654 | }, 655 | tabline = {}, 656 | winbar = {}, 657 | inactive_winbar = {}, 658 | extensions = {} 659 | } 660 | 661 | EOF 662 | 663 | autocmd! User avante.nvim 664 | 665 | " }}} 666 | " ##### Filetype-specific {{{ 667 | " ##### Ruby {{{ 668 | " Specific shiftwidth for ruby files 669 | autocmd FileType ruby set shiftwidth=2 670 | autocmd FileType ruby set tabstop=2 671 | " Convert tabs to spaces in Ruby files 672 | autocmd FileType ruby set expandtab 673 | 674 | " But not for erb files... 675 | autocmd FileType eruby set shiftwidth=4 676 | autocmd FileType eruby set tabstop=4 677 | " 678 | " Remaps textobj-rubyblock's bindings to vim's defaults 679 | autocmd FileType ruby map aB ar 680 | autocmd FileType ruby map iB ir 681 | " }}} 682 | " ##### CoffeeScript {{{ 683 | " CJSX is also Coffee, with JSX 684 | autocmd BufRead,BufNewFile *.cjsx set filetype=coffee 685 | " Convert tabs to spaces in Coffee files 686 | autocmd FileType coffee set expandtab 687 | " }}} 688 | " ##### Puppet {{{ 689 | " Specific shiftwidth for puppet files 690 | autocmd BufRead,BufNewFile *.pp set filetype=puppet 691 | autocmd BufRead,BufNewFile Puppetfile set filetype=ruby 692 | 693 | " And custom tab sizes too 694 | autocmd FileType puppet set shiftwidth=2 695 | autocmd FileType puppet set tabstop=2 696 | " }}} 697 | " ##### Markdown {{{ 698 | " Sets markdown syntax for *.md files. 699 | autocmd BufRead,BufNewFile *.md,*.markdown set filetype=ghmarkdown 700 | 701 | " Wrap markdown files. 702 | autocmd BufRead,BufNewFile *.md set wrap 703 | " }}} 704 | " ##### JavaScript {{{ 705 | 706 | autocmd BufRead,BufNewFile *.js set shiftwidth=2 707 | autocmd BufRead,BufNewFile *.js set expandtab 708 | 709 | " Sets html syntax for *.ejs files. 710 | autocmd BufRead,BufNewFile *.ejs set filetype=html 711 | 712 | " Sets JSX syntax for all .js files 713 | let g:jsx_ext_required = 0 714 | " }}} 715 | " ##### Vim {{{ 716 | " Make vimrcs open folded 717 | autocmd FileType vim set foldlevel=0 718 | autocmd FileType vim set foldmethod=marker 719 | " }}} 720 | " ##### XML {{{ 721 | " Automatically format XML files 722 | nnoremap xb :%s,>[ ]*<,>\r<,g gg=G 723 | " }}} 724 | " ##### LiveScript {{{ 725 | autocmd BufRead,BufNewFile *.ls set filetype=ls 726 | autocmd FileType ls set shiftwidth=2 727 | autocmd FileType ls set tabstop=2 728 | " }}} 729 | " ##### YAML {{{ 730 | autocmd FileType yaml set shiftwidth=2 731 | autocmd FileType yaml set tabstop=2 732 | " }}} 733 | " ##### LookML {{{ 734 | " Sets YAML syntax for *.lookml files. 735 | autocmd BufRead,BufNewFile *.lookml set filetype=yaml 736 | " }}} 737 | " ##### Erlang {{{ 738 | autocmd BufRead,BufNewFile *.erl set filetype=erlang 739 | autocmd FileType erlang set shiftwidth=2 740 | autocmd FileType erlang set tabstop=2 741 | " }}} 742 | " ##### Elixir {{{ 743 | autocmd BufRead,BufNewFile *.ex set filetype=elixir 744 | autocmd BufRead,BufNewFile *.exs set filetype=elixir 745 | autocmd FileType elixir set shiftwidth=2 746 | autocmd FileType elixir set tabstop=2 747 | " }}} 748 | " ##### Go {{{ 749 | autocmd FileType go set foldmethod=syntax 750 | 751 | autocmd FileType go let g:go_highlight_functions = 1 752 | autocmd FileType go let g:go_highlight_methods = 1 753 | autocmd FileType go let g:go_highlight_fields = 1 754 | autocmd FileType go let g:go_highlight_types = 1 755 | autocmd FileType go let g:go_highlight_operators = 1 756 | autocmd FileType go let g:go_highlight_build_constraints = 1 757 | 758 | autocmd BufWritePost *.go :GoImports 759 | " }}} 760 | " ##### Rocker {{{ 761 | autocmd BufRead,BufNewFile Rockerfile* set filetype=dockerfile 762 | " }}} 763 | " ##### Fish {{{ 764 | autocmd FileType fish compiler fish 765 | autocmd FileType fish setlocal textwidth=79 766 | autocmd FileType fish setlocal foldmethod=expr 767 | " }}} 768 | " }}} 769 | " }}} 770 | 771 | autocmd BufEnter * if &buftype ==# 'terminal' | set signcolumn=no | endif 772 | function! Clear() 773 | :execute "set scrollback=1" 774 | :execute "set scrollback=-1" 775 | endfunction 776 | :command! -nargs=0 Clear :call Clear() 777 | 778 | " ##### Configure workspace {{{ 779 | " Open terminal if no terminal is open 780 | if len(filter(getbufinfo(), 'v:val.name =~ "term:"')) == 0 781 | execute 'bot 14new ' . termshell . ' | wincmd p' 782 | endif 783 | " }}} 784 | --------------------------------------------------------------------------------