blob: edda27a68f45cfa2732fdebaa5ae40fc419e7426 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002" Last Change: Aug 08, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00004" Version: 59
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 Moolenaarf6cf9872005-08-08 22:00:59 +000025let g:loaded_netrw = "v59"
Bram Moolenaar8299df92004-07-10 09:47:34 +000026let loaded_explorer = 1
Bram Moolenaar83bab712005-08-01 21:58:57 +000027let s:keepcpo = &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000028set cpo&vim
29
30" ---------------------------------------------------------------------
31" Default values for global netrw variables {{{1
32if !exists("g:netrw_ftpmode")
33 let g:netrw_ftpmode= "binary"
34endif
35if !exists("g:netrw_win95ftp")
36 let g:netrw_win95ftp= 1
37endif
38if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000039 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000040 if &shell == "bash"
41 let g:netrw_cygwin= 1
42 else
43 let g:netrw_cygwin= 0
44 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000045 else
46 let g:netrw_cygwin= 0
47 endif
48endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000049if !exists("g:netrw_list_cmd")
50 if executable("ssh")
51 " provide a default listing command
52 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
53 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000054" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000055 let g:netrw_list_cmd= ""
56 endif
57endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000058if !exists("g:netrw_ftp_list_cmd")
59 if has("unix") || exists("g:netrw_cygwin")
60 let g:netrw_ftp_list_cmd= "ls -lF"
61 else
62 let g:netrw_ftp_list_cmd= "dir"
63 endif
64endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000065if !exists("g:netrw_rm_cmd")
66 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
67endif
68if !exists("g:netrw_rmf_cmd")
69 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
70endif
71if !exists("g:netrw_rmdir_cmd")
72 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
73endif
74if !exists("g:netrw_rename_cmd")
75 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
76endif
77if exists("g:netrw_silent") && g:netrw_silent != 0
78 let g:netrw_silentxfer= "silent "
79else
80 let g:netrw_silentxfer= ""
81endif
82if !exists("g:netrw_winsize")
83 let g:netrw_winsize= ""
84endif
85if !exists("g:netrw_list_hide")
86 let g:netrw_list_hide= ""
87endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000088if !exists("g:netrw_sort_by")
89 " alternatives: date size
90 let g:netrw_sort_by= "name"
91endif
92if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000093 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000094endif
95if !exists("g:netrw_sort_direction")
96 " alternative: reverse (z y x ...)
97 let g:netrw_sort_direction= "normal"
98endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000099if !exists("g:netrw_longlist") || g:netrw_longlist == 0
100 let g:netrw_longlist= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000101 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000102else
103 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000104 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
105endif
106if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000107endif
108if !exists("g:netrw_timefmt")
109 let g:netrw_timefmt= "%c"
110endif
111if !exists("g:netrw_local_rmdir")
112 let g:netrw_local_rmdir= "rmdir"
113endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000114if !exists("g:netrw_local_mkdir")
115 let g:netrw_local_mkdir= "mkdir"
116endif
117if !exists("g:netrw_mkdir_cmd")
118 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
119endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000120if !exists("g:netrw_hide")
121 let g:netrw_hide= 1
122endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000123if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000124 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 +0000125endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000126if !exists("g:netrw_ssh_browse_reject")
127 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
128endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000129if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000130 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000131endif
132if !exists("s:netrw_cd_escape")
133 if has("win32") || has("win95") || has("win64") || has("win16")
134 let s:netrw_cd_escape="#% "
135 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000136 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000137 endif
138endif
139if !exists("s:netrw_glob_escape")
140 if has("win32") || has("win95") || has("win64") || has("win16")
141 let s:netrw_glob_escape= ""
142 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000143 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000144 endif
145endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000146if !exists("g:netrw_alto")
147 let g:netrw_alto= 0
148endif
149if !exists("g:netrw_altv")
150 let g:netrw_altv= 0
151endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000152if !exists("g:netrw_maxfilenamelen")
153 let g:netrw_maxfilenamelen= 32
154endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000155if !exists("g:netrw_dirhistmax")
156 let g:netrw_dirhistmax= 10
157endif
158if !exists("g:NETRW_DIRHIST_CNT")
159 let g:NETRW_DIRHIST_CNT= 0
160endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000161
162" BufEnter event ignored by decho when following variable is true
163" Has a side effect that doau BufReadPost doesn't work, so
164" files read by network transfer aren't appropriately highlighted.
165"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166
167" ---------------------------------------------------------------------
168" Default values for global protocol variables {{{1
169if !exists("g:netrw_rcp_cmd")
170 let g:netrw_rcp_cmd = "rcp"
171endif
172if !exists("g:netrw_ftp_cmd")
173 let g:netrw_ftp_cmd = "ftp"
174endif
175if !exists("g:netrw_scp_cmd")
176 let g:netrw_scp_cmd = "scp -q"
177endif
178if !exists("g:netrw_sftp_cmd")
179 let g:netrw_sftp_cmd = "sftp"
180endif
181if !exists("g:netrw_http_cmd")
182 if executable("wget")
183 let g:netrw_http_cmd = "wget -q -O"
184 elseif executable("fetch")
185 let g:netrw_http_cmd = "fetch -o"
186 else
187 let g:netrw_http_cmd = ""
188 endif
189endif
190if !exists("g:netrw_dav_cmd")
191 let g:netrw_dav_cmd = "cadaver"
192endif
193if !exists("g:netrw_rsync_cmd")
194 let g:netrw_rsync_cmd = "rsync"
195endif
196if !exists("g:netrw_fetch_cmd")
197 if executable("fetch")
198 let g:netrw_fetch_cmd = "fetch -o"
199 else
200 let g:netrw_fetch_cmd = ""
201 endif
202endif
203
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000204if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205 \ && exists("g:netrw_use_nt_rcp")
206 \ && g:netrw_use_nt_rcp
207 \ && executable( $SystemRoot .'/system32/rcp.exe')
208 let s:netrw_has_nt_rcp = 1
209 let s:netrw_rcpmode = '-b'
210 else
211 let s:netrw_has_nt_rcp = 0
212 let s:netrw_rcpmode = ''
213endif
214
215" ---------------------------------------------------------------------
216" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000217 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000218if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000219 augroup FileExplorer
220 au!
Bram Moolenaar83bab712005-08-01 21:58:57 +0000221 au BufEnter * call <SID>LocalBrowse(expand("<amatch>"))
Bram Moolenaar8299df92004-07-10 09:47:34 +0000222 augroup END
223 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000224 augroup Network
225 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000226 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000227 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 +0000228 else
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>")
230 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 +0000231 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000232 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>")
233 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>")
234 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe "Nwrite " .expand("<amatch>")|exe "silent doau BufWritePost ".expand("<amatch>")
235 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 +0000236 augroup END
237endif
238
239" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +0000240" Commands: :Nread, :Nwrite, :NetUserPass {{{1
241com! -nargs=* Nread call s:NetSavePosn()<bar>call s:NetRead(<f-args>)<bar>call s:NetRestorePosn()
242com! -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 +0000243com! -nargs=* NetUserPass call NetUserPass(<f-args>)
244
Bram Moolenaar83bab712005-08-01 21:58:57 +0000245" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000246com! -nargs=? -bar -bang -count=0 Explore call s:Explore(<count>,0,0+<bang>0,<q-args>)
247com! -nargs=? -bar -bang -count=0 Sexplore call s:Explore(<count>,1,0+<bang>0,<q-args>)
248com! -nargs=? -bar -bang -count=0 Hexplore call s:Explore(<count>,1,2+<bang>0,<q-args>)
249com! -nargs=? -bar -bang -count=0 Vexplore call s:Explore(<count>,1,4+<bang>0,<q-args>)
250com! -nargs=? -bar -bang Nexplore call s:Explore(-1,0,0,<q-args>)
251com! -nargs=? -bar -bang Pexplore call s:Explore(-2,0,0,<q-args>)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000252
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253" ------------------------------------------------------------------------
254" NetSavePosn: saves position of cursor on screen {{{1
255fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000256" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257 " Save current line and column
258 let s:netrw_winnr= winnr()
259 let s:netrw_line = line(".")
260 let s:netrw_col = virtcol(".")
261
262 " Save top-of-screen line
263 norm! H0
264 let s:netrw_hline= line(".")
265
266 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000267" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268endfun
269
270" ------------------------------------------------------------------------
271" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
272fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000273" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +0000274 let eikeep= &ei
275 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276
Bram Moolenaar81695252004-12-29 20:58:21 +0000277 " restore window
278" call Decho("restore window: exe silent! ".s:netrw_winnr."wincmd w")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279 exe "silent! ".s:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000280" if v:shell_error == 0
281" " as suggested by Bram M: redraw on no error
282" " allows protocol error messages to remain visible
283" redraw!
284" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000285
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286 " restore top-of-screen line
Bram Moolenaar81695252004-12-29 20:58:21 +0000287" call Decho("restore topofscreen: exe norm! ".s:netrw_hline."G0z")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288 exe "norm! ".s:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000289
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290 " restore position
Bram Moolenaar81695252004-12-29 20:58:21 +0000291" call Decho("restore posn: exe norm! ".s:netrw_line."G0".s:netrw_col."|")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
293
Bram Moolenaar572cb562005-08-05 21:35:02 +0000294 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000295" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296endfun
297
298" ------------------------------------------------------------------------
299" NetRead: responsible for reading a file over the net {{{1
300fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000301" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000302
303 " save options
304 call s:NetOptionSave()
305
306 " Special Exception: if a file is named "0r", then
307 " "0r" will be used to read the
308 " following files instead of "r"
309 if a:0 == 0
310 let readcmd= "r"
311 let ichoice= 0
312 elseif a:1 == "0r"
313 let readcmd = "0r"
314 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000316 let readcmd = "r"
317 let ichoice = 1
318 endif
319
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000320 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000321 let tmpfile= tempname()
322
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000323" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000324 while ichoice <= a:0
325
326 " attempt to repeat with previous host-file-etc
327 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000328" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000329 let choice = b:netrw_lastfile
330 let ichoice= ichoice + 1
331
332 else
333 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000334" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000335
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000336 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000337 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000338 echomsg 'NetRead Usage:'
339 echomsg ':Nread machine:path uses rcp'
340 echomsg ':Nread "machine path" uses ftp with <.netrc>'
341 echomsg ':Nread "machine id password path" uses ftp'
342 echomsg ':Nread dav://machine[:port]/path uses cadaver'
343 echomsg ':Nread fetch://machine/path uses fetch'
344 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
345 echomsg ':Nread http://[user@]machine/path uses http wget'
346 echomsg ':Nread rcp://[user@]machine/path uses rcp'
347 echomsg ':Nread rsync://machine[:port]/path uses rsync'
348 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
349 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000350 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000351
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000352 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000353 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000354" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000355 if match(choice,"\"$") != -1
356 " case "..."
357 let choice=strpart(choice,1,strlen(choice)-2)
358 else
359 " case "... ... ..."
360 let choice = strpart(choice,1,strlen(choice)-1)
361 let wholechoice = ""
362
363 while match(choice,"\"$") == -1
364 let wholechoice = wholechoice . " " . choice
365 let ichoice = ichoice + 1
366 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000367 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000368 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000369 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000370 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000371" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000372 return
373 endif
374 let choice= a:{ichoice}
375 endwhile
376 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
377 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000378 endif
379 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000381" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000382 let ichoice= ichoice + 1
383
384 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000385 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000386 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000387" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000389 exe 'lcd ' . fnamemodify(tmpfile,':h')
390 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000391 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392
393 " Determine method of read (ftp, rcp, etc)
394 call s:NetMethod(choice)
395
Bram Moolenaar843ee412004-06-30 16:16:41 +0000396 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000397" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000398 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000399 keepjumps call s:NetBrowse(choice)
400" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000401 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000402 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000403
404 " ============
405 " Perform Read
406 " ============
407
408 ".........................................
409 " rcp: NetRead Method #1
410 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000411" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 " ER: noting done with g:netrw_uid yet?
413 " ER: on Win2K" rcp machine[.user]:file tmpfile
414 " ER: if machine contains '.' adding .user is required (use $USERNAME)
415 " ER: the tmpfile is full path: rcp sees C:\... as host C
416 if s:netrw_has_nt_rcp == 1
417 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
418 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
419 else
420 " Any way needed it machine contains a '.'
421 let uid_machine = g:netrw_machine .'.'. $USERNAME
422 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000423 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000424 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
425 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
426 else
427 let uid_machine = g:netrw_machine
428 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000429 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000430" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000431 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
432 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
433 let b:netrw_lastfile = choice
434
435 ".........................................
436 " ftp + <.netrc>: NetRead Method #2
437 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000438" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000439 let netrw_fname= b:netrw_fname
440 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000441 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000442 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000443 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000444 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000445" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000446 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
447 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000448" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000449 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
450 endif
451 " 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 +0000452 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000453 let debugkeep= &debug
454 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000455 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000456 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000457 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 endif
459 bd!
460 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
461 let b:netrw_lastfile = choice
462
463 ".........................................
464 " ftp + machine,id,passwd,filename: NetRead Method #3
465 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
466 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000467" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000468 let netrw_fname= b:netrw_fname
469 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000470 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000471 if exists("g:netrw_port") && g:netrw_port != ""
472 put ='open '.g:netrw_machine.' '.g:netrw_port
473 else
474 put ='open '.g:netrw_machine
475 endif
476
477 if exists("g:netrw_ftp") && g:netrw_ftp == 1
478 put =g:netrw_uid
479 put =g:netrw_passwd
480 else
481 put ='user '.g:netrw_uid.' '.g:netrw_passwd
482 endif
483
484 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
485 put =g:netrw_ftpmode
486 endif
487 put ='get '.netrw_fname.' '.tmpfile
488
489 " perform ftp:
490 " -i : turns off interactive prompting from ftp
491 " -n unix : DON'T use <.netrc>, even though it exists
492 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000493" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000494 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000495" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000496 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
497 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
498 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000499" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000500 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000501 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000502 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000503 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000504 endif
505 bd!
506 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
507 let b:netrw_lastfile = choice
508
509 ".........................................
510 " scp: NetRead Method #4
511 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000512" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 if exists("g:netrw_port") && g:netrw_port != ""
514 let useport= " -P ".g:netrw_port
515 else
516 let useport= ""
517 endif
518 if g:netrw_cygwin == 1
519 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000520" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000521 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
522 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000523" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000524 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
525 endif
526 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
527 let b:netrw_lastfile = choice
528
529 ".........................................
530 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000531" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000532 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000533 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000534 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000535 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000536 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000537 exit
538 endif
539
540 if match(b:netrw_fname,"#") == -1
541 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000542" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000543 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
544 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
545
546 else
547 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
548 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
549 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000550" call Decho("netrw_html<".netrw_html.">")
551" call Decho("netrw_tag <".netrw_tag.">")
552" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000553 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
554 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000555" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000556 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
557 endif
558 let b:netrw_lastfile = choice
559
560 ".........................................
561 " cadaver: NetRead Method #6
562 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000563" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000564
565 " Construct execution string (four lines) which will be passed through filter
566 let netrw_fname= b:netrw_fname
567 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000568 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000569 if exists("g:netrw_port") && g:netrw_port != ""
570 put ='open '.g:netrw_machine.' '.g:netrw_port
571 else
572 put ='open '.g:netrw_machine
573 endif
574 put ='user '.g:netrw_uid.' '.g:netrw_passwd
575
576 if g:netrw_cygwin == 1
577 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
578 put ='get '.netrw_fname.' '.cygtmpfile
579 else
580 put ='get '.netrw_fname.' '.tmpfile
581 endif
582
583 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000584 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000585" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000586 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
587 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000588 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000589 let b:netrw_lastfile = choice
590
591 ".........................................
592 " rsync: NetRead Method #7
593 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000594" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000595 if g:netrw_cygwin == 1
596 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000597" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
599 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000600" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000601 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
602 endif
603 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
604 let b:netrw_lastfile = choice
605
606 ".........................................
607 " fetch: NetRead Method #8
608 " fetch://[user@]host[:http]/path
609 elseif b:netrw_method == 8 " read with fetch
610 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000611 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000612 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000613 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000614 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000615 exit
616 endif
617 if exists("g:netrw_option") && g:netrw_option == ":http"
618 let netrw_option= "http"
619 else
620 let netrw_option= "ftp"
621 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000623
624 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000625" 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 +0000626 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
627 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000628" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
630 endif
631
632 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
633 let b:netrw_lastfile = choice
634
635 ".........................................
636 " sftp: NetRead Method #9
637 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000638" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000639 if g:netrw_cygwin == 1
640 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000641" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
642" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000643 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
644 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000645" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000646 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
647 endif
648 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
649 let b:netrw_lastfile = choice
650
651 ".........................................
652 else " Complain
653 echo "***warning*** unable to comply with your request<" . choice . ">"
654 endif
655 endwhile
656
657 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000658" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659 if exists("b:netrw_method")
660 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000661 unlet b:netrw_fname
662 endif
663 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000664
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000665" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000667
668" ------------------------------------------------------------------------
669" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
670fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000671" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000672
673 if exists("*NetReadFixup")
674 " for the use of NetReadFixup (not otherwise used internally)
675 let line2= line("$")
676 endif
677
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000678 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000679 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000680 if g:netrw_cygwin
681 let fname= a:fname
682" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000683 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000684 let fname= substitute(a:fname,'/','\\\\','ge')
685" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000686 endif
687 else
688 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000689" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 endif
691
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000692 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000693 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000694
Bram Moolenaar81695252004-12-29 20:58:21 +0000695 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000696 let rfile= bufname(".")
697" call Decho("remotefile<".rfile.">")
698" call Dredir("ls!","starting buffer list")
699
Bram Moolenaar81695252004-12-29 20:58:21 +0000700 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000701 if v:version < 700
702 exe "file ".fname
703 else
704 keepalt exe "file ".fname
705 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000706" call Dredir("ls!","after renaming current buffer to <".fname.">")
707
Bram Moolenaar81695252004-12-29 20:58:21 +0000708 " edit temporary file
709 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000710" call Dredir("ls!","after editing temporary file")
711
Bram Moolenaar81695252004-12-29 20:58:21 +0000712 " rename buffer back to remote filename
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000713 if v:version < 700
714 exe "file ".rfile
715 else
716 keepalt exe "file ".rfile
717 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000718" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000719 let line1 = 1
720 let line2 = line("$")
721
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000722 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000723 " read file after current line
724 let curline = line(".")
725 let lastline= line("$")
726" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000728 let line1 = curline + 1
729 let line2 = line("$") - lastline + 1
730 let s:netrw_line = s:netrw_line + 1
731 let s:netrw_col = 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000732 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000733 " not readable
734" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000735 return
736 endif
737
738 " User-provided (ie. optional) fix-it-up command
739 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000740" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000741 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000742" else " Decho
743" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000744 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000745
746 " update the Buffers menu
747 if has("gui") && has("gui_running")
748 silent! emenu Buffers.Refresh\ menu
749 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000750
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000751" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752
753 " insure that we have the right filetype and that its being displayed
754 filetype detect
755 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000756" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000757endfun
758
759" ------------------------------------------------------------------------
760" NetWrite: responsible for writing a file over the net {{{1
761fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000762" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000763
764 " option handling
765 let mod= 0
766 call s:NetOptionSave()
767
768 " Get Temporary Filename
769 let tmpfile= tempname()
770
771 if a:0 == 0
772 let ichoice = 0
773 else
774 let ichoice = 1
775 endif
776
777 " write (selected portion of) file to temporary
778 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
779
780 while ichoice <= a:0
781
782 " attempt to repeat with previous host-file-etc
783 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000784" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785 let choice = b:netrw_lastfile
786 let ichoice= ichoice + 1
787 else
788 exe "let choice= a:" . ichoice
789
790 " Reconstruct Choice if choice starts with '"'
791 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000792 echomsg 'NetWrite Usage:"'
793 echomsg ':Nwrite machine:path uses rcp'
794 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
795 echomsg ':Nwrite "machine id password path" uses ftp'
796 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
797 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
798 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
799 echomsg ':Nwrite rcp://machine/path uses rcp'
800 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
801 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
802 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000803 break
804
805 elseif match(choice,"^\"") != -1
806 if match(choice,"\"$") != -1
807 " case "..."
808 let choice=strpart(choice,1,strlen(choice)-2)
809 else
810 " case "... ... ..."
811 let choice = strpart(choice,1,strlen(choice)-1)
812 let wholechoice = ""
813
814 while match(choice,"\"$") == -1
815 let wholechoice= wholechoice . " " . choice
816 let ichoice = ichoice + 1
817 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000818 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000819 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000820 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000821 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000822" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000823 return
824 endif
825 let choice= a:{ichoice}
826 endwhile
827 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
828 endif
829 endif
830 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000831" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000832 let ichoice= ichoice + 1
833
834 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000835 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000836 let choice= substitute(choice,'\\','/','ge')
837 "ER: see NetRead()
838 exe 'lcd ' . fnamemodify(tmpfile,':h')
839 let tmpfile = fnamemodify(tmpfile,':t')
840 endif
841
842 " Determine method of read (ftp, rcp, etc)
843 call s:NetMethod(choice)
844
845 " =============
846 " Perform Write
847 " =============
848
849 ".........................................
850 " rcp: NetWrite Method #1
851 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000852" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000853 if s:netrw_has_nt_rcp == 1
854 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
855 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
856 else
857 let uid_machine = g:netrw_machine .'.'. $USERNAME
858 endif
859 else
860 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
861 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
862 else
863 let uid_machine = g:netrw_machine
864 endif
865 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000866" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000867 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
868 let b:netrw_lastfile = choice
869
870 ".........................................
871 " ftp + <.netrc>: NetWrite Method #2
872 elseif b:netrw_method == 2 " write with ftp + <.netrc>
873 let netrw_fname = b:netrw_fname
874 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000875 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000876 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000877" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000878 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
879" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000880 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000881" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000882 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000883 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000884" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000885 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000886 endif
887 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
888 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000889 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000890 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000891 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000892 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000893 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000894 endif
895 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000896 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000897
898 ".........................................
899 " ftp + machine, id, passwd, filename: NetWrite Method #3
900 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
901 let netrw_fname= b:netrw_fname
902 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000903 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000904 if exists("g:netrw_port") && g:netrw_port != ""
905 put ='open '.g:netrw_machine.' '.g:netrw_port
906 else
907 put ='open '.g:netrw_machine
908 endif
909 if exists("g:netrw_ftp") && g:netrw_ftp == 1
910 put =g:netrw_uid
911 put =g:netrw_passwd
912 else
913 put ='user '.g:netrw_uid.' '.g:netrw_passwd
914 endif
915 put ='put '.tmpfile.' '.netrw_fname
916 " save choice/id/password for future use
917 let b:netrw_lastfile = choice
918
919 " perform ftp:
920 " -i : turns off interactive prompting from ftp
921 " -n unix : DON'T use <.netrc>, even though it exists
922 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000923" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000924 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000925" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000926 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
927 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
928 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000929 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000930 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000931 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000932 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000933 let mod=1
934 endif
935 bd!
936
937 ".........................................
938 " scp: NetWrite Method #4
939 elseif b:netrw_method == 4 " write with scp
940 if exists("g:netrw_port") && g:netrw_port != ""
941 let useport= " -P ".g:netrw_port
942 else
943 let useport= ""
944 endif
945 if g:netrw_cygwin == 1
946 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000947" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
949 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000950" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000951 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
952 endif
953 let b:netrw_lastfile = choice
954
955 ".........................................
956 " http: NetWrite Method #5
957 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000958 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000959 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000960 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000961 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000962
963 ".........................................
964 " dav: NetWrite Method #6
965 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000966" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000967
968 " Construct execution string (four lines) which will be passed through filter
969 let netrw_fname= b:netrw_fname
970 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000971 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000972 if exists("g:netrw_port") && g:netrw_port != ""
973 put ='open '.g:netrw_machine.' '.g:netrw_port
974 else
975 put ='open '.g:netrw_machine
976 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000977 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978
979 if g:netrw_cygwin == 1
980 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
981 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000982 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000983 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985
986 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000987 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000988" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000989 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
990 bd!
991 let b:netrw_lastfile = choice
992
993 ".........................................
994 " rsync: NetWrite Method #7
995 elseif b:netrw_method == 7 " write with rsync
996 if g:netrw_cygwin == 1
997 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000998" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000999 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001000 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001001" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001002 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001003 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 let b:netrw_lastfile = choice
1005
1006 ".........................................
1007 " scp: NetWrite Method #9
1008 elseif b:netrw_method == 9 " write with sftp
1009 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001010 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1011 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1012 else
1013 let uid_machine = g:netrw_machine
1014 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001015 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001016 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001017 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001018 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001019" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001020 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1021 bd!
1022 let b:netrw_lastfile= choice
1023
1024 ".........................................
1025 else " Complain
1026 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001027 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001028 endwhile
1029
1030 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001031" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001032 let result=delete(tmpfile)
1033 call s:NetOptionRestore()
1034
1035 if a:firstline == 1 && a:lastline == line("$")
1036 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001037 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001038
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001039" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001040endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001041
Bram Moolenaar83bab712005-08-01 21:58:57 +00001042" ===========================================
1043" Remote Directory Browsing Support: {{{1
1044" ===========================================
1045
Bram Moolenaar843ee412004-06-30 16:16:41 +00001046" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001047" of the contents of a remote directory. It is assumed that the
1048" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1049" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001050fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001051" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001052
1053 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001054 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1055" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001056 if !executable("ftp")
1057 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001058 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001059 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001060 endif
1061" call Dret("NetBrowse")
1062 return
1063 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001064 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001065 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 ssh" | 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
Bram Moolenaar572cb562005-08-05 21:35:02 +00001069
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001070" call Dret("NetBrowse")
1071 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001072 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001073
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001074 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001075 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001076
1077 " analyze a:dirname and g:netrw_list_cmd
1078 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001079 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001080" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001081 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001082 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001083 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001084 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001085 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001086" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001087 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001088 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001089
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001090 let method = substitute(dirname,dirpat,'\1','')
1091 let user = substitute(dirname,dirpat,'\2','')
1092 let machine = substitute(dirname,dirpat,'\3','')
1093 let path = substitute(dirname,dirpat,'\4','')
1094 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001095" call Decho("set up method <".method .">")
1096" call Decho("set up user <".user .">")
1097" call Decho("set up machine<".machine.">")
1098" call Decho("set up path <".path .">")
1099" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001100
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001101 if method == "ftp" || method == "http"
1102 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001103 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001104 else
1105 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1106 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001107
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001108 if exists("b:netrw_method")
1109" call Decho("setting s:netrw_method<".b:netrw_method.">")
1110 let s:netrw_method= b:netrw_method
1111 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001112
Bram Moolenaar8299df92004-07-10 09:47:34 +00001113 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001114 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001115 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 +00001116 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001117 else
1118 if g:netrw_sort_by =~ "^t"
1119 let listcmd= listcmd."t"
1120 elseif g:netrw_sort_by =~ "^s"
1121 let listcmd= listcmd."S"
1122 endif
1123 " optionally sort in reverse
1124 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1125 let listcmd= listcmd."r"
1126 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001127 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001128
1129" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001130 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001131" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001132 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001134" call Dret("NetBrowse : symlink")
1135 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001137 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001138 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001139" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001140
1141 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 " "this is a directory" indicator (/). There shouldn't be one of those,
1143 " anyway.
1144 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001145" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001146
1147 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001148 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001149" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001150 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001151 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001152 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001153 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001154 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001155
1156 setlocal nonu nomod noma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001157
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001158" call Dret("NetBrowse : file<".fname.">")
1159 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001161
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 " ---------------------------------------------------------------------
1163 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001164" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001165 " set up new buffer and map
1166 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001167 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001168" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001169 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001170 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001171" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001172 exe "b ".bufnamenr
1173 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001174" call Dret("NetBrowse")
1175 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001176 endif
1177 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001178" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001179 enew!
1180 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001181
1182 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001183 setlocal bt=nofile bh=wipe nobl noswf
1184 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001185" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001186 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001187" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001188 setlocal bh=hide nobl nonu
1189
1190 " save current directory on directory history list
1191 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001192
1193 " set up buffer-local mappings
1194" call Decho("set up buffer-local mappings")
1195 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001196 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001197 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001198 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 +00001199 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1200 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1201 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1202 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001203 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001204 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1205 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>
1206 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>
1207 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001208 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1209 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001210 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001211 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1212 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 +00001213 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1214 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001215 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001216 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1217 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1218 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001219 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001220 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001221 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001222
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001223 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001224" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1225 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001226 keepjumps put ='\" Netrw Remote Directory Listing'
1227 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001228 let s:netrw_bannercnt= 7
1229 let sortby= g:netrw_sort_by
1230 if g:netrw_sort_direction =~ "^r"
1231 let sortby= sortby." reversed"
1232 endif
1233
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001234 if g:netrw_sort_by =~ "^n"
1235 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001236 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1237 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001238 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1239 else
1240 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001241 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001242 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001243 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001244 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001245 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001246 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001247 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001248 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001250 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001251 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1252 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001253
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001254 " remote read the requested directory listing
1255 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1256 " Note that not all ftp servers honor the options for ls
1257 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001258 " use ftp to get remote file listing
1259" call Decho("use ftp to get remote file listing")
1260 call NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001261 keepjumps 1d
1262
1263 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001264 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001265" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001266 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001267
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001268 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001269 if g:netrw_ftp_browse_reject != ""
1270 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1271 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001272
1273 " if there's no ../ listed, then put ./ and ../ in
1274 let line1= line(".")
1275 keepjumps 1
1276 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1277 let line2= line(".")
1278 if line2 == 0
1279 keepjumps put='../'
1280 keepjumps put='./'
1281 endif
1282 exe "keepjumps ".line1
1283 keepjumps norm! 0
1284
1285 " more cleanup
Bram Moolenaar83bab712005-08-01 21:58:57 +00001286 exe 'keepjumps silent! '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1287 exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1288 exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001289 endif
1290
1291 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001292 " use ssh to get remote file listing
1293" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001294 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001295" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001296 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1297 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001298 " cleanup
1299 if g:netrw_ftp_browse_reject != ""
1300 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001301 endif
1302 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001303
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001304
1305 " set up syntax highlighting
1306 if has("syntax")
1307 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001308 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001309 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001310 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1311 " sometimes the laststatus highlight bleeds into the entire display.
1312 " Only seems to happen with remote browsing. Weird.
1313 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001314 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001315 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001316
1317 " manipulate the directory listing (hide, sort)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001318 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001319 if g:netrw_hide && g:netrw_list_hide != ""
1320 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001321 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001322
Bram Moolenaar8299df92004-07-10 09:47:34 +00001323 if g:netrw_longlist
1324 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001325" call Decho("manipulate long listing")
1326
1327 if method == "ftp"
1328 " cleanup
1329 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001330 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001331 keepjumps d
1332 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001333 " if there's no ../ listed, then put ./ and ../ in
1334 let line1= line(".")
1335 keepjumps 1
1336 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1337 let line2= line(".")
1338 if line2 == 0
1339 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1340 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1341 endif
1342 exe "keepjumps ".line1
1343 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001344 endif
1345
1346 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1347 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1348 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001349 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001350
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001351 if line("$") >= s:netrw_bannercnt
1352 if g:netrw_sort_by =~ "^n"
1353 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00001354 if v:version < 700
1355 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001356 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001357 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001358 else
1359 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001360 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001361 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
1362 endif
1363 if g:netrw_longlist
1364 " shorten the list to keep its width <= 80 characters
1365 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
1366 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001367 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001368 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001369 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001370
1371 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001372
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001373" call Dret("NetBrowse")
1374 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375endfun
1376
1377" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001378" NetBrowseChgDir: {{{2
1379fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001380" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001381
1382 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001383 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001384
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001385 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001386 " handling a file
1387 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001388" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389
1390 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001391 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001392" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001393 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001394 %d
1395
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001396 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001397 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001398 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001399
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001400 if trailer =~ '^\%(\.\./\)*$'
1401 " tack on a ../"
1402 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001403
1404 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001405 " strip off a directory name from dirname
1406 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001407 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001408" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001409
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001410 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001411 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001412 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001413" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001414 endif
1415
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001416" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001417 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001418endfun
1419
Bram Moolenaar843ee412004-06-30 16:16:41 +00001420" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001421" NetGetWord: it gets the directory named under the cursor
1422fun! <SID>NetGetWord()
1423" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001424 if line(".") < s:netrw_bannercnt
1425 let dirname= "./"
1426 else
1427 let dirname= getline(".")
1428 if dirname =~ '\t'
1429 let dirname= substitute(dirname,'\t.*$','','e')
1430 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001431 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001432" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001433 return dirname
1434endfun
1435
1436" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001437" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001438fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001439" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1440" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001441
1442 " preparation for removing multiple files/directories
1443 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001444 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001445
1446 " remove multiple files and directories
1447 while ctr <= a:lastline
1448 exe ctr
1449
1450 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001451 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001452" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001453
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001454 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001455 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001456 if !all
1457 echohl Statement
1458 call inputsave()
1459 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1460 call inputrestore()
1461 echohl NONE
1462 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1463 if ok =~ 'a\%[ll]'
1464 let all= 1
1465 endif
1466 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001467
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001468 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001469 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1470 silent! keepjumps .,$d
1471 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1472 else
1473 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1474" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1475 let ret= system(netrw_rm_cmd)
1476" call Decho("returned=".ret." errcode=".v:shell_error)
1477 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001478 elseif ok =~ 'q\%[uit]'
1479 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001480 endif
1481
1482 else
1483 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001484 if !all
1485 call inputsave()
1486 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1487 call inputrestore()
1488 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1489 if ok =~ 'a\%[ll]'
1490 let all= 1
1491 endif
1492 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001493
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001494 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001495 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1496 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1497 else
1498 let rmfile = a:path.rmfile
1499 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1500" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1501 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001502" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001503
1504 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001505 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001506" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1507 let ret= system(netrw_rmf_cmd)
1508" call Decho("returned=".ret." errcode=".v:shell_error)
1509
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001510 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001511 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001512 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001513 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001514 endif
1515 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001516
1517 elseif ok =~ 'q\%[uit]'
1518 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001519 endif
1520 endif
1521
1522 let ctr= ctr + 1
1523 endwhile
1524
1525 " refresh the directory
1526 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001527" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001528 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1529 exe curline
1530
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001531" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001532endfun
1533
1534" ---------------------------------------------------------------------
1535" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001536fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001537" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001538
1539 " preparation for removing multiple files/directories
1540 let ctr = a:firstline
1541 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1542
1543 " attempt to rename files/directories
1544 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001545 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001546
1547 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001548 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001549" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001550
1551 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001552 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001553 call inputrestore()
1554
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001555 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1556 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1557 else
1558 let oldname= a:path.oldname
1559 let newname= a:path.newname
1560" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1561 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1562 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001563
1564 let ctr= ctr + 1
1565 endwhile
1566
1567 " refresh the directory
1568 let curline= line(".")
1569 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001570 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001571" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001572endfun
1573
1574" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001575" NetRefresh: {{{2
1576fun! <SID>NetRefresh(dirname)
1577" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1578 set ma
1579 %d
1580 call <SID>NetBrowse(dirname)
1581 redraw!
1582" call Dret("NetRefresh")
1583endfun
1584
1585" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001586" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001587" files given their extension. Passes 0=local, 1=remote
1588fun! <SID>NetBrowseX(fname,remote)
1589" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001590
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001591 " set up the filename
1592 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001593 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001594 if has("win32") || has("win95") || has("win64") || has("win16")
1595 let exten= substitute(exten,'^.*$','\L&\E','')
1596 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001597 let fname= escape(a:fname,"%#")
1598" call Decho("fname<".fname."> after escape()")
1599
1600 if a:remote == 1
1601 " create a local copy
1602 let fname= tempname().".".exten
1603" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1604 exe "keepjumps silent bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001605 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001606 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001607 q
1608 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001609" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001610
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001611 " set up redirection
1612 if &srr =~ "%s"
1613 let redir= substitute(&srr,"%s","/dev/null"."")
1614 else
1615 let redir= &srr . "/dev/null"
1616 endif
1617" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001618
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001619 " execute the file handler
1620 if has("win32") || has("win64")
1621" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1622 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1623 let ret= v:shell_error
1624
1625 elseif has("unix") && executable("kfmclient")
1626" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1627 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1628 let ret= v:shell_error
1629
1630 elseif has("unix") && executable("gnome-open")
1631" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1632 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1633 let ret= v:shell_error
1634
1635 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1636" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001637 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001638 endif
1639 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001640
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001641 " cleanup: remove temporary file,
1642 " delete current buffer if success with handler,
1643 " return to prior buffer (directory listing)
1644 if a:remote == 1 && fname != a:fname
1645" call Decho("deleting temporary file<".fname.">")
1646 call delete(fname)
1647 endif
1648
1649 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001650 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001651 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001652 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001653 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001654
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001655" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001656endfun
1657
1658" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001659" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1660" This function assumes that a long listing will be received. Size, time,
1661" and reverse sorts will be requested of the server but not otherwise
1662" enforced here.
1663fun! NetBrowseFtpCmd(path,cmd)
1664" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1665
1666 " because WinXX ftp uses unix style input
1667 " curline is one more than the bannercnt in order to account
1668 " for the unwanted first blank line (doing a :put to an empty
1669 " buffer yields a blank first line)
1670 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001671 setlocal ma ff=unix
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001672 let curline= s:netrw_bannercnt+1
1673 exe "silent! keepjumps ".curline.",$d"
1674
1675 ".........................................
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001676 if s:netrw_method == 2 || s:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001677 " ftp + <.netrc>: Method #2
1678 if a:path != ""
1679 put ='cd '.a:path
1680 endif
1681 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001682" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001683 if exists("g:netrw_port") && g:netrw_port != ""
1684" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1685 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1686 else
1687" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1688 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1689 endif
1690
1691 ".........................................
1692 elseif s:netrw_method == 3
1693 " ftp + machine,id,passwd,filename: Method #3
1694 setlocal ff=unix
1695 if exists("g:netrw_port") && g:netrw_port != ""
1696 put ='open '.g:netrw_machine.' '.g:netrw_port
1697 else
1698 put ='open '.g:netrw_machine
1699 endif
1700
1701 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1702 put =g:netrw_uid
1703 put =g:netrw_passwd
1704 else
1705 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1706 endif
1707
1708 if a:path != ""
1709 put ='cd '.a:path
1710 endif
1711 exe "put ='".a:cmd."'"
1712
1713 " perform ftp:
1714 " -i : turns off interactive prompting from ftp
1715 " -n unix : DON'T use <.netrc>, even though it exists
1716 " -n win32: quit being obnoxious about password
1717" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1718 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1719
1720 ".........................................
1721 else
1722 echo "***warning*** unable to comply with your request<" . choice . ">"
1723 endif
1724
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001725 " cleanup for Windows
1726 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001727 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001728 endif
1729 if a:cmd == "dir"
1730 " infer directory/link based on the file permission string
Bram Moolenaar83bab712005-08-01 21:58:57 +00001731 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1732 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001733 if !g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00001734 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001735 endif
1736 endif
1737
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001738 " restore settings
1739 let &ff= ffkeep
1740" call Dret("NetBrowseFtpCmd")
1741endfun
1742
1743" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001744" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1745" separated patterns given in g:netrw_list_hide
1746fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001747" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001748
1749 let listhide= g:netrw_list_hide
1750 while listhide != ""
1751 if listhide =~ ','
1752 let hide = substitute(listhide,',.*$','','e')
1753 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1754 else
1755 let hide = listhide
1756 let listhide= ""
1757 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001758
1759 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001760" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001761 if g:netrw_hide == 1
1762 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1763 elseif g:netrw_hide == 2
1764 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1765 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001766 endwhile
1767
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001768" call Dret("NetrwListHide")
1769endfun
1770
1771" ---------------------------------------------------------------------
1772" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001773fun! <SID>NetHideEdit(mode)
1774" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001775
1776 call inputsave()
1777 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1778 call inputrestore()
1779
1780 " refresh the listing
1781 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001782 if a:mode == 0
1783 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1784 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001785 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001786 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001787
1788" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001789endfun
1790
Bram Moolenaar8299df92004-07-10 09:47:34 +00001791" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001792" NetSortSequence: allows user to edit the sorting sequence
1793fun! <SID>NetSortSequence(mode)
1794" call Dfunc("NetSortSequence(mode=".a:mode.")")
1795
1796 call inputsave()
1797 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1798 call inputrestore()
1799
1800 " refresh the listing
1801 let g:netrw_sort_sequence= newsortseq
1802 if a:mode == 0
1803 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1804 else
1805 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1806 endif
1807
1808" call Dret("NetSortSequence")
1809endfun
1810
1811" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001812" NetLongList: {{{2
1813fun! <SID>NetLongList(mode)
1814" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001815 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001816
1817 if g:netrw_longlist != 0
1818 " turn long listing off
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001819" call Decho("turn long listing off")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001820 let g:netrw_longlist = 0
1821 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1822
1823 else
1824 " turn long listing on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001825" call Decho("turn long listing on")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001826 let g:netrw_longlist = 1
1827 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1828 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001829 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001830
1831 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001832 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001833
1834 " refresh the listing
1835 if a:mode == 0
1836 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1837 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001838 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001839 endif
1840
Bram Moolenaar572cb562005-08-05 21:35:02 +00001841" call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001842" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1843endfun
1844
1845" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001846" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001847" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1848" the same word even though the sorting has changed its order of appearance.
1849fun! s:NetSaveWordPosn()
1850" call Dfunc("NetSaveWordPosn()")
1851 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1852" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1853endfun
1854
1855" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001856" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001857fun! s:NetRestoreWordPosn()
1858" call Dfunc("NetRestoreWordPosn()")
1859 silent! call search(s:netrw_saveword,'w')
1860" call Dret("NetRestoreWordPosn")
1861endfun
1862
1863" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001864" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001865fun! <SID>NetMakeDir(usrhost)
1866" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1867
1868 " get name of new directory from user. A bare <CR> will skip.
1869 " if its currently a directory, also request will be skipped, but with
1870 " a message.
1871 call inputsave()
1872 let newdirname= input("Please give directory name: ")
1873 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001874" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001875
1876 if newdirname == ""
1877" call Dret("NetMakeDir : user aborted with bare <cr>")
1878 return
1879 endif
1880
1881 if a:usrhost == ""
1882
1883 " Local mkdir:
1884 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001885 let fullnewdir= b:netrw_curdir.'/'.newdirname
1886" call Decho("fullnewdir<".fullnewdir.">")
1887 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001888 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001889 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001890 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001891 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001892" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1893 return
1894 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001895 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001896 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001897 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001898 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001899 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001900" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1901 return
1902 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001903
1904 " requested new local directory is neither a pre-existing file or
1905 " directory, so make it!
1906 if exists("*mkdir")
1907 call mkdir(fullnewdir,"p")
1908 else
1909 let netrw_origdir= s:NetGetcwd(1)
1910 exe 'cd '.b:netrw_curdir
1911" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1912" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1913 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001914 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001915 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001916
Bram Moolenaar8299df92004-07-10 09:47:34 +00001917 if v:shell_error == 0
1918 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001919" call Decho("refresh listing")
1920 let linenum= line(".")
1921 norm! H0
1922 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001923 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001924 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1925 exe "norm! ".hline."G0z\<CR>"
1926 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001927 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001928 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001929 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001930 endif
1931 redraw!
1932
1933 else
1934 " Remote mkdir:
1935 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001936 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001937" call Decho("exe silent! !".mkdircmd." ".newdirname)
1938 exe "silent! !".mkdircmd." ".newdirname
1939 if v:shell_error == 0
1940 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001941 let linenum= line(".")
1942 norm! H0
1943 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001944 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001945 exe "norm! ".hline."G0z\<CR>"
1946 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001947 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001948 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001949 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001950 endif
1951 redraw!
1952 endif
1953
1954" call Dret("NetMakeDir")
1955endfun
1956
1957" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001958" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00001959" 0: (user: <b>) bookmark current directory
1960" 1: (user: <B>) change to the bookmarked directory
1961" 2: (user: <q>) list bookmarks
1962" 3: (LocalBrowse) record current directory history
1963" 4: (user: <u>) go up (previous) bookmark
1964" 5: (user: <U>) go down (next) bookmark
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001965fun! <SID>NetBookmarkDir(chg,curdir)
1966" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1967
1968 if a:chg == 0
1969 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001970 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1971 if !exists("g:NETRW_BOOKMARKMAX")
1972 let g:NETRW_BOOKMARKMAX= v:count
1973 elseif v:count > g:NETRW_BOOKMARKMAX
1974 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001975 endif
1976
1977 elseif a:chg == 1
1978 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001979 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1980 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001981 else
1982 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1983 endif
1984
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001985 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00001986 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001987 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001988" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1989 let cnt= 0
1990 while cnt <= g:NETRW_BOOKMARKMAX
1991 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1992" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1993 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1994 endif
1995 let cnt= cnt + 1
1996 endwhile
1997 endif
1998
1999 " list directory history
2000 let cnt = g:NETRW_DIRHIST_CNT
2001 let first = 1
2002 let histcnt = 0
2003 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2004" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2005 let histcnt= histcnt + 1
2006 if exists("g:NETRW_DIRHIST_{cnt}")
2007" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2008 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002009 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002010 let first = 0
2011 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2012 if cnt < 0
2013 let cnt= cnt + g:netrw_dirhistmax
2014 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002015 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002016
2017 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002018 " saves most recently visited directories (when they differ)
2019 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2020 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2021 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2022" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2023 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002024
2025 elseif a:chg == 4
2026 " u: change to the previous directory stored on the history list
2027 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2028 if g:NETRW_DIRHIST_CNT < 0
2029 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2030 endif
2031 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2032" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2033 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2034 else
2035 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2036 echo "Sorry, no predecessor directory exists yet"
2037 endif
2038
2039 elseif a:chg == 5
2040 " U: change to the subsequent directory stored on the history list
2041 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2042 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2043" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2044 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2045 else
2046 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2047 if g:NETRW_DIRHIST_CNT < 0
2048 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2049 endif
2050 echo "Sorry, no successor directory exists yet"
2051 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002052 endif
2053" call Dret("NetBookmarkDir")
2054endfun
2055
Bram Moolenaar83bab712005-08-01 21:58:57 +00002056" ==========================================
2057" Local Directory Browsing Support: {{{1
2058" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002059
2060" ---------------------------------------------------------------------
2061" LocalBrowse: supports local file/directory browsing {{{2
2062fun! <SID>LocalBrowse(dirname)
2063
2064" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
2065 if !isdirectory(a:dirname)
2066 " not a directory, ignore it
2067 return
2068 endif
2069
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002070 " unfortunate interaction -- when putting debugging calls
2071 " above one can no longer enter the DBG buffer.
Bram Moolenaar572cb562005-08-05 21:35:02 +00002072" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002073" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002074
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002075 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002076 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002077 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002078 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002079 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002080" call Dret("LocalBrowse : vim version<".v:version."> too old")
2081 return
2082 endif
2083
Bram Moolenaar83bab712005-08-01 21:58:57 +00002084 " record autochdir setting and then insure its unset (tnx to David Fishburn)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002085 if has("netbeans_intg") || has("sun_workshop")
2086 let keep_autochdir= &autochdir
2087 set noautochdir
2088 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002089
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002090 " find buffer number of buffer named precisely the same as a:dirname
2091 let bufnum= bufnr(a:dirname)
2092" call Decho("findbuf: bufnum=".bufnum)
2093 if bufnum > 0 && bufname(bufnum) != a:dirname
2094 let ibuf= 1
2095 let buflast= bufnr("$")
2096 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2097" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2098 let ibuf= ibuf + 1
2099 endwhile
2100 if ibuf > buflast
2101 let bufnum= -1
2102 else
2103 let bufnum= ibuf
2104 endif
2105" call Decho("findbuf: bufnum=".bufnum." (final)")
2106 endif
2107
2108 " get cleared buffer
2109 if bufnum < 0
2110 if v:version < 700
2111 enew!
2112 else
2113 keepalt enew!
2114 endif
2115" call Decho("enew buffer")
2116 else
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002117 if v:version < 700
2118 exe "b ".bufnum
2119 else
2120 exe "keepalt b ".bufnum
2121 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002122 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2123 if getline(2) =~ '^" Directory Listing '
2124 if !g:netrw_keepdir
2125" call Decho("change directory: cd ".b:netrw_curdir)
2126 exe 'cd '.b:netrw_curdir
2127 endif
2128" call Dret("LocalBrowse : reusing buffer#".bufnum."<".a:dirname.">")
2129 return
2130 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002131 endif
2132 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002133 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002134
2135 " get the new directory name
Bram Moolenaar83bab712005-08-01 21:58:57 +00002136 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2137 if b:netrw_curdir =~ '[/\\]$'
2138 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2139 endif
2140" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002141
Bram Moolenaar83bab712005-08-01 21:58:57 +00002142 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002143 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002144" call Decho("change directory: cd ".b:netrw_curdir)
2145 exe 'cd '.b:netrw_curdir
2146 endif
2147
2148 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002149 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002150
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002151 " make this buffer modifiable and hidden
2152 setlocal ma hidden nonu
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002153 if v:version < 700
2154 silent! %d
2155 else
2156 keepalt silent! %d
2157 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002158
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002159 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002160 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002161
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002162 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002163 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002164
Bram Moolenaar8299df92004-07-10 09:47:34 +00002165 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002166" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002167 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 +00002168 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 +00002169 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002170 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 +00002171 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2172 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2173 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2174 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2175 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002176 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002177 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2178 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 +00002179 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2180 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>
2181 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>
2182 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002183 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2184 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002185 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002186 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 +00002187 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2188 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2189 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002190 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2191 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2192 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2193 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2194 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2195 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002196 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002197 nnoremap <buffer> ? :he netrw-dir<cr>
2198
2199 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002200" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002201 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002202 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002203 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002204 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002205 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002206
2207 let sortby= g:netrw_sort_by
2208 if g:netrw_sort_direction =~ "^r"
2209 let sortby= sortby." reversed"
2210 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002211
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002212 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002213 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002214" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002215 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002216 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002217 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002218 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002219 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002220" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002221 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002222 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002223 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002224 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002225
2226 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002227 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002228 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002229 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002230 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002231 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002232 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002233 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002234 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002235 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2236 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002237 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2238
2239 " bannercnt should index the line just after the banner
2240 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2241" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002242
2243 " generate the requested directory listing
Bram Moolenaar83bab712005-08-01 21:58:57 +00002244 call LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002245
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002246 " set up syntax highlighting
2247 if has("syntax")
2248 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002249 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002250 setlocal ft=
2251 endif
2252 endif
2253
Bram Moolenaar8299df92004-07-10 09:47:34 +00002254 " manipulate the directory listing (hide, sort)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002255 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002256 if g:netrw_hide && g:netrw_list_hide != ""
2257 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002258 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002259 if line("$") >= s:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002260
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002261 if g:netrw_sort_by =~ "^n"
2262 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002263
Bram Moolenaar83bab712005-08-01 21:58:57 +00002264 if v:version < 700
2265 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002266 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002267 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002268 else
2269 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002270 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002271 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002272
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002273 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002274 if v:version < 700
2275 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002276 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002277 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002278 else
2279 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002280 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002281 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2282 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002283
Bram Moolenaar8299df92004-07-10 09:47:34 +00002284 endif
2285 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002286 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002287
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002288 setlocal noma nomod nonu bh=hide nobl
2289 if has("netbeans_intg") || has("sun_workshop")
2290 let &autochdir= keep_autochdir
2291 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002292
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002293" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002294endfun
2295
2296" ---------------------------------------------------------------------
2297" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00002298fun! LocalBrowseList()
2299" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002300
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002301 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002302 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2303 let dirnamelen = strlen(b:netrw_curdir)
2304 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002305" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002306 if filelist != ""
2307 let filelist= filelist."\n"
2308 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002309 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002310" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2311
2312 " if the directory name includes a "$", and possibly other characters,
2313 " the glob() doesn't include "." and ".." entries.
2314 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2315" call Decho("forcibly tacking on .")
2316 if filelist == ""
2317 let filelist= dirname."."
2318 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002319 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002320 endif
2321" call Decho("filelist<".filelist.">")
2322 endif
2323 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2324" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002325 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002326" call Decho("filelist<".filelist.">")
2327 endif
2328 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2329
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002330" call Decho("dirname<".dirname.">")
2331" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002332" call Decho("filelist<".filelist.">")
2333
2334 while filelist != ""
2335 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002336 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002337 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2338 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002339 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002340 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002341 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002342 let pfile= filename
2343 if isdirectory(filename)
2344 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002345 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002346 if pfile =~ '//$'
2347 let pfile= substitute(pfile,'//$','/','e')
2348 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002349 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002350 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002351" call Decho(" ")
2352" call Decho("filename<".filename.">")
2353" call Decho("pfile <".pfile.">")
2354
Bram Moolenaar8299df92004-07-10 09:47:34 +00002355 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002356 let sz = getfsize(filename)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002357 if v:version <= 700
2358 let fsz = strpart(" ",1,15-strlen(sz)).sz
2359 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2360 else
2361 let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
2362 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002363" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002364 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002365
Bram Moolenaar8299df92004-07-10 09:47:34 +00002366 if g:netrw_sort_by =~ "^t"
2367 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002368" call Decho("getftime(".filename.")=".getftime(filename))
2369 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002370 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002371" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002372 let ftpfile= ft.'/'.pfile
2373 keepjumps put=ftpfile
2374
Bram Moolenaar8299df92004-07-10 09:47:34 +00002375 elseif g:netrw_sort_by =~ "^s"
2376 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002377" call Decho("getfsize(".filename.")=".getfsize(filename))
2378 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002379 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002380" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002381 let fszpfile= fsz.'/'.pfile
2382 keepjumps put =fszpfile
2383
Bram Moolenaar8299df92004-07-10 09:47:34 +00002384 else
2385 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002386" call Decho("exe keepjumps put ='".pfile."'")
2387 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002388 endif
2389 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002390 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002391
2392" call Dret("LocalBrowseList")
2393endfun
2394
2395" ---------------------------------------------------------------------
2396" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2397" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002398fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2399" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002400
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002401 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002402 let newdir = a:newdir
2403
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002404 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002405 " apparently vim is "recognizing" that it is in the home directory and
2406 " is removing the "/". Bad idea, so I have to put it back.
2407 let dirname= dirname.'/'
2408" call Decho("adjusting dirname<".dirname.">")
2409 endif
2410
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002411 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002412 " handling a file
2413 let dirname= dirname.newdir
2414" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002415 " this lets NetBrowseX avoid the edit
2416 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002417" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2418" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2419 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002420 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002421
2422 elseif newdir == './'
2423 " refresh the directory list
2424" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002425
2426 elseif newdir == '../'
2427 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002428 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002429" call Decho("go up one dir: dirname<".dirname.">")
2430
2431 else
2432 " go down one directory
2433 let dirname= dirname.newdir
2434" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2435 endif
2436
2437" call Dret("LocalBrowseChgDir <".dirname.">")
2438 return dirname
2439endfun
2440
2441" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002442" LocalBrowseRm: {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002443fun! <SID>LocalBrowseRm(path) range
2444" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2445" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2446
2447 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002448 let ctr = a:firstline
2449 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002450 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002451
2452 " remove multiple files and directories
2453 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002454 exe "keepjumps ".ctr
2455
2456 " sanity checks
2457 if line(".") < s:netrw_bannercnt
2458 let ctr= ctr + 1
2459 continue
2460 endif
2461 let curword= s:NetGetWord()
2462 if curword == "./" || curword == "../"
2463 let ctr= ctr + 1
2464 continue
2465 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002466
2467 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002468 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002469" call Decho("rmfile<".rmfile.">")
2470
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002471 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002472 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002473 if !all
2474 echohl Statement
2475 call inputsave()
2476 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2477 call inputrestore()
2478 echohl NONE
2479 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2480 if ok =~ 'a\%[ll]'
2481 let all= 1
2482 endif
2483 endif
2484
2485 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002486 let ret= delete(rmfile)
2487" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002488 elseif ok =~ 'q\%[uit]'
2489 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002490 endif
2491
2492 else
2493 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002494 if !all
2495 echohl Statement
2496 call inputsave()
2497 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2498 call inputrestore()
2499 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2500 if ok =~ 'a\%[ll]'
2501 let all= 1
2502 endif
2503 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002504 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002505
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002506 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002507" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2508 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002509" call Decho("v:shell_error=".v:shell_error)
2510
2511 if v:shell_error != 0
2512" call Decho("2nd attempt to remove directory<".rmfile.">")
2513 let errcode= delete(rmfile)
2514" call Decho("errcode=".errcode)
2515
2516 if errcode != 0
2517 if has("unix")
2518" call Decho("3rd attempt to remove directory<".rmfile.">")
2519 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002520 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002521 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002522 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002523 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002524 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002525 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002526 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002527 endif
2528 endif
2529 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002530
2531 elseif ok =~ 'q\%[uit]'
2532 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002533 endif
2534 endif
2535
2536 let ctr= ctr + 1
2537 endwhile
2538
2539 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002540 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002541" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002542 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002543 exe curline
2544
2545" call Dret("LocalBrowseRm")
2546endfun
2547
2548" ---------------------------------------------------------------------
2549" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002550fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002551" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2552
2553 " preparation for removing multiple files/directories
2554 let ctr= a:firstline
2555
2556 " attempt to rename files/directories
2557 while ctr <= a:lastline
2558 exe "keepjumps ".ctr
2559
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002560 " sanity checks
2561 if line(".") < s:netrw_bannercnt
2562 let ctr= ctr + 1
2563 continue
2564 endif
2565 let curword= s:NetGetWord()
2566 if curword == "./" || curword == "../"
2567 let ctr= ctr + 1
2568 continue
2569 endif
2570
Bram Moolenaar8299df92004-07-10 09:47:34 +00002571 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002572 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002573" call Decho("oldname<".oldname.">")
2574
2575 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002576 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002577 call inputrestore()
2578
Bram Moolenaar83bab712005-08-01 21:58:57 +00002579 let ret= rename(oldname,newname)
2580" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002581
2582 let ctr= ctr + 1
2583 endwhile
2584
2585 " refresh the directory
2586 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002587" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002588 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002589 exe "keepjumps ".curline
2590" call Dret("LocalBrowseRename")
2591endfun
2592
2593" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002594" LocalPreview: {{{2
2595fun! <SID>LocalPreview(path) range
2596" call Dfunc("LocalPreview(path<".a:path.">)")
2597 if has("quickfix")
2598 if !isdirectory(a:path)
2599 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002600 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002601 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002602 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002603 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002604 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002605 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002606 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002607 endif
2608" call Dret("LocalPreview")
2609endfun
2610
2611" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002612" LocalRefresh: {{{2
2613fun! <SID>LocalRefresh(dirname)
2614" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2615 set ma
2616 %d
2617 call <SID>LocalBrowse(a:dirname)
2618 redraw!
2619" call Dret("LocalRefresh")
2620endfun
2621
2622" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002623" Explore: launch the local browser in the directory of the current file {{{2
2624" dosplit==0: the window will be split iff the current file has
2625" been modified
2626" dosplit==1: the window will be split before running the local
2627" browser
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002628fun! s:Explore(indx,dosplit,style,...)
2629" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002630
2631 " if dosplit or file has been modified
2632 if a:dosplit || &modified
2633 if a:style == 0 " Explore, Sexplore
2634 exe g:netrw_winsize."wincmd s"
2635 elseif a:style == 1 "Explore!, Sexplore!
2636 exe g:netrw_winsize."wincmd v"
2637 elseif a:style == 2 " Hexplore
2638 exe "bel ".g:netrw_winsize."wincmd s"
2639 elseif a:style == 3 " Hexplore!
2640 exe "abo ".g:netrw_winsize."wincmd s"
2641 elseif a:style == 4 " Vexplore
2642 exe "lefta ".g:netrw_winsize."wincmd v"
2643 elseif a:style == 5 " Vexplore!
2644 exe "rightb ".g:netrw_winsize."wincmd v"
2645 endif
2646 endif
2647 norm! 0
2648
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002649 if a:1 == "" && a:indx >= 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002650 let newdir= substitute(expand("%:p"),'^\(.*\)[/\\][^/\\]*$','\1','e')
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002651" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2652 call s:LocalBrowse(newdir)
2653
Bram Moolenaar572cb562005-08-05 21:35:02 +00002654 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002655
2656 if has("path_extra")
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002657 if !exists("s:explore_indx")
2658 let s:explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002659 endif
2660 let indx = a:indx
2661 if indx == -1
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002662 let indx= s:explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002663 elseif indx == -2
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002664 let indx= s:explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002665 else
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002666 let s:explore_indx = 0
2667 if !exists("b:netrw_curdir")
2668 let b:netrw_curdir = "."
2669 endif
2670 let s:explorelist = split(expand(b:netrw_curdir."/".a:1),'\n')
2671 let s:explore_listlen = len(s:explorelist)
2672 if s:explore_listlen == 1 && s:explorelist[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00002673 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
2674 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2675" call Dret("Explore")
2676 return
2677 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002678 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002679
2680 " NetrwStatusLine support
2681 let s:explore_indx = indx
2682 if !exists("s:netrw_explore_stl")
2683 let s:netrw_explore_stl= &stl
2684 endif
2685 set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
2686" call Decho("explorelist<".join(s:explorelist,',')."> len=".s:explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002687
2688 " sanity check
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002689 if indx >= s:explore_listlen || indx < 0
2690 let indx= (indx < 0)? 0 : ( s:explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00002691 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002692 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2693" call Dret("Explore")
2694 return
2695 endif
2696
2697 exe "let dirfile= s:explorelist[".indx."]"
2698" call Decho("dirfile<".dirfile."> indx=".indx)
2699 let newdir= substitute(dirfile,'/[^/]*$','','e')
2700" call Decho("newdir<".newdir.">")
2701" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2702 call s:LocalBrowse(newdir)
2703 call search(substitute(dirfile,"^.*/","",""),"W")
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002704 let s:explore_mtchcnt = indx + 1
2705 let s:explore_bufnr = bufnr(".")
2706 let s:explore_line = line(".")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002707
2708 else
2709 if v:version < 700
Bram Moolenaar572cb562005-08-05 21:35:02 +00002710 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for Exploring with **!" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002711 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002712 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 +00002713 endif
2714 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2715 endif
2716
Bram Moolenaar83bab712005-08-01 21:58:57 +00002717 else
2718 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002719" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2720 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002721 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002722
2723" call Dret("Explore")
2724endfun
2725
2726" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002727" NetrwStatusLine: {{{2
2728fun! NetrwStatusLine()
2729 let g:explore_bufnr= s:explore_bufnr
2730 let g:explore_line= s:explore_line
2731 if !exists("s:explore_bufnr") || s:explore_bufnr != bufnr(".") || !exists("s:explore_line") || s:explore_line != line(".")
2732 let &stl= s:netrw_explore_stl
2733 return ""
2734 else
2735 return "Match ".s:explore_mtchcnt." of ".s:explore_listlen
2736 endif
2737endfun
2738
2739" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002740" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002741" Change backslashes to forward slashes, if any.
2742" If doesc is true, escape certain troublesome characters
2743fun! <SID>NetGetcwd(doesc)
2744" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2745 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002746 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002747 let curdir= curdir.'/'
2748 endif
2749 if a:doesc
2750 let curdir= escape(curdir,s:netrw_cd_escape)
2751 endif
2752" call Dret("NetGetcwd <".curdir.">")
2753 return curdir
2754endfun
2755
2756" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002757" NetMethod: determine method of transfer {{{1
2758" method == 1: rcp
2759" 2: ftp + <.netrc>
2760" 3: ftp + machine, id, password, and [path]filename
2761" 4: scp
2762" 5: http (wget)
2763" 6: cadaver
2764" 7: rsync
2765" 8: fetch
2766" 9: sftp
2767fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002768" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002769
2770 " initialization
2771 let b:netrw_method = 0
2772 let g:netrw_machine = ""
2773 let b:netrw_fname = ""
2774 let g:netrw_port = ""
2775
2776 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002777 " mipf : a:machine a:id password filename Use ftp
2778 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002779 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002780 " rcpurm : rcp://[user@]host/filename Use rcp
2781 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002782 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002783 " httpurm : http://[user@]host/filename Use wget
2784 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002785 " rsyncurm : rsync://host[:port]/path Use rsync
2786 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2787 " sftpurm : sftp://[user@]host/filename Use scp
2788 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2789 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2790 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002791 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002792 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2793 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2794 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002795 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002796 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2797 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2798 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2799
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002800" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002801 " Determine Method
2802 " rcp://user@hostname/...path-to-file
2803 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002804" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002805 let b:netrw_method = 1
2806 let userid = substitute(a:choice,rcpurm,'\1',"")
2807 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2808 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002809 if userid != ""
2810 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002811 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002812
2813 " scp://user@hostname/...path-to-file
2814 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002815" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002816 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002817 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2818 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2819 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002820
2821 " http://user@hostname/...path-to-file
2822 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002823" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002824 let b:netrw_method = 5
2825 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2826 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2827
2828 " dav://hostname[:port]/..path-to-file..
2829 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002830" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002831 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002832 if a:choice =~ '^s'
2833 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2834 else
2835 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2836 endif
2837 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002838
2839 " rsync://user@hostname/...path-to-file
2840 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002841" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002842 let b:netrw_method = 7
2843 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2844 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2845
2846 " ftp://[user@]hostname[[:#]port]/...path-to-file
2847 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002848" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002849 let userid = substitute(a:choice,ftpurm,'\2',"")
2850 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2851 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2852 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002853 if userid != ""
2854 let g:netrw_uid= userid
2855 endif
2856 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2857 let b:netrw_method = 3
2858 else
2859 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2860 let b:netrw_method= 2
2861 else
2862 if !exists("g:netrw_uid") || g:netrw_uid == ""
2863 call NetUserPass()
2864 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2865 call NetUserPass(g:netrw_uid)
2866 " else just use current g:netrw_uid and g:netrw_passwd
2867 endif
2868 let b:netrw_method= 3
2869 endif
2870 endif
2871
2872 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002873" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002874 let b:netrw_method = 8
2875 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2876 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2877 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2878 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2879
2880 " Issue an ftp : "machine id password [path/]filename"
2881 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002882" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002883 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002884 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2885 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2886 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2887 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2888
2889 " Issue an ftp: "hostname [path/]filename"
2890 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002891" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002892 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2893 let b:netrw_method = 3
2894 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2895 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2896
2897 elseif filereadable(expand("$HOME/.netrc"))
2898 let b:netrw_method = 2
2899 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2900 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2901 endif
2902
2903 " sftp://user@hostname/...path-to-file
2904 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002905" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002906 let b:netrw_method = 9
2907 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2908 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2909
2910 " Issue an rcp: hostname:filename" (this one should be last)
2911 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002912" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002913 let b:netrw_method = 1
2914 let userid = substitute(a:choice,rcphf,'\2',"")
2915 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2916 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002917" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2918" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2919" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2920" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002921 if userid != ""
2922 let g:netrw_uid= userid
2923 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002924 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002925 " don't let PCs try <.netrc>
2926 let b:netrw_method = 3
2927 endif
2928
2929 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002930 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002931 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002932 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002933 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002934 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002935 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00002936
2937 " remove any leading [:#] from port number
2938 if g:netrw_port != ""
2939 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2940 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002941
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002942" call Decho("a:choice <".a:choice.">")
2943" call Decho("b:netrw_method <".b:netrw_method.">")
2944" call Decho("g:netrw_machine<".g:netrw_machine.">")
2945" call Decho("g:netrw_port <".g:netrw_port.">")
2946" if exists("g:netrw_uid") "Decho
2947" call Decho("g:netrw_uid <".g:netrw_uid.">")
2948" endif "Decho
2949" if exists("g:netrw_passwd") "Decho
2950" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2951" endif "Decho
2952" call Decho("b:netrw_fname <".b:netrw_fname.">")
2953" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002954endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002955
2956" ------------------------------------------------------------------------
2957" NetUserPass: set username and password for subsequent ftp transfer {{{1
2958" Usage: :call NetUserPass() -- will prompt for userid and password
2959" :call NetUserPass("uid") -- will prompt for password
2960" :call NetUserPass("uid","password") -- sets global userid and password
2961fun! NetUserPass(...)
2962
2963 " get/set userid
2964 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002965" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002966 if !exists("g:netrw_uid") || g:netrw_uid == ""
2967 " via prompt
2968 let g:netrw_uid= input('Enter username: ')
2969 endif
2970 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002971" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002972 let g:netrw_uid= a:1
2973 endif
2974
2975 " get password
2976 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002977" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002978 let g:netrw_passwd= inputsecret("Enter Password: ")
2979 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002980" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002981 let g:netrw_passwd=a:2
2982 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002983" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002984endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002985
2986" ------------------------------------------------------------------------
2987" NetOptionSave: save options and set to "standard" form {{{1
2988fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002989" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002990
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002991 " Get Temporary Filename
2992 let s:aikeep = &ai
2993 let s:cinkeep = &cin
2994 let s:cinokeep = &cino
2995 let s:comkeep = &com
2996 let s:cpokeep = &cpo
2997 let s:dirkeep = getcwd()
2998 let s:gdkeep = &gd
2999 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003000 setlocal cino =
3001 setlocal com =
3002 setlocal cpo -=aA
3003 setlocal nocin noai
3004 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003005 if has("win32") && !has("win95")
3006 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003007 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003008" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003009 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003010
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003011" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003012endfun
3013
3014" ------------------------------------------------------------------------
3015" NetOptionRestore: restore options {{{1
3016fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003017" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003018
3019 let &ai = s:aikeep
3020 let &cin = s:cinkeep
3021 let &cino = s:cinokeep
3022 let &com = s:comkeep
3023 let &cpo = s:cpokeep
3024 exe "lcd ".s:dirkeep
3025 let &gd = s:gdkeep
3026 let &tw = s:twkeep
3027 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003028 if &directory == ""
3029 " user hasn't specified a swapfile directory;
3030 " netrw will temporarily make the swapfile
3031 " directory the current local one.
3032 let &directory = getcwd()
3033 silent! let &swf = s:swfkeep
3034 set directory=
3035 else
3036 let &swf= s:swfkeep
3037 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003038 unlet s:swfkeep
3039 endif
3040 unlet s:aikeep
3041 unlet s:cinkeep
3042 unlet s:cinokeep
3043 unlet s:comkeep
3044 unlet s:cpokeep
3045 unlet s:gdkeep
3046 unlet s:twkeep
3047 unlet s:dirkeep
3048
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003049" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003050endfun
3051
3052" ------------------------------------------------------------------------
3053" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003054" to handle extra junk that their system's ftp dumps
3055" into the transfer. This function is provided as an
3056" example and as a fix for a Windows 95 problem: in my
3057" experience, win95's ftp always dumped four blank lines
3058" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003059if has("win95") && g:netrw_win95ftp
3060 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003061" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003062 if method == 3 " ftp (no <.netrc>)
3063 let fourblanklines= line2 - 3
3064 silent fourblanklines.",".line2."g/^\s*/d"
3065 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003066" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003067 endfun
3068endif
3069
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003070" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003071" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003072if v:version < 700
3073 fun! <SID>NetSort() range
3074" " call Dfunc("NetSort()")
3075
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003076 let i = a:firstline + 1
3077 while i <= a:lastline
3078 " find insertion point via binary search
3079 let i_val = getline(i)
3080 let lo = a:firstline
3081 let hi = i
3082 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003083 let mid = (lo + hi) / 2
3084 let mid_val = getline(mid)
3085 if g:netrw_sort_direction =~ '^n'
3086 " normal sorting order
3087 if i_val < mid_val
3088 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003089 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003090 let lo = mid + 1
3091 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003092 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003093 else
3094 " reverse sorting order
3095 if i_val > mid_val
3096 let hi = mid
3097 else
3098 let lo = mid + 1
3099 if i_val == mid_val | break | endif
3100 endif
3101 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003102 endwhile
3103 " do insert
3104 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003105 exe 'keepjumps '.i.'d_'
3106 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003107 endif
3108 let i = i + 1
3109 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003110
3111" " call Dret("NetSort")
3112 endfun
3113endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003114
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003115" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003116" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3117" What this function does is to compute a priority for the patterns
3118" in the g:netrw_sort_sequence. It applies a substitute to any
3119" "files" that satisfy each pattern, putting the priority / in
3120" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003121fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003122" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003123 if g:netrw_longlist
3124 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3125 else
3126 let seqlist = g:netrw_sort_sequence
3127 endif
3128 " sanity check -- insure that * appears somewhere
3129 if seqlist == ""
3130 let seqlist= '*'
3131 elseif seqlist !~ '\*'
3132 let seqlist= seqlist.',*'
3133 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003134 let priority = 1
3135 while seqlist != ""
3136 if seqlist =~ ','
3137 let seq = substitute(seqlist,',.*$','','e')
3138 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3139 else
3140 let seq = seqlist
3141 let seqlist = ""
3142 endif
3143 let eseq= escape(seq,'/')
3144 if priority < 10
3145 let spriority= "00".priority.'\/'
3146 elseif priority < 100
3147 let spriority= "0".priority.'\/'
3148 else
3149 let spriority= priority.'\/'
3150 endif
3151" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3152
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003153 " sanity check
3154 if s:netrw_bannercnt > line("$")
3155 " apparently no files were left after a Hiding pattern was used
3156" call Dret("SetSort : no files left after hiding")
3157 return
3158 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003159 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003160 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003161 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003162 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003163 endif
3164 let priority = priority + 1
3165 endwhile
3166
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003167 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003168
3169" call Dret("SetSort")
3170endfun
3171
Bram Moolenaar83bab712005-08-01 21:58:57 +00003172let &cpo= s:keepcpo
3173unlet s:keepcpo
Bram Moolenaar071d4272004-06-13 20:20:40 +00003174" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003175" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003176" vim:ts=8 fdm=marker