blob: 79a7939223ac25f6e35140d310777264c7af5dbe [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar572cb562005-08-05 21:35:02 +00002" Last Change: Aug 05, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar572cb562005-08-05 21:35:02 +00004" Version: 58e ASTRO-ONLY
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 Moolenaar572cb562005-08-05 21:35:02 +000025let g:loaded_netrw = "v58e"
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 Moolenaar572cb562005-08-05 21:35:02 +00002153 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002154
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002155 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002156 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002157
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002158 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002159 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002160
Bram Moolenaar8299df92004-07-10 09:47:34 +00002161 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002162" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002163 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 +00002164 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 +00002165 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002166 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 +00002167 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2168 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2169 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2170 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2171 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002172 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002173 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>
2174 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 +00002175 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2176 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>
2177 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>
2178 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002179 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2180 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002181 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 +00002182 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 +00002183 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2184 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2185 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002186 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2187 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2188 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2189 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2190 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2191 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002192 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002193 nnoremap <buffer> ? :he netrw-dir<cr>
2194
2195 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002196" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002197 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002198 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002199 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002200 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002201 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002202
2203 let sortby= g:netrw_sort_by
2204 if g:netrw_sort_direction =~ "^r"
2205 let sortby= sortby." reversed"
2206 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002207
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002208 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002209 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002210" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002211 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002212 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002213 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002214 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002215 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002216" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002217 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002218 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002219 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002220 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002221
2222 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002223 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002224 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002225 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002226 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002227 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002228 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002229 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002230 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002231 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2232 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002233 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2234
2235 " bannercnt should index the line just after the banner
2236 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2237" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002238
2239 " generate the requested directory listing
Bram Moolenaar83bab712005-08-01 21:58:57 +00002240 call LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002241
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002242 " set up syntax highlighting
2243 if has("syntax")
2244 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002245 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002246 setlocal ft=
2247 endif
2248 endif
2249
Bram Moolenaar8299df92004-07-10 09:47:34 +00002250 " manipulate the directory listing (hide, sort)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002251 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002252 if g:netrw_hide && g:netrw_list_hide != ""
2253 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002254 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002255 if line("$") >= s:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002256
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002257 if g:netrw_sort_by =~ "^n"
2258 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002259
Bram Moolenaar83bab712005-08-01 21:58:57 +00002260 if v:version < 700
2261 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002262 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002263 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002264 else
2265 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002266 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002267 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002268
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002269 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002270 if v:version < 700
2271 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002272 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002273 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002274 else
2275 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002276 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002277 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2278 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002279
Bram Moolenaar8299df92004-07-10 09:47:34 +00002280 endif
2281 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002282 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002283
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002284 setlocal noma nomod nonu bh=hide nobl
2285 if has("netbeans_intg") || has("sun_workshop")
2286 let &autochdir= keep_autochdir
2287 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002288
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002289" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002290endfun
2291
2292" ---------------------------------------------------------------------
2293" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00002294fun! LocalBrowseList()
2295" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002296
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002297 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002298 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2299 let dirnamelen = strlen(b:netrw_curdir)
2300 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002301" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002302 if filelist != ""
2303 let filelist= filelist."\n"
2304 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002305 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002306" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2307
2308 " if the directory name includes a "$", and possibly other characters,
2309 " the glob() doesn't include "." and ".." entries.
2310 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2311" call Decho("forcibly tacking on .")
2312 if filelist == ""
2313 let filelist= dirname."."
2314 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002315 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002316 endif
2317" call Decho("filelist<".filelist.">")
2318 endif
2319 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2320" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002321 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002322" call Decho("filelist<".filelist.">")
2323 endif
2324 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2325
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002326" call Decho("dirname<".dirname.">")
2327" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002328" call Decho("filelist<".filelist.">")
2329
2330 while filelist != ""
2331 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002332 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002333 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2334 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002335 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002336 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002337 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002338 let pfile= filename
2339 if isdirectory(filename)
2340 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002341 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002342 if pfile =~ '//$'
2343 let pfile= substitute(pfile,'//$','/','e')
2344 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002345 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002346 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002347" call Decho(" ")
2348" call Decho("filename<".filename.">")
2349" call Decho("pfile <".pfile.">")
2350
Bram Moolenaar8299df92004-07-10 09:47:34 +00002351 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002352 let sz = getfsize(filename)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002353 if v:version <= 700
2354 let fsz = strpart(" ",1,15-strlen(sz)).sz
2355 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2356 else
2357 let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
2358 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002359" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002360 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002361
Bram Moolenaar8299df92004-07-10 09:47:34 +00002362 if g:netrw_sort_by =~ "^t"
2363 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002364" call Decho("getftime(".filename.")=".getftime(filename))
2365 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002366 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002367" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002368 let ftpfile= ft.'/'.pfile
2369 keepjumps put=ftpfile
2370
Bram Moolenaar8299df92004-07-10 09:47:34 +00002371 elseif g:netrw_sort_by =~ "^s"
2372 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002373" call Decho("getfsize(".filename.")=".getfsize(filename))
2374 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002375 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002376" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002377 let fszpfile= fsz.'/'.pfile
2378 keepjumps put =fszpfile
2379
Bram Moolenaar8299df92004-07-10 09:47:34 +00002380 else
2381 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002382" call Decho("exe keepjumps put ='".pfile."'")
2383 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002384 endif
2385 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002386 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002387
2388" call Dret("LocalBrowseList")
2389endfun
2390
2391" ---------------------------------------------------------------------
2392" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2393" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002394fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2395" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002396
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002397 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002398 let newdir = a:newdir
2399
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002400 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002401 " apparently vim is "recognizing" that it is in the home directory and
2402 " is removing the "/". Bad idea, so I have to put it back.
2403 let dirname= dirname.'/'
2404" call Decho("adjusting dirname<".dirname.">")
2405 endif
2406
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002407 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002408 " handling a file
2409 let dirname= dirname.newdir
2410" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002411 " this lets NetBrowseX avoid the edit
2412 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002413" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2414" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2415 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002416 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002417
2418 elseif newdir == './'
2419 " refresh the directory list
2420" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002421
2422 elseif newdir == '../'
2423 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002424 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002425" call Decho("go up one dir: dirname<".dirname.">")
2426
2427 else
2428 " go down one directory
2429 let dirname= dirname.newdir
2430" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2431 endif
2432
2433" call Dret("LocalBrowseChgDir <".dirname.">")
2434 return dirname
2435endfun
2436
2437" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002438" LocalBrowseRm: {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002439fun! <SID>LocalBrowseRm(path) range
2440" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2441" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2442
2443 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002444 let ctr = a:firstline
2445 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002446 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002447
2448 " remove multiple files and directories
2449 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002450 exe "keepjumps ".ctr
2451
2452 " sanity checks
2453 if line(".") < s:netrw_bannercnt
2454 let ctr= ctr + 1
2455 continue
2456 endif
2457 let curword= s:NetGetWord()
2458 if curword == "./" || curword == "../"
2459 let ctr= ctr + 1
2460 continue
2461 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002462
2463 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002464 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002465" call Decho("rmfile<".rmfile.">")
2466
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002467 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002468 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002469 if !all
2470 echohl Statement
2471 call inputsave()
2472 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2473 call inputrestore()
2474 echohl NONE
2475 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2476 if ok =~ 'a\%[ll]'
2477 let all= 1
2478 endif
2479 endif
2480
2481 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002482 let ret= delete(rmfile)
2483" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002484 elseif ok =~ 'q\%[uit]'
2485 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002486 endif
2487
2488 else
2489 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002490 if !all
2491 echohl Statement
2492 call inputsave()
2493 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2494 call inputrestore()
2495 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2496 if ok =~ 'a\%[ll]'
2497 let all= 1
2498 endif
2499 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002500 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002501
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002502 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002503" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2504 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002505" call Decho("v:shell_error=".v:shell_error)
2506
2507 if v:shell_error != 0
2508" call Decho("2nd attempt to remove directory<".rmfile.">")
2509 let errcode= delete(rmfile)
2510" call Decho("errcode=".errcode)
2511
2512 if errcode != 0
2513 if has("unix")
2514" call Decho("3rd attempt to remove directory<".rmfile.">")
2515 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002516 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002517 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002518 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002519 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002520 elseif !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
2524 endif
2525 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002526
2527 elseif ok =~ 'q\%[uit]'
2528 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002529 endif
2530 endif
2531
2532 let ctr= ctr + 1
2533 endwhile
2534
2535 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002536 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002537" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002538 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002539 exe curline
2540
2541" call Dret("LocalBrowseRm")
2542endfun
2543
2544" ---------------------------------------------------------------------
2545" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002546fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002547" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2548
2549 " preparation for removing multiple files/directories
2550 let ctr= a:firstline
2551
2552 " attempt to rename files/directories
2553 while ctr <= a:lastline
2554 exe "keepjumps ".ctr
2555
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002556 " sanity checks
2557 if line(".") < s:netrw_bannercnt
2558 let ctr= ctr + 1
2559 continue
2560 endif
2561 let curword= s:NetGetWord()
2562 if curword == "./" || curword == "../"
2563 let ctr= ctr + 1
2564 continue
2565 endif
2566
Bram Moolenaar8299df92004-07-10 09:47:34 +00002567 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002568 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002569" call Decho("oldname<".oldname.">")
2570
2571 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002572 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002573 call inputrestore()
2574
Bram Moolenaar83bab712005-08-01 21:58:57 +00002575 let ret= rename(oldname,newname)
2576" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002577
2578 let ctr= ctr + 1
2579 endwhile
2580
2581 " refresh the directory
2582 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002583" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002584 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002585 exe "keepjumps ".curline
2586" call Dret("LocalBrowseRename")
2587endfun
2588
2589" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002590" LocalPreview: {{{2
2591fun! <SID>LocalPreview(path) range
2592" call Dfunc("LocalPreview(path<".a:path.">)")
2593 if has("quickfix")
2594 if !isdirectory(a:path)
2595 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002596 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002597 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002598 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002599 endif
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, to preview your vim needs the quickfix feature compiled in" | 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
2604" call Dret("LocalPreview")
2605endfun
2606
2607" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002608" LocalRefresh: {{{2
2609fun! <SID>LocalRefresh(dirname)
2610" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2611 set ma
2612 %d
2613 call <SID>LocalBrowse(a:dirname)
2614 redraw!
2615" call Dret("LocalRefresh")
2616endfun
2617
2618" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002619" Explore: launch the local browser in the directory of the current file {{{2
2620" dosplit==0: the window will be split iff the current file has
2621" been modified
2622" dosplit==1: the window will be split before running the local
2623" browser
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002624fun! s:Explore(indx,dosplit,style,...)
2625" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002626
2627 " if dosplit or file has been modified
2628 if a:dosplit || &modified
2629 if a:style == 0 " Explore, Sexplore
2630 exe g:netrw_winsize."wincmd s"
2631 elseif a:style == 1 "Explore!, Sexplore!
2632 exe g:netrw_winsize."wincmd v"
2633 elseif a:style == 2 " Hexplore
2634 exe "bel ".g:netrw_winsize."wincmd s"
2635 elseif a:style == 3 " Hexplore!
2636 exe "abo ".g:netrw_winsize."wincmd s"
2637 elseif a:style == 4 " Vexplore
2638 exe "lefta ".g:netrw_winsize."wincmd v"
2639 elseif a:style == 5 " Vexplore!
2640 exe "rightb ".g:netrw_winsize."wincmd v"
2641 endif
2642 endif
2643 norm! 0
2644
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002645 if a:1 == "" && a:indx >= 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002646 let newdir= substitute(expand("%:p"),'^\(.*\)[/\\][^/\\]*$','\1','e')
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002647" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2648 call s:LocalBrowse(newdir)
2649
Bram Moolenaar572cb562005-08-05 21:35:02 +00002650 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002651
2652 if has("path_extra")
2653 if !exists("s:indx")
2654 let s:indx= 0
2655 endif
2656 let indx = a:indx
2657 if indx == -1
2658 let indx= s:indx + 1
2659 elseif indx == -2
2660 let indx= s:indx - 1
2661 else
2662 let s:indx = 0
2663 let s:explorelist = split(expand(b:netrw_curdir."/".a:1),'\n')
2664 let s:listlen = len(s:explorelist)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002665 if s:listlen == 1 && s:explorelist[0] =~ '\*\*\/'
2666 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
2667 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2668" call Dret("Explore")
2669 return
2670 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002671 endif
2672 let s:indx = indx
2673" call Decho("explorelist<".join(s:explorelist,',')."> len=".s:listlen)
2674
2675 " sanity check
Bram Moolenaar572cb562005-08-05 21:35:02 +00002676 if indx >= s:listlen || indx < 0
2677 let indx= (indx < 0)? 0 : ( s:listlen - 1 )
2678 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002679 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2680" call Dret("Explore")
2681 return
2682 endif
2683
2684 exe "let dirfile= s:explorelist[".indx."]"
2685" call Decho("dirfile<".dirfile."> indx=".indx)
2686 let newdir= substitute(dirfile,'/[^/]*$','','e')
2687" call Decho("newdir<".newdir.">")
2688" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2689 call s:LocalBrowse(newdir)
2690 call search(substitute(dirfile,"^.*/","",""),"W")
2691
2692 else
2693 if v:version < 700
Bram Moolenaar572cb562005-08-05 21:35:02 +00002694 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for Exploring with **!" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002695 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002696 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 +00002697 endif
2698 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2699 endif
2700
Bram Moolenaar83bab712005-08-01 21:58:57 +00002701 else
2702 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002703" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2704 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002705 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002706
2707" call Dret("Explore")
2708endfun
2709
2710" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002711" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002712" Change backslashes to forward slashes, if any.
2713" If doesc is true, escape certain troublesome characters
2714fun! <SID>NetGetcwd(doesc)
2715" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2716 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002717 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002718 let curdir= curdir.'/'
2719 endif
2720 if a:doesc
2721 let curdir= escape(curdir,s:netrw_cd_escape)
2722 endif
2723" call Dret("NetGetcwd <".curdir.">")
2724 return curdir
2725endfun
2726
2727" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002728" NetMethod: determine method of transfer {{{1
2729" method == 1: rcp
2730" 2: ftp + <.netrc>
2731" 3: ftp + machine, id, password, and [path]filename
2732" 4: scp
2733" 5: http (wget)
2734" 6: cadaver
2735" 7: rsync
2736" 8: fetch
2737" 9: sftp
2738fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002739" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002740
2741 " initialization
2742 let b:netrw_method = 0
2743 let g:netrw_machine = ""
2744 let b:netrw_fname = ""
2745 let g:netrw_port = ""
2746
2747 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002748 " mipf : a:machine a:id password filename Use ftp
2749 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002750 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002751 " rcpurm : rcp://[user@]host/filename Use rcp
2752 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002753 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002754 " httpurm : http://[user@]host/filename Use wget
2755 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002756 " rsyncurm : rsync://host[:port]/path Use rsync
2757 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2758 " sftpurm : sftp://[user@]host/filename Use scp
2759 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2760 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2761 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002762 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002763 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2764 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2765 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002766 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002767 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2768 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2769 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2770
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002771" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002772 " Determine Method
2773 " rcp://user@hostname/...path-to-file
2774 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002775" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002776 let b:netrw_method = 1
2777 let userid = substitute(a:choice,rcpurm,'\1',"")
2778 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2779 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002780 if userid != ""
2781 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002782 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002783
2784 " scp://user@hostname/...path-to-file
2785 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002786" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002787 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002788 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2789 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2790 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002791
2792 " http://user@hostname/...path-to-file
2793 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002794" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002795 let b:netrw_method = 5
2796 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2797 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2798
2799 " dav://hostname[:port]/..path-to-file..
2800 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002801" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002802 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002803 if a:choice =~ '^s'
2804 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2805 else
2806 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2807 endif
2808 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002809
2810 " rsync://user@hostname/...path-to-file
2811 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002812" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002813 let b:netrw_method = 7
2814 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2815 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2816
2817 " ftp://[user@]hostname[[:#]port]/...path-to-file
2818 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002819" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002820 let userid = substitute(a:choice,ftpurm,'\2',"")
2821 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2822 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2823 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002824 if userid != ""
2825 let g:netrw_uid= userid
2826 endif
2827 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2828 let b:netrw_method = 3
2829 else
2830 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2831 let b:netrw_method= 2
2832 else
2833 if !exists("g:netrw_uid") || g:netrw_uid == ""
2834 call NetUserPass()
2835 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2836 call NetUserPass(g:netrw_uid)
2837 " else just use current g:netrw_uid and g:netrw_passwd
2838 endif
2839 let b:netrw_method= 3
2840 endif
2841 endif
2842
2843 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002844" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002845 let b:netrw_method = 8
2846 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2847 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2848 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2849 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2850
2851 " Issue an ftp : "machine id password [path/]filename"
2852 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002853" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002854 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002855 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2856 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2857 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2858 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2859
2860 " Issue an ftp: "hostname [path/]filename"
2861 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002862" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002863 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2864 let b:netrw_method = 3
2865 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2866 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2867
2868 elseif filereadable(expand("$HOME/.netrc"))
2869 let b:netrw_method = 2
2870 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2871 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2872 endif
2873
2874 " sftp://user@hostname/...path-to-file
2875 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002876" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002877 let b:netrw_method = 9
2878 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2879 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2880
2881 " Issue an rcp: hostname:filename" (this one should be last)
2882 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002883" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002884 let b:netrw_method = 1
2885 let userid = substitute(a:choice,rcphf,'\2',"")
2886 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2887 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002888" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2889" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2890" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2891" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002892 if userid != ""
2893 let g:netrw_uid= userid
2894 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002895 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002896 " don't let PCs try <.netrc>
2897 let b:netrw_method = 3
2898 endif
2899
2900 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002901 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002902 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002903 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002904 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002905 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002906 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00002907
2908 " remove any leading [:#] from port number
2909 if g:netrw_port != ""
2910 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2911 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002912
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002913" call Decho("a:choice <".a:choice.">")
2914" call Decho("b:netrw_method <".b:netrw_method.">")
2915" call Decho("g:netrw_machine<".g:netrw_machine.">")
2916" call Decho("g:netrw_port <".g:netrw_port.">")
2917" if exists("g:netrw_uid") "Decho
2918" call Decho("g:netrw_uid <".g:netrw_uid.">")
2919" endif "Decho
2920" if exists("g:netrw_passwd") "Decho
2921" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2922" endif "Decho
2923" call Decho("b:netrw_fname <".b:netrw_fname.">")
2924" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002925endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002926
2927" ------------------------------------------------------------------------
2928" NetUserPass: set username and password for subsequent ftp transfer {{{1
2929" Usage: :call NetUserPass() -- will prompt for userid and password
2930" :call NetUserPass("uid") -- will prompt for password
2931" :call NetUserPass("uid","password") -- sets global userid and password
2932fun! NetUserPass(...)
2933
2934 " get/set userid
2935 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002936" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002937 if !exists("g:netrw_uid") || g:netrw_uid == ""
2938 " via prompt
2939 let g:netrw_uid= input('Enter username: ')
2940 endif
2941 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002942" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002943 let g:netrw_uid= a:1
2944 endif
2945
2946 " get password
2947 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002948" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002949 let g:netrw_passwd= inputsecret("Enter Password: ")
2950 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002951" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002952 let g:netrw_passwd=a:2
2953 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002954" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002955endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002956
2957" ------------------------------------------------------------------------
2958" NetOptionSave: save options and set to "standard" form {{{1
2959fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002960" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002961
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002962 " Get Temporary Filename
2963 let s:aikeep = &ai
2964 let s:cinkeep = &cin
2965 let s:cinokeep = &cino
2966 let s:comkeep = &com
2967 let s:cpokeep = &cpo
2968 let s:dirkeep = getcwd()
2969 let s:gdkeep = &gd
2970 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002971 setlocal cino =
2972 setlocal com =
2973 setlocal cpo -=aA
2974 setlocal nocin noai
2975 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002976 if has("win32") && !has("win95")
2977 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002978 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002979" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002980 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002981
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002982" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002983endfun
2984
2985" ------------------------------------------------------------------------
2986" NetOptionRestore: restore options {{{1
2987fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002988" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002989
2990 let &ai = s:aikeep
2991 let &cin = s:cinkeep
2992 let &cino = s:cinokeep
2993 let &com = s:comkeep
2994 let &cpo = s:cpokeep
2995 exe "lcd ".s:dirkeep
2996 let &gd = s:gdkeep
2997 let &tw = s:twkeep
2998 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002999 if &directory == ""
3000 " user hasn't specified a swapfile directory;
3001 " netrw will temporarily make the swapfile
3002 " directory the current local one.
3003 let &directory = getcwd()
3004 silent! let &swf = s:swfkeep
3005 set directory=
3006 else
3007 let &swf= s:swfkeep
3008 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003009 unlet s:swfkeep
3010 endif
3011 unlet s:aikeep
3012 unlet s:cinkeep
3013 unlet s:cinokeep
3014 unlet s:comkeep
3015 unlet s:cpokeep
3016 unlet s:gdkeep
3017 unlet s:twkeep
3018 unlet s:dirkeep
3019
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003020" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003021endfun
3022
3023" ------------------------------------------------------------------------
3024" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003025" to handle extra junk that their system's ftp dumps
3026" into the transfer. This function is provided as an
3027" example and as a fix for a Windows 95 problem: in my
3028" experience, win95's ftp always dumped four blank lines
3029" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003030if has("win95") && g:netrw_win95ftp
3031 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003032" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003033 if method == 3 " ftp (no <.netrc>)
3034 let fourblanklines= line2 - 3
3035 silent fourblanklines.",".line2."g/^\s*/d"
3036 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003037" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003038 endfun
3039endif
3040
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003041" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003042" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003043if v:version < 700
3044 fun! <SID>NetSort() range
3045" " call Dfunc("NetSort()")
3046
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003047 let i = a:firstline + 1
3048 while i <= a:lastline
3049 " find insertion point via binary search
3050 let i_val = getline(i)
3051 let lo = a:firstline
3052 let hi = i
3053 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003054 let mid = (lo + hi) / 2
3055 let mid_val = getline(mid)
3056 if g:netrw_sort_direction =~ '^n'
3057 " normal sorting order
3058 if i_val < mid_val
3059 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003060 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003061 let lo = mid + 1
3062 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003063 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003064 else
3065 " reverse sorting order
3066 if i_val > mid_val
3067 let hi = mid
3068 else
3069 let lo = mid + 1
3070 if i_val == mid_val | break | endif
3071 endif
3072 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003073 endwhile
3074 " do insert
3075 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003076 exe 'keepjumps '.i.'d_'
3077 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003078 endif
3079 let i = i + 1
3080 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003081
3082" " call Dret("NetSort")
3083 endfun
3084endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003085
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003086" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003087" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3088" What this function does is to compute a priority for the patterns
3089" in the g:netrw_sort_sequence. It applies a substitute to any
3090" "files" that satisfy each pattern, putting the priority / in
3091" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003092fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003093" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003094 if g:netrw_longlist
3095 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3096 else
3097 let seqlist = g:netrw_sort_sequence
3098 endif
3099 " sanity check -- insure that * appears somewhere
3100 if seqlist == ""
3101 let seqlist= '*'
3102 elseif seqlist !~ '\*'
3103 let seqlist= seqlist.',*'
3104 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003105 let priority = 1
3106 while seqlist != ""
3107 if seqlist =~ ','
3108 let seq = substitute(seqlist,',.*$','','e')
3109 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3110 else
3111 let seq = seqlist
3112 let seqlist = ""
3113 endif
3114 let eseq= escape(seq,'/')
3115 if priority < 10
3116 let spriority= "00".priority.'\/'
3117 elseif priority < 100
3118 let spriority= "0".priority.'\/'
3119 else
3120 let spriority= priority.'\/'
3121 endif
3122" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3123
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003124 " sanity check
3125 if s:netrw_bannercnt > line("$")
3126 " apparently no files were left after a Hiding pattern was used
3127" call Dret("SetSort : no files left after hiding")
3128 return
3129 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003130 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003131 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003132 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003133 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003134 endif
3135 let priority = priority + 1
3136 endwhile
3137
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003138 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003139
3140" call Dret("SetSort")
3141endfun
3142
Bram Moolenaar83bab712005-08-01 21:58:57 +00003143let &cpo= s:keepcpo
3144unlet s:keepcpo
Bram Moolenaar071d4272004-06-13 20:20:40 +00003145" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003146" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003147" vim:ts=8 fdm=marker