updated for version 7.0001
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt
new file mode 100644
index 0000000..489ebf6
--- /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 0000000..4a5b605
--- /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 0000000..39b0cbc
--- /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 0000000..d3058c5
--- /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 0000000..05090b5
--- /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 0000000..9914bed
--- /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