summaryrefslogtreecommitdiff
path: root/runtime/plugin
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2004-06-13 20:20:40 +0000
committerBram Moolenaar <Bram@vim.org>2004-06-13 20:20:40 +0000
commit071d4279d6ab81b7187b48f3a0fc61e587b6db6c (patch)
tree221cbe3c40e043163c06f61c52a7ba2eb41e12ce /runtime/plugin
parentb4210b3bc14e2918f153a7307530fbe6eba659e1 (diff)
downloadvim-071d4279d6ab81b7187b48f3a0fc61e587b6db6c.zip
updated for version 7.0001
Diffstat (limited to 'runtime/plugin')
-rw-r--r--runtime/plugin/README.txt9
-rw-r--r--runtime/plugin/explorer.vim1326
-rw-r--r--runtime/plugin/gzip.vim157
-rw-r--r--runtime/plugin/netrw.vim1160
-rw-r--r--runtime/plugin/rrhelper.vim47
-rw-r--r--runtime/plugin/tohtml.vim27
6 files changed, 2726 insertions, 0 deletions
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt
new file mode 100644
index 000000000..489ebf613
--- /dev/null
+++ b/runtime/plugin/README.txt
@@ -0,0 +1,9 @@
+The plugin directory is for standard Vim plugin scripts.
+
+All files here ending in .vim will be sourced by Vim when it starts up.
+
+Standard plugins:
+explorer.vim file browser
+gzip.vim edit compressed files
+netrw.vim edit files over a network
+rrhelper.vim used for --remote-wait editing
diff --git a/runtime/plugin/explorer.vim b/runtime/plugin/explorer.vim
new file mode 100644
index 000000000..4a5b6057f
--- /dev/null
+++ b/runtime/plugin/explorer.vim
@@ -0,0 +1,1326 @@
+"=============================================================================
+" File: explorer.vim
+" Author: M A Aziz Ahmed (aziz@acorn-networks.com - doesn't work)
+" Last Change: 2004 May 13
+" Version: 2.5 + changes
+" Additions by Mark Waggoner (waggoner@aracnet.com) et al.
+"-----------------------------------------------------------------------------
+" This file implements a file explorer.
+"-----------------------------------------------------------------------------
+" Normally, this file will reside in the plugins directory and be
+" automatically sourced. If not, you must manually source this file
+" using :source explorer.vim
+"
+" To use it, just edit a directory (vi dirname) or type :Explore to
+" launch the file explorer in the current window, or :Sexplore to split
+" the current window and launch explorer there.
+"
+" If the current buffer is modified, the window is always split.
+"
+" It is also possible to delete files and rename files within explorer.
+" See :help file-explorer for more details
+"
+"-----------------------------------------------------------------------------
+" Update history removed, it's not very interesting.
+" Contributors were: Doug Potts, Bram Moolenaar, Thomas Köhler
+"=============================================================================
+
+" Has this already been loaded?
+if exists("loaded_explorer")
+ finish
+endif
+let loaded_explorer=1
+
+" Line continuation used here
+let s:cpo_save = &cpo
+set cpo&vim
+
+"---
+" Default settings for global configuration variables
+
+" Split vertically instead of horizontally?
+if !exists("g:explVertical")
+ let g:explVertical=0
+endif
+
+" How big to make the window? Set to "" to avoid resizing
+if !exists("g:explWinSize")
+ let g:explWinSize=15
+endif
+
+" When opening a new file/directory, split below current window (or
+" above)? 1 = below, 0 = to above
+if !exists("g:explSplitBelow")
+ let g:explSplitBelow = &splitbelow
+endif
+
+" Split to right of current window (or to left)?
+" 1 = to right, 0 = to left
+if !exists("g:explSplitRight")
+ let g:explSplitRight = &splitright
+endif
+
+" Start the first explorer window...
+" Defaults to be the same as explSplitBelow
+if !exists("g:explStartBelow")
+ let g:explStartBelow = g:explSplitBelow
+endif
+
+" Start the first explorer window...
+" Defaults to be the same as explSplitRight
+if !exists("g:explStartRight")
+ let g:explStartRight = g:explSplitRight
+endif
+
+" Show detailed help?
+if !exists("g:explDetailedHelp")
+ let g:explDetailedHelp=0
+endif
+
+" Show file size and dates?
+if !exists("g:explDetailedList")
+ let g:explDetailedList=0
+endif
+
+" Format for the date
+if !exists("g:explDateFormat")
+ let g:explDateFormat="%d %b %Y %H:%M"
+endif
+
+" Files to hide
+if !exists("g:explHideFiles")
+ let g:explHideFiles=''
+endif
+
+" Field to sort by
+if !exists("g:explSortBy")
+ let g:explSortBy='name'
+endif
+
+" Segregate directories? 1, 0, or -1
+if !exists("g:explDirsFirst")
+ let g:explDirsFirst=1
+endif
+
+" Segregate items in suffixes option? 1, 0, or -1
+if !exists("g:explSuffixesLast")
+ let g:explSuffixesLast=1
+endif
+
+" Include separator lines between directories, files, and suffixes?
+if !exists("g:explUseSeparators")
+ let g:explUseSeparators=0
+endif
+
+" Execute file handler
+if !exists("g:explFileHandler")
+ if has("win32")
+ " for Win32 use rundll32
+ function! s:explFileHandlerWin32(fn)
+ exec 'silent !start rundll32 url.dll,FileProtocolHandler "'
+ \ . escape(a:fn, '%#') . '"'
+ endfunction
+ let g:explFileHandler = "<SID>explFileHandlerWin32"
+
+ elseif has("unix")
+ " for KDE use kfmclient, for GNUME use gnome-open
+ if executable("kfmclient")
+ let g:explFileHandlerCmd = "kfmclient exec"
+ elseif executable("gnome-open")
+ let g:explFileHandlerCmd = "gnome-open"
+ else
+ let g:explFileHandlerCmd = ""
+ endif
+ if g:explFileHandlerCmd != ""
+ function! s:explFileHandlerUnix(fn)
+ if &shellredir =~ "%s"
+ let redir = substitute(&shellredir, "%s", "/dev/null", "")
+ else
+ let redir = &shellredir . "/dev/null"
+ endif
+ " Need to escape % and # but not spaces.
+ exec "silent !" . g:explFileHandlerCmd . " '" . escape(a:fn, '%#') . "'" . redir
+ endfunction
+ let g:explFileHandler = "<SID>explFileHandlerUnix"
+ endif
+ endif
+endif
+
+"---
+" script variables - these are the same across all
+" explorer windows
+
+" characters that must be escaped for a regular expression
+let s:escregexp = '/*^$.~\'
+
+" characters that must be escaped for filenames
+if has("dos16") || has("dos32") || has("win16") || has("win32") || has("os2")
+ let s:escfilename = ' %#'
+else
+ let s:escfilename = ' \%#[]'
+endif
+
+
+" A line to use for separating sections
+let s:separator='"---------------------------------------------------'
+
+"---
+" Create commands
+
+if !exists(':Explore')
+ command -n=? -complete=dir Explore :call s:StartExplorer(0, '<a>')
+endif
+if !exists(':Sexplore')
+ command -n=? -complete=dir Sexplore :call s:StartExplorer(1, '<a>')
+endif
+
+"---
+" Start the explorer using the preferences from the global variables
+"
+function! s:StartExplorer(split, start_dir)
+ let startcmd = "edit"
+ if a:start_dir != ""
+ let fname=a:start_dir
+ else
+ let fname = expand("%:p:h")
+ endif
+ if fname == ""
+ let fname = getcwd()
+ endif
+
+ " Create a variable to use if splitting vertically
+ let splitMode = ""
+ if g:explVertical == 1
+ let splitMode = "vertical"
+ endif
+
+ " Save the user's settings for splitbelow and splitright
+ let savesplitbelow = &splitbelow
+ let savesplitright = &splitright
+
+ if a:split || &modified
+ let startcmd = splitMode . " " . g:explWinSize . "new " . fname
+ let &splitbelow = g:explStartBelow
+ let &splitright = g:explStartRight
+ else
+ let startcmd = "edit " . fname
+ endif
+ silent execute startcmd
+ let &splitbelow = savesplitbelow
+ let &splitright = savesplitright
+endfunction
+
+"---
+" This is the main entry for 'editing' a directory
+"
+function! s:EditDir()
+ " Get out of here right away if this isn't a directory!
+ let name = expand("%")
+ if name == ""
+ let name = expand("%:p")
+ endif
+ if !isdirectory(name)
+ return
+ endif
+
+ " Turn off the swapfile, set the buffer type so that it won't get
+ " written, and so that it will get deleted when it gets hidden.
+ setlocal noreadonly modifiable
+ setlocal noswapfile
+ setlocal buftype=nowrite
+ setlocal bufhidden=delete
+ " Don't wrap around long lines
+ setlocal nowrap
+
+ " No need for any insertmode abbreviations, since we don't allow
+ " insertions anyway!
+ iabc <buffer>
+
+ " Long or short listing? Use the global variable the first time
+ " explorer is called, after that use the script variable as set by
+ " the interactive user.
+ if exists("s:longlist")
+ let w:longlist = s:longlist
+ else
+ let w:longlist = g:explDetailedList
+ endif
+
+ " Show keyboard shortcuts?
+ if exists("s:longhelp")
+ let w:longhelp = s:longhelp
+ else
+ let w:longhelp = g:explDetailedHelp
+ endif
+
+ " Set the sort based on the global variables the first time. If you
+ " later change the sort order, it will be retained in the s:sortby
+ " variable for the next time you open explorer
+ let w:sortdirection=1
+ let w:sortdirlabel = ""
+ let w:sorttype = ""
+ if exists("s:sortby")
+ let sortby=s:sortby
+ else
+ let sortby=g:explSortBy
+ endif
+ if sortby =~ "reverse"
+ let w:sortdirection=-1
+ let w:sortdirlabel = "reverse "
+ endif
+ if sortby =~ "date"
+ let w:sorttype = "date"
+ elseif sortby =~ "size"
+ let w:sorttype = "size"
+ else
+ let w:sorttype = "name"
+ endif
+ call s:SetSuffixesLast()
+
+ " If directory is already loaded, don't open it again!
+ if line('$') > 1
+ setlocal readonly nomodifiable
+ return
+ endif
+
+ " Get the complete path to the directory to look at with a slash at
+ " the end. This also removes "/../" and "/./" things.
+ let b:completePath = s:Path(expand("%:p"))
+
+ " Add a slash at the end
+ if b:completePath !~ '/$'
+ let b:completePath = b:completePath . '/'
+ endif
+
+ " escape special characters for exec commands
+ let b:completePathEsc = escape(b:completePath, s:escfilename)
+ let b:parentDirEsc = substitute(b:completePathEsc, '/[^/]*/$', '/', 'g')
+
+ " Set up syntax highlighting
+ " Something wrong with the evaluation of the conditional though...
+ if has("syntax") && exists("g:syntax_on") && !has("syntax_items")
+ syn match browseSynopsis "^\"[ -].*"
+ syn match browseDirectory "[^\"].*/ "
+ syn match browseDirectory "[^\"].*/$"
+ syn match browseCurDir "^\"= .*$"
+ syn match browseSortBy "^\" Sorted by .*$" contains=browseSuffixInfo
+ syn match browseSuffixInfo "(.*)$" contained
+ syn match browseFilter "^\" Not Showing:.*$"
+ syn match browseFiletime "««\d\+$"
+ exec('syn match browseSuffixes "' . b:suffixesHighlight . '"')
+
+ "hi def link browseSynopsis PreProc
+ hi def link browseSynopsis Special
+ hi def link browseDirectory Directory
+ hi def link browseCurDir Statement
+ hi def link browseSortBy String
+ hi def link browseSuffixInfo Type
+ hi def link browseFilter String
+ hi def link browseFiletime Ignore
+ hi def link browseSuffixes Type
+ endif
+
+ " Set filter for hiding files
+ let b:filterFormula=substitute(g:explHideFiles, '\([^\\]\),', '\1\\|', 'g')
+ if b:filterFormula != ''
+ let b:filtering="\nNot showing: " . b:filterFormula
+ else
+ let b:filtering=""
+ endif
+
+ " Show the files
+ call s:ShowDirectory()
+
+ " Set up mappings for this buffer
+ let cpo_save = &cpo
+ set cpo&vim
+ nnoremap <buffer> <cr> :call <SID>EditEntry("","edit")<cr>
+ nnoremap <buffer> - :exec ("silent e " . b:parentDirEsc)<cr>
+ if exists("g:explFileHandler")
+ nnoremap <buffer> x :call <SID>ExecuteEntry()<cr>
+ endif
+ nnoremap <buffer> o :call <SID>OpenEntry()<cr>
+ nnoremap <buffer> O :call <SID>OpenEntryPrevWindow()<cr>
+ nnoremap <buffer> p :call <SID>EditEntry("","pedit")<cr>
+ nnoremap <buffer> ? :call <SID>ToggleHelp()<cr>
+ nnoremap <buffer> a :call <SID>ShowAllFiles()<cr>
+ nnoremap <buffer> R :call <SID>RenameFile()<cr>
+ nnoremap <buffer> D :. call <SID>DeleteFile()<cr>
+ vnoremap <buffer> D :call <SID>DeleteFile()<cr>
+ nnoremap <buffer> i :call <SID>ToggleLongList()<cr>
+ nnoremap <buffer> s :call <SID>SortSelect()<cr>
+ nnoremap <buffer> r :call <SID>SortReverse()<cr>
+ nnoremap <buffer> c :exec "cd ".b:completePathEsc<cr>
+ nnoremap <buffer> <2-leftmouse> :call <SID>DoubleClick()<cr>
+ if exists("*ExplorerCustomMap")
+ call ExplorerCustomMap()
+ endif
+ let &cpo = cpo_save
+
+ " prevent the buffer from being modified
+ setlocal readonly nomodifiable
+endfunction
+
+"---
+" Determine the number of windows open to this buffer number.
+" Care of Yegappan Lakshman. Thanks!
+fun! s:BufInWindows(bnum)
+ let cnt = 0
+ let winnum = 1
+ while 1
+ let bufnum = winbufnr(winnum)
+ if bufnum < 0
+ break
+ endif
+ if bufnum == a:bnum
+ let cnt = cnt + 1
+ endif
+ let winnum = winnum + 1
+ endwhile
+
+ return cnt
+endfunction
+
+" If this is the only window, open file in a new window
+" Otherwise, open file in the most recently visited window
+"
+function! s:OpenEntryPrevWindow()
+ " Figure out if there are any other windows
+ let n = winnr()
+ wincmd p
+ " No other window? Then open a new one
+ if n == winnr()
+ call s:OpenEntry()
+ " Other windows exist
+ else
+ " Check if the previous buffer is modified - ask if they want to save!
+ " Was it modified, and is it the only window open to this file
+ if &modified && s:BufInWindows(winbufnr(winnr())) < 2
+ let bufname = bufname(winbufnr(winnr()))
+
+ let action=confirm("Save Changes in " . bufname . "?","&Yes\n&No\n&Cancel")
+ " Yes - try to save - if there is an error, cancel
+ if action == 1
+ let v:errmsg = ""
+ silent w
+ if v:errmsg != ""
+ echoerr "Unable to write buffer!"
+ wincmd p
+ return
+ endif
+ " No, abandon changes
+ elseif action == 2
+ set nomodified
+ echomsg "Warning, abandoning changes in " . bufname
+ " Cancel (or any other result), don't do the open
+ else
+ wincmd p
+ return
+ endif
+ endif
+ wincmd p
+ call s:EditEntry("wincmd p","edit")
+ endif
+endfunction
+
+
+"---
+" Open a file or directory in a new window.
+" Use g:explSplitBelow and g:explSplitRight to decide where to put the
+" split window, and resize the original explorer window if it is
+" larger than g:explWinSize
+"
+function! s:OpenEntry()
+ " Are we on a line with a file name?
+ let l = getline(".")
+ if l =~ '^"'
+ return
+ endif
+
+ " Copy window settings to script settings
+ let s:sortby=w:sortdirlabel . w:sorttype
+ let s:longhelp = w:longhelp
+ let s:longlist = w:longlist
+
+ " Get the window number of the explorer window
+ let n = winnr()
+
+ " Save the user's settings for splitbelow and splitright
+ let savesplitbelow=&splitbelow
+ let savesplitright=&splitright
+
+ " Figure out how to do the split based on the user's preferences.
+ " We want to split to the (left,right,top,bottom) of the explorer
+ " window, but we want to extract the screen real-estate from the
+ " window next to the explorer if possible.
+ "
+ " 'there' will be set to a command to move from the split window
+ " back to the explorer window
+ "
+ " 'back' will be set to a command to move from the explorer window
+ " back to the newly split window
+ "
+ " 'right' and 'below' will be set to the settings needed for
+ " splitbelow and splitright IF the explorer is the only window.
+ "
+ if g:explVertical
+ if g:explSplitRight
+ let there="wincmd h"
+ let back ="wincmd l"
+ let right=1
+ let below=0
+ else
+ let there="wincmd l"
+ let back ="wincmd h"
+ let right=0
+ let below=0
+ endif
+ else
+ if g:explSplitBelow
+ let there="wincmd k"
+ let back ="wincmd j"
+ let right=0
+ let below=1
+ else
+ let there="wincmd j"
+ let back ="wincmd k"
+ let right=0
+ let below=0
+ endif
+ endif
+
+ " Get the file name
+ let fn=s:GetFullFileName()
+
+ " Attempt to go to adjacent window
+ exec(back)
+ " If no adjacent window, set splitright and splitbelow appropriately
+ if n == winnr()
+ let &splitright=right
+ let &splitbelow=below
+ else
+ " found adjacent window - invert split direction
+ let &splitright=!right
+ let &splitbelow=!below
+ endif
+
+ " Create a variable to use if splitting vertically
+ let splitMode = ""
+ if g:explVertical == 1
+ let splitMode = "vertical"
+ endif
+
+ " Is it a directory? If so, get a real path to it instead of
+ " relative path. This also removes "/../" and "/./" things.
+ if isdirectory(fn)
+ let fn = fnamemodify(fn, ":p")
+ endif
+
+ " Open the new window
+ exec("silent " . splitMode." sp " . escape(fn,s:escfilename))
+
+ " resize the explorer window if it is larger than the requested size
+ exec(there)
+ if g:explWinSize =~ '[0-9]\+' && winheight("") > g:explWinSize
+ exec("silent ".splitMode." resize ".g:explWinSize)
+ endif
+ exec(back)
+
+ " Restore splitmode settings
+ let &splitbelow=savesplitbelow
+ let &splitright=savesplitright
+
+endfunction
+
+function! s:ExecuteEntry()
+ " Are we on a line with a file name?
+ let l = getline(".")
+ if l =~ '^"'
+ return
+ endif
+
+ " Get the file name
+ let fn = s:GetFullFileName()
+ if has("win32") && fn =~ '^//'
+ let fn = substitute(fn, '/', '\\', 'g')
+ endif
+ exec "call " . g:explFileHandler . "(fn)"
+endfunction
+
+"---
+" Double click with the mouse
+"
+function s:DoubleClick()
+ if expand("<cfile>") =~ '[\\/]$'
+ call s:EditEntry("","edit") " directory: open in this window
+ else
+ call s:OpenEntryPrevWindow() " file: open in another window
+ endif
+endfun
+
+"---
+" Open file or directory in the same window as the explorer is
+" currently in
+"
+function! s:EditEntry(movefirst,editcmd)
+ " Are we on a line with a file name?
+ let l = getline(".")
+ if l =~ '^"'
+ return
+ endif
+
+ " Copy window settings to script settings
+ let s:sortby=w:sortdirlabel . w:sorttype
+ let s:longhelp = w:longhelp
+ let s:longlist = w:longlist
+
+ " Get the file name
+ let fn = s:GetFullFileName()
+ if isdirectory(fn)
+ " This removes "/../" and "/./" things.
+ let fn = fnamemodify(fn, ":p")
+ endif
+
+ " Move to desired window if needed
+ exec(a:movefirst)
+ " Edit the file/dir
+ exec(a:editcmd . " " . escape(fn,s:escfilename))
+endfunction
+
+
+"---
+" Create a regular expression out of the suffixes option for sorting
+" and set a string to indicate whether we are sorting with the
+" suffixes at the end (or the beginning)
+"
+function! s:SetSuffixesLast()
+ let b:suffixesRegexp = '\(' . substitute(escape(&suffixes,s:escregexp),',','\\|','g') . '\)$'
+ let b:suffixesHighlight = '^[^"].*\(' . substitute(escape(&suffixes,s:escregexp),',','\\|','g') . '\)\( \|$\)'
+ if has("fname_case")
+ let b:suffixesRegexp = '\C' . b:suffixesRegexp
+ let b:suffixesHighlight = '\C' . b:suffixesHighlight
+ else
+ let b:suffixesRegexp = '\c' . b:suffixesRegexp
+ let b:suffixesHighlight = '\c' . b:suffixesHighlight
+ endif
+ if g:explSuffixesLast > 0 && &suffixes != ""
+ let b:suffixeslast=" (" . &suffixes . " at end of list)"
+ elseif g:explSuffixesLast < 0 && &suffixes != ""
+ let b:suffixeslast=" (" . &suffixes . " at start of list)"
+ else
+ let b:suffixeslast=" ('suffixes' mixed with files)"
+ endif
+endfunction
+
+"---
+" Show the header and contents of the directory
+"
+function! s:ShowDirectory()
+ "Delete all lines
+ 1,$d _
+ " Prevent a report of our actions from showing up
+ let oldRep=&report
+ let save_sc = &sc
+ set report=10000 nosc
+
+ " Add the header
+ call s:AddHeader()
+ $d _
+
+ " Display the files
+
+ " Get a list of all the files
+ let files = s:Path(glob(b:completePathEsc . "*"))
+ if files != "" && files !~ "\n$"
+ let files = files . "\n"
+ endif
+
+ " Add the dot files now, making sure "." is not included!
+ let files = files . substitute(s:Path(glob(b:completePathEsc . ".*")), "[^\n]*/./\\=\n", '' , '')
+ if files != "" && files !~ "\n$"
+ let files = files . "\n"
+ endif
+
+ " Are there any files left after filtering?
+ if files != ""
+ normal! mt
+ put =files
+ let b:maxFileLen = 0
+ 0
+ /^"=/+1,$g/^/call s:MarkDirs()
+ normal! `t
+ call s:AddFileInfo()
+ endif
+
+ normal! zz
+
+ " Move to first directory in the listing
+ 0
+ /^"=/+1
+
+ " Do the sort
+ call s:SortListing("Loaded contents of ".b:completePath.". ")
+
+ " Move to first directory in the listing
+ 0
+ /^"=/+1
+
+ let &report=oldRep
+ let &sc = save_sc
+
+endfunction
+
+"---
+" Mark which items are directories - called once for each file name
+" must be used only when size/date is not displayed
+"
+function! s:MarkDirs()
+ let oldRep=&report
+ set report=1000
+ "Remove slashes if added
+ s;/$;;e
+ "Removes all the leading slashes and adds slashes at the end of directories
+ s;^.*\\\([^\\]*\)$;\1;e
+ s;^.*/\([^/]*\)$;\1;e
+ "normal! ^
+ let currLine=getline(".")
+ if isdirectory(b:completePath . currLine)
+ s;$;/;
+ let fileLen=strlen(currLine)+1
+ else
+ let fileLen=strlen(currLine)
+ if (b:filterFormula!="") && (currLine =~ b:filterFormula)
+ " Don't show the file if it is to be filtered.
+ d _
+ endif
+ endif
+ if fileLen > b:maxFileLen
+ let b:maxFileLen=fileLen
+ endif
+ let &report=oldRep
+endfunction
+
+"---
+" Make sure a path has proper form
+"
+function! s:Path(p)
+ if has("dos16") || has("dos32") || has("win16") || has("win32") || has("os2")
+ return substitute(a:p,'\\','/','g')
+ else
+ return a:p
+ endif
+endfunction
+
+"---
+" Extract the file name from a line in several different forms
+"
+function! s:GetFullFileNameEsc()
+ return s:EscapeFilename(s:GetFullFileName())
+endfunction
+
+function! s:GetFileNameEsc()
+ return s:EscapeFilename(s:GetFileName())
+endfunction
+
+function! s:EscapeFilename(name)
+ return escape(a:name,s:escfilename)
+endfunction
+
+
+function! s:GetFullFileName()
+ return s:ExtractFullFileName(getline("."))
+endfunction
+
+function! s:GetFileName()
+ return s:ExtractFileName(getline("."))
+endfunction
+
+function! s:ExtractFullFileName(line)
+ let fn=s:ExtractFileName(a:line)
+ if fn == '/'
+ return b:completePath
+ else
+ return b:completePath . s:ExtractFileName(a:line)
+ endif
+endfunction
+
+function! s:ExtractFileName(line)
+ return substitute(strpart(a:line,0,b:maxFileLen),'\s\+$','','')
+endfunction
+
+"---
+" Get the size of the file
+function! s:ExtractFileSize(line)
+ if (w:longlist==0)
+ return getfsize(s:ExtractFileName(a:line))
+ else
+ return strpart(a:line,b:maxFileLen+2,b:maxFileSizeLen)
+ endif
+endfunction
+
+"---
+" Get the date of the file as a number
+function! s:ExtractFileDate(line)
+ if w:longlist==0
+ return getftime(s:ExtractFileName(a:line))
+ else
+ return strpart(matchstr(strpart(a:line,b:maxFileLen+b:maxFileSizeLen+4),"««.*"),2) + 0
+ endif
+endfunction
+
+
+"---
+" Add the header with help information
+"
+function! s:AddHeader()
+ let save_f=@f
+ 1
+ if w:longhelp==1
+ let @f="\" <enter> : open file or directory\n"
+ \."\" o : open new window for file/directory\n"
+ \."\" O : open file in previously visited window\n"
+ \."\" p : preview the file\n"
+ if exists("g:explFileHandler")
+ let @f=@f."\" x : execute file or directory\n"
+ endif
+ let @f=@f
+ \."\" i : toggle size/date listing\n"
+ \."\" s : select sort field r : reverse sort\n"
+ \."\" - : go up one level c : cd to this dir\n"
+ \."\" R : rename file D : delete file\n"
+ \."\" :help file-explorer for detailed help\n"
+ else
+ let @f="\" Press ? for keyboard shortcuts\n"
+ endif
+ let @f=@f."\" Sorted by ".w:sortdirlabel.w:sorttype.b:suffixeslast.b:filtering."\n"
+ let @f=@f."\"= ".b:completePath."\n"
+ put! f
+ let @f=save_f
+endfunction
+
+
+"---
+" Show the size and date for each file
+"
+function! s:AddFileInfo()
+ let save_sc = &sc
+ set nosc
+
+ " Mark our starting point
+ normal! mt
+
+ call s:RemoveSeparators()
+
+ " Remove all info
+ 0
+ /^"=/+1,$g/^/call setline(line("."),s:GetFileName())
+
+ " Add info if requested
+ if w:longlist==1
+ " Add file size and calculate maximum length of file size field
+ let b:maxFileSizeLen = 0
+ 0
+ /^"=/+1,$g/^/let fn=s:GetFullFileName() |
+ \let fileSize=getfsize(fn) |
+ \let fileSizeLen=strlen(fileSize) |
+ \if fileSizeLen > b:maxFileSizeLen |
+ \ let b:maxFileSizeLen = fileSizeLen |
+ \endif |
+ \exec "normal! ".(b:maxFileLen-strlen(getline("."))+2)."A \<esc>" |
+ \exec 's/$/'.fileSize.'/'
+
+ " Right justify the file sizes and
+ " add file modification date
+ 0
+ /^"=/+1,$g/^/let fn=s:GetFullFileName() |
+ \exec "normal! A \<esc>$b".(b:maxFileLen+b:maxFileSizeLen-strlen(getline("."))+3)."i \<esc>\"_x" |
+ \exec 's/$/ '.escape(s:FileModDate(fn), '/').'/'
+ setlocal nomodified
+ endif
+
+ call s:AddSeparators()
+
+ " return to start
+ normal! `t
+
+ let &sc = save_sc
+endfunction
+
+
+"----
+" Get the modification time for a file
+"
+function! s:FileModDate(name)
+ let filetime=getftime(a:name)
+ if filetime > 0
+ return strftime(g:explDateFormat,filetime) . " ««" . filetime
+ else
+ return ""
+ endif
+endfunction
+
+"---
+" Delete a file or files
+"
+function! s:DeleteFile() range
+ let oldRep = &report
+ let &report = 1000
+
+ let filesDeleted = 0
+ let stopDel = 0
+ let delAll = 0
+ let currLine = a:firstline
+ let lastLine = a:lastline
+ setlocal noreadonly modifiable
+
+ while ((currLine <= lastLine) && (stopDel==0))
+ exec(currLine)
+ let fileName=s:GetFullFileName()
+ if isdirectory(fileName)
+ echo fileName." : Directory deletion not supported yet"
+ let currLine = currLine + 1
+ else
+ if delAll == 0
+ let sure=input("Delete ".fileName." (y/n/a/q)? ")
+ if sure=="a"
+ let delAll = 1
+ endif
+ endif
+ if (sure=="y") || (sure=="a")
+ let success=delete(fileName)
+ if success!=0
+ exec (" ")
+ echo "\nCannot delete ".fileName
+ let currLine = currLine + 1
+ else
+ d _
+ let filesDeleted = filesDeleted + 1
+ let lastLine = lastLine - 1
+ endif
+ elseif sure=="q"
+ let stopDel = 1
+ elseif sure=="n"
+ let currLine = currLine + 1
+ endif
+ endif
+ endwhile
+ echo "\n".filesDeleted." files deleted"
+ let &report = oldRep
+ setlocal nomodified
+ setlocal readonly nomodifiable
+endfunction
+
+"---
+" Rename a file
+"
+function! s:RenameFile()
+ let fileName=s:GetFullFileName()
+ setlocal noreadonly modifiable
+ if isdirectory(fileName)
+ echo "Directory renaming not supported yet"
+ elseif filereadable(fileName)
+ let altName=input("Rename ".fileName." to : ")
+ echo " "
+ if altName==""
+ setlocal readonly nomodifiable
+ return
+ endif
+ let success=rename(fileName, b:completePath.altName)
+ if success!=0
+ echo "Cannot rename ".fileName. " to ".altName
+ else
+ echo "Renamed ".fileName." to ".altName
+ let oldRep=&report
+ set report=1000
+ e!
+ let &report=oldRep
+ endif
+ endif
+ setlocal nomodified
+ setlocal readonly nomodifiable
+endfunction
+
+"---
+" Toggle between short and long help
+"
+function! s:ToggleHelp()
+ if exists("w:longhelp") && w:longhelp==0
+ let w:longhelp=1
+ let s:longhelp=1
+ else
+ let w:longhelp=0
+ let s:longhelp=0
+ endif
+ " Allow modification
+ setlocal noreadonly modifiable
+ call s:UpdateHeader()
+ " Disallow modification
+ setlocal readonly nomodifiable
+endfunction
+
+"---
+" Update the header
+"
+function! s:UpdateHeader()
+ let oldRep=&report
+ set report=10000
+ " Save position
+ normal! mt
+ " Remove old header
+ 0
+ 1,/^"=/ d _
+ " Add new header
+ call s:AddHeader()
+ " Go back where we came from if possible
+ 0
+ if line("'t") != 0
+ normal! `t
+ endif
+
+ let &report=oldRep
+ setlocal nomodified
+endfunction
+
+"---
+" Toggle long vs. short listing
+"
+function! s:ToggleLongList()
+ setlocal noreadonly modifiable
+ if exists("w:longlist") && w:longlist==1
+ let w:longlist=0
+ let s:longlist=0
+ else
+ let w:longlist=1
+ let s:longlist=1
+ endif
+ call s:AddFileInfo()
+ setlocal readonly nomodifiable
+endfunction
+
+"---
+" Show all files - remove filtering
+"
+function! s:ShowAllFiles()
+ setlocal noreadonly modifiable
+ let b:filterFormula=""
+ let b:filtering=""
+ call s:ShowDirectory()
+ setlocal readonly nomodifiable
+endfunction
+
+"---
+" Figure out what section we are in
+"
+function! s:GetSection()
+ let fn=s:GetFileName()
+ let section="file"
+ if fn =~ '/$'
+ let section="directory"
+ elseif fn =~ b:suffixesRegexp
+ let section="suffixes"
+ endif
+ return section
+endfunction
+
+"---
+" Remove section separators
+"
+function! s:RemoveSeparators()
+ if !g:explUseSeparators
+ return
+ endif
+ 0
+ silent! exec '/^"=/+1,$g/^' . s:separator . "/d _"
+endfunction
+
+"---
+" Add section separators
+" between directories and files if they are separated
+" between files and 'suffixes' files if they are separated
+function! s:AddSeparators()
+ if !g:explUseSeparators
+ return
+ endif
+ 0
+ /^"=/+1
+ let lastsec=s:GetSection()
+ +1
+ .,$g/^/let sec=s:GetSection() |
+ \if g:explDirsFirst != 0 && sec != lastsec &&
+ \ (lastsec == "directory" || sec == "directory") |
+ \ exec "normal! I" . s:separator . "\n\<esc>" |
+ \elseif g:explSuffixesLast != 0 && sec != lastsec &&
+ \ (lastsec == "suffixes" || sec == "suffixes") |
+ \ exec "normal! I" . s:separator . "\n\<esc>" |
+ \endif |
+ \let lastsec=sec
+endfunction
+
+"---
+" General string comparison function
+"
+function! s:StrCmp(line1, line2, direction)
+ if a:line1 < a:line2
+ return -a:direction
+ elseif a:line1 > a:line2
+ return a:direction
+ else
+ return 0
+ endif
+endfunction
+
+"---
+" Function for use with Sort(), to compare the file names
+" Default sort is to put in alphabetical order, but with all directory
+" names before all file names
+"
+function! s:FileNameCmp(line1, line2, direction)
+ let f1=s:ExtractFileName(a:line1)
+ let f2=s:ExtractFileName(a:line2)
+
+ " Put directory names before file names
+ if (g:explDirsFirst != 0) && (f1 =~ '\/$') && (f2 !~ '\/$')
+ return -g:explDirsFirst
+ elseif (g:explDirsFirst != 0) && (f1 !~ '\/$') && (f2 =~ '\/$')
+ return g:explDirsFirst
+ elseif (g:explSuffixesLast != 0) && (f1 =~ b:suffixesRegexp) && (f2 !~ b:suffixesRegexp)
+ return g:explSuffixesLast
+ elseif (g:explSuffixesLast != 0) && (f1 !~ b:suffixesRegexp) && (f2 =~ b:suffixesRegexp)
+ return -g:explSuffixesLast
+ else
+ return s:StrCmp(substitute(f1, "/$", "", ""), substitute(f2, "/$", "", ""), a:direction)
+ endif
+
+endfunction
+
+"---
+" Function for use with Sort(), to compare the file modification dates
+" Default sort is to put NEWEST files first. Reverse will put oldest
+" files first
+"
+function! s:FileDateCmp(line1, line2, direction)
+ let f1=s:ExtractFileName(a:line1)
+ let f2=s:ExtractFileName(a:line2)
+ let t1=s:ExtractFileDate(a:line1)
+ let t2=s:ExtractFileDate(a:line2)
+
+ " Put directory names before file names
+ if (g:explDirsFirst != 0) && (f1 =~ '\/$') && (f2 !~ '\/$')
+ return -g:explDirsFirst
+ elseif (g:explDirsFirst != 0) && (f1 !~ '\/$') && (f2 =~ '\/$')
+ return g:explDirsFirst
+ elseif (g:explSuffixesLast != 0) && (f1 =~ b:suffixesRegexp) && (f2 !~ b:suffixesRegexp)
+ return g:explSuffixesLast
+ elseif (g:explSuffixesLast != 0) && (f1 !~ b:suffixesRegexp) && (f2 =~ b:suffixesRegexp)
+ return -g:explSuffixesLast
+ elseif t1 > t2
+ return -a:direction
+ elseif t1 < t2
+ return a:direction
+ else
+ return s:StrCmp(substitute(f1, "/$", "", ""), substitute(f2, "/$", "", ""), 1)
+ endif
+endfunction
+
+"---
+" Function for use with Sort(), to compare the file sizes
+" Default sort is to put largest files first. Reverse will put
+" smallest files first
+"
+function! s:FileSizeCmp(line1, line2, direction)
+ let f1=s:ExtractFileName(a:line1)
+ let f2=s:ExtractFileName(a:line2)
+ let s1=s:ExtractFileSize(a:line1)
+ let s2=s:ExtractFileSize(a:line2)
+
+ if (g:explDirsFirst != 0) && (f1 =~ '\/$') && (f2 !~ '\/$')
+ return -g:explDirsFirst
+ elseif (g:explDirsFirst != 0) && (f1 !~ '\/$') && (f2 =~ '\/$')
+ return g:explDirsFirst
+ elseif (g:explSuffixesLast != 0) && (f1 =~ b:suffixesRegexp) && (f2 !~ b:suffixesRegexp)
+ return g:explSuffixesLast
+ elseif (g:explSuffixesLast != 0) && (f1 !~ b:suffixesRegexp) && (f2 =~ b:suffixesRegexp)
+ return -g:explSuffixesLast
+ elseif s1 > s2
+ return -a:direction
+ elseif s1 < s2
+ return a:direction
+ else
+ return s:StrCmp(substitute(f1, "/$", "", ""), substitute(f2, "/$", "", ""), 1)
+ endif
+endfunction
+
+"---
+" Sort lines. SortR() is called recursively.
+"
+function! s:SortR(start, end, cmp, direction)
+
+ " Bottom of the recursion if start reaches end
+ if a:start >= a:end
+ return
+ endif
+ "
+ let partition = a:start - 1
+ let middle = partition
+ let partStr = getline((a:start + a:end) / 2)
+ let i = a:start
+ while (i <= a:end)
+ let str = getline(i)
+ exec "let result = " . a:cmp . "(str, partStr, " . a:direction . ")"
+ if result <= 0
+ " Need to put it before the partition. Swap lines i and partition.
+ let partition = partition + 1
+ if result == 0
+ let middle = partition
+ endif
+ if i != partition
+ let str2 = getline(partition)
+ call setline(i, str2)
+ call setline(partition, str)
+ endif
+ endif
+ let i = i + 1
+ endwhile
+
+ " Now we have a pointer to the "middle" element, as far as partitioning
+ " goes, which could be anywhere before the partition. Make sure it is at
+ " the end of the partition.
+ if middle != partition
+ let str = getline(middle)
+ let str2 = getline(partition)
+ call setline(middle, str2)
+ call setline(partition, str)
+ endif
+ call s:SortR(a:start, partition - 1, a:cmp,a:direction)
+ call s:SortR(partition + 1, a:end, a:cmp,a:direction)
+endfunction
+
+"---
+" To Sort a range of lines, pass the range to Sort() along with the name of a
+" function that will compare two lines.
+"
+function! s:Sort(cmp,direction) range
+ call s:SortR(a:firstline, a:lastline, a:cmp, a:direction)
+endfunction
+
+"---
+" Reverse the current sort order
+"
+function! s:SortReverse()
+ if exists("w:sortdirection") && w:sortdirection == -1
+ let w:sortdirection = 1
+ let w:sortdirlabel = ""
+ else
+ let w:sortdirection = -1
+ let w:sortdirlabel = "reverse "
+ endif
+ let s:sortby=w:sortdirlabel . w:sorttype
+ call s:SortListing("")
+endfunction
+
+"---
+" Toggle through the different sort orders
+"
+function! s:SortSelect()
+ " Select the next sort option
+ if !exists("w:sorttype")
+ let w:sorttype="name"
+ elseif w:sorttype == "name"
+ let w:sorttype="size"
+ elseif w:sorttype == "size"
+ let w:sorttype="date"
+ else
+ let w:sorttype="name"
+ endif
+ let s:sortby=w:sortdirlabel . w:sorttype
+ call s:SortListing("")
+endfunction
+
+"---
+" Sort the file listing
+"
+function! s:SortListing(msg)
+ " Save the line we start on so we can go back there when done
+ " sorting
+ let startline = getline(".")
+ let col=col(".")
+ let lin=line(".")
+
+ " Allow modification
+ setlocal noreadonly modifiable
+
+ " Send a message about what we're doing
+ " Don't really need this - it can cause hit return prompts
+" echo a:msg . "Sorting by" . w:sortdirlabel . w:sorttype
+
+ " Create a regular expression out of the suffixes option in case
+ " we need it.
+ call s:SetSuffixesLast()
+
+ " Remove section separators
+ call s:RemoveSeparators()
+
+ " Do the sort
+ 0
+ if w:sorttype == "size"
+ /^"=/+1,$call s:Sort("s:FileSizeCmp",w:sortdirection)
+ elseif w:sorttype == "date"
+ /^"=/+1,$call s:Sort("s:FileDateCmp",w:sortdirection)
+ else
+ /^"=/+1,$call s:Sort("s:FileNameCmp",w:sortdirection)
+ endif
+
+ " Replace the header with updated information
+ call s:UpdateHeader()
+
+ " Restore section separators
+ call s:AddSeparators()
+
+ " Return to the position we started on
+ 0
+ if search('\m^'.escape(startline,s:escregexp),'W') <= 0
+ execute lin
+ endif
+ execute "normal!" col . "|"
+
+ " Disallow modification
+ setlocal nomodified
+ setlocal readonly nomodifiable
+
+endfunction
+
+"---
+" Setup for editing directories after starting up by going to each window.
+" Required for "vim -o filename dirname"
+"
+function! s:EditAll()
+ if winbufnr(2) == -1
+ return
+ endif
+ let cmd = winrestcmd()
+ let curwin = winnr()
+ while 1
+ wincmd w
+ if winnr() == curwin
+ break
+ endif
+ call s:EditDir()
+ endwhile
+ exe cmd
+endfunction
+
+"---
+" Set up the autocommand to allow directories to be edited
+"
+augroup fileExplorer
+ au!
+ " Fill the window when entering the buffer; ":edit dir".
+ au BufEnter * call s:EditDir()
+ " Set the window variables after a split; ":split".
+ au WinEnter * if !exists("w:sortdirection") | call s:EditDir() | endif
+ " Fill the windows after Vim has started up.
+ au VimEnter * call s:EditAll()
+augroup end
+
+" restore 'cpo'
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/plugin/gzip.vim b/runtime/plugin/gzip.vim
new file mode 100644
index 000000000..39b0cbc36
--- /dev/null
+++ b/runtime/plugin/gzip.vim
@@ -0,0 +1,157 @@
+" Vim plugin for editing compressed files.
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2004 Jan 12
+
+" 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
+ " set binary mode before reading the file
+ " use "gzip -d", gunzip isn't always available
+ autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin
+ autocmd BufReadPost,FileReadPost *.gz call s:read("gzip -dn")
+ autocmd BufReadPost,FileReadPost *.bz2 call s:read("bzip2 -d")
+ autocmd BufReadPost,FileReadPost *.Z call s:read("uncompress")
+ autocmd BufWritePost,FileWritePost *.gz call s:write("gzip")
+ autocmd BufWritePost,FileWritePost *.bz2 call s:write("bzip2")
+ autocmd BufWritePost,FileWritePost *.Z call s:write("compress -f")
+ autocmd FileAppendPre *.gz call s:appre("gzip -dn")
+ autocmd FileAppendPre *.bz2 call s:appre("bzip2 -d")
+ autocmd FileAppendPre *.Z call s:appre("uncompress")
+ autocmd FileAppendPost *.gz call s:write("gzip")
+ autocmd FileAppendPost *.bz2 call s:write("bzip2")
+ autocmd FileAppendPost *.Z call s:write("compress -f")
+augroup END
+
+" Function to check that executing "cmd [-f]" works.
+" The result is cached in s:have_"cmd" for speed.
+fun s:check(cmd)
+ let name = substitute(a:cmd, '\(\S*\).*', '\1', '')
+ if !exists("s:have_" . name)
+ let e = executable(name)
+ if e < 0
+ let r = system(name . " --version")
+ let e = (r !~ "not found" && r != "")
+ endif
+ exe "let s:have_" . name . "=" . e
+ endif
+ exe "return s:have_" . name
+endfun
+
+" After reading compressed file: Uncompress text in buffer with "cmd"
+fun s:read(cmd)
+ " don't do anything if the cmd is not supported
+ if !s:check(a:cmd)
+ return
+ endif
+ " make 'patchmode' empty, we don't want a copy of the written file
+ let pm_save = &pm
+ set pm=
+ " remove 'a' and 'A' from 'cpo' to avoid the alternate file changes
+ let cpo_save = &cpo
+ set cpo-=a cpo-=A
+ " set 'modifiable'
+ let ma_save = &ma
+ setlocal ma
+ " when filtering the whole buffer, it will become empty
+ let empty = line("'[") == 1 && line("']") == line("$")
+ let tmp = tempname()
+ let tmpe = tmp . "." . expand("<afile>:e")
+ " write the just read lines to a temp file "'[,']w tmp.gz"
+ execute "silent '[,']w " . tmpe
+ " uncompress the temp file: call system("gzip -dn tmp.gz")
+ call system(a:cmd . " " . tmpe)
+ " delete the compressed lines; remember the line number
+ let l = line("'[") - 1
+ if exists(":lockmarks")
+ lockmarks '[,']d _
+ else
+ '[,']d _
+ endif
+ " read in the uncompressed lines "'[-1r tmp"
+ setlocal nobin
+ if exists(":lockmarks")
+ execute "silent lockmarks " . l . "r " . tmp
+ else
+ execute "silent " . l . "r " . tmp
+ endif
+
+ " if buffer became empty, delete trailing blank line
+ if empty
+ silent $delete _
+ 1
+ endif
+ " delete the temp file and the used buffers
+ call delete(tmp)
+ silent! exe "bwipe " . tmp
+ silent! exe "bwipe " . tmpe
+ let &pm = pm_save
+ let &cpo = cpo_save
+ let &l:ma = ma_save
+ " When uncompressed the whole buffer, do autocommands
+ if empty
+ if &verbose >= 8
+ execute "doau BufReadPost " . expand("%:r")
+ else
+ execute "silent! doau BufReadPost " . expand("%:r")
+ endif
+ endif
+endfun
+
+" After writing compressed file: Compress written file with "cmd"
+fun s:write(cmd)
+ " don't do anything if the cmd is not supported
+ if s:check(a:cmd)
+ " Rename the file before compressing it.
+ let nm = expand("<afile>")
+ let nmt = s:tempname(nm)
+ if rename(nm, nmt) == 0
+ call system(a:cmd . " " . nmt)
+ call rename(nmt . "." . expand("<afile>:e"), nm)
+ endif
+ endif
+endfun
+
+" Before appending to compressed file: Uncompress file with "cmd"
+fun s:appre(cmd)
+ " don't do anything if the cmd is not supported
+ if s:check(a:cmd)
+ " Rename to a weird name to avoid the risk of overwriting another file
+ let nm = expand("<afile>")
+ let nmt = expand("<afile>:p:h") . "/X~=@l9q5"
+ let nmte = nmt . "." . expand("<afile>:e")
+ if rename(nm, nmte) == 0
+ if &patchmode != "" && getfsize(nm . &patchmode) == -1
+ " Create patchmode file by creating the decompressed file new
+ call system(a:cmd . " -c " . nmte . " > " . nmt)
+ call rename(nmte, nm . &patchmode)
+ else
+ call system(a:cmd . " " . nmte)
+ endif
+ call rename(nmt, nm)
+ endif
+ endif
+endfun
+
+" find a file name for the file to be compressed. Use "name" without an
+" extension if possible. Otherwise use a weird name to avoid overwriting an
+" existing file.
+fun s:tempname(name)
+ let fn = fnamemodify(a:name, ":r")
+ if !filereadable(fn) && !isdirectory(fn)
+ return fn
+ endif
+ return fnamemodify(a:name, ":p:h") . "/X~=@l9q5"
+endfun
+
+" vim: set sw=2 :
diff --git a/runtime/plugin/netrw.vim b/runtime/plugin/netrw.vim
new file mode 100644
index 000000000..d3058c55d
--- /dev/null
+++ b/runtime/plugin/netrw.vim
@@ -0,0 +1,1160 @@
+" netrw.vim: (global plugin) Handles file transfer across a network
+" Last Change: Jun 04, 2004
+" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
+" Version: 44
+" License: Vim License (see vim's :help license)
+"
+" But be doers of the word, and not only hearers, deluding your own selves
+" (James 1:22 RSV)
+" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+" Exit quickly when already loaded or when 'compatible' is set.
+if exists("loaded_netrw") || &cp
+ finish
+endif
+let loaded_netrw = "v44"
+let s:save_cpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Default values for global netrw variables {{{1
+if !exists("g:netrw_ftpmode")
+ let g:netrw_ftpmode= "binary"
+endif
+if !exists("g:netrw_win95ftp")
+ let g:netrw_win95ftp= 1
+endif
+if !exists("g:netrw_cygwin")
+ if has("win32")
+ let g:netrw_cygwin= 1
+ else
+ let g:netrw_cygwin= 0
+ endif
+endif
+
+" ---------------------------------------------------------------------
+" Default values for global protocol variables {{{1
+if !exists("g:netrw_rcp_cmd")
+ let g:netrw_rcp_cmd = "rcp"
+endif
+if !exists("g:netrw_ftp_cmd")
+ let g:netrw_ftp_cmd = "ftp"
+endif
+if !exists("g:netrw_scp_cmd")
+ let g:netrw_scp_cmd = "scp -q"
+endif
+if !exists("g:netrw_sftp_cmd")
+ let g:netrw_sftp_cmd = "sftp"
+endif
+if !exists("g:netrw_http_cmd")
+ if executable("wget")
+ let g:netrw_http_cmd = "wget -q -O"
+ elseif executable("fetch")
+ let g:netrw_http_cmd = "fetch -o"
+ else
+ let g:netrw_http_cmd = ""
+ endif
+endif
+if !exists("g:netrw_dav_cmd")
+ let g:netrw_dav_cmd = "cadaver"
+endif
+if !exists("g:netrw_rsync_cmd")
+ let g:netrw_rsync_cmd = "rsync"
+endif
+if !exists("g:netrw_fetch_cmd")
+ if executable("fetch")
+ let g:netrw_fetch_cmd = "fetch -o"
+ else
+ let g:netrw_fetch_cmd = ""
+ endif
+endif
+
+if has("win32")
+ \ && exists("g:netrw_use_nt_rcp")
+ \ && g:netrw_use_nt_rcp
+ \ && executable( $SystemRoot .'/system32/rcp.exe')
+ let s:netrw_has_nt_rcp = 1
+ let s:netrw_rcpmode = '-b'
+ else
+ let s:netrw_has_nt_rcp = 0
+ let s:netrw_rcpmode = ''
+endif
+
+" ---------------------------------------------------------------------
+" Transparency Support: {{{1
+" Auto-detection for ftp://*, rcp://*, scp://*, sftp://*, http://*, dav://*,
+" and rsync://*
+" Should make file transfers across networks transparent. Currently I haven't
+" supported appends. Hey, gotta leave something for a future <netrw.vim>!
+if version >= 600
+ augroup Network
+ au!
+ if has("win32")
+ au BufReadCmd file://* exe "doau BufReadPre ".expand("<afile>")|exe 'e '.substitute(expand("<afile>"),"file:/*","","")|exe "doau BufReadPost ".expand("<afile>")
+ else
+ au BufReadCmd file:///* exe "doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "doau BufReadPost ".expand("<afile>")
+ au BufReadCmd file://localhost/* exe "doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "doau BufReadPost ".expand("<afile>")
+ endif
+ au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "doau BufReadPre ".expand("<afile>")|exe "Nread 0r ".expand("<afile>")|exe "doau BufReadPost ".expand("<afile>")
+ au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "doau BufReadPre ".expand("<afile>")|exe "Nread " .expand("<afile>")|exe "doau BufReadPost ".expand("<afile>")
+ au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "Nwrite " .expand("<afile>")|call <SID>NetRestorePosn()
+ augroup END
+endif
+
+" ------------------------------------------------------------------------
+" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
+com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
+com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
+com! -nargs=* NetUserPass call NetUserPass(<f-args>)
+
+" ------------------------------------------------------------------------
+" NetSavePosn: saves position of cursor on screen {{{1
+fun! s:NetSavePosn()
+" call Dfunc("NetSavePosn()")
+ " Save current line and column
+ let s:netrw_winnr= winnr()
+ let s:netrw_line = line(".")
+ let s:netrw_col = virtcol(".")
+
+ " Save top-of-screen line
+ norm! H0
+ let s:netrw_hline= line(".")
+
+ call s:NetRestorePosn()
+" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
+endfun
+
+" ------------------------------------------------------------------------
+" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
+fun! <SID>NetRestorePosn()
+" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
+
+ exe "silent! ".s:netrw_winnr."wincmd w"
+ if v:shell_error == 0
+ " as suggested by Bram M: redraw on no error
+ " allows protocol error messages to remain visible
+ redraw!
+ endif
+ " restore top-of-screen line
+ exe "norm! ".s:netrw_hline."G0z\<CR>"
+ " restore position
+ exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
+
+" call Dret("NetRestorePosn")
+endfun
+
+" ------------------------------------------------------------------------
+" NetRead: responsible for reading a file over the net {{{1
+fun! s:NetRead(...)
+" call Dfunc("NetRead(a:1<".a:1.">)")
+
+ " save options
+ call s:NetOptionSave()
+
+ " get name of a temporary file
+ let tmpfile= tempname()
+
+ " Special Exception: if a file is named "0r", then
+ " "0r" will be used to read the
+ " following files instead of "r"
+ if a:0 == 0
+ let readcmd= "r"
+ let ichoice= 0
+ elseif a:1 == "0r"
+ let readcmd = "0r"
+ let ichoice = 2
+ else
+ let readcmd = "r"
+ let ichoice = 1
+ endif
+
+ while ichoice <= a:0
+
+ " attempt to repeat with previous host-file-etc
+ if exists("b:netrw_lastfile") && a:0 == 0
+" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
+ let choice = b:netrw_lastfile
+ let ichoice= ichoice + 1
+
+ else
+ exe "let choice= a:" . ichoice
+" call Decho("NetRead1: choice<" . choice . ">")
+
+ " Reconstruct Choice if choice starts with '"'
+ if match(choice,"?") == 0
+ echo 'NetRead Usage:'
+ echo ':Nread machine:path uses rcp'
+ echo ':Nread "machine path" uses ftp with <.netrc>'
+ echo ':Nread "machine id password path" uses ftp'
+ echo ':Nread dav://machine[:port]/path uses cadaver'
+ echo ':Nread fetch://machine/path uses fetch'
+ echo ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
+ echo ':Nread http://[user@]machine/path uses http wget'
+ echo ':Nread rcp://[user@]machine/path uses rcp'
+ echo ':Nread rsync://machine[:port]/path uses rsync'
+ echo ':Nread scp://[user@]machine[[:#]port]/path uses scp'
+ echo ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
+ break
+ elseif match(choice,"^\"") != -1
+" call Decho("reconstructing choice")
+ if match(choice,"\"$") != -1
+ " case "..."
+ let choice=strpart(choice,1,strlen(choice)-2)
+ else
+ " case "... ... ..."
+ let choice = strpart(choice,1,strlen(choice)-1)
+ let wholechoice = ""
+
+ while match(choice,"\"$") == -1
+ let wholechoice = wholechoice . " " . choice
+ let ichoice = ichoice + 1
+ if ichoice > a:0
+ echoerr "Unbalanced string in filename '". wholechoice ."'"
+" call Dret("NetRead")
+ return
+ endif
+ let choice= a:{ichoice}
+ endwhile
+ let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
+ endif
+ endif
+ endif
+" call Decho("NetRead2: choice<" . choice . ">")
+ let ichoice= ichoice + 1
+
+ " fix up windows urls
+ if has("win32")
+ let choice = substitute(choice,'\\','/','ge')
+" call Decho("fixing up windows url to <".choice.">")
+ exe 'lcd ' . fnamemodify(tmpfile,':h')
+ let tmpfile = fnamemodify(tmpfile,':t')
+ endif
+
+ " Determine method of read (ftp, rcp, etc)
+ call s:NetMethod(choice)
+
+ " ============
+ " Perform Read
+ " ============
+
+ ".........................................
+ " rcp: Method #1
+ if b:netrw_method == 1 " read with rcp
+" call Decho("read via rcp (method #1)")
+ " ER: noting done with g:netrw_uid yet?
+ " ER: on Win2K" rcp machine[.user]:file tmpfile
+ " ER: if machine contains '.' adding .user is required (use $USERNAME)
+ " ER: the tmpfile is full path: rcp sees C:\... as host C
+ if s:netrw_has_nt_rcp == 1
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_machine .'.'. g:netrw_uid
+ else
+ " Any way needed it machine contains a '.'
+ let uid_machine = g:netrw_machine .'.'. $USERNAME
+ endif
+ else
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ endif
+" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + <.netrc>: Method #2
+ elseif b:netrw_method == 2 " read with ftp + <.netrc>
+" call Decho("read via ftp+.netrc (method #2)")
+ let netrw_fname= b:netrw_fname
+ new
+ set ff=unix
+ exe "put ='".g:netrw_ftpmode."'"
+ exe "put ='get ".netrw_fname." ".tmpfile."'"
+ if exists("g:netrw_port") && g:netrw_port != ""
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
+ exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+ else
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
+ exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
+ endif
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+ echoerr getline(1)
+ endif
+ bd!
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + machine,id,passwd,filename: Method #3
+ elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
+ " Construct execution string (four lines) which will be passed through filter
+" call Decho("read via ftp+mipf (method #3)")
+ let netrw_fname= b:netrw_fname
+ new
+ set ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ put ='open '.g:netrw_machine
+ endif
+
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ put =g:netrw_uid
+ put =g:netrw_passwd
+ else
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+ endif
+
+ if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
+ put =g:netrw_ftpmode
+ endif
+ put ='get '.netrw_fname.' '.tmpfile
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+" call Decho('performing ftp -i -n')
+ norm 1Gdd
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
+ exe "%!".g:netrw_ftp_cmd." -i -n"
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+ echoerr getline(1)
+ endif
+ bd!
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " scp: Method #4
+ elseif b:netrw_method == 4 " read with scp
+" call Decho("read via scp (method #4)")
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " -P ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+ exe "!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+ else
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe "!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ endif
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ elseif b:netrw_method == 5 " read with http (wget)
+" call Decho("read via http (method #5)")
+ if g:netrw_http_cmd == ""
+ echoerr "neither wget nor fetch command is available"
+ exit
+ endif
+
+ if match(b:netrw_fname,"#") == -1
+ " simple wget
+" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+
+ else
+ " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
+ let netrw_html= substitute(b:netrw_fname,"#.*$","","")
+ let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
+" call Decho("netrw_html<".netrw_html.">")
+" call Decho("netrw_tag <".netrw_tag.">")
+" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
+ exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
+ exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
+ endif
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " cadaver: Method #6
+ elseif b:netrw_method == 6 " read with cadaver
+" call Decho("read via cadaver (method #6)")
+
+ " Construct execution string (four lines) which will be passed through filter
+ let netrw_fname= b:netrw_fname
+ new
+ set ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ put ='open '.g:netrw_machine
+ endif
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+ put ='get '.netrw_fname.' '.cygtmpfile
+ else
+ put ='get '.netrw_fname.' '.tmpfile
+ endif
+
+ " perform cadaver operation:
+ norm 1Gdd
+" call Decho("executing: %!".g:netrw_dav_cmd)
+ exe "%!".g:netrw_dav_cmd
+ bd!
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " rsync: Method #7
+ elseif b:netrw_method == 7 " read with rsync
+" call Decho("read via rsync (method #7)")
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+ exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+ else
+" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ endif
+ let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " fetch: Method #8
+ " fetch://[user@]host[:http]/path
+ elseif b:netrw_method == 8 " read with fetch
+ if g:netrw_fetch_cmd == ""
+ echoerr "fetch command not available"
+ exit
+ endif
+ if exists("g:netrw_option") && g:netrw_option == ":http"
+ let netrw_option= "http"
+ else
+ let netrw_option= "ftp"
+ endif
+" call Decho("read via fetch for ".netrw_option)
+
+ if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
+" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
+ else
+" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
+ endif
+
+ let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " sftp: Method #9
+ elseif b:netrw_method == 9 " read with sftp
+" call Decho("read via sftp (method #4)")
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+ exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+ else
+" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ endif
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ else " Complain
+ echo "***warning*** unable to comply with your request<" . choice . ">"
+ endif
+ endwhile
+
+ " cleanup
+" call Decho("cleanup")
+ if exists("b:netrw_method")
+ unlet b:netrw_method
+ unlet g:netrw_machine
+ unlet b:netrw_fname
+ endif
+ call s:NetOptionRestore()
+
+" call Dret("NetRead")
+endfun
+" end of NetRead
+
+" ------------------------------------------------------------------------
+" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
+fun! s:NetGetFile(readcmd, fname, method)
+" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
+
+ if exists("*NetReadFixup")
+ " for the use of NetReadFixup (not otherwise used internally)
+ let line2= line("$")
+ endif
+
+ " transform paths from / to \ for Windows, unless the shell is bash
+ if &term == "win32"
+ if &shell == "bash"
+ let fname=a:fname
+" call Decho("(win32 && bash) fname<".fname.">")
+ else
+ let fname=substitute(a:fname,'/','\\\\','ge')
+" call Decho("(win32 && !bash) fname<".fname.">")
+ endif
+ else
+ let fname= a:fname
+" call Decho("(copied) fname<".fname.">")
+ endif
+
+ " get the file, but disable undo when reading a new buffer
+ if a:readcmd[0] == '0'
+ let use_e_cmd = 0 " 1 when using ':edit'
+ let delline = 0 " 1 when have to delete empty last line
+ if line("$") == 1 && getline(1) == ""
+ " Now being asked to 0r a file into an empty file.
+ " Safe to :e it instead, unless there is another window on the same buffer.
+ let curbufnr = bufnr("%")
+ let use_e_cmd = 1
+ let delline = 1
+ " Loop over all windows,
+ " reset use_e_cmd when another one is editing the current buffer.
+ let i = 1
+ while 1
+ if i != winnr() && winbufnr(i) == curbufnr
+ let use_e_cmd = 0
+ break
+ endif
+ let i = i + 1
+ if winbufnr(i) < 0
+ break
+ endif
+ endwhile
+ endif
+
+ if use_e_cmd > 0
+ " ':edit' the temp file, wipe out the old buffer and rename the buffer
+ let curfilename = expand("%")
+
+ let binlocal = &l:bin
+ let binglobal = &g:bin
+ if binlocal
+ setglobal bin " Need to set 'bin' globally for ":e" command.
+ endif
+ silent exe "e! ".v:cmdarg." ".fname
+ if binlocal && !binglobal
+ setglobal nobin
+ setlocal bin
+ endif
+
+ exe curbufnr . "bwipe!"
+ exe "f ".curfilename
+ " the ":f newname" apparently leaves the temporary file as the alternate
+ " file in the buffer list (see :ls!). The following command wipes it out.
+ exe bufnr("#")."bwipe!"
+ else
+ let oldul= &ul
+ set ul=-1
+ exe a:readcmd." ".v:cmdarg." ".fname
+ if delline > 0
+ " wipe out last line, which should be a blank line anyway
+ $del
+ endif
+ let &ul= oldul
+ endif
+ else
+ exe a:readcmd." ".v:cmdarg." ".fname
+ endif
+
+ " User-provided (ie. optional) fix-it-up command
+ if exists("*NetReadFixup")
+ let line1= line(".")
+ if a:readcmd == "r"
+ let line2= line("$") - line2 + line1
+ else
+ let line2= line("$") - line2
+ endif
+" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
+ call NetReadFixup(a:method, line1, line2)
+ endif
+" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
+
+" insure that we have the right filetype and that its being displayed
+ filetype detect
+ redraw!
+" call Dret("NetGetFile")
+endfun
+
+" ------------------------------------------------------------------------
+" NetWrite: responsible for writing a file over the net {{{1
+fun! s:NetWrite(...) range
+" call Dfunc("NetWrite(a:0=".a:0.")")
+
+ " option handling
+ let mod= 0
+ call s:NetOptionSave()
+
+ " Get Temporary Filename
+ let tmpfile= tempname()
+
+ if a:0 == 0
+ let ichoice = 0
+ else
+ let ichoice = 1
+ endif
+
+ " write (selected portion of) file to temporary
+ silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
+
+ while ichoice <= a:0
+
+ " attempt to repeat with previous host-file-etc
+ if exists("b:netrw_lastfile") && a:0 == 0
+" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
+ let choice = b:netrw_lastfile
+ let ichoice= ichoice + 1
+ else
+ exe "let choice= a:" . ichoice
+
+ " Reconstruct Choice if choice starts with '"'
+ if match(choice,"?") == 0
+ echo 'NetWrite Usage:"'
+ echo ':Nwrite machine:path uses rcp'
+ echo ':Nwrite "machine path" uses ftp with <.netrc>'
+ echo ':Nwrite "machine id password path" uses ftp'
+ echo ':Nwrite dav://[user@]machine/path uses cadaver'
+ echo ':Nwrite fetch://[user@]machine/path uses fetch'
+ echo ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
+ echo ':Nwrite rcp://machine/path uses rcp'
+ echo ':Nwrite rsync://[user@]machine/path uses rsync'
+ echo ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
+ echo ':Nwrite sftp://[user@]machine/path uses sftp'
+ break
+
+ elseif match(choice,"^\"") != -1
+ if match(choice,"\"$") != -1
+ " case "..."
+ let choice=strpart(choice,1,strlen(choice)-2)
+ else
+ " case "... ... ..."
+ let choice = strpart(choice,1,strlen(choice)-1)
+ let wholechoice = ""
+
+ while match(choice,"\"$") == -1
+ let wholechoice= wholechoice . " " . choice
+ let ichoice = ichoice + 1
+ if choice > a:0
+ echoerr "Unbalanced string in filename '". wholechoice ."'"
+" call Dret("NetWrite")
+ return
+ endif
+ let choice= a:{ichoice}
+ endwhile
+ let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
+ endif
+ endif
+ endif
+" call Decho("choice<" . choice . ">")
+ let ichoice= ichoice + 1
+
+ " fix up windows urls
+ if has("win32")
+ let choice= substitute(choice,'\\','/','ge')
+ "ER: see NetRead()
+ exe 'lcd ' . fnamemodify(tmpfile,':h')
+ let tmpfile = fnamemodify(tmpfile,':t')
+ endif
+
+ " Determine method of read (ftp, rcp, etc)
+ call s:NetMethod(choice)
+
+ " =============
+ " Perform Write
+ " =============
+
+ ".........................................
+ " rcp: Method #1
+ if b:netrw_method == 1 " write with rcp
+" Decho "write via rcp (method #1)"
+ if s:netrw_has_nt_rcp == 1
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_machine .'.'. g:netrw_uid
+ else
+ let uid_machine = g:netrw_machine .'.'. $USERNAME
+ endif
+ else
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ endif
+" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + <.netrc>: Method #2
+ elseif b:netrw_method == 2 " write with ftp + <.netrc>
+ let netrw_fname = b:netrw_fname
+ new
+ set ff=unix
+ exe "put ='".g:netrw_ftpmode."'"
+" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
+ exe "put ='put ".tmpfile." ".netrw_fname."'"
+" call Decho("put ='put ".tmpfile." ".netrw_fname."'")
+ if exists("g:netrw_port") && g:netrw_port != ""
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
+ exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+ else
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
+ exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
+ endif
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+ echoerr getline(1)
+ let mod=1
+ endif
+ bd!
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + machine, id, passwd, filename: Method #3
+ elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
+ let netrw_fname= b:netrw_fname
+ new
+ set ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ put ='open '.g:netrw_machine
+ endif
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ put =g:netrw_uid
+ put =g:netrw_passwd
+ else
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+ endif
+ put ='put '.tmpfile.' '.netrw_fname
+ " save choice/id/password for future use
+ let b:netrw_lastfile = choice
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+" call Decho('performing ftp -i -n')
+ norm 1Gdd
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
+ exe "%!".g:netrw_ftp_cmd." -i -n"
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+ echoerr getline(1)
+ let mod=1
+ endif
+ bd!
+
+ ".........................................
+ " scp: Method #4
+ elseif b:netrw_method == 4 " write with scp
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " -P ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ else
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ endif
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " http: Method #5
+ elseif b:netrw_method == 5
+ echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
+
+ ".........................................
+ " dav: Method #6
+ elseif b:netrw_method == 6 " write with cadaver
+" call Decho("write via cadaver (method #6)")
+
+ " Construct execution string (four lines) which will be passed through filter
+ let netrw_fname= b:netrw_fname
+ new
+ set ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ put ='open '.g:netrw_machine
+ endif
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+ put ='put '.cygtmpfile.' '.netrw_fname
+ else
+ put ='put '.tmpfile.' '.netrw_fname
+ endif
+
+ " perform cadaver operation:
+ norm 1Gdd
+" call Decho("executing: %!".g:netrw_dav_cmd)
+ exe "%!".g:netrw_dav_cmd
+ bd!
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " rsync: Method #7
+ elseif b:netrw_method == 7 " write with rsync
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ else
+" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe "!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ endif
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " scp: Method #9
+ elseif b:netrw_method == 9 " write with sftp
+ let netrw_fname= b:netrw_fname
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ new
+ set ff=unix
+ put ='put '.tmpfile.' '.netrw_fname
+ norm 1Gdd
+" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
+ exe "%!".g:netrw_sftp_cmd.' '.uid_machine
+ bd!
+ let b:netrw_lastfile= choice
+
+ ".........................................
+ else " Complain
+ echo "***warning*** unable to comply with your request<" . choice . ">"
+ endif
+ endwhile
+
+ " cleanup
+" call Decho("cleanup")
+ let result=delete(tmpfile)
+ call s:NetOptionRestore()
+
+ if a:firstline == 1 && a:lastline == line("$")
+ let &mod= mod " usually equivalent to set nomod
+ endif
+
+" call Dret("NetWrite")
+endfun
+" end of NetWrite
+
+" ------------------------------------------------------------------------
+" NetMethod: determine method of transfer {{{1
+" method == 1: rcp
+" 2: ftp + <.netrc>
+" 3: ftp + machine, id, password, and [path]filename
+" 4: scp
+" 5: http (wget)
+" 6: cadaver
+" 7: rsync
+" 8: fetch
+" 9: sftp
+fun! s:NetMethod(choice) " globals: method machine id passwd fname
+" call Dfunc("NetMethod(a:choice<".a:choice.">)")
+
+ " initialization
+ let b:netrw_method = 0
+ let g:netrw_machine = ""
+ let b:netrw_fname = ""
+ let g:netrw_port = ""
+
+ " Patterns:
+ " mipf : a:machine a:id password filename Use ftp
+ " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
+ " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
+ " rcpurm : rcp://[user@]host/filename Use rcp
+ " rcphf : [user@]host:filename Use rcp
+ " scpurm : scp://[user@]host[[#:]port]/filename Use scp
+ " httpurm : http://[user@]host/filename Use wget
+ " davurm : dav://host[:port]/path Use cadaver
+ " rsyncurm : rsync://host[:port]/path Use rsync
+ " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
+ " sftpurm : sftp://[user@]host/filename Use scp
+ let mipf = '\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)'
+ let mf = '\(\S\+\)\s\+\(\S\+\)'
+ let ftpurm = 'ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let rcpurm = 'rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
+ let rcphf = '\(\([^@]\{-}\)@\)\=\(\I\i*\):\(\S\+\)'
+ let scpurm = 'scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let httpurm = 'http://\([^/]\{-}\)\(/.*\)\=$'
+ let davurm = 'dav://\([^/]\{-}\)/\(.*\)\=$'
+ let rsyncurm = 'rsync://\([^/]\{-}\)/\(.*\)\=$'
+ let fetchurm = 'fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
+ let sftpurm = 'sftp://\([^/]\{-}\)/\(.*\)\=$'
+
+" call Decho("determine method:")
+ " Determine Method
+ " rcp://user@hostname/...path-to-file
+ if match(a:choice,rcpurm) == 0
+" call Decho("rcp://...")
+ let b:netrw_method = 1
+ let userid = substitute(a:choice,rcpurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
+ let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+
+ " scp://user@hostname/...path-to-file
+ elseif match(a:choice,scpurm) == 0
+" call Decho("scp://...")
+ let b:netrw_method = 4
+ let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
+ let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
+ let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
+
+ " http://user@hostname/...path-to-file
+ elseif match(a:choice,httpurm) == 0
+" call Decho("http://...")
+ let b:netrw_method = 5
+ let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
+
+ " dav://hostname[:port]/..path-to-file..
+ elseif match(a:choice,davurm) == 0
+" call Decho("dav://...")
+ let b:netrw_method= 6
+ let g:netrw_machine= substitute(a:choice,davurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,davurm,'\2',"")
+
+ " rsync://user@hostname/...path-to-file
+ elseif match(a:choice,rsyncurm) == 0
+" call Decho("rsync://...")
+ let b:netrw_method = 7
+ let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
+
+ " ftp://[user@]hostname[[:#]port]/...path-to-file
+ elseif match(a:choice,ftpurm) == 0
+" call Decho("ftp://...")
+ let userid = substitute(a:choice,ftpurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
+ let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
+ let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
+ if g:netrw_port != ""
+ let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
+ endif
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+ if exists("g:netrw_uid") && exists("g:netrw_passwd")
+ let b:netrw_method = 3
+ else
+ if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
+ let b:netrw_method= 2
+ else
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ call NetUserPass()
+ elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
+ call NetUserPass(g:netrw_uid)
+ " else just use current g:netrw_uid and g:netrw_passwd
+ endif
+ let b:netrw_method= 3
+ endif
+ endif
+
+ elseif match(a:choice,fetchurm) == 0
+" call Decho("fetch://...")
+ let b:netrw_method = 8
+ let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
+ let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
+ let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
+
+ " Issue an ftp : "machine id password [path/]filename"
+ elseif match(a:choice,mipf) == 0
+" call Decho("(ftp) host id pass file")
+ let b:netrw_method = 3
+ let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
+ let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
+ let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
+ let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
+
+ " Issue an ftp: "hostname [path/]filename"
+ elseif match(a:choice,mf) == 0
+" call Decho("(ftp) host file")
+ if exists("g:netrw_uid") && exists("g:netrw_passwd")
+ let b:netrw_method = 3
+ let g:netrw_machine = substitute(a:choice,mf,'\1',"")
+ let b:netrw_fname = substitute(a:choice,mf,'\2',"")
+
+ elseif filereadable(expand("$HOME/.netrc"))
+ let b:netrw_method = 2
+ let g:netrw_machine = substitute(a:choice,mf,'\1',"")
+ let b:netrw_fname = substitute(a:choice,mf,'\2',"")
+ endif
+
+ " sftp://user@hostname/...path-to-file
+ elseif match(a:choice,sftpurm) == 0
+" call Decho("sftp://...")
+ let b:netrw_method = 9
+ let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
+
+ " Issue an rcp: hostname:filename" (this one should be last)
+ elseif match(a:choice,rcphf) == 0
+" call Decho("(rcp) host:file)")
+ let b:netrw_method = 1
+ let userid = substitute(a:choice,rcphf,'\2',"")
+ let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
+ let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+ if has("win32")
+ " don't let PCs try <.netrc>
+ let b:netrw_method = 3
+ endif
+
+ else
+ echoerr "***error*** cannot determine method"
+ let b:netrw_method = -1
+ endif
+
+" call Decho("a:choice <".a:choice.">")
+" call Decho("b:netrw_method <".b:netrw_method.">")
+" call Decho("g:netrw_machine<".g:netrw_machine.">")
+" call Decho("g:netrw_port <".g:netrw_port.">")
+" if exists("g:netrw_uid") "Decho
+" call Decho("g:netrw_uid <".g:netrw_uid.">")
+" endif "Decho
+" if exists("g:netrw_passwd") "Decho
+" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
+" endif "Decho
+" call Decho("b:netrw_fname <".b:netrw_fname.">")
+" call Dret("NetMethod")
+endfun
+" end of NetMethod
+
+" ------------------------------------------------------------------------
+" 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
+" end NetUserPass
+
+" ------------------------------------------------------------------------
+" NetOptionSave: save options and set to "standard" form {{{1
+fun!s:NetOptionSave()
+" call Dfunc("NetOptionSave()")
+
+ " Get Temporary Filename
+ let s:aikeep = &ai
+ let s:cinkeep = &cin
+ let s:cinokeep = &cino
+ let s:comkeep = &com
+ let s:cpokeep = &cpo
+ let s:dirkeep = getcwd()
+ let s:gdkeep = &gd
+ let s:twkeep = &tw
+ set cino =
+ set com =
+ set cpo -=aA
+ set nocin noai
+ set tw =0
+ if has("win32") && !has("win95")
+ let s:swfkeep= &swf
+ set noswf
+" call Decho("setting s:swfkeep to <".&swf.">")
+ endif
+
+" call Dret("NetOptionSave")
+endfun
+
+" ------------------------------------------------------------------------
+" NetOptionRestore: restore options {{{1
+fun! s:NetOptionRestore()
+" call Dfunc("NetOptionRestore()")
+
+ let &ai = s:aikeep
+ let &cin = s:cinkeep
+ let &cino = s:cinokeep
+ let &com = s:comkeep
+ let &cpo = s:cpokeep
+ exe "lcd ".s:dirkeep
+ let &gd = s:gdkeep
+ let &tw = s:twkeep
+ if exists("s:swfkeep")
+ let &swf= s:swfkeep
+ unlet s:swfkeep
+ endif
+ unlet s:aikeep
+ unlet s:cinkeep
+ unlet s:cinokeep
+ unlet s:comkeep
+ unlet s:cpokeep
+ unlet s:gdkeep
+ unlet s:twkeep
+ unlet s:dirkeep
+
+" call Dret("NetOptionRestore")
+endfun
+
+" ------------------------------------------------------------------------
+" NetReadFixup: this sort of function is typically written by the user {{{1
+" to handle extra junk that their system's ftp dumps
+" into the transfer. This function is provided as an
+" example and as a fix for a Windows 95 problem: in my
+" experience, win95's ftp always dumped four blank lines
+" at the end of the transfer.
+if has("win95") && g:netrw_win95ftp
+ fun! NetReadFixup(method, line1, line2)
+" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
+ if method == 3 " ftp (no <.netrc>)
+ let fourblanklines= line2 - 3
+ silent fourblanklines.",".line2."g/^\s*/d"
+ endif
+" call Dret("NetReadFixup")
+ endfun
+endif
+
+" ------------------------------------------------------------------------
+" Restore {{{1
+let &cpo= s:save_cpo
+unlet s:save_cpo
+" vim:ts=8 fdm=marker
diff --git a/runtime/plugin/rrhelper.vim b/runtime/plugin/rrhelper.vim
new file mode 100644
index 000000000..05090b59c
--- /dev/null
+++ b/runtime/plugin/rrhelper.vim
@@ -0,0 +1,47 @@
+" Vim plugin with helper function(s) for --remote-wait
+" Maintainer: Flemming Madsen <fma@cci.dk>
+" Last Change: 2004 May 30
+
+" Has this already been loaded?
+if exists("loaded_rrhelper")
+ finish
+endif
+let loaded_rrhelper = 1
+
+" Setup answers for a --remote-wait client who will assume
+" a SetupRemoteReplies() function in the command server
+
+if has("clientserver")
+ 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 = escape(substitute(argv(cnt), '\\', '/', "g"), ' *,?[{')
+ 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
+
+endif
+
+
+" vim: set sw=2 sts=2 :
diff --git a/runtime/plugin/tohtml.vim b/runtime/plugin/tohtml.vim
new file mode 100644
index 000000000..9914bed6d
--- /dev/null
+++ b/runtime/plugin/tohtml.vim
@@ -0,0 +1,27 @@
+" Vim plugin for converting a syntax highlighted file to HTML.
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2003 Apr 06
+
+" Don't do this when:
+" - when 'compatible' is set
+" - this plugin was already loaded
+" - user commands are not available.
+if !&cp && !exists(":TOhtml") && has("user_commands")
+ command -range=% TOhtml :call Convert2HTML(<line1>, <line2>)
+
+ func Convert2HTML(line1, line2)
+ if a:line2 >= a:line1
+ let g:html_start_line = a:line1
+ let g:html_end_line = a:line2
+ else
+ let g:html_start_line = a:line2
+ let g:html_end_line = a:line1
+ endif
+
+ runtime syntax/2html.vim
+
+ unlet g:html_start_line
+ unlet g:html_end_line
+ endfunc
+
+endif