[SCM] Vim packaging branch, deb/runtime, updated. upstream/7.2.130-157-g487a727

James Vega jamessan at debian.org
Sat Apr 18 00:48:09 UTC 2009


The following commit has been merged in the deb/runtime branch:
commit d984ef23f6bc9e4ec9c6fe5e73dc700ec8c6b341
Merge: ec820d38e6ef3bceb8bd2a6a9288081e3e4a769c ab97c3c453c7798f4053ef9986fcff4f377e3097
Author: James Vega <jamessan at debian.org>
Date:   Fri Apr 17 17:01:59 2009 -0400

    Merge branch 'upstream-runtime' into deb/runtime
    
    Conflicts:
    	runtime/ftplugin/verilog.vim
    	runtime/syntax/python.vim
    	runtime/syntax/tex.vim
    
    Signed-off-by: James Vega <jamessan at debian.org>

diff --combined runtime/autoload/netrw.vim
index 1ea5f97,2dadcfa..c34bc8c
--- a/runtime/autoload/netrw.vim
+++ b/runtime/autoload/netrw.vim
@@@ -1,7 -1,7 +1,7 @@@
  " netrw.vim: Handles file transfer and remote directory listing across
  "            AUTOLOAD SECTION
- " Date:		Aug 08, 2008
- " Version:	132
+ " Date:		Jan 14, 2009
+ " Version:	135
  " Maintainer:	Charles E Campbell, Jr <NdrOchip at ScampbellPfamily.AbizM-NOSPAM>
  " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
  " Copyright:    Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
@@@ -22,12 -22,18 +22,18 @@@
  if &cp || exists("g:loaded_netrw")
    finish
  endif
+ let g:loaded_netrw = "v135"
+ if v:version < 702
+  echohl WarningMsg
+  echo "***warning*** this version of netrw needs vim 7.2"
+  echohl Normal
+  finish
+ endif
  if !exists("s:NOTE")
   let s:NOTE    = 0
   let s:WARNING = 1
   let s:ERROR   = 2
  endif
- let g:loaded_netrw = "v132"
  
  " sanity checks
  if v:version < 700
@@@ -45,25 -51,40 +51,40 @@@ setlocal cpo&vi
  " ======================
  
  " ---------------------------------------------------------------------
+ " NetrwInit: function to initialize variables {{{2
+ fun s:NetrwInit(varname,value)
+   if !exists(a:varname)
+    if type(a:value) == 0
+     exe "let ".a:varname."=".a:value
+    elseif type(a:value) == 1
+     exe "let ".a:varname."="."'".a:value."'"
+    else
+     exe "let ".a:varname."=".a:value
+   endif
+  endif
+ endfun
+ 
+ " ---------------------------------------------------------------------
  "  Netrw Constants: {{{2
- if !exists("g:NETRW_BOOKMARKMAX")
-  let g:NETRW_BOOKMARKMAX= 0
- endif
- if !exists("g:NETRW_DIRHIST_CNT")
-  let g:NETRW_DIRHIST_CNT= 0
- endif
+ call s:NetrwInit("g:netrw_dirhist_cnt",0)
  if !exists("s:LONGLIST")
-  let s:THINLIST = 0
-  let s:LONGLIST = 1
-  let s:WIDELIST = 2
-  let s:TREELIST = 3
-  let s:MAXLIST  = 4
+  call s:NetrwInit("s:THINLIST",0)
+  call s:NetrwInit("s:LONGLIST",1)
+  call s:NetrwInit("s:WIDELIST",2)
+  call s:NetrwInit("s:TREELIST",3)
+  call s:NetrwInit("s:MAXLIST" ,4)
  endif
  
  " ---------------------------------------------------------------------
  " Default values for netrw's global protocol variables {{{2
  if !exists("g:netrw_dav_cmd")
+  if executable("cadaver")
    let g:netrw_dav_cmd	= "cadaver"
+  elseif executable("curl")
+   let g:netrw_dav_cmd	= "curl"
+  else
+   let g:netrw_dav_cmd   = ""
+  endif
  endif
  if !exists("g:netrw_fetch_cmd")
   if executable("fetch")
@@@ -78,35 -99,34 +99,34 @@@ endi
  if !exists("g:netrw_http_cmd")
   if executable("elinks")
    let g:netrw_http_cmd = "elinks"
-   let g:netrw_http_xcmd= "-dump >"
+   if !exists("g:netrw_http_xcmd")
+    let g:netrw_http_xcmd= "-dump >"
+   endif
   elseif executable("links")
    let g:netrw_http_cmd = "links"
-   let g:netrw_http_xcmd= "-dump >"
+   if !exists("g:netrw_http_xcmd")
+    let g:netrw_http_xcmd= "-dump >"
+   endif
   elseif executable("curl")
-   let g:netrw_http_cmd	= "curl -o"
+   let g:netrw_http_cmd	= "curl"
+   if !exists("g:netrw_http_xcmd")
+    let g:netrw_http_xcmd= "-o"
+   endif
   elseif executable("wget")
-   let g:netrw_http_cmd	= "wget -q -O"
+   let g:netrw_http_cmd	= "wget"
+   call s:NetrwInit("g:netrw_http_xcmd","-q -O")
   elseif executable("fetch")
-   let g:netrw_http_cmd	= "fetch -o"
+   let g:netrw_http_cmd	= "fetch"
+   call s:NetrwInit("g:netrw_http_xcmd","-o")
   else
    let g:netrw_http_cmd	= ""
   endif
  endif
- if !exists("g:netrw_rcp_cmd")
-   let g:netrw_rcp_cmd	= "rcp"
- endif
- if !exists("g:netrw_rsync_cmd")
-   let g:netrw_rsync_cmd	= "rsync"
- 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_ssh_cmd")
-  let g:netrw_ssh_cmd= "ssh"
- endif
+ call s:NetrwInit("g:netrw_rcp_cmd"  , "rcp")
+ call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
+ call s:NetrwInit("g:netrw_scp_cmd"  , "scp -q")
+ call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
+ call s:NetrwInit("g:netrw_ssh_cmd"  , "ssh")
  
  if (has("win32") || has("win95") || has("win64") || has("win16"))
    \ && exists("g:netrw_use_nt_rcp")
@@@ -134,40 -154,23 +154,23 @@@ if !exists("g:netrw_cygwin"
   endif
  endif
  " Default values - a-c ---------- {{{3
- if !exists("g:netrw_alto")
-  let g:netrw_alto= &sb
- endif
- if !exists("g:netrw_altv")
-  let g:netrw_altv= &spr
- endif
- if !exists("g:netrw_browse_split")
-  let g:netrw_browse_split= 0
- endif
- if !exists("g:netrw_chgwin")
-  let g:netrw_chgwin    = -1
- endif
- if !exists("g:netrw_compress")
-  let g:netrw_compress= "gzip"
- endif
- if !exists("g:netrw_ctags")
-  let g:netrw_ctags= "ctags"
+ call s:NetrwInit("g:netrw_alto"        , &sb)
+ call s:NetrwInit("g:netrw_altv"        , &spr)
+ call s:NetrwInit("g:netrw_browse_split", 0)
+ call s:NetrwInit("g:netrw_chgwin"      , -1)
+ call s:NetrwInit("g:netrw_compress"    , "gzip")
+ call s:NetrwInit("g:netrw_ctags"       , "ctags")
+ if !exists("g:netrw_cursorline")
+  let g:netrw_cursorline= 1
+  let s:netrw_usercul   = &cursorline
+  let s:netrw_usercuc   = &cursorcolumn
  endif
  " Default values - d-g ---------- {{{3
- if !exists("g:NETRW_DIRHIST_CNT")
-  let g:NETRW_DIRHIST_CNT= 0
- endif
- if !exists("g:netrw_decompress")
-  let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
- endif
- if !exists("g:netrw_dirhistmax")
-  let g:netrw_dirhistmax= 10
- endif
- if !exists("g:netrw_fastbrowse")
-  let g:netrw_fastbrowse= 1
- endif
- if !exists("g:netrw_ftp_browse_reject")
-  let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$'
- endif
+ call s:NetrwInit("g:netrw_dirhist_cnt"      , 0)
+ call s:NetrwInit("g:netrw_decompress"       , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf"}')
+ call s:NetrwInit("g:netrw_dirhistmax"       , 10)
+ call s:NetrwInit("g:netrw_fastbrowse"       , 1)
+ call s:NetrwInit("g:netrw_ftp_browse_reject", '^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$')
  if !exists("g:netrw_ftp_list_cmd")
   if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
    let g:netrw_ftp_list_cmd     = "ls -lF"
@@@ -179,13 -182,9 +182,9 @@@
    let g:netrw_ftp_sizelist_cmd = "dir"
   endif
  endif
- if !exists("g:netrw_ftpmode")
-  let g:netrw_ftpmode= "binary"
- endif
+ call s:NetrwInit("g:netrw_ftpmode",'binary')
  " Default values - h-lh ---------- {{{3
- if !exists("g:netrw_hide")
-  let g:netrw_hide= 1
- endif
+ call s:NetrwInit("g:netrw_hide",1)
  if !exists("g:netrw_ignorenetrc")
   if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
    let g:netrw_ignorenetrc= 1
@@@ -193,9 -192,7 +192,7 @@@
    let g:netrw_ignorenetrc= 0
   endif
  endif
- if !exists("g:netrw_keepdir")
-  let g:netrw_keepdir= 1
- endif
+ call s:NetrwInit("g:netrw_keepdir",1)
  if !exists("g:netrw_list_cmd")
   if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
    " provide a 'pscp' listing command
@@@ -211,9 -208,7 +208,7 @@@
    let g:netrw_list_cmd= ""
   endif
  endif
- if !exists("g:netrw_list_hide")
-  let g:netrw_list_hide= ""
- endif
+ call s:NetrwInit("g:netrw_list_hide","")
  " Default values - lh-lz ---------- {{{3
  if !exists("g:netrw_localcopycmd")
   if has("win32") || has("win95") || has("win64") || has("win16")
@@@ -228,9 -223,7 +223,7 @@@
    let g:netrw_localcopycmd= ""
   endif
  endif
- if !exists("g:netrw_local_mkdir")
-  let g:netrw_local_mkdir= "mkdir"
- endif
+ call s:NetrwInit("g:netrw_local_mkdir","mkdir")
  if !exists("g:netrw_localmovecmd")
   if has("win32") || has("win95") || has("win64") || has("win16")
    if g:netrw_cygwin
@@@ -244,128 -237,59 +237,59 @@@
    let g:netrw_localmovecmd= ""
   endif
  endif
- if !exists("g:netrw_local_rmdir")
-  let g:netrw_local_rmdir= "rmdir"
- endif
- if !exists("g:netrw_liststyle")
-  let g:netrw_liststyle= s:THINLIST
- endif
+ call s:NetrwInit("g:netrw_local_rmdir", "rmdir")
+ call s:NetrwInit("g:netrw_liststyle"  , s:THINLIST)
+ " sanity checks
  if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
-  " sanity check
   let g:netrw_liststyle= s:THINLIST
  endif
  if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
   let g:netrw_list_cmd= g:netrw_list_cmd." -l"
  endif
  " Default values - m-r ---------- {{{3
- if !exists("g:netrw_markfileesc")
-  let g:netrw_markfileesc= '*./[\~'
- endif
- if !exists("g:netrw_maxfilenamelen")
-  let g:netrw_maxfilenamelen= 32
- endif
- if !exists("g:netrw_menu")
-  let g:netrw_menu= 1
- endif
- if !exists("g:netrw_mkdir_cmd")
-  let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir"
- endif
- if !exists("g:netrw_mousemaps")
-  if exists("&mouse") && &mouse =~ '[anh]'
-   let g:netrw_mousemaps= 1
-  else
-   let g:netrw_mousemaps= 0
-  endif
- endif
- if !exists("g:netrw_retmap")
-  let g:netrw_retmap= 0
- endif
- if !exists("g:netrw_preview")
-  let g:netrw_preview= 0
- endif
- if !exists("g:netrw_scpport")
-  let g:netrw_scpport= "-P"
- endif
- if !exists("g:netrw_sshport")
-  let g:netrw_sshport= "-p"
- endif
- if !exists("g:netrw_rename_cmd")
-  let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv"
- endif
- if !exists("g:netrw_rm_cmd")
-  let g:netrw_rm_cmd    = g:netrw_ssh_cmd." USEPORT HOSTNAME rm"
- endif
- if !exists("g:netrw_rmdir_cmd")
-  let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir"
- endif
- if !exists("g:netrw_rmf_cmd")
-  let g:netrw_rmf_cmd    = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
- endif
+ call s:NetrwInit("g:netrw_markfileesc"   , '*./[\~')
+ call s:NetrwInit("g:netrw_maxfilenamelen", 32)
+ call s:NetrwInit("g:netrw_menu"          , 1)
+ call s:NetrwInit("g:netrw_mkdir_cmd"     , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
+ call s:NetrwInit("g:netrw_mousemaps"     , (exists("&mouse") && &mouse =~ '[anh]'))
+ call s:NetrwInit("g:netrw_retmap"        , 0)
+ call s:NetrwInit("g:netrw_preview"       , 0)
+ call s:NetrwInit("g:netrw_scpport"       , "-P")
+ call s:NetrwInit("g:netrw_sshport"       , "-p")
+ call s:NetrwInit("g:netrw_rename_cmd"    , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
+ call s:NetrwInit("g:netrw_rm_cmd"        , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
+ call s:NetrwInit("g:netrw_rmdir_cmd"     , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
+ call s:NetrwInit("g:netrw_rmf_cmd"       , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
  " Default values - s ---------- {{{3
-  " set up shell quoting character
- if exists("g:netrw_silent") && g:netrw_silent != 0
-  let s:netrw_silentxfer= "silent "
- else
-  let s:netrw_silentxfer= ""
- endif
- if !exists("g:netrw_sort_by")
-  " alternatives: date size
-  let g:netrw_sort_by= "name"
- endif
- if !exists("g:netrw_sort_options")
-  let g:netrw_sort_options= ""
- endif
- if !exists("g:netrw_sort_direction")
-  " alternative: reverse  (z y x ...)
-  let g:netrw_sort_direction= "normal"
- endif
+ " g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
+ call s:NetrwInit("g:netrw_sepchr"        , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
+ call s:NetrwInit("s:netrw_silentxfer"    , (exists("g:netrw_silent") && g:netrw_silent != 0)? "silent " : "")
+ call s:NetrwInit("g:netrw_sort_by"       , "name") " alternatives: date                                      , size
+ call s:NetrwInit("g:netrw_sort_options"  , "")
+ call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse  (z y x ...)
  if !exists("g:netrw_sort_sequence")
-  let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
- endif
- if !exists("g:netrw_special_syntax")
-  let g:netrw_special_syntax= 0
- endif
- if !exists("g:netrw_ssh_browse_reject")
-   let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
- endif
- if !has("patch192")
-  if !exists("g:netrw_use_noswf")
-   let g:netrw_use_noswf= 1
+  if has("unix")
+   let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
+  else
+   let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
   endif
- else
-   let g:netrw_use_noswf= 0
  endif
+ call s:NetrwInit("g:netrw_special_syntax"   , 0)
+ call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
+ call s:NetrwInit("g:netrw_use_noswf"        , 0)
  " Default values - t-w ---------- {{{3
- if !exists("g:netrw_timefmt")
-  let g:netrw_timefmt= "%c"
- endif
- if !exists("g:netrw_xstrlen")
-  let g:netrw_xstrlen= 1
- endif
- if !exists("g:NetrwTopLvlMenu")
-  let g:NetrwTopLvlMenu= "Netrw."
- endif
- if !exists("g:netrw_use_errorwindow")
-  let g:netrw_use_errorwindow= 1
- endif
- if !exists("g:netrw_win95ftp")
-  let g:netrw_win95ftp= 1
- endif
- if !exists("g:netrw_winsize")
-  let g:netrw_winsize= ""
- endif
+ call s:NetrwInit("g:netrw_timefmt","%c")
+ call s:NetrwInit("g:netrw_xstrlen",0)
+ call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
+ call s:NetrwInit("g:netrw_use_errorwindow",1)
+ call s:NetrwInit("g:netrw_win95ftp",1)
+ call s:NetrwInit("g:netrw_winsize","")
  " ---------------------------------------------------------------------
  " Default values for netrw's script variables: {{{2
- if !exists("g:netrw_fname_escape")
-  let g:netrw_fname_escape= ' ?&;%'
- endif
- if !exists("g:netrw_glob_escape")
-   let g:netrw_glob_escape= '[]*?`{~$'
- endif
- if !exists("g:netrw_tmpfile_escape")
-  let g:netrw_tmpfile_escape= ' &;'
- endif
- let s:netrw_map_escape = "<|\n\r\\\<C-V>\""
+ call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
+ call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$')
+ call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
+ call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
  
  " BufEnter event ignored by decho when following variable is true
  "  Has a side effect that doau BufReadPost doesn't work, so
@@@ -384,7 -308,7 +308,7 @@@
  "             NetrwBrowse.
  "             vt: normally its "w:" or "s:" (a variable type)
  fun! s:NetrwOptionSave(vt)
- "  call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
+ "  call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
  
  "  call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
    if !exists("{a:vt}netrw_optionsave")
@@@ -430,7 -354,7 +354,7 @@@ endfu
  " ------------------------------------------------------------------------
  " s:NetrwOptionRestore: restore options {{{2
  fun! s:NetrwOptionRestore(vt)
- "  call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%"))
+ "  call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")." winnr($)=".winnr("$"))
    if !exists("{a:vt}netrw_optionsave")
  "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
  "   call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
@@@ -503,8 -427,8 +427,8 @@@ endfu
  " ---------------------------------------------------------------------
  " s:NetrwSafeOptions: sets options to help netrw do its job {{{2
  fun! s:NetrwSafeOptions()
- "  call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
- "  call Decho("window's ft=".&ft)
+ "  call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
+ "  call Decho("win#".winnr()."'s ft=".&ft)
    setlocal cino=
    setlocal com=
    setlocal cpo-=aA
@@@ -513,9 -437,14 +437,14 @@@
    setlocal fo=nroql2
    setlocal tw=0
    setlocal report=10000
+   setlocal isk+=@ isk+=* isk+=/
    if g:netrw_use_noswf && has("win32") && !has("win95")
     setlocal noswf
    endif
+ 
+   " allow the user to override safe options
+   silent keepalt keepjumps doau FileType netrw
+ 
  "  call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
  "  call Dret("s:NetrwSafeOptions")
  endfun
@@@ -566,6 -495,16 +495,16 @@@ fun! netrw#NetrwClean(sys
  "  call Dret("netrw#NetrwClean")
  endfun
  
+ " ---------------------------------------------------------------------
+ " netrw#Nread: {{{2
+ fun! netrw#Nread(mode,fname)
+ "  call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
+   call netrw#NetrwSavePosn()
+   call netrw#NetRead(a:mode,a:fname)
+   call netrw#NetrwRestorePosn()
+ "  call Dret("netrw#Nread")
+ endfun
+ 
  " ------------------------------------------------------------------------
  "  Netrw Transfer Functions: {{{1
  " ===============================
@@@ -579,11 -518,11 +518,11 @@@
  fun! netrw#NetRead(mode,...)
  "  call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
  
-   " save options {{{3
+   " NetRead: save options {{{3
    call s:NetrwOptionSave("w:")
    call s:NetrwSafeOptions()
  
-   " interpret mode into a readcmd {{{3
+   " NetRead: interpret mode into a readcmd {{{3
    if     a:mode == 0 " read remote file before current line
     let readcmd = "0r"
    elseif a:mode == 1 " read file after current line
@@@ -599,7 -538,7 +538,7 @@@
    let ichoice = (a:0 == 0)? 0 : 1
  "  call Decho("readcmd<".readcmd."> ichoice=".ichoice)
  
-   " Get Temporary Filename {{{3
+   " NetRead: get temporary filename {{{3
    let tmpfile= s:GetTempfile("")
    if tmpfile == ""
  "   call Dret("netrw#NetRead : unable to get a tempfile!")
@@@ -666,8 -605,12 +605,12 @@@
  "   call Decho("choice<" . choice . ">")
     let ichoice= ichoice + 1
  
-    " Determine method of read (ftp, rcp, etc) {{{3
+    " NetRead: Determine method of read (ftp, rcp, etc) {{{3
     call s:NetrwMethod(choice)
+    if !exists("b:netrw_method") || b:netrw_method < 0
+ "    call Dfunc("netrw#NetRead : unsupported method")
+     return
+    endif
     let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
  
     " Check if NetrwBrowse() should be handling this request
@@@ -680,14 -623,14 +623,14 @@@
     endif
  
     " ============
-    " Perform Protocol-Based Read {{{3
+    " NetRead: Perform Protocol-Based Read {{{3
     " ===========================
     if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
      echo "(netrw) Processing your read request..."
     endif
  
     ".........................................
-    " rcp:  NetRead Method #1 {{{3
+    " NetRead: (rcp)  NetRead Method #1 {{{3
     if  b:netrw_method == 1 " read with rcp
  "    call Decho("read via rcp (method #1)")
     " ER: nothing done with g:netrw_uid yet?
@@@ -709,12 -652,12 +652,12 @@@
      endif
     endif
  "   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
-    exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
+    exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
     let b:netrw_lastfile = choice
  
     ".........................................
-    " ftp + <.netrc>:  NetRead Method #2 {{{3
+    " NetRead: (ftp + <.netrc>)  NetRead Method #2 {{{3
     elseif b:netrw_method  == 2		" read with ftp + <.netrc>
  "     call Decho("read via ftp+.netrc (method #2)")
       let netrw_fname= b:netrw_fname
@@@ -745,7 -688,8 +688,8 @@@
       endif
       call s:SaveBufVars()
       bd!
-      if bufname("%") == "" && line("$") == 1 && getline("$") == ""
+      if bufname("%") == "" && getline("$") == "" && line('$') == 1
+       " needed when one sources a file in a nolbl setting window via ftp
        q!
       endif
       call s:RestoreBufVars()
@@@ -753,7 -697,7 +697,7 @@@
       let b:netrw_lastfile = choice
  
     ".........................................
-    " ftp + machine,id,passwd,filename:  NetRead Method #3 {{{3
+    " NetRead: (ftp + machine,id,passwd,filename)  NetRead Method #3 {{{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)")
@@@ -809,7 -753,7 +753,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " scp: NetRead Method #4 {{{3
+    " NetRead: (scp) NetRead Method #4 {{{3
     elseif     b:netrw_method  == 4	" read with scp
  "    call Decho("read via scp (method #4)")
      if exists("g:netrw_port") && g:netrw_port != ""
@@@ -823,7 -767,7 +767,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " http: NetRead Method #5 (wget) {{{3
+    " NetRead: (http) NetRead Method #5 (wget) {{{3
     elseif     b:netrw_method  == 5
  "    call Decho("read via http (method #5)")
      if g:netrw_http_cmd == ""
@@@ -863,33 -807,43 +807,43 @@@
      setlocal ro
  
     ".........................................
-    " cadaver: NetRead Method #6 {{{3
+    " NetRead: (dav) NetRead Method #6 {{{3
     elseif     b:netrw_method  == 6
  "    call Decho("read via cadaver (method #6)")
  
-     " Construct execution string (four lines) which will be passed through filter
-     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
-     new
-     setlocal ff=unix
-     if exists("g:netrw_port") && g:netrw_port != ""
-      put ='open '.g:netrw_machine.' '.g:netrw_port
-     else
-      put ='open '.g:netrw_machine
+     if !executable(g:netrw_dav_cmd)
+      call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
+ "     call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
+      return
      endif
-     put ='user '.g:netrw_uid.' '.s:netrw_passwd
-     put ='get '.netrw_fname.' '.tmpfile
-     put ='quit'
+     if g:netrw_dav_cmd =~ "curl"
+ "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
+      exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
+     else
+      " Construct execution string (four lines) which will be passed through filter
+      let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
+      new
+      setlocal 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.' '.s:netrw_passwd
+      put ='get '.netrw_fname.' '.tmpfile
+      put ='quit'
  
-     " perform cadaver operation:
-     norm! 1Gdd
+      " perform cadaver operation:
+      norm! 1Gdd
  "    call Decho("executing: %!".g:netrw_dav_cmd)
-     exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
-     bd!
+      exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
+      bd!
+     endif
      let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
      let b:netrw_lastfile = choice
  
     ".........................................
-    " rsync: NetRead Method #7 {{{3
+    " NetRead: (rsync) NetRead Method #7 {{{3
     elseif     b:netrw_method  == 7
  "    call Decho("read via rsync (method #7)")
  "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
@@@ -898,7 -852,7 +852,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " fetch: NetRead Method #8 {{{3
+    " NetRead: (fetch) NetRead Method #8 {{{3
     "    fetch://[user@]host[:http]/path
     elseif     b:netrw_method  == 8
  "    call Decho("read via fetch (method #8)")
@@@ -928,7 -882,7 +882,7 @@@
      setlocal ro
  
     ".........................................
-    " sftp: NetRead Method #9 {{{3
+    " NetRead: (sftp) NetRead Method #9 {{{3
     elseif     b:netrw_method  == 9
  "    call Decho("read via sftp (method #9)")
  "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
@@@ -937,13 -891,13 +891,13 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " Complain {{{3
+    " NetRead: Complain {{{3
     else
      call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
     endif
    endwhile
  
-   " cleanup {{{3
+   " NetRead: cleanup {{{3
    if exists("b:netrw_method")
  "   call Decho("cleanup b:netrw_method and b:netrw_fname")
     unlet b:netrw_method
@@@ -951,7 -905,7 +905,7 @@@
    endif
    if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
  "   call Decho("cleanup by deleting tmpfile<".tmpfile.">")
-    call s:NetrwDelete(fnameescape(tmpfile))
+    call s:NetrwDelete(tmpfile)
    endif
    call s:NetrwOptionRestore("w:")
  
@@@ -963,12 -917,12 +917,12 @@@ endfu
  fun! netrw#NetWrite(...) range
  "  call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
  
-   " option handling
+   " NetWrite: option handling {{{3
    let mod= 0
    call s:NetrwOptionSave("w:")
    call s:NetrwSafeOptions()
  
-   " Get Temporary Filename {{{3
+   " NetWrite: Get Temporary Filename {{{3
    let tmpfile= s:GetTempfile("")
    if tmpfile == ""
  "   call Dret("netrw#NetWrite : unable to get a tempfile!")
@@@ -1007,7 -961,7 +961,7 @@@
     0file!
    endif
  
-   " While choice loop: {{{3
+   " NetWrite: while choice loop: {{{3
    while ichoice <= a:0
  
     " Process arguments: {{{4
@@@ -1065,9 -1019,13 +1019,13 @@@
  
     " Determine method of write (ftp, rcp, etc) {{{4
     call s:NetrwMethod(choice)
+    if !exists("b:netrw_method") || b:netrw_method < 0
+ "    call Dfunc("netrw#NetWrite : unsupported method")
+     return
+    endif
  
     " =============
-    " Perform Protocol-Based Write {{{4
+    " NetWrite: Perform Protocol-Based Write {{{3
     " ============================
     if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
      echo "(netrw) Processing your write request..."
@@@ -1075,7 -1033,7 +1033,7 @@@
     endif
  
     ".........................................
-    " rcp: NetWrite Method #1 {{{4
+    " NetWrite: (rcp) NetWrite Method #1 {{{3
     if  b:netrw_method == 1
  "    call Decho("write via rcp (method #1)")
      if s:netrw_has_nt_rcp == 1
@@@ -1096,7 -1054,7 +1054,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " ftp + <.netrc>: NetWrite Method #2 {{{4
+    " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
     elseif b:netrw_method == 2
  "    call Decho("write via ftp+.netrc (method #2)")
      let netrw_fname= b:netrw_fname
@@@ -1130,7 -1088,7 +1088,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
+    " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
     elseif b:netrw_method == 3
      " Construct execution string (four lines) which will be passed through filter
  "    call Decho("read via ftp+mipf (method #3)")
@@@ -1175,7 -1133,7 +1133,7 @@@
      bd!
  
     ".........................................
-    " scp: NetWrite Method #4 {{{4
+    " NetWrite: (scp) NetWrite Method #4 {{{3
     elseif     b:netrw_method == 4
  "    call Decho("write via scp (method #4)")
      if exists("g:netrw_port") && g:netrw_port != ""
@@@ -1188,7 -1146,7 +1146,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " http: NetWrite Method #5 {{{4
+    " NetWrite: (http) NetWrite Method #5 {{{3
     elseif     b:netrw_method == 5
  "    call Decho("write via http (method #5)")
      if !exists("g:netrw_quiet")
@@@ -1196,7 -1154,7 +1154,7 @@@
      endif
  
     ".........................................
-    " dav: NetWrite Method #6 (cadaver) {{{4
+    " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
     elseif     b:netrw_method == 6
  "    call Decho("write via cadaver (method #6)")
  
@@@ -1222,7 -1180,7 +1180,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " rsync: NetWrite Method #7 {{{4
+    " NetWrite: (rsync) NetWrite Method #7 {{{3
     elseif     b:netrw_method == 7
  "    call Decho("write via rsync (method #7)")
  "    call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
@@@ -1230,7 -1188,7 +1188,7 @@@
      let b:netrw_lastfile = choice
  
     ".........................................
-    " sftp: NetWrite Method #9 {{{4
+    " NetWrite: (sftp) NetWrite Method #9 {{{3
     elseif     b:netrw_method == 9
  "    call Decho("read via sftp (method #9)")
      let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
@@@ -1250,13 -1208,13 +1208,13 @@@
      let b:netrw_lastfile= choice
  
     ".........................................
-    " Complain {{{4
+    " NetWrite: Complain {{{3
     else
      call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
     endif
    endwhile
  
-   " Cleanup: {{{3
+   " NetWrite: Cleanup: {{{3
  "  call Decho("cleanup")
    if s:FileReadable(tmpfile)
  "   call Decho("tmpfile<".tmpfile."> readable, will now delete it")
@@@ -1422,18 -1380,34 +1380,34 @@@ endfu
  
  " ------------------------------------------------------------------------
  " s:NetrwMethod:  determine method of transfer {{{2
- "  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:NetrwMethod(choice)  " globals: method machine id passwd fname
+ " Input:
+ "   choice = url   [protocol:]//[userid@]hostname[:port]/[path-to-file]
+ " Output:
+ "  b:netrw_method= 1: rcp                                             
+ "                  2: ftp + <.netrc>                                  
+ "	           3: ftp + machine, id, password, and [path]filename 
+ "	           4: scp                                             
+ "	           5: http (wget)                                     
+ "	           6: dav
+ "	           7: rsync                                           
+ "	           8: fetch                                           
+ "	           9: sftp                                            
+ "  g:netrw_machine= hostname
+ "  b:netrw_fname  = filename
+ "  g:netrw_port   = optional port number (for ftp)
+ "  g:netrw_choice = copy of input url (choice)
+ fun! s:NetrwMethod(choice)
  "   call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
  
+    " record current g:netrw_machine, if any
+    " curmachine used if protocol == ftp and no .netrc
+    if exists("g:netrw_machine")
+     let curmachine= g:netrw_machine
+ "    call Decho("curmachine<".curmachine.">")
+    else
+     let curmachine= "N O T A HOST"
+    endif
+ 
    " initialization
    let b:netrw_method  = 0
    let g:netrw_machine = ""
@@@ -1449,7 -1423,7 +1423,7 @@@
    " rcphf    : [user@]host:filename		     Use rcp
    " scpurm   : scp://[user@]host[[#:]port]/filename  Use scp
    " httpurm  : http://[user@]host/filename	     Use wget
-   " davurm   : dav[s]://host[:port]/path             Use cadaver
+   " davurm   : dav[s]://host[:port]/path             Use cadaver/curl
    " 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
@@@ -1518,9 -1492,14 +1492,14 @@@
     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',"")
+ "   call Decho("g:netrw_machine<".g:netrw_machine.">")
     if userid != ""
      let g:netrw_uid= userid
     endif
+    if exists("s:netrw_passwd") && curmachine != g:netrw_machine
+     " if there's a change in hostname, require password re-entry
+     unlet s:netrw_passwd
+    endif
     if exists("g:netrw_uid") && exists("s:netrw_passwd")
      let b:netrw_method = 3
     else
@@@ -1592,7 -1571,7 +1571,7 @@@
  
    else
     if !exists("g:netrw_quiet")
-     call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
+     call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
     endif
     let b:netrw_method  = -1
    endif
@@@ -1626,10 -1605,24 +1605,24 @@@ endfu
  if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
   fun! NetReadFixup(method, line1, line2)
  "   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
+ 
+    " sanity checks -- attempt to convert inputs to integers
+    let method = a:method + 0
+    let line1  = a:line1 + 0
+    let line2  = a:line2 + 0
+    if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
+ "    call Dret("NetReadFixup")
+     return
+    endif
+ 
     if method == 3   " ftp (no <.netrc>)
      let fourblanklines= line2 - 3
-     silent fourblanklines.",".line2."g/^\s*/d"
+     if fourblanklines >= line1
+      exe "silent ".fourblanklines.",".line2."g/^\s*$/d"
+      call histdel("/",-1)
+     endif
     endif
+ 
  "   call Dret("NetReadFixup")
   endfun
  endif
@@@ -1678,7 -1671,7 +1671,7 @@@ fun! s:BrowserMaps(islocal
     nnoremap <buffer> <silent> <cr>	:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
     nnoremap <buffer> <silent> -		:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
     nnoremap <buffer> <silent> a		:call <SID>NetrwHide(1)<cr>
-    nnoremap <buffer> <silent> mb	:<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> mb	:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> mc	:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
     nnoremap <buffer> <silent> md	:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
     nnoremap <buffer> <silent> me	:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
@@@ -1694,7 -1687,7 +1687,7 @@@
     nnoremap <buffer> <silent> mu	:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
     nnoremap <buffer> <silent> mx	:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
     nnoremap <buffer> <silent> mz	:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
-    nnoremap <buffer> <silent> gb	:<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> gb	:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> gh	:<c-u>call <SID>NetrwHidden(1)<cr>
     nnoremap <buffer> <silent> c		:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> C		:let g:netrw_chgwin= winnr()<cr>
@@@ -1704,15 -1697,15 +1697,15 @@@
     nnoremap <buffer> <silent> O		:call <SID>NetrwObtain(1)<cr>
     nnoremap <buffer> <silent> p		:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
     nnoremap <buffer> <silent> P		:call <SID>NetrwPrevWinOpen(1)<cr>
-    nnoremap <buffer> <silent> qb	:<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
-    nnoremap <buffer> <silent> mB	:<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> qb	:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> mB	:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> qf	:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
     nnoremap <buffer> <silent> r		:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
     nnoremap <buffer> <silent> s		:call <SID>NetrwSortStyle(1)<cr>
     nnoremap <buffer> <silent> S		:call <SID>NetSortSequence(1)<cr>
     nnoremap <buffer> <silent> t		:call <SID>NetrwSplit(4)<cr>
-    nnoremap <buffer> <silent> u		:<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr>
-    nnoremap <buffer> <silent> U		:<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr>
+    nnoremap <buffer> <silent> u		:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
+    nnoremap <buffer> <silent> U		:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
     nnoremap <buffer> <silent> v		:call <SID>NetrwSplit(5)<cr>
     nnoremap <buffer> <silent> x		:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
     nnoremap <buffer> <silent> %		:call <SID>NetrwOpenFile(1)<cr>
@@@ -1754,7 -1747,7 +1747,7 @@@
     nnoremap <buffer> <silent> <c-l>	:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
     nnoremap <buffer> <silent> -		:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
     nnoremap <buffer> <silent> a		:call <SID>NetrwHide(0)<cr>
-    nnoremap <buffer> <silent> mb	:<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> mb	:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> mc	:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
     nnoremap <buffer> <silent> md	:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
     nnoremap <buffer> <silent> me	:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
@@@ -1770,7 -1763,7 +1763,7 @@@
     nnoremap <buffer> <silent> mu	:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
     nnoremap <buffer> <silent> mx	:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
     nnoremap <buffer> <silent> mz	:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
-    nnoremap <buffer> <silent> gb	:<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
+    nnoremap <buffer> <silent> gb	:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
     nnoremap <buffer> <silent> gh	:<c-u>call <SID>NetrwHidden(0)<cr>
     nnoremap <buffer> <silent> C		:let g:netrw_chgwin= winnr()<cr>
     nnoremap <buffer> <silent> i		:call <SID>NetrwListStyle(0)<cr>
@@@ -1778,15 -1771,15 +1771,15 @@@
     nnoremap <buffer> <silent> O		:call <SID>NetrwObtain(0)<cr>
     nnoremap <buffer> <silent> p		:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
     nnoremap <buffer> <silent> P		:call <SID>NetrwPrevWinOpen(0)<cr>
-    nnoremap <buffer> <silent> qb	:<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
-    nnoremap <buffer> <silent> mB	:<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> qb	:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> mB	:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> qf	:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
     nnoremap <buffer> <silent> r		:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
     nnoremap <buffer> <silent> s		:call <SID>NetrwSortStyle(0)<cr>
     nnoremap <buffer> <silent> S		:call <SID>NetSortSequence(0)<cr>
     nnoremap <buffer> <silent> t		:call <SID>NetrwSplit(1)<cr>
-    nnoremap <buffer> <silent> u		:<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr>
-    nnoremap <buffer> <silent> U		:<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> u		:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
+    nnoremap <buffer> <silent> U		:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
     nnoremap <buffer> <silent> v		:call <SID>NetrwSplit(2)<cr>
     nnoremap <buffer> <silent> x		:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
     nnoremap <buffer> <silent> %		:call <SID>NetrwOpenFile(0)<cr>
@@@ -1836,7 -1829,7 +1829,7 @@@ fun! s:ExplorePatHls(pattern
  endfun
  
  " ---------------------------------------------------------------------
- "  s:NetrwBookmarkDir: {{{2
+ "  s:NetrwBookHistHandler: {{{2
  "    0: (user: <mb>)   bookmark current directory
  "    1: (user: <gb>)   change to the bookmarked directory
  "    2: (user: <qb>)   list bookmarks
@@@ -1844,32 -1837,27 +1837,27 @@@
  "    4: (user: <u>)    go up   (previous) bookmark
  "    5: (user: <U>)    go down (next)     bookmark
  "    6: (user: <mB>)   delete bookmark
- fun! s:NetrwBookmarkDir(chg,curdir)
- "  call Dfunc("NetrwBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." bookmax=".g:NETRW_BOOKMARKMAX." histmax=".g:netrw_dirhistmax)
+ fun! s:NetrwBookHistHandler(chg,curdir)
+ "  call Dfunc("NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax)
  
    if a:chg == 0
     " bookmark the current directory
  "   call Decho("(user: <b>) bookmark the current directory")
-    if v:count > 0
-     " handle bookmark# specified via the count
-     let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
-     if !exists("g:NETRW_BOOKMARKMAX")
-      let g:NETRW_BOOKMARKMAX= v:count
-     elseif v:count > g:NETRW_BOOKMARKMAX
-      let g:NETRW_BOOKMARKMAX= v:count
-     endif
-    else
-     " handle no count specified
-     let g:NETRW_BOOKMARKMAX                       = g:NETRW_BOOKMARKMAX + 1
-     let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
+    if !exists("g:netrw_bookmarklist")
+     let g:netrw_bookmarklist= []
+    endif
+    if index(g:netrw_bookmarklist,a:curdir) == -1
+     " curdir not currently in g:netrw_bookmarklist, so include it
+     call add(g:netrw_bookmarklist,a:curdir)
+     call sort(g:netrw_bookmarklist)
     endif
     echo "bookmarked the current directory"
  
    elseif a:chg == 1
     " change to the bookmarked directory
- "   call Decho("(user: <B>) change to the bookmarked directory")
-    if exists("g:NETRW_BOOKMARKDIR_{v:count}")
-     exe "e ".fnameescape(g:NETRW_BOOKMARKDIR_{v:count})
+ "   call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
+    if exists("g:netrw_bookmarklist[v:count-1]")
+     exe "e ".fnameescape(g:netrw_bookmarklist[v:count-1])
     else
      echomsg "Sorry, bookmark#".v:count." doesn't exist!"
     endif
@@@ -1879,29 -1867,27 +1867,27 @@@
     let didwork= 0
     " list user's bookmarks
  "   call Decho("(user: <q>) list user's bookmarks")
-    if exists("g:NETRW_BOOKMARKMAX")
- "    call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
-     let cnt= 0
-     while cnt <= g:NETRW_BOOKMARKMAX
-      if exists("g:NETRW_BOOKMARKDIR_{cnt}")
- "      call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
-       echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
-       let didwork= 1
-      endif
-      let cnt= cnt + 1
-     endwhile
+    if exists("g:netrw_bookmarklist")
+ "    call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
+     let cnt= 1
+     for bmd in g:netrw_bookmarklist
+ "     call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
+      echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
+      let didwork = 1
+      let cnt     = cnt + 1
+     endfor
     endif
  
     " list directory history
-    let cnt     = g:NETRW_DIRHIST_CNT
+    let cnt     = g:netrw_dirhist_cnt
     let first   = 1
     let histcnt = 0
-    while ( first || cnt != g:NETRW_DIRHIST_CNT )
- "    call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
+    while ( first || cnt != g:netrw_dirhist_cnt )
+ "    call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
      let histcnt= histcnt + 1
-     if exists("g:NETRW_DIRHIST_{cnt}")
- "     call Decho("Netrw  History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
-      echo "Netrw  History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
+     if exists("g:netrw_dirhist_{cnt}")
+ "     call Decho("Netrw  History#".histcnt.": ".g:netrw_dirhist_{cnt})
+      echo "Netrw  History#".histcnt.": ".g:netrw_dirhist_{cnt}
       let didwork= 1
      endif
      let first = 0
@@@ -1917,22 -1903,21 +1903,21 @@@
    elseif a:chg == 3
     " saves most recently visited directories (when they differ)
  "   call Decho("(browsing) record curdir history")
-    if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
-     let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
- "    let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
-     let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
- "    call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
+    if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir
+     let g:netrw_dirhist_cnt                   = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
+     let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
+ "    call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
     endif
  
    elseif a:chg == 4
     " u: change to the previous directory stored on the history list
  "   call Decho("(user: <u>) chg to prev dir from history")
-    let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
-    if g:NETRW_DIRHIST_CNT < 0
-     let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
+    let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
+    if g:netrw_dirhist_cnt < 0
+     let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
     endif
-    if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
- "    call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
+    if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
+ "    call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
      if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
       setlocal ma noro
  "     call Decho("setlocal ma noro")
@@@ -1940,19 -1925,19 +1925,19 @@@
       setlocal nomod
  "     call Decho("setlocal nomod")
      endif
- "    "    call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
-     exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
+ "    "    call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
+     exe "e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
     else
-     let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
+     let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
      echo "Sorry, no predecessor directory exists yet"
     endif
  
    elseif a:chg == 5
     " U: change to the subsequent directory stored on the history list
  "   call Decho("(user: <U>) chg to next dir from history")
-    let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
-    if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
- "    call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
+    let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
+    if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
+ "    call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
      if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
       setlocal ma noro
  "     call Decho("setlocal ma noro")
@@@ -1961,57 -1946,108 +1946,108 @@@
       setlocal nomod
  "     call Decho("setlocal nomod")
      endif
- "    call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
-     exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
+ "    call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
+     exe "e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
     else
-     let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
-     if g:NETRW_DIRHIST_CNT < 0
-      let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
+     let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
+     if g:netrw_dirhist_cnt < 0
+      let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
      endif
      echo "Sorry, no successor directory exists yet"
     endif
  
    elseif a:chg == 6
-    if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
-     " delete the v:count'th bookmark
- "    call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
-     unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
-     let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
- 
-    elseif v:count > 0
- "    call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
-     let cnt= v:count
-     while cnt < g:NETRW_BOOKMARKMAX
-      let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
-      let cnt                       = cnt + 1
-     endwhile
-     unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
-     let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
+    " delete the v:count'th bookmark
+ "   call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
+    let savefile= s:NetrwHome()."/.netrwbook"
+    if filereadable(savefile)
+     call s:NetrwBookHistSave() " done here to merge bookmarks first
+     call delete(savefile)
+    endif
+    call remove(g:netrw_bookmarklist,v:count-1)
+   endif
+   call s:NetrwBookmarkMenu()
+ "  call Dret("NetrwBookHistHandler")
+ endfun
  
-    elseif exists("b:netrw_curdir")
-     " look for current directory amongst the bookmarks and remove that bookmark
- "    call Decho("search for bookmark<".b:netrw_curdir.">")
-     let cnt= 1
-     while cnt <= g:NETRW_BOOKMARKMAX
- "     call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
-      if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
-       if cnt < g:NETRW_BOOKMARKMAX
- "       call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
-        while cnt < g:NETRW_BOOKMARMAX
-         let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
-         let cnt                       = cnt + 1
-        endwhile
-       endif
-       unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
-       let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
+ " ---------------------------------------------------------------------
+ " s:NetrwBookHistRead: this function reads bookmarks and history {{{2
+ "                      Sister function: s:NetrwBookHistSave()
+ fun! s:NetrwBookHistRead()
+ "  call Dfunc("s:NetrwBookHistRead()")
+   if !exists("s:netrw_initbookhist")
+    let home    = s:NetrwHome()
+    let savefile= home."/.netrwbook"
+    if filereadable(savefile)
+ "    call Decho("sourcing .netrwbook")
+     exe "so ".savefile
+    endif
+    let savefile= home."/.netrwhist"
+    if filereadable(savefile)
+ "    call Decho("sourcing .netrwhist")
+     exe "so ".savefile
+    endif
+    let s:netrw_initbookhist= 1
+    au VimLeave * call s:NetrwBookHistSave()
+   endif
+ "  call Dret("s:NetrwBookHistRead")
+ endfun
+ 
+ " ---------------------------------------------------------------------
+ " s:NetrwBookHistSave: this function saves bookmarks and history {{{2
+ "                      Sister function: s:NetrwBookHistRead()
+ "                      I used to do this via viminfo but that appears to
+ "                      be unreliable for long-term storage
+ "                      COMBAK: does $HOME work under windows???
+ fun! s:NetrwBookHistSave()
+ "  call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
+   let savefile= s:NetrwHome()."/.netrwhist"
+   1split
+   call s:NetrwEnew()
+   setlocal cino= com= cpo-=aA fo=nroql2 tw=0 report=10000 noswf
+   setlocal nocin noai noci magic nospell nohid wig= noaw
+   setlocal ma noro write
+   if exists("&acd") | setlocal noacd | endif
+   silent %d
+ 
+   " save .netrwhist -- no attempt to merge
+   silent! file .netrwhist
+   call setline(1,"let g:netrw_dirhistmax  =".g:netrw_dirhistmax)
+   call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
+   let lastline = line("$")
+   let cnt      = 1
+   while cnt <= g:netrw_dirhist_cnt
+    call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
+    let cnt= cnt + 1
+   endwhile
+   exe "silent! w! ".savefile
+ 
+   silent %d
+   if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
+    " merge and write .netrwbook
+    let savefile= s:NetrwHome()."/.netrwbook"
+ 
+    if filereadable(savefile)
+     let booklist= deepcopy(g:netrw_bookmarklist)
+     exe "silent so ".savefile
+     for bdm in booklist
+      if index(g:netrw_bookmarklist,bdm) == -1
+       call add(g:netrw_bookmarklist,bdm)
       endif
-      let cnt= cnt + 1
-     endwhile
+     endfor
+     call sort(g:netrw_bookmarklist)
+     exe "silent! w! ".savefile
     endif
  
+    " construct and save .netrwbook
+    call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
+    exe "silent! w! ".savefile
    endif
-   call s:NetrwBookmarkMenu()
- "  call Dret("NetrwBookmarkDir")
+   let bgone= bufnr("%")
+   q!
+   exe bgone."bwipe!"
+ 
+ "  call Dret("s:NetrwBookHistSave")
  endfun
  
  " ---------------------------------------------------------------------
@@@ -2024,6 -2060,16 +2060,16 @@@ fun! s:NetrwBrowse(islocal,dirname
  "  call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
  "  call Decho("tab#".tabpagenr()." win#".winnr())
  "  call Dredir("ls!")
+   if !exists("s:netrw_initbookhist")
+    call s:NetrwBookHistRead()
+   endif
+ 
+   " simplify the dirname (especially for ".."s in dirnames)
+   if a:dirname !~ '^\a\+://'
+    let dirname= simplify(a:dirname)
+   else
+    let dirname= a:dirname
+   endif
  
    if exists("s:netrw_skipbrowse")
     unlet s:netrw_skipbrowse
@@@ -2043,7 -2089,6 +2089,6 @@@
    endif
  
    call s:NetrwOptionSave("w:")
-   call s:NetrwSafeOptions()
  
    " re-instate any marked files
    if exists("s:netrwmarkfilelist_{bufnr('%')}")
@@@ -2053,27 -2098,29 +2098,29 @@@
  
    if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
  "   call Decho("handle w:netrw_acdkeep:")
- "   call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
-    exe 'keepjumps lcd '.fnameescape(a:dirname)
+ "   call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
+    exe 'keepjumps lcd '.fnameescape(dirname)
+    call s:NetrwSafeOptions()
  "   call Decho("getcwd<".getcwd().">")
  
-   elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
+   elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
     " looks like a regular file, attempt transfer
- "   call Decho("attempt transfer as regular file<".a:dirname.">")
+ "   call Decho("attempt transfer as regular file<".dirname.">")
  
     " remove any filetype indicator from end of dirname, except for the {{{3
     " "this is a directory" indicator (/).
     " There shouldn't be one of those here, anyway.
-    let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
+    let path= substitute(dirname,'[*=@|]\r\=$','','e')
  "   call Decho("new path<".path.">")
-    call s:RemotePathAnalysis(a:dirname)
+    call s:RemotePathAnalysis(dirname)
  
     " remote-read the requested file into current buffer {{{3
     mark '
-    call s:NetrwEnew(a:dirname)
+    call s:NetrwEnew(dirname)
+    call s:NetrwSafeOptions()
     setlocal ma noro
  "   call Decho("setlocal ma noro")
-    let b:netrw_curdir= a:dirname
+    let b:netrw_curdir= dirname
  "   call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
     exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
     exe "silent keepalt doau BufReadPre ".fnameescape(s:fname)
@@@ -2098,7 -2145,7 +2145,7 @@@
  
    " set up some variables {{{3
    let b:netrw_browser_active = 1
-   let dirname                = a:dirname
+   let dirname                = dirname
    let s:last_sort_by         = g:netrw_sort_by
  
    " set up menu {{{3
@@@ -2183,11 -2230,11 +2230,11 @@@
    else
  "   call Decho("remote only:")
  
-    " analyze a:dirname and g:netrw_list_cmd {{{4
- "   call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
-    if a:dirname =~ "^NetrwTreeListing\>"
+    " analyze dirname and g:netrw_list_cmd {{{4
+ "   call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
+    if dirname =~ "^NetrwTreeListing\>"
      let dirname= b:netrw_curdir
- "    call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
+ "    call Decho("(dirname was ".dirname.") dirname<".dirname.">")
     elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
      let dirname= substitute(b:netrw_curdir,'\\','/','g')
      if dirname !~ '/$'
@@@ -2196,7 -2243,7 +2243,7 @@@
      let b:netrw_curdir = dirname
  "    call Decho("(liststyle is TREELIST) dirname<".dirname.">")
     else
-     let dirname = substitute(a:dirname,'\\','/','g')
+     let dirname = substitute(dirname,'\\','/','g')
  "    call Decho("(normal) dirname<".dirname.">")
     endif
  
@@@ -2221,6 -2268,14 +2268,14 @@@
    call s:BrowserMaps(a:islocal)
    call s:PerformListing(a:islocal)
  
+   " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
+   " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
+   " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
+   " the variable below avoids that second refresh of the screen.  The s:LocalBrowseShellCmdRefresh()
+   " function gets called due to that autocmd; it notices that the following variable is set
+   " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
+   let s:locbrowseshellcmd= 1
+ 
  "  call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
  "  call Dret("s:NetrwBrowse : did PerformListing")
    return
@@@ -2280,7 -2335,7 +2335,7 @@@ fun! s:NetrwGetBuffer(islocal,dirname
      set ei=all
      exe "b ".w:netrw_treebufnr
      let &ei= eikeep
- "    call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
+ "    call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
      return
     endif
     let bufnum= -1
@@@ -2446,7 -2501,7 +2501,7 @@@ endfu
  " ---------------------------------------------------------------------
  "  s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
  fun! s:NetrwGetWord()
 -"  call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
 +"  call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".w:netrw_col)
    call s:UseBufWinVars()
  
    " insure that w:netrw_liststyle is set up
@@@ -2510,12 -2565,13 +2565,13 @@@
     if !exists("b:netrw_cpf")
      let b:netrw_cpf= 0
      exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
+     call histdel("/",-1)
  "   call Decho("computed cpf=".b:netrw_cpf)
     endif
  
  "   call Decho("buf#".bufnr("%")."<".bufname("%").">")
 -   let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
 -"   call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart."  bannercnt=".w:netrw_bannercnt)
 +   let filestart = (w:netrw_col/b:netrw_cpf)*b:netrw_cpf
 +"   call Decho("filestart= ([virtcol=".w:netrw_col."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart."  bannercnt=".w:netrw_bannercnt)
  "   call Decho("1: dirname<".dirname.">")
     if filestart == 0
      norm! 0ma
@@@ -2621,6 -2677,22 +2677,22 @@@ fun! s:NetrwListStyle(islocal
    let svpos= netrw#NetrwSavePosn()
    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
    call netrw#NetrwRestorePosn(svpos)
+   if w:netrw_liststyle != s:WIDELIST
+    if g:netrw_cursorline == 2
+     setlocal cursorline
+     let &cursorcolumn= s:netrw_usercuc
+    elseif g:netrw_cursorline
+     setlocal cursorline
+ "    call Decho("setlocal cursorline")
+    endif
+   else
+    if g:netrw_cursorline == 2
+     setlocal cursorline cursorcolumn
+ "    call Decho("setlocal cursorline cursorcolumn")
+    elseif g:netrw_cursorline
+     let &cursorline= s:netrw_usercul
+    endif
+   endif
  
    " keep cursor on the filename
    silent keepjumps $
@@@ -2642,37 -2714,47 +2714,47 @@@ fun! s:NetrwBookmarkMenu(
    if !exists("s:netrw_menucnt")
     return
    endif
- "  call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
+ "  call Dfunc("NetrwBookmarkMenu()  histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
  
    " the following test assures that gvim is running, has menus available, and has menus enabled.
    if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
     if exists("g:NetrwTopLvlMenu")
  "    call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
      exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
+     exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
+    endif
+    if !exists("s:netrw_initbookhist")
+     call s:NetrwBookHistRead()
     endif
  
     " show bookmarked places
-    let cnt       = 1
-    while cnt <= g:NETRW_BOOKMARKMAX
-     if exists("g:NETRW_BOOKMARKDIR_{cnt}")
-      let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
- "     call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.'	:e '.bmdir)
-      exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.'	:e '.bmdir."\<cr>"
-     endif
-     let cnt= cnt + 1
-    endwhile
+    if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
+     let cnt= 1
+     for bmd in g:netrw_bookmarklist
+ "     call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.'	:e '.bmd)
+      let bmd= escape(bmd,'. ')
+ 
+      " show bookmarks for goto menu
+      exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.'	:e '.bmd."\<cr>"
+ 
+      " show bookmarks for deletion menu
+      exe 'silent! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.'	'.cnt."mB"
+      let cnt= cnt + 1
+     endfor
+ 
+    endif
  
     " show directory browsing history
-    let cnt     = g:NETRW_DIRHIST_CNT
+    let cnt     = g:netrw_dirhist_cnt
     let first   = 1
     let histcnt = 0
-    while ( first || cnt != g:NETRW_DIRHIST_CNT )
+    while ( first || cnt != g:netrw_dirhist_cnt )
      let histcnt  = histcnt + 1
-     let priority = g:NETRW_DIRHIST_CNT + histcnt
-     if exists("g:NETRW_DIRHIST_{cnt}")
-      let bmdir= escape(g:NETRW_DIRHIST_{cnt},'/&? ')
- "     call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.'	:e '.bmdir)
-      exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.'	:e '.bmdir."\<cr>"
+     let priority = g:netrw_dirhist_cnt + histcnt
+     if exists("g:netrw_dirhist_{cnt}")
+      let histdir= escape(g:netrw_dirhist_{cnt},'./&? ')
+ "     call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.'	:e '.histdir)
+      exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.'	:e '.histdir."\<cr>"
      endif
      let first = 0
      let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
@@@ -2680,6 -2762,7 +2762,7 @@@
       let cnt= cnt + g:netrw_dirhistmax
      endif
     endwhile
+ 
    endif
  "  call Dret("NetrwBookmarkMenu")
  endfun
@@@ -2737,6 -2820,7 +2820,7 @@@ fun! s:NetrwBrowseChgDir(islocal,newdir
      else
       let dirname= s:NetrwTreeDir()."/".newdir
      endif
+ "    call Decho("dirname<".dirname.">")
  "    call Decho("tree listing")
     elseif newdir =~ '^\(/\|\a:\)'
      let dirname= newdir
@@@ -2782,6 -2866,9 +2866,9 @@@
      endif
      let dolockout= 1
     endif
+    if exists("g:Netrw_funcref")
+     call g:Netrw_funcref()
+    endif
  
    elseif newdir =~ '^/'
     " ---------------------------------
@@@ -2887,15 -2974,16 +2974,16 @@@
      " close tree listing for selected subdirectory
  "    call Decho("closing selected subdirectory<".dirname.">")
      call remove(w:netrw_treedict,treedir)
- "    call Decho("removed     entry<".dirname."> from treedict")
+ "    call Decho("removed     entry<".treedir."> from treedict")
  "    call Decho("yielding treedict<".string(w:netrw_treedict).">")
-     let dirname= w:netrw_treetop
+     let dirname           = w:netrw_treetop
     else
      " go down one directory
      let dirname= substitute(treedir,'/*$','/','')
  "    call Decho("go down one dir: treedir<".treedir.">")
     endif
     call s:SetRexDir(a:islocal,dirname)
+    let s:treeforceredraw = 1
  
    else
     " go down one directory
@@@ -2927,6 -3015,7 +3015,7 @@@ fun! netrw#NetrwBrowseX(fname,remote
    if has("win32") || has("win95") || has("win64") || has("win16")
     let exten= substitute(exten,'^.*$','\L&\E','')
    endif
+ "  call Decho("exten<".exten.">")
  
    " seems kde systems often have gnome-open due to dependencies, even though
    " gnome-open's subsidiary display tools are largely absent.  Kde systems
@@@ -2945,16 -3034,25 +3034,25 @@@
  
    if a:remote == 1
     " create a local copy
-    let fname= fnamemodify(tempname(),":r").".".exten
- "   call Decho("a:remote=".a:remote.": create a local copy of <".fname."> as <".fname.">")
-    exe "silent keepjumps bot 1new ".fnameescape(fname)
+ "   call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
     setlocal bh=delete
- "   call Decho("read <".fnameescape(fname).">, now writing: exe w! ".fnameescape(fname))
-    exe "silent! w! ".fnameescape(fname)
-    q
+    call netrw#NetRead(3,a:fname)
+    " attempt to rename tempfile
+    let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
+    let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
+ "   call Decho("basename<".basename.">")
+ "   call Decho("newname <".newname.">")
+    if rename(s:netrw_tmpfile,newname) == 0
+     " renaming succeeded
+     let fname= newname
+    else
+     " renaming failed
+     let fname= s:netrw_tmpfile
+    endif
    else
     let fname= a:fname
    endif
+ "  call Decho("fname<".fname.">")
  "  call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
  
    " set up redirection
@@@ -3061,10 -3159,21 +3159,21 @@@ endfu
  
  " ---------------------------------------------------------------------
  " netrw#Explore: launch the local browser in the directory of the current file {{{2
- "          dosplit==0: the window will be split iff the current file has
- "                      been modified
- "          dosplit==1: the window will be split before running the local
- "                      browser
+ "          indx:  == -1: Nexplore
+ "                 == -2: Pexplore
+ "                 ==  +: this is overloaded:
+ "                      * If Nexplore/Pexplore is in use, then this refers to the
+ "                        indx'th item in the w:netrw_explore_list[] of items which
+ "                        matched the */pattern **/pattern *//pattern **//pattern
+ "                      * If Hexplore or Vexplore, then this will override
+ "                        g:netrw_winsize to specify the qty of rows or columns the
+ "                        newly split window should have.
+ "          dosplit==0: the window will be split iff the current file has been modified
+ "          dosplit==1: the window will be split before running the local browser
+ "          style == 0: Explore     style == 1: Explore!
+ "                == 2: Hexplore    style == 3: Hexplore!
+ "                == 4: Vexplore    style == 5: Vexplore!
+ "                == 6: Texplore
  fun! netrw#Explore(indx,dosplit,style,...)
  "  call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0)
    if !exists("b:netrw_curdir")
@@@ -3083,30 -3192,34 +3192,34 @@@
    if a:dosplit || &modified || a:style == 6
  "   call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
     call s:SaveWinVars()
+    let winsize= g:netrw_winsize
+    if a:indx > 0
+     let winsize= a:indx
+    endif
  
     if a:style == 0      " Explore, Sexplore
  "    call Decho("style=0: Explore or Sexplore")
-     exe g:netrw_winsize."wincmd s"
+     exe winsize."wincmd s"
  
     elseif a:style == 1  "Explore!, Sexplore!
  "    call Decho("style=1: Explore! or Sexplore!")
-     exe g:netrw_winsize."wincmd v"
+     exe winsize."wincmd v"
  
     elseif a:style == 2  " Hexplore
  "    call Decho("style=2: Hexplore")
-     exe "bel ".g:netrw_winsize."wincmd s"
+     exe "bel ".winsize."wincmd s"
  
     elseif a:style == 3  " Hexplore!
  "    call Decho("style=3: Hexplore!")
-     exe "abo ".g:netrw_winsize."wincmd s"
+     exe "abo ".winsize."wincmd s"
  
     elseif a:style == 4  " Vexplore
  "    call Decho("style=4: Vexplore")
-     exe "lefta ".g:netrw_winsize."wincmd v"
+     exe "lefta ".winsize."wincmd v"
  
     elseif a:style == 5  " Vexplore!
  "    call Decho("style=5: Vexplore!")
-     exe "rightb ".g:netrw_winsize."wincmd v"
+     exe "rightb ".winsize."wincmd v"
  
     elseif a:style == 6  " Texplore
      call s:SaveBufVars()
@@@ -3137,19 -3250,7 +3250,7 @@@
     endif
    else
     " clear explore
- "   call Decho("clearing explore variables")
-    2match none
-    if exists("s:explore_match")        |unlet s:explore_match        |endif
-    if exists("s:explore_indx")         |unlet s:explore_indx         |endif
-    if exists("s:dirstarstar")          |unlet s:dirstarstar          |endif
-    if exists("s:dirstarstar")          |unlet s:dirstarstar          |endif
-    if exists("w:netrw_explore_indx")   |unlet w:netrw_explore_indx   |endif
-    if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
-    if exists("w:netrw_explore_list")   |unlet w:netrw_explore_list   |endif
-    if exists("w:netrw_explore_bufnr")  |unlet w:netrw_explore_bufnr  |endif
- "   redraw!
-    echo " "
-    echo " "
+    call s:NetrwClearExplore()
  "   call Dret("netrw#Explore : cleared list")
     return
    endif
@@@ -3237,9 -3338,10 +3338,10 @@@
      if !exists("w:netrw_explore_indx")
       let w:netrw_explore_indx= 0
      endif
+ 
      let indx = a:indx
  "    call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
- "
+ 
      if indx == -1
       " Nexplore
  "     call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
@@@ -3290,6 -3392,7 +3392,7 @@@
       " Explore -- initialize
       " build list of files to Explore with Nexplore/Pexplore
  "     call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
+      call s:NetrwClearExplore()
       let w:netrw_explore_indx= 0
       if !exists("b:netrw_curdir")
        let b:netrw_curdir= getcwd()
@@@ -3300,8 -3403,9 +3403,9 @@@
       if starpat == 1
        " starpat=1: Explore *//pattern  (current directory only search for files containing pattern)
  "      call Decho("starpat=".starpat.": build *//pattern list")
+ "      call Decho("pattern<".pattern.">")
        exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
-       let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
+       let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
        if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
  
       elseif starpat == 2
@@@ -3320,19 -3424,22 +3424,22 @@@
        endtry
        let s:netrw_curdir       = b:netrw_curdir
        let w:netrw_explore_list = getqflist()
-       let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
+       let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
  
       elseif starpat == 3
        " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
  "      call Decho("starpat=".starpat.": build */filepat list")
-       let dirname             = substitute(dirname,'^\*/','','')
-       let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
-       if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
+       let filepat= substitute(dirname,'^\*/','','')
+       let filepat= substitute(filepat,'^[%#<]','\\&','')
+ "      call Decho("b:netrw_curdir<".b:netrw_curdir.">")
+ "      call Decho("filepat<".filepat.">")
+       let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
+       if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
  
       elseif starpat == 4
        " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
  "      call Decho("starpat=".starpat.": build **/filepat list")
-       let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
+       let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
        if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
       endif " switch on starpat to build w:netrw_explore_list
  
@@@ -3352,7 -3459,7 +3459,7 @@@
  
      " NetrwStatusLine support - for exploring support
      let w:netrw_explore_indx= indx
- "    call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
+ "    call Decho("w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
  
      " wrap the indx around, but issue a note
      if indx >= w:netrw_explore_listlen || indx < 0
@@@ -3360,7 -3467,6 +3467,6 @@@
       let indx                = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
       let w:netrw_explore_indx= indx
       call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
-      sleep 1
      endif
  
      exe "let dirfile= w:netrw_explore_list[".indx."]"
@@@ -3411,12 -3517,16 +3517,16 @@@
    endif
  
    " visual display of **/ **// */ Exploration files
+ "  call Decho("w:netrw_explore_indx=".w:netrw_explore_indx)
+ "  call Decho("b:netrw_curdir<".b:netrw_curdir.">")
    if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
+ "   call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
     if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
      " only update match list if current directory isn't the same as before
+ "    call Decho("only update match list if current directory not the same as before")
      let s:explore_prvdir = b:netrw_curdir
      let s:explore_match  = ""
-     let dirlen           = strlen(b:netrw_curdir)
+     let dirlen           = s:Strlen(b:netrw_curdir)
      if b:netrw_curdir !~ '/$'
       let dirlen= dirlen + 1
      endif
@@@ -3425,15 -3535,15 +3535,15 @@@
  "     call Decho("fname<".fname.">")
       if fname =~ '^'.b:netrw_curdir
        if s:explore_match == ""
-        let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
+        let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
        else
-        let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
+        let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
        endif
       elseif fname !~ '^/' && fname != prvfname
        if s:explore_match == ""
-        let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
+        let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
        else
-        let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
+        let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
        endif
       endif
       let prvfname= fname
@@@ -3457,6 -3567,44 +3567,44 @@@
  endfun
  
  " ---------------------------------------------------------------------
+ " s:NetrwClearExplore: clear explore variables (if any) {{{2
+ fun! s:NetrwClearExplore()
+ "  call Dfunc("s:NetrwClearExplore()")
+   2match none
+   if exists("s:explore_match")        |unlet s:explore_match        |endif
+   if exists("s:explore_indx")         |unlet s:explore_indx         |endif
+   if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
+   if exists("s:dirstarstar")          |unlet s:dirstarstar          |endif
+   if exists("s:explore_prvdir")       |unlet s:explore_prvdir       |endif
+   if exists("w:netrw_explore_indx")   |unlet w:netrw_explore_indx   |endif
+   if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
+   if exists("w:netrw_explore_list")   |unlet w:netrw_explore_list   |endif
+   if exists("w:netrw_explore_bufnr")  |unlet w:netrw_explore_bufnr  |endif
+ "   redraw!
+   echo " "
+   echo " "
+ "  call Dret("s:NetrwClearExplore")
+ endfun
+ 
+ " ---------------------------------------------------------------------
+ " s:NetrwExploreListUniq: {{{2
+ fun! s:NetrwExploreListUniq(explist)
+ "  call Dfunc("s:NetrwExploreListUniq(explist)")
+ 
+   " this assumes that the list is already sorted
+   let newexplist= []
+   for member in a:explist
+    if !exists("uniqmember") || member != uniqmember
+     let uniqmember = member
+     let newexplist = newexplist + [ member ]
+    endif
+   endfor
+ 
+ "  call Dret("s:NetrwExploreListUniq")
+   return newexplist
+ endfun
+ 
+ " ---------------------------------------------------------------------
  " s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
  "          and switches the hiding mode.  The actual hiding is done by
  "          s:NetrwListHide().
@@@ -3490,9 -3638,7 +3638,7 @@@ fun! s:NetrwHide(islocal
  "     call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
      endif
     endfor
-    unlet s:netrwmarkfilelist_{bufnr("%")}
-    unlet s:netrwmarkfilemtch_{bufnr("%")}
-    2match none
+    call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
     let g:netrw_hide= 1
  
    else
@@@ -3522,7 -3668,7 +3668,7 @@@ fun! s:NetrwHidden(islocal
    if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
     " remove pattern from hiding list
     let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
-   elseif strlen(g:netrw_list_hide) >= 1
+   elseif s:Strlen(g:netrw_list_hide) >= 1
     let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
    else
     let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
@@@ -3535,6 -3681,48 +3681,48 @@@
  endfun
  
  " ---------------------------------------------------------------------
+ "  s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
+ fun! s:NetrwHome()
+ "  call Dfunc("s:NetrwHome()")
+   if exists("g:netrw_home")
+    let home= g:netrw_home
+   else
+    " go to vim plugin home
+    for home in split(&rtp,',') + ['']
+     if isdirectory(home) && filewritable(home) | break | endif
+      let basehome= substitute(home,'[/\\]\.vim$','','')
+     if isdirectory(basehome) && filewritable(basehome)
+      let home= basehome."/.vim"
+      break
+     endif
+    endfor
+    if home == ""
+     " just pick the first directory
+ "    call Decho("just pick first directory in &rtp")
+     let home= substitute(&rtp,',.*$','','')
+    endif
+    if (has("win32") || has("win95") || has("win64") || has("win16"))
+     let home= substitute(home,'/','\\','g')
+    endif
+   endif
+   " insure that the home directory exists
+ "  call Decho("picked home<".home.">")
+   if !isdirectory(home)
+    if exists("g:netrw_mkdir")
+ "    call Decho("home<".home."> isn't a directory -- making it now with g:netrw_mkdir<".g:netrw_mkdir.">")
+ "    call Decho("system(".g:netrw_mkdir." ".s:Escape(home).")")
+     call system(g:netrw_mkdir." ".s:Escape(home))
+    else
+ "    call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
+     call mkdir(home)
+    endif
+   endif
+   let g:netrw_home= home
+ "  call Dret("s:NetrwHome <".home.">")
+   return home
+ endfun
+ 
+ " ---------------------------------------------------------------------
  " s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
  fun! s:NetrwLeftmouse(islocal)
  "  call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
@@@ -3767,7 -3955,7 +3955,7 @@@ fun! s:NetrwMarkFile(islocal,fname
      call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
      if s:netrwmarkfilelist_{curbufnr} == []
       " local markfilelist is empty; remove it entirely
- "     call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
+ "     call Decho("markfile list now empty")
       call s:NetrwUnmarkList(curbufnr,curdir)
      else
       " rebuild match list to display markings correctly
@@@ -3982,7 -4170,9 +4170,9 @@@ fun! s:NetrwMarkFileCopy(islocal
    if a:islocal
     call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
    endif
-   call s:LocalBrowseShellCmdRefresh()
+   if g:netrw_fastbrowse <= 1
+    call s:LocalBrowseShellCmdRefresh()
+   endif
    
  "  call Dret("s:NetrwMarkFileCopy 1")
    return 1
@@@ -4290,7 -4480,9 +4480,9 @@@ fun! s:NetrwMarkFileMove(islocal
    if a:islocal
     call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
    endif
-   call s:LocalBrowseShellCmdRefresh()
+   if g:netrw_fastbrowse <= 1
+    call s:LocalBrowseShellCmdRefresh()
+   endif
    
  "  call Dret("s:NetrwMarkFileMove")
  endfun
@@@ -4371,7 -4563,8 +4563,8 @@@ fun! s:NetrwMarkFileRegexp(islocal
     set ei=all ma
  "   call Decho("set ei=all ma")
     1split
-    enew
+    call s:NetrwEnew()
+    call s:NetrwSafeOptions()
     silent norm! "ap
     2
     let bannercnt= search('^" =====','W')
@@@ -4379,16 -4572,21 +4572,21 @@@
     set bt=nofile
     if     g:netrw_liststyle == s:LONGLIST
      silent %s/\s\{2,}\S.*$//e
+     call histdel("/",-1)
     elseif g:netrw_liststyle == s:WIDELIST
      silent %s/\s\{2,}/\r/ge
+     call histdel("/",-1)
     elseif g:netrw_liststyle == s:TREELIST
      silent %s/^| //e
      silent! g/^ .*$/d
+     call histdel("/",-1)
+     call histdel("/",-1)
     endif
     " convert regexp into the more usual glob-style format
     let regexp= substitute(regexp,'\*','.*','g')
  "   call Decho("regexp<".regexp.">")
     exe "silent! v/".escape(regexp,'/')."/d"
+    call histdel("/",-1)
     let filelist= getline(1,line("$"))
     q!
     for filename in filelist
@@@ -4459,6 -4657,7 +4657,7 @@@ fun! s:NetrwMarkFileTag(islocal
      let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
  "    call Decho("curdir<".curdir."> path<".path.">")
      exe '%s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
+     call histdel("/",-1)
      wq!
     endif
     2match none
@@@ -4518,7 -4717,7 +4717,7 @@@ fun! s:NetrwMarkFileTgt(islocal
    endif
    let s:netrwmftgt_islocal= a:islocal
  
-   if g:netrw_fastbrowse > 0
+   if g:netrw_fastbrowse <= 1
     call s:LocalBrowseShellCmdRefresh()
    endif
    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
@@@ -4653,20 -4852,17 +4852,17 @@@ fun! s:NetrwMenu(domenu
  "    call Decho("initialize menu")
      let s:netrw_menu_enabled= 1
      exe 'silent! menu '.g:NetrwMenuPriority.'.1     '.g:NetrwTopLvlMenu.'Help<tab><F1>	<F1>'
-     call s:NetrwBookmarkMenu() " provide some history!  uses priorities 2,3, reserves 4
      exe 'silent! menu '.g:NetrwMenuPriority.'.5     '.g:NetrwTopLvlMenu.'-Sep1-	:'
      exe 'silent! menu '.g:NetrwMenuPriority.'.6     '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>-	-'
      exe 'silent! menu '.g:NetrwMenuPriority.'.7     '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x	x'
      exe 'silent! menu '.g:NetrwMenuPriority.'.8.1   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb	mb'
      exe 'silent! menu '.g:NetrwMenuPriority.'.8.4   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u	u'
      exe 'silent! menu '.g:NetrwMenuPriority.'.8.5   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U	U'
      exe 'silent! menu '.g:NetrwMenuPriority.'.8.6   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb	qb'
-     exe 'silent! menu '.g:NetrwMenuPriority.'.9.1   '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h>	\<Plug>NetrwHideEdit"
+     exe 'silent! menu '.g:NetrwMenuPriority.'.9.1   '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'."	\<c-h>'"
      exe 'silent! menu '.g:NetrwMenuPriority.'.9.2   '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S	S'
      exe 'silent! menu '.g:NetrwMenuPriority.'.9.3   '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh	gh"
-     exe 'silent! menu '.g:NetrwMenuPriority.'.9.4   '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l>	\<Plug>NetrwRefresh"
+     exe 'silent! menu '.g:NetrwMenuPriority.'.9.4   '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l>	\<c-l>"
      exe 'silent! menu '.g:NetrwMenuPriority.'.9.5   '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings	'.":NetrwSettings\<cr>"
      exe 'silent! menu '.g:NetrwMenuPriority.'.10    '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D	D'
      exe 'silent! menu '.g:NetrwMenuPriority.'.11.1  '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr>	'."\<cr>"
@@@ -4704,6 -4900,7 +4900,7 @@@
      exe 'silent! menu '.g:NetrwMenuPriority.'.16.4  '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s	s'
      exe 'silent! menu '.g:NetrwMenuPriority.'.17    '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R	R'
      exe 'silent! menu '.g:NetrwMenuPriority.'.18    '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c	c'
+     call s:NetrwBookmarkMenu() " provide some history!  uses priorities 2,3, reserves 4, 8.2.x
      let s:netrw_menucnt= 28
  
     elseif !a:domenu
@@@ -4731,8 -4928,8 +4928,8 @@@ fun! s:NetrwObtain(islocal
  "  call Dfunc("NetrwObtain(islocal=".a:islocal.")")
  
    if exists("s:netrwmarkfilelist_{bufnr('%')}")
-    let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
-    call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
+    let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
+    call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
     call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
    else
     call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
@@@ -4769,7 -4966,7 +4966,7 @@@ fun! netrw#NetrwObtain(islocal,fname,..
    endif
  "  call Decho("tgtdir<".tgtdir.">")
  
-   if b:netrw_islocal
+   if exists("b:netrw_islocal") && b:netrw_islocal
     " obtain a file from local b:netrw_curdir to (local) tgtdir
  "   call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
     if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
@@@ -4921,6 -5118,14 +5118,14 @@@
        call netrw#ErrorMsg(s:ERROR,getline(1),5)
       endif
      endif
+    elseif !exists("b:netrw_method") || b:netrw_method < 0
+ "    call Dfunc("netrw#NetrwObtain : unsupported method")
+     return
+    endif
+ 
+    " restore status line
+    if type(a:fname) == 1 && exists("s:netrw_users_stl")
+     call s:SetupNetrwStatusLine(s:netrw_users_stl)
     endif
  
    endif
@@@ -5138,6 -5343,7 +5343,7 @@@ fun! s:NetrwUpload(fname,tgt,...
       endif
       " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
       silent g/Local directory now/d
+      call histdel("/",-1)
       if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
        call netrw#ErrorMsg(s:ERROR,getline(1),14)
       else
@@@ -5196,6 -5402,7 +5402,7 @@@
       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
       " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
       silent g/Local directory now/d
+      call histdel("/",-1)
       if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
        let debugkeep= &debug
        setlocal debug=msg
@@@ -5205,6 -5412,9 +5412,9 @@@
       else
        bw!|q
       endif
+     elseif !exists("b:netrw_method") || b:netrw_method < 0
+ "     call Dfunc("netrw#NetrwUpload : unsupported method")
+      return
      endif
     else
      call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
@@@ -5325,13 -5535,12 +5535,12 @@@ fun! s:NetrwSetSort(
      let seq     = seqlist
      let seqlist = ""
     endif
-    let sepchr= "\<Char-0xff>"
     if priority < 10
-     let spriority= "00".priority.sepchr
+     let spriority= "00".priority.g:netrw_sepchr
     elseif priority < 100
-     let spriority= "0".priority.sepchr
+     let spriority= "0".priority.g:netrw_sepchr
     else
-     let spriority= priority.sepchr
+     let spriority= priority.g:netrw_sepchr
     endif
  "   call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
  
@@@ -5345,14 -5554,17 +5554,17 @@@
      let starpriority= spriority
     else
      exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
+     call histdel("/",-1)
      " sometimes multiple sorting patterns will match the same file or directory.
      " The following substitute is intended to remove the excess matches.
-     exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e'
+     exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
+     call histdel("/",-1)
     endif
     let priority = priority + 1
    endwhile
    if exists("starpriority")
-    exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/'
+    exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
+    call histdel("/",-1)
    endif
  
    " Following line associated with priority -- items that satisfy a priority
@@@ -5361,7 -5573,8 +5573,8 @@@
    " priority pattern needs to be retained.  So, at this point, these excess
    " priority prefixes need to be removed, but not directories that happen to
    " be just digits themselves.
-   exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e'
+   exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
+   call histdel("/",-1)
  
  "  call Dret("SetSort")
  endfun
@@@ -5405,12 -5618,12 +5618,12 @@@ fun! s:NetrwSplit(mode
  
    elseif a:mode == 1
     " remote and t
-    let cursorword  = s:NetrwGetWord()
+    let newdir  = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
  "   call Decho("tabnew")
     tabnew
     let s:didsplit= 1
     call s:RestoreWinVars()
-    call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword))
+    call s:NetrwBrowse(0,newdir)
     unlet s:didsplit
  
    elseif a:mode == 2
@@@ -5433,8 -5646,8 +5646,8 @@@
  
    elseif a:mode == 4
     " local and t
-    let netrw_curdir= b:netrw_curdir
     let cursorword  = s:NetrwGetWord()
+    let netrw_curdir= s:NetrwTreeDir()
  "   call Decho("tabnew")
     tabnew
     let b:netrw_curdir= netrw_curdir
@@@ -5505,12 -5718,13 +5718,13 @@@ fun! s:NetrwTreeDir(
    if w:netrw_liststyle == s:TREELIST
  "   call Decho("w:netrrw_liststyle is TREELIST:")
  "   call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
+ 
+    " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
     if getline('.') =~ '/$'
      let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
     else
      let treedir= ""
     endif
- 
  "   call Decho("treedir<".treedir.">")
  
     " detect user attempting to close treeroot
@@@ -5525,11 -5739,11 +5739,11 @@@
  
     " elide all non-depth information
     let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
- "   call Decho("depth<".depth."> 1st subst")
+ "   call Decho("depth<".depth."> 1st subst (non-depth info removed)")
  
     " elide first depth
     let depth = substitute(depth,'^| ','','')
- "   call Decho("depth<".depth."> 2nd subst")
+ "   call Decho("depth<".depth."> 2nd subst (first depth removed)")
  
     " construct treedir by searching backwards at correct depth
  "   call Decho("constructing treedir<".treedir."> depth<".depth.">")
@@@ -5548,11 -5762,6 +5762,6 @@@
    endif
    let treedir= substitute(treedir,'//$','/','')
  
- "  " now force a refresh
- "" call DECHO("clear buffer<".expand("%")."> with :%d")
- "  setlocal ma noro
- "  keepjumps %d
- 
  "  call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
    return treedir
  endfun
@@@ -5663,30 -5872,32 +5872,32 @@@ fun! s:NetrwWideListing(
    if w:netrw_liststyle == s:WIDELIST
  "   call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
     " look for longest filename (cpf=characters per filename)
-    " cpf: characters per file
-    " fpl: files per line
-    " fpc: files per column
+    " cpf: characters per filename
+    " fpl: filenames per line
+    " fpc: filenames per column
     setlocal ma noro
  "   call Decho("setlocal ma noro")
     let b:netrw_cpf= 0
     if line("$") >= w:netrw_bannercnt
      exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
+     call histdel("/",-1)
     else
  "    call Dret("NetrwWideListing")
      return
     endif
- "   call Decho("max file strlen+1=".b:netrw_cpf)
-    let b:netrw_cpf= b:netrw_cpf + 1
+    let b:netrw_cpf= b:netrw_cpf + 2
+ "   call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
  
     " determine qty files per line (fpl)
     let w:netrw_fpl= winwidth(0)/b:netrw_cpf
     if w:netrw_fpl <= 0
      let w:netrw_fpl= 1
     endif
- "   call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
+ "   call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
  
     " make wide display
     exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
+    call histdel("/",-1)
     let fpc         = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
     let newcolstart = w:netrw_bannercnt + fpc
     let newcolend   = newcolstart + fpc - 1
@@@ -5706,6 -5917,7 +5917,7 @@@
     endwhile
     silent! let @*= keepregstar
     exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
+    call histdel("/",-1)
     setlocal noma nomod ro
  "   call Dret("NetrwWideListing")
    endif
@@@ -5733,7 -5945,7 +5945,7 @@@ fun! s:PerformListing(islocal
    endif
  
    " save current directory on directory history list
-   call s:NetrwBookmarkDir(3,b:netrw_curdir)
+   call s:NetrwBookHistHandler(3,b:netrw_curdir)
  
    " Set up the banner {{{3
  "  call Decho("set up banner")
@@@ -5844,8 -6056,8 +6056,8 @@@
       endif
       " remove priority pattern prefix
  "     call Decho("remove priority pattern prefix")
-      let sepchr= "\<Char-0xff>"
-      exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e'
+      exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
+      call histdel("/",-1)
  
      elseif a:islocal
       if w:netrw_bannercnt < line("$")
@@@ -5857,13 -6069,17 +6069,17 @@@
  "       call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
         exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
        endif
-      endif
       exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
+      call histdel("/",-1)
+      endif
      endif
  
     elseif g:netrw_sort_direction =~ 'r'
  "    call Decho('reverse the sorted listing')
-     exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
+     if w:netrw_bannercnt < line('$')
+      exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
+      call histdel("/",-1)
+     endif
     endif
    endif
  
@@@ -6006,8 -6222,10 +6222,10 @@@ fun! s:NetrwRemoteListing(
      " cleanup
      if g:netrw_ftp_browse_reject != ""
       exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
+      call histdel("/",-1)
      endif
      silent! keepjumps %s/\r$//e
+     call histdel("/",-1)
  
      " if there's no ../ listed, then put ./ and ../ in
      let line1= line(".")
@@@ -6025,11 -6243,15 +6243,15 @@@
      if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
  "     call Decho("M$ ftp cleanup")
       exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
+      call histdel("/",-1)
      else " normal ftp cleanup
  "     call Decho("normal ftp cleanup")
       exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
       exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
       exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
+      call histdel("/",-1)
+      call histdel("/",-1)
+      call histdel("/",-1)
      endif
     endif
  
@@@ -6045,8 -6267,12 +6267,12 @@@
      g/^Listing directory/d
      g/^d[-rwx][-rwx][-rwx]/s+$+/+e
      silent g/^l[-rwx][-rwx][-rwx]/s+$+ at +e
+     call histdel("/",-1)
+     call histdel("/",-1)
+     call histdel("/",-1)
      if g:netrw_liststyle != s:LONGLIST
       g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e
+      call histdel("/",-1)
      endif
     else
      if s:path == ""
@@@ -6063,6 -6289,7 +6289,7 @@@
     if g:netrw_ftp_browse_reject != ""
  "    call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
      exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
+     call histdel("/",-1)
     endif
    endif
  
@@@ -6099,6 -6326,9 +6326,9 @@@
      exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
      exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
      exe 'silent keepjumps '.w:netrw_bannercnt
+     call histdel("/",-1)
+     call histdel("/",-1)
+     call histdel("/",-1)
     endif
    endif
  
@@@ -6118,6 -6348,7 +6348,7 @@@ fun! s:NetrwRemoteRm(usrhost,path) rang
    let all= 0
    if exists("s:netrwmarkfilelist_{bufnr('%')}")
     " remove all marked files
+ "   call Decho("remove all marked files with bufnr#".bufnr("%"))
     for fname in s:netrwmarkfilelist_{bufnr("%")}
      let ok= s:NetrwRemoteRmFile(a:path,fname,all)
      if ok =~ 'q\%[uit]'
@@@ -6126,12 -6357,11 +6357,11 @@@
       let all= 1
      endif
     endfor
-    unlet s:netrwmarkfilelist_{bufnr("%")}
-    unlet s:netrwmarkfilemtch_{bufnr("%")}
-    2match none
+    call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
  
    else
     " remove files specified by range
+ "   call Decho("remove files specified by range")
  
     " preparation for removing multiple files/directories
     let ctr= a:firstline
@@@ -6353,13 -6583,17 +6583,17 @@@ fun! s:NetrwRemoteFtpCmd(path,listcmd
    " cleanup for Windows
    if has("win32") || has("win95") || has("win64") || has("win16")
     silent! keepjumps %s/\r$//e
+    call histdel("/",-1)
    endif
    if a:listcmd == "dir"
     " infer directory/link based on the file permission string
     silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
     silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
+    call histdel("/",-1)
+    call histdel("/",-1)
     if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
      exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
+     call histdel("/",-1)
     endif
    endif
  
@@@ -6466,13 -6700,16 +6700,16 @@@ fun! netrw#LocalBrowseCheck(dirname
    " The &ft == "netrw" test was installed because the BufEnter event
    " would hit when re-entering netrw windows, creating unexpected
    " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
- "  call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname))
+ "  call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
    if isdirectory(a:dirname)
  "   call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
     if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
      silent! call s:NetrwBrowse(1,a:dirname)
     elseif &ft == "netrw" && line("$") == 1
      silent! call s:NetrwBrowse(1,a:dirname)
+    elseif exists("s:treeforceredraw")
+     unlet s:treeforceredraw
+     silent! call s:NetrwBrowse(1,a:dirname)
     endif
    endif
    " not a directory, ignore it
@@@ -6492,7 -6729,7 +6729,7 @@@ fun! s:LocalListing(
  
    " get the list of files contained in the current directory
    let dirname    = escape(b:netrw_curdir,g:netrw_glob_escape)
-   let dirnamelen = strlen(b:netrw_curdir)
+   let dirnamelen = s:Strlen(b:netrw_curdir)
    let filelist   = glob(s:ComposePath(dirname,"*"))
  "  call Decho("glob(dirname<".dirname."/*>)=".filelist)
    if filelist != ""
@@@ -6608,7 -6845,7 +6845,7 @@@
  
     if w:netrw_liststyle == s:LONGLIST
      let sz   = getfsize(filename)
-     let fsz  = strpart("               ",1,15-s:Strlen(sz)).sz
+     let fsz  = strpart("               ",1,15-strlen(sz)).sz
      let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
  "    call Decho("sz=".sz." fsz=".fsz)
     endif
@@@ -6617,7 -6854,7 +6854,7 @@@
      " sort by time (handles time up to 1 quintillion seconds, US)
  "    call Decho("getftime(".filename.")=".getftime(filename))
      let t  = getftime(filename)
-     let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t
+     let ft = strpart("000000000000000000",1,18-strlen(t)).t
  "    call Decho("exe keepjumps put ='".ft.'/'.filename."'")
      let ftpfile= ft.'/'.pfile
      keepjumps silent! put=ftpfile
@@@ -6626,7 -6863,7 +6863,7 @@@
      " sort by size (handles file sizes up to 1 quintillion bytes, US)
  "    call Decho("getfsize(".filename.")=".getfsize(filename))
      let sz   = getfsize(filename)
-     let fsz  = strpart("000000000000000000",1,18-s:Strlen(sz)).sz
+     let fsz  = strpart("000000000000000000",1,18-strlen(sz)).sz
  "    call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
      let fszpfile= fsz.'/'.pfile
      keepjumps silent! put =fszpfile
@@@ -6640,6 -6877,7 +6877,7 @@@
  
    " cleanup any windows mess at end-of-line
    silent! keepjumps %s/\r$//e
+   call histdel("/",-1)
    exe "setlocal ts=".g:netrw_maxfilenamelen
  "  call Decho("setlocal ts=".g:netrw_maxfilenamelen)
  
@@@ -6659,9 -6897,17 +6897,17 @@@ fun! s:LocalBrowseShellCmdRefresh(
     return
    endif
    if !exists("w:netrw_bannercnt")
- "   call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo")
+ "   call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
     return
    endif
+   if exists("s:locbrowseshellcmd")
+    if s:locbrowseshellcmd
+     let s:locbrowseshellcmd= 0
+ "    call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
+     return
+    endif
+    let s:locbrowseshellcmd= 0
+   endif
    let itab       = 1
    let buftablist = []
    while itab <= tabpagenr("$")
@@@ -6874,9 -7120,7 +7120,7 @@@ fun! s:NetrwLocalRename(path) rang
      endif
      call rename(oldname,newname)
     endfor
-    2match none
-    unlet s:netrwmarkfilelist_{bufnr("%")}
-    unlet s:netrwmarkfilemtch_{bufnr("%")}
+    call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
    
    else
  
@@@ -6955,9 -7199,11 +7199,11 @@@ fun! s:LocalFastBrowser(
     augroup AuNetrwShellCmd
      au!
      if (has("win32") || has("win95") || has("win64") || has("win16"))
+ "     call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
       au ShellCmdPost			*	call s:LocalBrowseShellCmdRefresh()
      else
       au ShellCmdPost,FocusGained	*	call s:LocalBrowseShellCmdRefresh()
+ "     call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
      endif
     augroup END
    endif
@@@ -6984,7 -7230,7 +7230,7 @@@ endfu
  "   0=note     = s:NOTE
  "   1=warning  = s:WARNING
  "   2=error    = s:ERROR
- "  Jul 08, 2008 : max errnum currently is 71
+ "  Oct 12, 2008 : max errnum currently is 73
  fun! netrw#ErrorMsg(level,msg,errnum)
  "  call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
  
@@@ -7017,7 -7263,8 +7263,8 @@@
     else
  "    call Decho("create a NetrwMessage buffer window")
      bo 1split
-     enew
+     call s:NetrwEnew()
+     call s:NetrwSafeOptions()
      setlocal bt=nofile
      file NetrwMessage
  "    call Decho("setlocal ma noro")
@@@ -7130,7 -7377,7 +7377,7 @@@ fun! s:ComposePath(base,subdir
  
    if(has("amiga"))
  "   call Decho("amiga")
-    let ec = a:base[strlen(a:base)-1]
+    let ec = a:base[s:Strlen(a:base)-1]
     if ec != '/' && ec != ':'
      let ret = a:base . "/" . a:subdir
     else
@@@ -7212,7 -7459,7 +7459,7 @@@ fun! s:GetTempfile(fname
     endif
  
     " let netrw#NetSource() know about the tmpfile
-    let s:netrw_tmpfile= tmpfile " used by netrw#NetSource()
+    let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
  "   call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
  
     " o/s dependencies
@@@ -7317,7 -7564,7 +7564,7 @@@ fun! s:NetrwDelete(path
     let result= delete(path)
    endif
    if result < 0
-    call Netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
+    call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
    endif
  
  "  call Dret("s:NetrwDelete ".result)
@@@ -7326,8 -7573,9 +7573,9 @@@ endfu
  
  " ---------------------------------------------------------------------
  " s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
- fun! s:NetrwEnew(curdir)
- "  call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">")
+ fun! s:NetrwEnew(...)
+ "  call Dfunc("s:NetrwEnew() a:0=".a:0)
+ "  call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
  
    " grab a function-local-variable copy of buffer variables
    if exists("b:netrw_bannercnt")      |let netrw_bannercnt       = b:netrw_bannercnt      |endif
@@@ -7370,14 -7618,16 +7618,16 @@@
    if exists("netrw_option")         |let b:netrw_option          = netrw_option         |endif
    if exists("netrw_prvdir")         |let b:netrw_prvdir          = netrw_prvdir         |endif
  
-   let b:netrw_curdir= a:curdir
-   if b:netrw_curdir =~ '/$'
-    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
-     file NetrwTreeListing
-     nno <silent> <buffer> [	:silent call <SID>TreeListMove('[')<cr>
-     nno <silent> <buffer> ]	:silent call <SID>TreeListMove(']')<cr>
-    else
-     exe "silent! keepalt file ".fnameescape(b:netrw_curdir)
+   if a:0 > 0
+    let b:netrw_curdir= a:1
+    if b:netrw_curdir =~ '/$'
+     if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+      file NetrwTreeListing
+      nno <silent> <buffer> [	:silent call <SID>TreeListMove('[')<cr>
+      nno <silent> <buffer> ]	:silent call <SID>TreeListMove(']')<cr>
+     else
+      exe "silent! keepalt file ".fnameescape(b:netrw_curdir)
+     endif
     endif
    endif
  
@@@ -7511,13 -7761,16 +7761,16 @@@ fun! s:NetrwRexplore(islocal,dirname
     call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
     unlet s:nbcd_curpos_{bufnr('%')}
    endif
+   if exists("s:explore_match")
+    exe "2match netrwMarkFile /".s:explore_match."/"
+   endif
  "  call Dret("s:NetrwRexplore")
  endfun
  
  " ---------------------------------------------------------------------
  " s:SaveBufVars: {{{2
  fun! s:SaveBufVars()
- "  call Dfunc("s:SaveBufVars()")
+ "  call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
  
    if exists("b:netrw_curdir")        |let s:netrw_curdir         = b:netrw_curdir        |endif
    if exists("b:netrw_lastfile")      |let s:netrw_lastfile       = b:netrw_lastfile      |endif
@@@ -7532,7 -7785,7 +7785,7 @@@ endfu
  " ---------------------------------------------------------------------
  " s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
  fun! s:SaveWinVars()
- "  call Dfunc("s:SaveWinVars()")
+ "  call Dfunc("s:SaveWinVars() win#".winnr())
    if exists("w:netrw_bannercnt")      |let s:bannercnt       = w:netrw_bannercnt      |endif
    if exists("w:netrw_col")            |let s:col             = w:netrw_col            |endif
    if exists("w:netrw_curdir")         |let s:curdir          = w:netrw_curdir         |endif
@@@ -7562,7 -7815,7 +7815,7 @@@ endfu
  "   variables are not inherited by the new window.  SetBufWinVars() and
  "   UseBufWinVars() get around that.
  fun! s:SetBufWinVars()
- "  call Dfunc("s:SetBufWinVars()")
+ "  call Dfunc("s:SetBufWinVars() win#".winnr())
    if exists("w:netrw_liststyle")      |let b:netrw_liststyle      = w:netrw_liststyle      |endif
    if exists("w:netrw_bannercnt")      |let b:netrw_bannercnt      = w:netrw_bannercnt      |endif
    if exists("w:netrw_method")         |let b:netrw_method         = w:netrw_method         |endif
@@@ -7584,8 -7837,7 +7837,7 @@@ fun! s:SetRexDir(islocal,dirname
    if a:islocal
     exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")'
     if g:netrw_retmap
-     silent! unmap <2-leftmouse>
-     if !hasmapto("<Plug>NetrwReturn")
+     if !hasmapto("<Plug>NetrwReturn") && maparg("<2-leftmouse>","n") == ""
       nmap <unique> <silent> <2-leftmouse>	<Plug>NetrwReturn
      endif
      let dir = escape(a:dirname, s:netrw_map_escape)
@@@ -7594,8 -7846,7 +7846,7 @@@
    else
     exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")'
     if g:netrw_retmap
-     silent! unmap <2-leftmouse>
-     if !hasmapto("<Plug>NetrwReturn")
+     if !hasmapto("<Plug>NetrwReturn") && maparg("<2-leftmouse>","n") == ""
       nmap <unique> <silent> <2-leftmouse>	<Plug>NetrwReturn
      endif
      let dir = escape(a:dirname, s:netrw_map_escape)
@@@ -7608,9 -7859,9 +7859,9 @@@ endfu
  " ---------------------------------------------------------------------
  " s:Strlen: this function returns the length of a string, even if its {{{2
  "           using two-byte etc characters.
- "           Currently, its only used if g:Align_xstrlen is set to a
- "           nonzero value.  Solution from Nicolai Weibull, vim docs
- "           (:help strlen()), Tony Mechelynck, and my own invention.
+ "           Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
+ "           and a bit from me.
+ "           if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
  fun! s:Strlen(x)
  "  call Dfunc("s:Strlen(x<".a:x.">")
    if g:netrw_xstrlen == 1
@@@ -7638,7 -7889,7 +7889,7 @@@
  
    else
     " at least give a decent default
-    ret= strlen(a:x)
+    let ret= strlen(a:x)
    endif
  "  call Dret("s:Strlen ".ret)
    return ret
@@@ -7737,12 -7988,14 +7988,14 @@@ fun! s:UseBufWinVars(
  endfun
  
  " ---------------------------------------------------------------------
- " s:WinPath: {{{2
+ " s:WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
  fun! s:WinPath(path)
  "  call Dfunc("s:WinPath(path<".a:path.">)")
-   if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+   if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
+    " remove cygdrive prefix, if present
+    let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
     " remove trailing slash (Win95)
-    let path = substitute(a:path, '\(\\\|/\)$', '', 'g')
+    let path = substitute(path, '\(\\\|/\)$', '', 'g')
     " remove escaped spaces
     let path = substitute(path, '\ ', ' ', 'g')
     " convert slashes to backslashes
diff --combined runtime/doc/options.txt
index 904d6aa,2bfa614..ced2841
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@@ -1,4 -1,4 +1,4 @@@
- *options.txt*	For Vim version 7.2.  Last change: 2008 Nov 25
+ *options.txt*	For Vim version 7.2.  Last change: 2009 Apr 12
  
  
  		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@@ -743,8 -743,8 +743,8 @@@ A jump table for the options with a sho
  	     within a word (initial, medial, final and stand-alone).
  	  b) the enabling of the ability to compose characters
  	  c) the enabling of the required combining of some characters
- 	When disabled the character display reverts back to each character's
- 	true stand-alone form.
+ 	When disabled the display shows each character's true stand-alone
+ 	form.
  	Arabic is a complex language which requires other settings, for
  	further details see |arabic.txt|.
  
@@@ -959,7 -959,8 +959,8 @@@
  			{not in Vi}
  	List of directories for the backup file, separated with commas.
  	- The backup file will be created in the first directory in the list
- 	  where this is possible.
+ 	  where this is possible.  The directory must exist, Vim will not
+ 	  create it for you.
  	- Empty means that no backup file will be created ('patchmode' is
  	  impossible!).  Writing may fail because of this.
  	- A directory "." means to put the backup file in the same directory
@@@ -1143,7 -1144,7 +1144,7 @@@
  	Some applications use the BOM to recognize the encoding of the file.
  	Often used for UCS-2 files on MS-Windows.  For other applications it
  	causes trouble, for example: "cat file1 file2" makes the BOM of file2
- 	appear halfway the resulting file.
+ 	appear halfway the resulting file.  Gcc doesn't accept a BOM.
  	When Vim reads a file and 'fileencodings' starts with "ucs-bom", a
  	check for the presence of the BOM is done and 'bomb' set accordingly.
  	Unless 'binary' is set, it is removed from the first line, so that you
@@@ -2378,6 -2379,10 +2379,10 @@@
  	This is specified with 'fileencoding'.  The conversion is done with
  	iconv() or as specified with 'charconvert'.
  
+ 	If you need to know whether 'encoding' is a multi-byte encoding, you
+ 	can use: >
+ 		if has("multi_byte_encoding")
+ <
  	Normally 'encoding' will be equal to your current locale.  This will
  	be the default if Vim recognizes your environment settings.  If
  	'encoding' is not set to the current locale, 'termencoding' must be
@@@ -2835,6 -2840,8 +2840,8 @@@
  
  	The expression may be evaluated in the |sandbox|, see
  	|sandbox-option|.
+ 	This option can't be set from a |modeline| when the 'diff' option is
+ 	on.
  
  	It is not allowed to change text or jump to another window while
  	evaluating 'foldexpr' |textlock|.
@@@ -3236,8 -3243,13 +3243,13 @@@
  
  	For the GTK+ 2 GUI the font name looks like this: >
  	    :set guifont=Andale\ Mono\ 11
- <	That's all.  XLFDs are no longer accepted.
- 
+ <	That's all.  XLFDs are not used.  For Chinese this is reported to work
+ 	well: >
+ 	    if has("gui_gtk2")
+ 	      set guifont=Bitstream\ Vera\ Sans\ Mono\ 12,Fixed\ 12
+ 	      set guifontwide=Microsoft\ Yahei\ 12,WenQuanYi\ Zen\ Hei\ 12
+ 	    endif
+ <
  	For Mac OSX you can use something like this: >
  	    :set guifont=Monaco:h10
  <	Also see 'macatsui', it can help fix display problems.
@@@ -3483,7 -3495,9 +3495,9 @@@
  	When nonempty describes the text to use in a tooltip for the GUI tab
  	pages line.  When empty Vim will use a default tooltip.
  	This option is otherwise just like 'guitablabel' above.
- 
+ 	You can include a line break.  Simplest method is to use |:let|: >
+ 		:let &guitabtooltip = "line one\nline two"
+ <
  
  						*'helpfile'* *'hf'*
  'helpfile' 'hf'		string	(default (MSDOS)  "$VIMRUNTIME\doc\help.txt"
@@@ -4322,10 -4336,17 +4336,17 @@@
  						*'list'* *'nolist'*
  'list'			boolean	(default off)
  			local to window
- 	List mode: Show tabs as CTRL-I, show end of line with $.  Useful to
- 	see the difference between tabs and spaces and for trailing blanks.
- 	Note that this will also affect formatting (set with 'textwidth' or
- 	'wrapmargin') when 'cpoptions' includes 'L'.  See 'listchars' for
+ 	List mode: Show tabs as CTRL-I is displayed, display $ after end of
+ 	line.  Useful to see the difference between tabs and spaces and for
+ 	trailing blanks.  Further changed by the 'listchars' option.
+ 
+ 	The cursor is displayed at the start of the space a Tab character
+ 	occupies, not at the end as usual in Normal mode.  To get this cursor
+ 	position while displaying Tabs with spaces, use: >
+ 		:set list lcs=tab\ \ 
+ <
+ 	Note that list mode will also affect formatting (set with 'textwidth'
+ 	or 'wrapmargin') when 'cpoptions' includes 'L'.  See 'listchars' for
  	changing the way tabs are displayed.
  
  						*'listchars'* *'lcs'*
@@@ -4508,15 -4529,15 +4529,15 @@@
  			{not in Vi}
  	Maximum amount of memory (in Kbyte) to use for one buffer.  When this
  	limit is reached allocating extra memory for a buffer will cause
- 	other memory to be freed.  Maximum value 2000000.  Use this to work
- 	without a limit.  Also see 'maxmemtot'.
+ 	other memory to be freed.  Maximum usable value about 2000000.  Use
+ 	this to work without a limit.  Also see 'maxmemtot'.
  
  						*'maxmempattern'* *'mmp'*
  'maxmempattern' 'mmp'	number	(default 1000)
  			global
  			{not in Vi}
  	Maximum amount of memory (in Kbyte) to use for pattern matching.
- 	Maximum value 2000000.  Use this to work without a limit.
+ 	Maximum value about 2000000.  Use this to work without a limit.
  							*E363*
  	When Vim runs into the limit it gives an error message and mostly
  	behaves like CTRL-C was typed.
@@@ -4532,8 -4553,8 +4553,8 @@@
  			global
  			{not in Vi}
  	Maximum amount of memory (in Kbyte) to use for all buffers together.
- 	Maximum value 2000000.  Use this to work without a limit.  Also see
- 	'maxmem'.
+ 	Maximum usable value 2000000.  Use this to work without a limit.  Also
+ 	see 'maxmem'.
  
  						*'menuitems'* *'mis'*
  'menuitems' 'mis'	number	(default 25)
@@@ -4586,7 -4607,7 +4607,7 @@@
  
  				   *'modeline'* *'ml'* *'nomodeline'* *'noml'*
  'modeline' 'ml'		boolean	(Vim default: on (off for root),
 -				 Vi default: off)
 +				 Debian: off, Vi default: off)
  			local to buffer
  						*'modelines'* *'mls'*
  'modelines' 'mls'	number	(default 5)
@@@ -5599,8 -5620,8 +5620,8 @@@
  	   winsize	window sizes
  
  	Don't include both "curdir" and "sesdir".
- 	When "curdir" nor "sesdir" is included, file names are stored with
- 	absolute paths.
+ 	When neither "curdir" nor "sesdir" is included, file names are stored
+ 	with absolute paths.
  	"slash" and "unix" are useful on Windows when sharing session files
  	with Unix.  The Unix version of Vim cannot source dos format scripts,
  	but the Windows version of Vim can source unix format scripts.
@@@ -5898,7 -5919,8 +5919,8 @@@
  	In Visual mode the size of the selected area is shown:
  	- When selecting characters within a line, the number of characters.
  	- When selecting more than one line, the number of lines.
- 	- When selecting a block, the size in screen characters: linesxcolumns.
+ 	- When selecting a block, the size in screen characters:
+ 	  {lines}x{columns}.
  	NOTE: This option is set to the Vi default value when 'compatible' is
  	set and to the Vim default value when 'compatible' is reset.
  
@@@ -6633,8 -6655,9 +6655,9 @@@
  	of '2' in the "!_TAG_FILE_SORTED" line for this.  A tag file can be
  	case-fold sorted with the -f switch to "sort" in most unices, as in
  	the command: "sort -f -o tags tags".  For "Exuberant ctags" version
- 	5.3 or higher the -f or --fold-case-sort switch can be used for this
- 	as well.  Note that case must be folded to uppercase for this to work.
+ 	5.x or higher (at least 5.5) the --sort=foldcase switch can be used
+ 	for this as well.  Note that case must be folded to uppercase for this
+ 	to work.
  
  	When 'tagbsearch' is off, tags searching is slower when a full match
  	exists, but faster when no full match exists.  Tags in unsorted tags
@@@ -7244,9 -7267,9 +7267,9 @@@
  
  				*'viminfo'* *'vi'* *E526* *E527* *E528*
  'viminfo' 'vi'		string	(Vi default: "", Vim default for MS-DOS,
- 				   Windows and OS/2: '20,<50,s10,h,rA:,rB:,
- 				   for Amiga: '20,<50,s10,h,rdf0:,rdf1:,rdf2:
- 				   for others: '20,<50,s10,h)
+ 				   Windows and OS/2: '100,<50,s10,h,rA:,rB:,
+ 				   for Amiga: '100,<50,s10,h,rdf0:,rdf1:,rdf2:
+ 				   for others: '100,<50,s10,h)
  			global
  			{not in Vi}
  			{not available when compiled without the  |+viminfo|
@@@ -7719,6 -7742,8 +7742,8 @@@
  		:set sidescroll=5
  		:set listchars+=precedes:<,extends:>
  <	See 'sidescroll', 'listchars' and |wrap-off|.
+ 	This option can't be set from a |modeline| when the 'diff' option is
+ 	on.
  
  						*'wrapmargin'* *'wm'*
  'wrapmargin' 'wm'	number	(default 0)
diff --combined runtime/filetype.vim
index 4d9413f,6d30abf..5f1b8d5
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@@ -1,7 -1,7 +1,7 @@@
  " Vim support file to detect file types
  "
  " Maintainer:	Bram Moolenaar <Bram at vim.org>
- " Last Change:	2008 Aug 03
+ " Last Change:	2008 Dec 14
  
  " Listen very carefully, I will say this only once
  if exists("did_load_filetypes")
@@@ -116,6 -116,9 +116,9 @@@ au BufNewFile,BufRead httpd.conf*,srm.c
  " XA65 MOS6510 cross assembler
  au BufNewFile,BufRead *.a65			setf a65
  
+ " Applescript
+ au BufNewFile,BufRead *.scpt			setf applescript
+ 
  " Applix ELF
  au BufNewFile,BufRead *.am
  	\ if expand("<afile>") !~? 'Makefile.am\>' | setf elf | endif
@@@ -350,10 -353,9 +353,9 @@@ au BufNewFile,BufRead *.cp
  	\ if exists("cynlib_syntax_for_cpp")|setf cynlib|else|setf cpp|endif
  
  " C++
+ au BufNewFile,BufRead *.cxx,*.c++,*.hh,*.hxx,*.hpp,*.ipp,*.moc,*.tcc,*.inl setf cpp
  if has("fname_case")
-   au BufNewFile,BufRead *.cxx,*.c++,*.C,*.H,*.hh,*.hxx,*.hpp,*.moc,*.tcc,*.inl setf cpp
- else
-   au BufNewFile,BufRead *.cxx,*.c++,*.hh,*.hxx,*.hpp,*.moc,*.tcc,*.inl setf cpp
+   au BufNewFile,BufRead *.C,*.H setf cpp
  endif
  
  " .h files can be C, Ch C++, ObjC or ObjC++.
@@@ -364,9 -366,9 +366,9 @@@ au BufNewFile,BufRead *.h			call s:FThe
  func! s:FTheader()
    if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1
      setf objc
-   elseif exists("c_syntax_for_h")
+   elseif exists("g:c_syntax_for_h")
      setf c
-   elseif exists("ch_syntax_for_h")
+   elseif exists("g:ch_syntax_for_h")
      setf ch
    else
      setf cpp
@@@ -669,8 -671,9 +671,9 @@@ au BufNewFile,BufRead *.factor			setf f
  " Fetchmail RC file
  au BufNewFile,BufRead .fetchmailrc		setf fetchmail
  
- " FlexWiki
- au BufNewFile,BufRead *.wiki			setf flexwiki
+ " FlexWiki - disabled, because it has side effects when a .wiki file
+ " is not actually FlexWiki
+ "au BufNewFile,BufRead *.wiki			setf flexwiki
  
  " Focus Executable
  au BufNewFile,BufRead *.fex,*.focexec		setf focexec
@@@ -704,7 -707,7 +707,7 @@@ au BufNewFile,BufRead .gdbinit			setf g
  au BufNewFile,BufRead *.mo,*.gdmo		setf gdmo
  
  " Gedcom
- au BufNewFile,BufRead *.ged			setf gedcom
+ au BufNewFile,BufRead *.ged,lltxxxxx.txt	setf gedcom
  
  " Git
  autocmd BufNewFile,BufRead *.git/COMMIT_EDITMSG    setf gitcommit
@@@ -1043,7 -1046,7 +1046,7 @@@ func! s:FTm(
    let n = 1
    while n < 10
      let line = getline(n)
-     if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\)'
+     if line =~ '^\s*\(#\s*\(include\|import\)\>\|/\*\|//\)'
        setf objc
        return
      endif
@@@ -1070,6 -1073,9 +1073,9 @@@ au BufNewFile,BufRead *.nb			setf mm
  " Maya Extension Language
  au BufNewFile,BufRead *.mel			setf mel
  
+ " Mercurial config (looks like generic config file)
+ au BufNewFile,BufRead *.hgrc,*hgrc		setf cfg
+ 
  " Messages
  au BufNewFile,BufRead /var/log/messages,/var/log/messages.*[0-9]  setf messages
  
@@@ -1260,7 -1266,7 +1266,7 @@@ if has("fname_case"
  else
    au BufNewFile,BufRead *.pl			call s:FTpl()
  endif
- au BufNewFile,BufRead *.plx			setf perl
+ au BufNewFile,BufRead *.plx,*.al		setf perl
  
  func! s:FTpl()
    if exists("g:filetype_pl")
@@@ -1980,7 -1986,7 +1986,7 @@@ func! s:FTtex(
      call cursor(1,1)
      let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
      if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
 -      let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
 +      let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>\|part\>\|chapter\>\|section\>\|subsection\>\|subsubsection\>\|paragraph\>\|subparagraph\>\|subsubparagraph'
        let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
        let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
  			      \ 'cnp', firstNC + 1000)
@@@ -2079,8 -2085,13 +2085,13 @@@ au BufNewFile,BufRead *.vim,*.vba,.exrc
  " Viminfo file
  au BufNewFile,BufRead .viminfo,_viminfo		setf viminfo
  
- " Virata Config Script File
- au BufRead,BufNewFile *.hw,*.module,*.pkg	setf virata
+ " Virata Config Script File or Drupal module
+ au BufRead,BufNewFile *.hw,*.module,*.pkg
+ 	\ if getline(1) =~ '<?php' |
+ 	\   setf php |
+ 	\ else |
+ 	\   setf virata |
+ 	\ endif
  
  " Visual Basic (also uses *.bas) or FORM
  au BufNewFile,BufRead *.frm			call s:FTVB("form")
@@@ -2325,6 -2336,9 +2336,9 @@@ au BufNewFile,BufRead *fvwm2rc
  	\|  let b:fvwm_version = 2 | call s:StarSetf('fvwm')
  	\|endif
  
+ " Gedcom
+ au BufNewFile,BufRead /tmp/lltmp*		call s:StarSetf('gedcom')
+ 
  " GTK RC
  au BufNewFile,BufRead .gtkrc*,gtkrc*		call s:StarSetf('gtkrc')
  
diff --combined runtime/scripts.vim
index aed27cd,1872f58..1639e0d
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@@ -1,7 -1,7 +1,7 @@@
  " Vim support file to detect file types in scripts
  "
  " Maintainer:	Bram Moolenaar <Bram at vim.org>
- " Last change:	2008 Aug 09
+ " Last change:	2008 Sep 05
  
  " This file is called by an autocommand for every file that has just been
  " loaded into a buffer.  It checks if the type of file can be recognized by
@@@ -317,39 -317,32 +317,40 @@@ els
    elseif s:line1 =~ 'exec\s\+\S*scheme' || s:line2 =~ 'exec\s\+\S*scheme'
      set ft=scheme
  
 +  " rst files
 +  elseif s:line1 =~ '^\.\.\s\|^\s*restindex\s*$'
 +	\ || s:line2 =~ '^\.\.\s\|^\s*restindex\s*$'
 +	\ || s:line3 =~ '^\.\.\s\|^\s*restindex\s*$'
 +	\ || s:line4 =~ '^\.\.\s\|^\s*restindex\s*$'
 +	\ || s:line5 =~ '^\.\.\s\|^\s*restindex\s*$'
 +    set ft=rst
 +
    " Git output
    elseif s:line1 =~ '^\(commit\|tree\|object\) \x\{40\}$\|^tag \S\+$'
      set ft=git
  
    " CVS diff
    else
-     let lnum = 1
-     while getline(lnum) =~ "^? " && lnum < line("$")
-       let lnum = lnum + 1
+     let s:lnum = 1
+     while getline(s:lnum) =~ "^? " && s:lnum < line("$")
+       let s:lnum += 1
      endwhile
-     if getline(lnum) =~ '^Index:\s\+\f\+$'
+     if getline(s:lnum) =~ '^Index:\s\+\f\+$'
        set ft=diff
  
        " locale input files: Formal Definitions of Cultural Conventions
        " filename must be like en_US, fr_FR at euro or en_US.UTF-8
      elseif expand("%") =~ '\a\a_\a\a\($\|[.@]\)\|i18n$\|POSIX$\|translit_'
-       let lnum = 1
-       while lnum < 100 && lnum < line("$")
- 	if getline(lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
+       let s:lnum = 1
+       while s:lnum < 100 && s:lnum < line("$")
+ 	if getline(s:lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
  	  setf fdcc
  	  break
  	endif
- 	let lnum = lnum + 1
+ 	let s:lnum += 1
        endwhile
      endif
+     unlet s:lnum
  
    endif
  
diff --combined runtime/syntax/po.vim
index 1a3e670,4475417..459efe6
--- a/runtime/syntax/po.vim
+++ b/runtime/syntax/po.vim
@@@ -1,10 -1,10 +1,10 @@@
  " Vim syntax file
  " Language:	po (gettext)
  " Maintainer:	Dwayne Bailey <dwayne at translate.org.za>
- " Last Change:	2008 Jan 08
+ " Last Change:	2008 Sep 17
  " Contributors: Dwayne Bailey (Most advanced syntax highlighting)
  "               Leonardo Fontenelle (Spell checking)
- "               Nam SungHyun <namsh at kldp.org> (Original maintainer)
+ "               SungHyun Nam <goweol at gmail.com> (Original maintainer)
  
  " For version 5.x: Clear all syntax items
  " For version 6.x: Quit when a syntax file was already loaded
@@@ -14,9 -14,6 +14,9 @@@ elseif exists("b:current_syntax"
    finish
  endif
  
 +let s:cpo_save = &cpo
 +set cpo-=C  " Allow line continuations
 +
  syn sync minlines=10
  
  " Identifiers
@@@ -133,7 -130,6 +133,7 @@@ if version >= 508 || !exists("did_po_sy
    delcommand HiLink
  endif
  
 +let &cpo = s:cpo_save
  let b:current_syntax = "po"
  
  " vim:set ts=8 sts=2 sw=2 noet:
diff --combined runtime/syntax/tex.vim
index f73e0e4,d9e81bc..a34dbeb
--- a/runtime/syntax/tex.vim
+++ b/runtime/syntax/tex.vim
@@@ -1,8 -1,8 +1,8 @@@
  " Vim syntax file
  " Language:	TeX
  " Maintainer:	Dr. Charles E. Campbell, Jr. <NdrchipO at ScampbellPfamily.AbizM>
- " Last Change:	Jun 03, 2008
- " Version:	41
+ " Last Change:	Feb 05, 2009
+ " Version:	45
  " URL:		http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
  "
  " Notes: {{{1
@@@ -103,6 -103,7 +103,7 @@@ endi
  syn cluster texEnvGroup		contains=texMatcher,texMathDelim,texSpecialChar,texStatement
  syn cluster texFoldGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,texMatcher,texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ,texNewCmd,texNewEnv,texOnlyMath,texOption,texParen,texRefZone,texSection,texSectionMarker,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone, at texMathZones,texTitle,texAbstract
  syn cluster texMatchGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption, at Spell
+ syn cluster texStyleGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texStyleStatement, at Spell,texStyleMatcher
  syn cluster texRefGroup		contains=texMatcher,texComment,texDelimiter
  if !exists("tex_no_math")
   syn cluster texMathZones	contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ
@@@ -188,7 -189,7 +189,7 @@@ syn region texDocTypeArgs	matchgroup=De
  
  " Preamble syntax-based folding support: {{{1
  if g:tex_fold_enabled && has("folding")
-  syn region texPreamble	transparent fold	start='\zs\\documentclass\>' end='\ze\\begin{document}'	contains=@texMatchGroup
+  syn region texPreamble	transparent fold	start='\zs\\documentclass\>' end='\ze\\begin{document}'	contains=texStyle, at texMatchGroup
  endif
  
  " TeX input: {{{1
@@@ -309,7 -310,7 +310,7 @@@ if !exists("tex_no_math"
     exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
     exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
     exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
-    exe 'HiLink '.grpname.' texMath'
+    exe 'hi def link '.grpname.' texMath'
     if a:starform
      let grpname  = "texMathZone".a:sfx.'S'
      let syncname = "texSyncMathZone".a:sfx.'S'
@@@ -317,7 -318,7 +318,7 @@@
      exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
      exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
      exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
-     exe 'HiLink '.grpname.' texMath'
+     exe 'hi def link '.grpname.' texMath'
     endif
   endfun
  
@@@ -399,17 -400,13 +400,13 @@@ endi
  " Separate lines used for verb` and verb# so that the end conditions {{{1
  " will appropriately terminate.  Ideally vim would let me save a
  " character from the start pattern and re-use it in the end-pattern.
- if version < 600
-   syn region texZone		start="\\begin{verbatim}"		end="\\end{verbatim}\|%stopzone\>"
-   " moreverb package:
-   syn region texZone		start="\\begin{verbatimtab}"		end="\\end{verbatimtab}\|%stopzone\>"
-   syn region texZone		start="\\begin{verbatimwrite}"		end="\\end{verbatimwrite}\|%stopzone\>"
-   syn region texZone		start="\\begin{boxedverbatim}"		end="\\end{boxedverbatim}\|%stopzone\>"
- else
-   syn region texZone		start="\\begin{\z(boxedverbatim\|verbatim\%(tab\|write\)\=\)}"		end="\\end{\z1}\|%stopzone\>"
- endif
 -syn region texZone		start="\\begin{[vV]erbatim}"		end="\\end{[vV]erbatim}\|%stopzone\>"	contains=@Spell
++syn region texZone		start="\\begin{[vV]erbatim}"		end="\\end{[vV]erbatim}\|%stopzone\>"
  " listings package:
  syn region texZone		start="\\begin{lstlisting}"		end="\\end{lstlisting}\|%stopzone\>"	contains=@Spell
+ " moreverb package:
 -syn region texZone		start="\\begin{verbatimtab}"		end="\\end{verbatimtab}\|%stopzone\>"	contains=@Spell
 -syn region texZone		start="\\begin{verbatimwrite}"		end="\\end{verbatimwrite}\|%stopzone\>"	contains=@Spell
 -syn region texZone		start="\\begin{boxedverbatim}"		end="\\end{boxedverbatim}\|%stopzone\>"	contains=@Spell
++syn region texZone		start="\\begin{verbatimtab}"		end="\\end{verbatimtab}\|%stopzone\>"
++syn region texZone		start="\\begin{verbatimwrite}"		end="\\end{verbatimwrite}\|%stopzone\>"
++syn region texZone		start="\\begin{boxedverbatim}"		end="\\end{boxedverbatim}\|%stopzone\>"
  if version < 600
   syn region texZone		start="\\verb\*\=`"			end="`\|%stopzone\>"
   syn region texZone		start="\\verb\*\=#"			end="#\|%stopzone\>"
@@@ -460,6 -457,14 +457,14 @@@ syn match  texLength		"\<\d\+\([.,]\d\+
  " TeX String Delimiters: {{{1
  syn match texString		"\(``\|''\|,,\)"
  
+ " makeatletter -- makeatother sections
+ if !exists("g:tex_no_error")
+  syn region texStyle			matchgroup=texStatement start='\\makeatletter' end='\\makeatother'	contains=@texStyleGroup contained
+  syn match  texStyleStatement		"\\[a-zA-Z@]\+"	contained
+  syn region texStyleMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		contains=@texStyleGroup,texError	contained
+  syn region texStyleMatcher		matchgroup=Delimiter start="\["				end="]"		contains=@texStyleGroup,texError	contained
+ endif
+ 
  " LaTeX synchronization: {{{1
  syn sync maxlines=200
  syn sync minlines=50
@@@ -511,6 -516,7 +516,7 @@@ if did_tex_syntax_inits == 
     HiLink texMathDelimSet2	texMathDelim
     HiLink texMathDelimKey	texMathDelim
     HiLink texMathMatcher	texMath
+    HiLink texMathZoneV		texMath
     HiLink texMathZoneW		texMath
     HiLink texMathZoneX		texMath
     HiLink texMathZoneY		texMath
@@@ -520,6 -526,7 +526,7 @@@
    HiLink texSectionMarker	texCmdName
    HiLink texSectionName		texSection
    HiLink texSpaceCode		texStatement
+   HiLink texStyleStatement	texStatement
    HiLink texTypeSize		texType
    HiLink texTypeStyle		texType
  

-- 
Vim packaging



More information about the pkg-vim-maintainers mailing list