home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / netrw.vim < prev    next >
Text File  |  2003-08-12  |  38KB  |  1,131 lines

  1. " netrw.vim: (global plugin) Handles file transfer across a network
  2. " Last Change:    May 02, 2003
  3. " Maintainer:    Charles E. Campbell, Jr. PhD   <cec@NgrOyphSon.gPsfAc.nMasa.gov>
  4. " Version:    31
  5.  
  6. " Credits:
  7. "  Vim editor   by Bram Moolenaar (Thanks, Bram!)
  8. "  rcp, ftp support by C Campbell <cec@NgrOyphSon.gPsfAc.nMasa.gov>
  9. "  fetch    support by Bram Moolenaar and C Campbell
  10. "  scp        support by raf          <raf@comdyn.com.au>
  11. "  http     support by Bram Moolenaar <bram@moolenaar.net>
  12. "  dav        support by C Campbell
  13. "  rsync    support by C Campbell (suggested by Erik Warendorph)
  14. "  inputsecret(), BufReadCmd, BufWriteCmd contributed by C Campbell
  15. "
  16. "     JΘr⌠me AugΘ     -- also using new buffer method with ftp+.netrc
  17. "     Bram Moolenaar     -- obviously vim itself, plus :e and v:cmdarg use
  18. "     Yasuhiro Matsumoto -- pointing out undo+0r problem and a solution
  19. "     Erik Warendorph     -- for several suggestions (g:netrw_..._cmd
  20. "                variables, rsync etc)
  21.  
  22. " Debugging:
  23. "    If you'd like to try the built-in debugging commands...
  24. ""        :g/DBG/s/^"//        to activate    debugging
  25. ""        :g/DBG/s/^/"/        to de-activate    debugging
  26. ""    You'll need to get <Decho.vim> and put it into your <.vim/plugin>
  27. ""    (or <vimfiles\plugin> for Windows).  Its available at
  28. ""    http://www.erols.com/astronaut/vim/vimscript/Decho.vim
  29.  
  30. " Options:
  31. "    let g:netrw_ftp =0 use ftp (default)             (uid password)
  32. "            =1 use alternate ftp method    (user uid password)
  33. "      If you're having trouble with ftp, try changing the value
  34. "      of this variable in your <.vimrc> to change methods
  35. "
  36. "    let g:netrw_ignorenetrc= 1
  37. "      If you have a <.netrc> file but it doesn't work and you
  38. "      want it ignored, then set this variable as shown.  Its mere
  39. "      existence is enough to cause <.netrc> to be ignored.
  40. "
  41. "    User Function NetReadFixup(method, line1, line2)
  42. "      If your ftp has an obnoxious habit of prepending/appending
  43. "      lines to stuff it reads (for example, one chap had a misconfigured
  44. "      ftp with kerberos which kept complaining with AUTH and KERBEROS
  45. "      messages) you may write your own function NetReadFixup to fix
  46. "      up the file.    To help with writing a NetReadFixup function,
  47. "      some information has been provided:
  48. "
  49. "         line1 = first new line in current file
  50. "         line2 = last  new line in current file
  51. "         method= 1 = rcp
  52. "             2 = ftp+.netrc
  53. "             3 = ftp
  54. "             4 = scp
  55. "             5 = wget
  56. "             6 = cadaver
  57. "             7 = rsync
  58. "
  59. "
  60. "    Controlling External Applications
  61. "
  62. "     Protocol  Variable           Default Value
  63. "     --------  ----------------    -------------
  64. "       rcp:    g:netrw_rcp_cmd   = "rcp"
  65. "       ftp:    g:netrw_ftp_cmd   = "ftp"
  66. "       scp:    g:netrw_scp_cmd   = "scp -q"
  67. "       http:   g:netrw_http_cmd  = "wget -O"
  68. "       dav:    g:netrw_dav_cmd   = "cadaver"
  69. "       rsync:  g:netrw_rsync_cmd = "rsync -a"
  70. "       ftp:    g:netrw_fetch_cmd = ""   (if its not "" it will be used
  71. "       http:                 to read files via ftp and http:)
  72.  
  73.  
  74. " Reading:
  75. " :Nread ?                    give help
  76. " :Nread "machine:file"                uses rcp
  77. " :Nread "machine file"                uses ftp   with <.netrc>
  78. " :Nread "machine id password file"        uses ftp
  79. " :Nread "ftp://[user@]machine[[:#]port]/file"    uses ftp   autodetects <.netrc>
  80. " :Nread "http://[user@]machine/file"        uses http  uses wget
  81. " :Nread "rcp://[user@]machine/file"        uses rcp
  82. " :Nread "scp://[user@]machine/file"        uses scp
  83. " :Nread "dav://machine[:port]/file"        uses cadaver
  84. " :Nread "rsync://[user@]machine[:port]/file"    uses rsync
  85.  
  86. " Writing:
  87. " :Nwrite ?                    give help
  88. " :Nwrite "machine:file"            uses rcp
  89. " :Nwrite "machine file"            uses ftp   with <.netrc>
  90. " :Nwrite "machine id password file"        uses ftp
  91. " :Nwrite "ftp://[user@]machine[[:#]port]/file"    uses ftp   autodetects <.netrc>
  92. " :Nwrite "rcp://[user@]machine/file"        uses rcp
  93. " :Nwrite "scp://[user@]machine/file"        uses scp
  94. " :Nwrite "dav://machine[:port]/file"        uses cadaver
  95. " :Nwrite "rsync://[user@]machine[:port]/file"    uses rsync
  96. " http: not supported!
  97.  
  98. " User And Password Changing:
  99. "  Attempts to use ftp will prompt you for a user-id and a password.
  100. "  These will be saved in g:netrw_uid and g:netrw_passwd
  101. "  Subsequent uses of ftp will re-use those.  If you need to use
  102. "  a different user id and/or password, you'll want to
  103. "  call NetUserPass() first.
  104.  
  105. "    :NetUserPass [uid [password]]        -- prompts as needed
  106. "    :call NetUserPass()            -- prompts for uid and password
  107. "    :call NetUserPass("uid")        -- prompts for password
  108. "    :call NetUserPass("uid","password")    -- sets global uid and password
  109.  
  110. " Variables:
  111. "    b:netrw_lastfile last file Network-read/written retained on
  112. "              a per-buffer basis        (supports plain :Nw )
  113. "    b:netrw_line      during Nw/NetWrite, holds current line   number
  114. "    b:netrw_col      during Nw/NetWrite, holds current column number
  115. "              b:netrw_line and b:netrw_col are used to
  116. "              restore the cursor position on writes
  117. "    g:netrw_ftp      if it doesn't exist, use default ftp
  118. "              =0 use default ftp               (uid password)
  119. "              =1 use alternate ftp method      (user uid password)
  120. "    g:netrw_ftpmode   ="binary"                    (default)
  121. "              ="ascii"                 (or your choice)
  122. "    g:netrw_uid      (ftp) user-id,      retained on a per-session basis
  123. "    g:netrw_passwd      (ftp) password,     retained on a per-session basis
  124. "    g:netrw_win95ftp  =0 use unix-style ftp even if win95/win98/winME
  125. "              =1 use default method to do ftp
  126. "    g:netrw_cygwin      =1 assume scp under windows is from cygwin
  127. "                             (default if windows)
  128. "              =0 assume scp under windows accepts
  129. "                windows-style paths         (default otherwise)
  130. "    g:netrw_use_nt_rcp=0 don't use the rcp of WinNT, Win2000 and WinXP (default)
  131. "              =1 use the rcp of WinNT,... in binary mode
  132. "
  133. "  But be doers of the word, and not only hearers, deluding your own selves
  134. "  (James 1:22 RSV)
  135. " =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  136.  
  137. " Exit quickly when already loaded or when 'compatible' is set.
  138. if exists("loaded_netrw") || &cp
  139.   finish
  140. endif
  141. let loaded_netrw = "v25"
  142. let s:save_cpo = &cpo
  143. set cpo&vim
  144.  
  145. " Default values for global netrw variables
  146. if !exists("g:netrw_ftpmode")
  147.  let g:netrw_ftpmode= "binary"
  148. endif
  149. if !exists("g:netrw_win95ftp")
  150.  let g:netrw_win95ftp= 1
  151. endif
  152. if !exists("g:netrw_cygwin")
  153.  if has("win32")
  154.   let g:netrw_cygwin= 1
  155.  else
  156.   let g:netrw_cygwin= 0
  157.  endif
  158. endif
  159.  
  160. " Default commands(+options) for associated
  161. " protocols.  Users may override these in
  162. " their <.vimrc> by simply defining them
  163. " to be whatever they wish.
  164. if !exists("g:netrw_rcp_cmd")
  165.   let g:netrw_rcp_cmd   = "rcp"
  166. endif
  167. if !exists("g:netrw_ftp_cmd")
  168.   let g:netrw_ftp_cmd   = "ftp"
  169. endif
  170. if !exists("g:netrw_scp_cmd")
  171.   let g:netrw_scp_cmd   = "scp -q"
  172. endif
  173. if !exists("g:netrw_http_cmd")
  174.   let g:netrw_http_cmd  = "wget -O"
  175. endif
  176. if !exists("g:netrw_dav_cmd")
  177.   let g:netrw_dav_cmd   = "cadaver"
  178. endif
  179. if !exists("g:netrw_rsync_cmd")
  180.   let g:netrw_rsync_cmd = "rsync -a"
  181. endif
  182. if !exists("g:netrw_fetch_cmd")
  183.   if executable("fetch") > 0
  184.     let g:netrw_fetch_cmd = "fetch -o"
  185.   else
  186.     let g:netrw_fetch_cmd = ""
  187.   endif
  188. endif
  189.  
  190. if has("win32")
  191.   \ && exists("g:netrw_use_nt_rcp")
  192.   \ && g:netrw_use_nt_rcp
  193.   \ && executable( $SystemRoot .'/system32/rcp.exe')
  194.  let s:netrw_has_nt_rcp = 1
  195.  let s:netrw_rcpmode = '-b'
  196. else
  197.  let s:netrw_has_nt_rcp = 0
  198.  let s:netrw_rcpmode = ''
  199. endif
  200.  
  201. " Transparency Support:
  202. " Auto-detection for ftp://*, rcp://*, scp://*, http://*, dav://*, and rsync://*
  203. " Should make file transfers across networks transparent.  Currently I haven't
  204. " supported appends.  Hey, gotta leave something for <netrw.vim> version 3!
  205. if version >= 600
  206.  augroup Network
  207.   au!
  208.   au BufReadCmd  ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://* exe "Nread 0r ".expand("<afile>")|exe "doau BufReadPost ".expand("<afile>")
  209.   au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://* exe "Nread "   .expand("<afile>")|exe "doau BufReadPost ".expand("<afile>")
  210.   au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*       exe "Nwrite "  .expand("<afile>")
  211.  augroup END
  212. endif
  213.  
  214. " ------------------------------------------------------------------------
  215.  
  216. " Commands: :Nread, :Nwrite, and :NetUserPass
  217. :com -nargs=* Nread          call s:NetRead(<f-args>)
  218. :com -range=% -nargs=* Nwrite silent <line1>,<line2>call s:NetWrite(<f-args>)
  219. :com -nargs=* NetUserPass     call NetUserPass(<f-args>)
  220.  
  221. " ------------------------------------------------------------------------
  222.  
  223. " NetSavePosn: saves position of cursor on screen so NetWrite can restore it
  224. function! s:NetSavePosn()
  225.   " Save current line and column
  226.   let b:netrw_line = line(".")
  227.   let b:netrw_col  = col(".") - 1
  228.  
  229.   " Save top-of-screen line
  230.   norm! H
  231.   let b:netrw_hline= line(".")
  232.  
  233.   call s:NetRestorePosn()
  234. endfunction
  235.  
  236. " ------------------------------------------------------------------------
  237.  
  238. " NetRestorePosn:
  239. fu! s:NetRestorePosn()
  240.  
  241.   " restore top-of-screen line
  242.   exe "norm! ".b:netrw_hline."G0z\<CR>"
  243.  
  244.   " restore position
  245.   if b:netrw_col == 0
  246.    exe "norm! ".b:netrw_line."G0"
  247.   else
  248.    exe "norm! ".b:netrw_line."G0".b:netrw_col."l"
  249.   endif
  250. endfunction
  251.  
  252. " ------------------------------------------------------------------------
  253.  
  254. " NetRead: responsible for reading a file over the net
  255. function! s:NetRead(...)
  256. " call Decho("DBG: NetRead(a:1<".a:1.">) {")
  257.  
  258.  " save options
  259.  call s:NetOptionSave()
  260.  
  261.  " get name of a temporary file
  262.  let tmpfile= tempname()
  263.  
  264.  " Special Exception: if a file is named "0r", then
  265.  "              "0r" will be used to read the
  266.  "              following files instead of "r"
  267.  if    a:0 == 0
  268.   let readcmd= "r"
  269.   let ichoice= 0
  270.  elseif a:1 == "0r"
  271.   let readcmd = "0r"
  272.   let ichoice = 2
  273.  else
  274.   let readcmd = "r"
  275.   let ichoice = 1
  276.  endif
  277.  
  278.  while ichoice <= a:0
  279.  
  280.   " attempt to repeat with previous host-file-etc
  281.   if exists("b:netrw_lastfile") && a:0 == 0
  282. "   call Decho("DBG: using b:netrw_lastfile<" . b:netrw_lastfile . ">")
  283.    let choice = b:netrw_lastfile
  284.    let ichoice= ichoice + 1
  285.  
  286.   else
  287.    exe "let choice= a:" . ichoice
  288. "   call Decho("DBG: NetRead1: choice<" . choice . ">")
  289.  
  290.    " Reconstruct Choice if choice starts with '"'
  291.    if match(choice,"?") == 0
  292.     echo 'NetRead Usage:'
  293.     echo ':Nread machine:path                      uses rcp'
  294.     echo ':Nread "machine path"                    uses ftp   with <.netrc>'
  295.     echo ':Nread "machine id password path"        uses ftp'
  296.     echo ':Nread ftp://[user@]machine[:port]/path  uses ftp   autodetects <.netrc>'
  297.     echo ':Nread http://[user@]machine/path        uses http  wget'
  298.     echo ':Nread rcp://[user@]machine/path         uses rcp'
  299.     echo ':Nread scp://[user@]machine/path         uses scp'
  300.     echo ':Nread dav://machine[:port]/path         uses cadaver'
  301.     echo ':Nread rsync://machine[:port]/path       uses rsync'
  302.     break
  303.    elseif match(choice,"^\"") != -1
  304. "    call Decho("DBG: reconstructing choice")
  305.     if match(choice,"\"$") != -1
  306.      " case "..."
  307.      let choice=strpart(choice,1,strlen(choice)-2)
  308.     else
  309.       "  case "... ... ..."
  310.      let choice      = strpart(choice,1,strlen(choice)-1)
  311.      let wholechoice = ""
  312.  
  313.      while match(choice,"\"$") == -1
  314.       let wholechoice = wholechoice . " " . choice
  315.       let ichoice     = ichoice + 1
  316.       if ichoice > a:0
  317.        echoerr "Unbalanced string in filename '". wholechoice ."'"
  318.        return
  319.       endif
  320.       let choice= a:{ichoice}
  321.      endwhile
  322.      let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
  323.     endif
  324.    endif
  325.   endif
  326. "  call Decho("DBG: NetRead2: choice<" . choice . ">")
  327.   let ichoice= ichoice + 1
  328.  
  329.   " fix up windows urls
  330.   if has("win32")
  331.    let choice = substitute(choice,'\\','/','ge')
  332. "   call Decho("DBG: fixing up windows url to <".choice.">")
  333.    exe 'lcd ' . fnamemodify(tmpfile,':h')
  334.    let tmpfile = fnamemodify(tmpfile,':t')
  335.   endif
  336.  
  337.   " Determine method of read (ftp, rcp, etc)
  338.   call s:NetMethod(choice)
  339.  
  340.   " ============
  341.   " Perform Read
  342.   " ============
  343.  
  344.   ".........................................
  345.   " rcp:  Method #1
  346.   if  b:netrw_method == 1 " read with rcp
  347. "   call Decho("DBG:read via rcp (method #1)")
  348.   " ER: noting done with g:netrw_uid yet?
  349.   " ER: on Win2K" rcp machine[.user]:file tmpfile
  350.   " ER: if machine contains '.' adding .user is required (use $USERNAME)
  351.   " ER: the tmpfile is full path: rcp sees C:\... as host C
  352.   if s:netrw_has_nt_rcp == 1
  353.    if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
  354.     let uid_machine = g:netrw_machine .'.'. g:netrw_uid
  355.    else
  356.     " Any way needed it machine contains a '.'
  357.     let uid_machine = g:netrw_machine .'.'. $USERNAME
  358.    endif
  359.   else
  360.    if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
  361.     let uid_machine = g:netrw_uid .'@'. g:netrw_machine
  362.    else
  363.     let uid_machine = g:netrw_machine
  364.    endif
  365.   endif
  366.   exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
  367.    let result        = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  368.    let b:netrw_lastfile = choice
  369.  
  370.   ".........................................
  371.   " ftp + <.netrc>:  Method #2
  372.   elseif b:netrw_method  == 2        " read with ftp + <.netrc>
  373.    if g:netrw_fetch_cmd != ""
  374. "    call Decho("DBG: read via fetch for ftp+.netrc (method #2)")
  375.     exe "!".g:netrw_fetch_cmd." ".tmpfile." ftp://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
  376.    else
  377. "    call Decho("DBG: read via ftp+.netrc (method #2)")
  378.     let netrw_fname= b:netrw_fname
  379.     new
  380.     set ff=unix
  381.     exe "put ='".g:netrw_ftpmode."'"
  382.     exe "put ='get ".netrw_fname." ".tmpfile."'"
  383.     if exists("g:netrw_port") && g:netrw_port != ""
  384.      exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
  385.     else
  386.      exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
  387.     endif
  388.     bd!
  389.    endif
  390.    let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  391.    let b:netrw_lastfile = choice
  392.  
  393.   ".........................................
  394.   " ftp + machine,id,passwd,filename:  Method #3
  395.   elseif b:netrw_method == 3        " read with ftp + machine, id, passwd, and fname
  396.    if g:netrw_fetch_cmd != ""
  397. "   call Decho("DBG: read via fetch for ftp+mipf (method #3)")
  398.     exe "!".g:netrw_fetch_cmd." ".tmpfile." ftp://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
  399.    else
  400.     " Construct execution string (four lines) which will be passed through filter
  401. "   call Decho("DBG: read via ftp+mipf (method #3)")
  402.     let netrw_fname= b:netrw_fname
  403.     new
  404.     set ff=unix
  405.     if exists("g:netrw_port") && g:netrw_port != ""
  406.      put ='open '.g:netrw_machine.' '.g:netrw_port
  407.     else
  408.      put ='open '.g:netrw_machine
  409.     endif
  410.  
  411.     if exists("g:netrw_ftp") && g:netrw_ftp == 1
  412.      put =g:netrw_uid
  413.      put =g:netrw_passwd
  414.     else
  415.      put ='user '.g:netrw_uid.' '.g:netrw_passwd
  416.     endif
  417.  
  418.     if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
  419.      put =g:netrw_ftpmode
  420.     endif
  421.     put ='get '.netrw_fname.' '.tmpfile
  422.  
  423.     " perform ftp:
  424.     " -i       : turns off interactive prompting from ftp
  425.     " -n  unix : DON'T use <.netrc>, even though it exists
  426.     " -n  win32: quit being obnoxious about password
  427. "    call Decho('DBG: performing ftp -i -n')
  428.     norm 1Gdd
  429.     silent exe "%!".g:netrw_ftp_cmd." -i -n"
  430.     bd!
  431.    endif
  432.    let result        = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  433.    let b:netrw_lastfile = choice
  434.  
  435.   ".........................................
  436.   " scp: Method #4
  437.   elseif     b:netrw_method  == 4    " read with scp
  438. "   call Decho("DBG: read via scp (method #4)")
  439.    if g:netrw_cygwin == 1
  440.     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
  441.     exe "!".g:netrw_scp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
  442.    else
  443.     exe "!".g:netrw_scp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
  444.    endif
  445.    let result        = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  446.    let b:netrw_lastfile = choice
  447.  
  448.   ".........................................
  449.   elseif     b:netrw_method  == 5    " read with http (wget)
  450. "   call Decho("DBG: read via http (method #5)")
  451.    if g:netrw_fetch_cmd != ""
  452.     exe "!".g:netrw_fetch_cmd." ".tmpfile." http://".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
  453.     let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  454.  
  455.    elseif match(b:netrw_fname,"#") == -1
  456.     exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
  457.     let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  458.  
  459.    else
  460.     let netrw_html= substitute(b:netrw_fname,"#.*$","","")
  461.     let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
  462. "    call Decho("DBG: netrw_html<".netrw_html.">")
  463. "    call Decho("DBG: netrw_tag <".netrw_tag.">")
  464.     exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
  465.     let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  466. "    call Decho('DBG: <\s*a\s*name=\s*"'.netrw_tag.'"/')
  467.     exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
  468.    endif
  469.    let b:netrw_lastfile = choice
  470.  
  471.   ".........................................
  472.   " cadaver: Method #6
  473.   elseif     b:netrw_method  == 6    " read with cadaver
  474. "   call Decho("DBG: read via cadaver (method #6)")
  475.  
  476.    " Construct execution string (four lines) which will be passed through filter
  477.    let netrw_fname= b:netrw_fname
  478.    new
  479.    set ff=unix
  480.    if exists("g:netrw_port") && g:netrw_port != ""
  481.     put ='open '.g:netrw_machine.' '.g:netrw_port
  482.    else
  483.     put ='open '.g:netrw_machine
  484.    endif
  485.    put ='user '.g:netrw_uid.' '.g:netrw_passwd
  486.  
  487.    if g:netrw_cygwin == 1
  488.     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
  489.     put ='get '.netrw_fname.' '.cygtmpfile
  490.    else
  491.     put ='get '.netrw_fname.' '.tmpfile
  492.    endif
  493.  
  494.    " perform cadaver operation:
  495.    norm 1Gdd
  496.    silent exe "%!".g:netrw_dav_cmd
  497.    bd!
  498.    let result        = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
  499.    let b:netrw_lastfile = choice
  500.  
  501.   ".........................................
  502.   " rsync: Method #7
  503.   elseif     b:netrw_method  == 7    " read with rsync
  504. "   call Decho("DBG: read via rsync (method #7)")
  505.    if g:netrw_cygwin == 1
  506.     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
  507.     exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
  508.    else
  509.     exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
  510.    endif
  511.    let result        = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
  512.    let b:netrw_lastfile = choice
  513.  
  514.   ".........................................
  515.   else " Complain
  516.    echo "***warning*** unable to comply with your request<" . choice . ">"
  517.   endif
  518.  endwhile
  519.  
  520.  " cleanup
  521. " call Decho("DBG NetRead: cleanup")
  522.  if exists("b:netrw_method")
  523.   unlet b:netrw_method
  524.   unlet g:netrw_machine
  525.   unlet b:netrw_fname
  526.  endif
  527.  call s:NetOptionRestore()
  528.  
  529. " call Decho("DBG: return NetRead }")
  530. endfunction
  531. " end of NetRead
  532.  
  533. " ------------------------------------------------------------------------
  534.  
  535. " NetGetFile: Function to read file "fname" with command "readcmd".
  536. function! s:NetGetFile(readcmd, fname, method)
  537. "  call Decho("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
  538.  
  539.  if exists("*NetReadFixup")
  540.   " for the use of NetReadFixup (not otherwise used internally)
  541.   let line2= line("$")
  542.  endif
  543.  
  544.  if &term == "win32"
  545.   if &shell == "bash"
  546.    let fname=a:fname
  547. "  call Decho("(win32 && bash) fname<".fname.">")
  548.   else
  549.    let fname=substitute(a:fname,'/','\\\\','ge')
  550. "  call Decho("(win32 && !bash) fname<".fname.">")
  551.   endif
  552.  else
  553.   let fname= a:fname
  554. "  call Decho("(copied) fname<".fname.">")
  555.  endif
  556.  
  557.  " get the file, but disable undo when reading a new buffer
  558.  if a:readcmd[0] == '0'
  559.   let use_e_cmd = 0        " 1 when using ':edit'
  560.   let delline = 0        " 1 when have to delete empty last line
  561.   if line("$") == 1 && getline(1) == ""
  562.    " Now being asked to 0r a file into an empty file.  Safe to :e it instead,
  563.    " unless there is another window on the same buffer.
  564.    let curbufnr = bufnr("%")
  565.    let use_e_cmd = 1
  566.    let delline = 1
  567.    " Loop over all windows, reset use_e_cmd when another one is editing the
  568.    " current buffer.
  569.    let i = 1
  570.    while 1
  571.      if i != winnr() && winbufnr(i) == curbufnr
  572.        let use_e_cmd = 0
  573.        break
  574.      endif
  575.      let i = i + 1
  576.      if winbufnr(i) < 0
  577.        break
  578.      endif
  579.    endwhile
  580.   endif
  581.   if use_e_cmd > 0
  582.    " ':edit' the temp file, wipe out the old buffer and rename the buffer
  583.    let curfilename = expand("%")
  584.    exe "e!".v:cmdarg." ".fname
  585.    exe curbufnr . "bwipe"
  586.    exe "f ".curfilename
  587.   else
  588.    let oldul= &ul
  589.    set ul=-1
  590.    exe a:readcmd.v:cmdarg . " " . fname
  591.    if delline > 0
  592.      $del
  593.    endif
  594.    let &ul= oldul
  595.   endif
  596.  else
  597.   exe a:readcmd.v:cmdarg . " " . fname
  598.  endif
  599.  
  600.  " User-provided (ie. optional) fix-it-up command
  601.  if exists("*NetReadFixup")
  602.   let line1= line(".")
  603.   if a:readcmd == "r"
  604.    let line2= line("$") - line2 + line1
  605.   else
  606.    let line2= line("$") - line2
  607.   endif
  608. "  call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
  609.   call NetReadFixup(a:method, line1, line2)
  610.  endif
  611. " call Decho("DBG: NetGetFile readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
  612.  redraw!
  613.  return
  614. endfunction
  615.  
  616. " ------------------------------------------------------------------------
  617.  
  618. " NetWrite: responsible for writing a file over the net
  619. function! s:NetWrite(...) range
  620. " call Decho("DBG: NetWrite(a:0=".a:0.") {")
  621.  
  622.  call s:NetSavePosn()
  623.  
  624.  " option handling
  625.  call s:NetOptionSave()
  626.  
  627.  " Get Temporary Filename
  628.  let tmpfile= tempname()
  629.  
  630.  if a:0 == 0
  631.   let ichoice = 0
  632.  else
  633.   let ichoice = 1
  634.  endif
  635.  
  636.  " write (selected portion of) file to temporary
  637.  exe a:firstline . "," . a:lastline . "w!" . v:cmdarg . " " . tmpfile
  638.  
  639.  while ichoice <= a:0
  640.  
  641.   " attempt to repeat with previous host-file-etc
  642.   if exists("b:netrw_lastfile") && a:0 == 0
  643. "   call Decho("DBG: using b:netrw_lastfile<" . b:netrw_lastfile . ">")
  644.    let choice = b:netrw_lastfile
  645.    let ichoice= ichoice + 1
  646.   else
  647.    exe "let choice= a:" . ichoice
  648.  
  649.    " Reconstruct Choice if choice starts with '"'
  650.    if match(choice,"?") == 0
  651.     echo 'NetWrite Usage:"'
  652.     echo ':Nwrite machine:path                uses rcp'
  653.     echo ':Nwrite "machine path"              uses ftp with <.netrc>'
  654.     echo ':Nwrite "machine id password path"  uses ftp'
  655.     echo ':Nwrite ftp://machine[#port]/path   uses ftp  (autodetects <.netrc>)'
  656.     echo ':Nwrite rcp://machine/path          uses rcp'
  657.     echo ':Nwrite scp://[user@]machine/path   uses scp'
  658.     echo ':Nwrite dav://[user@]machine/path   uses cadaver'
  659.     echo ':Nwrite rsync://[user@]machine/path uses cadaver'
  660.     break
  661.  
  662.    elseif match(choice,"^\"") != -1
  663.     if match(choice,"\"$") != -1
  664.       " case "..."
  665.      let choice=strpart(choice,1,strlen(choice)-2)
  666.     else
  667.      "  case "... ... ..."
  668.      let choice      = strpart(choice,1,strlen(choice)-1)
  669.      let wholechoice = ""
  670.  
  671.      while match(choice,"\"$") == -1
  672.       let wholechoice= wholechoice . " " . choice
  673.       let ichoice    = ichoice + 1
  674.       if choice > a:0
  675.        echoerr "Unbalanced string in filename '". wholechoice ."'"
  676.        return
  677.       endif
  678.       let choice= a:{ichoice}
  679.      endwhile
  680.      let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
  681.     endif
  682.    endif
  683.   endif
  684. "  call Decho("DBG: choice<" . choice . ">")
  685.   let ichoice= ichoice + 1
  686.  
  687.   " fix up windows urls
  688.   if has("win32")
  689.    let choice= substitute(choice,'\\','/','ge')
  690.    "ER: see NetRead()
  691.    exe 'lcd ' . fnamemodify(tmpfile,':h')
  692.    let tmpfile = fnamemodify(tmpfile,':t')
  693.   endif
  694.  
  695.   " Determine method of read (ftp, rcp, etc)
  696.   call s:NetMethod(choice)
  697.  
  698.   " =============
  699.   " Perform Write
  700.   " =============
  701.  
  702.   ".........................................
  703.   " rcp: Method #1
  704.   if  b:netrw_method == 1    " write with rcp
  705. "    Decho "DBG:write via rcp (method #1)"
  706.    if s:netrw_has_nt_rcp == 1
  707.     if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
  708.      let uid_machine = g:netrw_machine .'.'. g:netrw_uid
  709.     else
  710.      " Any way needed it machine contains a '.'
  711.      let uid_machine = g:netrw_machine .'.'. $USERNAME
  712.     endif
  713.    else
  714.     if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
  715.      let uid_machine = g:netrw_uid .'@'. g:netrw_machine
  716.     else
  717.      let uid_machine = g:netrw_machine
  718.     endif
  719.    endif
  720.    exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
  721.    let b:netrw_lastfile = choice
  722.  
  723.   ".........................................
  724.   " ftp + <.netrc>: Method #2
  725.   elseif b:netrw_method == 2    " write with ftp + <.netrc>
  726.    let netrw_fname= b:netrw_fname
  727.    new
  728.    set ff=unix
  729.    exe "put ='".g:netrw_ftpmode."'"
  730. "   call Decho("DBG: NetWrite: put ='".g:netrw_ftpmode."'")
  731.    exe "put ='put ".tmpfile." ".netrw_fname."'"
  732. "   call Decho("DBG: NetWrite: put ='put ".tmpfile." ".netrw_fname."'")
  733.    if exists("g:netrw_port") && g:netrw_port != ""
  734.     exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
  735. "    call Decho("DBG: NetWrite: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
  736.    else
  737.     exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
  738. "    call Decho("DBG: NetWrite: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
  739.    endif
  740.    bd!
  741.    let b:netrw_lastfile = choice
  742.  
  743.   ".........................................
  744.   " ftp + machine, id, passwd, filename: Method #3
  745.   elseif b:netrw_method == 3    " write with ftp + machine, id, passwd, and fname
  746.    let netrw_fname= b:netrw_fname
  747.    new
  748.    set ff=unix
  749.    if exists("g:netrw_port") && g:netrw_port != ""
  750.     put ='open '.g:netrw_machine.' '.g:netrw_port
  751.    else
  752.     put ='open '.g:netrw_machine
  753.    endif
  754.    if exists("g:netrw_ftp") && g:netrw_ftp == 1
  755.     put =g:netrw_uid
  756.     put =g:netrw_passwd
  757.    else
  758.     put ='user '.g:netrw_uid.' '.g:netrw_passwd
  759.    endif
  760.    put ='put '.tmpfile.' '.netrw_fname
  761.    " save choice/id/password for future use
  762.    let b:netrw_lastfile = choice
  763.  
  764.    " perform ftp:
  765.    " -i       : turns off interactive prompting from ftp
  766.    " -n  unix : DON'T use <.netrc>, even though it exists
  767.    " -n  win32: quit being obnoxious about password
  768. "   call Decho('DBG: performing ftp -i -n')
  769.    norm 1Gdd
  770.    silent exe "%!".g:netrw_ftp_cmd." -i -n"
  771.    bd!
  772.  
  773.   ".........................................
  774.   " scp: Method #4
  775.   elseif     b:netrw_method == 4    " write with scp
  776.    if g:netrw_cygwin == 1
  777.     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
  778.     exe "!".g:netrw_scp_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
  779.    else
  780.     exe "!".g:netrw_scp_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
  781.    endif
  782.    let b:netrw_lastfile = choice
  783.  
  784.   ".........................................
  785.   " http: Method #5
  786.   elseif     b:netrw_method == 5
  787.    echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
  788.  
  789.   ".........................................
  790.   " dav: Method #6
  791.   elseif     b:netrw_method == 6    " write with cadaver
  792. "   call Decho("DBG: write via cadaver (method #6)")
  793.  
  794.    " Construct execution string (four lines) which will be passed through filter
  795.    let netrw_fname= b:netrw_fname
  796.    new
  797.    set ff=unix
  798.    if exists("g:netrw_port") && g:netrw_port != ""
  799.     put ='open '.g:netrw_machine.' '.g:netrw_port
  800.    else
  801.     put ='open '.g:netrw_machine
  802.    endif
  803.    put ='user '.g:netrw_uid.' '.g:netrw_passwd
  804.  
  805.    if g:netrw_cygwin == 1
  806.     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
  807.     put ='put '.cygtmpfile.' '.netrw_fname
  808.    else
  809.     put ='put '.tmpfile.' '.netrw_fname
  810.    endif
  811.  
  812.    " perform cadaver operation:
  813.    norm 1Gdd
  814.    silent exe "%!".g:netrw_dav_cmd
  815.    bd!
  816.    let b:netrw_lastfile = choice
  817.  
  818.   ".........................................
  819.   " rsync: Method #7
  820.   elseif     b:netrw_method == 7    " write with rsync
  821.    if g:netrw_cygwin == 1
  822.     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
  823.     exe "!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
  824.    else
  825.     exe "!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
  826.    endif
  827.    let b:netrw_lastfile = choice
  828.  
  829.   ".........................................
  830.   else " Complain
  831.    echo "***warning*** unable to comply with your request<" . choice . ">"
  832.   endif
  833.  endwhile
  834.  
  835.  " cleanup
  836. " call Decho("DBG: NetWrite: cleanup")
  837.  let result=delete(tmpfile)
  838.  call s:NetOptionRestore()
  839.  
  840.  if a:firstline == 1 && a:lastline == line("$")
  841.   set nomod
  842.  endif
  843.  
  844.  " restore position -- goto original top-of-screen line,
  845.  " make it the current top-of-screen.  Then goto the
  846.  " original line and column.
  847.  exe "norm! ".b:netrw_hline."Gzt"
  848.  if b:netrw_col == 0
  849.   exe "norm! ".b:netrw_line."G0"
  850.  else
  851.   exe "norm! ".b:netrw_line."G0".b:netrw_col."l"
  852.  endif
  853.  
  854. " call Decho("DBG: return NetWrite }")
  855. endfunction
  856. " end of NetWrite
  857.  
  858. " ------------------------------------------------------------------------
  859.  
  860. " NetMethod:  determine method of transfer
  861. "  method == 1: rcp
  862. "         2: ftp + <.netrc>
  863. "         3: ftp + machine, id, password, and [path]filename
  864. "         4: scp
  865. "         5: http (wget)
  866. "         6: cadaver
  867. "         7: rsync
  868. function! s:NetMethod(choice)  " globals: method machine id passwd fname
  869. " call Decho("DBG: NetMethod(a:choice<".a:choice.">) {")
  870.  
  871.  " initialization
  872.  let b:netrw_method  = 0
  873.  let g:netrw_machine = ""
  874.  let b:netrw_fname   = ""
  875.  let g:netrw_port    = ""
  876.  
  877.  " Patterns:
  878.  " mipf     : a:machine a:id password filename        Use ftp
  879.  " mf        : a:machine filename            Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
  880.  " ftpurm   : ftp://[user@]host[[#:]port]/filename  Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
  881.  " rcpurm   : rcp://[user@]host/filename        Use rcp
  882.  " rcphf    : [user@]host:filename            Use rcp
  883.  " scpurm   : scp://[user@]host/filename        Use scp
  884.  " httpurm  : http://[user@]host/filename        Use wget
  885.  " davurm   : dav://host[:port]/path            Use cadaver
  886.  " rsyncurm : rsync://host[:port]/path            Use rsync
  887.  let mipf     = '\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)'
  888.  let mf       = '\(\S\+\)\s\+\(\S\+\)'
  889.  let ftpurm   = 'ftp://\([^/@]@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
  890.  let rcpurm   = 'rcp://\([^/@]@\)\=\([^/]\{-}\)/\(.*\)$'
  891.  let rcphf    = '\([^@]\{-}@\)\=\(\I\i*\):\(\S\+\)'
  892.  let scpurm   = 'scp://\([^/]\{-}\)/\(.*\)$'
  893.  let httpurm  = 'http://\([^/]\{-}\)\(/.*\)\=$'
  894.  let davurm   = 'dav://\([^/]\{-}\)/\(.*\)\=$'
  895.  let rsyncurm = 'rsync://\([^/]\{-}\)/\(.*\)\=$'
  896.  
  897.  " Determine Method
  898.  " rcp://user@hostname/...path-to-file
  899.  if match(a:choice,rcpurm) == 0
  900. "  call Decho("DBG: NetMethod: rcp://...")
  901.   let b:netrw_method = 1
  902.   let userid         = substitute(a:choice,rcpurm,'\1',"")
  903.   let g:netrw_machine= substitute(a:choice,rcpurm,'\2',"")
  904.   let b:netrw_fname  = substitute(a:choice,rcpurm,'\3',"")
  905.   if userid != ""
  906.    let g:netrw_uid= userid
  907.   endif
  908.  
  909.  " scp://user@hostname/...path-to-file
  910.  elseif match(a:choice,scpurm) == 0
  911. "  call Decho("DBG: NetMethod: scp://...")
  912.   let b:netrw_method = 4
  913.   let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
  914.   let b:netrw_fname  = substitute(a:choice,scpurm,'\2',"")
  915.  
  916.  " http://user@hostname/...path-to-file
  917.  elseif match(a:choice,httpurm) == 0
  918. "  call Decho("DBG: NetMethod: http://...")
  919.   let b:netrw_method = 5
  920.   let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
  921.   let b:netrw_fname  = substitute(a:choice,httpurm,'\2',"")
  922.  
  923.  " dav://hostname[:port]/..path-to-file..
  924.  elseif match(a:choice,davurm) == 0
  925.   let b:netrw_method= 6
  926.   let g:netrw_machine= substitute(a:choice,davurm,'\1',"")
  927.   let b:netrw_fname  = substitute(a:choice,davurm,'\2',"")
  928.  
  929.  " rsync://user@hostname/...path-to-file
  930.  elseif match(a:choice,rsyncurm) == 0
  931. "  call Decho("DBG: NetMethod: rsync://...")
  932.   let b:netrw_method = 7
  933.   let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
  934.   let b:netrw_fname  = substitute(a:choice,rsyncurm,'\2',"")
  935.  
  936.  " ftp://[user@]hostname[[:#]port]/...path-to-file
  937.  elseif match(a:choice,ftpurm) == 0
  938. "  call Decho("DBG: NetMethod: ftp://...")
  939.   let userid         = substitute(a:choice,ftpurm,'\1',"")
  940.   let g:netrw_machine= substitute(a:choice,ftpurm,'\2',"")
  941.   let g:netrw_port   = substitute(a:choice,ftpurm,'\3',"")
  942.   let b:netrw_fname  = substitute(a:choice,ftpurm,'\4',"")
  943.   if g:netrw_port != ""
  944.     let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
  945.   endif
  946.   if userid != ""
  947.    let g:netrw_uid= userid
  948.   endif
  949.   if exists("g:netrw_uid") && exists("g:netrw_passwd")
  950.    let b:netrw_method = 3
  951.   else
  952.    if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
  953.     let b:netrw_method= 2
  954.    else
  955.     if !exists("g:netrw_uid") || g:netrw_uid == ""
  956.      call NetUserPass()
  957.     elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
  958.      call NetUserPass(g:netrw_uid)
  959.    " else just use current g:netrw_uid and g:netrw_passwd
  960.     endif
  961.     let b:netrw_method= 3
  962.    endif
  963.   endif
  964.  
  965.  " Issue an rcp: hostname:filename"
  966.  elseif match(a:choice,rcphf) == 0
  967. "  call Decho("DBG: NetMethod: (rcp) host:file")
  968.   let b:netrw_method = 1
  969.   let userid         = substitute(a:choice,rcphf,'\1',"")
  970.   let g:netrw_machine= substitute(a:choice,rcphf,'\2',"")
  971.   let b:netrw_fname  = substitute(a:choice,rcphf,'\3',"")
  972.   if userid != ""
  973.    let g:netrw_uid= userid
  974.   endif
  975.   if has("win32")
  976.    " don't let PCs try <.netrc>
  977.    let b:netrw_method = 3
  978.   endif
  979.  
  980.  " Issue an ftp : "machine id password [path/]filename"
  981.  elseif match(a:choice,mipf) == 0
  982. "  call Decho("DBG: NetMethod: (ftp) host id pass file")
  983.   let b:netrw_method  = 3
  984.   let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
  985.   let g:netrw_uid     = substitute(a:choice,mipf,'\2',"")
  986.   let g:netrw_passwd  = substitute(a:choice,mipf,'\3',"")
  987.   let b:netrw_fname   = substitute(a:choice,mipf,'\4',"")
  988.  
  989.  " Issue an ftp: "hostname [path/]filename"
  990.  elseif match(a:choice,mf) == 0
  991. "  call Decho("DBG: NetMethod: (ftp) host file")
  992.   if exists("g:netrw_uid") && exists("g:netrw_passwd")
  993.    let b:netrw_method  = 3
  994.    let g:netrw_machine = substitute(a:choice,mf,'\1',"")
  995.    let b:netrw_fname   = substitute(a:choice,mf,'\2',"")
  996.  
  997.   elseif filereadable(expand("$HOME/.netrc"))
  998.    let b:netrw_method  = 2
  999.    let g:netrw_machine = substitute(a:choice,mf,'\1',"")
  1000.    let b:netrw_fname   = substitute(a:choice,mf,'\2',"")
  1001.   endif
  1002.  
  1003.  else
  1004.   echoerr "***error*** cannot determine method"
  1005.   let b:netrw_method  = -1
  1006.  endif
  1007.  
  1008. " call Decho("DBG: NetMethod: a:choice       <".a:choice.">")
  1009. " call Decho("DBG: NetMethod: b:netrw_method <".b:netrw_method.">")
  1010. " call Decho("DBG: NetMethod: g:netrw_machine<".g:netrw_machine.">")
  1011. " call Decho("DBG: NetMethod: g:netrw_port   <".g:netrw_port.">")
  1012. " if exists("g:netrw_uid")        "DBG Decho
  1013. "  call Decho("DBG: NetMethod: g:netrw_uid    <".g:netrw_uid.">")
  1014. " endif                    "DBG Decho
  1015. " if exists("g:netrw_passwd")        "DBG Decho
  1016. "  call Decho("DBG: NetMethod: g:netrw_passwd <".g:netrw_passwd.">")
  1017. " endif                    "DBG Decho
  1018. " call Decho("DBG: NetMethod: b:netrw_fname  <".b:netrw_fname.">")
  1019. " call Decho("DBG: NetMethod return }")
  1020. endfunction
  1021. " end of NetMethod
  1022.  
  1023. " ------------------------------------------------------------------------
  1024.  
  1025. " NetUserPass: set username and password for subsequent ftp transfer
  1026. "   Usage:  :call NetUserPass()            -- will prompt for userid and password
  1027. "        :call NetUserPass("uid")        -- will prompt for password
  1028. "        :call NetUserPass("uid","password") -- sets global userid and password
  1029. function! NetUserPass(...)
  1030.  
  1031.  " get/set userid
  1032.  if a:0 == 0
  1033. "  call Decho("DBG: NetUserPass(a:0<".a:0.">) {")
  1034.   if !exists("g:netrw_uid") || g:netrw_uid == ""
  1035.    " via prompt
  1036.    let g:netrw_uid= input('Enter username: ')
  1037.   endif
  1038.  else    " from command line
  1039. "  call Decho("DBG: NetUserPass(a:1<".a:1.">) {")
  1040.   let g:netrw_uid= a:1
  1041.  endif
  1042.  
  1043.  " get password
  1044.  if a:0 <= 1 " via prompt
  1045. "  call Decho("DBG: a:0=".a:0." case <=1:")
  1046.   let g:netrw_passwd= inputsecret("Enter Password: ")
  1047.  else " from command line
  1048. "  call Decho("DBG: a:0=".a:0." case >1: a:2<".a:2.">")
  1049.   let g:netrw_passwd=a:2
  1050.  endif
  1051. "  call Decho("DBG: return NetUserPass }")
  1052. endfunction
  1053. " end NetUserPass
  1054.  
  1055. " ------------------------------------------------------------------------
  1056.  
  1057. " NetOptionSave: save options and set to "standard" form
  1058. fu!s:NetOptionSave()
  1059. " call Decho("DBG: NetOptionSave()")
  1060.  " Get Temporary Filename
  1061.  let s:aikeep    = &ai
  1062.  let s:cinkeep    = &cin
  1063.  let s:cinokeep    = &cino
  1064.  let s:comkeep    = &com
  1065.  let s:cpokeep    = &cpo
  1066.  let s:dirkeep  = getcwd()
  1067.  let s:gdkeep   = &gd
  1068.  let s:twkeep    = &tw
  1069.  set cino =
  1070.  set com  =
  1071.  set cpo -=aA
  1072.  set nocin noai
  1073.  set tw   =0
  1074.  if has("win32") && !has("win95")
  1075.   let s:swfkeep= &swf
  1076.   set noswf
  1077. "  call Decho("DBG: setting s:swfkeep to <".&swf.">")
  1078.  endif
  1079. endfunction
  1080.  
  1081. " ------------------------------------------------------------------------
  1082.  
  1083. " NetOptionRestore: restore options
  1084. function! s:NetOptionRestore()
  1085. " call Decho("DBG: NetOptionRestore()")
  1086.  let &ai    = s:aikeep
  1087.  let &cin    = s:cinkeep
  1088.  let &cino    = s:cinokeep
  1089.  let &com    = s:comkeep
  1090.  let &cpo    = s:cpokeep
  1091.  exe "lcd ".s:dirkeep
  1092.  let &gd    = s:gdkeep
  1093.  let &tw    = s:twkeep
  1094.  if exists("s:swfkeep")
  1095.   let &swf= s:swfkeep
  1096.   unlet s:swfkeep
  1097.  endif
  1098.  unlet s:aikeep
  1099.  unlet s:cinkeep
  1100.  unlet s:cinokeep
  1101.  unlet s:comkeep
  1102.  unlet s:cpokeep
  1103.  unlet s:gdkeep
  1104.  unlet s:twkeep
  1105.  unlet s:dirkeep
  1106. endfunction
  1107.  
  1108. " ------------------------------------------------------------------------
  1109.  
  1110. " NetReadFixup: this sort of function is typically written by
  1111. "        the user to handle extra junk that their system's
  1112. "        ftp dumps into the transfer.  This function is
  1113. "        provided as an example and as a fix for a
  1114. "        Windows 95 problem: in my experience, it always
  1115. "        dumped four blank lines at the end of the transfer.
  1116. if has("win95") && g:netrw_win95ftp
  1117.  fu! NetReadFixup(method, line1, line2)
  1118.    if method == 3   " ftp (no <.netrc>)
  1119.     let fourblanklines= line2 - 3
  1120.     silent fourblanklines.",".line2."g/^\s*/d"
  1121.    endif
  1122.  endfunction
  1123. endif
  1124.  
  1125. " ------------------------------------------------------------------------
  1126.  
  1127. " Restore
  1128. let &cpo= s:save_cpo
  1129. unlet s:save_cpo
  1130. " vim:ts=8
  1131.