blob: 0b7c616af6c8ce752ef1a1e55c10e9482ea2c597 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar488c6512005-08-11 20:09:58 +00002" Last Change: Aug 10, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar488c6512005-08-11 20:09:58 +00004" Version: 60
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 Moolenaar488c6512005-08-11 20:09:58 +000025let g:loaded_netrw = "v60"
26if 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 Moolenaarf4b8e572004-06-24 15:53:16 +00001082 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001083 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001084
1085 " analyze a:dirname and g:netrw_list_cmd
1086 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001087 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001088" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001089 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001090 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001091 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001092 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001093 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001094" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001095 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001096 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001097
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001098 let method = substitute(dirname,dirpat,'\1','')
1099 let user = substitute(dirname,dirpat,'\2','')
1100 let machine = substitute(dirname,dirpat,'\3','')
1101 let path = substitute(dirname,dirpat,'\4','')
1102 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001103" call Decho("set up method <".method .">")
1104" call Decho("set up user <".user .">")
1105" call Decho("set up machine<".machine.">")
1106" call Decho("set up path <".path .">")
1107" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001108
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001109 if method == "ftp" || method == "http"
1110 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001111 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001112 else
1113 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1114 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001115
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001116 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001117" call Decho("setting w:netrw_method<".b:netrw_method.">")
1118 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001119 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001120
Bram Moolenaar8299df92004-07-10 09:47:34 +00001121 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001122 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001123 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 +00001124 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001125 else
1126 if g:netrw_sort_by =~ "^t"
1127 let listcmd= listcmd."t"
1128 elseif g:netrw_sort_by =~ "^s"
1129 let listcmd= listcmd."S"
1130 endif
1131 " optionally sort in reverse
1132 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1133 let listcmd= listcmd."r"
1134 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001135 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001136
1137" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001138 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001139" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001140 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001141 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001142" call Dret("NetBrowse : symlink")
1143 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001145 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001146 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001147" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001148
1149 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 " "this is a directory" indicator (/). There shouldn't be one of those,
1151 " anyway.
1152 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001153" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001154
1155 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001156 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001157" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001158 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001159 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001160 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001161 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001162 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001163
1164 setlocal nonu nomod noma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001165
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001166" call Dret("NetBrowse : file<".fname.">")
1167 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001168 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001169
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001170 " ---------------------------------------------------------------------
1171 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001172" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 " set up new buffer and map
1174 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001175 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001176" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001177 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001178 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001179" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001180 exe "b ".bufnamenr
1181 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001182" call Dret("NetBrowse")
1183 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001184 endif
1185 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001186" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001187 enew!
1188 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001189
1190 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001191 setlocal bt=nofile bh=wipe nobl noswf
1192 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001193" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001194 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001195" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001196 setlocal bh=hide nobl nonu
1197
1198 " save current directory on directory history list
1199 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001200
1201 " set up buffer-local mappings
1202" call Decho("set up buffer-local mappings")
1203 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001204 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001205 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001206 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 +00001207 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1208 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1209 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1210 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001211 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001212 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1213 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>
1214 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>
1215 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001216 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1217 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001218 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001219 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1220 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 +00001221 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1222 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001224 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1225 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1226 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001227 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001228 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001229 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001230
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001231 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001232" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1233 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001234 keepjumps put ='\" Netrw Remote Directory Listing'
1235 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001236 let w:netrw_bannercnt = 7
1237 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001238 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001239 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001240 endif
1241
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001242 if g:netrw_sort_by =~ "^n"
1243 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001244 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001245 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001246 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1247 else
1248 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001250 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001251 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001252 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001253 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001254 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001255 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001256 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001257 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001258 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001259 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1260 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001261
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001262 " remote read the requested directory listing
1263 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1264 " Note that not all ftp servers honor the options for ls
1265 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001266 " use ftp to get remote file listing
1267" call Decho("use ftp to get remote file listing")
1268 call NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001269 keepjumps 1d
1270
1271 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001272 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001273" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001274 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001275
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001276 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001277 if g:netrw_ftp_browse_reject != ""
1278 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1279 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001280
1281 " if there's no ../ listed, then put ./ and ../ in
1282 let line1= line(".")
1283 keepjumps 1
1284 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1285 let line2= line(".")
1286 if line2 == 0
1287 keepjumps put='../'
1288 keepjumps put='./'
1289 endif
1290 exe "keepjumps ".line1
1291 keepjumps norm! 0
1292
1293 " more cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001294 exe 'keepjumps silent! '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1295 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1296 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001297 endif
1298
1299 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001300 " use ssh to get remote file listing
1301" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001302 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001303" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001304 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1305 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001306 " cleanup
1307 if g:netrw_ftp_browse_reject != ""
1308 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001309 endif
1310 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001311
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001312
1313 " set up syntax highlighting
1314 if has("syntax")
1315 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001316 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001317 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001318 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1319 " sometimes the laststatus highlight bleeds into the entire display.
1320 " Only seems to happen with remote browsing. Weird.
1321 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001322 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001323 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001324
1325 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001326 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001327 if g:netrw_hide && g:netrw_list_hide != ""
1328 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001329 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001330
Bram Moolenaar8299df92004-07-10 09:47:34 +00001331 if g:netrw_longlist
1332 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001333" call Decho("manipulate long listing")
1334
1335 if method == "ftp"
1336 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001337 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001338 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001339 keepjumps d
1340 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001341 " if there's no ../ listed, then put ./ and ../ in
1342 let line1= line(".")
1343 keepjumps 1
1344 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1345 let line2= line(".")
1346 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001347 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1348 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001349 endif
1350 exe "keepjumps ".line1
1351 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001352 endif
1353
Bram Moolenaar488c6512005-08-11 20:09:58 +00001354 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/ -> .*$//e'
1355 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1356 exe w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001357 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001358
Bram Moolenaar488c6512005-08-11 20:09:58 +00001359 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001360 if g:netrw_sort_by =~ "^n"
1361 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00001362 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00001363 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001364 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00001365 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001366 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00001367 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001368 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001369 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001370 endif
1371 if g:netrw_longlist
1372 " shorten the list to keep its width <= 80 characters
Bram Moolenaar488c6512005-08-11 20:09:58 +00001373 exe "keepjumps silent ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001374 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001375 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001376 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001377 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001378
1379 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001380
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001381" call Dret("NetBrowse")
1382 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001383endfun
1384
1385" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001386" NetBrowseChgDir: {{{2
1387fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001388" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389
1390 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001391 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001392
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001393 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001394 " handling a file
1395 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001396" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001397
1398 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001399 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001400" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001401 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001402 %d
1403
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001404 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001405 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001406 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001407
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001408 if trailer =~ '^\%(\.\./\)*$'
1409 " tack on a ../"
1410 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001411
1412 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001413 " strip off a directory name from dirname
1414 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001415 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001416" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001417
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001418 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001419 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001420 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001421" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001422 endif
1423
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001424" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001425 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001426endfun
1427
Bram Moolenaar843ee412004-06-30 16:16:41 +00001428" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001429" NetGetWord: it gets the directory named under the cursor
1430fun! <SID>NetGetWord()
1431" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001432 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001433 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001434 let curline= getline(".")
1435 if curline =~ '"\s*Sorted by\s'
1436 norm s
1437 let s:netrw_skipbrowse= 1
1438 echo 'Pressing "s" also works'
1439 elseif curline =~ '"\s*Sort sequence:'
1440 let s:netrw_skipbrowse= 1
1441 echo 'Press "S" to edit sorting sequence'
1442 elseif curline =~ '"\s*Quick Help:'
1443 norm ?
1444 let s:netrw_skipbrowse= 1
1445 echo 'Pressing "?" also works'
1446 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1447 norm a
1448 let s:netrw_skipbrowse= 1
1449 echo 'Pressing "a" also works'
1450 elseif line("$") > w:netrw_bannercnt
1451 exe w:netrw_bannercnt
1452 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001453 else
1454 let dirname= getline(".")
1455 if dirname =~ '\t'
1456 let dirname= substitute(dirname,'\t.*$','','e')
1457 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001458 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001459" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001460 return dirname
1461endfun
1462
1463" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001464" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001465fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001466" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1467" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001468
1469 " preparation for removing multiple files/directories
1470 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001471 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001472
1473 " remove multiple files and directories
1474 while ctr <= a:lastline
1475 exe ctr
1476
1477 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001478 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001479" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001480
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001481 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001482 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001483 if !all
1484 echohl Statement
1485 call inputsave()
1486 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1487 call inputrestore()
1488 echohl NONE
1489 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1490 if ok =~ 'a\%[ll]'
1491 let all= 1
1492 endif
1493 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001494
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001495 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001496 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001497 silent! keepjumps .,$d
1498 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1499 else
1500 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1501" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1502 let ret= system(netrw_rm_cmd)
1503" call Decho("returned=".ret." errcode=".v:shell_error)
1504 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001505 elseif ok =~ 'q\%[uit]'
1506 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001507 endif
1508
1509 else
1510 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001511 if !all
1512 call inputsave()
1513 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1514 call inputrestore()
1515 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1516 if ok =~ 'a\%[ll]'
1517 let all= 1
1518 endif
1519 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001520
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001521 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001522 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001523 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1524 else
1525 let rmfile = a:path.rmfile
1526 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1527" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1528 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001529" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001530
1531 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001532 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001533" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1534 let ret= system(netrw_rmf_cmd)
1535" call Decho("returned=".ret." errcode=".v:shell_error)
1536
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001537 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001538 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001539 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001540 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001541 endif
1542 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001543
1544 elseif ok =~ 'q\%[uit]'
1545 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001546 endif
1547 endif
1548
1549 let ctr= ctr + 1
1550 endwhile
1551
1552 " refresh the directory
1553 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001554" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001555 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1556 exe curline
1557
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001558" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001559endfun
1560
1561" ---------------------------------------------------------------------
1562" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001563fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001564" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001565
1566 " preparation for removing multiple files/directories
1567 let ctr = a:firstline
1568 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1569
1570 " attempt to rename files/directories
1571 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001572 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001573
1574 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001575 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001576" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001577
1578 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001579 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001580 call inputrestore()
1581
Bram Moolenaar488c6512005-08-11 20:09:58 +00001582 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001583 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1584 else
1585 let oldname= a:path.oldname
1586 let newname= a:path.newname
1587" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1588 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1589 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001590
1591 let ctr= ctr + 1
1592 endwhile
1593
1594 " refresh the directory
1595 let curline= line(".")
1596 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001597 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001598" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001599endfun
1600
1601" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001602" NetRefresh: {{{2
1603fun! <SID>NetRefresh(dirname)
1604" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1605 set ma
1606 %d
1607 call <SID>NetBrowse(dirname)
1608 redraw!
1609" call Dret("NetRefresh")
1610endfun
1611
1612" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001613" NetSplit: mode {{{2
1614" =0 : net and o
1615" =1 : net and v
1616" =2 : local and o
1617" =3 : local and v
1618fun! s:NetSplit(mode)
1619" call Dfunc("NetSplit(mode=".a:mode.")")
1620
1621 call s:SaveWinVars()
1622 if a:mode == 0
1623 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1624 call s:CopyWinVars()
1625 exe "norm! 0"
1626 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1627 elseif a:mode ==1
1628 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1629 call s:CopyWinVars()
1630 exe "norm! 0"
1631 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1632 elseif a:mode ==2
1633 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1634 call s:CopyWinVars()
1635 exe "norm! 0"
1636 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
1637 else
1638 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1639 call s:CopyWinVars()
1640 exe "norm! 0"
1641 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
1642 endif
1643
1644" call Dret("NetSplit")
1645endfun
1646
1647" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001648" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001649" files given their extension. Passes 0=local, 1=remote
1650fun! <SID>NetBrowseX(fname,remote)
1651" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001652
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001653 " set up the filename
1654 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001655 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001656 if has("win32") || has("win95") || has("win64") || has("win16")
1657 let exten= substitute(exten,'^.*$','\L&\E','')
1658 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001659 let fname= escape(a:fname,"%#")
1660" call Decho("fname<".fname."> after escape()")
1661
1662 if a:remote == 1
1663 " create a local copy
1664 let fname= tempname().".".exten
1665" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1666 exe "keepjumps silent bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001667 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001668 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001669 q
1670 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001671" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001672
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001673 " set up redirection
1674 if &srr =~ "%s"
1675 let redir= substitute(&srr,"%s","/dev/null"."")
1676 else
1677 let redir= &srr . "/dev/null"
1678 endif
1679" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001680
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001681 " execute the file handler
1682 if has("win32") || has("win64")
1683" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1684 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1685 let ret= v:shell_error
1686
1687 elseif has("unix") && executable("kfmclient")
1688" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1689 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1690 let ret= v:shell_error
1691
1692 elseif has("unix") && executable("gnome-open")
1693" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1694 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1695 let ret= v:shell_error
1696
1697 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1698" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001699 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001700 endif
1701 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001702
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001703 " cleanup: remove temporary file,
1704 " delete current buffer if success with handler,
1705 " return to prior buffer (directory listing)
1706 if a:remote == 1 && fname != a:fname
1707" call Decho("deleting temporary file<".fname.">")
1708 call delete(fname)
1709 endif
1710
1711 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001712 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001713 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001714 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001715 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001716
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001717" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001718endfun
1719
1720" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001721" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1722" This function assumes that a long listing will be received. Size, time,
1723" and reverse sorts will be requested of the server but not otherwise
1724" enforced here.
1725fun! NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001726" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001727
1728 " because WinXX ftp uses unix style input
1729 " curline is one more than the bannercnt in order to account
1730 " for the unwanted first blank line (doing a :put to an empty
1731 " buffer yields a blank first line)
1732 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001733 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001734 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001735 exe "silent! keepjumps ".curline.",$d"
1736
1737 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001738 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001739 " ftp + <.netrc>: Method #2
1740 if a:path != ""
1741 put ='cd '.a:path
1742 endif
1743 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001744" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001745 if exists("g:netrw_port") && g:netrw_port != ""
1746" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1747 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1748 else
1749" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1750 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1751 endif
1752
1753 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001754 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001755 " ftp + machine,id,passwd,filename: Method #3
1756 setlocal ff=unix
1757 if exists("g:netrw_port") && g:netrw_port != ""
1758 put ='open '.g:netrw_machine.' '.g:netrw_port
1759 else
1760 put ='open '.g:netrw_machine
1761 endif
1762
1763 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1764 put =g:netrw_uid
1765 put =g:netrw_passwd
1766 else
1767 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1768 endif
1769
1770 if a:path != ""
1771 put ='cd '.a:path
1772 endif
1773 exe "put ='".a:cmd."'"
1774
1775 " perform ftp:
1776 " -i : turns off interactive prompting from ftp
1777 " -n unix : DON'T use <.netrc>, even though it exists
1778 " -n win32: quit being obnoxious about password
1779" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1780 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1781
1782 ".........................................
1783 else
1784 echo "***warning*** unable to comply with your request<" . choice . ">"
1785 endif
1786
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001787 " cleanup for Windows
1788 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001789 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001790 endif
1791 if a:cmd == "dir"
1792 " infer directory/link based on the file permission string
Bram Moolenaar83bab712005-08-01 21:58:57 +00001793 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1794 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001795 if !g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00001796 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001797 endif
1798 endif
1799
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001800 " restore settings
1801 let &ff= ffkeep
1802" call Dret("NetBrowseFtpCmd")
1803endfun
1804
1805" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001806" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1807" separated patterns given in g:netrw_list_hide
1808fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001809" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001810
1811 let listhide= g:netrw_list_hide
1812 while listhide != ""
1813 if listhide =~ ','
1814 let hide = substitute(listhide,',.*$','','e')
1815 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1816 else
1817 let hide = listhide
1818 let listhide= ""
1819 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001820
1821 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001822" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001823 if g:netrw_hide == 1
Bram Moolenaar488c6512005-08-11 20:09:58 +00001824 exe 'keepjumps silent '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001825 elseif g:netrw_hide == 2
Bram Moolenaar488c6512005-08-11 20:09:58 +00001826 exe 'keepjumps silent '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001827 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001828 endwhile
1829
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001830" call Dret("NetrwListHide")
1831endfun
1832
1833" ---------------------------------------------------------------------
1834" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001835fun! <SID>NetHideEdit(mode)
1836" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001837
1838 call inputsave()
1839 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1840 call inputrestore()
1841
1842 " refresh the listing
1843 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001844 if a:mode == 0
1845 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1846 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001847 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001848 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001849
1850" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001851endfun
1852
Bram Moolenaar8299df92004-07-10 09:47:34 +00001853" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001854" NetSortSequence: allows user to edit the sorting sequence
1855fun! <SID>NetSortSequence(mode)
1856" call Dfunc("NetSortSequence(mode=".a:mode.")")
1857
1858 call inputsave()
1859 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1860 call inputrestore()
1861
1862 " refresh the listing
1863 let g:netrw_sort_sequence= newsortseq
1864 if a:mode == 0
1865 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1866 else
1867 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1868 endif
1869
1870" call Dret("NetSortSequence")
1871endfun
1872
1873" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001874" NetLongList: {{{2
1875fun! <SID>NetLongList(mode)
1876" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001877 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001878
1879 if g:netrw_longlist != 0
1880 " turn long listing off
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001881" call Decho("turn long listing off")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001882 let g:netrw_longlist = 0
1883 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1884
1885 else
1886 " turn long listing on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001887" call Decho("turn long listing on")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001888 let g:netrw_longlist = 1
1889 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1890 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001891 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001892
1893 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001894 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001895
1896 " refresh the listing
1897 if a:mode == 0
1898 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1899 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001900 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001901 endif
1902
Bram Moolenaar488c6512005-08-11 20:09:58 +00001903 call s:NetRestorePosn()
1904
Bram Moolenaar8299df92004-07-10 09:47:34 +00001905" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1906endfun
1907
1908" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001909" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001910" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1911" the same word even though the sorting has changed its order of appearance.
1912fun! s:NetSaveWordPosn()
1913" call Dfunc("NetSaveWordPosn()")
1914 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1915" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1916endfun
1917
1918" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001919" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001920fun! s:NetRestoreWordPosn()
1921" call Dfunc("NetRestoreWordPosn()")
1922 silent! call search(s:netrw_saveword,'w')
1923" call Dret("NetRestoreWordPosn")
1924endfun
1925
1926" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001927" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001928fun! <SID>NetMakeDir(usrhost)
1929" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1930
1931 " get name of new directory from user. A bare <CR> will skip.
1932 " if its currently a directory, also request will be skipped, but with
1933 " a message.
1934 call inputsave()
1935 let newdirname= input("Please give directory name: ")
1936 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001937" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001938
1939 if newdirname == ""
1940" call Dret("NetMakeDir : user aborted with bare <cr>")
1941 return
1942 endif
1943
1944 if a:usrhost == ""
1945
1946 " Local mkdir:
1947 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001948 let fullnewdir= b:netrw_curdir.'/'.newdirname
1949" call Decho("fullnewdir<".fullnewdir.">")
1950 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001951 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001952 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001953 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001954 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001955" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1956 return
1957 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001958 if filereadable(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 file!" | 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 : file<".newdirname."> exists previously")
1964 return
1965 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001966
1967 " requested new local directory is neither a pre-existing file or
1968 " directory, so make it!
1969 if exists("*mkdir")
1970 call mkdir(fullnewdir,"p")
1971 else
1972 let netrw_origdir= s:NetGetcwd(1)
1973 exe 'cd '.b:netrw_curdir
1974" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1975" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1976 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001977 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001978 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001979
Bram Moolenaar8299df92004-07-10 09:47:34 +00001980 if v:shell_error == 0
1981 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001982" call Decho("refresh listing")
1983 let linenum= line(".")
1984 norm! H0
1985 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001986 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001987 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1988 exe "norm! ".hline."G0z\<CR>"
1989 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001990 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001991 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001992 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001993 endif
1994 redraw!
1995
1996 else
1997 " Remote mkdir:
1998 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001999 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002000" call Decho("exe silent! !".mkdircmd." ".newdirname)
2001 exe "silent! !".mkdircmd." ".newdirname
2002 if v:shell_error == 0
2003 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002004 let linenum= line(".")
2005 norm! H0
2006 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002007 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002008 exe "norm! ".hline."G0z\<CR>"
2009 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002010 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002011 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002012 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002013 endif
2014 redraw!
2015 endif
2016
2017" call Dret("NetMakeDir")
2018endfun
2019
2020" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002021" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002022" 0: (user: <b>) bookmark current directory
2023" 1: (user: <B>) change to the bookmarked directory
2024" 2: (user: <q>) list bookmarks
2025" 3: (LocalBrowse) record current directory history
2026" 4: (user: <u>) go up (previous) bookmark
2027" 5: (user: <U>) go down (next) bookmark
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002028fun! <SID>NetBookmarkDir(chg,curdir)
2029" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002030 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2031 " looks like a "b" was pressed while in the banner region
2032 if line("$") > w:netrw_bannercnt
2033 exe w:netrw_bannercnt
2034 endif
2035 echo ""
2036" call Dret("NetBookmarkDir - ignoring")
2037 return
2038 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002039
2040 if a:chg == 0
2041 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002042 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2043 if !exists("g:NETRW_BOOKMARKMAX")
2044 let g:NETRW_BOOKMARKMAX= v:count
2045 elseif v:count > g:NETRW_BOOKMARKMAX
2046 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002047 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002048 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002049
2050 elseif a:chg == 1
2051 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002052 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2053 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002054 else
2055 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2056 endif
2057
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002058 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002059 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002060 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002061" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2062 let cnt= 0
2063 while cnt <= g:NETRW_BOOKMARKMAX
2064 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2065" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2066 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2067 endif
2068 let cnt= cnt + 1
2069 endwhile
2070 endif
2071
2072 " list directory history
2073 let cnt = g:NETRW_DIRHIST_CNT
2074 let first = 1
2075 let histcnt = 0
2076 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2077" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2078 let histcnt= histcnt + 1
2079 if exists("g:NETRW_DIRHIST_{cnt}")
2080" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2081 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002082 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002083 let first = 0
2084 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2085 if cnt < 0
2086 let cnt= cnt + g:netrw_dirhistmax
2087 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002088 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002089
2090 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002091 " saves most recently visited directories (when they differ)
2092 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2093 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2094 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2095" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2096 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002097
2098 elseif a:chg == 4
2099 " u: change to the previous directory stored on the history list
2100 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2101 if g:NETRW_DIRHIST_CNT < 0
2102 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2103 endif
2104 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2105" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2106 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2107 else
2108 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2109 echo "Sorry, no predecessor directory exists yet"
2110 endif
2111
2112 elseif a:chg == 5
2113 " U: change to the subsequent directory stored on the history list
2114 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2115 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2116" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2117 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2118 else
2119 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2120 if g:NETRW_DIRHIST_CNT < 0
2121 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2122 endif
2123 echo "Sorry, no successor directory exists yet"
2124 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002125 endif
2126" call Dret("NetBookmarkDir")
2127endfun
2128
Bram Moolenaar83bab712005-08-01 21:58:57 +00002129" ==========================================
2130" Local Directory Browsing Support: {{{1
2131" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002132
2133" ---------------------------------------------------------------------
2134" LocalBrowse: supports local file/directory browsing {{{2
2135fun! <SID>LocalBrowse(dirname)
2136
2137" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
2138 if !isdirectory(a:dirname)
2139 " not a directory, ignore it
2140 return
2141 endif
2142
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002143 " unfortunate interaction -- when putting debugging calls
2144 " above one can no longer enter the DBG buffer.
Bram Moolenaar572cb562005-08-05 21:35:02 +00002145" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002146" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002147
Bram Moolenaar488c6512005-08-11 20:09:58 +00002148 if exists("s:netrw_skipbrowse")
2149 unlet s:netrw_skipbrowse
2150" call Dret("NetBrowse")
2151 return
2152 endif
2153
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002154 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002155 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002156 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002157 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002158 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002159" call Dret("LocalBrowse : vim version<".v:version."> too old")
2160 return
2161 endif
2162
Bram Moolenaar83bab712005-08-01 21:58:57 +00002163 " record autochdir setting and then insure its unset (tnx to David Fishburn)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002164 if has("netbeans_intg") || has("sun_workshop")
2165 let keep_autochdir= &autochdir
2166 set noautochdir
2167 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002168
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002169 " find buffer number of buffer named precisely the same as a:dirname
2170 let bufnum= bufnr(a:dirname)
2171" call Decho("findbuf: bufnum=".bufnum)
2172 if bufnum > 0 && bufname(bufnum) != a:dirname
2173 let ibuf= 1
2174 let buflast= bufnr("$")
2175 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2176" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2177 let ibuf= ibuf + 1
2178 endwhile
2179 if ibuf > buflast
2180 let bufnum= -1
2181 else
2182 let bufnum= ibuf
2183 endif
2184" call Decho("findbuf: bufnum=".bufnum." (final)")
2185 endif
2186
2187 " get cleared buffer
2188 if bufnum < 0
2189 if v:version < 700
2190 enew!
2191 else
2192 keepalt enew!
2193 endif
2194" call Decho("enew buffer")
2195 else
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002196 if v:version < 700
2197 exe "b ".bufnum
2198 else
2199 exe "keepalt b ".bufnum
2200 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002201 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2202 if getline(2) =~ '^" Directory Listing '
2203 if !g:netrw_keepdir
2204" call Decho("change directory: cd ".b:netrw_curdir)
2205 exe 'cd '.b:netrw_curdir
2206 endif
2207" call Dret("LocalBrowse : reusing buffer#".bufnum."<".a:dirname.">")
2208 return
2209 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002210 endif
2211 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002212 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002213
2214 " get the new directory name
Bram Moolenaar83bab712005-08-01 21:58:57 +00002215 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2216 if b:netrw_curdir =~ '[/\\]$'
2217 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2218 endif
2219" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002220
Bram Moolenaar83bab712005-08-01 21:58:57 +00002221 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002222 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002223" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002224 try
2225 exe 'cd '.b:netrw_curdir
2226 catch /^Vim\%((\a\+)\)\=:E472/
2227 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2228 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2229 if exists("w:netrw_prvdir")
2230 let b:netrw_curdir= w:netrw_prvdir
2231 else
2232" call Dret("LocalBrowse : reusing buffer#".bufnum."<".a:dirname.">")
2233 return
2234 endif
2235 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002236 endif
2237
2238 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002239 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002240
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002241 " make this buffer modifiable and hidden
2242 setlocal ma hidden nonu
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002243 if v:version < 700
2244 silent! %d
2245 else
2246 keepalt silent! %d
2247 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002248
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002249 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002250 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002251
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002252 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002253 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002254
Bram Moolenaar8299df92004-07-10 09:47:34 +00002255 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002256" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002257 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 +00002258 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 +00002259 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002260 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 +00002261 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2262 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2263 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2264 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2265 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002266 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002267 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002268 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 +00002269 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2270 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>
2271 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>
2272 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002273 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2274 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002275 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002276 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 +00002277 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2278 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2279 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002280 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2281 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2282 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2283 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2284 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2285 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002286 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002287 nnoremap <buffer> ? :he netrw-dir<cr>
2288
2289 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002290" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002291 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002292 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002293 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002294 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002295 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002296
2297 let sortby= g:netrw_sort_by
2298 if g:netrw_sort_direction =~ "^r"
2299 let sortby= sortby." reversed"
2300 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002301
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002302 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002303 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002304" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002305 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002306 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002307 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002308 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002309 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002310" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002311 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002312 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002313 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002314 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002315
2316 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002317 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002318 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002319 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002320 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002321 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002322 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002323 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002324 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002325 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2326 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002327 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002328
2329 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002330 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2331" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002332
2333 " generate the requested directory listing
Bram Moolenaar83bab712005-08-01 21:58:57 +00002334 call LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002335
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002336 " set up syntax highlighting
2337 if has("syntax")
2338 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002339 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002340 setlocal ft=
2341 endif
2342 endif
2343
Bram Moolenaar8299df92004-07-10 09:47:34 +00002344 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002345 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002346 if g:netrw_hide && g:netrw_list_hide != ""
2347 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002348 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002349 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002350
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002351 if g:netrw_sort_by =~ "^n"
2352 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002353
Bram Moolenaar83bab712005-08-01 21:58:57 +00002354 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00002355 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002356 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002357 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002358 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002359 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002360 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002361 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002362
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002363 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002364 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00002365 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002366 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002367 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002368 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002369 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002370 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002371 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002372 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002373
Bram Moolenaar8299df92004-07-10 09:47:34 +00002374 endif
2375 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002376 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
2377 exe w:netrw_bannercnt
2378 endif
2379
2380 " record previous current directory
2381 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002382
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002383 setlocal noma nomod nonu bh=hide nobl
2384 if has("netbeans_intg") || has("sun_workshop")
2385 let &autochdir= keep_autochdir
2386 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002387
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002388" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002389endfun
2390
2391" ---------------------------------------------------------------------
2392" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00002393fun! LocalBrowseList()
2394" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002395
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002396 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002397 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2398 let dirnamelen = strlen(b:netrw_curdir)
2399 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002400" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002401 if filelist != ""
2402 let filelist= filelist."\n"
2403 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002404 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002405" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2406
2407 " if the directory name includes a "$", and possibly other characters,
2408 " the glob() doesn't include "." and ".." entries.
2409 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2410" call Decho("forcibly tacking on .")
2411 if filelist == ""
2412 let filelist= dirname."."
2413 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002414 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002415 endif
2416" call Decho("filelist<".filelist.">")
2417 endif
2418 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2419" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002420 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002421" call Decho("filelist<".filelist.">")
2422 endif
2423 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2424
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002425" call Decho("dirname<".dirname.">")
2426" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002427" call Decho("filelist<".filelist.">")
2428
2429 while filelist != ""
2430 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002431 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002432 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2433 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002434 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002435 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002436 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002437 let pfile= filename
2438 if isdirectory(filename)
2439 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002440 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002441 if pfile =~ '//$'
2442 let pfile= substitute(pfile,'//$','/','e')
2443 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002444 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002445 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002446" call Decho(" ")
2447" call Decho("filename<".filename.">")
2448" call Decho("pfile <".pfile.">")
2449
Bram Moolenaar8299df92004-07-10 09:47:34 +00002450 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002451 let sz = getfsize(filename)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002452 if v:version <= 700
2453 let fsz = strpart(" ",1,15-strlen(sz)).sz
2454 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2455 else
2456 let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
2457 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002458" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002459 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002460
Bram Moolenaar8299df92004-07-10 09:47:34 +00002461 if g:netrw_sort_by =~ "^t"
2462 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002463" call Decho("getftime(".filename.")=".getftime(filename))
2464 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002465 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002466" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002467 let ftpfile= ft.'/'.pfile
2468 keepjumps put=ftpfile
2469
Bram Moolenaar8299df92004-07-10 09:47:34 +00002470 elseif g:netrw_sort_by =~ "^s"
2471 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002472" call Decho("getfsize(".filename.")=".getfsize(filename))
2473 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002474 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002475" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002476 let fszpfile= fsz.'/'.pfile
2477 keepjumps put =fszpfile
2478
Bram Moolenaar8299df92004-07-10 09:47:34 +00002479 else
2480 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002481" call Decho("exe keepjumps put ='".pfile."'")
2482 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002483 endif
2484 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002485 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002486
2487" call Dret("LocalBrowseList")
2488endfun
2489
2490" ---------------------------------------------------------------------
2491" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2492" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002493fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2494" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002495
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002496 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002497 let newdir = a:newdir
2498
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002499 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002500 " apparently vim is "recognizing" that it is in the home directory and
2501 " is removing the "/". Bad idea, so I have to put it back.
2502 let dirname= dirname.'/'
2503" call Decho("adjusting dirname<".dirname.">")
2504 endif
2505
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002506 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002507 " handling a file
2508 let dirname= dirname.newdir
2509" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002510 " this lets NetBrowseX avoid the edit
2511 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002512" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2513" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2514 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002515 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002516
2517 elseif newdir == './'
2518 " refresh the directory list
2519" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002520
2521 elseif newdir == '../'
2522 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002523 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002524" call Decho("go up one dir: dirname<".dirname.">")
2525
2526 else
2527 " go down one directory
2528 let dirname= dirname.newdir
2529" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2530 endif
2531
2532" call Dret("LocalBrowseChgDir <".dirname.">")
2533 return dirname
2534endfun
2535
2536" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002537" LocalBrowseRm: {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002538fun! <SID>LocalBrowseRm(path) range
2539" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2540" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2541
2542 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002543 let ctr = a:firstline
2544 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002545 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002546
2547 " remove multiple files and directories
2548 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002549 exe "keepjumps ".ctr
2550
2551 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002552 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002553 let ctr= ctr + 1
2554 continue
2555 endif
2556 let curword= s:NetGetWord()
2557 if curword == "./" || curword == "../"
2558 let ctr= ctr + 1
2559 continue
2560 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002561
2562 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002563 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002564" call Decho("rmfile<".rmfile.">")
2565
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002566 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002567 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002568 if !all
2569 echohl Statement
2570 call inputsave()
2571 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2572 call inputrestore()
2573 echohl NONE
2574 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2575 if ok =~ 'a\%[ll]'
2576 let all= 1
2577 endif
2578 endif
2579
2580 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002581 let ret= delete(rmfile)
2582" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002583 elseif ok =~ 'q\%[uit]'
2584 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002585 endif
2586
2587 else
2588 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002589 if !all
2590 echohl Statement
2591 call inputsave()
2592 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2593 call inputrestore()
2594 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2595 if ok =~ 'a\%[ll]'
2596 let all= 1
2597 endif
2598 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002599 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002600
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002601 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002602" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2603 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002604" call Decho("v:shell_error=".v:shell_error)
2605
2606 if v:shell_error != 0
2607" call Decho("2nd attempt to remove directory<".rmfile.">")
2608 let errcode= delete(rmfile)
2609" call Decho("errcode=".errcode)
2610
2611 if errcode != 0
2612 if has("unix")
2613" call Decho("3rd attempt to remove directory<".rmfile.">")
2614 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002615 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002616 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002617 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002618 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002619 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002620 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002621 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002622 endif
2623 endif
2624 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002625
2626 elseif ok =~ 'q\%[uit]'
2627 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002628 endif
2629 endif
2630
2631 let ctr= ctr + 1
2632 endwhile
2633
2634 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002635 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002636" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002637 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002638 exe curline
2639
2640" call Dret("LocalBrowseRm")
2641endfun
2642
2643" ---------------------------------------------------------------------
2644" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002645fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002646" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2647
2648 " preparation for removing multiple files/directories
2649 let ctr= a:firstline
2650
2651 " attempt to rename files/directories
2652 while ctr <= a:lastline
2653 exe "keepjumps ".ctr
2654
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002655 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002656 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002657 let ctr= ctr + 1
2658 continue
2659 endif
2660 let curword= s:NetGetWord()
2661 if curword == "./" || curword == "../"
2662 let ctr= ctr + 1
2663 continue
2664 endif
2665
Bram Moolenaar8299df92004-07-10 09:47:34 +00002666 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002667 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002668" call Decho("oldname<".oldname.">")
2669
2670 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002671 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002672 call inputrestore()
2673
Bram Moolenaar83bab712005-08-01 21:58:57 +00002674 let ret= rename(oldname,newname)
2675" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002676
2677 let ctr= ctr + 1
2678 endwhile
2679
2680 " refresh the directory
2681 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002682" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002683 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002684 exe "keepjumps ".curline
2685" call Dret("LocalBrowseRename")
2686endfun
2687
2688" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002689" LocalPreview: {{{2
2690fun! <SID>LocalPreview(path) range
2691" call Dfunc("LocalPreview(path<".a:path.">)")
2692 if has("quickfix")
2693 if !isdirectory(a:path)
2694 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002695 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002696 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002697 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002698 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002699 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002700 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002701 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002702 endif
2703" call Dret("LocalPreview")
2704endfun
2705
2706" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002707" LocalRefresh: {{{2
2708fun! <SID>LocalRefresh(dirname)
2709" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2710 set ma
2711 %d
2712 call <SID>LocalBrowse(a:dirname)
2713 redraw!
2714" call Dret("LocalRefresh")
2715endfun
2716
2717" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002718" Explore: launch the local browser in the directory of the current file {{{2
2719" dosplit==0: the window will be split iff the current file has
2720" been modified
2721" dosplit==1: the window will be split before running the local
2722" browser
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002723fun! s:Explore(indx,dosplit,style,...)
2724" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002725
2726 " if dosplit or file has been modified
2727 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00002728 call <SID>SaveWinVars()
2729
Bram Moolenaar83bab712005-08-01 21:58:57 +00002730 if a:style == 0 " Explore, Sexplore
2731 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002732" call Decho("style=0: Explore or Sexplore")
2733
Bram Moolenaar83bab712005-08-01 21:58:57 +00002734 elseif a:style == 1 "Explore!, Sexplore!
2735 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002736" call Decho("style=1: Explore! or Sexplore!")
2737
Bram Moolenaar83bab712005-08-01 21:58:57 +00002738 elseif a:style == 2 " Hexplore
2739 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002740" call Decho("style=2: Hexplore")
2741
Bram Moolenaar83bab712005-08-01 21:58:57 +00002742 elseif a:style == 3 " Hexplore!
2743 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002744" call Decho("style=3: Hexplore!")
2745
Bram Moolenaar83bab712005-08-01 21:58:57 +00002746 elseif a:style == 4 " Vexplore
2747 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002748" call Decho("style=4: Vexplore")
2749
Bram Moolenaar83bab712005-08-01 21:58:57 +00002750 elseif a:style == 5 " Vexplore!
2751 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002752" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002753 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002754 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002755 endif
2756 norm! 0
2757
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002758 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002759 " Explore Hexplore Vexplore Sexplore
2760 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
2761 if newdir =~ '^scp:' || newdir =~ '^ftp:'
2762" call Decho("calling NetBrowse(newdir<".newdir.">)")
2763 call s:NetBrowse(newdir)
2764 else
2765" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2766 call s:LocalBrowse(newdir)
2767 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002768
Bram Moolenaar572cb562005-08-05 21:35:02 +00002769 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002770 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002771
Bram Moolenaar488c6512005-08-11 20:09:58 +00002772 if has("path_extra") && v:version >= 700
2773 if !exists("w:netrw_explore_indx")
2774 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002775 endif
2776 let indx = a:indx
2777 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00002778 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002779 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00002780 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002781 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002782 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002783 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002784 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002785 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002786 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
2787 let w:netrw_explore_listlen = len(w:netrw_explore_list)
2788 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00002789 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
2790 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2791" call Dret("Explore")
2792 return
2793 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002794 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002795
2796 " NetrwStatusLine support
Bram Moolenaar488c6512005-08-11 20:09:58 +00002797 let w:netrw_explore_indx= indx
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002798 if !exists("s:netrw_explore_stl")
2799 let s:netrw_explore_stl= &stl
2800 endif
2801 set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
Bram Moolenaar488c6512005-08-11 20:09:58 +00002802" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002803
2804 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00002805 if indx >= w:netrw_explore_listlen || indx < 0
2806 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00002807 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002808 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2809" call Dret("Explore")
2810 return
2811 endif
2812
Bram Moolenaar488c6512005-08-11 20:09:58 +00002813 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002814" call Decho("dirfile<".dirfile."> indx=".indx)
2815 let newdir= substitute(dirfile,'/[^/]*$','','e')
2816" call Decho("newdir<".newdir.">")
2817" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2818 call s:LocalBrowse(newdir)
2819 call search(substitute(dirfile,"^.*/","",""),"W")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002820 let w:netrw_explore_mtchcnt = indx + 1
2821 let w:netrw_explore_bufnr = bufnr(".")
2822 let w:netrw_explore_line = line(".")
2823" 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 +00002824
2825 else
2826 if v:version < 700
Bram Moolenaar572cb562005-08-05 21:35:02 +00002827 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for Exploring with **!" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002828 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002829 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 +00002830 endif
2831 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2832 endif
2833
Bram Moolenaar83bab712005-08-01 21:58:57 +00002834 else
2835 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002836" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2837 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002838 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002839
2840" call Dret("Explore")
2841endfun
2842
2843" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002844" NetrwStatusLine: {{{2
2845fun! NetrwStatusLine()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002846" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr(".")." Xline#".w:netrw_explore_line." line#".line(".")
2847 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 +00002848 let &stl= s:netrw_explore_stl
Bram Moolenaar488c6512005-08-11 20:09:58 +00002849 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
2850 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002851 return ""
2852 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002853 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002854 endif
2855endfun
2856
2857" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002858" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002859" Change backslashes to forward slashes, if any.
2860" If doesc is true, escape certain troublesome characters
2861fun! <SID>NetGetcwd(doesc)
2862" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2863 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002864 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002865 let curdir= curdir.'/'
2866 endif
2867 if a:doesc
2868 let curdir= escape(curdir,s:netrw_cd_escape)
2869 endif
2870" call Dret("NetGetcwd <".curdir.">")
2871 return curdir
2872endfun
2873
2874" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002875" NetMethod: determine method of transfer {{{1
2876" method == 1: rcp
2877" 2: ftp + <.netrc>
2878" 3: ftp + machine, id, password, and [path]filename
2879" 4: scp
2880" 5: http (wget)
2881" 6: cadaver
2882" 7: rsync
2883" 8: fetch
2884" 9: sftp
2885fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002886" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002887
2888 " initialization
2889 let b:netrw_method = 0
2890 let g:netrw_machine = ""
2891 let b:netrw_fname = ""
2892 let g:netrw_port = ""
2893
2894 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002895 " mipf : a:machine a:id password filename Use ftp
2896 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002897 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002898 " rcpurm : rcp://[user@]host/filename Use rcp
2899 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002900 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002901 " httpurm : http://[user@]host/filename Use wget
2902 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002903 " rsyncurm : rsync://host[:port]/path Use rsync
2904 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2905 " sftpurm : sftp://[user@]host/filename Use scp
2906 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2907 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2908 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002909 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002910 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2911 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2912 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002913 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002914 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2915 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2916 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2917
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002918" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002919 " Determine Method
2920 " rcp://user@hostname/...path-to-file
2921 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002922" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002923 let b:netrw_method = 1
2924 let userid = substitute(a:choice,rcpurm,'\1',"")
2925 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2926 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002927 if userid != ""
2928 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002929 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002930
2931 " scp://user@hostname/...path-to-file
2932 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002933" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002934 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002935 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2936 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2937 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002938
2939 " http://user@hostname/...path-to-file
2940 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002941" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002942 let b:netrw_method = 5
2943 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2944 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2945
2946 " dav://hostname[:port]/..path-to-file..
2947 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002948" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002949 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002950 if a:choice =~ '^s'
2951 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2952 else
2953 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2954 endif
2955 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002956
2957 " rsync://user@hostname/...path-to-file
2958 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002959" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002960 let b:netrw_method = 7
2961 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2962 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2963
2964 " ftp://[user@]hostname[[:#]port]/...path-to-file
2965 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002966" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002967 let userid = substitute(a:choice,ftpurm,'\2',"")
2968 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2969 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2970 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002971 if userid != ""
2972 let g:netrw_uid= userid
2973 endif
2974 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2975 let b:netrw_method = 3
2976 else
2977 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2978 let b:netrw_method= 2
2979 else
2980 if !exists("g:netrw_uid") || g:netrw_uid == ""
2981 call NetUserPass()
2982 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2983 call NetUserPass(g:netrw_uid)
2984 " else just use current g:netrw_uid and g:netrw_passwd
2985 endif
2986 let b:netrw_method= 3
2987 endif
2988 endif
2989
2990 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002991" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002992 let b:netrw_method = 8
2993 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2994 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2995 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2996 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2997
2998 " Issue an ftp : "machine id password [path/]filename"
2999 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003000" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003001 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003002 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3003 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3004 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3005 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3006
3007 " Issue an ftp: "hostname [path/]filename"
3008 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003009" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003010 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3011 let b:netrw_method = 3
3012 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3013 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3014
3015 elseif filereadable(expand("$HOME/.netrc"))
3016 let b:netrw_method = 2
3017 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3018 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3019 endif
3020
3021 " sftp://user@hostname/...path-to-file
3022 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003023" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003024 let b:netrw_method = 9
3025 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3026 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3027
3028 " Issue an rcp: hostname:filename" (this one should be last)
3029 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003030" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003031 let b:netrw_method = 1
3032 let userid = substitute(a:choice,rcphf,'\2',"")
3033 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3034 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003035" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3036" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3037" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3038" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003039 if userid != ""
3040 let g:netrw_uid= userid
3041 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003042 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003043 " don't let PCs try <.netrc>
3044 let b:netrw_method = 3
3045 endif
3046
3047 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003048 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003049 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003050 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003051 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003052 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003053 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003054
3055 " remove any leading [:#] from port number
3056 if g:netrw_port != ""
3057 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3058 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003059
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003060" call Decho("a:choice <".a:choice.">")
3061" call Decho("b:netrw_method <".b:netrw_method.">")
3062" call Decho("g:netrw_machine<".g:netrw_machine.">")
3063" call Decho("g:netrw_port <".g:netrw_port.">")
3064" if exists("g:netrw_uid") "Decho
3065" call Decho("g:netrw_uid <".g:netrw_uid.">")
3066" endif "Decho
3067" if exists("g:netrw_passwd") "Decho
3068" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3069" endif "Decho
3070" call Decho("b:netrw_fname <".b:netrw_fname.">")
3071" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003072endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003073
3074" ------------------------------------------------------------------------
3075" NetUserPass: set username and password for subsequent ftp transfer {{{1
3076" Usage: :call NetUserPass() -- will prompt for userid and password
3077" :call NetUserPass("uid") -- will prompt for password
3078" :call NetUserPass("uid","password") -- sets global userid and password
3079fun! NetUserPass(...)
3080
3081 " get/set userid
3082 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003083" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003084 if !exists("g:netrw_uid") || g:netrw_uid == ""
3085 " via prompt
3086 let g:netrw_uid= input('Enter username: ')
3087 endif
3088 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003089" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003090 let g:netrw_uid= a:1
3091 endif
3092
3093 " get password
3094 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003095" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003096 let g:netrw_passwd= inputsecret("Enter Password: ")
3097 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003098" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003099 let g:netrw_passwd=a:2
3100 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003101" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003102endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003103
3104" ------------------------------------------------------------------------
3105" NetOptionSave: save options and set to "standard" form {{{1
3106fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003107" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003108
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003109 " Get Temporary Filename
3110 let s:aikeep = &ai
3111 let s:cinkeep = &cin
3112 let s:cinokeep = &cino
3113 let s:comkeep = &com
3114 let s:cpokeep = &cpo
3115 let s:dirkeep = getcwd()
3116 let s:gdkeep = &gd
3117 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003118 setlocal cino =
3119 setlocal com =
3120 setlocal cpo -=aA
3121 setlocal nocin noai
3122 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003123 if has("win32") && !has("win95")
3124 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003125 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003126" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003127 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003128
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003129" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003130endfun
3131
3132" ------------------------------------------------------------------------
3133" NetOptionRestore: restore options {{{1
3134fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003135" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003136
3137 let &ai = s:aikeep
3138 let &cin = s:cinkeep
3139 let &cino = s:cinokeep
3140 let &com = s:comkeep
3141 let &cpo = s:cpokeep
3142 exe "lcd ".s:dirkeep
3143 let &gd = s:gdkeep
3144 let &tw = s:twkeep
3145 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003146 if &directory == ""
3147 " user hasn't specified a swapfile directory;
3148 " netrw will temporarily make the swapfile
3149 " directory the current local one.
3150 let &directory = getcwd()
3151 silent! let &swf = s:swfkeep
3152 set directory=
3153 else
3154 let &swf= s:swfkeep
3155 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003156 unlet s:swfkeep
3157 endif
3158 unlet s:aikeep
3159 unlet s:cinkeep
3160 unlet s:cinokeep
3161 unlet s:comkeep
3162 unlet s:cpokeep
3163 unlet s:gdkeep
3164 unlet s:twkeep
3165 unlet s:dirkeep
3166
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003167" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003168endfun
3169
3170" ------------------------------------------------------------------------
3171" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003172" to handle extra junk that their system's ftp dumps
3173" into the transfer. This function is provided as an
3174" example and as a fix for a Windows 95 problem: in my
3175" experience, win95's ftp always dumped four blank lines
3176" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003177if has("win95") && g:netrw_win95ftp
3178 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003179" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003180 if method == 3 " ftp (no <.netrc>)
3181 let fourblanklines= line2 - 3
3182 silent fourblanklines.",".line2."g/^\s*/d"
3183 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003184" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003185 endfun
3186endif
3187
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003188" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003189" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003190if v:version < 700
3191 fun! <SID>NetSort() range
3192" " call Dfunc("NetSort()")
3193
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003194 let i = a:firstline + 1
3195 while i <= a:lastline
3196 " find insertion point via binary search
3197 let i_val = getline(i)
3198 let lo = a:firstline
3199 let hi = i
3200 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003201 let mid = (lo + hi) / 2
3202 let mid_val = getline(mid)
3203 if g:netrw_sort_direction =~ '^n'
3204 " normal sorting order
3205 if i_val < mid_val
3206 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003207 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003208 let lo = mid + 1
3209 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003210 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003211 else
3212 " reverse sorting order
3213 if i_val > mid_val
3214 let hi = mid
3215 else
3216 let lo = mid + 1
3217 if i_val == mid_val | break | endif
3218 endif
3219 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003220 endwhile
3221 " do insert
3222 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003223 exe 'keepjumps '.i.'d_'
3224 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003225 endif
3226 let i = i + 1
3227 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003228
3229" " call Dret("NetSort")
3230 endfun
3231endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003232
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003233" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003234" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3235" What this function does is to compute a priority for the patterns
3236" in the g:netrw_sort_sequence. It applies a substitute to any
3237" "files" that satisfy each pattern, putting the priority / in
3238" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003239fun! <SID>SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003240" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003241 if g:netrw_longlist
3242 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3243 else
3244 let seqlist = g:netrw_sort_sequence
3245 endif
3246 " sanity check -- insure that * appears somewhere
3247 if seqlist == ""
3248 let seqlist= '*'
3249 elseif seqlist !~ '\*'
3250 let seqlist= seqlist.',*'
3251 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003252 let priority = 1
3253 while seqlist != ""
3254 if seqlist =~ ','
3255 let seq = substitute(seqlist,',.*$','','e')
3256 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3257 else
3258 let seq = seqlist
3259 let seqlist = ""
3260 endif
3261 let eseq= escape(seq,'/')
3262 if priority < 10
3263 let spriority= "00".priority.'\/'
3264 elseif priority < 100
3265 let spriority= "0".priority.'\/'
3266 else
3267 let spriority= priority.'\/'
3268 endif
3269" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3270
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003271 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003272 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003273 " apparently no files were left after a Hiding pattern was used
3274" call Dret("SetSort : no files left after hiding")
3275 return
3276 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003277 if seq == '*'
Bram Moolenaar488c6512005-08-11 20:09:58 +00003278 exe 'keepjumps silent '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003279 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003280 exe 'keepjumps silent '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003281 endif
3282 let priority = priority + 1
3283 endwhile
3284
Bram Moolenaar488c6512005-08-11 20:09:58 +00003285 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003286
3287" call Dret("SetSort")
3288endfun
3289
Bram Moolenaar488c6512005-08-11 20:09:58 +00003290" ---------------------------------------------------------------------
3291" SaveWinVars: (used by Explore()) {{{1
3292fun! s:SaveWinVars()
3293" call Dfunc("SaveWinVars()")
3294 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3295 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3296 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3297 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3298 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3299 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3300 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3301 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
3302" call Dret("SaveWinVars")
3303endfun
3304
3305" ---------------------------------------------------------------------
3306" CopyWinVars: (used by Explore()) {{{1
3307fun! s:CopyWinVars()
3308" call Dfunc("CopyWinVars()")
3309 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3310 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3311 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3312 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3313 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3314 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3315 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3316 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
3317" call Dret("CopyWinVars")
3318endfun
3319
Bram Moolenaar83bab712005-08-01 21:58:57 +00003320let &cpo= s:keepcpo
3321unlet s:keepcpo
Bram Moolenaar071d4272004-06-13 20:20:40 +00003322" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003323" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003324" vim:ts=8 fdm=marker