blob: 52220120aa36c41f5b4fb0d9d9392cc375bc1821 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar83bab712005-08-01 21:58:57 +00002" Last Change: Aug 01, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar83bab712005-08-01 21:58:57 +00004" Version: 56
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" License: Vim License (see vim's :help license)
6"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00007" But be doers of the Word, and not only hearers, deluding your own selves
Bram Moolenaar071d4272004-06-13 20:20:40 +00008" (James 1:22 RSV)
9" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaard4755bb2004-09-02 19:12:26 +000010" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000011
Bram Moolenaard4755bb2004-09-02 19:12:26 +000012" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +000013" Load Once: {{{1
Bram Moolenaarc0197e22004-09-13 20:26:32 +000014if exists("g:loaded_netrw") || &cp
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
Bram Moolenaar83bab712005-08-01 21:58:57 +000017let g:loaded_netrw = "v56"
Bram Moolenaar8299df92004-07-10 09:47:34 +000018let loaded_explorer = 1
Bram Moolenaar83bab712005-08-01 21:58:57 +000019let s:keepcpo = &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000020set cpo&vim
21
22" ---------------------------------------------------------------------
23" Default values for global netrw variables {{{1
24if !exists("g:netrw_ftpmode")
25 let g:netrw_ftpmode= "binary"
26endif
27if !exists("g:netrw_win95ftp")
28 let g:netrw_win95ftp= 1
29endif
30if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000031 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000032 if &shell == "bash"
33 let g:netrw_cygwin= 1
34 else
35 let g:netrw_cygwin= 0
36 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000037 else
38 let g:netrw_cygwin= 0
39 endif
40endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000041if !exists("g:netrw_list_cmd")
42 if executable("ssh")
43 " provide a default listing command
44 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
45 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000046" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000047 let g:netrw_list_cmd= ""
48 endif
49endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000050if !exists("g:netrw_ftp_list_cmd")
51 if has("unix") || exists("g:netrw_cygwin")
52 let g:netrw_ftp_list_cmd= "ls -lF"
53 else
54 let g:netrw_ftp_list_cmd= "dir"
55 endif
56endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000057if !exists("g:netrw_rm_cmd")
58 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
59endif
60if !exists("g:netrw_rmf_cmd")
61 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
62endif
63if !exists("g:netrw_rmdir_cmd")
64 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
65endif
66if !exists("g:netrw_rename_cmd")
67 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
68endif
69if exists("g:netrw_silent") && g:netrw_silent != 0
70 let g:netrw_silentxfer= "silent "
71else
72 let g:netrw_silentxfer= ""
73endif
74if !exists("g:netrw_winsize")
75 let g:netrw_winsize= ""
76endif
77if !exists("g:netrw_list_hide")
78 let g:netrw_list_hide= ""
79endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000080if !exists("g:netrw_sort_by")
81 " alternatives: date size
82 let g:netrw_sort_by= "name"
83endif
84if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000085 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000086endif
87if !exists("g:netrw_sort_direction")
88 " alternative: reverse (z y x ...)
89 let g:netrw_sort_direction= "normal"
90endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000091if !exists("g:netrw_longlist") || g:netrw_longlist == 0
92 let g:netrw_longlist= 0
93else
94 let g:netrw_longlist= 1
Bram Moolenaar269ec652004-07-29 08:43:53 +000095 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -lk"
Bram Moolenaar8299df92004-07-10 09:47:34 +000096endif
97if !exists("g:netrw_timefmt")
98 let g:netrw_timefmt= "%c"
99endif
100if !exists("g:netrw_local_rmdir")
101 let g:netrw_local_rmdir= "rmdir"
102endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000103if !exists("g:netrw_local_mkdir")
104 let g:netrw_local_mkdir= "mkdir"
105endif
106if !exists("g:netrw_mkdir_cmd")
107 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
108endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000109if !exists("g:netrw_hide")
110 let g:netrw_hide= 1
111endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000112if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000113 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$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000114endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000115if !exists("g:netrw_ssh_browse_reject")
116 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
117endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000118if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000119 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000120endif
121if !exists("s:netrw_cd_escape")
122 if has("win32") || has("win95") || has("win64") || has("win16")
123 let s:netrw_cd_escape="#% "
124 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000125 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000126 endif
127endif
128if !exists("s:netrw_glob_escape")
129 if has("win32") || has("win95") || has("win64") || has("win16")
130 let s:netrw_glob_escape= ""
131 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000132 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000133 endif
134endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000135if !exists("g:netrw_alto")
136 let g:netrw_alto= 0
137endif
138if !exists("g:netrw_altv")
139 let g:netrw_altv= 0
140endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000141if !exists("g:netrw_maxfilenamelen")
142 let g:netrw_maxfilenamelen= 32
143endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000144if !exists("g:netrw_dirhistmax")
145 let g:netrw_dirhistmax= 10
146endif
147if !exists("g:NETRW_DIRHIST_CNT")
148 let g:NETRW_DIRHIST_CNT= 0
149endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000150
151" BufEnter event ignored by decho when following variable is true
152" Has a side effect that doau BufReadPost doesn't work, so
153" files read by network transfer aren't appropriately highlighted.
154"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000155
156" ---------------------------------------------------------------------
157" Default values for global protocol variables {{{1
158if !exists("g:netrw_rcp_cmd")
159 let g:netrw_rcp_cmd = "rcp"
160endif
161if !exists("g:netrw_ftp_cmd")
162 let g:netrw_ftp_cmd = "ftp"
163endif
164if !exists("g:netrw_scp_cmd")
165 let g:netrw_scp_cmd = "scp -q"
166endif
167if !exists("g:netrw_sftp_cmd")
168 let g:netrw_sftp_cmd = "sftp"
169endif
170if !exists("g:netrw_http_cmd")
171 if executable("wget")
172 let g:netrw_http_cmd = "wget -q -O"
173 elseif executable("fetch")
174 let g:netrw_http_cmd = "fetch -o"
175 else
176 let g:netrw_http_cmd = ""
177 endif
178endif
179if !exists("g:netrw_dav_cmd")
180 let g:netrw_dav_cmd = "cadaver"
181endif
182if !exists("g:netrw_rsync_cmd")
183 let g:netrw_rsync_cmd = "rsync"
184endif
185if !exists("g:netrw_fetch_cmd")
186 if executable("fetch")
187 let g:netrw_fetch_cmd = "fetch -o"
188 else
189 let g:netrw_fetch_cmd = ""
190 endif
191endif
192
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000193if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194 \ && exists("g:netrw_use_nt_rcp")
195 \ && g:netrw_use_nt_rcp
196 \ && executable( $SystemRoot .'/system32/rcp.exe')
197 let s:netrw_has_nt_rcp = 1
198 let s:netrw_rcpmode = '-b'
199 else
200 let s:netrw_has_nt_rcp = 0
201 let s:netrw_rcpmode = ''
202endif
203
204" ---------------------------------------------------------------------
205" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000206 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000208 augroup FileExplorer
209 au!
Bram Moolenaar83bab712005-08-01 21:58:57 +0000210 au BufEnter * call <SID>LocalBrowse(expand("<amatch>"))
Bram Moolenaar8299df92004-07-10 09:47:34 +0000211 augroup END
212 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213 augroup Network
214 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000215 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000216 au BufReadCmd file://* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e '.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217 else
Bram Moolenaar83bab712005-08-01 21:58:57 +0000218 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
219 au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000221 au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<amatch>")|exe "Nread 0r ".expand("<amatch>")|exe "silent doau BufReadPost ".expand("<amatch>")
222 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<amatch>")|exe "Nread " .expand("<amatch>")|exe "silent doau FileReadPost ".expand("<amatch>")
223 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe "Nwrite " .expand("<amatch>")|exe "silent doau BufWritePost ".expand("<amatch>")
224 au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe "'[,']Nwrite " .expand("<amatch>")|exe "silent doau FileWritePost ".expand("<amatch>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225 augroup END
226endif
227
228" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +0000229" Commands: :Nread, :Nwrite, :NetUserPass {{{1
230com! -nargs=* Nread call s:NetSavePosn()<bar>call s:NetRead(<f-args>)<bar>call s:NetRestorePosn()
231com! -range=% -nargs=* Nwrite call s:NetSavePosn()<bar><line1>,<line2>call s:NetWrite(<f-args>)<bar>call s:NetRestorePosn()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232com! -nargs=* NetUserPass call NetUserPass(<f-args>)
233
Bram Moolenaar83bab712005-08-01 21:58:57 +0000234" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{1
235com! -nargs=? -bar -bang Explore call s:Explore(0,0+<bang>0,<q-args>)
236com! -nargs=? -bar -bang Sexplore call s:Explore(1,0+<bang>0,<q-args>)
237com! -nargs=? -bar -bang Hexplore call s:Explore(1,2+<bang>0,<q-args>)
238com! -nargs=? -bar -bang Vexplore call s:Explore(1,4+<bang>0,<q-args>)
239
Bram Moolenaar071d4272004-06-13 20:20:40 +0000240" ------------------------------------------------------------------------
241" NetSavePosn: saves position of cursor on screen {{{1
242fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000243" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000244 " Save current line and column
245 let s:netrw_winnr= winnr()
246 let s:netrw_line = line(".")
247 let s:netrw_col = virtcol(".")
248
249 " Save top-of-screen line
250 norm! H0
251 let s:netrw_hline= line(".")
252
253 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000254" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255endfun
256
257" ------------------------------------------------------------------------
258" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
259fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000260" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
Bram Moolenaar81695252004-12-29 20:58:21 +0000262 " restore window
263" call Decho("restore window: exe silent! ".s:netrw_winnr."wincmd w")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264 exe "silent! ".s:netrw_winnr."wincmd w"
265 if v:shell_error == 0
266 " as suggested by Bram M: redraw on no error
267 " allows protocol error messages to remain visible
268 redraw!
269 endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000270
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271 " restore top-of-screen line
Bram Moolenaar81695252004-12-29 20:58:21 +0000272" call Decho("restore topofscreen: exe norm! ".s:netrw_hline."G0z")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000273 exe "norm! ".s:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000274
Bram Moolenaar071d4272004-06-13 20:20:40 +0000275 " restore position
Bram Moolenaar81695252004-12-29 20:58:21 +0000276" call Decho("restore posn: exe norm! ".s:netrw_line."G0".s:netrw_col."|")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000277 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
278
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000279" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280endfun
281
282" ------------------------------------------------------------------------
283" NetRead: responsible for reading a file over the net {{{1
284fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000285" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000286
287 " save options
288 call s:NetOptionSave()
289
290 " Special Exception: if a file is named "0r", then
291 " "0r" will be used to read the
292 " following files instead of "r"
293 if a:0 == 0
294 let readcmd= "r"
295 let ichoice= 0
296 elseif a:1 == "0r"
297 let readcmd = "0r"
298 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000299 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000300 let readcmd = "r"
301 let ichoice = 1
302 endif
303
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000304 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000305 let tmpfile= tempname()
306
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000307" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000308 while ichoice <= a:0
309
310 " attempt to repeat with previous host-file-etc
311 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000312" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000313 let choice = b:netrw_lastfile
314 let ichoice= ichoice + 1
315
316 else
317 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000318" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000319
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000320 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000321 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000322 echomsg 'NetRead Usage:'
323 echomsg ':Nread machine:path uses rcp'
324 echomsg ':Nread "machine path" uses ftp with <.netrc>'
325 echomsg ':Nread "machine id password path" uses ftp'
326 echomsg ':Nread dav://machine[:port]/path uses cadaver'
327 echomsg ':Nread fetch://machine/path uses fetch'
328 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
329 echomsg ':Nread http://[user@]machine/path uses http wget'
330 echomsg ':Nread rcp://[user@]machine/path uses rcp'
331 echomsg ':Nread rsync://machine[:port]/path uses rsync'
332 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
333 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000334 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000335
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000336 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000337 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000338" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000339 if match(choice,"\"$") != -1
340 " case "..."
341 let choice=strpart(choice,1,strlen(choice)-2)
342 else
343 " case "... ... ..."
344 let choice = strpart(choice,1,strlen(choice)-1)
345 let wholechoice = ""
346
347 while match(choice,"\"$") == -1
348 let wholechoice = wholechoice . " " . choice
349 let ichoice = ichoice + 1
350 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000351 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000352 echoerr "***netrw*** Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000353 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000354 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000355" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000356 return
357 endif
358 let choice= a:{ichoice}
359 endwhile
360 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
361 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000362 endif
363 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000365" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000366 let ichoice= ichoice + 1
367
368 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000369 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000370 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000371" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000373 exe 'lcd ' . fnamemodify(tmpfile,':h')
374 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000375 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000376
377 " Determine method of read (ftp, rcp, etc)
378 call s:NetMethod(choice)
379
Bram Moolenaar843ee412004-06-30 16:16:41 +0000380 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000381" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000382 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000383 keepjumps call s:NetBrowse(choice)
384" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000385 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000386 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000387
388 " ============
389 " Perform Read
390 " ============
391
392 ".........................................
393 " rcp: NetRead Method #1
394 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000395" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000396 " ER: noting done with g:netrw_uid yet?
397 " ER: on Win2K" rcp machine[.user]:file tmpfile
398 " ER: if machine contains '.' adding .user is required (use $USERNAME)
399 " ER: the tmpfile is full path: rcp sees C:\... as host C
400 if s:netrw_has_nt_rcp == 1
401 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
402 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
403 else
404 " Any way needed it machine contains a '.'
405 let uid_machine = g:netrw_machine .'.'. $USERNAME
406 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000407 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000408 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
409 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
410 else
411 let uid_machine = g:netrw_machine
412 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000414" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000415 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
416 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
417 let b:netrw_lastfile = choice
418
419 ".........................................
420 " ftp + <.netrc>: NetRead Method #2
421 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000422" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000423 let netrw_fname= b:netrw_fname
424 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000425 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000426 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000427 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000428 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000429" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000430 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
431 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000432" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
434 endif
435 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000436 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000437 let debugkeep= &debug
438 set debug=msg
Bram Moolenaar83bab712005-08-01 21:58:57 +0000439 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000440 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000441 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000442 endif
443 bd!
444 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
445 let b:netrw_lastfile = choice
446
447 ".........................................
448 " ftp + machine,id,passwd,filename: NetRead Method #3
449 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
450 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000451" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000452 let netrw_fname= b:netrw_fname
453 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000454 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000455 if exists("g:netrw_port") && g:netrw_port != ""
456 put ='open '.g:netrw_machine.' '.g:netrw_port
457 else
458 put ='open '.g:netrw_machine
459 endif
460
461 if exists("g:netrw_ftp") && g:netrw_ftp == 1
462 put =g:netrw_uid
463 put =g:netrw_passwd
464 else
465 put ='user '.g:netrw_uid.' '.g:netrw_passwd
466 endif
467
468 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
469 put =g:netrw_ftpmode
470 endif
471 put ='get '.netrw_fname.' '.tmpfile
472
473 " perform ftp:
474 " -i : turns off interactive prompting from ftp
475 " -n unix : DON'T use <.netrc>, even though it exists
476 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000477" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000478 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000479" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000480 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
481 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
482 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000483" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000484 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000485 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000486 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000487 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000488 endif
489 bd!
490 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
491 let b:netrw_lastfile = choice
492
493 ".........................................
494 " scp: NetRead Method #4
495 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000496" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000497 if exists("g:netrw_port") && g:netrw_port != ""
498 let useport= " -P ".g:netrw_port
499 else
500 let useport= ""
501 endif
502 if g:netrw_cygwin == 1
503 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000504" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
506 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000507" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000508 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
509 endif
510 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
511 let b:netrw_lastfile = choice
512
513 ".........................................
514 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000515" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000516 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000517 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000518 echoerr "***netrw*** neither wget nor fetch command is available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000519 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000520 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000521 exit
522 endif
523
524 if match(b:netrw_fname,"#") == -1
525 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000526" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000527 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
528 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
529
530 else
531 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
532 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
533 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000534" call Decho("netrw_html<".netrw_html.">")
535" call Decho("netrw_tag <".netrw_tag.">")
536" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000537 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
538 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000539" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000540 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
541 endif
542 let b:netrw_lastfile = choice
543
544 ".........................................
545 " cadaver: NetRead Method #6
546 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000547" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000548
549 " Construct execution string (four lines) which will be passed through filter
550 let netrw_fname= b:netrw_fname
551 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000552 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000553 if exists("g:netrw_port") && g:netrw_port != ""
554 put ='open '.g:netrw_machine.' '.g:netrw_port
555 else
556 put ='open '.g:netrw_machine
557 endif
558 put ='user '.g:netrw_uid.' '.g:netrw_passwd
559
560 if g:netrw_cygwin == 1
561 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
562 put ='get '.netrw_fname.' '.cygtmpfile
563 else
564 put ='get '.netrw_fname.' '.tmpfile
565 endif
566
567 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000568 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000569" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000570 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
571 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000572 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000573 let b:netrw_lastfile = choice
574
575 ".........................................
576 " rsync: NetRead Method #7
577 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000578" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000579 if g:netrw_cygwin == 1
580 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000581" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000582 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
583 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000584" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000585 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
586 endif
587 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
588 let b:netrw_lastfile = choice
589
590 ".........................................
591 " fetch: NetRead Method #8
592 " fetch://[user@]host[:http]/path
593 elseif b:netrw_method == 8 " read with fetch
594 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000595 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000596 echoerr "***netrw*** fetch command not available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000597 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000598 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000599 exit
600 endif
601 if exists("g:netrw_option") && g:netrw_option == ":http"
602 let netrw_option= "http"
603 else
604 let netrw_option= "ftp"
605 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000606" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000607
608 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000609" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
611 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000612" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000613 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
614 endif
615
616 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
617 let b:netrw_lastfile = choice
618
619 ".........................................
620 " sftp: NetRead Method #9
621 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000623 if g:netrw_cygwin == 1
624 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000625" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
626" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000627 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
628 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000629" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
631 endif
632 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
633 let b:netrw_lastfile = choice
634
635 ".........................................
636 else " Complain
637 echo "***warning*** unable to comply with your request<" . choice . ">"
638 endif
639 endwhile
640
641 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000642" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000643 if exists("b:netrw_method")
644 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 unlet b:netrw_fname
646 endif
647 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000648
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000649" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000651
652" ------------------------------------------------------------------------
653" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
654fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000655" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000656
657 if exists("*NetReadFixup")
658 " for the use of NetReadFixup (not otherwise used internally)
659 let line2= line("$")
660 endif
661
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000662 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000663 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000664 if g:netrw_cygwin
665 let fname= a:fname
666" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000667 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000668 let fname= substitute(a:fname,'/','\\\\','ge')
669" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000670 endif
671 else
672 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000673" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000674 endif
675
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000676 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000677 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000678
Bram Moolenaar81695252004-12-29 20:58:21 +0000679 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000680 let rfile= bufname(".")
681" call Decho("remotefile<".rfile.">")
682" call Dredir("ls!","starting buffer list")
683
Bram Moolenaar81695252004-12-29 20:58:21 +0000684 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000685 keepalt exe "file ".fname
686" call Dredir("ls!","after renaming current buffer to <".fname.">")
687
Bram Moolenaar81695252004-12-29 20:58:21 +0000688 " edit temporary file
689 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000690" call Dredir("ls!","after editing temporary file")
691
Bram Moolenaar81695252004-12-29 20:58:21 +0000692 " rename buffer back to remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000693 keepalt exe "file ".rfile
694" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000695 let line1 = 1
696 let line2 = line("$")
697
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000699 " read file after current line
700 let curline = line(".")
701 let lastline= line("$")
702" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000703 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000704 let line1 = curline + 1
705 let line2 = line("$") - lastline + 1
706 let s:netrw_line = s:netrw_line + 1
707 let s:netrw_col = 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000708 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000709 " not readable
710" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000711 return
712 endif
713
714 " User-provided (ie. optional) fix-it-up command
715 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000716" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000717 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000718" else " Decho
719" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000720 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000721
722 " update the Buffers menu
723 if has("gui") && has("gui_running")
724 silent! emenu Buffers.Refresh\ menu
725 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000726
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000727" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000728
729 " insure that we have the right filetype and that its being displayed
730 filetype detect
731 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000732" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000733endfun
734
735" ------------------------------------------------------------------------
736" NetWrite: responsible for writing a file over the net {{{1
737fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000738" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000739
740 " option handling
741 let mod= 0
742 call s:NetOptionSave()
743
744 " Get Temporary Filename
745 let tmpfile= tempname()
746
747 if a:0 == 0
748 let ichoice = 0
749 else
750 let ichoice = 1
751 endif
752
753 " write (selected portion of) file to temporary
754 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
755
756 while ichoice <= a:0
757
758 " attempt to repeat with previous host-file-etc
759 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000760" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000761 let choice = b:netrw_lastfile
762 let ichoice= ichoice + 1
763 else
764 exe "let choice= a:" . ichoice
765
766 " Reconstruct Choice if choice starts with '"'
767 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000768 echomsg 'NetWrite Usage:"'
769 echomsg ':Nwrite machine:path uses rcp'
770 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
771 echomsg ':Nwrite "machine id password path" uses ftp'
772 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
773 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
774 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
775 echomsg ':Nwrite rcp://machine/path uses rcp'
776 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
777 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
778 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000779 break
780
781 elseif match(choice,"^\"") != -1
782 if match(choice,"\"$") != -1
783 " case "..."
784 let choice=strpart(choice,1,strlen(choice)-2)
785 else
786 " case "... ... ..."
787 let choice = strpart(choice,1,strlen(choice)-1)
788 let wholechoice = ""
789
790 while match(choice,"\"$") == -1
791 let wholechoice= wholechoice . " " . choice
792 let ichoice = ichoice + 1
793 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000794 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000795 echoerr "***netrw*** Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000796 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000797 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000798" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000799 return
800 endif
801 let choice= a:{ichoice}
802 endwhile
803 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
804 endif
805 endif
806 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000807" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000808 let ichoice= ichoice + 1
809
810 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000811 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000812 let choice= substitute(choice,'\\','/','ge')
813 "ER: see NetRead()
814 exe 'lcd ' . fnamemodify(tmpfile,':h')
815 let tmpfile = fnamemodify(tmpfile,':t')
816 endif
817
818 " Determine method of read (ftp, rcp, etc)
819 call s:NetMethod(choice)
820
821 " =============
822 " Perform Write
823 " =============
824
825 ".........................................
826 " rcp: NetWrite Method #1
827 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000828" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000829 if s:netrw_has_nt_rcp == 1
830 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
831 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
832 else
833 let uid_machine = g:netrw_machine .'.'. $USERNAME
834 endif
835 else
836 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
837 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
838 else
839 let uid_machine = g:netrw_machine
840 endif
841 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000842" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000843 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
844 let b:netrw_lastfile = choice
845
846 ".........................................
847 " ftp + <.netrc>: NetWrite Method #2
848 elseif b:netrw_method == 2 " write with ftp + <.netrc>
849 let netrw_fname = b:netrw_fname
850 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000851 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000852 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000853" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000854 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
855" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000856 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000857" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000858 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000859 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000860" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000861 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000862 endif
863 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
864 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000865 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000866 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000867 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000868 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000870 endif
871 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000872 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000873
874 ".........................................
875 " ftp + machine, id, passwd, filename: NetWrite Method #3
876 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
877 let netrw_fname= b:netrw_fname
878 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000879 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000880 if exists("g:netrw_port") && g:netrw_port != ""
881 put ='open '.g:netrw_machine.' '.g:netrw_port
882 else
883 put ='open '.g:netrw_machine
884 endif
885 if exists("g:netrw_ftp") && g:netrw_ftp == 1
886 put =g:netrw_uid
887 put =g:netrw_passwd
888 else
889 put ='user '.g:netrw_uid.' '.g:netrw_passwd
890 endif
891 put ='put '.tmpfile.' '.netrw_fname
892 " save choice/id/password for future use
893 let b:netrw_lastfile = choice
894
895 " perform ftp:
896 " -i : turns off interactive prompting from ftp
897 " -n unix : DON'T use <.netrc>, even though it exists
898 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000899" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000900 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000901" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000902 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
903 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
904 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000905 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000906 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000907 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000908 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000909 let mod=1
910 endif
911 bd!
912
913 ".........................................
914 " scp: NetWrite Method #4
915 elseif b:netrw_method == 4 " write with scp
916 if exists("g:netrw_port") && g:netrw_port != ""
917 let useport= " -P ".g:netrw_port
918 else
919 let useport= ""
920 endif
921 if g:netrw_cygwin == 1
922 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000923" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
925 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000926" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
928 endif
929 let b:netrw_lastfile = choice
930
931 ".........................................
932 " http: NetWrite Method #5
933 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000934 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000935 echoerr "***netrw*** currently <netrw.vim> does not support writing using http:"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000936 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000937 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938
939 ".........................................
940 " dav: NetWrite Method #6
941 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000942" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943
944 " Construct execution string (four lines) which will be passed through filter
945 let netrw_fname= b:netrw_fname
946 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000947 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 if exists("g:netrw_port") && g:netrw_port != ""
949 put ='open '.g:netrw_machine.' '.g:netrw_port
950 else
951 put ='open '.g:netrw_machine
952 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954
955 if g:netrw_cygwin == 1
956 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
957 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000958 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000959 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000960 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961
962 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000963 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000964" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000965 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
966 bd!
967 let b:netrw_lastfile = choice
968
969 ".........................................
970 " rsync: NetWrite Method #7
971 elseif b:netrw_method == 7 " write with rsync
972 if g:netrw_cygwin == 1
973 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000974" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000975 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000976 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000977" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000979 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 let b:netrw_lastfile = choice
981
982 ".........................................
983 " scp: NetWrite Method #9
984 elseif b:netrw_method == 9 " write with sftp
985 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000986 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
987 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
988 else
989 let uid_machine = g:netrw_machine
990 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000992 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000993 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000994 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000995" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000996 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
997 bd!
998 let b:netrw_lastfile= choice
999
1000 ".........................................
1001 else " Complain
1002 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001003 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 endwhile
1005
1006 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001007" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001008 let result=delete(tmpfile)
1009 call s:NetOptionRestore()
1010
1011 if a:firstline == 1 && a:lastline == line("$")
1012 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001013 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001015" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001016endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001017
Bram Moolenaar83bab712005-08-01 21:58:57 +00001018" ===========================================
1019" Remote Directory Browsing Support: {{{1
1020" ===========================================
1021
Bram Moolenaar843ee412004-06-30 16:16:41 +00001022" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001023" of the contents of a remote directory. It is assumed that the
1024" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1025" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001026fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001027" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001028
1029 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001030 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1031" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001032 if !executable("ftp")
1033 if !exists("g:netrw_quiet")
1034 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001035 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001036 endif
1037" call Dret("NetBrowse")
1038 return
1039 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001040 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001041 if !exists("g:netrw_quiet")
1042 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001043 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001044 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001045" call Dret("NetBrowse")
1046 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001047 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001048
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001049 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001050 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001051
1052 " analyze a:dirname and g:netrw_list_cmd
1053 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001054 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001055" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001056 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001057 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001058 echoerr "***netrw*** netrw doesn't understand your dirname<".dirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001059 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001060 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001061" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001062 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001063 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001064
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001065 let method = substitute(dirname,dirpat,'\1','')
1066 let user = substitute(dirname,dirpat,'\2','')
1067 let machine = substitute(dirname,dirpat,'\3','')
1068 let path = substitute(dirname,dirpat,'\4','')
1069 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001070" call Decho("set up method <".method .">")
1071" call Decho("set up user <".user .">")
1072" call Decho("set up machine<".machine.">")
1073" call Decho("set up path <".path .">")
1074" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001075
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001076 if method == "ftp" || method == "http"
1077 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001078 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001079 else
1080 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1081 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001082
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001083 if exists("b:netrw_method")
1084" call Decho("setting s:netrw_method<".b:netrw_method.">")
1085 let s:netrw_method= b:netrw_method
1086 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001087
Bram Moolenaar8299df92004-07-10 09:47:34 +00001088 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001089 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar83bab712005-08-01 21:58:57 +00001090 echoerr "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001091 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001092 else
1093 if g:netrw_sort_by =~ "^t"
1094 let listcmd= listcmd."t"
1095 elseif g:netrw_sort_by =~ "^s"
1096 let listcmd= listcmd."S"
1097 endif
1098 " optionally sort in reverse
1099 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1100 let listcmd= listcmd."r"
1101 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001102 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001103
1104" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001105 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001106" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001107 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001108 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001109" call Dret("NetBrowse : symlink")
1110 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001111
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001112 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001113 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001114" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001115
1116 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001117 " "this is a directory" indicator (/). There shouldn't be one of those,
1118 " anyway.
1119 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001120" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001121
1122 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001123 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001124" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001125 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001126 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001127 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001128 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001129 keepjumps 1d
1130 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001131
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001132" call Dret("NetBrowse : file<".fname.">")
1133 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001134 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001135
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136 " ---------------------------------------------------------------------
1137 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001138" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 " set up new buffer and map
1140 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001141 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001142" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001143 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001145" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001146 exe "b ".bufnamenr
1147 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001148" call Dret("NetBrowse")
1149 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 endif
1151 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001152" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001153 enew!
1154 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001155
1156 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001157 setlocal bt=nofile bh=wipe nobl noswf
1158 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001159" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001160 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001161" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001162 setlocal bh=hide nobl nonu
1163
1164 " save current directory on directory history list
1165 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001166
1167 " set up buffer-local mappings
1168" call Decho("set up buffer-local mappings")
1169 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001170 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1171 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001172 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>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001173 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1174 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1175 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1176 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001177 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001178 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1179 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>
1180 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>
1181 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001182 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1183 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001184 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001185 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1186 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001187 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1188 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001189 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001190 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1191 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1192 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001193 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001194 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001195 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001196
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001197 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1199 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001200 keepjumps put ='\" Netrw Remote Directory Listing'
1201 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001202 let s:netrw_bannercnt= 7
1203 let sortby= g:netrw_sort_by
1204 if g:netrw_sort_direction =~ "^r"
1205 let sortby= sortby." reversed"
1206 endif
1207
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001208 if g:netrw_sort_by =~ "^n"
1209 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001210 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1211 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001212 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1213 else
1214 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001215 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001216 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001217 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001218 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001219 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001220 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001221 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001222 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001224 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001225 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1226 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001227
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001228 " remote read the requested directory listing
1229 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1230 " Note that not all ftp servers honor the options for ls
1231 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001232 " use ftp to get remote file listing
1233" call Decho("use ftp to get remote file listing")
1234 call NetBrowseFtpCmd(path,listcmd)
1235
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001236 keepjumps 1d
1237
1238 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001239 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001240" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001241 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001242
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001243 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001244 if g:netrw_ftp_browse_reject != ""
1245 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1246 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001247
1248 " if there's no ../ listed, then put ./ and ../ in
1249 let line1= line(".")
1250 keepjumps 1
1251 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1252 let line2= line(".")
1253 if line2 == 0
1254 keepjumps put='../'
1255 keepjumps put='./'
1256 endif
1257 exe "keepjumps ".line1
1258 keepjumps norm! 0
1259
1260 " more cleanup
Bram Moolenaar83bab712005-08-01 21:58:57 +00001261 exe 'keepjumps silent! '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1262 exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1263 exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001264 endif
1265
1266 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001267 " use ssh to get remote file listing
1268" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001269 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1270" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1271 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1272 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001273 " cleanup
1274 if g:netrw_ftp_browse_reject != ""
1275 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
1276 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001277 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001278
1279 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001280 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001281 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001282 if g:netrw_hide && g:netrw_list_hide != ""
1283 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001284 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001285
Bram Moolenaar8299df92004-07-10 09:47:34 +00001286 if g:netrw_longlist
1287 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001288" call Decho("manipulate long listing")
1289
1290 if method == "ftp"
1291 " cleanup
1292 exe "keepjumps ".s:netrw_bannercnt
1293 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1294 keepjumps d
1295 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001296 " if there's no ../ listed, then put ./ and ../ in
1297 let line1= line(".")
1298 keepjumps 1
1299 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1300 let line2= line(".")
1301 if line2 == 0
1302 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1303 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1304 endif
1305 exe "keepjumps ".line1
1306 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001307 endif
1308
1309 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1310 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1311 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001312 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001313
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001314 if line("$") >= s:netrw_bannercnt
1315 if g:netrw_sort_by =~ "^n"
1316 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00001317 if v:version < 700
1318 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1319 else
1320 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
1321 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001322 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
1323 endif
1324 if g:netrw_longlist
1325 " shorten the list to keep its width <= 80 characters
1326 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
1327 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001328 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001329 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001330 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001331 setlocal nomod
1332 setlocal noma
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001333 setlocal nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001334
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001335" call Dret("NetBrowse")
1336 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001337endfun
1338
1339" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001340" NetBrowseChgDir: {{{2
1341fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001342" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001343
1344 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001345 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001346
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001347 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001348 " handling a file
1349 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001350" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001351
1352 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001353 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001354" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001355 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001356 %d
1357
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001358 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001359 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001360 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001361
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001362 if trailer =~ '^\%(\.\./\)*$'
1363 " tack on a ../"
1364 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001365
1366 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001367 " strip off a directory name from dirname
1368 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001369 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001370" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001371
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001372 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001373 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001374 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001375" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001376 endif
1377
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001378" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001379 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001380endfun
1381
Bram Moolenaar843ee412004-06-30 16:16:41 +00001382" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001383" NetGetWord: it gets the directory named under the cursor
1384fun! <SID>NetGetWord()
1385" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001386 if line(".") < s:netrw_bannercnt
1387 let dirname= "./"
1388 else
1389 let dirname= getline(".")
1390 if dirname =~ '\t'
1391 let dirname= substitute(dirname,'\t.*$','','e')
1392 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001393 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001394" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001395 return dirname
1396endfun
1397
1398" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001399" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001400fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001401" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1402" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001403
1404 " preparation for removing multiple files/directories
1405 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001406 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001407
1408 " remove multiple files and directories
1409 while ctr <= a:lastline
1410 exe ctr
1411
1412 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001413 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001414" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001415
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001416 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001417 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001418 if !all
1419 echohl Statement
1420 call inputsave()
1421 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1422 call inputrestore()
1423 echohl NONE
1424 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1425 if ok =~ 'a\%[ll]'
1426 let all= 1
1427 endif
1428 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001429
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001430 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001431 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1432 silent! keepjumps .,$d
1433 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1434 else
1435 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1436" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1437 let ret= system(netrw_rm_cmd)
1438" call Decho("returned=".ret." errcode=".v:shell_error)
1439 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001440 elseif ok =~ 'q\%[uit]'
1441 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001442 endif
1443
1444 else
1445 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001446 if !all
1447 call inputsave()
1448 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1449 call inputrestore()
1450 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1451 if ok =~ 'a\%[ll]'
1452 let all= 1
1453 endif
1454 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001455
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001456 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001457 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1458 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1459 else
1460 let rmfile = a:path.rmfile
1461 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1462" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1463 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001464" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001465
1466 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001467 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001468" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1469 let ret= system(netrw_rmf_cmd)
1470" call Decho("returned=".ret." errcode=".v:shell_error)
1471
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001472 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001473 echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001474 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001475 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001476 endif
1477 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001478
1479 elseif ok =~ 'q\%[uit]'
1480 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001481 endif
1482 endif
1483
1484 let ctr= ctr + 1
1485 endwhile
1486
1487 " refresh the directory
1488 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001489" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001490 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1491 exe curline
1492
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001493" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001494endfun
1495
1496" ---------------------------------------------------------------------
1497" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001498fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001499" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001500
1501 " preparation for removing multiple files/directories
1502 let ctr = a:firstline
1503 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1504
1505 " attempt to rename files/directories
1506 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001507 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001508
1509 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001510 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001511" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001512
1513 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001514 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001515 call inputrestore()
1516
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001517 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1518 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1519 else
1520 let oldname= a:path.oldname
1521 let newname= a:path.newname
1522" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1523 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1524 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001525
1526 let ctr= ctr + 1
1527 endwhile
1528
1529 " refresh the directory
1530 let curline= line(".")
1531 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001532 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001533" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001534endfun
1535
1536" ---------------------------------------------------------------------
1537" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001538" files given their extension. Passes 0=local, 1=remote
1539fun! <SID>NetBrowseX(fname,remote)
1540" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001541
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001542 " set up the filename
1543 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001544 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001545 if has("win32") || has("win95") || has("win64") || has("win16")
1546 let exten= substitute(exten,'^.*$','\L&\E','')
1547 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001548 let fname= escape(a:fname,"%#")
1549" call Decho("fname<".fname."> after escape()")
1550
1551 if a:remote == 1
1552 " create a local copy
1553 let fname= tempname().".".exten
1554" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1555 exe "keepjumps silent bot 1new ".a:fname
1556 let eikeep= &ei
1557 set ei=all bh=delete
1558 exe "w! ".fname
1559 let &ei= eikeep
1560 q
1561 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001562" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001563
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001564 " set up redirection
1565 if &srr =~ "%s"
1566 let redir= substitute(&srr,"%s","/dev/null"."")
1567 else
1568 let redir= &srr . "/dev/null"
1569 endif
1570" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001571
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001572 " execute the file handler
1573 if has("win32") || has("win64")
1574" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1575 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1576 let ret= v:shell_error
1577
1578 elseif has("unix") && executable("kfmclient")
1579" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1580 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1581 let ret= v:shell_error
1582
1583 elseif has("unix") && executable("gnome-open")
1584" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1585 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1586 let ret= v:shell_error
1587
1588 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1589" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001590 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001591 endif
1592 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001593
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001594 " cleanup: remove temporary file,
1595 " delete current buffer if success with handler,
1596 " return to prior buffer (directory listing)
1597 if a:remote == 1 && fname != a:fname
1598" call Decho("deleting temporary file<".fname.">")
1599 call delete(fname)
1600 endif
1601
1602 if a:remote == 1
1603 let eikeep= &ei
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001604 set ei=all bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001605 exe "norm! \<c-o>"
1606 let &ei= eikeep
1607 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001608 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001609
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001610" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001611endfun
1612
1613" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001614" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1615" This function assumes that a long listing will be received. Size, time,
1616" and reverse sorts will be requested of the server but not otherwise
1617" enforced here.
1618fun! NetBrowseFtpCmd(path,cmd)
1619" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1620
1621 " because WinXX ftp uses unix style input
1622 " curline is one more than the bannercnt in order to account
1623 " for the unwanted first blank line (doing a :put to an empty
1624 " buffer yields a blank first line)
1625 let ffkeep= &ff
1626 setlocal ma
1627 setlocal ff=unix
1628 let curline= s:netrw_bannercnt+1
1629 exe "silent! keepjumps ".curline.",$d"
1630
1631 ".........................................
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001632 if s:netrw_method == 2 || s:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001633 " ftp + <.netrc>: Method #2
1634 if a:path != ""
1635 put ='cd '.a:path
1636 endif
1637 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001638" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001639 if exists("g:netrw_port") && g:netrw_port != ""
1640" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1641 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1642 else
1643" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1644 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1645 endif
1646
1647 ".........................................
1648 elseif s:netrw_method == 3
1649 " ftp + machine,id,passwd,filename: Method #3
1650 setlocal ff=unix
1651 if exists("g:netrw_port") && g:netrw_port != ""
1652 put ='open '.g:netrw_machine.' '.g:netrw_port
1653 else
1654 put ='open '.g:netrw_machine
1655 endif
1656
1657 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1658 put =g:netrw_uid
1659 put =g:netrw_passwd
1660 else
1661 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1662 endif
1663
1664 if a:path != ""
1665 put ='cd '.a:path
1666 endif
1667 exe "put ='".a:cmd."'"
1668
1669 " perform ftp:
1670 " -i : turns off interactive prompting from ftp
1671 " -n unix : DON'T use <.netrc>, even though it exists
1672 " -n win32: quit being obnoxious about password
1673" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1674 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1675
1676 ".........................................
1677 else
1678 echo "***warning*** unable to comply with your request<" . choice . ">"
1679 endif
1680
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001681 " cleanup for Windows
1682 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001683 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001684 endif
1685 if a:cmd == "dir"
1686 " infer directory/link based on the file permission string
Bram Moolenaar83bab712005-08-01 21:58:57 +00001687 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1688 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001689 if !g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00001690 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001691 endif
1692 endif
1693
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001694 " restore settings
1695 let &ff= ffkeep
1696" call Dret("NetBrowseFtpCmd")
1697endfun
1698
1699" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001700" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1701" separated patterns given in g:netrw_list_hide
1702fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001703" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001704
1705 let listhide= g:netrw_list_hide
1706 while listhide != ""
1707 if listhide =~ ','
1708 let hide = substitute(listhide,',.*$','','e')
1709 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1710 else
1711 let hide = listhide
1712 let listhide= ""
1713 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001714
1715 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001716" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001717 if g:netrw_hide == 1
1718 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1719 elseif g:netrw_hide == 2
1720 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1721 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001722 endwhile
1723
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001724" call Dret("NetrwListHide")
1725endfun
1726
1727" ---------------------------------------------------------------------
1728" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001729fun! <SID>NetHideEdit(mode)
1730" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001731
1732 call inputsave()
1733 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1734 call inputrestore()
1735
1736 " refresh the listing
1737 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001738 if a:mode == 0
1739 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1740 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001741 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001742 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001743
1744" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001745endfun
1746
Bram Moolenaar8299df92004-07-10 09:47:34 +00001747" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001748" NetSortSequence: allows user to edit the sorting sequence
1749fun! <SID>NetSortSequence(mode)
1750" call Dfunc("NetSortSequence(mode=".a:mode.")")
1751
1752 call inputsave()
1753 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1754 call inputrestore()
1755
1756 " refresh the listing
1757 let g:netrw_sort_sequence= newsortseq
1758 if a:mode == 0
1759 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1760 else
1761 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1762 endif
1763
1764" call Dret("NetSortSequence")
1765endfun
1766
1767" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001768" NetLongList: {{{2
1769fun! <SID>NetLongList(mode)
1770" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001771 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001772
1773 if g:netrw_longlist != 0
1774 " turn long listing off
1775 let g:netrw_longlist = 0
1776 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1777
1778 else
1779 " turn long listing on
1780 let g:netrw_longlist = 1
1781 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1782 endif
1783
1784 " refresh the listing
1785 if a:mode == 0
1786 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1787 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001788 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001789 endif
1790
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001791 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001792" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1793endfun
1794
1795" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001796" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001797" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1798" the same word even though the sorting has changed its order of appearance.
1799fun! s:NetSaveWordPosn()
1800" call Dfunc("NetSaveWordPosn()")
1801 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1802" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1803endfun
1804
1805" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001806" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001807fun! s:NetRestoreWordPosn()
1808" call Dfunc("NetRestoreWordPosn()")
1809 silent! call search(s:netrw_saveword,'w')
1810" call Dret("NetRestoreWordPosn")
1811endfun
1812
1813" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001814" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001815fun! <SID>NetMakeDir(usrhost)
1816" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1817
1818 " get name of new directory from user. A bare <CR> will skip.
1819 " if its currently a directory, also request will be skipped, but with
1820 " a message.
1821 call inputsave()
1822 let newdirname= input("Please give directory name: ")
1823 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001824" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001825
1826 if newdirname == ""
1827" call Dret("NetMakeDir : user aborted with bare <cr>")
1828 return
1829 endif
1830
1831 if a:usrhost == ""
1832
1833 " Local mkdir:
1834 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001835 let fullnewdir= b:netrw_curdir.'/'.newdirname
1836" call Decho("fullnewdir<".fullnewdir.">")
1837 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001838 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001839 echoerr "***netrw*** <".newdirname."> is already a directory!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001840 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001841 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001842" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1843 return
1844 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001845 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001846 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001847 echoerr "***netrw*** <".newdirname."> is already a file!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001848 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001849 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001850" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1851 return
1852 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001853
1854 " requested new local directory is neither a pre-existing file or
1855 " directory, so make it!
1856 if exists("*mkdir")
1857 call mkdir(fullnewdir,"p")
1858 else
1859 let netrw_origdir= s:NetGetcwd(1)
1860 exe 'cd '.b:netrw_curdir
1861" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1862" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1863 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
1864 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1865 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001866
Bram Moolenaar8299df92004-07-10 09:47:34 +00001867 if v:shell_error == 0
1868 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001869" call Decho("refresh listing")
1870 let linenum= line(".")
1871 norm! H0
1872 let hline = line(".")
1873 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1874 exe "norm! ".hline."G0z\<CR>"
1875 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001876 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001877 echoerr "***netrw*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001878 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001879 endif
1880 redraw!
1881
1882 else
1883 " Remote mkdir:
1884 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001885 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001886" call Decho("exe silent! !".mkdircmd." ".newdirname)
1887 exe "silent! !".mkdircmd." ".newdirname
1888 if v:shell_error == 0
1889 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001890 let linenum= line(".")
1891 norm! H0
1892 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001893 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001894 exe "norm! ".hline."G0z\<CR>"
1895 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001896 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001897 echoerr "***netrw*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001898 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001899 endif
1900 redraw!
1901 endif
1902
1903" call Dret("NetMakeDir")
1904endfun
1905
1906" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001907" NetBookmarkDir: {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001908" 0: bookmark the current directory
1909" 1: change to the bookmarked directory
1910fun! <SID>NetBookmarkDir(chg,curdir)
1911" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1912
1913 if a:chg == 0
1914 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001915 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1916 if !exists("g:NETRW_BOOKMARKMAX")
1917 let g:NETRW_BOOKMARKMAX= v:count
1918 elseif v:count > g:NETRW_BOOKMARKMAX
1919 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001920 endif
1921
1922 elseif a:chg == 1
1923 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001924 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1925 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001926 else
1927 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1928 endif
1929
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001930 elseif a:chg == 2
1931 if exists("g:NETRW_BOOKMARKMAX")
1932 " list user's bookmarks
1933" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1934 let cnt= 0
1935 while cnt <= g:NETRW_BOOKMARKMAX
1936 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1937" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1938 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1939 endif
1940 let cnt= cnt + 1
1941 endwhile
1942 endif
1943
1944 " list directory history
1945 let cnt = g:NETRW_DIRHIST_CNT
1946 let first = 1
1947 let histcnt = 0
1948 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1949" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1950 let histcnt= histcnt + 1
1951 if exists("g:NETRW_DIRHIST_{cnt}")
1952" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1953 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001954 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001955 let first = 0
1956 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1957 if cnt < 0
1958 let cnt= cnt + g:netrw_dirhistmax
1959 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001960 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001961
1962 elseif a:chg == 3
1963 " saves most recently visited directories
1964 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1965 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1966" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1967
1968 elseif a:chg == 4
1969 " u: change to the previous directory stored on the history list
1970 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1971 if g:NETRW_DIRHIST_CNT < 0
1972 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1973 endif
1974 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1975" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1976 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1977 else
1978 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1979 echo "Sorry, no predecessor directory exists yet"
1980 endif
1981
1982 elseif a:chg == 5
1983 " U: change to the subsequent directory stored on the history list
1984 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1985 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1986" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1987 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1988 else
1989 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1990 if g:NETRW_DIRHIST_CNT < 0
1991 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1992 endif
1993 echo "Sorry, no successor directory exists yet"
1994 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001995 endif
1996" call Dret("NetBookmarkDir")
1997endfun
1998
Bram Moolenaar83bab712005-08-01 21:58:57 +00001999" ==========================================
2000" Local Directory Browsing Support: {{{1
2001" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002002
2003" ---------------------------------------------------------------------
2004" LocalBrowse: supports local file/directory browsing {{{2
2005fun! <SID>LocalBrowse(dirname)
2006
2007" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
2008 if !isdirectory(a:dirname)
2009 " not a directory, ignore it
2010 return
2011 endif
2012
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002013 " unfortunate interaction -- when putting debugging calls
2014 " above one can no longer enter the DBG buffer.
2015" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
2016" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
2017" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002018
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002019 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002020 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002021 echoerr "***netrw*** vim version<".v:version."> too old for browsing with netrw"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002022 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002023 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002024" call Dret("LocalBrowse : vim version<".v:version."> too old")
2025 return
2026 endif
2027
Bram Moolenaar83bab712005-08-01 21:58:57 +00002028 " record autochdir setting and then insure its unset (tnx to David Fishburn)
2029 let keep_autochdir= &autochdir
2030 set noautochdir
2031
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002032 " record and change current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002033 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2034 if b:netrw_curdir =~ '[/\\]$'
2035 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2036 endif
2037" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2038 " make netrw's idea of the current directory vim's if the user wishes
2039 if g:netrw_keepdir
2040" call Decho("change directory: cd ".b:netrw_curdir)
2041 exe 'cd '.b:netrw_curdir
2042 endif
2043
2044 " change the name of the buffer to reflect the b:netrw_curdir
2045 exe 'silent file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002046
2047 " make this buffer modifiable
2048 setlocal ma
2049
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002050 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002051 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002052
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002053 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002054 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002055
Bram Moolenaar8299df92004-07-10 09:47:34 +00002056 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002057" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002058 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2059 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2060 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002061 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002062 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2063 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2064 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2065 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2066 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002067 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002068 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2069 nnoremap <buffer> <silent> p :exe "norm! 0"<bar>call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002070 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2071 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2072 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>
2073 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002074 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2075 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002076 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002077 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2078 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2079 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2080 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2081 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2082 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2083 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2084 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002085 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002086 nnoremap <buffer> ? :he netrw-dir<cr>
2087
2088 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002089" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002090 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002091 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002092 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002093 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002094 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002095
2096 let sortby= g:netrw_sort_by
2097 if g:netrw_sort_direction =~ "^r"
2098 let sortby= sortby." reversed"
2099 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002100
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002101 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002102 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002103" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002104 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002105 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002106 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002107 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002108 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002109" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002110 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002111 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002112 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002113 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002114
2115 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002116 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002117 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002118 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002119 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002120 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002121 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002122 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002123 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002124 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2125 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002126 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2127
2128 " bannercnt should index the line just after the banner
2129 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2130" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002131
2132 " generate the requested directory listing
Bram Moolenaar83bab712005-08-01 21:58:57 +00002133 call LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002134
2135 " manipulate the directory listing (hide, sort)
2136 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002137 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002138 if g:netrw_hide && g:netrw_list_hide != ""
2139 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002140 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002141 if line("$") >= s:netrw_bannercnt
2142 if g:netrw_sort_by =~ "^n"
2143 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002144 if v:version < 700
2145 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2146 else
2147 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
2148 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002149 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
2150 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002151 if v:version < 700
2152 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2153 else
2154 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
2155 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002156 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2157 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002158 endif
2159 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002160 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002161
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002162 setlocal noma nomod nonu
Bram Moolenaar83bab712005-08-01 21:58:57 +00002163 let &autochdir= keep_autochdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002164
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002165" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002166endfun
2167
2168" ---------------------------------------------------------------------
2169" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00002170fun! LocalBrowseList()
2171" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002172
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002173 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002174 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2175 let dirnamelen = strlen(b:netrw_curdir)
2176 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002177" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002178 if filelist != ""
2179 let filelist= filelist."\n"
2180 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002181 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002182" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2183
2184 " if the directory name includes a "$", and possibly other characters,
2185 " the glob() doesn't include "." and ".." entries.
2186 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2187" call Decho("forcibly tacking on .")
2188 if filelist == ""
2189 let filelist= dirname."."
2190 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002191 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002192 endif
2193" call Decho("filelist<".filelist.">")
2194 endif
2195 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2196" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002197 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002198" call Decho("filelist<".filelist.">")
2199 endif
2200 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2201
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002202" call Decho("dirname<".dirname.">")
2203" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002204" call Decho("filelist<".filelist.">")
2205
2206 while filelist != ""
2207 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002208 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002209 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2210 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002211 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002212 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002213 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002214 let pfile= filename
2215 if isdirectory(filename)
2216 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002217 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002218 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002219 if pfile =~ '//$'
2220 let pfile= substitute(pfile,'//$','/','e')
2221 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002222 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002223" call Decho(" ")
2224" call Decho("filename<".filename.">")
2225" call Decho("pfile <".pfile.">")
2226
Bram Moolenaar8299df92004-07-10 09:47:34 +00002227 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002228 let sz = getfsize(filename)
Bram Moolenaar269ec652004-07-29 08:43:53 +00002229 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002230 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2231" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002232 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002233
Bram Moolenaar8299df92004-07-10 09:47:34 +00002234 if g:netrw_sort_by =~ "^t"
2235 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002236" call Decho("getftime(".filename.")=".getftime(filename))
2237 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002238 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002239" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002240 let ftpfile= ft.'/'.pfile
2241 keepjumps put=ftpfile
2242
Bram Moolenaar8299df92004-07-10 09:47:34 +00002243 elseif g:netrw_sort_by =~ "^s"
2244 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002245" call Decho("getfsize(".filename.")=".getfsize(filename))
2246 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002247 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002248" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002249 let fszpfile= fsz.'/'.pfile
2250 keepjumps put =fszpfile
2251
Bram Moolenaar8299df92004-07-10 09:47:34 +00002252 else
2253 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002254" call Decho("exe keepjumps put ='".pfile."'")
2255 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002256 endif
2257 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002258 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002259
2260" call Dret("LocalBrowseList")
2261endfun
2262
2263" ---------------------------------------------------------------------
2264" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2265" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002266fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2267" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002268
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002269 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002270 let newdir = a:newdir
2271
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002272 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002273 " apparently vim is "recognizing" that it is in the home directory and
2274 " is removing the "/". Bad idea, so I have to put it back.
2275 let dirname= dirname.'/'
2276" call Decho("adjusting dirname<".dirname.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002277 setlocal ma
2278 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002279 endif
2280
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002281 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002282 " handling a file
2283 let dirname= dirname.newdir
2284" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002285 " this lets NetBrowseX avoid the edit
2286 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002287" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2288" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2289 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002290 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002291
2292 elseif newdir == './'
2293 " refresh the directory list
2294" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002295
2296 elseif newdir == '../'
2297 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002298 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002299" call Decho("go up one dir: dirname<".dirname.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002300 setlocal ma
2301 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002302
2303 else
2304 " go down one directory
2305 let dirname= dirname.newdir
2306" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002307 setlocal ma
2308 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002309 endif
2310
2311" call Dret("LocalBrowseChgDir <".dirname.">")
2312 return dirname
2313endfun
2314
2315" ---------------------------------------------------------------------
2316" LocalBrowseRm:
2317fun! <SID>LocalBrowseRm(path) range
2318" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2319" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2320
2321 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002322 let ctr = a:firstline
2323 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002324 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002325
2326 " remove multiple files and directories
2327 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002328 exe "keepjumps ".ctr
2329
2330 " sanity checks
2331 if line(".") < s:netrw_bannercnt
2332 let ctr= ctr + 1
2333 continue
2334 endif
2335 let curword= s:NetGetWord()
2336 if curword == "./" || curword == "../"
2337 let ctr= ctr + 1
2338 continue
2339 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002340
2341 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002342 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002343" call Decho("rmfile<".rmfile.">")
2344
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002345 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002346 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002347 if !all
2348 echohl Statement
2349 call inputsave()
2350 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2351 call inputrestore()
2352 echohl NONE
2353 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2354 if ok =~ 'a\%[ll]'
2355 let all= 1
2356 endif
2357 endif
2358
2359 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002360 let ret= delete(rmfile)
2361" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002362 elseif ok =~ 'q\%[uit]'
2363 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002364 endif
2365
2366 else
2367 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002368 if !all
2369 echohl Statement
2370 call inputsave()
2371 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2372 call inputrestore()
2373 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2374 if ok =~ 'a\%[ll]'
2375 let all= 1
2376 endif
2377 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002378 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002379
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002380 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002381" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2382 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002383" call Decho("v:shell_error=".v:shell_error)
2384
2385 if v:shell_error != 0
2386" call Decho("2nd attempt to remove directory<".rmfile.">")
2387 let errcode= delete(rmfile)
2388" call Decho("errcode=".errcode)
2389
2390 if errcode != 0
2391 if has("unix")
2392" call Decho("3rd attempt to remove directory<".rmfile.">")
2393 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002394 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002395 echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002396 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002397 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002398 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002399 echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002400 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002401 endif
2402 endif
2403 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002404
2405 elseif ok =~ 'q\%[uit]'
2406 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002407 endif
2408 endif
2409
2410 let ctr= ctr + 1
2411 endwhile
2412
2413 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002414 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002415" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002416 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002417 exe curline
2418
2419" call Dret("LocalBrowseRm")
2420endfun
2421
2422" ---------------------------------------------------------------------
2423" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002424fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002425" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2426
2427 " preparation for removing multiple files/directories
2428 let ctr= a:firstline
2429
2430 " attempt to rename files/directories
2431 while ctr <= a:lastline
2432 exe "keepjumps ".ctr
2433
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002434 " sanity checks
2435 if line(".") < s:netrw_bannercnt
2436 let ctr= ctr + 1
2437 continue
2438 endif
2439 let curword= s:NetGetWord()
2440 if curword == "./" || curword == "../"
2441 let ctr= ctr + 1
2442 continue
2443 endif
2444
Bram Moolenaar8299df92004-07-10 09:47:34 +00002445 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002446 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002447" call Decho("oldname<".oldname.">")
2448
2449 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002450 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002451 call inputrestore()
2452
Bram Moolenaar83bab712005-08-01 21:58:57 +00002453 let ret= rename(oldname,newname)
2454" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002455
2456 let ctr= ctr + 1
2457 endwhile
2458
2459 " refresh the directory
2460 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002461" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002462 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002463 exe "keepjumps ".curline
2464" call Dret("LocalBrowseRename")
2465endfun
2466
2467" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002468" LocalPreview: {{{2
2469fun! <SID>LocalPreview(path) range
2470" call Dfunc("LocalPreview(path<".a:path.">)")
2471 if has("quickfix")
2472 if !isdirectory(a:path)
2473 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002474 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002475 echoerr "***netrw*** sorry, cannot preview a directory such as <".a:path.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002476 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002477 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002478 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002479 echoerr "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002480 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002481 endif
2482" call Dret("LocalPreview")
2483endfun
2484
2485" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002486" Explore: launch the local browser in the directory of the current file {{{2
2487" dosplit==0: the window will be split iff the current file has
2488" been modified
2489" dosplit==1: the window will be split before running the local
2490" browser
2491fun! s:Explore(dosplit,style,...)
2492" call Dfunc("Explore(dosplit=".a:dosplit." style=".a:style.")")
2493
2494 " if dosplit or file has been modified
2495 if a:dosplit || &modified
2496 if a:style == 0 " Explore, Sexplore
2497 exe g:netrw_winsize."wincmd s"
2498 elseif a:style == 1 "Explore!, Sexplore!
2499 exe g:netrw_winsize."wincmd v"
2500 elseif a:style == 2 " Hexplore
2501 exe "bel ".g:netrw_winsize."wincmd s"
2502 elseif a:style == 3 " Hexplore!
2503 exe "abo ".g:netrw_winsize."wincmd s"
2504 elseif a:style == 4 " Vexplore
2505 exe "lefta ".g:netrw_winsize."wincmd v"
2506 elseif a:style == 5 " Vexplore!
2507 exe "rightb ".g:netrw_winsize."wincmd v"
2508 endif
2509 endif
2510 norm! 0
2511
2512 if a:1 == ""
2513 let newdir= substitute(expand("%:p"),'^\(.*\)[/\\][^/\\]*$','\1','e')
2514 else
2515 let newdir= a:1
2516 endif
2517" call Decho("newdir<".newdir.">")
2518 call s:LocalBrowse(newdir)
2519
2520" call Dret("Explore")
2521endfun
2522
2523" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002524" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002525" Change backslashes to forward slashes, if any.
2526" If doesc is true, escape certain troublesome characters
2527fun! <SID>NetGetcwd(doesc)
2528" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2529 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002530 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002531 let curdir= curdir.'/'
2532 endif
2533 if a:doesc
2534 let curdir= escape(curdir,s:netrw_cd_escape)
2535 endif
2536" call Dret("NetGetcwd <".curdir.">")
2537 return curdir
2538endfun
2539
2540" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002541" NetMethod: determine method of transfer {{{1
2542" method == 1: rcp
2543" 2: ftp + <.netrc>
2544" 3: ftp + machine, id, password, and [path]filename
2545" 4: scp
2546" 5: http (wget)
2547" 6: cadaver
2548" 7: rsync
2549" 8: fetch
2550" 9: sftp
2551fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002552" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002553
2554 " initialization
2555 let b:netrw_method = 0
2556 let g:netrw_machine = ""
2557 let b:netrw_fname = ""
2558 let g:netrw_port = ""
2559
2560 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002561 " mipf : a:machine a:id password filename Use ftp
2562 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002563 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002564 " rcpurm : rcp://[user@]host/filename Use rcp
2565 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002566 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002567 " httpurm : http://[user@]host/filename Use wget
2568 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002569 " rsyncurm : rsync://host[:port]/path Use rsync
2570 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2571 " sftpurm : sftp://[user@]host/filename Use scp
2572 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2573 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2574 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002575 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002576 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2577 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2578 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002579 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002580 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2581 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2582 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2583
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002584" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002585 " Determine Method
2586 " rcp://user@hostname/...path-to-file
2587 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002588" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002589 let b:netrw_method = 1
2590 let userid = substitute(a:choice,rcpurm,'\1',"")
2591 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2592 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002593 if userid != ""
2594 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002595 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002596
2597 " scp://user@hostname/...path-to-file
2598 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002599" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002600 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002601 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2602 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2603 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002604
2605 " http://user@hostname/...path-to-file
2606 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002607" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002608 let b:netrw_method = 5
2609 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2610 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2611
2612 " dav://hostname[:port]/..path-to-file..
2613 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002614" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002615 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002616 if a:choice =~ '^s'
2617 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2618 else
2619 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2620 endif
2621 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002622
2623 " rsync://user@hostname/...path-to-file
2624 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002625" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002626 let b:netrw_method = 7
2627 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2628 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2629
2630 " ftp://[user@]hostname[[:#]port]/...path-to-file
2631 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002632" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002633 let userid = substitute(a:choice,ftpurm,'\2',"")
2634 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2635 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2636 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002637 if userid != ""
2638 let g:netrw_uid= userid
2639 endif
2640 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2641 let b:netrw_method = 3
2642 else
2643 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2644 let b:netrw_method= 2
2645 else
2646 if !exists("g:netrw_uid") || g:netrw_uid == ""
2647 call NetUserPass()
2648 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2649 call NetUserPass(g:netrw_uid)
2650 " else just use current g:netrw_uid and g:netrw_passwd
2651 endif
2652 let b:netrw_method= 3
2653 endif
2654 endif
2655
2656 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002657" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002658 let b:netrw_method = 8
2659 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2660 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2661 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2662 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2663
2664 " Issue an ftp : "machine id password [path/]filename"
2665 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002666" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002667 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002668 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2669 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2670 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2671 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2672
2673 " Issue an ftp: "hostname [path/]filename"
2674 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002675" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002676 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2677 let b:netrw_method = 3
2678 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2679 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2680
2681 elseif filereadable(expand("$HOME/.netrc"))
2682 let b:netrw_method = 2
2683 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2684 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2685 endif
2686
2687 " sftp://user@hostname/...path-to-file
2688 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002689" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002690 let b:netrw_method = 9
2691 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2692 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2693
2694 " Issue an rcp: hostname:filename" (this one should be last)
2695 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002696" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002697 let b:netrw_method = 1
2698 let userid = substitute(a:choice,rcphf,'\2',"")
2699 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2700 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002701" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2702" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2703" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2704" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002705 if userid != ""
2706 let g:netrw_uid= userid
2707 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002708 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002709 " don't let PCs try <.netrc>
2710 let b:netrw_method = 3
2711 endif
2712
2713 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002714 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002715 echoerr "***netrw*** cannot determine method"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002716 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002717 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002718 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002719 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00002720
2721 " remove any leading [:#] from port number
2722 if g:netrw_port != ""
2723 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2724 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002725
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002726" call Decho("a:choice <".a:choice.">")
2727" call Decho("b:netrw_method <".b:netrw_method.">")
2728" call Decho("g:netrw_machine<".g:netrw_machine.">")
2729" call Decho("g:netrw_port <".g:netrw_port.">")
2730" if exists("g:netrw_uid") "Decho
2731" call Decho("g:netrw_uid <".g:netrw_uid.">")
2732" endif "Decho
2733" if exists("g:netrw_passwd") "Decho
2734" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2735" endif "Decho
2736" call Decho("b:netrw_fname <".b:netrw_fname.">")
2737" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002738endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002739
2740" ------------------------------------------------------------------------
2741" NetUserPass: set username and password for subsequent ftp transfer {{{1
2742" Usage: :call NetUserPass() -- will prompt for userid and password
2743" :call NetUserPass("uid") -- will prompt for password
2744" :call NetUserPass("uid","password") -- sets global userid and password
2745fun! NetUserPass(...)
2746
2747 " get/set userid
2748 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002749" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002750 if !exists("g:netrw_uid") || g:netrw_uid == ""
2751 " via prompt
2752 let g:netrw_uid= input('Enter username: ')
2753 endif
2754 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002755" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002756 let g:netrw_uid= a:1
2757 endif
2758
2759 " get password
2760 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002761" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002762 let g:netrw_passwd= inputsecret("Enter Password: ")
2763 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002764" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002765 let g:netrw_passwd=a:2
2766 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002767" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002768endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002769
2770" ------------------------------------------------------------------------
2771" NetOptionSave: save options and set to "standard" form {{{1
2772fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002773" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002774
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002775 " Get Temporary Filename
2776 let s:aikeep = &ai
2777 let s:cinkeep = &cin
2778 let s:cinokeep = &cino
2779 let s:comkeep = &com
2780 let s:cpokeep = &cpo
2781 let s:dirkeep = getcwd()
2782 let s:gdkeep = &gd
2783 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002784 setlocal cino =
2785 setlocal com =
2786 setlocal cpo -=aA
2787 setlocal nocin noai
2788 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002789 if has("win32") && !has("win95")
2790 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002791 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002792" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002793 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002794
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002795" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002796endfun
2797
2798" ------------------------------------------------------------------------
2799" NetOptionRestore: restore options {{{1
2800fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002801" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002802
2803 let &ai = s:aikeep
2804 let &cin = s:cinkeep
2805 let &cino = s:cinokeep
2806 let &com = s:comkeep
2807 let &cpo = s:cpokeep
2808 exe "lcd ".s:dirkeep
2809 let &gd = s:gdkeep
2810 let &tw = s:twkeep
2811 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002812 if &directory == ""
2813 " user hasn't specified a swapfile directory;
2814 " netrw will temporarily make the swapfile
2815 " directory the current local one.
2816 let &directory = getcwd()
2817 silent! let &swf = s:swfkeep
2818 set directory=
2819 else
2820 let &swf= s:swfkeep
2821 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002822 unlet s:swfkeep
2823 endif
2824 unlet s:aikeep
2825 unlet s:cinkeep
2826 unlet s:cinokeep
2827 unlet s:comkeep
2828 unlet s:cpokeep
2829 unlet s:gdkeep
2830 unlet s:twkeep
2831 unlet s:dirkeep
2832
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002833" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002834endfun
2835
2836" ------------------------------------------------------------------------
2837" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002838" to handle extra junk that their system's ftp dumps
2839" into the transfer. This function is provided as an
2840" example and as a fix for a Windows 95 problem: in my
2841" experience, win95's ftp always dumped four blank lines
2842" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002843if has("win95") && g:netrw_win95ftp
2844 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002845" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002846 if method == 3 " ftp (no <.netrc>)
2847 let fourblanklines= line2 - 3
2848 silent fourblanklines.",".line2."g/^\s*/d"
2849 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002850" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002851 endfun
2852endif
2853
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002854" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002855" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002856if v:version < 700
2857 fun! <SID>NetSort() range
2858" " call Dfunc("NetSort()")
2859
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002860 let i = a:firstline + 1
2861 while i <= a:lastline
2862 " find insertion point via binary search
2863 let i_val = getline(i)
2864 let lo = a:firstline
2865 let hi = i
2866 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00002867 let mid = (lo + hi) / 2
2868 let mid_val = getline(mid)
2869 if g:netrw_sort_direction =~ '^n'
2870 " normal sorting order
2871 if i_val < mid_val
2872 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002873 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002874 let lo = mid + 1
2875 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002876 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002877 else
2878 " reverse sorting order
2879 if i_val > mid_val
2880 let hi = mid
2881 else
2882 let lo = mid + 1
2883 if i_val == mid_val | break | endif
2884 endif
2885 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002886 endwhile
2887 " do insert
2888 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00002889 exe 'keepjumps '.i.'d_'
2890 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002891 endif
2892 let i = i + 1
2893 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002894
2895" " call Dret("NetSort")
2896 endfun
2897endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002898
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002899" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002900" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2901" What this function does is to compute a priority for the patterns
2902" in the g:netrw_sort_sequence. It applies a substitute to any
2903" "files" that satisfy each pattern, putting the priority / in
2904" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002905fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002906" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002907 if g:netrw_longlist
2908 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2909 else
2910 let seqlist = g:netrw_sort_sequence
2911 endif
2912 " sanity check -- insure that * appears somewhere
2913 if seqlist == ""
2914 let seqlist= '*'
2915 elseif seqlist !~ '\*'
2916 let seqlist= seqlist.',*'
2917 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002918 let priority = 1
2919 while seqlist != ""
2920 if seqlist =~ ','
2921 let seq = substitute(seqlist,',.*$','','e')
2922 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2923 else
2924 let seq = seqlist
2925 let seqlist = ""
2926 endif
2927 let eseq= escape(seq,'/')
2928 if priority < 10
2929 let spriority= "00".priority.'\/'
2930 elseif priority < 100
2931 let spriority= "0".priority.'\/'
2932 else
2933 let spriority= priority.'\/'
2934 endif
2935" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2936
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002937 " sanity check
2938 if s:netrw_bannercnt > line("$")
2939 " apparently no files were left after a Hiding pattern was used
2940" call Dret("SetSort : no files left after hiding")
2941 return
2942 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002943 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002944 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002945 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002946 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002947 endif
2948 let priority = priority + 1
2949 endwhile
2950
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002951 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002952
2953" call Dret("SetSort")
2954endfun
2955
Bram Moolenaar83bab712005-08-01 21:58:57 +00002956let &cpo= s:keepcpo
2957unlet s:keepcpo
Bram Moolenaar071d4272004-06-13 20:20:40 +00002958" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002959" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002960" vim:ts=8 fdm=marker