blob: 85d7df74393fbf0f6702f8ffedbc5da5d6eac63d [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002" Last Change: Aug 12, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004" Version: 61
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" License: Vim License (see vim's :help license)
Bram Moolenaar572cb562005-08-05 21:35:02 +00006" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr.
7" Permission is hereby granted to use and distribute this code,
8" with or without modifications, provided that this copyright
9" notice is copied with it. Like anything else that's free,
10" netrw.vim is provided *as is* and comes with no
11" warranty of any kind, either expressed or implied. In no
12" event will the copyright holder be liable for any damages
13" resulting from the use of this software.
Bram Moolenaar071d4272004-06-13 20:20:40 +000014"
Bram Moolenaarc0197e22004-09-13 20:26:32 +000015" But be doers of the Word, and not only hearers, deluding your own selves
Bram Moolenaar071d4272004-06-13 20:20:40 +000016" (James 1:22 RSV)
17" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaard4755bb2004-09-02 19:12:26 +000018" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000019
Bram Moolenaard4755bb2004-09-02 19:12:26 +000020" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +000021" Load Once: {{{1
Bram Moolenaarc0197e22004-09-13 20:26:32 +000022if exists("g:loaded_netrw") || &cp
Bram Moolenaar071d4272004-06-13 20:20:40 +000023 finish
24endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000025let g:loaded_netrw = "v61"
Bram Moolenaar488c6512005-08-11 20:09:58 +000026if v:version < 700
27 let loaded_explorer = 1
28endif
29let s:keepcpo= &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000030set cpo&vim
31
32" ---------------------------------------------------------------------
33" Default values for global netrw variables {{{1
34if !exists("g:netrw_ftpmode")
35 let g:netrw_ftpmode= "binary"
36endif
37if !exists("g:netrw_win95ftp")
38 let g:netrw_win95ftp= 1
39endif
40if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000041 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000042 if &shell == "bash"
43 let g:netrw_cygwin= 1
44 else
45 let g:netrw_cygwin= 0
46 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000047 else
48 let g:netrw_cygwin= 0
49 endif
50endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000051if !exists("g:netrw_list_cmd")
52 if executable("ssh")
53 " provide a default listing command
54 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
55 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000056" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000057 let g:netrw_list_cmd= ""
58 endif
59endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000060if !exists("g:netrw_ftp_list_cmd")
61 if has("unix") || exists("g:netrw_cygwin")
62 let g:netrw_ftp_list_cmd= "ls -lF"
63 else
64 let g:netrw_ftp_list_cmd= "dir"
65 endif
66endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000067if !exists("g:netrw_rm_cmd")
68 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
69endif
70if !exists("g:netrw_rmf_cmd")
71 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
72endif
73if !exists("g:netrw_rmdir_cmd")
74 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
75endif
76if !exists("g:netrw_rename_cmd")
77 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
78endif
79if exists("g:netrw_silent") && g:netrw_silent != 0
80 let g:netrw_silentxfer= "silent "
81else
82 let g:netrw_silentxfer= ""
83endif
84if !exists("g:netrw_winsize")
85 let g:netrw_winsize= ""
86endif
87if !exists("g:netrw_list_hide")
88 let g:netrw_list_hide= ""
89endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000090if !exists("g:netrw_sort_by")
91 " alternatives: date size
92 let g:netrw_sort_by= "name"
93endif
94if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000095 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000096endif
97if !exists("g:netrw_sort_direction")
98 " alternative: reverse (z y x ...)
99 let g:netrw_sort_direction= "normal"
100endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000101if !exists("g:netrw_longlist") || g:netrw_longlist == 0
102 let g:netrw_longlist= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000103 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000104else
105 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000106 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
107endif
108if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000109endif
110if !exists("g:netrw_timefmt")
111 let g:netrw_timefmt= "%c"
112endif
113if !exists("g:netrw_local_rmdir")
114 let g:netrw_local_rmdir= "rmdir"
115endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000116if !exists("g:netrw_local_mkdir")
117 let g:netrw_local_mkdir= "mkdir"
118endif
119if !exists("g:netrw_mkdir_cmd")
120 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
121endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000122if !exists("g:netrw_hide")
123 let g:netrw_hide= 1
124endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000125if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000126 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 +0000127endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000128if !exists("g:netrw_ssh_browse_reject")
129 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
130endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000131if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000132 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000133endif
134if !exists("s:netrw_cd_escape")
135 if has("win32") || has("win95") || has("win64") || has("win16")
136 let s:netrw_cd_escape="#% "
137 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000138 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000139 endif
140endif
141if !exists("s:netrw_glob_escape")
142 if has("win32") || has("win95") || has("win64") || has("win16")
143 let s:netrw_glob_escape= ""
144 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000145 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000146 endif
147endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000148if !exists("g:netrw_alto")
149 let g:netrw_alto= 0
150endif
151if !exists("g:netrw_altv")
152 let g:netrw_altv= 0
153endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000154if !exists("g:netrw_maxfilenamelen")
155 let g:netrw_maxfilenamelen= 32
156endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000157if !exists("g:netrw_dirhistmax")
158 let g:netrw_dirhistmax= 10
159endif
160if !exists("g:NETRW_DIRHIST_CNT")
161 let g:NETRW_DIRHIST_CNT= 0
162endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000163
164" BufEnter event ignored by decho when following variable is true
165" Has a side effect that doau BufReadPost doesn't work, so
166" files read by network transfer aren't appropriately highlighted.
167"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168
169" ---------------------------------------------------------------------
170" Default values for global protocol variables {{{1
171if !exists("g:netrw_rcp_cmd")
172 let g:netrw_rcp_cmd = "rcp"
173endif
174if !exists("g:netrw_ftp_cmd")
175 let g:netrw_ftp_cmd = "ftp"
176endif
177if !exists("g:netrw_scp_cmd")
178 let g:netrw_scp_cmd = "scp -q"
179endif
180if !exists("g:netrw_sftp_cmd")
181 let g:netrw_sftp_cmd = "sftp"
182endif
183if !exists("g:netrw_http_cmd")
184 if executable("wget")
185 let g:netrw_http_cmd = "wget -q -O"
186 elseif executable("fetch")
187 let g:netrw_http_cmd = "fetch -o"
188 else
189 let g:netrw_http_cmd = ""
190 endif
191endif
192if !exists("g:netrw_dav_cmd")
193 let g:netrw_dav_cmd = "cadaver"
194endif
195if !exists("g:netrw_rsync_cmd")
196 let g:netrw_rsync_cmd = "rsync"
197endif
198if !exists("g:netrw_fetch_cmd")
199 if executable("fetch")
200 let g:netrw_fetch_cmd = "fetch -o"
201 else
202 let g:netrw_fetch_cmd = ""
203 endif
204endif
205
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000206if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207 \ && exists("g:netrw_use_nt_rcp")
208 \ && g:netrw_use_nt_rcp
209 \ && executable( $SystemRoot .'/system32/rcp.exe')
210 let s:netrw_has_nt_rcp = 1
211 let s:netrw_rcpmode = '-b'
212 else
213 let s:netrw_has_nt_rcp = 0
214 let s:netrw_rcpmode = ''
215endif
216
217" ---------------------------------------------------------------------
218" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000219 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000221 augroup FileExplorer
222 au!
Bram Moolenaar83bab712005-08-01 21:58:57 +0000223 au BufEnter * call <SID>LocalBrowse(expand("<amatch>"))
Bram Moolenaar8299df92004-07-10 09:47:34 +0000224 augroup END
225 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226 augroup Network
227 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000228 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000229 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 +0000230 else
Bram Moolenaar83bab712005-08-01 21:58:57 +0000231 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
232 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 +0000233 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000234 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>")
235 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>")
236 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe "Nwrite " .expand("<amatch>")|exe "silent doau BufWritePost ".expand("<amatch>")
237 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 +0000238 augroup END
239endif
240
241" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +0000242" Commands: :Nread, :Nwrite, :NetUserPass {{{1
243com! -nargs=* Nread call s:NetSavePosn()<bar>call s:NetRead(<f-args>)<bar>call s:NetRestorePosn()
244com! -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 +0000245com! -nargs=* NetUserPass call NetUserPass(<f-args>)
246
Bram Moolenaar83bab712005-08-01 21:58:57 +0000247" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000248com! -nargs=? -bar -bang -count=0 Explore call s:Explore(<count>,0,0+<bang>0,<q-args>)
249com! -nargs=? -bar -bang -count=0 Sexplore call s:Explore(<count>,1,0+<bang>0,<q-args>)
250com! -nargs=? -bar -bang -count=0 Hexplore call s:Explore(<count>,1,2+<bang>0,<q-args>)
251com! -nargs=? -bar -bang -count=0 Vexplore call s:Explore(<count>,1,4+<bang>0,<q-args>)
252com! -nargs=? -bar -bang Nexplore call s:Explore(-1,0,0,<q-args>)
253com! -nargs=? -bar -bang Pexplore call s:Explore(-2,0,0,<q-args>)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000254
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255" ------------------------------------------------------------------------
256" NetSavePosn: saves position of cursor on screen {{{1
257fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000258" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000259 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000260 let w:netrw_winnr= winnr()
261 let w:netrw_line = line(".")
262 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263
264 " Save top-of-screen line
265 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000266 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267
268 call s:NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000269" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270endfun
271
272" ------------------------------------------------------------------------
273" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
274fun! <SID>NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000275" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +0000276 let eikeep= &ei
277 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278
Bram Moolenaar81695252004-12-29 20:58:21 +0000279 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000280" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
281 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000282" if v:shell_error == 0
283" " as suggested by Bram M: redraw on no error
284" " allows protocol error messages to remain visible
285" redraw!
286" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000287
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000289" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
290 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000291
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000293" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
294 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295
Bram Moolenaar572cb562005-08-05 21:35:02 +0000296 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000297" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298endfun
299
300" ------------------------------------------------------------------------
301" NetRead: responsible for reading a file over the net {{{1
302fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000303" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000304
305 " save options
306 call s:NetOptionSave()
307
308 " Special Exception: if a file is named "0r", then
309 " "0r" will be used to read the
310 " following files instead of "r"
311 if a:0 == 0
312 let readcmd= "r"
313 let ichoice= 0
314 elseif a:1 == "0r"
315 let readcmd = "0r"
316 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000317 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000318 let readcmd = "r"
319 let ichoice = 1
320 endif
321
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000322 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000323 let tmpfile= tempname()
324
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000325" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000326 while ichoice <= a:0
327
328 " attempt to repeat with previous host-file-etc
329 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000330" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000331 let choice = b:netrw_lastfile
332 let ichoice= ichoice + 1
333
334 else
335 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000336" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000337
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000338 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000339 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000340 echomsg 'NetRead Usage:'
341 echomsg ':Nread machine:path uses rcp'
342 echomsg ':Nread "machine path" uses ftp with <.netrc>'
343 echomsg ':Nread "machine id password path" uses ftp'
344 echomsg ':Nread dav://machine[:port]/path uses cadaver'
345 echomsg ':Nread fetch://machine/path uses fetch'
346 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
347 echomsg ':Nread http://[user@]machine/path uses http wget'
348 echomsg ':Nread rcp://[user@]machine/path uses rcp'
349 echomsg ':Nread rsync://machine[:port]/path uses rsync'
350 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
351 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000352 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000353
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000354 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000355 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000356" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 if match(choice,"\"$") != -1
358 " case "..."
359 let choice=strpart(choice,1,strlen(choice)-2)
360 else
361 " case "... ... ..."
362 let choice = strpart(choice,1,strlen(choice)-1)
363 let wholechoice = ""
364
365 while match(choice,"\"$") == -1
366 let wholechoice = wholechoice . " " . choice
367 let ichoice = ichoice + 1
368 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000369 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000370 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000371 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000372 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000373" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000374 return
375 endif
376 let choice= a:{ichoice}
377 endwhile
378 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
379 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380 endif
381 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000383" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000384 let ichoice= ichoice + 1
385
386 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000387 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000388 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000389" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000391 exe 'lcd ' . fnamemodify(tmpfile,':h')
392 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000393 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000394
395 " Determine method of read (ftp, rcp, etc)
396 call s:NetMethod(choice)
397
Bram Moolenaar843ee412004-06-30 16:16:41 +0000398 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000399" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000400 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000401 keepjumps call s:NetBrowse(choice)
402" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000403 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000405
406 " ============
407 " Perform Read
408 " ============
409
410 ".........................................
411 " rcp: NetRead Method #1
412 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000413" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000414 " ER: noting done with g:netrw_uid yet?
415 " ER: on Win2K" rcp machine[.user]:file tmpfile
416 " ER: if machine contains '.' adding .user is required (use $USERNAME)
417 " ER: the tmpfile is full path: rcp sees C:\... as host C
418 if s:netrw_has_nt_rcp == 1
419 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
420 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
421 else
422 " Any way needed it machine contains a '.'
423 let uid_machine = g:netrw_machine .'.'. $USERNAME
424 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000426 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
427 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
428 else
429 let uid_machine = g:netrw_machine
430 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000431 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000432" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
434 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
435 let b:netrw_lastfile = choice
436
437 ".........................................
438 " ftp + <.netrc>: NetRead Method #2
439 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000440" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000441 let netrw_fname= b:netrw_fname
442 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000443 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000444 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000445 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000446 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000447" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000448 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
449 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000450" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000451 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
452 endif
453 " 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 +0000454 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000455 let debugkeep= &debug
456 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000457 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000458 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000459 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000460 endif
461 bd!
462 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
463 let b:netrw_lastfile = choice
464
465 ".........................................
466 " ftp + machine,id,passwd,filename: NetRead Method #3
467 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
468 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000469" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470 let netrw_fname= b:netrw_fname
471 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000472 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000473 if exists("g:netrw_port") && g:netrw_port != ""
474 put ='open '.g:netrw_machine.' '.g:netrw_port
475 else
476 put ='open '.g:netrw_machine
477 endif
478
479 if exists("g:netrw_ftp") && g:netrw_ftp == 1
480 put =g:netrw_uid
481 put =g:netrw_passwd
482 else
483 put ='user '.g:netrw_uid.' '.g:netrw_passwd
484 endif
485
486 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
487 put =g:netrw_ftpmode
488 endif
489 put ='get '.netrw_fname.' '.tmpfile
490
491 " perform ftp:
492 " -i : turns off interactive prompting from ftp
493 " -n unix : DON'T use <.netrc>, even though it exists
494 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000495" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000496 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000497" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000498 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
499 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
500 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000501" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000502 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000503 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000504 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000505 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000506 endif
507 bd!
508 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
509 let b:netrw_lastfile = choice
510
511 ".........................................
512 " scp: NetRead Method #4
513 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000514" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000515 if exists("g:netrw_port") && g:netrw_port != ""
516 let useport= " -P ".g:netrw_port
517 else
518 let useport= ""
519 endif
520 if g:netrw_cygwin == 1
521 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000522" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000523 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
524 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000525" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000526 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
527 endif
528 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
529 let b:netrw_lastfile = choice
530
531 ".........................................
532 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000533" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000534 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000535 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000536 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000537 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000538 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000539 exit
540 endif
541
542 if match(b:netrw_fname,"#") == -1
543 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000544" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000545 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
546 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
547
548 else
549 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
550 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
551 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000552" call Decho("netrw_html<".netrw_html.">")
553" call Decho("netrw_tag <".netrw_tag.">")
554" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000555 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
556 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000557" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
559 endif
560 let b:netrw_lastfile = choice
561
562 ".........................................
563 " cadaver: NetRead Method #6
564 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000565" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000566
567 " Construct execution string (four lines) which will be passed through filter
568 let netrw_fname= b:netrw_fname
569 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000570 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 if exists("g:netrw_port") && g:netrw_port != ""
572 put ='open '.g:netrw_machine.' '.g:netrw_port
573 else
574 put ='open '.g:netrw_machine
575 endif
576 put ='user '.g:netrw_uid.' '.g:netrw_passwd
577
578 if g:netrw_cygwin == 1
579 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
580 put ='get '.netrw_fname.' '.cygtmpfile
581 else
582 put ='get '.netrw_fname.' '.tmpfile
583 endif
584
585 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000586 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000587" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
589 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000590 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 let b:netrw_lastfile = choice
592
593 ".........................................
594 " rsync: NetRead Method #7
595 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000596" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000597 if g:netrw_cygwin == 1
598 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000599" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000600 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
601 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000602" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000603 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
604 endif
605 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
606 let b:netrw_lastfile = choice
607
608 ".........................................
609 " fetch: NetRead Method #8
610 " fetch://[user@]host[:http]/path
611 elseif b:netrw_method == 8 " read with fetch
612 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000613 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000614 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000615 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000616 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000617 exit
618 endif
619 if exists("g:netrw_option") && g:netrw_option == ":http"
620 let netrw_option= "http"
621 else
622 let netrw_option= "ftp"
623 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000624" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000625
626 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000627" 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 +0000628 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
629 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000630" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000631 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
632 endif
633
634 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
635 let b:netrw_lastfile = choice
636
637 ".........................................
638 " sftp: NetRead Method #9
639 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000640" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000641 if g:netrw_cygwin == 1
642 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000643" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
644" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
646 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000647" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
649 endif
650 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
651 let b:netrw_lastfile = choice
652
653 ".........................................
654 else " Complain
655 echo "***warning*** unable to comply with your request<" . choice . ">"
656 endif
657 endwhile
658
659 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000660" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000661 if exists("b:netrw_method")
662 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000663 unlet b:netrw_fname
664 endif
665 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000666
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000667" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000668endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000669
670" ------------------------------------------------------------------------
671" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
672fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000673" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000674
675 if exists("*NetReadFixup")
676 " for the use of NetReadFixup (not otherwise used internally)
677 let line2= line("$")
678 endif
679
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000680 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000681 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000682 if g:netrw_cygwin
683 let fname= a:fname
684" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000685 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000686 let fname= substitute(a:fname,'/','\\\\','ge')
687" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000688 endif
689 else
690 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000691" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000692 endif
693
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000694 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000695 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000696
Bram Moolenaar81695252004-12-29 20:58:21 +0000697 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000698 let rfile= bufname(".")
699" call Decho("remotefile<".rfile.">")
700" call Dredir("ls!","starting buffer list")
701
Bram Moolenaar81695252004-12-29 20:58:21 +0000702 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000703 if v:version < 700
704 exe "file ".fname
705 else
706 keepalt exe "file ".fname
707 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000708" call Dredir("ls!","after renaming current buffer to <".fname.">")
709
Bram Moolenaar81695252004-12-29 20:58:21 +0000710 " edit temporary file
711 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000712" call Dredir("ls!","after editing temporary file")
713
Bram Moolenaar81695252004-12-29 20:58:21 +0000714 " rename buffer back to remote filename
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000715 if v:version < 700
716 exe "file ".rfile
717 else
718 keepalt exe "file ".rfile
719 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000720" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000721 let line1 = 1
722 let line2 = line("$")
723
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000724 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000725 " read file after current line
726 let curline = line(".")
727 let lastline= line("$")
728" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000729 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000730 let line1 = curline + 1
731 let line2 = line("$") - lastline + 1
732 let s:netrw_line = s:netrw_line + 1
733 let s:netrw_col = 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000734 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000735 " not readable
736" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737 return
738 endif
739
740 " User-provided (ie. optional) fix-it-up command
741 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000742" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000744" else " Decho
745" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000746 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000747
748 " update the Buffers menu
749 if has("gui") && has("gui_running")
750 silent! emenu Buffers.Refresh\ menu
751 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000753" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000754
755 " insure that we have the right filetype and that its being displayed
756 filetype detect
757 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000758" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000759endfun
760
761" ------------------------------------------------------------------------
762" NetWrite: responsible for writing a file over the net {{{1
763fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000764" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000765
766 " option handling
767 let mod= 0
768 call s:NetOptionSave()
769
770 " Get Temporary Filename
771 let tmpfile= tempname()
772
773 if a:0 == 0
774 let ichoice = 0
775 else
776 let ichoice = 1
777 endif
778
779 " write (selected portion of) file to temporary
780 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
781
782 while ichoice <= a:0
783
784 " attempt to repeat with previous host-file-etc
785 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000786" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000787 let choice = b:netrw_lastfile
788 let ichoice= ichoice + 1
789 else
790 exe "let choice= a:" . ichoice
791
792 " Reconstruct Choice if choice starts with '"'
793 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000794 echomsg 'NetWrite Usage:"'
795 echomsg ':Nwrite machine:path uses rcp'
796 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
797 echomsg ':Nwrite "machine id password path" uses ftp'
798 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
799 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
800 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
801 echomsg ':Nwrite rcp://machine/path uses rcp'
802 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
803 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
804 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000805 break
806
807 elseif match(choice,"^\"") != -1
808 if match(choice,"\"$") != -1
809 " case "..."
810 let choice=strpart(choice,1,strlen(choice)-2)
811 else
812 " case "... ... ..."
813 let choice = strpart(choice,1,strlen(choice)-1)
814 let wholechoice = ""
815
816 while match(choice,"\"$") == -1
817 let wholechoice= wholechoice . " " . choice
818 let ichoice = ichoice + 1
819 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000820 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000821 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000822 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000823 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000824" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 return
826 endif
827 let choice= a:{ichoice}
828 endwhile
829 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
830 endif
831 endif
832 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000833" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 let ichoice= ichoice + 1
835
836 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000837 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000838 let choice= substitute(choice,'\\','/','ge')
839 "ER: see NetRead()
840 exe 'lcd ' . fnamemodify(tmpfile,':h')
841 let tmpfile = fnamemodify(tmpfile,':t')
842 endif
843
844 " Determine method of read (ftp, rcp, etc)
845 call s:NetMethod(choice)
846
847 " =============
848 " Perform Write
849 " =============
850
851 ".........................................
852 " rcp: NetWrite Method #1
853 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000854" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000855 if s:netrw_has_nt_rcp == 1
856 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
857 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
858 else
859 let uid_machine = g:netrw_machine .'.'. $USERNAME
860 endif
861 else
862 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
863 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
864 else
865 let uid_machine = g:netrw_machine
866 endif
867 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000868" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
870 let b:netrw_lastfile = choice
871
872 ".........................................
873 " ftp + <.netrc>: NetWrite Method #2
874 elseif b:netrw_method == 2 " write with ftp + <.netrc>
875 let netrw_fname = b:netrw_fname
876 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000877 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000878 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000879" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000880 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
881" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000882 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000883" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000884 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000885 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000886" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000887 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000888 endif
889 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
890 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000891 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000892 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000893 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000894 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000895 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000896 endif
897 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000898 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000899
900 ".........................................
901 " ftp + machine, id, passwd, filename: NetWrite Method #3
902 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
903 let netrw_fname= b:netrw_fname
904 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000905 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000906 if exists("g:netrw_port") && g:netrw_port != ""
907 put ='open '.g:netrw_machine.' '.g:netrw_port
908 else
909 put ='open '.g:netrw_machine
910 endif
911 if exists("g:netrw_ftp") && g:netrw_ftp == 1
912 put =g:netrw_uid
913 put =g:netrw_passwd
914 else
915 put ='user '.g:netrw_uid.' '.g:netrw_passwd
916 endif
917 put ='put '.tmpfile.' '.netrw_fname
918 " save choice/id/password for future use
919 let b:netrw_lastfile = choice
920
921 " perform ftp:
922 " -i : turns off interactive prompting from ftp
923 " -n unix : DON'T use <.netrc>, even though it exists
924 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000925" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000926 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000927" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
929 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
930 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000931 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000932 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000933 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000934 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000935 let mod=1
936 endif
937 bd!
938
939 ".........................................
940 " scp: NetWrite Method #4
941 elseif b:netrw_method == 4 " write with scp
942 if exists("g:netrw_port") && g:netrw_port != ""
943 let useport= " -P ".g:netrw_port
944 else
945 let useport= ""
946 endif
947 if g:netrw_cygwin == 1
948 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000949" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
951 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000952" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000953 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
954 endif
955 let b:netrw_lastfile = choice
956
957 ".........................................
958 " http: NetWrite Method #5
959 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000960 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000961 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000962 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000963 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000964
965 ".........................................
966 " dav: NetWrite Method #6
967 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000968" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969
970 " Construct execution string (four lines) which will be passed through filter
971 let netrw_fname= b:netrw_fname
972 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000973 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 if exists("g:netrw_port") && g:netrw_port != ""
975 put ='open '.g:netrw_machine.' '.g:netrw_port
976 else
977 put ='open '.g:netrw_machine
978 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000979 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980
981 if g:netrw_cygwin == 1
982 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
983 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000986 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987
988 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000989 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000990" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
992 bd!
993 let b:netrw_lastfile = choice
994
995 ".........................................
996 " rsync: NetWrite Method #7
997 elseif b:netrw_method == 7 " write with rsync
998 if g:netrw_cygwin == 1
999 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001000" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001002 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001003" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001005 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 let b:netrw_lastfile = choice
1007
1008 ".........................................
1009 " scp: NetWrite Method #9
1010 elseif b:netrw_method == 9 " write with sftp
1011 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001012 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1013 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1014 else
1015 let uid_machine = g:netrw_machine
1016 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001018 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001019 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001020 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001021" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1023 bd!
1024 let b:netrw_lastfile= choice
1025
1026 ".........................................
1027 else " Complain
1028 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001029 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001030 endwhile
1031
1032 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001033" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001034 let result=delete(tmpfile)
1035 call s:NetOptionRestore()
1036
1037 if a:firstline == 1 && a:lastline == line("$")
1038 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001039 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001040
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001041" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001042endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001043
Bram Moolenaar83bab712005-08-01 21:58:57 +00001044" ===========================================
1045" Remote Directory Browsing Support: {{{1
1046" ===========================================
1047
Bram Moolenaar843ee412004-06-30 16:16:41 +00001048" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001049" of the contents of a remote directory. It is assumed that the
1050" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1051" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001052fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001053" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001054
Bram Moolenaar488c6512005-08-11 20:09:58 +00001055 if exists("s:netrw_skipbrowse")
1056 unlet s:netrw_skipbrowse
1057" call Dret("NetBrowse")
1058 return
1059 endif
1060
Bram Moolenaar843ee412004-06-30 16:16:41 +00001061 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001062 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1063" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001064 if !executable("ftp")
1065 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001066 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001067 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001068 endif
1069" call Dret("NetBrowse")
1070 return
1071 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001072 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001073 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001074 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001075 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001076 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001077
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001078" call Dret("NetBrowse")
1079 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001080 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001081
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001082 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1083 call s:UseBufWinVars()
1084
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001085 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001086 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001087
1088 " analyze a:dirname and g:netrw_list_cmd
1089 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001090 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001091" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001092 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001093 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001094 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001095 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001096 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001097" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001098 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001099 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001100
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001101 let method = substitute(dirname,dirpat,'\1','')
1102 let user = substitute(dirname,dirpat,'\2','')
1103 let machine = substitute(dirname,dirpat,'\3','')
1104 let path = substitute(dirname,dirpat,'\4','')
1105 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001106" call Decho("set up method <".method .">")
1107" call Decho("set up user <".user .">")
1108" call Decho("set up machine<".machine.">")
1109" call Decho("set up path <".path .">")
1110" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001111
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001112 if method == "ftp" || method == "http"
1113 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001114 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001115 else
1116 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1117 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001118
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001119 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001120" call Decho("setting w:netrw_method<".b:netrw_method.">")
1121 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001122 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001123
Bram Moolenaar8299df92004-07-10 09:47:34 +00001124 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001125 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001126 echohl WarningMsg | echo "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001127 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001128 else
1129 if g:netrw_sort_by =~ "^t"
1130 let listcmd= listcmd."t"
1131 elseif g:netrw_sort_by =~ "^s"
1132 let listcmd= listcmd."S"
1133 endif
1134 " optionally sort in reverse
1135 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1136 let listcmd= listcmd."r"
1137 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001138 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001139
1140" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001141 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001142" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001143 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001145" call Dret("NetBrowse : symlink")
1146 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001147
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001148 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001149 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001150" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001151
1152 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001153 " "this is a directory" indicator (/). There shouldn't be one of those,
1154 " anyway.
1155 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001156" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001157
1158 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001159 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001160" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001161 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001163 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001164 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001165 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001166
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001167 " save certain window-oriented variables into buffer-oriented variables
1168 call s:BufWinVars()
1169
Bram Moolenaar572cb562005-08-05 21:35:02 +00001170 setlocal nonu nomod noma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001171
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001172" call Dret("NetBrowse : file<".fname.">")
1173 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001174 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001175
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001176 " ---------------------------------------------------------------------
1177 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001178" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001179 " set up new buffer and map
1180 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001181 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001182" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001183 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001184 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001185" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001186 exe "b ".bufnamenr
1187 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001188" call Dret("NetBrowse")
1189 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001190 endif
1191 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001192" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001193 enew!
1194 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001195
1196 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001197 setlocal bt=nofile bh=wipe nobl noswf
1198 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001199" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001200 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001201" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001202 setlocal bh=hide nobl nonu
1203
1204 " save current directory on directory history list
1205 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001206
1207 " set up buffer-local mappings
1208" call Decho("set up buffer-local mappings")
1209 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001210 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001211 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001212 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 +00001213 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1214 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1215 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1216 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001217 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001218 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1219 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>
1220 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>
1221 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001222 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1223 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001224 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001225 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1226 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 +00001227 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1228 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001229 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001230 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1231 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1232 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001233 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001234 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001235 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001236
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001237 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001238" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1239 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001240 keepjumps put ='\" Netrw Remote Directory Listing'
1241 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001242 let w:netrw_bannercnt = 7
1243 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001244 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001245 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001246 endif
1247
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001248 if g:netrw_sort_by =~ "^n"
1249 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001250 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001251 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001252 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1253 else
1254 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001255 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001256 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001257 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001258 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001259 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001260 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001261 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001262 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001263 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001264 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001265 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1266 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001267
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001268 " remote read the requested directory listing
1269 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1270 " Note that not all ftp servers honor the options for ls
1271 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001272 " use ftp to get remote file listing
1273" call Decho("use ftp to get remote file listing")
1274 call NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001275 keepjumps 1d
1276
1277 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001278 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001279" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001280 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001281
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001282 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001283 if g:netrw_ftp_browse_reject != ""
1284 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1285 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001286
1287 " if there's no ../ listed, then put ./ and ../ in
1288 let line1= line(".")
1289 keepjumps 1
1290 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1291 let line2= line(".")
1292 if line2 == 0
1293 keepjumps put='../'
1294 keepjumps put='./'
1295 endif
1296 exe "keepjumps ".line1
1297 keepjumps norm! 0
1298
1299 " more cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001300 exe 'keepjumps silent! '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1301 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1302 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001303 endif
1304
1305 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001306 " use ssh to get remote file listing
1307" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001308 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001309" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001310 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1311 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001312 " cleanup
1313 if g:netrw_ftp_browse_reject != ""
1314 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001315 endif
1316 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001317
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001318
1319 " set up syntax highlighting
1320 if has("syntax")
1321 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001322 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001323 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001324 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1325 " sometimes the laststatus highlight bleeds into the entire display.
1326 " Only seems to happen with remote browsing. Weird.
1327 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001328 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001329 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001330
1331 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001332 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001333 if g:netrw_hide && g:netrw_list_hide != ""
1334 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001335 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001336
Bram Moolenaar8299df92004-07-10 09:47:34 +00001337 if g:netrw_longlist
1338 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001339" call Decho("manipulate long listing")
1340
1341 if method == "ftp"
1342 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001343 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001344 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001345 keepjumps d
1346 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001347 " if there's no ../ listed, then put ./ and ../ in
1348 let line1= line(".")
1349 keepjumps 1
1350 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1351 let line2= line(".")
1352 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001353 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1354 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001355 endif
1356 exe "keepjumps ".line1
1357 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001358 endif
1359
Bram Moolenaar488c6512005-08-11 20:09:58 +00001360 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/ -> .*$//e'
1361 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1362 exe w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001363 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001364
Bram Moolenaar488c6512005-08-11 20:09:58 +00001365 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001366 if g:netrw_sort_by =~ "^n"
1367 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00001368 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00001369 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001370 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00001371 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001372 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00001373 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001374 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001375 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001376 endif
1377 if g:netrw_longlist
1378 " shorten the list to keep its width <= 80 characters
Bram Moolenaar488c6512005-08-11 20:09:58 +00001379 exe "keepjumps silent ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001380 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001381 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001382 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001383 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001384
1385 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001386
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001387" call Dret("NetBrowse")
1388 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389endfun
1390
1391" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001392" NetBrowseChgDir: {{{2
1393fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001394" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001395
1396 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001397 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001398
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001399 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001400 " handling a file
1401 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001402" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001403
1404 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001405 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001406" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001407 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001408 %d
1409
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001410 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001411 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001412 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001413
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001414 if trailer =~ '^\%(\.\./\)*$'
1415 " tack on a ../"
1416 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001417
1418 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001419 " strip off a directory name from dirname
1420 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001421 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001422" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001423
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001424 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001425 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001426 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001427" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001428 endif
1429
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001430" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001431 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001432endfun
1433
Bram Moolenaar843ee412004-06-30 16:16:41 +00001434" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001435" NetGetWord: it gets the directory named under the cursor
1436fun! <SID>NetGetWord()
1437" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001438 call s:UseBufWinVars()
1439
Bram Moolenaar488c6512005-08-11 20:09:58 +00001440 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001441 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001442 let curline= getline(".")
1443 if curline =~ '"\s*Sorted by\s'
1444 norm s
1445 let s:netrw_skipbrowse= 1
1446 echo 'Pressing "s" also works'
1447 elseif curline =~ '"\s*Sort sequence:'
1448 let s:netrw_skipbrowse= 1
1449 echo 'Press "S" to edit sorting sequence'
1450 elseif curline =~ '"\s*Quick Help:'
1451 norm ?
1452 let s:netrw_skipbrowse= 1
1453 echo 'Pressing "?" also works'
1454 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1455 norm a
1456 let s:netrw_skipbrowse= 1
1457 echo 'Pressing "a" also works'
1458 elseif line("$") > w:netrw_bannercnt
1459 exe w:netrw_bannercnt
1460 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001461 else
1462 let dirname= getline(".")
1463 if dirname =~ '\t'
1464 let dirname= substitute(dirname,'\t.*$','','e')
1465 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001466 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001467" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001468 return dirname
1469endfun
1470
1471" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001472" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001473fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001474" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1475" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001476
1477 " preparation for removing multiple files/directories
1478 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001479 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001480
1481 " remove multiple files and directories
1482 while ctr <= a:lastline
1483 exe ctr
1484
1485 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001486 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001487" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001488
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001489 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001490 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001491 if !all
1492 echohl Statement
1493 call inputsave()
1494 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1495 call inputrestore()
1496 echohl NONE
1497 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1498 if ok =~ 'a\%[ll]'
1499 let all= 1
1500 endif
1501 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001502
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001503 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001504 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001505 silent! keepjumps .,$d
1506 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1507 else
1508 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1509" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1510 let ret= system(netrw_rm_cmd)
1511" call Decho("returned=".ret." errcode=".v:shell_error)
1512 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001513 elseif ok =~ 'q\%[uit]'
1514 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001515 endif
1516
1517 else
1518 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001519 if !all
1520 call inputsave()
1521 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1522 call inputrestore()
1523 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1524 if ok =~ 'a\%[ll]'
1525 let all= 1
1526 endif
1527 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001528
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001529 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001530 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001531 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1532 else
1533 let rmfile = a:path.rmfile
1534 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1535" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1536 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001537" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001538
1539 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001540 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001541" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1542 let ret= system(netrw_rmf_cmd)
1543" call Decho("returned=".ret." errcode=".v:shell_error)
1544
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001545 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001546 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001547 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001548 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001549 endif
1550 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001551
1552 elseif ok =~ 'q\%[uit]'
1553 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001554 endif
1555 endif
1556
1557 let ctr= ctr + 1
1558 endwhile
1559
1560 " refresh the directory
1561 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001562" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001563 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1564 exe curline
1565
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001566" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001567endfun
1568
1569" ---------------------------------------------------------------------
1570" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001571fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001572" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001573
1574 " preparation for removing multiple files/directories
1575 let ctr = a:firstline
1576 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1577
1578 " attempt to rename files/directories
1579 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001580 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001581
1582 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001583 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001584" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001585
1586 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001587 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001588 call inputrestore()
1589
Bram Moolenaar488c6512005-08-11 20:09:58 +00001590 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001591 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1592 else
1593 let oldname= a:path.oldname
1594 let newname= a:path.newname
1595" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1596 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1597 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001598
1599 let ctr= ctr + 1
1600 endwhile
1601
1602 " refresh the directory
1603 let curline= line(".")
1604 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001605 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001606" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001607endfun
1608
1609" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001610" NetRefresh: {{{2
1611fun! <SID>NetRefresh(dirname)
1612" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1613 set ma
1614 %d
1615 call <SID>NetBrowse(dirname)
1616 redraw!
1617" call Dret("NetRefresh")
1618endfun
1619
1620" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001621" NetSplit: mode {{{2
1622" =0 : net and o
1623" =1 : net and v
1624" =2 : local and o
1625" =3 : local and v
1626fun! s:NetSplit(mode)
1627" call Dfunc("NetSplit(mode=".a:mode.")")
1628
1629 call s:SaveWinVars()
1630 if a:mode == 0
1631 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1632 call s:CopyWinVars()
1633 exe "norm! 0"
1634 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1635 elseif a:mode ==1
1636 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1637 call s:CopyWinVars()
1638 exe "norm! 0"
1639 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1640 elseif a:mode ==2
1641 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1642 call s:CopyWinVars()
1643 exe "norm! 0"
1644 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
1645 else
1646 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1647 call s:CopyWinVars()
1648 exe "norm! 0"
1649 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
1650 endif
1651
1652" call Dret("NetSplit")
1653endfun
1654
1655" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001656" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001657" files given their extension. Passes 0=local, 1=remote
1658fun! <SID>NetBrowseX(fname,remote)
1659" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001660
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001661 " set up the filename
1662 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001663 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001664 if has("win32") || has("win95") || has("win64") || has("win16")
1665 let exten= substitute(exten,'^.*$','\L&\E','')
1666 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001667 let fname= escape(a:fname,"%#")
1668" call Decho("fname<".fname."> after escape()")
1669
1670 if a:remote == 1
1671 " create a local copy
1672 let fname= tempname().".".exten
1673" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1674 exe "keepjumps silent bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001675 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001676 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001677 q
1678 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001679" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001680
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001681 " set up redirection
1682 if &srr =~ "%s"
1683 let redir= substitute(&srr,"%s","/dev/null"."")
1684 else
1685 let redir= &srr . "/dev/null"
1686 endif
1687" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001688
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001689 " execute the file handler
1690 if has("win32") || has("win64")
1691" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1692 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1693 let ret= v:shell_error
1694
1695 elseif has("unix") && executable("kfmclient")
1696" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1697 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1698 let ret= v:shell_error
1699
1700 elseif has("unix") && executable("gnome-open")
1701" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1702 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1703 let ret= v:shell_error
1704
1705 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1706" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001707 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001708 endif
1709 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001710
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001711 " cleanup: remove temporary file,
1712 " delete current buffer if success with handler,
1713 " return to prior buffer (directory listing)
1714 if a:remote == 1 && fname != a:fname
1715" call Decho("deleting temporary file<".fname.">")
1716 call delete(fname)
1717 endif
1718
1719 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001720 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001721 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001722 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001723 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001724
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001725" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001726endfun
1727
1728" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001729" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1730" This function assumes that a long listing will be received. Size, time,
1731" and reverse sorts will be requested of the server but not otherwise
1732" enforced here.
1733fun! NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001734" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001735
1736 " because WinXX ftp uses unix style input
1737 " curline is one more than the bannercnt in order to account
1738 " for the unwanted first blank line (doing a :put to an empty
1739 " buffer yields a blank first line)
1740 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001741 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001742 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001743 exe "silent! keepjumps ".curline.",$d"
1744
1745 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001746 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001747 " ftp + <.netrc>: Method #2
1748 if a:path != ""
1749 put ='cd '.a:path
1750 endif
1751 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001752" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001753 if exists("g:netrw_port") && g:netrw_port != ""
1754" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1755 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1756 else
1757" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1758 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1759 endif
1760
1761 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001762 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001763 " ftp + machine,id,passwd,filename: Method #3
1764 setlocal ff=unix
1765 if exists("g:netrw_port") && g:netrw_port != ""
1766 put ='open '.g:netrw_machine.' '.g:netrw_port
1767 else
1768 put ='open '.g:netrw_machine
1769 endif
1770
1771 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1772 put =g:netrw_uid
1773 put =g:netrw_passwd
1774 else
1775 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1776 endif
1777
1778 if a:path != ""
1779 put ='cd '.a:path
1780 endif
1781 exe "put ='".a:cmd."'"
1782
1783 " perform ftp:
1784 " -i : turns off interactive prompting from ftp
1785 " -n unix : DON'T use <.netrc>, even though it exists
1786 " -n win32: quit being obnoxious about password
1787" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1788 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1789
1790 ".........................................
1791 else
1792 echo "***warning*** unable to comply with your request<" . choice . ">"
1793 endif
1794
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001795 " cleanup for Windows
1796 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001797 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001798 endif
1799 if a:cmd == "dir"
1800 " infer directory/link based on the file permission string
Bram Moolenaar83bab712005-08-01 21:58:57 +00001801 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1802 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001803 if !g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00001804 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001805 endif
1806 endif
1807
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001808 " restore settings
1809 let &ff= ffkeep
1810" call Dret("NetBrowseFtpCmd")
1811endfun
1812
1813" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001814" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1815" separated patterns given in g:netrw_list_hide
1816fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001817" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001818
1819 let listhide= g:netrw_list_hide
1820 while listhide != ""
1821 if listhide =~ ','
1822 let hide = substitute(listhide,',.*$','','e')
1823 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1824 else
1825 let hide = listhide
1826 let listhide= ""
1827 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001828
1829 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001830" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001831 if g:netrw_hide == 1
Bram Moolenaar488c6512005-08-11 20:09:58 +00001832 exe 'keepjumps silent '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001833 elseif g:netrw_hide == 2
Bram Moolenaar488c6512005-08-11 20:09:58 +00001834 exe 'keepjumps silent '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001835 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001836 endwhile
1837
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001838" call Dret("NetrwListHide")
1839endfun
1840
1841" ---------------------------------------------------------------------
1842" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001843fun! <SID>NetHideEdit(mode)
1844" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001845
1846 call inputsave()
1847 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1848 call inputrestore()
1849
1850 " refresh the listing
1851 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001852 if a:mode == 0
1853 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1854 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001855 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001856 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001857
1858" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001859endfun
1860
Bram Moolenaar8299df92004-07-10 09:47:34 +00001861" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001862" NetSortSequence: allows user to edit the sorting sequence
1863fun! <SID>NetSortSequence(mode)
1864" call Dfunc("NetSortSequence(mode=".a:mode.")")
1865
1866 call inputsave()
1867 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1868 call inputrestore()
1869
1870 " refresh the listing
1871 let g:netrw_sort_sequence= newsortseq
1872 if a:mode == 0
1873 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1874 else
1875 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1876 endif
1877
1878" call Dret("NetSortSequence")
1879endfun
1880
1881" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001882" NetLongList: {{{2
1883fun! <SID>NetLongList(mode)
1884" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001885 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001886
1887 if g:netrw_longlist != 0
1888 " turn long listing off
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001889" call Decho("turn long listing off")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001890 let g:netrw_longlist = 0
1891 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1892
1893 else
1894 " turn long listing on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001895" call Decho("turn long listing on")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001896 let g:netrw_longlist = 1
1897 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1898 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001899 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001900
1901 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001902 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001903
1904 " refresh the listing
1905 if a:mode == 0
1906 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1907 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001908 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001909 endif
1910
Bram Moolenaar488c6512005-08-11 20:09:58 +00001911 call s:NetRestorePosn()
1912
Bram Moolenaar8299df92004-07-10 09:47:34 +00001913" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1914endfun
1915
1916" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001917" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001918" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1919" the same word even though the sorting has changed its order of appearance.
1920fun! s:NetSaveWordPosn()
1921" call Dfunc("NetSaveWordPosn()")
1922 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1923" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1924endfun
1925
1926" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001927" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001928fun! s:NetRestoreWordPosn()
1929" call Dfunc("NetRestoreWordPosn()")
1930 silent! call search(s:netrw_saveword,'w')
1931" call Dret("NetRestoreWordPosn")
1932endfun
1933
1934" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001935" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001936fun! <SID>NetMakeDir(usrhost)
1937" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1938
1939 " get name of new directory from user. A bare <CR> will skip.
1940 " if its currently a directory, also request will be skipped, but with
1941 " a message.
1942 call inputsave()
1943 let newdirname= input("Please give directory name: ")
1944 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001945" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001946
1947 if newdirname == ""
1948" call Dret("NetMakeDir : user aborted with bare <cr>")
1949 return
1950 endif
1951
1952 if a:usrhost == ""
1953
1954 " Local mkdir:
1955 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001956 let fullnewdir= b:netrw_curdir.'/'.newdirname
1957" call Decho("fullnewdir<".fullnewdir.">")
1958 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001959 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001960 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001961 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001962 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001963" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1964 return
1965 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001966 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001967 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001968 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001969 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001970 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001971" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1972 return
1973 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001974
1975 " requested new local directory is neither a pre-existing file or
1976 " directory, so make it!
1977 if exists("*mkdir")
1978 call mkdir(fullnewdir,"p")
1979 else
1980 let netrw_origdir= s:NetGetcwd(1)
1981 exe 'cd '.b:netrw_curdir
1982" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1983" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1984 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001985 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001986 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001987
Bram Moolenaar8299df92004-07-10 09:47:34 +00001988 if v:shell_error == 0
1989 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001990" call Decho("refresh listing")
1991 let linenum= line(".")
1992 norm! H0
1993 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001994 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001995 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1996 exe "norm! ".hline."G0z\<CR>"
1997 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001998 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001999 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002000 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002001 endif
2002 redraw!
2003
2004 else
2005 " Remote mkdir:
2006 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002007 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002008" call Decho("exe silent! !".mkdircmd." ".newdirname)
2009 exe "silent! !".mkdircmd." ".newdirname
2010 if v:shell_error == 0
2011 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002012 let linenum= line(".")
2013 norm! H0
2014 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002015 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002016 exe "norm! ".hline."G0z\<CR>"
2017 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002018 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002019 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002020 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002021 endif
2022 redraw!
2023 endif
2024
2025" call Dret("NetMakeDir")
2026endfun
2027
2028" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002029" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002030" 0: (user: <b>) bookmark current directory
2031" 1: (user: <B>) change to the bookmarked directory
2032" 2: (user: <q>) list bookmarks
2033" 3: (LocalBrowse) record current directory history
2034" 4: (user: <u>) go up (previous) bookmark
2035" 5: (user: <U>) go down (next) bookmark
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002036fun! <SID>NetBookmarkDir(chg,curdir)
2037" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002038 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2039 " looks like a "b" was pressed while in the banner region
2040 if line("$") > w:netrw_bannercnt
2041 exe w:netrw_bannercnt
2042 endif
2043 echo ""
2044" call Dret("NetBookmarkDir - ignoring")
2045 return
2046 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002047
2048 if a:chg == 0
2049 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002050 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2051 if !exists("g:NETRW_BOOKMARKMAX")
2052 let g:NETRW_BOOKMARKMAX= v:count
2053 elseif v:count > g:NETRW_BOOKMARKMAX
2054 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002055 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002056 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002057
2058 elseif a:chg == 1
2059 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002060 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2061 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002062 else
2063 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2064 endif
2065
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002066 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002067 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002068 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002069" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2070 let cnt= 0
2071 while cnt <= g:NETRW_BOOKMARKMAX
2072 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2073" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2074 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2075 endif
2076 let cnt= cnt + 1
2077 endwhile
2078 endif
2079
2080 " list directory history
2081 let cnt = g:NETRW_DIRHIST_CNT
2082 let first = 1
2083 let histcnt = 0
2084 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2085" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2086 let histcnt= histcnt + 1
2087 if exists("g:NETRW_DIRHIST_{cnt}")
2088" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2089 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002090 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002091 let first = 0
2092 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2093 if cnt < 0
2094 let cnt= cnt + g:netrw_dirhistmax
2095 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002096 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002097
2098 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002099 " saves most recently visited directories (when they differ)
2100 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2101 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2102 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2103" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2104 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002105
2106 elseif a:chg == 4
2107 " u: change to the previous directory stored on the history list
2108 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2109 if g:NETRW_DIRHIST_CNT < 0
2110 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2111 endif
2112 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2113" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2114 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2115 else
2116 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2117 echo "Sorry, no predecessor directory exists yet"
2118 endif
2119
2120 elseif a:chg == 5
2121 " U: change to the subsequent directory stored on the history list
2122 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2123 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2124" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2125 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2126 else
2127 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2128 if g:NETRW_DIRHIST_CNT < 0
2129 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2130 endif
2131 echo "Sorry, no successor directory exists yet"
2132 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002133 endif
2134" call Dret("NetBookmarkDir")
2135endfun
2136
Bram Moolenaar83bab712005-08-01 21:58:57 +00002137" ==========================================
2138" Local Directory Browsing Support: {{{1
2139" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002140
2141" ---------------------------------------------------------------------
2142" LocalBrowse: supports local file/directory browsing {{{2
2143fun! <SID>LocalBrowse(dirname)
2144
2145" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
2146 if !isdirectory(a:dirname)
2147 " not a directory, ignore it
2148 return
2149 endif
2150
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002151 " unfortunate interaction -- when putting debugging calls
2152 " above one can no longer enter the DBG buffer.
Bram Moolenaar572cb562005-08-05 21:35:02 +00002153" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002154" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002155
Bram Moolenaar488c6512005-08-11 20:09:58 +00002156 if exists("s:netrw_skipbrowse")
2157 unlet s:netrw_skipbrowse
2158" call Dret("NetBrowse")
2159 return
2160 endif
2161
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002162 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002163 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002164 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002165 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002166 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002167" call Dret("LocalBrowse : vim version<".v:version."> too old")
2168 return
2169 endif
2170
Bram Moolenaar83bab712005-08-01 21:58:57 +00002171 " record autochdir setting and then insure its unset (tnx to David Fishburn)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002172 if has("netbeans_intg") || has("sun_workshop")
2173 let keep_autochdir= &autochdir
2174 set noautochdir
2175 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002176
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002177 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2178 call s:UseBufWinVars()
2179
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002180 " find buffer number of buffer named precisely the same as a:dirname
2181 let bufnum= bufnr(a:dirname)
2182" call Decho("findbuf: bufnum=".bufnum)
2183 if bufnum > 0 && bufname(bufnum) != a:dirname
2184 let ibuf= 1
2185 let buflast= bufnr("$")
2186 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2187" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2188 let ibuf= ibuf + 1
2189 endwhile
2190 if ibuf > buflast
2191 let bufnum= -1
2192 else
2193 let bufnum= ibuf
2194 endif
2195" call Decho("findbuf: bufnum=".bufnum." (final)")
2196 endif
2197
2198 " get cleared buffer
2199 if bufnum < 0
2200 if v:version < 700
2201 enew!
2202 else
2203 keepalt enew!
2204 endif
2205" call Decho("enew buffer")
2206 else
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002207 if v:version < 700
2208 exe "b ".bufnum
2209 else
2210 exe "keepalt b ".bufnum
2211 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002212 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2213 if getline(2) =~ '^" Directory Listing '
2214 if !g:netrw_keepdir
2215" call Decho("change directory: cd ".b:netrw_curdir)
2216 exe 'cd '.b:netrw_curdir
2217 endif
2218" call Dret("LocalBrowse : reusing buffer#".bufnum."<".a:dirname.">")
2219 return
2220 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002221 endif
2222 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002223 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002224
2225 " get the new directory name
Bram Moolenaar83bab712005-08-01 21:58:57 +00002226 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2227 if b:netrw_curdir =~ '[/\\]$'
2228 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2229 endif
2230" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002231
Bram Moolenaar83bab712005-08-01 21:58:57 +00002232 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002233 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002234" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002235 try
2236 exe 'cd '.b:netrw_curdir
2237 catch /^Vim\%((\a\+)\)\=:E472/
2238 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2239 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2240 if exists("w:netrw_prvdir")
2241 let b:netrw_curdir= w:netrw_prvdir
2242 else
2243" call Dret("LocalBrowse : reusing buffer#".bufnum."<".a:dirname.">")
2244 return
2245 endif
2246 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002247 endif
2248
2249 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002250 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002251
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002252 " make this buffer modifiable and hidden
2253 setlocal ma hidden nonu
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002254 if v:version < 700
2255 silent! %d
2256 else
2257 keepalt silent! %d
2258 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002259
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002260 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002261 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002262
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002263 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002264 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002265
Bram Moolenaar8299df92004-07-10 09:47:34 +00002266 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002267" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002268 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002269 nnoremap <buffer> <silent> <c-l> :set ma<bar>%d<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<bar>redraw!<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002270 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002271 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002272 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2273 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2274 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2275 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2276 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002277 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002278 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002279 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 +00002280 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2281 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>
2282 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>
2283 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002284 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2285 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002286 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002287 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002288 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2289 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2290 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002291 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2292 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2293 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2294 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2295 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2296 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002297 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002298 nnoremap <buffer> ? :he netrw-dir<cr>
2299
2300 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002301" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002302 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002303 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002304 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002305 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002306 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002307
2308 let sortby= g:netrw_sort_by
2309 if g:netrw_sort_direction =~ "^r"
2310 let sortby= sortby." reversed"
2311 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002312
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002313 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002314 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002315" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002316 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002317 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002318 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002319 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002320 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002321" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002322 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002323 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002324 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002325 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002326
2327 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002328 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002329 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002330 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002331 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002332 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002333 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002334 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002335 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002336 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2337 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002338 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002339
2340 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002341 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2342" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002343
2344 " generate the requested directory listing
Bram Moolenaar83bab712005-08-01 21:58:57 +00002345 call LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002346
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002347 " set up syntax highlighting
2348 if has("syntax")
2349 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002350 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002351 setlocal ft=
2352 endif
2353 endif
2354
Bram Moolenaar8299df92004-07-10 09:47:34 +00002355 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002356 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002357 if g:netrw_hide && g:netrw_list_hide != ""
2358 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002359 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002360 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002361
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002362 if g:netrw_sort_by =~ "^n"
2363 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002364
Bram Moolenaar83bab712005-08-01 21:58:57 +00002365 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00002366 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002367 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002368 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002369 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002370 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002371 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002372 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002373
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002374 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002375 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00002376 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002377 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002378 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002379 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002380 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002381 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002382 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002383 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002384
Bram Moolenaar8299df92004-07-10 09:47:34 +00002385 endif
2386 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002387 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
2388 exe w:netrw_bannercnt
2389 endif
2390
2391 " record previous current directory
2392 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002393
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002394 " save certain window-oriented variables into buffer-oriented variables
2395 call s:BufWinVars()
2396
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002397 setlocal noma nomod nonu bh=hide nobl
2398 if has("netbeans_intg") || has("sun_workshop")
2399 let &autochdir= keep_autochdir
2400 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002401
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002402" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002403endfun
2404
2405" ---------------------------------------------------------------------
2406" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00002407fun! LocalBrowseList()
2408" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002409
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002410 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002411 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2412 let dirnamelen = strlen(b:netrw_curdir)
2413 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002414" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002415 if filelist != ""
2416 let filelist= filelist."\n"
2417 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002418 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002419" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2420
2421 " if the directory name includes a "$", and possibly other characters,
2422 " the glob() doesn't include "." and ".." entries.
2423 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2424" call Decho("forcibly tacking on .")
2425 if filelist == ""
2426 let filelist= dirname."."
2427 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002428 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002429 endif
2430" call Decho("filelist<".filelist.">")
2431 endif
2432 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2433" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002434 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002435" call Decho("filelist<".filelist.">")
2436 endif
2437 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2438
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002439" call Decho("dirname<".dirname.">")
2440" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002441" call Decho("filelist<".filelist.">")
2442
2443 while filelist != ""
2444 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002445 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002446 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2447 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002448 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002449 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002450 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002451 let pfile= filename
2452 if isdirectory(filename)
2453 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002454 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002455 if pfile =~ '//$'
2456 let pfile= substitute(pfile,'//$','/','e')
2457 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002458 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002459 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002460" call Decho(" ")
2461" call Decho("filename<".filename.">")
2462" call Decho("pfile <".pfile.">")
2463
Bram Moolenaar8299df92004-07-10 09:47:34 +00002464 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002465 let sz = getfsize(filename)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002466 if v:version <= 700
2467 let fsz = strpart(" ",1,15-strlen(sz)).sz
2468 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2469 else
2470 let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
2471 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002472" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002473 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002474
Bram Moolenaar8299df92004-07-10 09:47:34 +00002475 if g:netrw_sort_by =~ "^t"
2476 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002477" call Decho("getftime(".filename.")=".getftime(filename))
2478 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002479 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002480" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002481 let ftpfile= ft.'/'.pfile
2482 keepjumps put=ftpfile
2483
Bram Moolenaar8299df92004-07-10 09:47:34 +00002484 elseif g:netrw_sort_by =~ "^s"
2485 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002486" call Decho("getfsize(".filename.")=".getfsize(filename))
2487 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002488 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002489" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002490 let fszpfile= fsz.'/'.pfile
2491 keepjumps put =fszpfile
2492
Bram Moolenaar8299df92004-07-10 09:47:34 +00002493 else
2494 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002495" call Decho("exe keepjumps put ='".pfile."'")
2496 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002497 endif
2498 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002499 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002500
2501" call Dret("LocalBrowseList")
2502endfun
2503
2504" ---------------------------------------------------------------------
2505" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2506" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002507fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2508" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002509
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002510 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002511 let newdir = a:newdir
2512
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002513 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002514 " apparently vim is "recognizing" that it is in the home directory and
2515 " is removing the "/". Bad idea, so I have to put it back.
2516 let dirname= dirname.'/'
2517" call Decho("adjusting dirname<".dirname.">")
2518 endif
2519
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002520 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002521 " handling a file
2522 let dirname= dirname.newdir
2523" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002524 " this lets NetBrowseX avoid the edit
2525 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002526" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2527" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2528 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002529 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002530
2531 elseif newdir == './'
2532 " refresh the directory list
2533" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002534
2535 elseif newdir == '../'
2536 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002537 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002538" call Decho("go up one dir: dirname<".dirname.">")
2539
2540 else
2541 " go down one directory
2542 let dirname= dirname.newdir
2543" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2544 endif
2545
2546" call Dret("LocalBrowseChgDir <".dirname.">")
2547 return dirname
2548endfun
2549
2550" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002551" LocalBrowseRm: {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002552fun! <SID>LocalBrowseRm(path) range
2553" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2554" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2555
2556 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002557 let ctr = a:firstline
2558 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002559 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002560
2561 " remove multiple files and directories
2562 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002563 exe "keepjumps ".ctr
2564
2565 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002566 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002567 let ctr= ctr + 1
2568 continue
2569 endif
2570 let curword= s:NetGetWord()
2571 if curword == "./" || curword == "../"
2572 let ctr= ctr + 1
2573 continue
2574 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002575
2576 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002577 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002578" call Decho("rmfile<".rmfile.">")
2579
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002580 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002581 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002582 if !all
2583 echohl Statement
2584 call inputsave()
2585 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2586 call inputrestore()
2587 echohl NONE
2588 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2589 if ok =~ 'a\%[ll]'
2590 let all= 1
2591 endif
2592 endif
2593
2594 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002595 let ret= delete(rmfile)
2596" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002597 elseif ok =~ 'q\%[uit]'
2598 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002599 endif
2600
2601 else
2602 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002603 if !all
2604 echohl Statement
2605 call inputsave()
2606 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2607 call inputrestore()
2608 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2609 if ok =~ 'a\%[ll]'
2610 let all= 1
2611 endif
2612 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002613 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002614
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002615 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002616" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2617 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002618" call Decho("v:shell_error=".v:shell_error)
2619
2620 if v:shell_error != 0
2621" call Decho("2nd attempt to remove directory<".rmfile.">")
2622 let errcode= delete(rmfile)
2623" call Decho("errcode=".errcode)
2624
2625 if errcode != 0
2626 if has("unix")
2627" call Decho("3rd attempt to remove directory<".rmfile.">")
2628 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002629 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002630 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002631 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002632 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002633 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002634 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002635 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002636 endif
2637 endif
2638 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002639
2640 elseif ok =~ 'q\%[uit]'
2641 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002642 endif
2643 endif
2644
2645 let ctr= ctr + 1
2646 endwhile
2647
2648 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002649 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002650" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002651 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002652 exe curline
2653
2654" call Dret("LocalBrowseRm")
2655endfun
2656
2657" ---------------------------------------------------------------------
2658" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002659fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002660" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2661
2662 " preparation for removing multiple files/directories
2663 let ctr= a:firstline
2664
2665 " attempt to rename files/directories
2666 while ctr <= a:lastline
2667 exe "keepjumps ".ctr
2668
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002669 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002670 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002671 let ctr= ctr + 1
2672 continue
2673 endif
2674 let curword= s:NetGetWord()
2675 if curword == "./" || curword == "../"
2676 let ctr= ctr + 1
2677 continue
2678 endif
2679
Bram Moolenaar8299df92004-07-10 09:47:34 +00002680 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002681 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002682" call Decho("oldname<".oldname.">")
2683
2684 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002685 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002686 call inputrestore()
2687
Bram Moolenaar83bab712005-08-01 21:58:57 +00002688 let ret= rename(oldname,newname)
2689" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002690
2691 let ctr= ctr + 1
2692 endwhile
2693
2694 " refresh the directory
2695 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002696" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002697 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002698 exe "keepjumps ".curline
2699" call Dret("LocalBrowseRename")
2700endfun
2701
2702" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002703" LocalPreview: {{{2
2704fun! <SID>LocalPreview(path) range
2705" call Dfunc("LocalPreview(path<".a:path.">)")
2706 if has("quickfix")
2707 if !isdirectory(a:path)
2708 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002709 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002710 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002711 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002712 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002713 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002714 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002715 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002716 endif
2717" call Dret("LocalPreview")
2718endfun
2719
2720" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002721" LocalRefresh: {{{2
2722fun! <SID>LocalRefresh(dirname)
2723" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2724 set ma
2725 %d
2726 call <SID>LocalBrowse(a:dirname)
2727 redraw!
2728" call Dret("LocalRefresh")
2729endfun
2730
2731" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002732" Explore: launch the local browser in the directory of the current file {{{2
2733" dosplit==0: the window will be split iff the current file has
2734" been modified
2735" dosplit==1: the window will be split before running the local
2736" browser
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002737fun! s:Explore(indx,dosplit,style,...)
2738" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002739
2740 " if dosplit or file has been modified
2741 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00002742 call <SID>SaveWinVars()
2743
Bram Moolenaar83bab712005-08-01 21:58:57 +00002744 if a:style == 0 " Explore, Sexplore
2745 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002746" call Decho("style=0: Explore or Sexplore")
2747
Bram Moolenaar83bab712005-08-01 21:58:57 +00002748 elseif a:style == 1 "Explore!, Sexplore!
2749 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002750" call Decho("style=1: Explore! or Sexplore!")
2751
Bram Moolenaar83bab712005-08-01 21:58:57 +00002752 elseif a:style == 2 " Hexplore
2753 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002754" call Decho("style=2: Hexplore")
2755
Bram Moolenaar83bab712005-08-01 21:58:57 +00002756 elseif a:style == 3 " Hexplore!
2757 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002758" call Decho("style=3: Hexplore!")
2759
Bram Moolenaar83bab712005-08-01 21:58:57 +00002760 elseif a:style == 4 " Vexplore
2761 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002762" call Decho("style=4: Vexplore")
2763
Bram Moolenaar83bab712005-08-01 21:58:57 +00002764 elseif a:style == 5 " Vexplore!
2765 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002766" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002767 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002768 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002769 endif
2770 norm! 0
2771
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002772 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002773 " Explore Hexplore Vexplore Sexplore
2774 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
2775 if newdir =~ '^scp:' || newdir =~ '^ftp:'
2776" call Decho("calling NetBrowse(newdir<".newdir.">)")
2777 call s:NetBrowse(newdir)
2778 else
2779" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2780 call s:LocalBrowse(newdir)
2781 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002782
Bram Moolenaar572cb562005-08-05 21:35:02 +00002783 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002784 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002785
Bram Moolenaar488c6512005-08-11 20:09:58 +00002786 if has("path_extra") && v:version >= 700
2787 if !exists("w:netrw_explore_indx")
2788 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002789 endif
2790 let indx = a:indx
2791 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00002792 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002793 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00002794 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002795 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002796 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002797 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002798 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002799 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002800 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
2801 let w:netrw_explore_listlen = len(w:netrw_explore_list)
2802 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00002803 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
2804 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2805" call Dret("Explore")
2806 return
2807 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002808 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002809
2810 " NetrwStatusLine support
Bram Moolenaar488c6512005-08-11 20:09:58 +00002811 let w:netrw_explore_indx= indx
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002812 if !exists("s:netrw_explore_stl")
2813 let s:netrw_explore_stl= &stl
2814 endif
2815 set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
Bram Moolenaar488c6512005-08-11 20:09:58 +00002816" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002817
2818 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00002819 if indx >= w:netrw_explore_listlen || indx < 0
2820 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00002821 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002822 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2823" call Dret("Explore")
2824 return
2825 endif
2826
Bram Moolenaar488c6512005-08-11 20:09:58 +00002827 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002828" call Decho("dirfile<".dirfile."> indx=".indx)
2829 let newdir= substitute(dirfile,'/[^/]*$','','e')
2830" call Decho("newdir<".newdir.">")
2831" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2832 call s:LocalBrowse(newdir)
2833 call search(substitute(dirfile,"^.*/","",""),"W")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002834 let w:netrw_explore_mtchcnt = indx + 1
2835 let w:netrw_explore_bufnr = bufnr(".")
2836 let w:netrw_explore_line = line(".")
2837" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002838
2839 else
2840 if v:version < 700
Bram Moolenaar572cb562005-08-05 21:35:02 +00002841 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for Exploring with **!" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002842 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002843 echohl WarningMsg | echo "***netrw*** your vim needs the +path_extra feature for Exploring with **!" | echohl None | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002844 endif
2845 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2846 endif
2847
Bram Moolenaar83bab712005-08-01 21:58:57 +00002848 else
2849 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002850" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2851 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002852 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002853
2854" call Dret("Explore")
2855endfun
2856
2857" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002858" NetrwStatusLine: {{{2
2859fun! NetrwStatusLine()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002860" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr(".")." Xline#".w:netrw_explore_line." line#".line(".")
2861 if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr(".") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002862 let &stl= s:netrw_explore_stl
Bram Moolenaar488c6512005-08-11 20:09:58 +00002863 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
2864 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002865 return ""
2866 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002867 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002868 endif
2869endfun
2870
2871" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002872" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002873" Change backslashes to forward slashes, if any.
2874" If doesc is true, escape certain troublesome characters
2875fun! <SID>NetGetcwd(doesc)
2876" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2877 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002878 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002879 let curdir= curdir.'/'
2880 endif
2881 if a:doesc
2882 let curdir= escape(curdir,s:netrw_cd_escape)
2883 endif
2884" call Dret("NetGetcwd <".curdir.">")
2885 return curdir
2886endfun
2887
2888" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002889" NetMethod: determine method of transfer {{{1
2890" method == 1: rcp
2891" 2: ftp + <.netrc>
2892" 3: ftp + machine, id, password, and [path]filename
2893" 4: scp
2894" 5: http (wget)
2895" 6: cadaver
2896" 7: rsync
2897" 8: fetch
2898" 9: sftp
2899fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002900" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002901
2902 " initialization
2903 let b:netrw_method = 0
2904 let g:netrw_machine = ""
2905 let b:netrw_fname = ""
2906 let g:netrw_port = ""
2907
2908 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002909 " mipf : a:machine a:id password filename Use ftp
2910 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002911 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002912 " rcpurm : rcp://[user@]host/filename Use rcp
2913 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002914 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002915 " httpurm : http://[user@]host/filename Use wget
2916 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002917 " rsyncurm : rsync://host[:port]/path Use rsync
2918 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2919 " sftpurm : sftp://[user@]host/filename Use scp
2920 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2921 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2922 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002923 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002924 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2925 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2926 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002927 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002928 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2929 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2930 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2931
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002932" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002933 " Determine Method
2934 " rcp://user@hostname/...path-to-file
2935 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002936" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002937 let b:netrw_method = 1
2938 let userid = substitute(a:choice,rcpurm,'\1',"")
2939 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2940 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002941 if userid != ""
2942 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002943 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002944
2945 " scp://user@hostname/...path-to-file
2946 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002947" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002948 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002949 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2950 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2951 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002952
2953 " http://user@hostname/...path-to-file
2954 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002955" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002956 let b:netrw_method = 5
2957 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2958 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2959
2960 " dav://hostname[:port]/..path-to-file..
2961 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002962" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002963 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002964 if a:choice =~ '^s'
2965 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2966 else
2967 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2968 endif
2969 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002970
2971 " rsync://user@hostname/...path-to-file
2972 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002973" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002974 let b:netrw_method = 7
2975 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2976 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2977
2978 " ftp://[user@]hostname[[:#]port]/...path-to-file
2979 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002980" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002981 let userid = substitute(a:choice,ftpurm,'\2',"")
2982 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2983 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2984 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002985 if userid != ""
2986 let g:netrw_uid= userid
2987 endif
2988 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2989 let b:netrw_method = 3
2990 else
2991 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2992 let b:netrw_method= 2
2993 else
2994 if !exists("g:netrw_uid") || g:netrw_uid == ""
2995 call NetUserPass()
2996 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2997 call NetUserPass(g:netrw_uid)
2998 " else just use current g:netrw_uid and g:netrw_passwd
2999 endif
3000 let b:netrw_method= 3
3001 endif
3002 endif
3003
3004 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003005" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003006 let b:netrw_method = 8
3007 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3008 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3009 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3010 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
3011
3012 " Issue an ftp : "machine id password [path/]filename"
3013 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003014" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003015 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003016 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3017 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3018 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3019 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3020
3021 " Issue an ftp: "hostname [path/]filename"
3022 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003023" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003024 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3025 let b:netrw_method = 3
3026 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3027 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3028
3029 elseif filereadable(expand("$HOME/.netrc"))
3030 let b:netrw_method = 2
3031 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3032 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3033 endif
3034
3035 " sftp://user@hostname/...path-to-file
3036 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003037" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003038 let b:netrw_method = 9
3039 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3040 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3041
3042 " Issue an rcp: hostname:filename" (this one should be last)
3043 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003044" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003045 let b:netrw_method = 1
3046 let userid = substitute(a:choice,rcphf,'\2',"")
3047 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3048 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003049" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3050" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3051" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3052" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003053 if userid != ""
3054 let g:netrw_uid= userid
3055 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003056 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003057 " don't let PCs try <.netrc>
3058 let b:netrw_method = 3
3059 endif
3060
3061 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003062 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003063 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003064 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003065 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003066 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003067 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003068
3069 " remove any leading [:#] from port number
3070 if g:netrw_port != ""
3071 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3072 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003073
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003074" call Decho("a:choice <".a:choice.">")
3075" call Decho("b:netrw_method <".b:netrw_method.">")
3076" call Decho("g:netrw_machine<".g:netrw_machine.">")
3077" call Decho("g:netrw_port <".g:netrw_port.">")
3078" if exists("g:netrw_uid") "Decho
3079" call Decho("g:netrw_uid <".g:netrw_uid.">")
3080" endif "Decho
3081" if exists("g:netrw_passwd") "Decho
3082" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3083" endif "Decho
3084" call Decho("b:netrw_fname <".b:netrw_fname.">")
3085" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003086endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003087
3088" ------------------------------------------------------------------------
3089" NetUserPass: set username and password for subsequent ftp transfer {{{1
3090" Usage: :call NetUserPass() -- will prompt for userid and password
3091" :call NetUserPass("uid") -- will prompt for password
3092" :call NetUserPass("uid","password") -- sets global userid and password
3093fun! NetUserPass(...)
3094
3095 " get/set userid
3096 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003097" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003098 if !exists("g:netrw_uid") || g:netrw_uid == ""
3099 " via prompt
3100 let g:netrw_uid= input('Enter username: ')
3101 endif
3102 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003103" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003104 let g:netrw_uid= a:1
3105 endif
3106
3107 " get password
3108 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003109" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003110 let g:netrw_passwd= inputsecret("Enter Password: ")
3111 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003112" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003113 let g:netrw_passwd=a:2
3114 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003115" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003116endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003117
3118" ------------------------------------------------------------------------
3119" NetOptionSave: save options and set to "standard" form {{{1
3120fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003121" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003122
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003123 " Get Temporary Filename
3124 let s:aikeep = &ai
3125 let s:cinkeep = &cin
3126 let s:cinokeep = &cino
3127 let s:comkeep = &com
3128 let s:cpokeep = &cpo
3129 let s:dirkeep = getcwd()
3130 let s:gdkeep = &gd
3131 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003132 setlocal cino =
3133 setlocal com =
3134 setlocal cpo -=aA
3135 setlocal nocin noai
3136 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003137 if has("win32") && !has("win95")
3138 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003139 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003140" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003141 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003142
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003143" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003144endfun
3145
3146" ------------------------------------------------------------------------
3147" NetOptionRestore: restore options {{{1
3148fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003149" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003150
3151 let &ai = s:aikeep
3152 let &cin = s:cinkeep
3153 let &cino = s:cinokeep
3154 let &com = s:comkeep
3155 let &cpo = s:cpokeep
3156 exe "lcd ".s:dirkeep
3157 let &gd = s:gdkeep
3158 let &tw = s:twkeep
3159 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003160 if &directory == ""
3161 " user hasn't specified a swapfile directory;
3162 " netrw will temporarily make the swapfile
3163 " directory the current local one.
3164 let &directory = getcwd()
3165 silent! let &swf = s:swfkeep
3166 set directory=
3167 else
3168 let &swf= s:swfkeep
3169 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003170 unlet s:swfkeep
3171 endif
3172 unlet s:aikeep
3173 unlet s:cinkeep
3174 unlet s:cinokeep
3175 unlet s:comkeep
3176 unlet s:cpokeep
3177 unlet s:gdkeep
3178 unlet s:twkeep
3179 unlet s:dirkeep
3180
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003181" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003182endfun
3183
3184" ------------------------------------------------------------------------
3185" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003186" to handle extra junk that their system's ftp dumps
3187" into the transfer. This function is provided as an
3188" example and as a fix for a Windows 95 problem: in my
3189" experience, win95's ftp always dumped four blank lines
3190" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003191if has("win95") && g:netrw_win95ftp
3192 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003193" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003194 if method == 3 " ftp (no <.netrc>)
3195 let fourblanklines= line2 - 3
3196 silent fourblanklines.",".line2."g/^\s*/d"
3197 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003198" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003199 endfun
3200endif
3201
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003202" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003203" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003204if v:version < 700
3205 fun! <SID>NetSort() range
3206" " call Dfunc("NetSort()")
3207
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003208 let i = a:firstline + 1
3209 while i <= a:lastline
3210 " find insertion point via binary search
3211 let i_val = getline(i)
3212 let lo = a:firstline
3213 let hi = i
3214 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003215 let mid = (lo + hi) / 2
3216 let mid_val = getline(mid)
3217 if g:netrw_sort_direction =~ '^n'
3218 " normal sorting order
3219 if i_val < mid_val
3220 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003221 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003222 let lo = mid + 1
3223 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003224 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003225 else
3226 " reverse sorting order
3227 if i_val > mid_val
3228 let hi = mid
3229 else
3230 let lo = mid + 1
3231 if i_val == mid_val | break | endif
3232 endif
3233 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003234 endwhile
3235 " do insert
3236 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003237 exe 'keepjumps '.i.'d_'
3238 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003239 endif
3240 let i = i + 1
3241 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003242
3243" " call Dret("NetSort")
3244 endfun
3245endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003246
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003247" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003248" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3249" What this function does is to compute a priority for the patterns
3250" in the g:netrw_sort_sequence. It applies a substitute to any
3251" "files" that satisfy each pattern, putting the priority / in
3252" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003253fun! <SID>SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003254" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003255 if g:netrw_longlist
3256 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3257 else
3258 let seqlist = g:netrw_sort_sequence
3259 endif
3260 " sanity check -- insure that * appears somewhere
3261 if seqlist == ""
3262 let seqlist= '*'
3263 elseif seqlist !~ '\*'
3264 let seqlist= seqlist.',*'
3265 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003266 let priority = 1
3267 while seqlist != ""
3268 if seqlist =~ ','
3269 let seq = substitute(seqlist,',.*$','','e')
3270 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3271 else
3272 let seq = seqlist
3273 let seqlist = ""
3274 endif
3275 let eseq= escape(seq,'/')
3276 if priority < 10
3277 let spriority= "00".priority.'\/'
3278 elseif priority < 100
3279 let spriority= "0".priority.'\/'
3280 else
3281 let spriority= priority.'\/'
3282 endif
3283" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3284
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003285 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003286 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003287 " apparently no files were left after a Hiding pattern was used
3288" call Dret("SetSort : no files left after hiding")
3289 return
3290 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003291 if seq == '*'
Bram Moolenaar488c6512005-08-11 20:09:58 +00003292 exe 'keepjumps silent '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003293 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003294 exe 'keepjumps silent '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003295 endif
3296 let priority = priority + 1
3297 endwhile
3298
Bram Moolenaar488c6512005-08-11 20:09:58 +00003299 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003300
3301" call Dret("SetSort")
3302endfun
3303
Bram Moolenaar488c6512005-08-11 20:09:58 +00003304" ---------------------------------------------------------------------
3305" SaveWinVars: (used by Explore()) {{{1
3306fun! s:SaveWinVars()
3307" call Dfunc("SaveWinVars()")
3308 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3309 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3310 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3311 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3312 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3313 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3314 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3315 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003316 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003317" call Dret("SaveWinVars")
3318endfun
3319
3320" ---------------------------------------------------------------------
3321" CopyWinVars: (used by Explore()) {{{1
3322fun! s:CopyWinVars()
3323" call Dfunc("CopyWinVars()")
3324 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3325 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3326 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3327 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3328 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3329 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3330 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3331 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003332 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003333" call Dret("CopyWinVars")
3334endfun
3335
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003336" ---------------------------------------------------------------------
3337" BufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
3338" To allow separate windows to have their own activities, such as
3339" Explore **/pattern, several variables have been made window-oriented.
3340" However, when the user splits a browser window (ex: ctrl-w s), these
3341" variables are not inherited by the new window. BufWinVars() and
3342" UseBufWinVars() get around that.
3343fun! s:BufWinVars()
3344" call Dfunc("BufWinVars()")
3345 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
3346 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
3347 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
3348 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
3349 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
3350 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3351 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
3352 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
3353 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
3354" call Dret("BufWinVars")
3355endfun
3356
3357" ---------------------------------------------------------------------
3358" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
3359" Matching function to BufferWinVars()
3360fun! s:UseBufWinVars()
3361" call Dfunc("UseBufWinVars()")
3362 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
3363 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
3364 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
3365 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
3366 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
3367 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
3368 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
3369 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
3370 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
3371" call Dret("UseBufWinVars")
3372endfun
3373
Bram Moolenaar83bab712005-08-01 21:58:57 +00003374let &cpo= s:keepcpo
3375unlet s:keepcpo
Bram Moolenaar071d4272004-06-13 20:20:40 +00003376" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003377" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003378" vim:ts=8 fdm=marker