diff runtime/plugin/netrw.vim @ 459:d9d38102399f

updated for version 7.0122
author vimboss
date Mon, 01 Aug 2005 21:58:57 +0000
parents 59b7b7e99c95
children f98374445f66
line wrap: on
line diff
--- a/runtime/plugin/netrw.vim
+++ b/runtime/plugin/netrw.vim
@@ -1,7 +1,7 @@
 " netrw.vim: Handles file transfer and remote directory listing across a network
-" last change:	Dec 29, 2004
+" Last Change:	Aug 01, 2005
 " Maintainer:	Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
-" Version:	54
+" Version:	56
 " License:	Vim License  (see vim's :help license)
 "
 "  But be doers of the Word, and not only hearers, deluding your own selves
@@ -10,13 +10,13 @@
 " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
 
 " ---------------------------------------------------------------------
-" Prevent Reloading: {{{1
+" Load Once: {{{1
 if exists("g:loaded_netrw") || &cp
   finish
 endif
-let g:loaded_netrw  = "v54"
-let s:save_cpo      = &cpo
+let g:loaded_netrw  = "v56"
 let loaded_explorer = 1
+let s:keepcpo       = &cpo
 set cpo&vim
 
 " ---------------------------------------------------------------------
@@ -43,7 +43,7 @@ if !exists("g:netrw_list_cmd")
   " provide a default listing command
   let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
  else
-"  call Decho("ssh is not executable, can't do remote directory exploring")
+"  call Decho("ssh is not executable, can't do remote directory exploring with ssh")
   let g:netrw_list_cmd= ""
  endif
 endif
@@ -100,15 +100,6 @@ endif
 if !exists("g:netrw_local_rmdir")
  let g:netrw_local_rmdir= "rmdir"
 endif
-if !exists("g:netrw_local_rename")
- if g:netrw_cygwin
-  let g:netrw_local_rename= "mv"
- elseif has("win32") || has("win95") || has("win64") || has("win16")
-  let g:netrw_local_rename= "rename"
- elseif has("unix")
-  let g:netrw_local_rename= "mv"
- endif
-endif
 if !exists("g:netrw_local_mkdir")
  let g:netrw_local_mkdir= "mkdir"
 endif
@@ -216,30 +207,36 @@ endif
 if version >= 600
  augroup FileExplorer
   au!
-  au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
+  au BufEnter * call <SID>LocalBrowse(expand("<amatch>"))
  augroup END
  " Network Handler: {{{2
  augroup Network
   au!
   if has("win32") || has("win95") || has("win64") || has("win16")
-   au BufReadCmd  file://*		exe "silent doau BufReadPre ".expand("<afile>")|exe 'e '.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
+   au BufReadCmd  file://*		exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e '.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
   else
-   au BufReadCmd  file:///*		exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
-   au BufReadCmd  file://localhost/*	exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
+   au BufReadCmd  file:///*		exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
+   au BufReadCmd  file://localhost/*	exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
   endif
-  au BufReadCmd   ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread 0r ".expand("<afile>")|exe "silent doau BufReadPost ".expand("<afile>")
-  au FileReadCmd  ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread "   .expand("<afile>")|exe "silent doau FileReadPost ".expand("<afile>")
-  au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*    	exe "silent doau BufWritePre ".expand("<afile>")|exe "Nwrite " .expand("<afile>")|exe "silent doau BufWritePost ".expand("<afile>")
-  au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*    	exe "silent doau BufWritePre ".expand("<afile>")|exe "'[,']Nwrite " .expand("<afile>")|exe "silent doau FileWritePost ".expand("<afile>")
+  au BufReadCmd   ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "silent doau BufReadPre ".expand("<amatch>")|exe "Nread 0r ".expand("<amatch>")|exe "silent doau BufReadPost ".expand("<amatch>")
+  au FileReadCmd  ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "silent doau BufReadPre ".expand("<amatch>")|exe "Nread "   .expand("<amatch>")|exe "silent doau FileReadPost ".expand("<amatch>")
+  au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*    	exe "silent doau BufWritePre ".expand("<amatch>")|exe "Nwrite " .expand("<amatch>")|exe "silent doau BufWritePost ".expand("<amatch>")
+  au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*    	exe "silent doau BufWritePre ".expand("<amatch>")|exe "'[,']Nwrite " .expand("<amatch>")|exe "silent doau FileWritePost ".expand("<amatch>")
  augroup END
 endif
 
 " ------------------------------------------------------------------------
-" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
-com! -nargs=*		Nread		call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
-com! -range=% -nargs=*	Nwrite		call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
+" Commands: :Nread, :Nwrite, :NetUserPass {{{1
+com! -nargs=*		Nread		call s:NetSavePosn()<bar>call s:NetRead(<f-args>)<bar>call s:NetRestorePosn()
+com! -range=% -nargs=*	Nwrite		call s:NetSavePosn()<bar><line1>,<line2>call s:NetWrite(<f-args>)<bar>call s:NetRestorePosn()
 com! -nargs=*		NetUserPass	call NetUserPass(<f-args>)
 
+" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{1
+com! -nargs=? -bar -bang  	Explore		call s:Explore(0,0+<bang>0,<q-args>)
+com! -nargs=? -bar -bang  	Sexplore	call s:Explore(1,0+<bang>0,<q-args>)
+com! -nargs=? -bar -bang  	Hexplore	call s:Explore(1,2+<bang>0,<q-args>)
+com! -nargs=? -bar -bang  	Vexplore	call s:Explore(1,4+<bang>0,<q-args>)
+
 " ------------------------------------------------------------------------
 " NetSavePosn: saves position of cursor on screen {{{1
 fun! s:NetSavePosn()
@@ -352,7 +349,7 @@ fun! s:NetRead(...)
        let ichoice     = ichoice + 1
        if ichoice > a:0
        	if !exists("g:netrw_quiet")
-         echoerr "Unbalanced string in filename '". wholechoice ."'"
+         echoerr "***netrw*** Unbalanced string in filename '". wholechoice ."'"
          call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 	endif
 "        call Dret("NetRead")
@@ -436,10 +433,10 @@ fun! s:NetRead(...)
       exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
      endif
      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
-     if getline(1) !~ "^$" && !exists("g:netrw_quiet")
+     if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
       let debugkeep= &debug
       set debug=msg
-      echoerr getline(1)
+      echoerr "***netrw*** ".getline(1)
       call inputsave()|call input("Press <cr> to continue")|call inputrestore()
       let &debug= debugkeep
      endif
@@ -485,7 +482,7 @@ fun! s:NetRead(...)
     if getline(1) !~ "^$"
 "     call Decho("error<".getline(1).">")
      if !exists("g:netrw_quiet")
-      echoerr getline(1)
+      echoerr "***netrw*** ".getline(1)
       call inputsave()|call input("Press <cr> to continue")|call inputrestore()
      endif
     endif
@@ -518,7 +515,7 @@ fun! s:NetRead(...)
 "    call Decho("read via http (method #5)")
     if g:netrw_http_cmd == ""
      if !exists("g:netrw_quiet")
-      echoerr "neither wget nor fetch command is available"
+      echoerr "***netrw*** neither wget nor fetch command is available"
       call inputsave()|call input("Press <cr> to continue")|call inputrestore()
      endif
      exit
@@ -596,7 +593,7 @@ fun! s:NetRead(...)
    elseif     b:netrw_method  == 8	" read with fetch
     if g:netrw_fetch_cmd == ""
      if !exists("g:netrw_quiet")
-      echoerr "fetch command not available"
+      echoerr "***netrw*** fetch command not available"
       call inputsave()|call input("Press <cr> to continue")|call inputrestore()
      endif
      exit
@@ -678,17 +675,23 @@ fun! s:NetGetFile(readcmd, fname, method
  
   if a:readcmd[0] == '0'
   " get file into buffer
+
    " record remote filename
-   let rfile= bufname("%")
-"   call Decho("edit remotefile<".rfile.">")
+   let rfile= bufname(".")
+"   call Decho("remotefile<".rfile.">")
+"   call Dredir("ls!","starting buffer list")
+
    " rename the current buffer to the temp file (ie. fname)
-   exe "keepalt file ".fname
+   keepalt exe "file ".fname
+"   call Dredir("ls!","after renaming current buffer to <".fname.">")
+
    " edit temporary file
    e
+"   call Dredir("ls!","after editing temporary file")
+
    " rename buffer back to remote filename
-   exe "keepalt file ".rfile
-   " wipe out the buffer with the temp file name
-   exe "bwipe ".fname
+   keepalt exe "file ".rfile
+"   call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
    let line1 = 1
    let line2 = line("$")
 
@@ -712,6 +715,8 @@ fun! s:NetGetFile(readcmd, fname, method
   if exists("*NetReadFixup")
 "   call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
    call NetReadFixup(a:method, line1, line2)
+" else " Decho
+"  call Decho("NetReadFixup() not called, doesn't exist")
   endif
 
   " update the Buffers menu
@@ -787,7 +792,7 @@ fun! s:NetWrite(...) range
        let ichoice    = ichoice + 1
        if choice > a:0
        	if !exists("g:netrw_quiet")
-         echoerr "Unbalanced string in filename '". wholechoice ."'"
+         echoerr "***netrw*** Unbalanced string in filename '". wholechoice ."'"
          call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 	endif
 "        call Dret("NetWrite")
@@ -858,7 +863,7 @@ fun! s:NetWrite(...) range
     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
     if getline(1) !~ "^$"
      if !exists("g:netrw_quiet")
-      echoerr getline(1)
+      echoerr "***netrw*** ".getline(1)
       call inputsave()|call input("Press <cr> to continue")|call inputrestore()
      endif
      let mod=1
@@ -898,7 +903,7 @@ fun! s:NetWrite(...) range
     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
     if getline(1) !~ "^$"
      if  !exists("g:netrw_quiet")
-      echoerr getline(1)
+      echoerr "***netrw*** ".getline(1)
       call inputsave()|call input("Press <cr> to continue")|call inputrestore()
      endif
      let mod=1
@@ -927,7 +932,7 @@ fun! s:NetWrite(...) range
    " http: NetWrite Method #5
    elseif     b:netrw_method == 5
     if !exists("g:netrw_quiet")
-     echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
+     echoerr "***netrw*** currently <netrw.vim> does not support writing using http:"
      call inputsave()|call input("Press <cr> to continue")|call inputrestore()
     endif
  
@@ -1010,8 +1015,10 @@ fun! s:NetWrite(...) range
 "  call Dret("NetWrite")
 endfun
 
-" ------------------------------------------------------------------------
-"  Browsing Support For Remote Directories And Files:    {{{1
+" ===========================================
+"  Remote Directory Browsing Support:    {{{1
+" ===========================================
+
 " NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
 "  of the contents of a remote directory.  It is assumed that the
 "  g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
@@ -1040,7 +1047,7 @@ fun! <SID>NetBrowse(dirname)
   endif
 
   " make this buffer modifiable
-  setlocal ma
+  setlocal ma nonu nowrap
 
   " analyze a:dirname and g:netrw_list_cmd
   let dirpat  = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
@@ -1048,7 +1055,7 @@ fun! <SID>NetBrowse(dirname)
 "  call Decho("dirpat<".dirpat.">")
   if dirname !~ dirpat
    if !exists("g:netrw_quiet")
-    echoerr "NetBrowse: I don't understand your dirname<".dirname.">"
+    echoerr "***netrw*** netrw doesn't understand your dirname<".dirname.">"
     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
    endif
 "   call Dret("NetBrowse : badly formatted dirname<".dirname.">")
@@ -1080,7 +1087,7 @@ fun! <SID>NetBrowse(dirname)
 
   " optionally sort by time (-t) or by size (-S)
   if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
-   echoerr "***warning*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
+   echoerr "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
   else
    if g:netrw_sort_by =~ "^t"
@@ -1185,7 +1192,7 @@ fun! <SID>NetBrowse(dirname)
   exe 'nnoremap <buffer> <silent> R	:exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
   exe 'vnoremap <buffer> <silent> R	:call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
   nnoremap <buffer> ?			:he netrw-browse-cmds<cr>
-  setlocal ma nonu
+  setlocal ma nonu nowrap
 
   " Set up the banner
 "  call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
@@ -1251,9 +1258,9 @@ fun! <SID>NetBrowse(dirname)
     keepjumps norm! 0
 
     " more cleanup
-    exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
-    exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#'
-    exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#'
+    exe 'keepjumps silent! '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
+    exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
+    exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
    endif
 
   else
@@ -1307,7 +1314,11 @@ fun! <SID>NetBrowse(dirname)
    if line("$") >= s:netrw_bannercnt
     if g:netrw_sort_by =~ "^n"
      call s:SetSort()
-     exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
+     if v:version < 700
+      exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
+     else
+      exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
+     endif
      exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
     endif
     if g:netrw_longlist
@@ -1459,7 +1470,7 @@ fun! <SID>NetBrowseRm(usrhost,path) rang
 "       call Decho("returned=".ret." errcode=".v:shell_error)
      
        if v:shell_error != 0 && !exists("g:netrw_quiet")
-        echoerr "unable to remove directory<".rmfile."> -- is it empty?"
+        echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
         call inputsave()|call input("Press <cr> to continue")|call inputrestore()
        endif
       endif
@@ -1669,14 +1680,14 @@ fun! NetBrowseFtpCmd(path,cmd)
 
   " cleanup for Windows
   if has("win32") || has("win95") || has("win64") || has("win16")
-   keepjumps silent! %s/\r$//
+   keepjumps silent!! %s/\r$//e
   endif
   if a:cmd == "dir"
    " infer directory/link based on the file permission string
-   keepjumps silent g/d\%([-r][-w][-x]\)\{3}/s@$@/@
-   keepjumps silent g/l\%([-r][-w][-x]\)\{3}/s/$/@/
+   keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
+   keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
    if !g:netrw_longlist
-    exe "keepjumps silent ".curline.',$s/^\%(\S\+\s\+\)\{8}//'
+    exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
    endif
   endif
 
@@ -1782,7 +1793,7 @@ fun! <SID>NetLongList(mode)
 endfun
 
 " ---------------------------------------------------------------------
-" NetSaveWordPosn: used by the "s" command in both remote and local
+" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
 " browsing.  Along with NetRestoreWordPosn(), it keeps the cursor on
 " the same word even though the sorting has changed its order of appearance.
 fun! s:NetSaveWordPosn()
@@ -1792,7 +1803,7 @@ fun! s:NetSaveWordPosn()
 endfun
 
 " ---------------------------------------------------------------------
-" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above
+" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
 fun! s:NetRestoreWordPosn()
 "  call Dfunc("NetRestoreWordPosn()")
   silent! call search(s:netrw_saveword,'w')
@@ -1800,7 +1811,7 @@ fun! s:NetRestoreWordPosn()
 endfun
 
 " ---------------------------------------------------------------------
-" NetMakeDir: this function makes a directory (both local and remote)
+" NetMakeDir: this function makes a directory (both local and remote) {{{2
 fun! <SID>NetMakeDir(usrhost)
 "  call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
 
@@ -1825,7 +1836,7 @@ fun! <SID>NetMakeDir(usrhost)
 "   call Decho("fullnewdir<".fullnewdir.">")
    if isdirectory(fullnewdir)
     if !exists("g:netrw_quiet")
-     echoerr "***warning*** <".newdirname."> is already a directory!"
+     echoerr "***netrw*** <".newdirname."> is already a directory!"
      call inputsave()|call input("Press <cr> to continue")|call inputrestore()
     endif
 "    call Dret("NetMakeDir : directory<".newdirname."> exists previously")
@@ -1833,14 +1844,25 @@ fun! <SID>NetMakeDir(usrhost)
    endif
    if filereadable(fullnewdir)
     if !exists("g:netrw_quiet")
-     echoerr "***warning*** <".newdirname."> is already a file!"
+     echoerr "***netrw*** <".newdirname."> is already a file!"
      call inputsave()|call input("Press <cr> to continue")|call inputrestore()
     endif
 "    call Dret("NetMakeDir : file<".newdirname."> exists previously")
     return
    endif
-"   call Decho("exe silent! !".g:netrw_local_mkdir.' "'.fullnewdir.'"')
-   exe "silent! !".g:netrw_local_mkdir.' "'.fullnewdir.'"'
+
+   " requested new local directory is neither a pre-existing file or
+   " directory, so make it!
+   if exists("*mkdir")
+    call mkdir(fullnewdir,"p")
+   else
+    let netrw_origdir= s:NetGetcwd(1)
+    exe 'cd '.b:netrw_curdir
+"    call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
+"    call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
+    exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
+    if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
+   endif
 
    if v:shell_error == 0
     " refresh listing
@@ -1852,7 +1874,7 @@ fun! <SID>NetMakeDir(usrhost)
     exe "norm! ".hline."G0z\<CR>"
     exe linenum
    elseif !exists("g:netrw_quiet")
-    echoerr "***warning*** unable to make directory<".newdirname.">"
+    echoerr "***netrw*** unable to make directory<".newdirname.">"
     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
    endif
    redraw!
@@ -1872,7 +1894,7 @@ fun! <SID>NetMakeDir(usrhost)
     exe "norm! ".hline."G0z\<CR>"
     exe linenum
    elseif !exists("g:netrw_quiet")
-    echoerr "***warning*** unable to make directory<".newdirname.">"
+    echoerr "***netrw*** unable to make directory<".newdirname.">"
     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
    endif
    redraw!
@@ -1882,7 +1904,7 @@ fun! <SID>NetMakeDir(usrhost)
 endfun
 
 " ---------------------------------------------------------------------
-"  NetBookmarkDir:
+"  NetBookmarkDir: {{{2
 "    0: bookmark the current directory
 "    1: change to the bookmarked directory
 fun! <SID>NetBookmarkDir(chg,curdir)
@@ -1974,8 +1996,9 @@ fun! <SID>NetBookmarkDir(chg,curdir)
 "  call Dret("NetBookmarkDir")
 endfun
 
-" ---------------------------------------------------------------------
-"  Browsing Support For Local Directories And Files:    {{{1
+" ==========================================
+"  Local Directory Browsing Support:    {{{1
+" ==========================================
 
 " ---------------------------------------------------------------------
 " LocalBrowse: supports local file/directory browsing {{{2
@@ -1995,107 +2018,43 @@ fun! <SID>LocalBrowse(dirname)
 
   if v:version < 603
    if !exists("g:netrw_quiet")
-    echoerr "vim version<".v:version."> too old for browsing with netrw"
+    echoerr "***netrw*** vim version<".v:version."> too old for browsing with netrw"
     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
    endif
 "   call Dret("LocalBrowse : vim version<".v:version."> too old")
    return
   endif
 
+  " record autochdir setting and then insure its unset (tnx to David Fishburn)
+  let keep_autochdir= &autochdir
+  set noautochdir
+
   " record and change current directory
-  let netrw_origdir= s:NetGetcwd(1)
-  try
-    cd -
-    let netrw_altdir= s:NetGetcwd(1)
-    cd -
-  catch
-    let netrw_altdir= ''
-  endtry
-  exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
-"  call Decho("dirname<".a:dirname."> buf#".bufnr("%")." winnr=".winnr())
+  let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
+  if b:netrw_curdir =~ '[/\\]$'
+   let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
+  endif
+"  call Decho("b:netrw_curdir<".b:netrw_curdir.">")
+  " make netrw's idea of the current directory vim's if the user wishes
+  if g:netrw_keepdir
+"   call Decho("change directory: cd ".b:netrw_curdir)
+   exe 'cd '.b:netrw_curdir
+  endif
+
+  " change the name of the buffer to reflect the b:netrw_curdir
+  exe 'silent file '.escape(b:netrw_curdir,s:netrw_cd_escape)
 
   " make this buffer modifiable
   setlocal ma
 
-  " disable 'autochdir', it breaks things
-  set noautochdir
-
   " ---------------------------
   "  Perform Directory Listing:
-"  call Decho("Perform directory listing...")
-  " set up new buffer and map
-  " dirname   : current working directory, no escapes, has trailing /
-  " dirnamens : dirname, but with no trailing slash
-  " dirnamenr : buffer number containing dirnamens
-  " dirnamebuf: buffer's idea of dirname, with all \ -> /
-  let dirname    = s:NetGetcwd(0)
-  let dirnamens  = substitute(dirname,'[\/]$','','e')
-  let dirnamenr  = bufnr(dirnamens.'$')
-  let dirnamebuf = substitute(bufname(dirnamenr),'\\','/','ge')
-"  call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr))
-
-  if dirnamenr != 0 && dirnamebuf != dirnamens
-   " try keeping the trailing slash
-   let dirnamenr = bufnr(dirname.'$')
-"   call Decho("dirnamenr= bufnr(".dirname.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr)." (retry with /)")
-  endif
-
-  if dirnamenr != -1
-   " buffer already exists (hidden), so switch to it!
-"   call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
-"   call Dredir("ls!")
-   exe "b ".dirnamenr
-   exe 'silent! cd '.escape(dirname,s:netrw_cd_escape)
-"   call Decho("changed directory to<".dirname.">")
-   if a:dirname != "." && line("$") >= 5 && exists("b:netrw_curdir")
-    if b:netrw_curdir == dirname
-"     call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
-     if g:netrw_keepdir
-       if netrw_altdir != ''
-	 exe 'keepjumps cd '.netrw_altdir
-       endif
-       exe 'keepjumps cd '.netrw_origdir
-     endif
-     return
-    endif
-   endif
-"   call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")")
-"   call Decho("buffer name<".bufname("%")."> dirname<".dirname.">")
-   setlocal ma
-   keepjumps %d
-   let curdir= substitute(substitute(expand("%"),'\\','/','ge'),'[^/]$','&/','e')
-   if curdir != dirname
-    " set standard browser options on buffer
-    setlocal bt=nofile bh=hide nobl noswf
-    exe 'silent file '.escape(dirname,s:netrw_cd_escape)
-"    call Decho("errmsg1<".v:errmsg.">")
-"    call Decho("renamed buffer to<".escape(dirname,s:netrw_cd_escape).">")
-"    call Decho("yielding actual bufname<".bufname("%").">")
-   endif
-  else
-"   call Decho("generate new buffer named<".escape(dirname,' #').">")
-   silent! enew!
-   " set standard browser options on buffer
-   setlocal bt=nofile bh=hide nobl noswf nonu
-   exe 'silent file '.substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e')
-"   call Decho("errmsg2<".v:errmsg.">")
-"   call Decho("renamed buffer to<".substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e').">")
-"   call Decho("yielding actual bufname<".bufname("%").">")
-  endif
-  exe "setlocal ts=".g:netrw_maxfilenamelen
-
-  if bufname("#") == "" && bufnr("#") != -1
-   " the file command produces a lot of [No File] buffers
-"   call Decho("wiping out nofile buffer#".bufnr("#"))
-   exe bufnr("#")."bwipe"
-  endif
 
   " save current directory on directory history list
-  call <SID>NetBookmarkDir(3,s:NetGetcwd(0))
+  call <SID>NetBookmarkDir(3,b:netrw_curdir)
 
   " set up all the maps
 "  call Decho("Setting up local browser maps")
-  let b:netrw_curdir= s:NetGetcwd(1)
   nnoremap <buffer> <silent> <cr>	:exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
   nnoremap <buffer> <silent> <c-l>	:exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
   nnoremap <buffer> <silent> -		:exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
@@ -2131,7 +2090,7 @@ fun! <SID>LocalBrowse(dirname)
   keepjumps put ='\" ============================================================================'
   keepjumps 1d
   keepjumps put ='\" Directory Listing                                              (netrw '.g:loaded_netrw.')'
-  keepjumps put ='\"   '.dirname
+  keepjumps put ='\"   '.b:netrw_curdir
   let s:netrw_bannercnt= 3
 
   let sortby= g:netrw_sort_by
@@ -2171,7 +2130,7 @@ fun! <SID>LocalBrowse(dirname)
 "  call Decho("bannercnt=".s:netrw_bannercnt)
 
   " generate the requested directory listing
-  call LocalBrowseList(dirname)
+  call LocalBrowseList()
 
   " manipulate the directory listing (hide, sort)
   setlocal ft=netrwlist
@@ -2182,10 +2141,18 @@ fun! <SID>LocalBrowse(dirname)
    if line("$") >= s:netrw_bannercnt
     if g:netrw_sort_by =~ "^n"
      call s:SetSort()
-     exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
+     if v:version < 700
+      exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
+     else
+      exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
+     endif
      exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
     else
-     exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
+     if v:version < 700
+      exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
+     else
+      exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
+     endif
      exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
     endif
    endif
@@ -2193,30 +2160,25 @@ fun! <SID>LocalBrowse(dirname)
   exe s:netrw_bannercnt
 
   setlocal noma nomod nonu
-  if g:netrw_keepdir
-    if netrw_altdir != ''
-      exe 'keepjumps cd '.netrw_altdir
-    endif
-    exe 'keepjumps cd '.netrw_origdir
-  endif
+  let &autochdir= keep_autochdir
 
 "  call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
 endfun
 
 " ---------------------------------------------------------------------
 "  LocalBrowseList: does the job of "ls" for local directories {{{2
-fun! LocalBrowseList(dirname)
-"  call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
+fun! LocalBrowseList()
+"  call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
 
   " get the list of files contained in the current directory
-  let dirname    = escape(a:dirname,s:netrw_glob_escape)
-  let dirnamelen = strlen(a:dirname)
-  let filelist   = glob(dirname."*")
+  let dirname    = escape(b:netrw_curdir,s:netrw_glob_escape)
+  let dirnamelen = strlen(b:netrw_curdir)
+  let filelist   = glob(dirname."/*")
 "  call Decho("glob(dirname<".dirname.">,*)=".filelist)
   if filelist != ""
    let filelist= filelist."\n"
   endif
-  let filelist= filelist.glob(dirname.".*")
+  let filelist= filelist.glob(dirname."/.*")
 "  call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
 
   " if the directory name includes a "$", and possibly other characters,
@@ -2226,13 +2188,13 @@ fun! LocalBrowseList(dirname)
    if filelist == ""
     let filelist= dirname."."
    else
-    let filelist= filelist."\n".a:dirname."."
+    let filelist= filelist."\n".b:netrw_curdir."."
    endif
 "  call Decho("filelist<".filelist.">")
   endif
   if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
 "   call Decho("forcibly tacking on ..")
-   let filelist= filelist."\n".a:dirname.".."
+   let filelist= filelist."\n".b:netrw_curdir.".."
 "  call Decho("filelist<".filelist.">")
   endif
   let filelist= substitute(filelist,'\n\{2,}','\n','ge')
@@ -2243,41 +2205,47 @@ fun! LocalBrowseList(dirname)
 
   while filelist != ""
    if filelist =~ '\n'
-    let file     = substitute(filelist,'\n.*$','','e')
+    let filename = substitute(filelist,'\n.*$','','e')
     let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
    else
-    let file     = filelist
+    let filename = filelist
     let filelist = ""
    endif
-   let pfile= file
-   if isdirectory(file)
-    let pfile= file."/"
+   let pfile= filename
+   if isdirectory(filename)
+    let pfile= filename."/"
    endif
+   let pfile= substitute(pfile,'^/','','e')
    if pfile =~ '//$'
     let pfile= substitute(pfile,'//$','/','e')
    endif
    let pfile= strpart(pfile,dirnamelen)
+"   call Decho(" ")
+"   call Decho("filename<".filename.">")
+"   call Decho("pfile   <".pfile.">")
+
    if g:netrw_longlist
-    let sz   = getfsize(file)
+    let sz   = getfsize(filename)
     let fsz  = strpart("               ",1,15-strlen(sz)).sz
-    let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
+    let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
+"    call Decho("sz=".sz." fsz=".fsz)
    endif
 
    if     g:netrw_sort_by =~ "^t"
     " sort by time (handles time up to 1 quintillion seconds, US)
-"    call Decho("getftime(".file.")=".getftime(file))
-    let t  = getftime(file)
+"    call Decho("getftime(".filename.")=".getftime(filename))
+    let t  = getftime(filename)
     let ft = strpart("000000000000000000",1,18-strlen(t)).t
-"    call Decho("exe keepjumps put ='".ft.'/'.file."'")
+"    call Decho("exe keepjumps put ='".ft.'/'.filename."'")
     let ftpfile= ft.'/'.pfile
     keepjumps put=ftpfile
 
    elseif g:netrw_sort_by =~ "^s"
     " sort by size (handles file sizes up to 1 quintillion bytes, US)
-"    call Decho("getfsize(".file.")=".getfsize(file))
-    let sz   = getfsize(file)
+"    call Decho("getfsize(".filename.")=".getfsize(filename))
+    let sz   = getfsize(filename)
     let fsz  = strpart("000000000000000000",1,18-strlen(sz)).sz
-"    call Decho("exe keepjumps put ='".fsz.'/'.file."'")
+"    call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
     let fszpfile= fsz.'/'.pfile
     keepjumps put =fszpfile
 
@@ -2287,6 +2255,7 @@ fun! LocalBrowseList(dirname)
     keepjumps put=pfile
    endif
   endwhile
+  setlocal ts=32
 
 "  call Dret("LocalBrowseList")
 endfun
@@ -2305,6 +2274,8 @@ fun! <SID>LocalBrowseChgDir(dirname,newd
    " is removing the "/".  Bad idea, so I have to put it back.
    let dirname= dirname.'/'
 "   call Decho("adjusting dirname<".dirname.">")
+   setlocal ma
+   %d
   endif
 
   if newdir !~ '[\/]$'
@@ -2313,24 +2284,28 @@ fun! <SID>LocalBrowseChgDir(dirname,newd
 "   call Decho("handling a file: dirname<".dirname.">")
    " this lets NetBrowseX avoid the edit
    if a:0 < 1
-    exe "e ".escape(dirname,s:netrw_cd_escape)
+"    call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
+"    call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
+    exe "e! ".escape(dirname,s:netrw_cd_escape)
    endif
 
   elseif newdir == './'
    " refresh the directory list
 "   call Decho("refresh directory listing")
-   setlocal ma
-   %d
 
   elseif newdir == '../'
    " go up one directory
    let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
 "   call Decho("go up one dir: dirname<".dirname.">")
+   setlocal ma
+   %d
 
   else
    " go down one directory
    let dirname= dirname.newdir
 "   call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
+   setlocal ma
+   %d
   endif
 
 "  call Dret("LocalBrowseChgDir <".dirname.">")
@@ -2364,7 +2339,7 @@ fun! <SID>LocalBrowseRm(path) range
    endif
 
    norm! 0
-   let rmfile= a:path.curword
+   let rmfile= a:path."/".curword
 "   call Decho("rmfile<".rmfile.">")
 
    if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
@@ -2417,11 +2392,11 @@ fun! <SID>LocalBrowseRm(path) range
 "        call Decho("3rd attempt to remove directory<".rmfile.">")
 	call system("rm ".rmfile)
         if v:shell_error != 0 && !exists("g:netrw_quiet")
-         echoerr "unable to remove directory<".rmfile."> -- is it empty?"
+         echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
          call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 	endif
        elseif !exists("g:netrw_quiet")
-        echoerr "unable to remove directory<".rmfile."> -- is it empty?"
+        echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
         call inputsave()|call input("Press <cr> to continue")|call inputrestore()
        endif
       endif
@@ -2475,8 +2450,8 @@ fun! <SID>LocalBrowseRename(path) range
    let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
    call inputrestore()
 
-   let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
-"   call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
+   let ret= rename(oldname,newname)
+"   call Decho("renaming <".oldname."> to <".newname.">")
 
    let ctr= ctr + 1
   endwhile
@@ -2497,17 +2472,55 @@ fun! <SID>LocalPreview(path) range
    if !isdirectory(a:path)
     exe "pedit ".a:path
    elseif !exists("g:netrw_quiet")
-    echoerr "sorry, cannot preview a directory such as <".a:path.">"
+    echoerr "***netrw*** sorry, cannot preview a directory such as <".a:path.">"
     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
    endif
   elseif !exists("g:netrw_quiet")
-   echoerr "sorry, to preview your vim needs the quickfix feature compiled in"
+   echoerr "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in"
    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
   endif
 "  call Dret("LocalPreview")
 endfun
 
 " ---------------------------------------------------------------------
+" 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
+fun! s:Explore(dosplit,style,...)
+"  call Dfunc("Explore(dosplit=".a:dosplit." style=".a:style.")")
+
+  " if dosplit or file has been modified
+  if a:dosplit || &modified
+   if a:style == 0      " Explore, Sexplore
+    exe g:netrw_winsize."wincmd s"
+   elseif a:style == 1  "Explore!, Sexplore!
+    exe g:netrw_winsize."wincmd v"
+   elseif a:style == 2  " Hexplore
+    exe "bel ".g:netrw_winsize."wincmd s"
+   elseif a:style == 3  " Hexplore!
+    exe "abo ".g:netrw_winsize."wincmd s"
+   elseif a:style == 4  " Vexplore
+    exe "lefta ".g:netrw_winsize."wincmd v"
+   elseif a:style == 5  " Vexplore!
+    exe "rightb ".g:netrw_winsize."wincmd v"
+   endif
+  endif
+  norm! 0
+
+  if a:1 == ""
+   let newdir= substitute(expand("%:p"),'^\(.*\)[/\\][^/\\]*$','\1','e')
+  else
+   let newdir= a:1
+  endif
+"  call Decho("newdir<".newdir.">")
+  call s:LocalBrowse(newdir)
+
+"  call Dret("Explore")
+endfun
+
+" ---------------------------------------------------------------------
 " NetGetcwd: get the current directory. {{{2
 "   Change backslashes to forward slashes, if any.
 "   If doesc is true, escape certain troublesome characters
@@ -2559,7 +2572,7 @@ fun! s:NetMethod(choice)  " globals: met
   let mipf     = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
   let mf       = '^\(\S\+\)\s\+\(\S\+\)$'
   let ftpurm   = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
-  let rcpurm   = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
+  let rcpurm   = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
   let rcphf    = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
   let scpurm   = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
   let httpurm  = '^http://\([^/]\{-}\)\(/.*\)\=$'
@@ -2573,10 +2586,10 @@ fun! s:NetMethod(choice)  " globals: met
   " rcp://user@hostname/...path-to-file
   if match(a:choice,rcpurm) == 0
 "   call Decho("rcp://...")
-   let b:netrw_method = 1
-   let userid	     = substitute(a:choice,rcpurm,'\2',"")
-   let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
-   let b:netrw_fname  = substitute(a:choice,rcpurm,'\4',"")
+   let b:netrw_method  = 1
+   let userid          = substitute(a:choice,rcpurm,'\1',"")
+   let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
+   let b:netrw_fname   = substitute(a:choice,rcpurm,'\3',"")
    if userid != ""
     let g:netrw_uid= userid
    endif
@@ -2585,9 +2598,9 @@ fun! s:NetMethod(choice)  " globals: met
   elseif match(a:choice,scpurm) == 0
 "   call Decho("scp://...")
    let b:netrw_method = 4
-   let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
-   let g:netrw_port   = substitute(a:choice,scpurm,'\2',"")
-   let b:netrw_fname  = substitute(a:choice,scpurm,'\3',"")
+   let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
+   let g:netrw_port    = substitute(a:choice,scpurm,'\2',"")
+   let b:netrw_fname   = substitute(a:choice,scpurm,'\3',"")
  
   " http://user@hostname/...path-to-file
   elseif match(a:choice,httpurm) == 0
@@ -2699,7 +2712,7 @@ fun! s:NetMethod(choice)  " globals: met
  
   else
    if !exists("g:netrw_quiet")
-    echoerr "***error*** cannot determine method"
+    echoerr "***netrw*** cannot determine method"
     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
    endif
    let b:netrw_method  = -1
@@ -2840,9 +2853,10 @@ endif
 
 " ---------------------------------------------------------------------
 " NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
-fun! <SID>NetSort() range
-"  call Dfunc("NetSort()")
-
+if v:version < 700
+ fun! <SID>NetSort() range
+" "  call Dfunc("NetSort()")
+ 
   let i = a:firstline + 1
   while i <= a:lastline
     " find insertion point via binary search
@@ -2850,36 +2864,37 @@ fun! <SID>NetSort() range
     let lo    = a:firstline
     let hi    = i
     while lo < hi
-      let mid     = (lo + hi) / 2
-      let mid_val = getline(mid)
-      if g:netrw_sort_direction =~ '^n'
-       " normal sorting order
-       if i_val < mid_val
-         let hi = mid
-       else
-         let lo = mid + 1
-         if i_val == mid_val | break | endif
-       endif
+     let mid     = (lo + hi) / 2
+     let mid_val = getline(mid)
+     if g:netrw_sort_direction =~ '^n'
+      " normal sorting order
+      if i_val < mid_val
+       let hi = mid
       else
-       " reverse sorting order
-       if i_val > mid_val
-         let hi = mid
-       else
-         let lo = mid + 1
-         if i_val == mid_val | break | endif
-       endif
+       let lo = mid + 1
+       if i_val == mid_val | break | endif
       endif
+     else
+      " reverse sorting order
+      if i_val > mid_val
+       let hi = mid
+      else
+       let lo = mid + 1
+       if i_val == mid_val | break | endif
+      endif
+     endif
     endwhile
     " do insert
     if lo < i
-      exe 'keepjumps '.i.'d_'
-      keepjumps call append(lo - 1, i_val)
+     exe 'keepjumps '.i.'d_'
+     keepjumps call append(lo - 1, i_val)
     endif
     let i = i + 1
   endwhile
-
-"  call Dret("NetSort")
-endfun
+ 
+" "  call Dret("NetSort")
+ endfun
+endif
 
 " ---------------------------------------------------------------------
 " SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
@@ -2938,8 +2953,8 @@ fun! <SID>SetSort()
 "  call Dret("SetSort")
 endfun
 
+let &cpo= s:keepcpo
+unlet s:keepcpo
 " ------------------------------------------------------------------------
-" Restore {{{1
-let &cpo= s:save_cpo
-unlet s:save_cpo
+" Modelines: {{{1
 " vim:ts=8 fdm=marker