Mercurial > vim
diff runtime/autoload/netrw.vim @ 482:6f8b578776ab v7.0131
updated for version 7.0131
author | vimboss |
---|---|
date | Tue, 16 Aug 2005 23:01:50 +0000 |
parents | |
children | f012c4ed8c38 |
line wrap: on
line diff
new file mode 100644 --- /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