updated for version 7.0131
diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
new file mode 100644
index 0000000..e077e25
--- /dev/null
+++ b/runtime/autoload/netrw.vim
@@ -0,0 +1,3355 @@
+" netrw.vim: Handles file transfer and remote directory listing across a network
+" AUTOLOAD PORTION
+" Last Change: Aug 16, 2005
+" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
+" Version: 63
+" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
+" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
+" Permission is hereby granted to use and distribute this code,
+" with or without modifications, provided that this copyright
+" notice is copied with it. Like anything else that's free,
+" netrw.vim is provided *as is* and comes with no warranty
+" of any kind, either expressed or implied. By using this
+" plugin, you agree that in no event will the copyright
+" holder be liable for any damages resulting from the use
+" of this software.
+"
+" But be doers of the Word, and not only hearers, deluding your own selves {{{1
+" (James 1:22 RSV)
+" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+let s:keepcpo= &cpo
+set cpo&vim
+" call Decho("doing autoload/netrw.vim")
+
+" ---------------------------------------------------------------------
+" Default values for global netrw variables {{{1
+if !exists("g:netrw_ftpmode")
+ let g:netrw_ftpmode= "binary"
+endif
+if !exists("g:netrw_win95ftp")
+ let g:netrw_win95ftp= 1
+endif
+if !exists("g:netrw_cygwin")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if &shell == "bash"
+ let g:netrw_cygwin= 1
+ else
+ let g:netrw_cygwin= 0
+ endif
+ else
+ let g:netrw_cygwin= 0
+ endif
+endif
+if !exists("g:netrw_list_cmd")
+ if executable("ssh")
+ " 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 with ssh")
+ let g:netrw_list_cmd= ""
+ endif
+endif
+if !exists("g:netrw_ftp_list_cmd")
+ if has("unix") || exists("g:netrw_cygwin")
+ let g:netrw_ftp_list_cmd= "ls -lF"
+ else
+ let g:netrw_ftp_list_cmd= "dir"
+ endif
+endif
+if !exists("g:netrw_rm_cmd")
+ let g:netrw_rm_cmd = "ssh HOSTNAME rm"
+endif
+if !exists("g:netrw_rmf_cmd")
+ let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
+endif
+if !exists("g:netrw_rmdir_cmd")
+ let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
+endif
+if !exists("g:netrw_rename_cmd")
+ let g:netrw_rename_cmd= "ssh HOSTNAME mv"
+endif
+if exists("g:netrw_silent") && g:netrw_silent != 0
+ let g:netrw_silentxfer= "silent "
+else
+ let g:netrw_silentxfer= ""
+endif
+if !exists("g:netrw_winsize")
+ let g:netrw_winsize= ""
+endif
+if !exists("g:netrw_list_hide")
+ let g:netrw_list_hide= ""
+endif
+if !exists("g:netrw_sort_by")
+ " alternatives: date size
+ let g:netrw_sort_by= "name"
+endif
+if !exists("g:netrw_sort_sequence")
+ let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
+endif
+if !exists("g:netrw_sort_direction")
+ " alternative: reverse (z y x ...)
+ let g:netrw_sort_direction= "normal"
+endif
+if !exists("g:netrw_longlist") || g:netrw_longlist == 0
+ let g:netrw_longlist= 0
+ let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
+else
+ let g:netrw_longlist= 1
+ let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
+endif
+if !exists("g:netrw_list_cmd")
+endif
+if !exists("g:netrw_timefmt")
+ let g:netrw_timefmt= "%c"
+endif
+if !exists("g:netrw_local_rmdir")
+ let g:netrw_local_rmdir= "rmdir"
+endif
+if !exists("g:netrw_local_mkdir")
+ let g:netrw_local_mkdir= "mkdir"
+endif
+if !exists("g:netrw_mkdir_cmd")
+ let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
+endif
+if !exists("g:netrw_hide")
+ let g:netrw_hide= 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
+if !exists("g:netrw_ssh_browse_reject")
+ let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
+endif
+if !exists("g:netrw_keepdir")
+ let g:netrw_keepdir= 1
+endif
+if !exists("s:netrw_cd_escape")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let s:netrw_cd_escape="#% "
+ else
+ let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
+ endif
+endif
+if !exists("s:netrw_glob_escape")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let s:netrw_glob_escape= ""
+ else
+ let s:netrw_glob_escape= '[]*?`{~$'
+ endif
+endif
+if !exists("g:netrw_alto")
+ let g:netrw_alto= 0
+endif
+if !exists("g:netrw_altv")
+ let g:netrw_altv= 0
+endif
+if !exists("g:netrw_maxfilenamelen")
+ let g:netrw_maxfilenamelen= 32
+endif
+if !exists("g:netrw_dirhistmax")
+ let g:netrw_dirhistmax= 10
+endif
+if !exists("g:NETRW_DIRHIST_CNT")
+ let g:NETRW_DIRHIST_CNT= 0
+endif
+
+" BufEnter event ignored by decho when following variable is true
+" Has a side effect that doau BufReadPost doesn't work, so
+" files read by network transfer aren't appropriately highlighted.
+"let g:decho_bufenter = 1 "Decho
+
+" ---------------------------------------------------------------------
+" Default values for global protocol variables {{{1
+if !exists("g:netrw_rcp_cmd")
+ let g:netrw_rcp_cmd = "rcp"
+endif
+if !exists("g:netrw_ftp_cmd")
+ let g:netrw_ftp_cmd = "ftp"
+endif
+if !exists("g:netrw_scp_cmd")
+ let g:netrw_scp_cmd = "scp -q"
+endif
+if !exists("g:netrw_sftp_cmd")
+ let g:netrw_sftp_cmd = "sftp"
+endif
+if !exists("g:netrw_http_cmd")
+ if executable("wget")
+ let g:netrw_http_cmd = "wget -q -O"
+ elseif executable("fetch")
+ let g:netrw_http_cmd = "fetch -o"
+ else
+ let g:netrw_http_cmd = ""
+ endif
+endif
+if !exists("g:netrw_dav_cmd")
+ let g:netrw_dav_cmd = "cadaver"
+endif
+if !exists("g:netrw_rsync_cmd")
+ let g:netrw_rsync_cmd = "rsync"
+endif
+if !exists("g:netrw_fetch_cmd")
+ if executable("fetch")
+ let g:netrw_fetch_cmd = "fetch -o"
+ else
+ let g:netrw_fetch_cmd = ""
+ endif
+endif
+
+if has("win32") || has("win95") || has("win64") || has("win16")
+ \ && exists("g:netrw_use_nt_rcp")
+ \ && g:netrw_use_nt_rcp
+ \ && executable( $SystemRoot .'/system32/rcp.exe')
+ let s:netrw_has_nt_rcp = 1
+ let s:netrw_rcpmode = '-b'
+ else
+ let s:netrw_has_nt_rcp = 0
+ let s:netrw_rcpmode = ''
+endif
+
+" ------------------------------------------------------------------------
+" NetSavePosn: saves position of cursor on screen {{{1
+fun! netrw#NetSavePosn()
+" call Dfunc("NetSavePosn()")
+ " Save current line and column
+ let w:netrw_winnr= winnr()
+ let w:netrw_line = line(".")
+ let w:netrw_col = virtcol(".")
+
+ " Save top-of-screen line
+ norm! H0
+ let w:netrw_hline= line(".")
+
+ call netrw#NetRestorePosn()
+" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
+endfun
+
+" ------------------------------------------------------------------------
+" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
+fun! netrw#NetRestorePosn()
+" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
+ let eikeep= &ei
+ set ei=all
+
+ " restore window
+" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
+ exe "silent! ".w:netrw_winnr."wincmd w"
+" if v:shell_error == 0
+" " as suggested by Bram M: redraw on no error
+" " allows protocol error messages to remain visible
+" redraw!
+" endif
+
+ " restore top-of-screen line
+" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
+ exe "norm! ".w:netrw_hline."G0z\<CR>"
+
+ " restore position
+" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
+ exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
+
+ let &ei= eikeep
+" call Dret("NetRestorePosn")
+endfun
+
+" ------------------------------------------------------------------------
+" NetRead: responsible for reading a file over the net {{{1
+fun! netrw#NetRead(...)
+" call Dfunc("NetRead(a:1<".a:1.">)")
+
+ " save options
+ call s:NetOptionSave()
+
+ " Special Exception: if a file is named "0r", then
+ " "0r" will be used to read the
+ " following files instead of "r"
+ if a:0 == 0
+ let readcmd= "r"
+ let ichoice= 0
+ elseif a:1 == "0r"
+ let readcmd = "0r"
+ let ichoice = 2
+ else
+ let readcmd = "r"
+ let ichoice = 1
+ endif
+
+ " get name of a temporary file and set up shell-quoting character
+ let tmpfile= tempname()
+ if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
+ echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" call Dret("NetRead")
+ return
+ endif
+
+" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
+ while ichoice <= a:0
+
+ " attempt to repeat with previous host-file-etc
+ if exists("b:netrw_lastfile") && a:0 == 0
+" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
+ let choice = b:netrw_lastfile
+ let ichoice= ichoice + 1
+
+ else
+ exe "let choice= a:" . ichoice
+" call Decho("no lastfile: choice<" . choice . ">")
+
+ if match(choice,"?") == 0
+ " give help
+ echomsg 'NetRead Usage:'
+ echomsg ':Nread machine:path uses rcp'
+ echomsg ':Nread "machine path" uses ftp with <.netrc>'
+ echomsg ':Nread "machine id password path" uses ftp'
+ echomsg ':Nread dav://machine[:port]/path uses cadaver'
+ echomsg ':Nread fetch://machine/path uses fetch'
+ echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
+ echomsg ':Nread http://[user@]machine/path uses http wget'
+ echomsg ':Nread rcp://[user@]machine/path uses rcp'
+ echomsg ':Nread rsync://machine[:port]/path uses rsync'
+ echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
+ echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
+ break
+
+ elseif match(choice,"^\"") != -1
+ " Reconstruct Choice if choice starts with '"'
+" call Decho("reconstructing choice")
+ if match(choice,"\"$") != -1
+ " case "..."
+ let choice=strpart(choice,1,strlen(choice)-2)
+ else
+ " case "... ... ..."
+ let choice = strpart(choice,1,strlen(choice)-1)
+ let wholechoice = ""
+
+ while match(choice,"\"$") == -1
+ let wholechoice = wholechoice . " " . choice
+ let ichoice = ichoice + 1
+ if ichoice > a:0
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("NetRead")
+ return
+ endif
+ let choice= a:{ichoice}
+ endwhile
+ let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
+ endif
+ endif
+ endif
+
+" call Decho("choice<" . choice . ">")
+ let ichoice= ichoice + 1
+
+ " fix up windows urls
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let choice = substitute(choice,'\\','/','ge')
+" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
+
+ exe 'lcd ' . fnamemodify(tmpfile,':h')
+ let tmpfile = fnamemodify(tmpfile,':t')
+ endif
+
+ " Determine method of read (ftp, rcp, etc)
+ call s:NetMethod(choice)
+
+ " Check if NetBrowse() should be handling this request
+" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
+ if choice =~ "^.*[\/]$"
+ keepjumps call s:NetBrowse(choice)
+" call Dret("NetRead")
+ return
+ endif
+
+ " ============
+ " Perform Read
+ " ============
+
+ ".........................................
+ " rcp: NetRead Method #1
+ if b:netrw_method == 1 " read with rcp
+" call Decho("read via rcp (method #1)")
+ " ER: noting done with g:netrw_uid yet?
+ " ER: on Win2K" rcp machine[.user]:file tmpfile
+ " ER: if machine contains '.' adding .user is required (use $USERNAME)
+ " ER: the tmpfile is full path: rcp sees C:\... as host C
+ if s:netrw_has_nt_rcp == 1
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_machine .'.'. g:netrw_uid
+ else
+ " Any way needed it machine contains a '.'
+ let uid_machine = g:netrw_machine .'.'. $USERNAME
+ endif
+ else
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ endif
+" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + <.netrc>: NetRead Method #2
+ elseif b:netrw_method == 2 " read with ftp + <.netrc>
+" call Decho("read via ftp+.netrc (method #2)")
+ let netrw_fname= b:netrw_fname
+ new
+ setlocal ff=unix
+ exe "put ='".g:netrw_ftpmode."'"
+ exe "put ='"."get ".netrw_fname." ".tmpfile."'"
+ if exists("g:netrw_port") && g:netrw_port != ""
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
+ exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+ else
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
+ exe g:netrw_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") && getline(1) !~ '^Trying '
+ let debugkeep= &debug
+ set debug=msg
+ echohl Error | echo "***netrw*** ".getline(1) | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ let &debug= debugkeep
+ endif
+ bd!
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + machine,id,passwd,filename: NetRead Method #3
+ elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
+ " Construct execution string (four lines) which will be passed through filter
+" call Decho("read via ftp+mipf (method #3)")
+ let netrw_fname= b:netrw_fname
+ new
+ 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
+
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ put =g:netrw_uid
+ put =g:netrw_passwd
+ else
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+ endif
+
+ if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
+ put =g:netrw_ftpmode
+ endif
+ put ='get '.netrw_fname.' '.tmpfile
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+" call Decho('performing ftp -i -n')
+ norm! 1Gdd
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
+ exe g:netrw_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)
+ if getline(1) !~ "^$"
+" call Decho("error<".getline(1).">")
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** ".getline(1) | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ endif
+ bd!
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " scp: NetRead Method #4
+ elseif b:netrw_method == 4 " read with scp
+" call Decho("read via scp (method #4)")
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " -P ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+ exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+ else
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ endif
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ elseif b:netrw_method == 5 " read with http (wget)
+" call Decho("read via http (method #5)")
+ if g:netrw_http_cmd == ""
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ exit
+ endif
+
+ if match(b:netrw_fname,"#") == -1
+ " simple wget
+" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+
+ else
+ " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
+ let netrw_html= substitute(b:netrw_fname,"#.*$","","")
+ let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
+" call Decho("netrw_html<".netrw_html.">")
+" call Decho("netrw_tag <".netrw_tag.">")
+" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
+ exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
+ exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
+ endif
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " cadaver: NetRead Method #6
+ elseif b:netrw_method == 6 " read with cadaver
+" call Decho("read via cadaver (method #6)")
+
+ " Construct execution string (four lines) which will be passed through filter
+ let netrw_fname= b:netrw_fname
+ new
+ 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.' '.g:netrw_passwd
+
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+ put ='get '.netrw_fname.' '.cygtmpfile
+ else
+ put ='get '.netrw_fname.' '.tmpfile
+ endif
+ put ='quit'
+
+ " perform cadaver operation:
+ norm! 1Gdd
+" call Decho("executing: %!".g:netrw_dav_cmd)
+ exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
+ bd!
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " rsync: NetRead Method #7
+ elseif b:netrw_method == 7 " read with rsync
+" call Decho("read via rsync (method #7)")
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+ exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+ else
+" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ endif
+ let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " fetch: NetRead Method #8
+ " fetch://[user@]host[:http]/path
+ elseif b:netrw_method == 8 " read with fetch
+ if g:netrw_fetch_cmd == ""
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** fetch command not available" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ exit
+ endif
+ if exists("g:netrw_option") && g:netrw_option == ":http"
+ let netrw_option= "http"
+ else
+ let netrw_option= "ftp"
+ endif
+" call Decho("read via fetch for ".netrw_option)
+
+ if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
+" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
+ else
+" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
+ endif
+
+ let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " sftp: NetRead Method #9
+ elseif b:netrw_method == 9 " read with sftp
+" call Decho("read via sftp (method #4)")
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
+ exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+ else
+" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
+ exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+ endif
+ let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ else " Complain
+ echo "***warning*** unable to comply with your request<" . choice . ">"
+ endif
+ endwhile
+
+ " cleanup
+" call Decho("cleanup")
+ if exists("b:netrw_method")
+ unlet b:netrw_method
+ unlet b:netrw_fname
+ endif
+ call s:NetOptionRestore()
+
+" call Dret("NetRead")
+endfun
+
+" ------------------------------------------------------------------------
+" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
+fun! s:NetGetFile(readcmd, fname, method)
+" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
+
+ if exists("*NetReadFixup")
+ " for the use of NetReadFixup (not otherwise used internally)
+ let line2= line("$")
+ endif
+
+ " transform paths from / to \ for Windows (except for cygwin)
+ if &term == "win32"
+ if g:netrw_cygwin
+ let fname= a:fname
+" call Decho("(win32 && cygwin) fname<".fname.">")
+ else
+ let fname= substitute(a:fname,'/','\\\\','ge')
+" call Decho("(win32 && !cygwin) fname<".fname.">")
+ endif
+ else
+ let fname= a:fname
+" call Decho("(copied) fname<".fname.">")
+ endif
+
+ if a:readcmd[0] == '0'
+ " get file into buffer
+
+ " record remote filename
+ let rfile= bufname(".")
+" call Decho("remotefile<".rfile.">")
+" call Dredir("ls!","starting buffer list")
+
+ " rename the current buffer to the temp file (ie. fname)
+ if v:version < 700
+ exe "file ".fname
+ else
+ keepalt exe "file ".fname
+ endif
+" 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
+ if v:version < 700
+ exe "file ".rfile
+ else
+ keepalt exe "file ".rfile
+ endif
+" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
+ let line1 = 1
+ let line2 = line("$")
+
+ elseif filereadable(fname)
+ " read file after current line
+ let curline = line(".")
+ let lastline= line("$")
+" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
+ exe a:readcmd." ".v:cmdarg." ".fname
+ let line1 = curline + 1
+ let line2 = line("$") - lastline + 1
+ let s:netrw_line = s:netrw_line + 1
+ let s:netrw_col = 1
+ else
+ " not readable
+" call Dret("NetGetFile : fname<".fname."> not readable")
+ return
+ endif
+
+ " User-provided (ie. optional) fix-it-up command
+ 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
+ if has("gui") && has("gui_running")
+ silent! emenu Buffers.Refresh\ menu
+ endif
+
+" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
+
+ " insure that we have the right filetype and that its being displayed
+ filetype detect
+ redraw!
+" call Dret("NetGetFile")
+endfun
+
+" ------------------------------------------------------------------------
+" NetWrite: responsible for writing a file over the net {{{1
+fun! netrw#NetWrite(...) range
+" call Dfunc("NetWrite(a:0=".a:0.")")
+
+ " option handling
+ let mod= 0
+ call s:NetOptionSave()
+
+ " Get Temporary Filename
+ let tmpfile= tempname()
+ if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
+ echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" call Dret("NetRead")
+ return
+ endif
+
+ if a:0 == 0
+ let ichoice = 0
+ else
+ let ichoice = 1
+ endif
+
+ " write (selected portion of) file to temporary
+ silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
+
+ while ichoice <= a:0
+
+ " attempt to repeat with previous host-file-etc
+ if exists("b:netrw_lastfile") && a:0 == 0
+" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
+ let choice = b:netrw_lastfile
+ let ichoice= ichoice + 1
+ else
+ exe "let choice= a:" . ichoice
+
+ " Reconstruct Choice if choice starts with '"'
+ if match(choice,"?") == 0
+ echomsg 'NetWrite Usage:"'
+ echomsg ':Nwrite machine:path uses rcp'
+ echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
+ echomsg ':Nwrite "machine id password path" uses ftp'
+ echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
+ echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
+ echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
+ echomsg ':Nwrite rcp://machine/path uses rcp'
+ echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
+ echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
+ echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
+ break
+
+ elseif match(choice,"^\"") != -1
+ if match(choice,"\"$") != -1
+ " case "..."
+ let choice=strpart(choice,1,strlen(choice)-2)
+ else
+ " case "... ... ..."
+ let choice = strpart(choice,1,strlen(choice)-1)
+ let wholechoice = ""
+
+ while match(choice,"\"$") == -1
+ let wholechoice= wholechoice . " " . choice
+ let ichoice = ichoice + 1
+ if choice > a:0
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("NetWrite")
+ return
+ endif
+ let choice= a:{ichoice}
+ endwhile
+ let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
+ endif
+ endif
+ endif
+" call Decho("choice<" . choice . ">")
+ let ichoice= ichoice + 1
+
+ " fix up windows urls
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let choice= substitute(choice,'\\','/','ge')
+ "ER: see NetRead()
+ exe 'lcd ' . fnamemodify(tmpfile,':h')
+ let tmpfile = fnamemodify(tmpfile,':t')
+ endif
+
+ " Determine method of read (ftp, rcp, etc)
+ call s:NetMethod(choice)
+
+ " =============
+ " Perform Write
+ " =============
+
+ ".........................................
+ " rcp: NetWrite Method #1
+ if b:netrw_method == 1 " write with rcp
+" Decho "write via rcp (method #1)"
+ if s:netrw_has_nt_rcp == 1
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_machine .'.'. g:netrw_uid
+ else
+ let uid_machine = g:netrw_machine .'.'. $USERNAME
+ endif
+ else
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ endif
+" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + <.netrc>: NetWrite Method #2
+ elseif b:netrw_method == 2 " write with ftp + <.netrc>
+ let netrw_fname = b:netrw_fname
+ new
+ setlocal ff=unix
+ exe "put ='".g:netrw_ftpmode."'"
+" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
+ exe "put ='"."put ".tmpfile." ".netrw_fname."'"
+" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
+ if exists("g:netrw_port") && g:netrw_port != ""
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
+ exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+ else
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
+ exe g:netrw_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) !~ "^$"
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** ".getline(1) | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ let mod=1
+ endif
+ bd!
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " ftp + machine, id, passwd, filename: NetWrite Method #3
+ elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
+ let netrw_fname= b:netrw_fname
+ 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
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ put =g:netrw_uid
+ put =g:netrw_passwd
+ else
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+ endif
+ put ='put '.tmpfile.' '.netrw_fname
+ " save choice/id/password for future use
+ let b:netrw_lastfile = choice
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+" call Decho('performing ftp -i -n')
+ norm! 1Gdd
+" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
+ exe g:netrw_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)
+ if getline(1) !~ "^$"
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** ".getline(1) | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ let mod=1
+ endif
+ bd!
+
+ ".........................................
+ " scp: NetWrite Method #4
+ elseif b:netrw_method == 4 " write with scp
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " -P ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ else
+" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ endif
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " http: NetWrite Method #5
+ elseif b:netrw_method == 5
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+
+ ".........................................
+ " dav: NetWrite Method #6
+ elseif b:netrw_method == 6 " write with cadaver
+" call Decho("write via cadaver (method #6)")
+
+ " Construct execution string (four lines) which will be passed through filter
+ let netrw_fname= b:netrw_fname
+ new
+ 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.' '.g:netrw_passwd
+
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+ put ='put '.cygtmpfile.' '.netrw_fname
+ else
+ put ='put '.tmpfile.' '.netrw_fname
+ endif
+
+ " perform cadaver operation:
+ norm! 1Gdd
+" call Decho("executing: %!".g:netrw_dav_cmd)
+ exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
+ bd!
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " rsync: NetWrite Method #7
+ elseif b:netrw_method == 7 " write with rsync
+ if g:netrw_cygwin == 1
+ let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
+" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ else
+" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+ exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+ endif
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " scp: NetWrite Method #9
+ elseif b:netrw_method == 9 " write with sftp
+ let netrw_fname= b:netrw_fname
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ new
+ setlocal ff=unix
+ put ='put '.tmpfile.' '.netrw_fname
+ norm! 1Gdd
+" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
+ exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
+ bd!
+ let b:netrw_lastfile= choice
+
+ ".........................................
+ else " Complain
+ echo "***warning*** unable to comply with your request<" . choice . ">"
+ endif
+ endwhile
+
+ " cleanup
+" call Decho("cleanup")
+ let result=delete(tmpfile)
+ call s:NetOptionRestore()
+
+ if a:firstline == 1 && a:lastline == line("$")
+ let &mod= mod " usually equivalent to set nomod
+ endif
+
+" call Dret("NetWrite")
+endfun
+
+" ===========================================
+" 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
+" with the requested remote hostname first.
+fun! s:NetBrowse(dirname)
+" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
+
+ if exists("s:netrw_skipbrowse")
+ unlet s:netrw_skipbrowse
+" call Dret("NetBrowse")
+ return
+ endif
+
+ " sanity check
+ if exists("b:netrw_method") && b:netrw_method =~ '[235]'
+" call Decho("b:netrw_method=".b:netrw_method)
+ if !executable("ftp")
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("NetBrowse")
+ return
+ endif
+ elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+
+" call Dret("NetBrowse")
+ return
+ endif
+
+ " use buffer-oriented WinVars if buffer ones exist but window ones don't
+ call s:UseBufWinVars()
+
+ " make this buffer modifiable
+ setlocal ma nonu nowrap
+
+ " analyze a:dirname and g:netrw_list_cmd
+ let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
+ let dirname = substitute(a:dirname,'\\','/','ge')
+" call Decho("dirpat<".dirpat.">")
+ if dirname !~ dirpat
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
+ return
+ endif
+
+ let method = substitute(dirname,dirpat,'\1','')
+ let user = substitute(dirname,dirpat,'\2','')
+ let machine = substitute(dirname,dirpat,'\3','')
+ let path = substitute(dirname,dirpat,'\4','')
+ let fname = substitute(dirname,'^.*/\ze.','','')
+" call Decho("set up method <".method .">")
+" call Decho("set up user <".user .">")
+" call Decho("set up machine<".machine.">")
+" call Decho("set up path <".path .">")
+" call Decho("set up fname <".fname .">")
+
+ if method == "ftp" || method == "http"
+ let method = "ftp"
+ let listcmd = g:netrw_ftp_list_cmd
+ else
+ let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
+ endif
+
+ if exists("b:netrw_method")
+" call Decho("setting w:netrw_method<".b:netrw_method.">")
+ let w:netrw_method= b:netrw_method
+ endif
+
+ " optionally sort by time (-t) or by size (-S)
+ if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
+ echohl WarningMsg | echo "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ else
+ if g:netrw_sort_by =~ "^t"
+ let listcmd= listcmd."t"
+ elseif g:netrw_sort_by =~ "^s"
+ let listcmd= listcmd."S"
+ endif
+ " optionally sort in reverse
+ if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
+ let listcmd= listcmd."r"
+ endif
+ endif
+
+" call Decho("set up listcmd<".listcmd.">")
+ if fname =~ '@$' && fname !~ '^"'
+" call Decho("attempt transfer of symlink as file")
+ call s:NetBrowse(substitute(dirname,'@$','','e'))
+ redraw!
+" call Dret("NetBrowse : symlink")
+ return
+
+ elseif fname !~ '[\/]$' && fname !~ '^"'
+ " looks like a regular file, attempt transfer
+" call Decho("attempt transfer as regular file<".dirname.">")
+
+ " remove any filetype indicator from end of dirname, except for the
+ " "this is a directory" indicator (/). There shouldn't be one of those,
+ " anyway.
+ let path= substitute(path,'[*=@|]$','','e')
+" call Decho("new path<".path.">")
+
+ " remote-read the requested file into current buffer
+ enew!
+" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
+ exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
+ exe "silent doau BufReadPre ".fname
+ silent call netrw#NetRead(method."://".user.machine."/".path)
+ exe "silent doau BufReadPost ".fname
+ keepjumps 1d
+
+ " save certain window-oriented variables into buffer-oriented variables
+ call s:BufWinVars()
+
+ setlocal nonu nomod noma
+
+" call Dret("NetBrowse : file<".fname.">")
+ return
+ endif
+
+ " ---------------------------------------------------------------------
+ " Perform Directory Listing:
+" call Decho("Perform directory listing...")
+ " set up new buffer and map
+ let bufname = method.'://'.user.machine.'/'.path
+ let bufnamenr = bufnr(bufname.'$')
+" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
+ if bufnamenr != -1
+ " buffer already exists, switch to it!
+" call Decho("buffer already exists, switching to it")
+ exe "b ".bufnamenr
+ if line("$") >= 5
+" call Dret("NetBrowse")
+ return
+ endif
+ else
+" call Decho("generate a new buffer")
+ enew!
+ endif
+
+ " rename file to reflect where its from
+ setlocal bt=nofile bh=wipe nobl noswf
+ exe "setlocal ts=".g:netrw_maxfilenamelen
+" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
+ exe 'file '.escape(bufname,s:netrw_cd_escape)
+" call Decho("renaming file to bufname<".bufname.">")
+ setlocal bh=hide nobl nonu
+
+ " save current directory on directory history list
+ call <SID>NetBookmarkDir(3,expand("%"))
+
+ " set up buffer-local mappings
+" call Decho("set up buffer-local mappings")
+ nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
+ nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
+ nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
+ nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
+ nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
+ nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
+ nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
+ nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
+ nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
+ nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
+ nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
+ nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
+ nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
+ nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
+ nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
+ nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
+ nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
+ nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
+ exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
+ exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
+ exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
+ exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
+ 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 nowrap
+
+ " Set up the banner
+" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
+ keepjumps put ='\" ==========================================================================='
+ keepjumps put ='\" Netrw Remote Directory Listing'
+ keepjumps put ='\" '.bufname
+ let w:netrw_bannercnt = 7
+ let sortby = g:netrw_sort_by
+ if g:netrw_sort_direction =~ "^r"
+ let sortby = sortby." reversed"
+ endif
+
+ if g:netrw_sort_by =~ "^n"
+ " sorted by name
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ keepjumps put ='\" Sorted by '.sortby
+ keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
+ else
+ " sorted by size or date
+ keepjumps put ='\" Sorted by '.sortby
+ endif
+ if g:netrw_list_hide != "" && g:netrw_hide
+ if g:netrw_hide == 1
+ keepjumps put ='\" Hiding: '.g:netrw_list_hide
+ else
+ keepjumps put ='\" Showing: '.g:netrw_list_hide
+ endif
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ endif
+ keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
+ keepjumps put ='\" ==========================================================================='
+
+ " remote read the requested directory listing
+ " Use ftp if that was the file-transfer method selected, otherwise use ssh
+ " Note that not all ftp servers honor the options for ls
+ if method == "ftp"
+ " use ftp to get remote file listing
+" call Decho("use ftp to get remote file listing")
+ call s:NetBrowseFtpCmd(path,listcmd)
+ keepjumps 1d
+
+ if !g:netrw_longlist
+ " shorten the listing
+" call Decho("generate short listing")
+ exe "keepjumps ".w:netrw_bannercnt
+
+ " cleanup
+ if g:netrw_ftp_browse_reject != ""
+ exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
+ endif
+
+ " if there's no ../ listed, then put ./ and ../ in
+ let line1= line(".")
+ keepjumps 1
+ silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
+ let line2= line(".")
+ if line2 == 0
+ keepjumps put='../'
+ keepjumps put='./'
+ endif
+ exe "keepjumps ".line1
+ keepjumps norm! 0
+
+ " more cleanup
+ exe 'keepjumps silent! '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
+ exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
+ exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
+ endif
+
+ else
+ " use ssh to get remote file listing
+" call Decho("use ssh to get remote file listing")
+ let shq= &shq? &shq : ( &sxq? &sxq : "'")
+" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
+ exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
+ keepjumps 1d
+ " cleanup
+ if g:netrw_ftp_browse_reject != ""
+ exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
+ endif
+ endif
+
+
+ " set up syntax highlighting
+ if has("syntax")
+ setlocal ft=netrwlist
+ if !exists("g:syntax_on") || !g:syntax_on
+ setlocal ft=
+ " Ugly workaround -- when syntax highlighting is off and laststatus==2,
+ " sometimes the laststatus highlight bleeds into the entire display.
+ " Only seems to happen with remote browsing. Weird.
+ redraw
+ endif
+ endif
+
+ " manipulate the directory listing (hide, sort)
+ if line("$") >= w:netrw_bannercnt
+ if g:netrw_hide && g:netrw_list_hide != ""
+ call s:NetrwListHide()
+ endif
+
+ if g:netrw_longlist
+ " do a long listing; these substitutions need to be done prior to sorting
+" call Decho("manipulate long listing")
+
+ if method == "ftp"
+ " cleanup
+ exe "keepjumps ".w:netrw_bannercnt
+ while getline(".") =~ g:netrw_ftp_browse_reject
+ keepjumps d
+ endwhile
+ " if there's no ../ listed, then put ./ and ../ in
+ let line1= line(".")
+ keepjumps 1
+ silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
+ let line2= line(".")
+ if line2 == 0
+ exe 'keepjumps '.w:netrw_bannercnt."put='./'"
+ exe 'keepjumps '.w:netrw_bannercnt."put='../'"
+ endif
+ exe "keepjumps ".line1
+ keepjumps norm! 0
+ endif
+
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$s/ -> .*$//e'
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
+ exe w:netrw_bannercnt
+ endif
+
+ if line("$") >= w:netrw_bannercnt
+ if g:netrw_sort_by =~ "^n"
+ call s:SetSort()
+ if v:version < 700
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
+ elseif g:netrw_sort_direction =~ 'n'
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
+ else
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
+ endif
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
+ endif
+ if g:netrw_longlist
+ " shorten the list to keep its width <= 80 characters
+ exe "keepjumps silent ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
+ endif
+ endif
+ endif
+ exe "keepjumps ".w:netrw_bannercnt
+
+ setlocal nomod noma nonu
+
+" call Dret("NetBrowse")
+ return
+endfun
+
+" ---------------------------------------------------------------------
+" NetBrowseChgDir: {{{2
+fun! s:NetBrowseChgDir(dirname,newdir)
+" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
+
+ let dirname= a:dirname
+ let newdir = a:newdir
+
+ if newdir !~ '[\/]$'
+ " handling a file
+ let dirname= dirname.newdir
+" call Decho("handling a file: dirname<".dirname.">")
+
+ elseif newdir == './'
+ " refresh the directory list
+" call Decho("refresh directory listing")
+ setlocal ma nobl bh=hide
+ %d
+
+ elseif newdir == '../'
+ " go up one directory
+ let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
+
+ if trailer =~ '^\%(\.\./\)*$'
+ " tack on a ../"
+ let dirname= dirname.'../'
+
+ else
+ " strip off a directory name from dirname
+ let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
+ endif
+" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
+
+ else
+ " go down one directory
+ let dirname= dirname.newdir
+" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
+ endif
+
+" call Dret("NetBrowseChgDir <".dirname.">")
+ return dirname
+endfun
+
+" ---------------------------------------------------------------------
+" NetGetWord: it gets the directory named under the cursor
+fun! s:NetGetWord()
+" call Dfunc("NetGetWord() line#".line("."))
+ call s:UseBufWinVars()
+
+ if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
+ let dirname= "./"
+ let curline= getline(".")
+ if curline =~ '"\s*Sorted by\s'
+ norm s
+ let s:netrw_skipbrowse= 1
+ echo 'Pressing "s" also works'
+ elseif curline =~ '"\s*Sort sequence:'
+ let s:netrw_skipbrowse= 1
+ echo 'Press "S" to edit sorting sequence'
+ elseif curline =~ '"\s*Quick Help:'
+ norm ?
+ let s:netrw_skipbrowse= 1
+ echo 'Pressing "?" also works'
+ elseif curline =~ '"\s*\%(Hiding\|Showing\):'
+ norm a
+ let s:netrw_skipbrowse= 1
+ echo 'Pressing "a" also works'
+ elseif line("$") > w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+ else
+ let dirname= getline(".")
+ if dirname =~ '\t'
+ let dirname= substitute(dirname,'\t.*$','','e')
+ endif
+ endif
+" call Dret("NetGetWord <".dirname.">")
+ return dirname
+endfun
+
+" ---------------------------------------------------------------------
+" NetBrowseRm: remove/delete a remote file or directory {{{2
+fun! s:NetBrowseRm(usrhost,path) range
+" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
+" call Decho("firstline=".a:firstline." lastline=".a:lastline)
+
+ " preparation for removing multiple files/directories
+ let ctr= a:firstline
+ let all= 0
+
+ " remove multiple files and directories
+ while ctr <= a:lastline
+ exe ctr
+
+ norm! 0
+ let rmfile= s:NetGetWord()
+" call Decho("rmfile<".rmfile.">")
+
+ if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
+ " attempt to remove file
+ if !all
+ echohl Statement
+ call inputsave()
+ let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ echohl NONE
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok =~ 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+
+ if all || ok =~ 'y\%[es]' || ok == ""
+ if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
+ silent! keepjumps .,$d
+ call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
+ else
+ let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
+" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
+ let ret= system(netrw_rm_cmd)
+" call Decho("returned=".ret." errcode=".v:shell_error)
+ endif
+ elseif ok =~ 'q\%[uit]'
+ break
+ endif
+
+ else
+ " attempt to remove directory
+ if !all
+ call inputsave()
+ let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok =~ 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+
+ if all || ok =~ 'y\%[es]' || ok == ""
+ if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
+ call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
+ else
+ let rmfile = a:path.rmfile
+ let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
+" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
+ let ret= system(netrw_rmdir_cmd)
+" call Decho("returned=".ret." errcode=".v:shell_error)
+
+ if v:shell_error != 0
+ let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
+" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
+ let ret= system(netrw_rmf_cmd)
+" call Decho("returned=".ret." errcode=".v:shell_error)
+
+ if v:shell_error != 0 && !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ endif
+ endif
+
+ elseif ok =~ 'q\%[uit]'
+ break
+ endif
+ endif
+
+ let ctr= ctr + 1
+ endwhile
+
+ " refresh the directory
+ let curline= line(".")-1
+" call Decho("refresh the directory")
+ call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
+ exe curline
+
+" call Dret("NetBrowseRm")
+endfun
+
+" ---------------------------------------------------------------------
+" NetBrowseRename: rename a remote file or directory {{{2
+fun! s:NetBrowseRename(usrhost,path) range
+" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
+
+ " preparation for removing multiple files/directories
+ let ctr = a:firstline
+ let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
+
+ " attempt to rename files/directories
+ while ctr <= a:lastline
+ exe "keepjumps ".ctr
+
+ norm! 0
+ let oldname= s:NetGetWord()
+" call Decho("oldname<".oldname.">")
+
+ call inputsave()
+ let newname= input("Moving ".oldname." to : ",oldname)
+ call inputrestore()
+
+ if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
+ call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
+ else
+ let oldname= a:path.oldname
+ let newname= a:path.newname
+" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
+ let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
+ endif
+
+ let ctr= ctr + 1
+ endwhile
+
+ " refresh the directory
+ let curline= line(".")
+ call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
+ exe "keepjumps ".curline
+" call Dret("NetBrowseRename")
+endfun
+
+" ---------------------------------------------------------------------
+" NetRefresh: {{{2
+fun! s:NetRefresh(dirname)
+" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
+ set ma
+ %d
+ call <SID>NetBrowse(dirname)
+ redraw!
+" call Dret("NetRefresh")
+endfun
+
+" ---------------------------------------------------------------------
+" NetSplit: mode {{{2
+" =0 : net and o
+" =1 : net and v
+" =2 : local and o
+" =3 : local and v
+fun! s:NetSplit(mode)
+" call Dfunc("NetSplit(mode=".a:mode.")")
+
+ call s:SaveWinVars()
+ if a:mode == 0
+ exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
+ call s:CopyWinVars()
+ exe "norm! 0"
+ call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
+ elseif a:mode ==1
+ exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
+ call s:CopyWinVars()
+ exe "norm! 0"
+ call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
+ elseif a:mode ==2
+ exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
+ call s:CopyWinVars()
+ exe "norm! 0"
+ call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
+ else
+ exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
+ call s:CopyWinVars()
+ exe "norm! 0"
+ call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
+ endif
+
+" call Dret("NetSplit")
+endfun
+
+" ---------------------------------------------------------------------
+" NetBrowseX: allows users to write custom functions to operate on {{{2
+" files given their extension. Passes 0=local, 1=remote
+fun! s:NetBrowseX(fname,remote)
+" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
+
+ " set up the filename
+ " (lower case the extension, make a local copy of a remote file)
+ let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let exten= substitute(exten,'^.*$','\L&\E','')
+ endif
+ let fname= escape(a:fname,"%#")
+" call Decho("fname<".fname."> after escape()")
+
+ if a:remote == 1
+ " create a local copy
+ let fname= tempname().".".exten
+" call Decho("create a local copy of <".a:fname."> as <".fname.">")
+ exe "keepjumps silent bot 1new ".a:fname
+ set bh=delete
+ exe "w! ".fname
+ q
+ endif
+" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
+
+ " set up redirection
+ if &srr =~ "%s"
+ let redir= substitute(&srr,"%s","/dev/null"."")
+ else
+ let redir= &srr . "/dev/null"
+ endif
+" call Decho("redir:".redir.":")
+
+ " execute the file handler
+ if has("win32") || has("win64")
+" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
+ exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
+ let ret= v:shell_error
+
+ elseif has("unix") && executable("kfmclient")
+" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
+ exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
+ let ret= v:shell_error
+
+ elseif has("unix") && executable("gnome-open")
+" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
+ exe "silent !gnome-open '".escape(fname,'%#')."'".redir
+ let ret= v:shell_error
+
+ elseif exten != "" && exists("*NetrwFileHandler_".exten)
+" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
+ exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
+ endif
+ redraw!
+
+ " cleanup: remove temporary file,
+ " delete current buffer if success with handler,
+ " return to prior buffer (directory listing)
+ if a:remote == 1 && fname != a:fname
+" call Decho("deleting temporary file<".fname.">")
+ call delete(fname)
+ endif
+
+ if a:remote == 1
+ set bh=delete bt=nofile noswf
+ exe "norm! \<c-o>"
+ redraw!
+ endif
+
+" call Dret("NetBrowseX")
+endfun
+
+" ---------------------------------------------------------------------
+" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
+" This function assumes that a long listing will be received. Size, time,
+" and reverse sorts will be requested of the server but not otherwise
+" enforced here.
+fun! s:NetBrowseFtpCmd(path,cmd)
+" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
+
+ " because WinXX ftp uses unix style input
+ " curline is one more than the bannercnt in order to account
+ " for the unwanted first blank line (doing a :put to an empty
+ " buffer yields a blank first line)
+ let ffkeep= &ff
+ setlocal ma ff=unix
+ let curline= w:netrw_bannercnt+1
+ exe "silent! keepjumps ".curline.",$d"
+
+ ".........................................
+ if w:netrw_method == 2 || w:netrw_method == 5
+ " ftp + <.netrc>: Method #2
+ if a:path != ""
+ put ='cd '.a:path
+ endif
+ exe "put ='".a:cmd."'"
+" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
+ if exists("g:netrw_port") && g:netrw_port != ""
+" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
+ exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+ else
+" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
+ exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
+ endif
+
+ ".........................................
+ elseif w:netrw_method == 3
+ " ftp + machine,id,passwd,filename: Method #3
+ 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
+
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ put =g:netrw_uid
+ put =g:netrw_passwd
+ else
+ put ='user '.g:netrw_uid.' '.g:netrw_passwd
+ endif
+
+ if a:path != ""
+ put ='cd '.a:path
+ endif
+ exe "put ='".a:cmd."'"
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
+ exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
+
+ ".........................................
+ else
+ echo "***warning*** unable to comply with your request<" . choice . ">"
+ endif
+
+ " cleanup for Windows
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ 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/$/@/
+ if !g:netrw_longlist
+ exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
+ endif
+ endif
+
+ " restore settings
+ let &ff= ffkeep
+" call Dret("NetBrowseFtpCmd")
+endfun
+
+" ---------------------------------------------------------------------
+" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
+" separated patterns given in g:netrw_list_hide
+fun! s:NetrwListHide()
+" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
+
+ let listhide= g:netrw_list_hide
+ while listhide != ""
+ if listhide =~ ','
+ let hide = substitute(listhide,',.*$','','e')
+ let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
+ else
+ let hide = listhide
+ let listhide= ""
+ endif
+
+ " Prune the list by hiding any files which match
+" call Decho("pruning <".hide."> listhide<".listhide.">")
+ if g:netrw_hide == 1
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$g~'.hide.'~d'
+ elseif g:netrw_hide == 2
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$v~'.hide.'~d'
+ endif
+ endwhile
+
+" call Dret("NetrwListHide")
+endfun
+
+" ---------------------------------------------------------------------
+" NetHideEdit: allows user to edit the file/directory hiding list
+fun! s:NetHideEdit(mode)
+" call Dfunc("NetHideEdit(mode=".a:mode.")")
+
+ call inputsave()
+ let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
+ call inputrestore()
+
+ " refresh the listing
+ let g:netrw_list_hide= newhide
+ if a:mode == 0
+ silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
+ else
+ silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
+ endif
+
+" call Dret("NetHideEdit")
+endfun
+
+" ---------------------------------------------------------------------
+" NetSortSequence: allows user to edit the sorting sequence
+fun! s:NetSortSequence(mode)
+" call Dfunc("NetSortSequence(mode=".a:mode.")")
+
+ call inputsave()
+ let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
+ call inputrestore()
+
+ " refresh the listing
+ let g:netrw_sort_sequence= newsortseq
+ if a:mode == 0
+ silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
+ else
+ silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
+ endif
+
+" call Dret("NetSortSequence")
+endfun
+
+" ---------------------------------------------------------------------
+" NetLongList: {{{2
+fun! s:NetLongList(mode)
+" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
+ call netrw#NetSavePosn()
+
+ if g:netrw_longlist != 0
+ " turn long listing off
+" call Decho("turn long listing off")
+ let g:netrw_longlist = 0
+ let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
+
+ else
+ " turn long listing on
+" call Decho("turn long listing on")
+ let g:netrw_longlist = 1
+ let g:netrw_list_cmd = g:netrw_list_cmd." -l"
+ endif
+ setlocal ma
+
+ " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
+ %d
+
+ " refresh the listing
+ if a:mode == 0
+ silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
+ else
+ silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
+ endif
+
+ call netrw#NetRestorePosn()
+
+" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
+endfun
+
+" ---------------------------------------------------------------------
+" 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()
+" call Dfunc("NetSaveWordPosn()")
+ let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
+" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
+endfun
+
+" ---------------------------------------------------------------------
+" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
+fun! s:NetRestoreWordPosn()
+" call Dfunc("NetRestoreWordPosn()")
+ silent! call search(s:netrw_saveword,'w')
+" call Dret("NetRestoreWordPosn")
+endfun
+
+" ---------------------------------------------------------------------
+" NetMakeDir: this function makes a directory (both local and remote) {{{2
+fun! s:NetMakeDir(usrhost)
+" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
+
+ " get name of new directory from user. A bare <CR> will skip.
+ " if its currently a directory, also request will be skipped, but with
+ " a message.
+ call inputsave()
+ let newdirname= input("Please give directory name: ")
+ call inputrestore()
+" call Decho("newdirname<".newdirname.">")
+
+ if newdirname == ""
+" call Dret("NetMakeDir : user aborted with bare <cr>")
+ return
+ endif
+
+ if a:usrhost == ""
+
+ " Local mkdir:
+ " sanity checks
+ let fullnewdir= b:netrw_curdir.'/'.newdirname
+" call Decho("fullnewdir<".fullnewdir.">")
+ if isdirectory(fullnewdir)
+ if !exists("g:netrw_quiet")
+ echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
+ return
+ endif
+ if filereadable(fullnewdir)
+ if !exists("g:netrw_quiet")
+ echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("NetMakeDir : file<".newdirname."> exists previously")
+ return
+ endif
+
+ " 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
+" call Decho("refresh listing")
+ let linenum= line(".")
+ norm! H0
+ let hline = line(".")
+ set ma|norm! 2D
+ call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
+ exe "norm! ".hline."G0z\<CR>"
+ exe linenum
+ elseif !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ redraw!
+
+ else
+ " Remote mkdir:
+ let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
+ let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
+" call Decho("exe silent! !".mkdircmd." ".newdirname)
+ exe "silent! !".mkdircmd." ".newdirname
+ if v:shell_error == 0
+ " refresh listing
+ let linenum= line(".")
+ norm! H0
+ let hline = line(".")
+ call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
+ exe "norm! ".hline."G0z\<CR>"
+ exe linenum
+ elseif !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ redraw!
+ endif
+
+" call Dret("NetMakeDir")
+endfun
+
+" ---------------------------------------------------------------------
+" NetBookmarkDir: {{{2
+" 0: (user: <b>) bookmark current directory
+" 1: (user: <B>) change to the bookmarked directory
+" 2: (user: <q>) list bookmarks
+" 3: (LocalBrowse) record current directory history
+" 4: (user: <u>) go up (previous) bookmark
+" 5: (user: <U>) go down (next) bookmark
+fun! s:NetBookmarkDir(chg,curdir)
+" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
+ if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
+ " looks like a "b" was pressed while in the banner region
+ if line("$") > w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+ echo ""
+" call Dret("NetBookmarkDir - ignoring")
+ return
+ endif
+
+ if a:chg == 0
+ " bookmark the current directory
+ 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
+ echo "bookmarked the current directory"
+
+ elseif a:chg == 1
+ " change to the bookmarked directory
+ if exists("g:NETRW_BOOKMARKDIR_{v:count}")
+ exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
+ else
+ echomsg "Sorry, bookmark#".v:count." doesn't exist!"
+ endif
+
+ elseif a:chg == 2
+ " 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}
+ endif
+ let cnt= cnt + 1
+ endwhile
+ endif
+
+ " list directory history
+ 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)
+ 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}
+ endif
+ let first = 0
+ let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
+ if cnt < 0
+ let cnt= cnt + g:netrw_dirhistmax
+ endif
+ endwhile
+
+ elseif a:chg == 3
+ " saves most recently visited directories (when they differ)
+ 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')
+" 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
+ 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}.">")
+ exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
+ else
+ 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
+ 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}.">")
+ exe "e ".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
+ endif
+ echo "Sorry, no successor directory exists yet"
+ endif
+ endif
+" call Dret("NetBookmarkDir")
+endfun
+
+" ==========================================
+" Local Directory Browsing Support: {{{1
+" ==========================================
+
+" ---------------------------------------------------------------------
+" LocalBrowse: {{{2
+fun! s:LocalBrowse(dirname)
+ " unfortunate interaction -- debugging calls can't be used here;
+ " the BufEnter event causes triggering when attempts to write to
+ " the DBG buffer are made.
+ if isdirectory(a:dirname)
+ call netrw#DirBrowse(a:dirname)
+ endif
+ " not a directory, ignore it
+endfun
+
+" ---------------------------------------------------------------------
+" DirBrowse: supports local file/directory browsing {{{2
+fun! netrw#DirBrowse(dirname)
+" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
+" call Dredir("ls!")
+
+ if exists("s:netrw_skipbrowse")
+ unlet s:netrw_skipbrowse
+" call Dret("DirBrowse")
+ return
+ endif
+
+ if v:version < 603
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("DirBrowse : vim version<".v:version."> too old")
+ return
+ endif
+
+ " record autochdir setting and then insure its unset (tnx to David Fishburn)
+ if has("netbeans_intg") || has("sun_workshop")
+ let keep_autochdir= &autochdir
+ set noautochdir
+ endif
+
+ " use buffer-oriented WinVars if buffer ones exist but window ones don't
+ call s:UseBufWinVars()
+
+ " find buffer number of buffer named precisely the same as a:dirname
+ let bufnum= bufnr(escape(a:dirname,'\'))
+" call Decho("findbuf: bufnum=".bufnum)
+ if bufnum > 0 && bufname(bufnum) != a:dirname
+ let ibuf= 1
+ let buflast= bufnr("$")
+ while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
+" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
+ let ibuf= ibuf + 1
+ endwhile
+ if ibuf > buflast
+ let bufnum= -1
+ else
+ let bufnum= ibuf
+ endif
+" call Decho("findbuf: bufnum=".bufnum." (final)")
+ endif
+
+ " get cleared buffer
+ if bufnum < 0
+ if v:version < 700
+ enew!
+ else
+ keepalt enew!
+ endif
+" call Decho("enew buffer")
+ else
+ if v:version < 700
+ exe "b ".bufnum
+ else
+ exe "keepalt b ".bufnum
+ endif
+ if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
+ if getline(2) =~ '^" Directory Listing '
+ if !g:netrw_keepdir
+" call Decho("change directory: cd ".b:netrw_curdir)
+ exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
+ endif
+" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
+ return
+ endif
+ endif
+ endif
+ let s:last_sort_by= g:netrw_sort_by
+
+ " get the new directory name
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
+ else
+ let b:netrw_curdir= a:dirname
+ endif
+ 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)
+ try
+ exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
+ catch /^Vim\%((\a\+)\)\=:E472/
+ echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ if exists("w:netrw_prvdir")
+ let b:netrw_curdir= w:netrw_prvdir
+ else
+" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
+ return
+ endif
+ endtry
+ 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 and hidden
+ setlocal ma hidden nonu bt=nofile
+ if v:version < 700
+ silent! %d
+ else
+ keepalt silent! %d
+ endif
+
+ " ---------------------------
+ " Perform Directory Listing:
+
+ " save current directory on directory history list
+ call <SID>NetBookmarkDir(3,b:netrw_curdir)
+
+ " set up all the maps
+" call Decho("Setting up local browser maps")
+ nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
+ nnoremap <buffer> <silent> <c-l> :set ma<bar>%d<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<bar>redraw!<cr>
+ nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
+ nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
+ nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
+ nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
+ nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
+ nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
+ nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
+ nnoremap <buffer> <silent> p :exe "norm! 0"<bar>call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
+ nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
+ nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
+ nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
+ nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
+ nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
+ nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
+ nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
+ nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
+ nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
+ nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
+ exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
+ exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
+ exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
+ exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
+ exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
+ nnoremap <buffer> ? :he netrw-dir<cr>
+
+ " Set up the banner
+" call Decho("set up banner")
+ keepjumps put ='\" ============================================================================'
+ keepjumps 1d
+ keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
+ keepjumps put ='\" '.b:netrw_curdir
+ let w:netrw_bannercnt= 3
+
+ let sortby= g:netrw_sort_by
+ if g:netrw_sort_direction =~ "^r"
+ let sortby= sortby." reversed"
+ endif
+
+ " Sorted by...
+ if g:netrw_sort_by =~ "^n"
+" call Decho("directories will be sorted by name")
+ " sorted by name
+ keepjumps put ='\" Sorted by '.sortby
+ keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
+ let w:netrw_bannercnt= w:netrw_bannercnt + 2
+ else
+" call Decho("directories will be sorted by size or date")
+ " sorted by size or date
+ keepjumps put ='\" Sorted by '.sortby
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ endif
+
+ " Hiding... -or- Showing...
+ if g:netrw_list_hide != "" && g:netrw_hide
+ if g:netrw_hide == 1
+ keepjumps put ='\" Hiding: '.g:netrw_list_hide
+ else
+ keepjumps put ='\" Showing: '.g:netrw_list_hide
+ endif
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ endif
+ keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
+ keepjumps put ='\" ============================================================================'
+ let w:netrw_bannercnt= w:netrw_bannercnt + 2
+
+ " bannercnt should index the line just after the banner
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+" call Decho("bannercnt=".w:netrw_bannercnt)
+
+ " generate the requested directory listing
+ call s:LocalBrowseList()
+
+ " set up syntax highlighting
+ if has("syntax")
+ setlocal ft=netrwlist
+ if !exists("g:syntax_on") || !g:syntax_on
+ setlocal ft=
+ endif
+ endif
+
+ " manipulate the directory listing (hide, sort)
+ if line("$") >= w:netrw_bannercnt
+ if g:netrw_hide && g:netrw_list_hide != ""
+ call s:NetrwListHide()
+ endif
+ if line("$") >= w:netrw_bannercnt
+
+ if g:netrw_sort_by =~ "^n"
+ call s:SetSort()
+
+ if v:version < 700
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
+ elseif g:netrw_sort_direction =~ 'n'
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
+ else
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
+ endif
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
+
+ else
+ if v:version < 700
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
+ elseif g:netrw_sort_direction =~ 'n'
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
+ else
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
+ endif
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
+ endif
+
+ endif
+ endif
+ if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+
+ " record previous current directory
+ let w:netrw_prvdir= b:netrw_curdir
+
+ " save certain window-oriented variables into buffer-oriented variables
+ call s:BufWinVars()
+
+ setlocal noma nomod nonu bh=hide nobl
+ if has("netbeans_intg") || has("sun_workshop")
+ let &autochdir= keep_autochdir
+ endif
+
+" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
+endfun
+
+" ---------------------------------------------------------------------
+" LocalBrowseList: does the job of "ls" for local directories {{{2
+fun! s:LocalBrowseList()
+" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
+
+ " get the list of files contained in the current directory
+ 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."/.*")
+" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
+
+ " if the directory name includes a "$", and possibly other characters,
+ " the glob() doesn't include "." and ".." entries.
+ if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
+" call Decho("forcibly tacking on .")
+ if filelist == ""
+ let filelist= dirname."."
+ else
+ 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".b:netrw_curdir.".."
+" call Decho("filelist<".filelist.">")
+ endif
+ let filelist= substitute(filelist,'\n\{2,}','\n','ge')
+
+" call Decho("dirname<".dirname.">")
+" call Decho("dirnamelen<".dirnamelen.">")
+" call Decho("filelist<".filelist.">")
+
+ while filelist != ""
+ if filelist =~ '\n'
+ let filename = substitute(filelist,'\n.*$','','e')
+ let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
+ else
+ let filename = filelist
+ let filelist = ""
+ endif
+ let pfile= filename
+ if isdirectory(filename)
+ let pfile= filename."/"
+ endif
+ if pfile =~ '//$'
+ let pfile= substitute(pfile,'//$','/','e')
+ endif
+ let pfile= strpart(pfile,dirnamelen)
+ let pfile= substitute(pfile,'^/','','e')
+" call Decho(" ")
+" call Decho("filename<".filename.">")
+" call Decho("pfile <".pfile.">")
+
+ if g:netrw_longlist
+ let sz = getfsize(filename)
+ if v:version <= 700
+ let fsz = strpart(" ",1,15-strlen(sz)).sz
+ let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
+ else
+ let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
+ endif
+" 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(".filename.")=".getftime(filename))
+ let t = getftime(filename)
+ let ft = strpart("000000000000000000",1,18-strlen(t)).t
+" 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(".filename.")=".getfsize(filename))
+ let sz = getfsize(filename)
+ let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
+" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
+ let fszpfile= fsz.'/'.pfile
+ keepjumps put =fszpfile
+
+ else
+ " sort by name
+" call Decho("exe keepjumps put ='".pfile."'")
+ keepjumps put=pfile
+ endif
+ endwhile
+ setlocal ts=32
+
+" call Dret("LocalBrowseList")
+endfun
+
+" ---------------------------------------------------------------------
+" LocalBrowseChgDir: constructs a new directory based on the current {{{2
+" directory and a new directory name
+fun! s:LocalBrowseChgDir(dirname,newdir,...)
+" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
+
+ let dirname= substitute(a:dirname,'\\','','ge')
+ let newdir = a:newdir
+
+ if dirname !~ '[\/]$'
+ " apparently vim is "recognizing" that it is in the home directory and
+ " is removing the "/". Bad idea, so I have to put it back.
+ let dirname= dirname.'/'
+" call Decho("adjusting dirname<".dirname.">")
+ endif
+
+ if newdir !~ '[\/]$'
+ " handling a file
+ let dirname= dirname.newdir
+" call Decho("handling a file: dirname<".dirname.">")
+ " this lets NetBrowseX avoid the edit
+ if a:0 < 1
+" 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")
+
+ elseif newdir == '../'
+ " go up one directory
+ let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
+" call Decho("go up one dir: dirname<".dirname.">")
+
+ else
+ " go down one directory
+ let dirname= dirname.newdir
+" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
+ endif
+
+" call Dret("LocalBrowseChgDir <".dirname.">")
+ return dirname
+endfun
+
+" ---------------------------------------------------------------------
+" LocalBrowseRm: {{{2
+fun! s:LocalBrowseRm(path) range
+" call Dfunc("LocalBrowseRm(path<".a:path.">)")
+" call Decho("firstline=".a:firstline." lastline=".a:lastline)
+
+ " preparation for removing multiple files/directories
+ let ctr = a:firstline
+ let ret = 0
+ let all= 0
+
+ " remove multiple files and directories
+ while ctr <= a:lastline
+ exe "keepjumps ".ctr
+
+ " sanity checks
+ if line(".") < w:netrw_bannercnt
+ let ctr= ctr + 1
+ continue
+ endif
+ let curword= s:NetGetWord()
+ if curword == "./" || curword == "../"
+ let ctr= ctr + 1
+ continue
+ endif
+
+ norm! 0
+ let rmfile= a:path."/".curword
+" call Decho("rmfile<".rmfile.">")
+
+ if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
+ " attempt to remove file
+ if !all
+ echohl Statement
+ call inputsave()
+ let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ echohl NONE
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok =~ 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+
+ if all || ok =~ 'y\%[es]' || ok == ""
+ let ret= delete(rmfile)
+" call Decho("errcode=".v:shell_error." ret=".ret)
+ elseif ok =~ 'q\%[uit]'
+ break
+ endif
+
+ else
+ " attempt to remove directory
+ if !all
+ echohl Statement
+ call inputsave()
+ let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok =~ 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+ let rmfile= substitute(rmfile,'[\/]$','','e')
+
+ if all || ok =~ 'y\%[es]' || ok == ""
+" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
+ call system(g:netrw_local_rmdir.' "'.rmfile.'"')
+" call Decho("v:shell_error=".v:shell_error)
+
+ if v:shell_error != 0
+" call Decho("2nd attempt to remove directory<".rmfile.">")
+ let errcode= delete(rmfile)
+" call Decho("errcode=".errcode)
+
+ if errcode != 0
+ if has("unix")
+" call Decho("3rd attempt to remove directory<".rmfile.">")
+ call system("rm ".rmfile)
+ if v:shell_error != 0 && !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ elseif !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ endif
+ endif
+
+ elseif ok =~ 'q\%[uit]'
+ break
+ endif
+ endif
+
+ let ctr= ctr + 1
+ endwhile
+
+ " refresh the directory
+ let curline= line(".")
+" call Decho("refresh the directory")
+ call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
+ exe curline
+
+" call Dret("LocalBrowseRm")
+endfun
+
+" ---------------------------------------------------------------------
+" LocalBrowseRename: rename a remote file or directory {{{2
+fun! s:LocalBrowseRename(path) range
+" call Dfunc("LocalBrowseRename(path<".a:path.">)")
+
+ " preparation for removing multiple files/directories
+ let ctr= a:firstline
+
+ " attempt to rename files/directories
+ while ctr <= a:lastline
+ exe "keepjumps ".ctr
+
+ " sanity checks
+ if line(".") < w:netrw_bannercnt
+ let ctr= ctr + 1
+ continue
+ endif
+ let curword= s:NetGetWord()
+ if curword == "./" || curword == "../"
+ let ctr= ctr + 1
+ continue
+ endif
+
+ norm! 0
+ let oldname= a:path."/".curword
+" call Decho("oldname<".oldname.">")
+
+ call inputsave()
+ let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
+ call inputrestore()
+
+ let ret= rename(oldname,newname)
+" call Decho("renaming <".oldname."> to <".newname.">")
+
+ let ctr= ctr + 1
+ endwhile
+
+ " refresh the directory
+ let curline= line(".")
+" call Decho("refresh the directory listing")
+ call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
+ exe "keepjumps ".curline
+" call Dret("LocalBrowseRename")
+endfun
+
+" ---------------------------------------------------------------------
+" LocalPreview: {{{2
+fun! s:LocalPreview(path) range
+" call Dfunc("LocalPreview(path<".a:path.">)")
+ if has("quickfix")
+ if !isdirectory(a:path)
+ exe "pedit ".a:path
+ elseif !exists("g:netrw_quiet")
+ echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ elseif !exists("g:netrw_quiet")
+ echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+" call Dret("LocalPreview")
+endfun
+
+" ---------------------------------------------------------------------
+" LocalRefresh: {{{2
+fun! s:LocalRefresh(dirname)
+" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
+ set ma
+ %d
+ call s:LocalBrowse(a:dirname)
+ redraw!
+" call Dret("LocalRefresh")
+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! netrw#Explore(indx,dosplit,style,...)
+" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
+
+ " if dosplit or file has been modified
+ if a:dosplit || &modified
+ call <SID>SaveWinVars()
+
+ if a:style == 0 " Explore, Sexplore
+ exe g:netrw_winsize."wincmd s"
+" call Decho("style=0: Explore or Sexplore")
+
+ elseif a:style == 1 "Explore!, Sexplore!
+ exe g:netrw_winsize."wincmd v"
+" call Decho("style=1: Explore! or Sexplore!")
+
+ elseif a:style == 2 " Hexplore
+ exe "bel ".g:netrw_winsize."wincmd s"
+" call Decho("style=2: Hexplore")
+
+ elseif a:style == 3 " Hexplore!
+ exe "abo ".g:netrw_winsize."wincmd s"
+" call Decho("style=3: Hexplore!")
+
+ elseif a:style == 4 " Vexplore
+ exe "lefta ".g:netrw_winsize."wincmd v"
+" call Decho("style=4: Vexplore")
+
+ elseif a:style == 5 " Vexplore!
+ exe "rightb ".g:netrw_winsize."wincmd v"
+" call Decho("style=5: Vexplore!")
+ endif
+ call s:CopyWinVars()
+ endif
+ norm! 0
+
+ if a:1 == "" && a:indx >= 0
+ " Explore Hexplore Vexplore Sexplore
+ let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
+ if newdir =~ '^scp:' || newdir =~ '^ftp:'
+" call Decho("calling NetBrowse(newdir<".newdir.">)")
+ call s:NetBrowse(newdir)
+ else
+" call Decho("calling LocalBrowse(newdir<".newdir.">)")
+ call s:LocalBrowse(newdir)
+ endif
+
+ elseif a:1 =~ '\*\*/' || a:indx < 0
+ " Nexplore Pexplore -or- Explore **/...
+
+ if has("path_extra") && v:version >= 700
+ if !exists("w:netrw_explore_indx")
+ let w:netrw_explore_indx= 0
+ endif
+ let indx = a:indx
+ if indx == -1
+ let indx= w:netrw_explore_indx + 1
+ elseif indx == -2
+ let indx= w:netrw_explore_indx - 1
+ else
+ let w:netrw_explore_indx = 0
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+ endif
+ let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
+ let w:netrw_explore_listlen = len(w:netrw_explore_list)
+ if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
+ echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" call Dret("Explore")
+ return
+ endif
+ endif
+
+ " NetrwStatusLine support
+ let w:netrw_explore_indx= indx
+ if !exists("s:netrw_explore_stl")
+ let s:netrw_explore_stl= &stl
+ endif
+ set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
+" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
+
+ " sanity check
+ if indx >= w:netrw_explore_listlen || indx < 0
+ let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
+ echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" call Dret("Explore")
+ return
+ endif
+
+ exe "let dirfile= w:netrw_explore_list[".indx."]"
+" call Decho("dirfile<".dirfile."> indx=".indx)
+ let newdir= substitute(dirfile,'/[^/]*$','','e')
+" call Decho("newdir<".newdir.">")
+" call Decho("calling LocalBrowse(newdir<".newdir.">)")
+ call s:LocalBrowse(newdir)
+ call search(substitute(dirfile,"^.*/","",""),"W")
+ let w:netrw_explore_mtchcnt = indx + 1
+ let w:netrw_explore_bufnr = bufnr(".")
+ let w:netrw_explore_line = line(".")
+" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
+
+ else
+ if v:version < 700
+ echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for Exploring with **!" | echohl None
+ elseif !exists("g:netrw_quiet")
+ echohl WarningMsg | echo "***netrw*** your vim needs the +path_extra feature for Exploring with **!" | echohl None | echohl None
+ endif
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+
+ else
+ let newdir= a:1
+" call Decho("calling LocalBrowse(newdir<".newdir.">)")
+ call s:LocalBrowse(newdir)
+ endif
+
+" call Dret("Explore")
+endfun
+
+" ---------------------------------------------------------------------
+" NetrwStatusLine: {{{2
+fun! NetrwStatusLine()
+" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr(".")." Xline#".w:netrw_explore_line." line#".line(".")
+ if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr(".") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
+ let &stl= s:netrw_explore_stl
+ if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
+ if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
+ return ""
+ else
+ return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" NetGetcwd: get the current directory. {{{2
+" Change backslashes to forward slashes, if any.
+" If doesc is true, escape certain troublesome characters
+fun! s:NetGetcwd(doesc)
+" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
+ let curdir= substitute(getcwd(),'\\','/','ge')
+ if curdir !~ '[\/]$'
+ let curdir= curdir.'/'
+ endif
+ if a:doesc
+ let curdir= escape(curdir,s:netrw_cd_escape)
+ endif
+" call Dret("NetGetcwd <".curdir.">")
+ return curdir
+endfun
+
+" ---------------------------------------------------------------------
+" NetMethod: determine method of transfer {{{1
+" method == 1: rcp
+" 2: ftp + <.netrc>
+" 3: ftp + machine, id, password, and [path]filename
+" 4: scp
+" 5: http (wget)
+" 6: cadaver
+" 7: rsync
+" 8: fetch
+" 9: sftp
+fun! s:NetMethod(choice) " globals: method machine id passwd fname
+" call Dfunc("NetMethod(a:choice<".a:choice.">)")
+
+ " initialization
+ let b:netrw_method = 0
+ let g:netrw_machine = ""
+ let b:netrw_fname = ""
+ let g:netrw_port = ""
+
+ " Patterns:
+ " mipf : a:machine a:id password filename Use ftp
+ " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
+ " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
+ " rcpurm : rcp://[user@]host/filename Use rcp
+ " rcphf : [user@]host:filename Use rcp
+ " scpurm : scp://[user@]host[[#:]port]/filename Use scp
+ " httpurm : http://[user@]host/filename Use wget
+ " davurm : [s]dav://host[:port]/path Use cadaver
+ " rsyncurm : rsync://host[:port]/path Use rsync
+ " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
+ " sftpurm : sftp://[user@]host/filename Use scp
+ let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
+ let mf = '^\(\S\+\)\s\+\(\S\+\)$'
+ let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
+ let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
+ let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
+ let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
+ let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
+ let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
+ let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
+
+" call Decho("determine method:")
+ " Determine Method
+ " rcp://user@hostname/...path-to-file
+ if match(a:choice,rcpurm) == 0
+" call Decho("rcp://...")
+ let b:netrw_method = 1
+ let userid = substitute(a:choice,rcpurm,'\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
+
+ " scp://user@hostname/...path-to-file
+ elseif match(a:choice,scpurm) == 0
+" call Decho("scp://...")
+ let b:netrw_method = 4
+ let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
+ let 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
+" call Decho("http://...")
+ let b:netrw_method = 5
+ let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
+
+ " dav://hostname[:port]/..path-to-file..
+ elseif match(a:choice,davurm) == 0
+" call Decho("dav://...")
+ let b:netrw_method= 6
+ if a:choice =~ '^s'
+ let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
+ else
+ let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
+ endif
+ let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
+
+ " rsync://user@hostname/...path-to-file
+ elseif match(a:choice,rsyncurm) == 0
+" call Decho("rsync://...")
+ let b:netrw_method = 7
+ let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
+
+ " ftp://[user@]hostname[[:#]port]/...path-to-file
+ elseif match(a:choice,ftpurm) == 0
+" call Decho("ftp://...")
+ let userid = substitute(a:choice,ftpurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
+ let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
+ let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+ if exists("g:netrw_uid") && exists("g:netrw_passwd")
+ let b:netrw_method = 3
+ else
+ if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
+ let b:netrw_method= 2
+ else
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ call NetUserPass()
+ elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
+ call NetUserPass(g:netrw_uid)
+ " else just use current g:netrw_uid and g:netrw_passwd
+ endif
+ let b:netrw_method= 3
+ endif
+ endif
+
+ elseif match(a:choice,fetchurm) == 0
+" call Decho("fetch://...")
+ let b:netrw_method = 8
+ let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
+ let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
+ let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
+
+ " Issue an ftp : "machine id password [path/]filename"
+ elseif match(a:choice,mipf) == 0
+" call Decho("(ftp) host id pass file")
+ let b:netrw_method = 3
+ let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
+ let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
+ let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
+ let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
+
+ " Issue an ftp: "hostname [path/]filename"
+ elseif match(a:choice,mf) == 0
+" call Decho("(ftp) host file")
+ if exists("g:netrw_uid") && exists("g:netrw_passwd")
+ let b:netrw_method = 3
+ let g:netrw_machine = substitute(a:choice,mf,'\1',"")
+ let b:netrw_fname = substitute(a:choice,mf,'\2',"")
+
+ elseif filereadable(expand("$HOME/.netrc"))
+ let b:netrw_method = 2
+ let g:netrw_machine = substitute(a:choice,mf,'\1',"")
+ let b:netrw_fname = substitute(a:choice,mf,'\2',"")
+ endif
+
+ " sftp://user@hostname/...path-to-file
+ elseif match(a:choice,sftpurm) == 0
+" call Decho("sftp://...")
+ let b:netrw_method = 9
+ let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
+
+ " Issue an rcp: hostname:filename" (this one should be last)
+ elseif match(a:choice,rcphf) == 0
+" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
+ let b:netrw_method = 1
+ let userid = substitute(a:choice,rcphf,'\2',"")
+ let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
+ let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
+" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
+" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
+" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
+" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ " don't let PCs try <.netrc>
+ let b:netrw_method = 3
+ endif
+
+ else
+ if !exists("g:netrw_quiet")
+ echohl Error | echo "***netrw*** cannot determine method" | echohl None
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+ let b:netrw_method = -1
+ endif
+
+ " remove any leading [:#] from port number
+ if g:netrw_port != ""
+ let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
+ endif
+
+" call Decho("a:choice <".a:choice.">")
+" call Decho("b:netrw_method <".b:netrw_method.">")
+" call Decho("g:netrw_machine<".g:netrw_machine.">")
+" call Decho("g:netrw_port <".g:netrw_port.">")
+" if exists("g:netrw_uid") "Decho
+" call Decho("g:netrw_uid <".g:netrw_uid.">")
+" endif "Decho
+" if exists("g:netrw_passwd") "Decho
+" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
+" endif "Decho
+" call Decho("b:netrw_fname <".b:netrw_fname.">")
+" call Dret("NetMethod")
+endfun
+
+" ------------------------------------------------------------------------
+" NetUserPass: set username and password for subsequent ftp transfer {{{1
+" Usage: :call NetUserPass() -- will prompt for userid and password
+" :call NetUserPass("uid") -- will prompt for password
+" :call NetUserPass("uid","password") -- sets global userid and password
+fun! NetUserPass(...)
+
+ " get/set userid
+ if a:0 == 0
+" call Dfunc("NetUserPass(a:0<".a:0.">)")
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ " via prompt
+ let g:netrw_uid= input('Enter username: ')
+ endif
+ else " from command line
+" call Dfunc("NetUserPass(a:1<".a:1.">) {")
+ let g:netrw_uid= a:1
+ endif
+
+ " get password
+ if a:0 <= 1 " via prompt
+" call Decho("a:0=".a:0." case <=1:")
+ let g:netrw_passwd= inputsecret("Enter Password: ")
+ else " from command line
+" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
+ let g:netrw_passwd=a:2
+ endif
+" call Dret("NetUserPass")
+endfun
+
+" ------------------------------------------------------------------------
+" NetOptionSave: save options and set to "standard" form {{{1
+fun!s:NetOptionSave()
+" call Dfunc("NetOptionSave()")
+
+ " Get Temporary Filename
+ let s:aikeep = &ai
+ let s:cinkeep = &cin
+ let s:cinokeep = &cino
+ let s:comkeep = &com
+ let s:cpokeep = &cpo
+ let s:dirkeep = getcwd()
+ let s:gdkeep = &gd
+ let s:twkeep = &tw
+ setlocal cino =
+ setlocal com =
+ setlocal cpo -=aA
+ setlocal nocin noai
+ setlocal tw =0
+ if has("win32") && !has("win95")
+ let s:swfkeep= &swf
+ setlocal noswf
+" call Decho("setting s:swfkeep to <".&swf.">")
+ endif
+
+" call Dret("NetOptionSave")
+endfun
+
+" ------------------------------------------------------------------------
+" NetOptionRestore: restore options {{{1
+fun! s:NetOptionRestore()
+" call Dfunc("NetOptionRestore()")
+
+ let &ai = s:aikeep
+ let &cin = s:cinkeep
+ let &cino = s:cinokeep
+ let &com = s:comkeep
+ let &cpo = s:cpokeep
+ exe "lcd ".s:dirkeep
+ let &gd = s:gdkeep
+ let &tw = s:twkeep
+ if exists("s:swfkeep")
+ if &directory == ""
+ " user hasn't specified a swapfile directory;
+ " netrw will temporarily make the swapfile
+ " directory the current local one.
+ let &directory = getcwd()
+ silent! let &swf = s:swfkeep
+ set directory=
+ else
+ let &swf= s:swfkeep
+ endif
+ unlet s:swfkeep
+ endif
+ unlet s:aikeep
+ unlet s:cinkeep
+ unlet s:cinokeep
+ unlet s:comkeep
+ unlet s:cpokeep
+ unlet s:gdkeep
+ unlet s:twkeep
+ unlet s:dirkeep
+
+" call Dret("NetOptionRestore")
+endfun
+
+" ------------------------------------------------------------------------
+" NetReadFixup: this sort of function is typically written by the user {{{1
+" to handle extra junk that their system's ftp dumps
+" into the transfer. This function is provided as an
+" example and as a fix for a Windows 95 problem: in my
+" experience, win95's ftp always dumped four blank lines
+" at the end of the transfer.
+if has("win95") && g:netrw_win95ftp
+ fun! NetReadFixup(method, line1, line2)
+" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
+ if method == 3 " ftp (no <.netrc>)
+ let fourblanklines= line2 - 3
+ silent fourblanklines.",".line2."g/^\s*/d"
+ endif
+" call Dret("NetReadFixup")
+ endfun
+endif
+
+" ---------------------------------------------------------------------
+" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
+if v:version < 700
+ fun! s:NetSort() range
+" " call Dfunc("NetSort()")
+
+ let i = a:firstline + 1
+ while i <= a:lastline
+ " find insertion point via binary search
+ let i_val = getline(i)
+ 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
+ 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)
+ endif
+ let i = i + 1
+ endwhile
+
+" " call Dret("NetSort")
+ endfun
+endif
+
+" ---------------------------------------------------------------------
+" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
+" What this function does is to compute a priority for the patterns
+" in the g:netrw_sort_sequence. It applies a substitute to any
+" "files" that satisfy each pattern, putting the priority / in
+" front. An "*" pattern handles the default priority.
+fun! s:SetSort()
+" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
+ if g:netrw_longlist
+ let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
+ else
+ let seqlist = g:netrw_sort_sequence
+ endif
+ " sanity check -- insure that * appears somewhere
+ if seqlist == ""
+ let seqlist= '*'
+ elseif seqlist !~ '\*'
+ let seqlist= seqlist.',*'
+ endif
+ let priority = 1
+ while seqlist != ""
+ if seqlist =~ ','
+ let seq = substitute(seqlist,',.*$','','e')
+ let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
+ else
+ let seq = seqlist
+ let seqlist = ""
+ endif
+ let eseq= escape(seq,'/')
+ if priority < 10
+ let spriority= "00".priority.'\/'
+ elseif priority < 100
+ let spriority= "0".priority.'\/'
+ else
+ let spriority= priority.'\/'
+ endif
+" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
+
+ " sanity check
+ if w:netrw_bannercnt > line("$")
+ " apparently no files were left after a Hiding pattern was used
+" call Dret("SetSort : no files left after hiding")
+ return
+ endif
+ if seq == '*'
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
+ else
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
+ endif
+ let priority = priority + 1
+ endwhile
+
+ exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
+
+" call Dret("SetSort")
+endfun
+
+" ---------------------------------------------------------------------
+" SaveWinVars: (used by Explore()) {{{1
+fun! s:SaveWinVars()
+" call Dfunc("SaveWinVars()")
+ if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
+ if exists("w:netrw_method") |let s:method = w:netrw_method |endif
+ if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
+ if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
+ if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
+ if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
+ if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
+ if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
+ if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
+" call Dret("SaveWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" CopyWinVars: (used by Explore()) {{{1
+fun! s:CopyWinVars()
+" call Dfunc("CopyWinVars()")
+ if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
+ if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
+ if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
+ if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
+ if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
+ if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
+ if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
+ if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
+ if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
+" call Dret("CopyWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" BufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
+" To allow separate windows to have their own activities, such as
+" Explore **/pattern, several variables have been made window-oriented.
+" However, when the user splits a browser window (ex: ctrl-w s), these
+" variables are not inherited by the new window. BufWinVars() and
+" UseBufWinVars() get around that.
+fun! s:BufWinVars()
+" call Dfunc("BufWinVars()")
+ 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
+ if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
+ if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
+ if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
+ if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
+ if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
+ if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
+ if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
+" call Dret("BufWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
+" Matching function to BufferWinVars()
+fun! s:UseBufWinVars()
+" call Dfunc("UseBufWinVars()")
+ if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
+ if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
+ if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
+ if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
+ if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
+ if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
+ if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
+ if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
+ if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
+" call Dret("UseBufWinVars")
+endfun
+
+" ------------------------------------------------------------------------
+" Settings Restoration: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+" ------------------------------------------------------------------------
+" Modelines: {{{1
+" vim:ts=8 fdm=marker