summaryrefslogtreecommitdiffstats
path: root/runtime/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/plugin')
-rw-r--r--runtime/plugin/README.txt21
-rw-r--r--runtime/plugin/getscriptPlugin.vim41
-rw-r--r--runtime/plugin/gzip.vim60
-rw-r--r--runtime/plugin/logiPat.vim339
-rw-r--r--runtime/plugin/manpager.vim51
-rw-r--r--runtime/plugin/matchparen.vim225
-rw-r--r--runtime/plugin/netrwPlugin.vim223
-rw-r--r--runtime/plugin/rrhelper.vim48
-rw-r--r--runtime/plugin/spellfile.vim15
-rw-r--r--runtime/plugin/tarPlugin.vim56
-rw-r--r--runtime/plugin/tohtml.vim235
-rw-r--r--runtime/plugin/vimballPlugin.vim43
-rw-r--r--runtime/plugin/zipPlugin.vim56
13 files changed, 1413 insertions, 0 deletions
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt
new file mode 100644
index 0000000..11bf1e9
--- /dev/null
+++ b/runtime/plugin/README.txt
@@ -0,0 +1,21 @@
+The plugin directory is for standard Vim plugin scripts.
+
+All files here ending in .vim will be sourced by Vim when it starts up.
+Look in the file for hints on how it can be disabled without deleting it.
+
+getscriptPlugin.vim get latest version of Vim scripts
+gzip.vim edit compressed files
+logiPat.vim logical operators on patterns
+manpager.vim using Vim as manpager
+matchparen.vim highlight paren matching the one under the cursor
+netrwPlugin.vim edit files over a network and browse (remote) directories
+rrhelper.vim used for --remote-wait editing
+spellfile.vim download a spellfile when it's missing
+tarPlugin.vim edit (compressed) tar files
+tohtml.vim convert a file with syntax highlighting to HTML
+vimballPlugin.vim create and unpack .vba files
+zipPlugin.vim edit zip archives
+
+Note: the explorer.vim plugin is no longer here, the netrw.vim plugin has
+taken over browsing directories (also for remote directories).
+
diff --git a/runtime/plugin/getscriptPlugin.vim b/runtime/plugin/getscriptPlugin.vim
new file mode 100644
index 0000000..8faa029
--- /dev/null
+++ b/runtime/plugin/getscriptPlugin.vim
@@ -0,0 +1,41 @@
+" ---------------------------------------------------------------------
+" getscriptPlugin.vim
+" Author: Charles E. Campbell
+" Date: Nov 29, 2013
+" Installing: :help glvs-install
+" Usage: :help glvs
+"
+" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
+"
+" (Rom 15:11 WEB) Again, "Praise the Lord, all you Gentiles! Let
+" all the peoples praise Him."
+" ---------------------------------------------------------------------
+" Initialization: {{{1
+" if you're sourcing this file, surely you can't be
+" expecting vim to be in its vi-compatible mode
+if exists("g:loaded_getscriptPlugin")
+ finish
+endif
+if &cp
+ if &verbose
+ echo "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)"
+ endif
+ finish
+endif
+let g:loaded_getscriptPlugin = "v36"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+com! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
+com! -nargs=0 GetScripts call getscript#GetLatestVimScripts()
+sil! com -nargs=0 GLVS call getscript#GetLatestVimScripts()
+
+" ---------------------------------------------------------------------
+" Restore Options: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+" ---------------------------------------------------------------------
+" vim: ts=8 sts=2 fdm=marker nowrap
diff --git a/runtime/plugin/gzip.vim b/runtime/plugin/gzip.vim
new file mode 100644
index 0000000..7214488
--- /dev/null
+++ b/runtime/plugin/gzip.vim
@@ -0,0 +1,60 @@
+" Vim plugin for editing compressed files.
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2016 Oct 30
+
+" Exit quickly when:
+" - this plugin was already loaded
+" - when 'compatible' is set
+" - some autocommands are already taking care of compressed files
+if exists("loaded_gzip") || &cp || exists("#BufReadPre#*.gz")
+ finish
+endif
+let loaded_gzip = 1
+
+augroup gzip
+ " Remove all gzip autocommands
+ au!
+
+ " Enable editing of gzipped files.
+ " The functions are defined in autoload/gzip.vim.
+ "
+ " Set binary mode before reading the file.
+ " Use "gzip -d", gunzip isn't always available.
+ autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz,*.lz,*.zst,*.br,*.lzo setlocal bin
+ autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn")
+ autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d")
+ autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress")
+ autocmd BufReadPost,FileReadPost *.lzma call gzip#read("lzma -d")
+ autocmd BufReadPost,FileReadPost *.xz call gzip#read("xz -d")
+ autocmd BufReadPost,FileReadPost *.lz call gzip#read("lzip -d")
+ autocmd BufReadPost,FileReadPost *.zst call gzip#read("zstd -d --rm")
+ autocmd BufReadPost,FileReadPost *.br call gzip#read("brotli -d --rm")
+ autocmd BufReadPost,FileReadPost *.lzo call gzip#read("lzop -d -U")
+ autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip")
+ autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2")
+ autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f")
+ autocmd BufWritePost,FileWritePost *.lzma call gzip#write("lzma -z")
+ autocmd BufWritePost,FileWritePost *.xz call gzip#write("xz -z")
+ autocmd BufWritePost,FileWritePost *.lz call gzip#write("lzip")
+ autocmd BufWritePost,FileWritePost *.zst call gzip#write("zstd --rm")
+ autocmd BufWritePost,FileWritePost *.br call gzip#write("brotli --rm")
+ autocmd BufWritePost,FileWritePost *.lzo call gzip#write("lzop -U")
+ autocmd FileAppendPre *.gz call gzip#appre("gzip -dn")
+ autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d")
+ autocmd FileAppendPre *.Z call gzip#appre("uncompress")
+ autocmd FileAppendPre *.lzma call gzip#appre("lzma -d")
+ autocmd FileAppendPre *.xz call gzip#appre("xz -d")
+ autocmd FileAppendPre *.lz call gzip#appre("lzip -d")
+ autocmd FileAppendPre *.zst call gzip#appre("zstd -d --rm")
+ autocmd FileAppendPre *.br call gzip#appre("brotli -d --rm")
+ autocmd FileAppendPre *.lzo call gzip#appre("lzop -d -U")
+ autocmd FileAppendPost *.gz call gzip#write("gzip")
+ autocmd FileAppendPost *.bz2 call gzip#write("bzip2")
+ autocmd FileAppendPost *.Z call gzip#write("compress -f")
+ autocmd FileAppendPost *.lzma call gzip#write("lzma -z")
+ autocmd FileAppendPost *.xz call gzip#write("xz -z")
+ autocmd FileAppendPost *.lz call gzip#write("lzip")
+ autocmd FileAppendPost *.zst call gzip#write("zstd --rm")
+ autocmd FileAppendPost *.br call gzip#write("brotli --rm")
+ autocmd FileAppendPost *.lzo call gzip#write("lzop -U")
+augroup END
diff --git a/runtime/plugin/logiPat.vim b/runtime/plugin/logiPat.vim
new file mode 100644
index 0000000..47fabe9
--- /dev/null
+++ b/runtime/plugin/logiPat.vim
@@ -0,0 +1,339 @@
+" LogiPat: Boolean logical pattern matcher
+" Author: Charles E. Campbell
+" Date: Apr 04, 2016
+" Version: 4
+" Purpose: to do Boolean-logic based regular expression pattern matching
+" Copyright: Copyright (C) 1999-2011 Charles E. Campbell {{{1
+" Permission is hereby granted to use and distribute this code,
+" with or without modifications, provided that this copyright
+" notice is copied with it. Like most anything else that's free,
+" LogiPat.vim is provided *as is* and comes with no warranty
+" of any kind, either expressed or implied. By using this
+" plugin, you agree that in no event will the copyright
+" holder be liable for any damages resulting from the use
+" of this software.
+"
+" Usage: {{{1
+" :LogiPat ...
+"
+" Boolean logic supported:
+" () grouping operators
+" ! not the following pattern
+" | logical or
+" & logical and
+" "..pattern.."
+" Example: {{{1
+" :LogiPat !("january"|"february")
+" would match all strings not containing the strings january
+" or february
+" GetLatestVimScripts: 1290 1 :AutoInstall: LogiPat.vim
+"
+" Behold, you will conceive in your womb, and bring forth a son, {{{1
+" and will call his name Jesus. He will be great, and will be
+" called the Son of the Most High. The Lord God will give him the
+" throne of his father, David, and he will reign over the house of
+" Jacob forever. There will be no end to his kingdom. (Luke 1:31-33 WEB)
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("loaded_logiPat")
+ finish
+endif
+let g:loaded_logiPat = "v4"
+let s:keepcpo = &cpo
+set cpo&vim
+"DechoRemOn
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+com! -nargs=* LogiPat call LogiPat(<q-args>,1)
+sil! com -nargs=* LP call LogiPat(<q-args>,1)
+sil! com -nargs=* LPR call LogiPat(<q-args>,1,"r")
+com! -nargs=+ LPE echomsg LogiPat(<q-args>)
+com! -nargs=+ LogiPatFlags let s:LogiPatFlags="<args>"
+sil! com -nargs=+ LPF let s:LogiPatFlags="<args>"
+
+" =====================================================================
+" Functions: {{{1
+
+" ---------------------------------------------------------------------
+" LogiPat: this function interprets the boolean-logic pattern {{{2
+fun! LogiPat(pat,...)
+" call Dfunc("LogiPat(pat<".a:pat.">)")
+
+ " LogiPat(pat,dosearch)
+ if a:0 > 0
+ let dosearch= a:1
+ else
+ let dosearch= 0
+ endif
+ if a:0 >= 3
+ let s:LogiPatFlags= a:3
+ endif
+
+ let s:npatstack = 0
+ let s:nopstack = 0
+ let s:preclvl = 0
+ let expr = a:pat
+
+ " Lexer/Parser
+ while expr != ""
+" call Decho("expr<".expr.">")
+
+ if expr =~ '^"'
+ " push a Pattern; accept "" as a single " in the pattern
+ let expr = substitute(expr,'^\s*"','','')
+ let pat = substitute(expr,'^\(\%([^"]\|\"\"\)\{-}\)"\([^"].*$\|$\)','\1','')
+ let pat = substitute(pat,'""','"','g')
+ let expr = substitute(expr,'^\(\%([^"]\|\"\"\)\{-}\)"\([^"].*$\|$\)','\2','')
+ let expr = substitute(expr,'^\s*','','')
+" call Decho("pat<".pat."> expr<".expr.">")
+
+ call s:LP_PatPush('.*'.pat.'.*')
+
+ elseif expr =~ '^[!()|&]'
+ " push an operator
+ let op = strpart(expr,0,1)
+ let expr = strpart(expr,strlen(op))
+ " allow for those who can't resist doubling their and/or operators
+ if op =~ '[|&]' && expr[0] == op
+ let expr = strpart(expr,strlen(op))
+ endif
+ call s:LP_OpPush(op)
+
+ elseif expr =~ '^\s'
+ " skip whitespace
+ let expr= strpart(expr,1)
+
+ else
+ echoerr "operator<".strpart(expr,0,1)."> not supported (yet)"
+ let expr= strpart(expr,1)
+ endif
+
+ endwhile
+
+ " Final Execution
+ call s:LP_OpPush('Z')
+
+ let result= s:LP_PatPop(1)
+" call Decho("result=".result)
+
+ " sanity checks and cleanup
+ if s:npatstack > 0
+ echoerr s:npatstack." patterns left on stack!"
+ let s:npatstack= 0
+ endif
+ if s:nopstack > 0
+ echoerr s:nopstack." operators left on stack!"
+ let s:nopstack= 0
+ endif
+
+ " perform the indicated search
+ if dosearch
+ if exists("s:LogiPatFlags") && s:LogiPatFlags != ""
+" call Decho("search(result<".result."> LogiPatFlags<".s:LogiPatFlags.">)")
+ call search(result,s:LogiPatFlags)
+ else
+" call Decho("search(result<".result.">)")
+ call search(result)
+ endif
+ let @/= result
+ endif
+
+" call Dret("LogiPat ".result)
+ return result
+endfun
+
+" ---------------------------------------------------------------------
+" s:String: Vim6.4 doesn't have string() {{{2
+func! s:String(str)
+ return "'".escape(a:str, '"')."'"
+endfunc
+
+" ---------------------------------------------------------------------
+" LP_PatPush: {{{2
+fun! s:LP_PatPush(pat)
+" call Dfunc("LP_PatPush(pat<".a:pat.">)")
+ let s:npatstack = s:npatstack + 1
+ let s:patstack_{s:npatstack} = a:pat
+" call s:StackLook("patpush") "Decho
+" call Dret("LP_PatPush : npatstack=".s:npatstack)
+endfun
+
+" ---------------------------------------------------------------------
+" LP_PatPop: pop a number/variable from LogiPat's pattern stack {{{2
+fun! s:LP_PatPop(lookup)
+" call Dfunc("LP_PatPop(lookup=".a:lookup.")")
+ if s:npatstack > 0
+ let ret = s:patstack_{s:npatstack}
+ let s:npatstack = s:npatstack - 1
+ else
+ let ret= "---error---"
+ echoerr "(LogiPat) invalid expression"
+ endif
+" call s:StackLook("patpop") "Decho
+" call Dret("LP_PatPop ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" LP_OpPush: {{{2
+fun! s:LP_OpPush(op)
+" call Dfunc("LP_OpPush(op<".a:op.">)")
+
+ " determine new operator's precedence level
+ if a:op == '('
+ let s:preclvl= s:preclvl + 10
+ let preclvl = s:preclvl
+ elseif a:op == ')'
+ let s:preclvl= s:preclvl - 10
+ if s:preclvl < 0
+ let s:preclvl= 0
+ echoerr "too many )s"
+ endif
+ let preclvl= s:preclvl
+ elseif a:op =~ '|'
+ let preclvl= s:preclvl + 2
+ elseif a:op =~ '&'
+ let preclvl= s:preclvl + 4
+ elseif a:op == '!'
+ let preclvl= s:preclvl + 6
+ elseif a:op == 'Z'
+ let preclvl= -1
+ else
+ echoerr "expr<".expr."> not supported (yet)"
+ let preclvl= s:preclvl
+ endif
+" call Decho("new operator<".a:op."> preclvl=".preclvl)
+
+ " execute higher-precdence operators
+" call Decho("execute higher-precedence operators")
+ call s:LP_Execute(preclvl)
+
+ " push new operator onto operator-stack
+" call Decho("push new operator<".a:op."> onto stack with preclvl=".preclvl." at nopstack=".(s:nopstack+1))
+ if a:op =~ '!'
+ let s:nopstack = s:nopstack + 1
+ let s:opprec_{s:nopstack} = preclvl
+ let s:opstack_{s:nopstack} = a:op
+ elseif a:op =~ '|'
+ let s:nopstack = s:nopstack + 1
+ let s:opprec_{s:nopstack} = preclvl
+ let s:opstack_{s:nopstack} = a:op
+ elseif a:op == '&'
+ let s:nopstack = s:nopstack + 1
+ let s:opprec_{s:nopstack} = preclvl
+ let s:opstack_{s:nopstack} = a:op
+ endif
+
+" call s:StackLook("oppush") "Decho
+" call Dret("LP_OpPush : s:preclvl=".s:preclvl)
+endfun
+
+" ---------------------------------------------------------------------
+" LP_Execute: execute operators from opstack using pattern stack {{{2
+fun! s:LP_Execute(preclvl)
+" call Dfunc("LP_Execute(preclvl=".a:preclvl.") npatstack=".s:npatstack." nopstack=".s:nopstack)
+
+ " execute all higher precedence operators
+ while s:nopstack > 0 && a:preclvl < s:opprec_{s:nopstack}
+ let op= s:opstack_{s:nopstack}
+" call Decho("op<".op."> nop=".s:nopstack." [preclvl=".a:preclvl."] < [opprec_".s:nopstack."=".s:opprec_{s:nopstack}."]")
+
+ let s:nopstack = s:nopstack - 1
+
+ if op == '!'
+ let n1= s:LP_PatPop(1)
+ call s:LP_PatPush(s:LP_Not(n1))
+
+ elseif op == '|'
+ let n1= s:LP_PatPop(1)
+ let n2= s:LP_PatPop(1)
+ call s:LP_PatPush(s:LP_Or(n2,n1))
+
+ elseif op =~ '&'
+ let n1= s:LP_PatPop(1)
+ let n2= s:LP_PatPop(1)
+ call s:LP_PatPush(s:LP_And(n2,n1))
+ endif
+
+" call s:StackLook("execute") "Decho
+ endwhile
+
+" call Dret("LP_Execute")
+endfun
+
+" ---------------------------------------------------------------------
+" LP_Not: writes a logical-not for a pattern {{{2
+fun! s:LP_Not(pat)
+" call Dfunc("LP_Not(pat<".a:pat.">)")
+ if a:pat =~ '^\.\*' && a:pat =~ '\.\*$'
+ let pat= substitute(a:pat,'^\.\*\(.*\)\.\*$','\1','')
+ let ret= '^\%(\%('.pat.'\)\@!.\)*$'
+ else
+ let ret= '^\%(\%('.a:pat.'\)\@!.\)*$'
+ endif
+" call Dret("LP_Not ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" LP_Or: writes a logical-or branch using two patterns {{{2
+fun! s:LP_Or(pat1,pat2)
+" call Dfunc("LP_Or(pat1<".a:pat1."> pat2<".a:pat2.">)")
+ let ret= '\%('.a:pat1.'\|'.a:pat2.'\)'
+" call Dret("LP_Or ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" LP_And: writes a logical-and concat using two patterns {{{2
+fun! s:LP_And(pat1,pat2)
+" call Dfunc("LP_And(pat1<".a:pat1."> pat2<".a:pat2.">)")
+ let ret= '\%('.a:pat1.'\&'.a:pat2.'\)'
+" call Dret("LP_And ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" StackLook: {{{2
+fun! s:StackLook(description)
+" call Dfunc("StackLook(description<".a:description.">)")
+ let iop = 1
+ let ifp = 1
+" call Decho("Pattern Operator")
+
+ " print both pattern and operator
+ while ifp <= s:npatstack && iop <= s:nopstack
+ let fp = s:patstack_{ifp}
+ let op = s:opstack_{iop}." (P".s:opprec_{s:nopstack}.')'
+ let fplen= strlen(fp)
+ if fplen < 30
+ let fp= fp.strpart(" ",1,30-fplen)
+ endif
+" call Decho(fp.op)
+ let ifp = ifp + 1
+ let iop = iop + 1
+ endwhile
+
+ " print just pattern
+ while ifp <= s:npatstack
+ let fp = s:patstack_{ifp}
+" call Decho(fp)
+ let ifp = ifp + 1
+ endwhile
+
+ " print just operator
+ while iop <= s:nopstack
+ let op = s:opstack_{iop}." (P".s:opprec_{s:nopstack}.')'
+" call Decho(" ".op)
+ let iop = iop + 1
+ endwhile
+" call Dret("StackLook")
+endfun
+
+" ---------------------------------------------------------------------
+" Cleanup And Modeline: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker
diff --git a/runtime/plugin/manpager.vim b/runtime/plugin/manpager.vim
new file mode 100644
index 0000000..1738dc9
--- /dev/null
+++ b/runtime/plugin/manpager.vim
@@ -0,0 +1,51 @@
+" Vim plugin for using Vim as manpager.
+" Maintainer: Enno Nagel <ennonagel+vim@gmail.com>
+" Last Change: 2022 Oct 17
+
+if exists('g:loaded_manpager_plugin')
+ finish
+endif
+let g:loaded_manpager_plugin = 1
+
+" Set up the current buffer (likely read from stdin) as a manpage
+command MANPAGER call s:ManPager()
+
+function s:ManPager()
+ " global options, keep these to a minimum to avoid side effects
+ if &compatible
+ set nocompatible
+ endif
+ if exists('+viminfofile')
+ set viminfofile=NONE
+ endif
+ syntax on
+
+ " Make this an unlisted, readonly scratch buffer
+ setlocal buftype=nofile noswapfile bufhidden=hide nobuflisted readonly
+
+ " Ensure text width matches window width
+ setlocal foldcolumn& nofoldenable nonumber norelativenumber
+
+ " In case Vim was invoked with -M
+ setlocal modifiable
+
+ " Emulate 'col -b'
+ silent! keepj keepp %s/\v(.)\b\ze\1?//ge
+
+ " Remove ansi sequences
+ silent! keepj keepp %s/\v\e\[%(%(\d;)?\d{1,2})?[mK]//ge
+
+ " Remove empty lines above the header
+ call cursor(1, 1)
+ let n = search(".*(.*)", "c")
+ if n > 1
+ exe "1," . n-1 . "d"
+ endif
+
+ " Finished preprocessing the buffer, prevent any further modifications
+ setlocal nomodified nomodifiable
+
+ " Set filetype to man even if ftplugin is disabled
+ setlocal filetype=man
+ runtime ftplugin/man.vim
+endfunction
diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim
new file mode 100644
index 0000000..e19b283
--- /dev/null
+++ b/runtime/plugin/matchparen.vim
@@ -0,0 +1,225 @@
+" Vim plugin for showing matching parens
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Dec 01
+
+" Exit quickly when:
+" - this plugin was already loaded (or disabled)
+" - when 'compatible' is set
+if exists("g:loaded_matchparen") || &cp
+ finish
+endif
+let g:loaded_matchparen = 1
+
+if !exists("g:matchparen_timeout")
+ let g:matchparen_timeout = 300
+endif
+if !exists("g:matchparen_insert_timeout")
+ let g:matchparen_insert_timeout = 60
+endif
+
+augroup matchparen
+ " Replace all matchparen autocommands
+ autocmd! CursorMoved,CursorMovedI,WinEnter,BufWinEnter,WinScrolled * call s:Highlight_Matching_Pair()
+ autocmd! WinLeave,BufLeave * call s:Remove_Matches()
+ if exists('##TextChanged')
+ autocmd! TextChanged,TextChangedI * call s:Highlight_Matching_Pair()
+ endif
+augroup END
+
+" Skip the rest if it was already done.
+if exists("*s:Highlight_Matching_Pair")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" The function that is invoked (very often) to define a ":match" highlighting
+" for any matching paren.
+func s:Highlight_Matching_Pair()
+ " Remove any previous match.
+ call s:Remove_Matches()
+
+ " Avoid that we remove the popup menu.
+ " Return when there are no colors (looks like the cursor jumps).
+ if pumvisible() || (&t_Co < 8 && !has("gui_running"))
+ return
+ endif
+
+ " Get the character under the cursor and check if it's in 'matchpairs'.
+ let c_lnum = line('.')
+ let c_col = col('.')
+ let before = 0
+
+ let text = getline(c_lnum)
+ let matches = matchlist(text, '\(.\)\=\%'.c_col.'c\(.\=\)')
+ if empty(matches)
+ let [c_before, c] = ['', '']
+ else
+ let [c_before, c] = matches[1:2]
+ endif
+ let plist = split(&matchpairs, '.\zs[:,]')
+ let i = index(plist, c)
+ if i < 0
+ " not found, in Insert mode try character before the cursor
+ if c_col > 1 && (mode() == 'i' || mode() == 'R')
+ let before = strlen(c_before)
+ let c = c_before
+ let i = index(plist, c)
+ endif
+ if i < 0
+ " not found, nothing to do
+ return
+ endif
+ endif
+
+ " Figure out the arguments for searchpairpos().
+ if i % 2 == 0
+ let s_flags = 'nW'
+ let c2 = plist[i + 1]
+ else
+ let s_flags = 'nbW'
+ let c2 = c
+ let c = plist[i - 1]
+ endif
+ if c == '['
+ let c = '\['
+ let c2 = '\]'
+ endif
+
+ " Find the match. When it was just before the cursor move it there for a
+ " moment.
+ if before > 0
+ let has_getcurpos = exists("*getcurpos")
+ if has_getcurpos
+ " getcurpos() is more efficient but doesn't exist before 7.4.313.
+ let save_cursor = getcurpos()
+ else
+ let save_cursor = winsaveview()
+ endif
+ call cursor(c_lnum, c_col - before)
+ endif
+
+ if !has("syntax") || !exists("g:syntax_on")
+ let s_skip = "0"
+ else
+ " Build an expression that detects whether the current cursor position is
+ " in certain syntax types (string, comment, etc.), for use as
+ " searchpairpos()'s skip argument.
+ " We match "escape" for special items, such as lispEscapeSpecial, and
+ " match "symbol" for lispBarSymbol.
+ let s_skip = 'synstack(".", col("."))'
+ \ . '->indexof({_, id -> synIDattr(id, "name") =~? '
+ \ . '"string\\|character\\|singlequote\\|escape\\|symbol\\|comment"}) >= 0'
+ " If executing the expression determines that the cursor is currently in
+ " one of the syntax types, then we want searchpairpos() to find the pair
+ " within those syntax types (i.e., not skip). Otherwise, the cursor is
+ " outside of the syntax types and s_skip should keep its value so we skip
+ " any matching pair inside the syntax types.
+ " Catch if this throws E363: pattern uses more memory than 'maxmempattern'.
+ try
+ execute 'if ' . s_skip . ' | let s_skip = "0" | endif'
+ catch /^Vim\%((\a\+)\)\=:E363/
+ " We won't find anything, so skip searching, should keep Vim responsive.
+ return
+ endtry
+ endif
+
+ " Limit the search to lines visible in the window.
+ let stoplinebottom = line('w$')
+ let stoplinetop = line('w0')
+ if i % 2 == 0
+ let stopline = stoplinebottom
+ else
+ let stopline = stoplinetop
+ endif
+
+ " Limit the search time to 300 msec to avoid a hang on very long lines.
+ " This fails when a timeout is not supported.
+ if mode() == 'i' || mode() == 'R'
+ let timeout = exists("b:matchparen_insert_timeout") ? b:matchparen_insert_timeout : g:matchparen_insert_timeout
+ else
+ let timeout = exists("b:matchparen_timeout") ? b:matchparen_timeout : g:matchparen_timeout
+ endif
+ try
+ let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, timeout)
+ catch /E118/
+ " Can't use the timeout, restrict the stopline a bit more to avoid taking
+ " a long time on closed folds and long lines.
+ " The "viewable" variables give a range in which we can scroll while
+ " keeping the cursor at the same position.
+ " adjustedScrolloff accounts for very large numbers of scrolloff.
+ let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2])
+ let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2])
+ let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2])
+ " one of these stoplines will be adjusted below, but the current values are
+ " minimal boundaries within the current window
+ if i % 2 == 0
+ if has("byte_offset") && has("syntax_items") && &smc > 0
+ let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2])
+ let stopline = min([bottom_viewable, byte2line(stopbyte)])
+ else
+ let stopline = min([bottom_viewable, c_lnum + 100])
+ endif
+ let stoplinebottom = stopline
+ else
+ if has("byte_offset") && has("syntax_items") && &smc > 0
+ let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2])
+ let stopline = max([top_viewable, byte2line(stopbyte)])
+ else
+ let stopline = max([top_viewable, c_lnum - 100])
+ endif
+ let stoplinetop = stopline
+ endif
+ let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
+ endtry
+
+ if before > 0
+ if has_getcurpos
+ call setpos('.', save_cursor)
+ else
+ call winrestview(save_cursor)
+ endif
+ endif
+
+ " If a match is found setup match highlighting.
+ if m_lnum > 0 && m_lnum >= stoplinetop && m_lnum <= stoplinebottom
+ if exists('*matchaddpos')
+ call matchaddpos('MatchParen', [[c_lnum, c_col - before], [m_lnum, m_col]], 10, 3)
+ else
+ exe '3match MatchParen /\(\%' . c_lnum . 'l\%' . (c_col - before) .
+ \ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/'
+ endif
+ let w:paren_hl_on = 1
+ endif
+endfunction
+
+func s:Remove_Matches()
+ if exists('w:paren_hl_on') && w:paren_hl_on
+ silent! call matchdelete(3)
+ let w:paren_hl_on = 0
+ endif
+endfunc
+
+
+" Define commands that will disable and enable the plugin.
+command DoMatchParen call s:DoMatchParen()
+command NoMatchParen call s:NoMatchParen()
+
+func s:NoMatchParen()
+ let w = winnr()
+ noau windo silent! call matchdelete(3)
+ unlet! g:loaded_matchparen
+ exe "noau ". w . "wincmd w"
+ au! matchparen
+endfunc
+
+func s:DoMatchParen()
+ runtime plugin/matchparen.vim
+ let w = winnr()
+ silent windo doau CursorMoved
+ exe "noau ". w . "wincmd w"
+endfunc
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/plugin/netrwPlugin.vim b/runtime/plugin/netrwPlugin.vim
new file mode 100644
index 0000000..d309f81
--- /dev/null
+++ b/runtime/plugin/netrwPlugin.vim
@@ -0,0 +1,223 @@
+" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
+" PLUGIN SECTION
+" Date: Feb 09, 2021
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
+" Copyright: Copyright (C) 1999-2021 Charles E. Campbell {{{1
+" Permission is hereby granted to use and distribute this code,
+" with or without modifications, provided that this copyright
+" notice is copied with it. Like anything else that's free,
+" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
+" *as is* and comes with no warranty of any kind, either
+" expressed or implied. By using this plugin, you agree that
+" in no event will the copyright holder be liable for any damages
+" resulting from the use of this software.
+"
+" But be doers of the Word, and not only hearers, deluding your own selves {{{1
+" (James 1:22 RSV)
+" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+" Load Once: {{{1
+if &cp || exists("g:loaded_netrwPlugin")
+ finish
+endif
+let g:loaded_netrwPlugin = "v171"
+let s:keepcpo = &cpo
+set cpo&vim
+"DechoRemOn
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+
+" Local Browsing Autocmds: {{{2
+augroup FileExplorer
+ au!
+ au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
+ au BufEnter * sil call s:LocalBrowse(expand("<amatch>"))
+ au VimEnter * sil call s:VimEnter(expand("<amatch>"))
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
+ endif
+augroup END
+
+" Network Browsing Reading Writing: {{{2
+augroup Network
+ au!
+ au BufReadCmd file://* call netrw#FileUrlEdit(expand("<amatch>"))
+ au BufReadCmd ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "sil doau BufReadPost ".fnameescape(expand("<amatch>"))
+ au FileReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(1,expand("<amatch>"))|exe "sil doau FileReadPost ".fnameescape(expand("<amatch>"))
+ au BufWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>"))
+ au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau FileWritePost ".fnameescape(expand("<amatch>"))
+ try
+ au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
+ catch /^Vim\%((\a\+)\)\=:E216/
+ au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
+ endtry
+augroup END
+
+" Commands: :Nread, :Nwrite, :NetUserPass {{{2
+com! -count=1 -nargs=* Nread let s:svpos= winsaveview()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call winrestview(s:svpos)
+com! -range=% -nargs=* Nwrite let s:svpos= winsaveview()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call winrestview(s:svpos)
+com! -nargs=* NetUserPass call NetUserPass(<f-args>)
+com! -nargs=* Nsource let s:svpos= winsaveview()<bar>call netrw#NetSource(<f-args>)<bar>call winrestview(s:svpos)
+com! -nargs=? Ntree call netrw#SetTreetop(1,<q-args>)
+
+" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
+com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
+com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>)
+com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>)
+com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>)
+
+" Commands: NetrwSettings {{{2
+com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings()
+com! -bang NetrwClean call netrw#Clean(<bang>0)
+
+" Maps:
+if !exists("g:netrw_nogx")
+ if maparg('gx','n') == ""
+ if !hasmapto('<Plug>NetrwBrowseX')
+ nmap <unique> gx <Plug>NetrwBrowseX
+ endif
+ nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))<cr>
+ endif
+ if maparg('gx','x') == ""
+ if !hasmapto('<Plug>NetrwBrowseXVis')
+ xmap <unique> gx <Plug>NetrwBrowseXVis
+ endif
+ xno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr>
+ endif
+endif
+if exists("g:netrw_usetab") && g:netrw_usetab
+ if maparg('<c-tab>','n') == ""
+ nmap <unique> <c-tab> <Plug>NetrwShrink
+ endif
+ nno <silent> <Plug>NetrwShrink :call netrw#Shrink()<cr>
+endif
+
+" ---------------------------------------------------------------------
+" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
+fun! s:LocalBrowse(dirname)
+ " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
+ " Otherwise, the BufEnter event gets triggered when attempts to write to
+ " the DBG buffer are made.
+
+ if !exists("s:vimentered")
+ " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will,
+ " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
+" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)")
+" call Dret("s:LocalBrowse")
+ return
+ endif
+
+" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")")
+
+ if has("amiga")
+ " The check against '' is made for the Amiga, where the empty
+ " string is the current directory and not checking would break
+ " things such as the help command.
+" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)")
+ if a:dirname != '' && isdirectory(a:dirname)
+ sil! call netrw#LocalBrowseCheck(a:dirname)
+ if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+ endif
+
+ elseif isdirectory(a:dirname)
+" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)")
+" call Dredir("LocalBrowse ft last set: ","verbose set ft")
+ " Jul 13, 2021: for whatever reason, preceding the following call with
+ " a sil! causes an unbalanced if-endif vim error
+ call netrw#LocalBrowseCheck(a:dirname)
+ if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+
+ else
+ " not a directory, ignore it
+" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
+ endif
+
+" call Dret("s:LocalBrowse")
+endfun
+
+" ---------------------------------------------------------------------
+" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
+" Its purpose: to look over all windows and run s:LocalBrowse() on
+" them, which checks if they're directories and will create a directory
+" listing when appropriate.
+" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
+" has already been called.
+fun! s:VimEnter(dirname)
+" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
+ if has('nvim') || v:version < 802
+ " Johann Höchtl: reported that the call range... line causes an E488: Trailing characters
+ " error with neovim. I suspect its because neovim hasn't updated with recent
+ " vim patches. As is, this code will have problems with popup terminals
+ " instantiated before the VimEnter event runs.
+ " Ingo Karkat : E488 also in Vim 8.1.1602
+ let curwin = winnr()
+ let s:vimentered = 1
+ windo call s:LocalBrowse(expand("%:p"))
+ exe curwin."wincmd w"
+ else
+ " the following complicated expression comes courtesy of lacygoill; largely does the same thing as the windo and
+ " wincmd which are commented out, but avoids some side effects. Allows popup terminal before VimEnter.
+ let s:vimentered = 1
+ call range(1, winnr('$'))->map({_, v -> win_execute(win_getid(v), 'call expand("%:p")->s:LocalBrowse()')})
+ endif
+" call Dret("s:VimEnter")
+endfun
+
+" ---------------------------------------------------------------------
+" NetrwStatusLine: {{{1
+fun! NetrwStatusLine()
+" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
+ 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")
+ let &stl= s:netrw_explore_stl
+ if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
+ if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
+ return ""
+ else
+ return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
+ endif
+endfun
+
+" ------------------------------------------------------------------------
+" NetUserPass: set username and password for subsequent ftp transfer {{{1
+" Usage: :call NetUserPass() -- will prompt for userid and password
+" :call NetUserPass("uid") -- will prompt for password
+" :call NetUserPass("uid","password") -- sets global userid and password
+fun! NetUserPass(...)
+
+ " get/set userid
+ if a:0 == 0
+" call Dfunc("NetUserPass(a:0<".a:0.">)")
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ " via prompt
+ let g:netrw_uid= input('Enter username: ')
+ endif
+ else " from command line
+" call Dfunc("NetUserPass(a:1<".a:1.">) {")
+ let g:netrw_uid= a:1
+ endif
+
+ " get password
+ if a:0 <= 1 " via prompt
+" call Decho("a:0=".a:0." case <=1:")
+ let g:netrw_passwd= inputsecret("Enter Password: ")
+ else " from command line
+" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
+ let g:netrw_passwd=a:2
+ endif
+" call Dret("NetUserPass")
+endfun
+
+" ------------------------------------------------------------------------
+" Modelines And Restoration: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim:ts=8 fdm=marker
diff --git a/runtime/plugin/rrhelper.vim b/runtime/plugin/rrhelper.vim
new file mode 100644
index 0000000..b09cbc1
--- /dev/null
+++ b/runtime/plugin/rrhelper.vim
@@ -0,0 +1,48 @@
+" Vim plugin with helper function(s) for --remote-wait
+" Maintainer: Flemming Madsen <fma@cci.dk>
+" Last Change: 2008 May 29
+
+" Has this already been loaded?
+if exists("loaded_rrhelper") || !has("clientserver")
+ finish
+endif
+let loaded_rrhelper = 1
+
+" Setup answers for a --remote-wait client who will assume
+" a SetupRemoteReplies() function in the command server
+
+function SetupRemoteReplies()
+ let cnt = 0
+ let max = argc()
+
+ let id = expand("<client>")
+ if id == 0
+ return
+ endif
+ while cnt < max
+ " Handle same file from more clients and file being more than once
+ " on the command line by encoding this stuff in the group name
+ let uniqueGroup = "RemoteReply_".id."_".cnt
+
+ " Path separators are always forward slashes for the autocommand pattern.
+ " Escape special characters with a backslash.
+ let f = substitute(argv(cnt), '\\', '/', "g")
+ if exists('*fnameescape')
+ let f = fnameescape(f)
+ else
+ let f = escape(f, " \t\n*?[{`$\\%#'\"|!<")
+ endif
+ execute "augroup ".uniqueGroup
+ execute "autocmd ".uniqueGroup." BufUnload ". f ." call DoRemoteReply('".id."', '".cnt."', '".uniqueGroup."', '". f ."')"
+ let cnt = cnt + 1
+ endwhile
+ augroup END
+endfunc
+
+function DoRemoteReply(id, cnt, group, file)
+ call server2client(a:id, a:cnt)
+ execute 'autocmd! '.a:group.' BufUnload '.a:file
+ execute 'augroup! '.a:group
+endfunc
+
+" vim: set sw=2 sts=2 :
diff --git a/runtime/plugin/spellfile.vim b/runtime/plugin/spellfile.vim
new file mode 100644
index 0000000..4372960
--- /dev/null
+++ b/runtime/plugin/spellfile.vim
@@ -0,0 +1,15 @@
+" Vim plugin for downloading spell files
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2006 Feb 01
+
+" Exit quickly when:
+" - this plugin was already loaded
+" - when 'compatible' is set
+" - some autocommands are already taking care of spell files
+if exists("loaded_spellfile_plugin") || &cp || exists("#SpellFileMissing")
+ finish
+endif
+let loaded_spellfile_plugin = 1
+
+" The function is in the autoload directory.
+autocmd SpellFileMissing * call spellfile#LoadFile(expand('<amatch>'))
diff --git a/runtime/plugin/tarPlugin.vim b/runtime/plugin/tarPlugin.vim
new file mode 100644
index 0000000..d55492a
--- /dev/null
+++ b/runtime/plugin/tarPlugin.vim
@@ -0,0 +1,56 @@
+" tarPlugin.vim -- a Vim plugin for browsing tarfiles
+" Original was copyright (c) 2002, Michael C. Toren <mct@toren.net>
+" Modified by Charles E. Campbell
+" Distributed under the GNU General Public License.
+"
+" Updates are available from <http://michael.toren.net/code/>. If you
+" find this script useful, or have suggestions for improvements, please
+" let me know.
+" Also look there for further comments and documentation.
+"
+" This part only sets the autocommands. The functions are in autoload/tar.vim.
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_tarPlugin")
+ finish
+endif
+let g:loaded_tarPlugin = "v32"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+augroup tar
+ au!
+ au BufReadCmd tarfile::* call tar#Read(expand("<amatch>"), 1)
+ au FileReadCmd tarfile::* call tar#Read(expand("<amatch>"), 0)
+ au BufWriteCmd tarfile::* call tar#Write(expand("<amatch>"))
+ au FileWriteCmd tarfile::* call tar#Write(expand("<amatch>"))
+
+ if has("unix")
+ au BufReadCmd tarfile::*/* call tar#Read(expand("<amatch>"), 1)
+ au FileReadCmd tarfile::*/* call tar#Read(expand("<amatch>"), 0)
+ au BufWriteCmd tarfile::*/* call tar#Write(expand("<amatch>"))
+ au FileWriteCmd tarfile::*/* call tar#Write(expand("<amatch>"))
+ endif
+
+ au BufReadCmd *.tar.gz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.lrp call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.bz2 call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.Z call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tbz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tgz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.lzma call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.xz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.txz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.zst call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tzs call tar#Browse(expand("<amatch>"))
+augroup END
+com! -nargs=? -complete=file Vimuntar call tar#Vimuntar(<q-args>)
+
+" ---------------------------------------------------------------------
+" Restoration And Modelines: {{{1
+" vim: fdm=marker
+let &cpo= s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/plugin/tohtml.vim b/runtime/plugin/tohtml.vim
new file mode 100644
index 0000000..0369313
--- /dev/null
+++ b/runtime/plugin/tohtml.vim
@@ -0,0 +1,235 @@
+" Vim plugin for converting a syntax highlighted file to HTML.
+" Maintainer: Ben Fritz <fritzophrenic@gmail.com>
+" Last Change: 2023 Jan 01
+"
+" The core of the code is in $VIMRUNTIME/autoload/tohtml.vim and
+" $VIMRUNTIME/syntax/2html.vim
+"
+if exists('g:loaded_2html_plugin')
+ finish
+endif
+let g:loaded_2html_plugin = 'vim9.0_v1'
+
+"
+" Changelog: {{{
+" 9.0_v1 (this version): - Implement g:html_no_doc and g:html_no_modeline
+" for diff mode. Add tests.
+" (Vim 9.0.1122): NOTE: no version string update for this version!
+" - Bugfix for variable name in g:html_no_doc
+" (Vim 9.0.0819): NOTE: no version string update for this version!
+" - Add options g:html_no_doc, g:html_no_lines,
+" and g:html_no_modeline (partially included in Vim
+" runtime prior to version string update).
+" - Updates for new Vim9 string append style (i.e. use
+" ".." instead of ".")
+"
+" 8.1 updates: {{{
+" 8.1_v2 (Vim 8.1.2312): - Fix SourceForge issue #19: fix calculation of tab
+" stop position to use in expanding a tab, when that
+" tab occurs after a syntax match which in turn
+" comes after previously expanded tabs.
+" - Set eventignore while splitting a window for the
+" destination file to ignore FileType events;
+" speeds up processing when the destination file
+" already exists and HTML highlight takes too long.
+" - Fix SourceForge issue #20: progress bar could not be
+" seen when DiffDelete background color matched
+" StatusLine background color. Added TOhtmlProgress
+" highlight group for manual user override, but
+" calculate it to be visible compared to StatusLine
+" by default.
+" - Fix SourceForge issue #1: Remove workaround for old
+" browsers which don't support 'ch' CSS unit, since
+" all modern browsers, including IE>=9, support it.
+" - Fix SourceForge issue #10: support termguicolors
+" - Fix SourceForge issue #21: default to using
+" generated content instead of <input> tags for
+" uncopyable text, so that text is correctly
+" prevented from being copied in chrome. Use
+" g:html_use_input_for_pc option to control the
+" method used.
+" - Switch to HTML5 to allow using vnu as a validator
+" in unit test.
+" - Fix fallback sizing of <input> tags for browsers
+" without "ch" support.
+" - Fix cursor on unselectable diff filler text.
+" 8.1_v1 (Vim 8.1.0528): - Fix SourceForge issue #6: Don't generate empty
+" script tag.
+" - Fix SourceForge issue #5: javascript should
+" declare variables with "var".
+" - Fix SourceForge issue #13: errors thrown sourcing
+" 2html.vim directly when plugins not loaded.
+" - Fix SourceForge issue #16: support 'vartabstop'.
+"}}}
+"
+" 7.4 updates: {{{
+" 7.4_v2 (Vim 7.4.0899): Fix error raised when converting a diff containing
+" an empty buffer. Jan Stocker: allow g:html_font to
+" take a list so it is easier to specfiy fallback
+" fonts in the generated CSS.
+" 7.4_v1 (Vim 7.4.0000): Fix modeline mangling for new "Vim:" format, and
+" also for version-specific modelines like "vim>703:".
+"}}}
+"
+" 7.3 updates: {{{
+" 7.3_v14 (Vim 7.3.1246): Allow suppressing line number anchors using
+" g:html_line_ids=0. Allow customizing
+" important IDs (like line IDs and fold IDs) using
+" g:html_id_expr evaluated when the buffer conversion
+" is started.
+" 7.3_v13 (Vim 7.3.1088): Keep foldmethod at manual in the generated file and
+" insert modeline to set it to manual.
+" Fix bug: diff mode with 2 unsaved buffers creates a
+" duplicate of one buffer instead of including both.
+" Add anchors to each line so you can put '#L123'
+" or '#123' at the end of the URL to jump to line 123
+" (idea by Andy Spencer). Add javascript to open folds
+" to show the anchor being jumped to if it is hidden.
+" Fix XML validation error: &nsbp; not part of XML.
+" Allow TOhtml to chain together with other commands
+" using |.
+" 7.3_v12 (Vim 7.3.0616): Fix modeline mangling to also work for when multiple
+" highlight groups make up the start-of-modeline text.
+" Improve render time of page with uncopyable regions
+" by not using one-input-per-char. Change name of
+" uncopyable option from html_unselectable to
+" html_prevent_copy. Added html_no_invalid option and
+" default to inserting invalid markup for uncopyable
+" regions to prevent MS Word from pasting undeletable
+" <input> elements. Fix 'cpo' handling (Thilo Six).
+" 7.3_v12b1: Add html_unselectable option. Rework logic to
+" eliminate post-processing substitute commands in
+" favor of doing the work up front. Remove unnecessary
+" special treatment of 'LineNr' highlight group. Minor
+" speed improvements. Fix modeline mangling in
+" generated output so it works for text in the first
+" column. Fix missing line number and fold column in
+" diff filler lines. Fix that some fonts have a 1px
+" gap (using a dirty hack, improvements welcome). Add
+" "colorscheme" meta tag. Does NOT include support for
+" the new default foldtext added in v11, as the patch
+" adding it has not yet been included in Vim.
+" 7.3_v11 ( unreleased ): Support new default foldtext from patch by Christian
+" Brabandt in
+" http://groups.google.com/d/topic/vim_dev/B6FSGfq9VoI/discussion.
+" This patch has not yet been included in Vim, thus
+" these changes are removed in the next version.
+" 7.3_v10 (Vim 7.3.0227): Fix error E684 when converting a range wholly inside
+" multiple nested folds with dynamic folding on.
+" Also fix problem with foldtext in this situation.
+" 7.3_v9 (Vim 7.3.0170): Add html_pre_wrap option active with html_use_css
+" and without html_no_pre, default value same as
+" 'wrap' option, (Andy Spencer). Don't use
+" 'fileencoding' for converted document encoding if
+" 'buftype' indicates a special buffer which isn't
+" written.
+" 7.3_v8 (Vim 7.3.0100): Add html_expand_tabs option to allow leaving tab
+" characters in generated output (Andy Spencer).
+" Escape text that looks like a modeline so Vim
+" doesn't use anything in the converted HTML as a
+" modeline. Bugfixes: Fix folding when a fold starts
+" before the conversion range. Remove fold column when
+" there are no folds.
+" 7.3_v7 (Vim 7-3-0063): see betas released on vim_dev below:
+" 7.3_v7b3: Fixed bug, convert Unicode to UTF-8 all the way.
+" 7.3_v7b2: Remove automatic detection of encodings that are not
+" supported by all major browsers according to
+" http://wiki.whatwg.org/wiki/Web_Encodings and
+" convert to UTF-8 for all Unicode encodings. Make
+" HTML encoding to Vim encoding detection be
+" case-insensitive for built-in pairs.
+" 7.3_v7b1: Remove use of setwinvar() function which cannot be
+" called in restricted mode (Andy Spencer). Use
+" 'fencoding' instead of 'encoding' to determine by
+" charset, and make sure the 'fenc' of the generated
+" file matches its indicated charset. Add charsets for
+" all of Vim's natively supported encodings.
+" 7.3_v6 (Vim 7.3.0000): Really fix bug with 'nowrapscan', 'magic' and other
+" user settings interfering with diff mode generation,
+" trailing whitespace (e.g. line number column) when
+" using html_no_pre, and bugs when using
+" html_hover_unfold.
+" 7.3_v5 ( unreleased ): Fix bug with 'nowrapscan' and also with out-of-sync
+" folds in diff mode when first line was folded.
+" 7.3_v4 (Vim 7.3.0000): Bugfixes, especially for xhtml markup, and diff mode
+" 7.3_v3 (Vim 7.3.0000): Refactor option handling and make html_use_css
+" default to true when not set to anything. Use strict
+" doctypes where possible. Rename use_xhtml option to
+" html_use_xhtml for consistency. Use .xhtml extension
+" when using this option. Add meta tag for settings.
+" 7.3_v2 (Vim 7.3.0000): Fix syntax highlighting in diff mode to use both the
+" diff colors and the normal syntax colors
+" 7.3_v1 (Vim 7.3.0000): Add conceal support and meta tags in output
+"}}}
+"}}}
+
+" TODO: {{{
+" * Check the issue tracker:
+" https://sourceforge.net/p/vim-tohtml/issues/search/?q=%21status%3Aclosed
+" * Options for generating the CSS in external style sheets. New :TOcss
+" command to convert the current color scheme into a (mostly) generic CSS
+" stylesheet which can be re-used. Alternate stylesheet support? Good start
+" by Erik Falor
+" ( https://groups.google.com/d/topic/vim_use/7XTmC4D22dU/discussion ).
+" * Add optional argument to :TOhtml command to specify mode (gui, cterm,
+" term) to use for the styling. Suggestion by "nacitar".
+" * Add way to override or specify which RGB colors map to the color numbers
+" in cterm. Get better defaults than just guessing? Suggestion by "nacitar".
+" * Disable filetype detection until after all processing is done.
+" * Add option for not generating the hyperlink on stuff that looks like a
+" URL? Or just color the link to fit with the colorscheme (and only special
+" when hovering)?
+" * Bug: Opera does not allow printing more than one page if uncopyable
+" regions is turned on. Possible solution: Add normal text line numbers with
+" display:none, set to display:inline for print style sheets, and hide
+" <input> elements for print, to allow Opera printing multiple pages (and
+" other uncopyable areas?). May need to make the new text invisible to IE
+" with conditional comments to prevent copying it, IE for some reason likes
+" to copy hidden text. Other browsers too?
+" * Bug: still a 1px gap throughout the fold column when html_prevent_copy is
+" "fn" in some browsers. Specifically, in Chromium on Ubuntu (but not Chrome
+" on Windows). Perhaps it is font related?
+" * Bug: still some gaps in the fold column when html_prevent_copy contains
+" 'd' and showing the whole diff (observed in multiple browsers). Only gaps
+" on diff lines though.
+" * Undercurl support via CSS3, with fallback to dotted or something:
+" https://groups.google.com/d/topic/vim_use/BzXA6He1pHg/discussion
+" * Redo updates for modified default foldtext (v11) when/if the patch is
+" accepted to modify it.
+" * Test case +diff_one_file-dynamic_folds+expand_tabs-hover_unfold
+" +ignore_conceal-ignore_folding+no_foldcolumn+no_pre+no_progress
+" +number_lines-pre_wrap-use_css+use_xhtml+whole_filler.xhtml
+" does not show the whole diff filler as it is supposed to?
+" * Bug: when 'isprint' is wrong for the current encoding, will generate
+" invalid content. Can/should anything be done about this? Maybe a separate
+" plugin to correct 'isprint' based on encoding?
+" * Check to see if the windows-125\d encodings actually work in Unix without
+" the 8bit- prefix. Add prefix to autoload dictionaries for Unix if not.
+" * Font auto-detection similar to
+" http://www.vim.org/scripts/script.php?script_id=2384 but for a variety of
+" platforms.
+" * Pull in code from http://www.vim.org/scripts/script.php?script_id=3113 :
+" - listchars support
+" - full-line background highlight
+" - other?
+" * Make it so deleted lines in a diff don't create side-scrolling (get it
+" free with full-line background highlight above).
+" * Restore open/closed folds and cursor position after processing each file
+" with option not to restore for speed increase.
+" * Add extra meta info (generation time, etc.)?
+" * Tidy up so we can use strict doctype in even more situations
+" * Implementation detail: add threshold for writing the lines to the html
+" buffer before we're done (5000 or so lines should do it)
+" * TODO comments for code cleanup scattered throughout
+"}}}
+
+" Define the :TOhtml command when:
+" - 'compatible' is not set
+" - this plugin or user override was not already loaded
+" - user commands are available. {{{
+if !&cp && !exists(":TOhtml") && has("user_commands")
+ command -range=% -bar TOhtml :call tohtml#Convert2HTML(<line1>, <line2>)
+endif "}}}
+
+" Make sure any patches will probably use consistent indent
+" vim: ts=8 sw=2 sts=2 noet fdm=marker
diff --git a/runtime/plugin/vimballPlugin.vim b/runtime/plugin/vimballPlugin.vim
new file mode 100644
index 0000000..d7473a0
--- /dev/null
+++ b/runtime/plugin/vimballPlugin.vim
@@ -0,0 +1,43 @@
+" vimballPlugin : construct a file containing both paths and files
+" Author: Charles E. Campbell
+" Copyright: (c) 2004-2014 by Charles E. Campbell
+" The VIM LICENSE applies to Vimball.vim, and Vimball.txt
+" (see |copyright|) except use "Vimball" instead of "Vim".
+" No warranty, express or implied.
+" *** *** Use At-Your-Own-Risk! *** ***
+"
+" (Rom 2:1 WEB) Therefore you are without excuse, O man, whoever you are who
+" judge. For in that which you judge another, you condemn yourself. For
+" you who judge practice the same things.
+" GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_vimballPlugin")
+ finish
+endif
+let g:loaded_vimballPlugin = "v37"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ------------------------------------------------------------------------------
+" Public Interface: {{{1
+com! -range -complete=file -nargs=+ -bang MkVimball call vimball#MkVimball(<line1>,<line2>,<bang>0,<f-args>)
+com! -nargs=? -complete=dir UseVimball call vimball#Vimball(1,<f-args>)
+com! -nargs=0 VimballList call vimball#Vimball(0)
+com! -nargs=* -complete=dir RmVimball call vimball#SaveSettings()|call vimball#RmVimball(<f-args>)|call vimball#RestoreSettings()
+augroup Vimball
+ au!
+ au BufEnter *.vba,*.vba.gz,*.vba.bz2,*.vba.zip,*.vba.xz setlocal bt=nofile fmr=[[[,]]] fdm=marker|if &ff != 'unix'|setlocal ma ff=unix noma|endif|if line('$') > 1|call vimball#ShowMesg(0,"Source this file to extract it! (:so %)")|endif
+ au SourceCmd *.vba.gz,*.vba.bz2,*.vba.zip,*.vba.xz let s:origfile=expand("%")|if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|endif|call vimball#Decompress(expand("<amatch>"))|so %|if s:origfile!=expand("<afile>")|close|endif
+ au SourceCmd *.vba if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|call vimball#Vimball(1)|close|else|call vimball#Vimball(1)|endif
+ au BufEnter *.vmb,*.vmb.gz,*.vmb.bz2,*.vmb.zip,*.vmb.xz setlocal bt=nofile fmr=[[[,]]] fdm=marker|if &ff != 'unix'|setlocal ma ff=unix noma|endif|if line('$') > 1|call vimball#ShowMesg(0,"Source this file to extract it! (:so %)")|endif
+ au SourceCmd *.vmb.gz,*.vmb.bz2,*.vmb.zip,*.vmb.xz let s:origfile=expand("%")|if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|endif|call vimball#Decompress(expand("<amatch>"))|so %|if s:origfile!=expand("<afile>")|close|endif
+ au SourceCmd *.vmb if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|call vimball#Vimball(1)|close|else|call vimball#Vimball(1)|endif
+augroup END
+
+" =====================================================================
+" Restoration And Modelines: {{{1
+" vim: fdm=marker
+let &cpo= s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/plugin/zipPlugin.vim b/runtime/plugin/zipPlugin.vim
new file mode 100644
index 0000000..edc5271
--- /dev/null
+++ b/runtime/plugin/zipPlugin.vim
@@ -0,0 +1,56 @@
+" zipPlugin.vim: Handles browsing zipfiles
+" PLUGIN PORTION
+" Date: Jan 07, 2020
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" License: Vim License (see vim's :help license)
+" Copyright: Copyright (C) 2005-2016 Charles E. Campbell {{{1
+" Permission is hereby granted to use and distribute this code,
+" with or without modifications, provided that this copyright
+" notice is copied with it. Like anything else that's free,
+" zipPlugin.vim is provided *as is* and comes with no warranty
+" of any kind, either expressed or implied. By using this
+" plugin, you agree that in no event will the copyright
+" holder be liable for any damages resulting from the use
+" of this software.
+"
+" (James 4:8 WEB) Draw near to God, and he will draw near to you.
+" Cleanse your hands, you sinners; and purify your hearts, you double-minded.
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_zipPlugin")
+ finish
+endif
+let g:loaded_zipPlugin = "v32"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Options: {{{1
+if !exists("g:zipPlugin_ext")
+ let g:zipPlugin_ext='*.aar,*.apk,*.celzip,*.crtx,*.docm,*.docx,*.dotm,*.dotx,*.ear,*.epub,*.gcsx,*.glox,*.gqsx,*.ja,*.jar,*.kmz,*.odb,*.odc,*.odf,*.odg,*.odi,*.odm,*.odp,*.ods,*.odt,*.otc,*.otf,*.otg,*.oth,*.oti,*.otp,*.ots,*.ott,*.oxt,*.potm,*.potx,*.ppam,*.ppsm,*.ppsx,*.pptm,*.pptx,*.sldx,*.thmx,*.vdw,*.war,*.wsz,*.xap,*.xlam,*.xlam,*.xlsb,*.xlsm,*.xlsx,*.xltm,*.xltx,*.xpi,*.zip'
+endif
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+augroup zip
+ au!
+ au BufReadCmd zipfile:* call zip#Read(expand("<amatch>"), 1)
+ au FileReadCmd zipfile:* call zip#Read(expand("<amatch>"), 0)
+ au BufWriteCmd zipfile:* call zip#Write(expand("<amatch>"))
+ au FileWriteCmd zipfile:* call zip#Write(expand("<amatch>"))
+
+ if has("unix")
+ au BufReadCmd zipfile:*/* call zip#Read(expand("<amatch>"), 1)
+ au FileReadCmd zipfile:*/* call zip#Read(expand("<amatch>"), 0)
+ au BufWriteCmd zipfile:*/* call zip#Write(expand("<amatch>"))
+ au FileWriteCmd zipfile:*/* call zip#Write(expand("<amatch>"))
+ endif
+
+ exe "au BufReadCmd ".g:zipPlugin_ext.' call zip#Browse(expand("<amatch>"))'
+augroup END
+
+" ---------------------------------------------------------------------
+" Restoration And Modelines: {{{1
+" vim: fdm=marker
+let &cpo= s:keepcpo
+unlet s:keepcpo