blob: 124e6174895db3344fc1737cfab538411e2f8391 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002" AUTOLOAD PORTION
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003" Date: Mar 13, 2006
4" Version: 80
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
Bram Moolenaar572cb562005-08-05 21:35:02 +00008" Permission is hereby granted to use and distribute this code,
9" with or without modifications, provided that this copyright
10" notice is copied with it. Like anything else that's free,
Bram Moolenaar1afcace2005-11-25 19:54:28 +000011" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
12" *as is* and comes with no warranty of any kind, either
13" expressed or implied. By using this plugin, you agree that
14" in no event will the copyright holder be liable for any damages
15" resulting from the use of this software.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000016" of this software.
Bram Moolenaar071d4272004-06-13 20:20:40 +000017"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000018" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000019" (James 1:22 RSV)
20" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar1afcace2005-11-25 19:54:28 +000021
22" Exception for &cp: {{{1
23if &cp || exists("g:loaded_netrw")
24 finish
25endif
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +000026let g:loaded_netrw = "v80"
Bram Moolenaar578b49e2005-09-10 19:22:57 +000027if v:version < 700
28 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
29 finish
30endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000031let s:keepcpo= &cpo
32set cpo&vim
33" call Decho("doing autoload/netrw.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +000034
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000035" ======================
36" Netrw Variables: {{{1
37" ======================
38
Bram Moolenaar071d4272004-06-13 20:20:40 +000039" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000040" Default values for netrw's global protocol variables {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +000041if !exists("g:netrw_dav_cmd")
42 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar071d4272004-06-13 20:20:40 +000043endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000044if !exists("g:netrw_fetch_cmd")
45 if executable("fetch")
46 let g:netrw_fetch_cmd = "fetch -o"
47 else
48 let g:netrw_fetch_cmd = ""
49 endif
50endif
51if !exists("g:netrw_ftp_cmd")
52 let g:netrw_ftp_cmd = "ftp"
53endif
54if !exists("g:netrw_http_cmd")
55 if executable("wget")
56 let g:netrw_http_cmd = "wget -q -O"
57 elseif executable("fetch")
58 let g:netrw_http_cmd = "fetch -o"
59 else
60 let g:netrw_http_cmd = ""
61 endif
62endif
63if !exists("g:netrw_rcp_cmd")
64 let g:netrw_rcp_cmd = "rcp"
65endif
66if !exists("g:netrw_rsync_cmd")
67 let g:netrw_rsync_cmd = "rsync"
68endif
69if !exists("g:netrw_scp_cmd")
70 let g:netrw_scp_cmd = "scp -q"
71endif
72if !exists("g:netrw_sftp_cmd")
73 let g:netrw_sftp_cmd = "sftp"
74endif
75if !exists("g:netrw_ssh_cmd")
76 let g:netrw_ssh_cmd= "ssh"
77endif
78
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +000079if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +000080 \ && exists("g:netrw_use_nt_rcp")
81 \ && g:netrw_use_nt_rcp
82 \ && executable( $SystemRoot .'/system32/rcp.exe')
83 let s:netrw_has_nt_rcp = 1
84 let s:netrw_rcpmode = '-b'
85 else
86 let s:netrw_has_nt_rcp = 0
87 let s:netrw_rcpmode = ''
88endif
89
90" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000091" Default values for netrw's global variables {{{2
92" Default values - a-c ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +000093if !exists("g:netrw_alto")
94 let g:netrw_alto= 0
95endif
96if !exists("g:netrw_altv")
97 let g:netrw_altv= 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000098endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000099if !exists("g:netrw_browse_split")
100 let g:netrw_browse_split= 0
101endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000103 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000104 if &shell == "bash"
105 let g:netrw_cygwin= 1
106 else
107 let g:netrw_cygwin= 0
108 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109 else
110 let g:netrw_cygwin= 0
111 endif
112endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000113" Default values - d-f ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000114if !exists("g:NETRW_DIRHIST_CNT")
115 let g:NETRW_DIRHIST_CNT= 0
116endif
117if !exists("g:netrw_dirhistmax")
118 let g:netrw_dirhistmax= 10
119endif
120if !exists("g:netrw_ftp_browse_reject")
121 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 Moolenaar843ee412004-06-30 16:16:41 +0000122endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000123if !exists("g:netrw_ftp_list_cmd")
124 if has("unix") || exists("g:netrw_cygwin")
125 let g:netrw_ftp_list_cmd= "ls -lF"
126 else
127 let g:netrw_ftp_list_cmd= "dir"
128 endif
129endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000130if !exists("g:netrw_ftpmode")
131 let g:netrw_ftpmode= "binary"
Bram Moolenaar61036992005-10-12 20:54:52 +0000132endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000133" Default values - h-lh ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000134if !exists("g:netrw_hide")
135 let g:netrw_hide= 1
Bram Moolenaar61036992005-10-12 20:54:52 +0000136endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000137if !exists("g:netrw_keepdir")
138 let g:netrw_keepdir= 1
139endif
140if !exists("g:netrw_list_cmd")
141 if executable(g:netrw_ssh_cmd)
142 " provide a default listing command
143 let g:netrw_list_cmd= g:netrw_ssh_cmd." HOSTNAME ls -FLa"
144 else
145" call Decho(g:netrw_ssh_cmd." is not executable, can't do remote directory exploring)
146 let g:netrw_list_cmd= ""
147 endif
148endif
149if !exists("g:netrw_list_hide")
150 let g:netrw_list_hide= ""
151endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000152" Default values - lh-lz ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000153if !exists("g:netrw_local_mkdir")
154 let g:netrw_local_mkdir= "mkdir"
155endif
156if !exists("g:netrw_local_rmdir")
157 let g:netrw_local_rmdir= "rmdir"
158endif
159if !exists("g:netrw_longlist")
160 let g:netrw_longlist= 0
161endif
162if g:netrw_longlist < 0 || g:netrw_longlist > 2
163 " sanity check
164 let g:netrw_longlist= 0
165endif
166if g:netrw_longlist == 1
167 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
168endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000169" Default values - m-r ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000170if !exists("g:netrw_maxfilenamelen")
171 let g:netrw_maxfilenamelen= 32
172endif
173if !exists("g:netrw_mkdir_cmd")
174 let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." HOSTNAME mkdir"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000175endif
176if !exists("g:netrw_rename_cmd")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000177 let g:netrw_rename_cmd= g:netrw_ssh_cmd." HOSTNAME mv"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000178endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000179if !exists("g:netrw_rm_cmd")
180 let g:netrw_rm_cmd = g:netrw_ssh_cmd." HOSTNAME rm"
181endif
182if !exists("g:netrw_rmdir_cmd")
183 let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." HOSTNAME rmdir"
184endif
185if !exists("g:netrw_rmf_cmd")
186 let g:netrw_rmf_cmd = g:netrw_ssh_cmd." HOSTNAME rm -f"
187endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000188" Default values - s ---------- {{{3
Bram Moolenaar843ee412004-06-30 16:16:41 +0000189if exists("g:netrw_silent") && g:netrw_silent != 0
190 let g:netrw_silentxfer= "silent "
191else
192 let g:netrw_silentxfer= ""
193endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000194if !exists("g:netrw_fastbrowse")
195 let g:netrw_fastbrowse= 1
196endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000197if !exists("g:netrw_sort_by")
198 " alternatives: date size
199 let g:netrw_sort_by= "name"
200endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000201if !exists("g:netrw_sort_direction")
202 " alternative: reverse (z y x ...)
203 let g:netrw_sort_direction= "normal"
204endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000205if !exists("g:netrw_sort_sequence")
206 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000207endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000208if !exists("g:netrw_ssh_browse_reject")
209 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
210endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000211" Default values - t-w ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000212if !exists("g:netrw_timefmt")
213 let g:netrw_timefmt= "%c"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000214endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000215if !exists("g:netrw_win95ftp")
216 let g:netrw_win95ftp= 1
217endif
218if !exists("g:netrw_winsize")
219 let g:netrw_winsize= ""
220endif
221" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000222" Default values for netrw's script variables: {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000223if !exists("s:netrw_cd_escape")
224 if has("win32") || has("win95") || has("win64") || has("win16")
225 let s:netrw_cd_escape="#% "
226 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000227 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000228 endif
229endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000230if !exists("g:netrw_fname_escape")
231 let g:netrw_fname_escape= ' ?&;'
232endif
233if !exists("g:netrw_tmpfile_escape")
234 let g:netrw_tmpfile_escape= ' ?&;'
235endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000236if !exists("s:netrw_glob_escape")
237 if has("win32") || has("win95") || has("win64") || has("win16")
238 let s:netrw_glob_escape= ""
239 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000240 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000241 endif
242endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000243
244" BufEnter event ignored by decho when following variable is true
245" Has a side effect that doau BufReadPost doesn't work, so
246" files read by network transfer aren't appropriately highlighted.
247"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000249" ==============================
250" Netrw Utility Functions: {{{1
251" ==============================
252
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000254" NetSavePosn: saves position of cursor on screen {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000255fun! netrw#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
Bram Moolenaar488c6512005-08-11 20:09:58 +0000258 let w:netrw_winnr= winnr()
259 let w:netrw_line = line(".")
260 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
262 " Save top-of-screen line
263 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000264 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000266 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000267" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268endfun
269
270" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000271" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000272fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000273" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +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
Bram Moolenaar488c6512005-08-11 20:09:58 +0000278" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
279 exe "silent! ".w: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 Moolenaar488c6512005-08-11 20:09:58 +0000287" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
288 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000289
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000291" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
292 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293
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
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000298" ===============================
299" Netrw Transfer Functions: {{{1
300" ===============================
301
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000303" NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000304fun! netrw#NetRead(mode,...)
305" call Dfunc("NetRead(mode=".a:mode.",...) a:0=".a:0)
306
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000307 " save options
308 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000309
310 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000312 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000313 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000314 elseif a:mode == 2 " replace with remote file
315 let readcmd = "%r"
316 else
317 exe a:mode
318 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000319 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000320 let ichoice = (a:0 == 0)? 0 : 1
321" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
322
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000323 " get name of a temporary file and set up shell-quoting character {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000324 let tmpfile= tempname()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000325 let tmpfile= escape(substitute(tmpfile,'\','/','ge'),g:netrw_tmpfile_escape)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000326 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000327 echohl Error | echo "***netrw*** your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!" | echohl None
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000328 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
329" call Dret("NetRead")
330 return
331 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000332" call Decho("tmpfile<".tmpfile.">")
333
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000334 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000335
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000336 " attempt to repeat with previous host-file-etc
337 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000338" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000339 let choice = b:netrw_lastfile
340 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000341
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000342 else
343 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000344" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000345
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000346 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000347 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000348 echomsg 'NetRead Usage:'
349 echomsg ':Nread machine:path uses rcp'
350 echomsg ':Nread "machine path" uses ftp with <.netrc>'
351 echomsg ':Nread "machine id password path" uses ftp'
352 echomsg ':Nread dav://machine[:port]/path uses cadaver'
353 echomsg ':Nread fetch://machine/path uses fetch'
354 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
355 echomsg ':Nread http://[user@]machine/path uses http wget'
356 echomsg ':Nread rcp://[user@]machine/path uses rcp'
357 echomsg ':Nread rsync://machine[:port]/path uses rsync'
358 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
359 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000360 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000361
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000362 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000363 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000364" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000365 if match(choice,"\"$") != -1
366 " case "..."
367 let choice=strpart(choice,1,strlen(choice)-2)
368 else
369 " case "... ... ..."
370 let choice = strpart(choice,1,strlen(choice)-1)
371 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000372
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000373 while match(choice,"\"$") == -1
374 let wholechoice = wholechoice . " " . choice
375 let ichoice = ichoice + 1
376 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000377 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000378 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000379 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000380 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000381" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000382 return
383 endif
384 let choice= a:{ichoice}
385 endwhile
386 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
387 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388 endif
389 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000391" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000393
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000394 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000395 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000396 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000397" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 exe 'lcd ' . fnamemodify(tmpfile,':h')
400 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000401 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000402
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000403 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000404 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000405
Bram Moolenaar843ee412004-06-30 16:16:41 +0000406 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000407" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000408 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000409 keepjumps call s:NetBrowse(choice)
410" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000411 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000413
414 " use filename's suffix for the temporary file
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000415 if b:netrw_fname =~ '\.[^./]\+$'
416 let suffix = substitute(b:netrw_fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000417 let tmpfile= substitute(tmpfile,"$",suffix,'e')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000418" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000419 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000420
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000421 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000422 " Perform Protocol-Based Read {{{3
423 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000424 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
425 echo "(netrw) Processing your read request..."
426 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000427
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000428 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000429 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000430 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000431" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000432 " ER: noting done with g:netrw_uid yet?
433 " ER: on Win2K" rcp machine[.user]:file tmpfile
434 " ER: if machine contains '.' adding .user is required (use $USERNAME)
435 " ER: the tmpfile is full path: rcp sees C:\... as host C
436 if s:netrw_has_nt_rcp == 1
437 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
438 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
439 else
440 " Any way needed it machine contains a '.'
441 let uid_machine = g:netrw_machine .'.'. $USERNAME
442 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000444 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
445 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
446 else
447 let uid_machine = g:netrw_machine
448 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000450" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
451 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000452 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
453 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000454
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000455 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000456 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000457 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000458" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000459 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000460 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000461 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000462 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000463" call Decho("filter input: ".getline("."))
464 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
465" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000466 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000467" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000468 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
469 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000470" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000471 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
472 endif
473 " 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 +0000474 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000475 let debugkeep= &debug
476 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000477 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000478 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000479 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000480 endif
481 bd!
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000482 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000483 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000484
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000485 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000486 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000487 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
488 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000489" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000490 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000492 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000493 if exists("g:netrw_port") && g:netrw_port != ""
494 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000495" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000496 else
497 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000498" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000499 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000500
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000501 if exists("g:netrw_ftp") && g:netrw_ftp == 1
502 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000503" call Decho("filter input: ".getline("."))
504 put ='\"'.g:netrw_passwd.'\"'
505" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000506 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000507 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
508" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000509 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000510
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000511 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
512 put =g:netrw_ftpmode
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000513" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000514 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000515 put ='get \"'.netrw_fname.'\" '.tmpfile
516" call Decho("filter input: ".getline("."))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000517
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000518 " perform ftp:
519 " -i : turns off interactive prompting from ftp
520 " -n unix : DON'T use <.netrc>, even though it exists
521 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000522 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000523" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000524 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
525 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
526 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000527" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000528 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000529 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000530 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000531 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000532 endif
533 bd!
534 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
535 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000536
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000537 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000538 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000539 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000540" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000541 if exists("g:netrw_port") && g:netrw_port != ""
542 let useport= " -P ".g:netrw_port
543 else
544 let useport= ""
545 endif
546 if g:netrw_cygwin == 1
547 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000548" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".cygtmpfile)
549 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000550 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000551" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile)
552 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000553 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000554 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000555 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000556
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000557 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000558 " http: NetRead Method #5 (wget) {{{3
559 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000560" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000561 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000562 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000563 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000564 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000565 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000566" call Dret("NetRead")
567 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000568 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000569
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000570 if match(b:netrw_fname,"#") == -1
571 " simple wget
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000572 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
573" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname)
574 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000575 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000576
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000577 else
578 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000579 let netrw_html= substitute(netrw_fname,"#.*$","","")
580 let netrw_tag = substitute(netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000581" call Decho("netrw_html<".netrw_html.">")
582" call Decho("netrw_tag <".netrw_tag.">")
583" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000584 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
585 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000586" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000587 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
588 endif
589 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000590
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000592 " cadaver: NetRead Method #6 {{{3
593 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000594" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000595
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000596 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000597 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000599 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000600 if exists("g:netrw_port") && g:netrw_port != ""
601 put ='open '.g:netrw_machine.' '.g:netrw_port
602 else
603 put ='open '.g:netrw_machine
604 endif
605 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000606
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000607 if g:netrw_cygwin == 1
608 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
609 put ='get '.netrw_fname.' '.cygtmpfile
610 else
611 put ='get '.netrw_fname.' '.tmpfile
612 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000613 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000614
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000615 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000616 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000617" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000618 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
619 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000620 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000621 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000622
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000623 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000624 " rsync: NetRead Method #7 {{{3
625 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000626" call Decho("read via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000627 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000628 if g:netrw_cygwin == 1
629 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000630" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
631 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000632 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000633" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
634 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635 endif
636 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
637 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000638
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000639 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000640 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000641 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000642 elseif b:netrw_method == 8
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000643 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000644 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000645 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000646 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000647 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000648 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000649" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650 endif
651 if exists("g:netrw_option") && g:netrw_option == ":http"
652 let netrw_option= "http"
653 else
654 let netrw_option= "ftp"
655 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000656" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000657
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000658 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000659" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
660 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000661 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000662" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname)
663 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000664 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000665
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
667 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000668
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000669 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000670 " sftp: NetRead Method #9 {{{3
671 elseif b:netrw_method == 9
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000672" call Decho("read via sftp (method #4)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000673 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000674 if g:netrw_cygwin == 1
675 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000676" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
677" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
678 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000679 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000680" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
681 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000682 endif
683 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
684 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000685
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000686 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000687 " Complain {{{3
688 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000689 echo "***warning*** unable to comply with your request<" . choice . ">"
690 endif
691 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000692
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000693 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000694" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000695 if exists("b:netrw_method")
696 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000697 unlet b:netrw_fname
698 endif
699 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000700
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000701" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000702endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000703
704" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000705" NetGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000706" readcmd == %r : replace buffer with newly read file
707" == 0r : read file at top of buffer
708" == r : read file after current line
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000709fun! s:NetGetFile(readcmd, tfile, method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000710" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000711
712 " get name of remote filename (ie. url and all)
713 let rfile= bufname("%")
714" call Decho("rfile<".rfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000715
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716 if exists("*NetReadFixup")
717 " for the use of NetReadFixup (not otherwise used internally)
718 let line2= line("$")
719 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000720
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000721 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000722 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000723 if g:netrw_cygwin
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000724 let tfile= a:tfile
725" call Decho("(win32 && cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000726 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000727 let tfile= substitute(a:tfile,'/','\\\\','ge')
728" call Decho("(win32 && !cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000729 endif
730 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000731 let tfile= a:tfile
732" call Decho("tfile=a:tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000733 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000734
735 if a:readcmd[0] == '%'
Bram Moolenaar81695252004-12-29 20:58:21 +0000736 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000737
Bram Moolenaar83bab712005-08-01 21:58:57 +0000738" call Dredir("ls!","starting buffer list")
739
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000740 " rename the current buffer to the temp file (ie. tfile)
741 keepalt exe "file ".tfile
742" call Dredir("ls!","after renaming current buffer to <".tfile.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000743
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000744 " edit temporary file (ie. read the temporary file in)
745 if rfile =~ '\.zip$'
746 call zip#Browse(tfile)
747 elseif rfile =~ '\.tar$'
748 call tar#Browse(tfile)
749 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000750" call Decho("edit temporary file")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000751 e
752 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000753
Bram Moolenaar81695252004-12-29 20:58:21 +0000754 " rename buffer back to remote filename
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000755 keepalt exe "file ".escape(rfile,' ')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000756 filetype detect
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000757" call Dredir("ls!","renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000758 let line1 = 1
759 let line2 = line("$")
760
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000761 elseif filereadable(tfile)
Bram Moolenaar81695252004-12-29 20:58:21 +0000762 " read file after current line
763 let curline = line(".")
764 let lastline= line("$")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000765" call Decho("exe<".a:readcmd." ".v:cmdarg." ".tfile."> line#".curline)
766 exe a:readcmd." ".v:cmdarg." ".tfile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000767 let line1= curline + 1
768 let line2= line("$") - lastline + 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000769
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000770 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000771 " not readable
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000772 echohl WarningMsg | echo "***netrw*** file <".tfile."> not readable"| echohl None
773 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
774" call Dret("NetGetFile : tfile<".tfile."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000775 return
776 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000777
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000778 " User-provided (ie. optional) fix-it-up command
779 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000780" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000781 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000782" else " Decho
783" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000784 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000785
786 " update the Buffers menu
787 if has("gui") && has("gui_running")
788 silent! emenu Buffers.Refresh\ menu
789 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000790
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000791" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".filereadable(a:tfile))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000792
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000793 " make sure file is being displayed
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000794 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000795" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000796endfun
797
798" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000799" NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000800fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000801" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000802
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000803 " option handling
804 let mod= 0
805 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000806
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000807 " Get Temporary Filename {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000808 let tmpfile= escape(tempname(),g:netrw_tmpfile_escape)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000809 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
810 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
811 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000812" call Dret("NetWrite")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000813 return
814 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000815
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000816 if a:0 == 0
817 let ichoice = 0
818 else
819 let ichoice = 1
820 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000821
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000822 if &binary
823 " for binary writes, write entire file. Line numbers don't really make sense.
824 " Supports the writing of tar and zip files.
825" call Decho("silent exe w! ".v:cmdarg." ".tmpfile)
826 silent exe "w! ".v:cmdarg." ".tmpfile
827 else
828 " write (selected portion of) file to temporary
829" call Decho("silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile)
830 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
831 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000832
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000833 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000834
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000835 " Process arguments: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000836 " attempt to repeat with previous host-file-etc
837 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000838" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000839 let choice = b:netrw_lastfile
840 let ichoice= ichoice + 1
841 else
842 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000843
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000844 " Reconstruct Choice if choice starts with '"'
845 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000846 echomsg 'NetWrite Usage:"'
847 echomsg ':Nwrite machine:path uses rcp'
848 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
849 echomsg ':Nwrite "machine id password path" uses ftp'
850 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
851 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
852 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
853 echomsg ':Nwrite rcp://machine/path uses rcp'
854 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
855 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
856 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000857 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000858
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000859 elseif match(choice,"^\"") != -1
860 if match(choice,"\"$") != -1
861 " case "..."
862 let choice=strpart(choice,1,strlen(choice)-2)
863 else
864 " case "... ... ..."
865 let choice = strpart(choice,1,strlen(choice)-1)
866 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000867
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000868 while match(choice,"\"$") == -1
869 let wholechoice= wholechoice . " " . choice
870 let ichoice = ichoice + 1
871 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000872 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000873 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000874 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000875 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000876" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000877 return
878 endif
879 let choice= a:{ichoice}
880 endwhile
881 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
882 endif
883 endif
884 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000885" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000886 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000887
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000888 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000889 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000890 let choice= substitute(choice,'\\','/','ge')
891 "ER: see NetRead()
892 exe 'lcd ' . fnamemodify(tmpfile,':h')
893 let tmpfile = fnamemodify(tmpfile,':t')
894 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000895
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000896 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000897 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000898
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000899 " =============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000900 " Perform Protocol-Based Write {{{3
901 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000902 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
903 echo "(netrw) Processing your write request..."
904 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000905
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000906 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000907 " rcp: NetWrite Method #1 {{{3
908 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000909" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000910 if s:netrw_has_nt_rcp == 1
911 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
912 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
913 else
914 let uid_machine = g:netrw_machine .'.'. $USERNAME
915 endif
916 else
917 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
918 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
919 else
920 let uid_machine = g:netrw_machine
921 endif
922 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000923 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
924" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname)
925 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000926 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000927
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000929 " ftp + <.netrc>: NetWrite Method #2 {{{3
930 elseif b:netrw_method == 2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000931 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000932 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000933 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000934 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000935" call Decho(" filter input: ".getline("."))
936 exe "put ='"."put ".tmpfile.' \"'.netrw_fname.'\"'."'"
937" call Decho(" filter input: ".getline("."))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000938 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000939" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000940 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000941 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000942" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000943 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000944 endif
945 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
946 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000947 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000948 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000949 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000950 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000951 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000952 endif
953 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000955
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000956 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000957 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{3
958 elseif b:netrw_method == 3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000959 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000960 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000961 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000962 if exists("g:netrw_port") && g:netrw_port != ""
963 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000964" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000965 else
966 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000967" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000968 endif
969 if exists("g:netrw_ftp") && g:netrw_ftp == 1
970 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000971" call Decho("filter input: ".getline("."))
972 put ='\"'.g:netrw_passwd.'\"'
973" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000975 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
976" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000977 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000978 put ='put '.tmpfile.' \"'.netrw_fname.'\"'
979" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 " save choice/id/password for future use
981 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000982
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000983 " perform ftp:
984 " -i : turns off interactive prompting from ftp
985 " -n unix : DON'T use <.netrc>, even though it exists
986 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000987 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000988" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000989 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
990 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
991 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000992 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000993 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000994 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000995 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000996 let mod=1
997 endif
998 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000999
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001000 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001001 " scp: NetWrite Method #4 {{{3
1002 elseif b:netrw_method == 4
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001003 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 if exists("g:netrw_port") && g:netrw_port != ""
1005 let useport= " -P ".g:netrw_port
1006 else
1007 let useport= ""
1008 endif
1009 if g:netrw_cygwin == 1
1010 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001011" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'")
1012 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001013 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001014" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'")
1015 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001016 endif
1017 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001018
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001019 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001020 " http: NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001021 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001022 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001023 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001024 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001025 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001026
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001027 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001028 " dav: NetWrite Method #6 (cadaver) {{{3
1029 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001030" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001031
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001032 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001033 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001034 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001035 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001036 if exists("g:netrw_port") && g:netrw_port != ""
1037 put ='open '.g:netrw_machine.' '.g:netrw_port
1038 else
1039 put ='open '.g:netrw_machine
1040 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001041 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001042
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001043 if g:netrw_cygwin == 1
1044 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
1045 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001046 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001047 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001048 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001049
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001050 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001051 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001052" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001053 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
1054 bd!
1055 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001056
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001057 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001058 " rsync: NetWrite Method #7 {{{3
1059 elseif b:netrw_method == 7
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001060 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001061 if g:netrw_cygwin == 1
1062 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001063" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname)
1064 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001065 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001066" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
1067 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001068 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001069 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001070
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001071 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001072 " sftp: NetWrite Method #9 {{{3
1073 elseif b:netrw_method == 9
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001074 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001075 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1076 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1077 else
1078 let uid_machine = g:netrw_machine
1079 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001080 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001081 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001082 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001083 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001084" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001085 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1086 bd!
1087 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001088
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001089 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001090 " Complain {{{3
1091 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001092 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001093 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001094 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001095
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001096 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001097" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001098 let result=delete(tmpfile)
1099 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001100
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001101 if a:firstline == 1 && a:lastline == line("$")
1102 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001103 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001104
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001105" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001106endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001107
Bram Moolenaar83bab712005-08-01 21:58:57 +00001108" ===========================================
1109" Remote Directory Browsing Support: {{{1
1110" ===========================================
1111
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001112" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001113" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001114" of the contents of a remote directory. It is assumed that the
1115" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1116" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001117fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001118 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1119" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001120
Bram Moolenaar488c6512005-08-11 20:09:58 +00001121 if exists("s:netrw_skipbrowse")
1122 unlet s:netrw_skipbrowse
1123" call Dret("NetBrowse")
1124 return
1125 endif
1126
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001127 call s:NetOptionSave()
1128
Bram Moolenaar843ee412004-06-30 16:16:41 +00001129 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001130 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1131" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001132 if !executable("ftp")
1133 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001134 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001135 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001136 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001137 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001138" call Dret("NetBrowse")
1139 return
1140 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001141 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001142 if !exists("g:netrw_quiet")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001143 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ".g:netrw_list_cmd | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001144 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001145 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001146
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001147 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001148" call Dret("NetBrowse")
1149 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001150 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001151
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001152 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1153 call s:UseBufWinVars()
1154
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001155 " set up menus
1156 let b:netrw_browser_active= 1
1157 call s:NetMenu()
1158
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001159 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001160 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001161
1162 " analyze a:dirname and g:netrw_list_cmd
1163 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001164 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001165" call Decho("dirname<".dirname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001166 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001167 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001168 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001169 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001170 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001171 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001172" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001173 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001174 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001175
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001176 let method = substitute(dirname,dirpat,'\1','')
1177 let user = substitute(dirname,dirpat,'\2','')
1178 let machine = substitute(dirname,dirpat,'\3','')
1179 let path = substitute(dirname,dirpat,'\4','')
1180 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001181" call Decho("set up method <".method .">")
1182" call Decho("set up user <".user .">")
1183" call Decho("set up machine<".machine.">")
1184" call Decho("set up path <".path .">")
1185" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001186
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001187 if method == "ftp" || method == "http"
1188 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001189 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001190 else
1191 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1192 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001193
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001194 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001195" call Decho("setting w:netrw_method<".b:netrw_method.">")
1196 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001197 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001198
Bram Moolenaar8299df92004-07-10 09:47:34 +00001199 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001200 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001201 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 +00001202 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001203 else
1204 if g:netrw_sort_by =~ "^t"
1205 let listcmd= listcmd."t"
1206 elseif g:netrw_sort_by =~ "^s"
1207 let listcmd= listcmd."S"
1208 endif
1209 " optionally sort in reverse
1210 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1211 let listcmd= listcmd."r"
1212 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001213 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001214
1215" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001216 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001217" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001218 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001219 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001220 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001221" call Dret("NetBrowse : symlink")
1222 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001223
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001224 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001225 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001226" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001227
1228 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001229 " "this is a directory" indicator (/). There shouldn't be one of those,
1230 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001231 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001232" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001233
1234 " remote-read the requested file into current buffer
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001235 keepjumps keepalt enew!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001236 set ma
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001237" call Decho("exe file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001238 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001239 exe "silent doau BufReadPre ".fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001240 silent call netrw#NetRead(2,method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001241 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001242 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001243
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001244 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001245 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001246 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001247 setlocal nomod nowrap
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001248
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249" call Dret("NetBrowse : file<".fname.">")
1250 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001251 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001252
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001253 " ---------------------------------------------------------------------
1254 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001255" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001256 " set up new buffer and map
1257 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001258 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001259" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001260 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001261 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001262" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001263 exe "b ".bufnamenr
1264 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001265 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001266" call Dret("NetBrowse")
1267 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001268 endif
1269 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001270" call Decho("generate a new buffer")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001271 keepjumps keepalt enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001272 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001273
1274 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001275 setlocal bt=nofile bh=wipe nobl noswf
1276 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001277" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001278 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001279" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001280 setlocal bt=nofile nobl nonu noswf
1281 if g:netrw_fastbrowse >= 1
1282 setlocal bh=hide
1283 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001284
1285 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001286 call s:NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001287
1288 " set up buffer-local mappings
1289" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001290 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001291 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'),0)<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001292 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001293 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 Moolenaar578b49e2005-09-10 19:22:57 +00001294 if w:netrw_longlist != 2
1295 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1296 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1297 endif
1298 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1299 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001300 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1301 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001302 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001303 nnoremap <buffer> <silent> O :call netrw#NetObtain()<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001304 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001305 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1306 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>
1307 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>
1308 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001309 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1310 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001311 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001312 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001313 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001314 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001315 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001316 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001317 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001318 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001319 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001320 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001321 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001322 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001323
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001324 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001325" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1326 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001327 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001328 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001329 let w:netrw_bannercnt = 7
1330 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001331 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001332 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001333 endif
1334
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001335 if g:netrw_sort_by =~ "^n"
1336 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001337 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001338 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001339 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1340 else
1341 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001342 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001343 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001344 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001345" call Decho("g:netrw_hide=".g:netrw_hide)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001346 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001347 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001348 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001349 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001350 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001351 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001352 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001353 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1354 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001355
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001356 " remote read the requested directory listing
1357 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1358 " Note that not all ftp servers honor the options for ls
1359 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001360 " use ftp to get remote file listing
1361" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001362 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001363 keepjumps 1d
1364
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001365 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001366 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001367" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001368 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001369
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001370 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001371 if g:netrw_ftp_browse_reject != ""
1372 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1373 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001374 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001375
1376 " if there's no ../ listed, then put ./ and ../ in
1377 let line1= line(".")
1378 keepjumps 1
1379 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1380 let line2= line(".")
1381 if line2 == 0
1382 keepjumps put='../'
1383 keepjumps put='./'
1384 endif
1385 exe "keepjumps ".line1
1386 keepjumps norm! 0
1387
1388 " more cleanup
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001389 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1390 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1391 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001392 endif
1393
1394 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001395 " use ssh to get remote file listing
1396" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001397 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001398" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001399 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1400 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001401 " cleanup
1402 if g:netrw_ftp_browse_reject != ""
1403 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001404 endif
1405 endif
1406
1407 " set up syntax highlighting
1408 if has("syntax")
1409 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001410 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001411 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001412 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1413 " sometimes the laststatus highlight bleeds into the entire display.
1414 " Only seems to happen with remote browsing. Weird.
1415 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001416 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001417 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001418
1419 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001420 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001421 if g:netrw_hide && g:netrw_list_hide != ""
1422 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001423 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001424
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001425 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001426 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001427" call Decho("manipulate long listing")
1428
1429 if method == "ftp"
1430 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001431 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001432 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001433 keepjumps d
1434 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001435 " if there's no ../ listed, then put ./ and ../ in
1436 let line1= line(".")
1437 keepjumps 1
1438 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1439 let line2= line(".")
1440 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001441 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1442 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001443 endif
1444 exe "keepjumps ".line1
1445 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001446 endif
1447
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001448 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1449 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1450 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001451 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001452
Bram Moolenaar488c6512005-08-11 20:09:58 +00001453 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001454 if g:netrw_sort_by =~ "^n"
1455 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001456 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001457 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001458 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001459 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001460 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001461 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001462 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001463 if w:netrw_longlist == 1
1464 " shorten the list to keep its width <= winwidth characters
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001465 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001466 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001467 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001468 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001469
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001470 call s:NetrwWideListing()
1471 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001472 " place cursor on the top-left corner of the file listing
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001473 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001474 norm! 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001475 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001476
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001477 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001478 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001479
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001480" call Dret("NetBrowse")
1481 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001482endfun
1483
1484" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001485" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001486fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001487" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001488
1489 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001490 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001491
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001492 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001493 " handling a file
1494 let dirname= dirname.newdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001495 if g:netrw_browse_split == 1
1496 new
1497 wincmd _
1498 elseif g:netrw_browse_split == 2
1499 rightb vert new
1500 wincmd |
1501 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001502 call s:NetMenu()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001503" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001504
1505 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001506 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001507" call Decho("refresh directory listing")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001508 setlocal ma nobl
1509 if g:netrw_fastbrowse >= 1
1510 setlocal bh=hide
1511 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001512 %d
1513
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001514 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001515 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001516 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001517
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001518 if trailer =~ '^\%(\.\./\)*$'
1519 " tack on a ../"
1520 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001521
1522 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001523 " strip off a directory name from dirname
1524 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001525 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001526" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001527
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001528 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001529 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001530 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001531" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001532 endif
1533
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001534" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001535 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001536endfun
1537
Bram Moolenaar843ee412004-06-30 16:16:41 +00001538" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001539" NetGetWord: it gets the directory named under the cursor {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001540fun! s:NetGetWord()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001541" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001542 call s:UseBufWinVars()
1543
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001544 " insure that w:netrw_longlist is set up
1545 if !exists("w:netrw_longlist")
1546 if exists("g:netrw_longlist")
1547 let w:netrw_longlist= g:netrw_longlist
1548 else
1549 let w:netrw_longlist= 0
1550 endif
1551 endif
1552
Bram Moolenaar488c6512005-08-11 20:09:58 +00001553 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001554 " Active Banner support
1555" call Decho("active banner handling")
1556 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001557 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001558 let curline= getline(".")
1559 if curline =~ '"\s*Sorted by\s'
1560 norm s
1561 let s:netrw_skipbrowse= 1
1562 echo 'Pressing "s" also works'
1563 elseif curline =~ '"\s*Sort sequence:'
1564 let s:netrw_skipbrowse= 1
1565 echo 'Press "S" to edit sorting sequence'
1566 elseif curline =~ '"\s*Quick Help:'
1567 norm ?
1568 let s:netrw_skipbrowse= 1
1569 echo 'Pressing "?" also works'
1570 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1571 norm a
1572 let s:netrw_skipbrowse= 1
1573 echo 'Pressing "a" also works'
1574 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001575 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001576 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001577
1578 elseif w:netrw_longlist == 0
1579" call Decho("thin column handling")
1580 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001581 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001582
1583 elseif w:netrw_longlist == 1
1584" call Decho("long column handling")
1585 norm! 0
1586 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1587
1588 else
1589" call Decho("obtain word from wide listing")
1590 let dirname= getline(".")
1591
1592 if !exists("b:netrw_cpf")
1593 let b:netrw_cpf= 0
1594 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1595" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001596 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001597
1598 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
1599" call Decho("virtcol=".virtcol(".")." cpf=".b:netrw_cpf." bannercnt=".w:netrw_bannercnt." filestart=".filestart)
1600" call Decho("1: dirname<".dirname.">")
1601 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1602" call Decho("2: dirname<".dirname.">")
1603 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1604" call Decho("3: dirname<".dirname.">")
1605 let dirname = substitute(dirname,'\s\+$','','e')
1606" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001607 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001608
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001609" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001610 return dirname
1611endfun
1612
1613" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001614" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001615fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001616" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1617" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001618
1619 " preparation for removing multiple files/directories
1620 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001621 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001622
1623 " remove multiple files and directories
1624 while ctr <= a:lastline
1625 exe ctr
1626
1627 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001628 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001629" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001630
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001631 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001632 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001633 if !all
1634 echohl Statement
1635 call inputsave()
1636 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1637 call inputrestore()
1638 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001639 if ok == ""
1640 let ok="no"
1641 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001642 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1643 if ok =~ 'a\%[ll]'
1644 let all= 1
1645 endif
1646 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001647
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001648 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001649 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001650 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001651 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001652 else
1653 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1654" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1655 let ret= system(netrw_rm_cmd)
1656" call Decho("returned=".ret." errcode=".v:shell_error)
1657 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001658 elseif ok =~ 'q\%[uit]'
1659 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001660 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001661
Bram Moolenaar843ee412004-06-30 16:16:41 +00001662 else
1663 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001664 if !all
1665 call inputsave()
1666 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1667 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001668 if ok == ""
1669 let ok="no"
1670 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001671 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1672 if ok =~ 'a\%[ll]'
1673 let all= 1
1674 endif
1675 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001676
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001677 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001678 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001679 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001680 else
1681 let rmfile = a:path.rmfile
1682 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1683" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1684 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001685" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001686
1687 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001688 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001689" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1690 let ret= system(netrw_rmf_cmd)
1691" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001692
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001693 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001694 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001695 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001696 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001697 endif
1698 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001699
1700 elseif ok =~ 'q\%[uit]'
1701 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001702 endif
1703 endif
1704
1705 let ctr= ctr + 1
1706 endwhile
1707
1708 " refresh the directory
1709 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001710" call Decho("refresh the directory")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001711 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001712 exe curline
1713
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001714" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001715endfun
1716
1717" ---------------------------------------------------------------------
1718" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001719fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001720" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001721
1722 " preparation for removing multiple files/directories
1723 let ctr = a:firstline
1724 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1725
1726 " attempt to rename files/directories
1727 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001728 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001729
1730 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001731 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001732" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001733
1734 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001735 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001736 call inputrestore()
1737
Bram Moolenaar488c6512005-08-11 20:09:58 +00001738 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001739 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001740 else
1741 let oldname= a:path.oldname
1742 let newname= a:path.newname
1743" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1744 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1745 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001746
1747 let ctr= ctr + 1
1748 endwhile
1749
1750 " refresh the directory
1751 let curline= line(".")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001752 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001753 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001754" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001755endfun
1756
1757" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001758" NetRefresh: {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001759fun! s:NetRefresh(dirname,islocal)
1760" call Dfunc("NetRefresh(dirname<".a:dirname.">,islocal=".a:islocal.")")
1761 call netrw#NetSavePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001762 set ma
1763 %d
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001764 if a:islocal
1765 call s:LocalBrowse(a:dirname)
1766 else
1767 call s:NetBrowse(a:dirname)
1768 endif
1769 call netrw#NetRestorePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001770 redraw!
1771" call Dret("NetRefresh")
1772endfun
1773
1774" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001775" NetSplit: mode {{{2
1776" =0 : net and o
1777" =1 : net and v
1778" =2 : local and o
1779" =3 : local and v
1780fun! s:NetSplit(mode)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001781" call Dfunc("NetSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001782
1783 call s:SaveWinVars()
1784 if a:mode == 0
1785 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1786 call s:CopyWinVars()
1787 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001788 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001789 elseif a:mode ==1
1790 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1791 call s:CopyWinVars()
1792 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001793 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001794 elseif a:mode ==2
1795 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1796 call s:CopyWinVars()
1797 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001798 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001799 else
1800 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1801 call s:CopyWinVars()
1802 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001803 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001804 endif
1805
1806" call Dret("NetSplit")
1807endfun
1808
1809" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001810" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001811" files given their extension. Passes 0=local, 1=remote
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001812fun! netrw#NetBrowseX(fname,remote)
1813" call Dfunc("NetBrowseX(fname<".a:fname."> remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001814
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001815 " set up the filename
1816 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001817 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001818 if has("win32") || has("win95") || has("win64") || has("win16")
1819 let exten= substitute(exten,'^.*$','\L&\E','')
1820 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001821 let fname= escape(a:fname,"%#")
1822" call Decho("fname<".fname."> after escape()")
1823
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001824 " seems kde systems often have gnome-open due to dependencies, even though
1825 " gnome-open's subsidiary display tools are largely absent. Kde systems
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001826 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
1827 if !exists("s:haskdeinit")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001828 if has("unix")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001829 silent! let s:haskdeinit= system('ps -e') =~ 'kdeinit'
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001830 if v:shell_error
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001831 let s:haskdeinit = 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001832 endif
1833 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001834 let s:haskdeinit= 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001835 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001836" call Decho("setting s:haskdeinit=".s:haskdeinit)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001837 endif
1838
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001839 if a:remote == 1
1840 " create a local copy
1841 let fname= tempname().".".exten
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001842" call Decho("a:remote==1: create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001843 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001844 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001845 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001846 q
1847 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001848" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001849
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001850 " set up redirection
1851 if &srr =~ "%s"
Bram Moolenaarf4cd3e82005-12-22 22:47:02 +00001852 let redir= substitute(&srr,"%s","/dev/null","")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001853 else
1854 let redir= &srr . "/dev/null"
1855 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001856" call Decho("redir{".redir."} srr{".&srr."}")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001857
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001858 if exists("g:netrw_browsex_viewer") && executable(g:netrw_browsex_viewer)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001859" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001860 if g:netrw_browsex_viewer == '-'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001861 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001862 else
1863" call Decho("exe silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."' ".redir)
1864 exe "silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."'".redir
1865 let ret= v:shell_error
1866 endif
1867
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001868 " execute the file handler
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001869 elseif has("win32") || has("win64")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001870" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1871 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1872 let ret= v:shell_error
1873
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001874 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaara5792f52005-11-23 21:25:05 +00001875" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1876 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1877 let ret= v:shell_error
1878
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001879 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001880" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1881 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1882 let ret= v:shell_error
1883
1884 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001885 " netrwFileHandlers#Invoke() always returns 0
1886 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001887 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001888
1889 " if unsuccessful, attempt netrwFileHandlers#Invoke()
1890 if ret
1891 let ret= netrwFileHandlers#Invoke(exten,fname)
1892 endif
1893
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001894 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001895
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001896 " cleanup: remove temporary file,
1897 " delete current buffer if success with handler,
1898 " return to prior buffer (directory listing)
1899 if a:remote == 1 && fname != a:fname
1900" call Decho("deleting temporary file<".fname.">")
1901 call delete(fname)
1902 endif
1903
1904 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001905 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001906 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001907 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001908 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001909
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001910" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001911endfun
1912
1913" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001914" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1915" This function assumes that a long listing will be received. Size, time,
1916" and reverse sorts will be requested of the server but not otherwise
1917" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001918fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001919" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001920
1921 " because WinXX ftp uses unix style input
1922 " curline is one more than the bannercnt in order to account
1923 " for the unwanted first blank line (doing a :put to an empty
1924 " buffer yields a blank first line)
1925 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001926 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001927 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001928 exe "silent! keepjumps ".curline.",$d"
1929
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001930 ".........................................
1931 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001932 " ftp + <.netrc>: Method #2
1933 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001934 put ='cd \"'.a:path.'\"'
1935" call Decho('ftp: '.getline("."))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001936 endif
1937 exe "put ='".a:cmd."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001938" call Decho("ftp: ".getline("."))
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001939" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001940 if exists("g:netrw_port") && g:netrw_port != ""
1941" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1942 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1943 else
1944" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1945 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1946 endif
1947
1948 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001949 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001950 " ftp + machine,id,passwd,filename: Method #3
1951 setlocal ff=unix
1952 if exists("g:netrw_port") && g:netrw_port != ""
1953 put ='open '.g:netrw_machine.' '.g:netrw_port
1954 else
1955 put ='open '.g:netrw_machine
1956 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001957
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001958 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1959 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001960 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001961 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001962 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001963 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001964
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001965 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001966 put ='cd \"'.a:path.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001967 endif
1968 exe "put ='".a:cmd."'"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001969
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001970 " perform ftp:
1971 " -i : turns off interactive prompting from ftp
1972 " -n unix : DON'T use <.netrc>, even though it exists
1973 " -n win32: quit being obnoxious about password
1974" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1975 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1976
1977 ".........................................
1978 else
1979 echo "***warning*** unable to comply with your request<" . choice . ">"
1980 endif
1981
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001982 " cleanup for Windows
1983 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001984 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001985 endif
1986 if a:cmd == "dir"
1987 " infer directory/link based on the file permission string
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001988 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1989 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001990 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001991 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001992 endif
1993 endif
1994
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001995 " ftp's ls doesn't seem to include ./ or ../
1996 if !search('^\.\/$','wn')
1997 exe 'keepjumps '.curline
1998 if a:path !~ '^$'
1999 put ='../'
2000 endif
2001 put ='./'
2002 exe 'keepjumps '.curline
2003 endif
2004
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002005 " restore settings
2006 let &ff= ffkeep
2007" call Dret("NetBrowseFtpCmd")
2008endfun
2009
2010" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00002011" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
2012" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002013fun! s:NetrwListHide()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002014" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002015
2016 let listhide= g:netrw_list_hide
2017 while listhide != ""
2018 if listhide =~ ','
2019 let hide = substitute(listhide,',.*$','','e')
2020 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
2021 else
2022 let hide = listhide
2023 let listhide= ""
2024 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002025
2026 " Prune the list by hiding any files which match
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002027 if g:netrw_hide == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002028" call Decho("hiding<".hide."> listhide<".listhide.">")
2029" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d')
2030 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002031 elseif g:netrw_hide == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002032" call Decho("showing<".hide."> listhide<".listhide.">")
2033" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d')
2034 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002035 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00002036 endwhile
2037
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002038" call Dret("NetrwListHide")
2039endfun
2040
2041" ---------------------------------------------------------------------
2042" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002043fun! s:NetHideEdit(islocal)
2044" call Dfunc("NetHideEdit(islocal=".a:islocal.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002045
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002046 " get new hiding list from user
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002047 call inputsave()
2048 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
2049 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002050 let g:netrw_list_hide= newhide
2051" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002052
2053 " refresh the listing
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002054 if a:islocal == 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002055 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2056 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002057 silent call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,"./"),a:islocal)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002058 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002059
2060" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002061endfun
2062
Bram Moolenaar8299df92004-07-10 09:47:34 +00002063" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002064" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002065fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002066" call Dfunc("NetSortSequence(mode=".a:mode.")")
2067
2068 call inputsave()
2069 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
2070 call inputrestore()
2071
2072 " refresh the listing
2073 let g:netrw_sort_sequence= newsortseq
2074 if a:mode == 0
2075 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2076 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002077 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002078 endif
2079
2080" call Dret("NetSortSequence")
2081endfun
2082
2083" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002084" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002085fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002086" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
2087 let fname = s:NetGetWord()
2088 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
2089" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002090
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002091 if w:netrw_longlist == 0
2092 " use one column listing
2093" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002094 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2095
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002096 elseif w:netrw_longlist == 1
2097 " use long list
2098" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002099 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002100
2101 else
2102 " give wide list
2103" call Decho("use wide list")
2104 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002105 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002106 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00002107
2108 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002109 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002110
2111 " refresh the listing
2112 if a:mode == 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002113 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002114 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002115 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002116 endif
2117
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002118 " keep cursor on the filename
2119 silent keepjumps $
2120 if fname =~ '/$'
2121 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2122 else
2123 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2124 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002125
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002126" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
2127endfun
2128
2129" ---------------------------------------------------------------------
2130" NetrwWideListing: {{{2
2131fun! s:NetrwWideListing()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002132" call Dfunc("NetrwWideListing() w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002133
2134 if w:netrw_longlist == 2
2135 " look for longest filename (cpf=characters per filename)
2136 " cpf: characters per file
2137 " fpl: files per line
2138 " fpc: files per column
2139 set ma
2140 let b:netrw_cpf= 0
2141 if line("$") >= w:netrw_bannercnt
2142 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2143 else
2144" call Dret("NetrwWideListing")
2145 return
2146 endif
2147" call Decho("max file strlen+1=".b:netrw_cpf)
2148 let b:netrw_cpf= b:netrw_cpf + 1
2149
2150 " determine qty files per line (fpl)
2151 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002152 if w:netrw_fpl <= 0
2153 let w:netrw_fpl= 1
2154 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002155" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
2156
2157 " make wide display
2158 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
2159 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
2160 let newcolstart = w:netrw_bannercnt + fpc
2161 let newcolend = newcolstart + fpc - 1
2162" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
2163 while line("$") >= newcolstart
2164 if newcolend > line("$") | let newcolend= line("$") | endif
2165 let newcolqty= newcolend - newcolstart
2166 exe newcolstart
2167 if newcolqty == 0
2168 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2169 else
2170 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2171 endif
2172 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002173 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002174 endwhile
2175 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002176 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002177 endif
2178
2179" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002180endfun
2181
2182" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002183" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002184" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2185" the same word even though the sorting has changed its order of appearance.
2186fun! s:NetSaveWordPosn()
2187" call Dfunc("NetSaveWordPosn()")
2188 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2189" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2190endfun
2191
2192" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002193" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002194fun! s:NetRestoreWordPosn()
2195" call Dfunc("NetRestoreWordPosn()")
2196 silent! call search(s:netrw_saveword,'w')
2197" call Dret("NetRestoreWordPosn")
2198endfun
2199
2200" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002201" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002202fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002203" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2204
2205 " get name of new directory from user. A bare <CR> will skip.
2206 " if its currently a directory, also request will be skipped, but with
2207 " a message.
2208 call inputsave()
2209 let newdirname= input("Please give directory name: ")
2210 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002211" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002212
2213 if newdirname == ""
2214" call Dret("NetMakeDir : user aborted with bare <cr>")
2215 return
2216 endif
2217
2218 if a:usrhost == ""
2219
2220 " Local mkdir:
2221 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002222 let fullnewdir= b:netrw_curdir.'/'.newdirname
2223" call Decho("fullnewdir<".fullnewdir.">")
2224 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002225 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002226 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002227 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002228 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002229" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2230 return
2231 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002232 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002233 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002234 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002235 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002236 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002237" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2238 return
2239 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002240
2241 " requested new local directory is neither a pre-existing file or
2242 " directory, so make it!
2243 if exists("*mkdir")
2244 call mkdir(fullnewdir,"p")
2245 else
2246 let netrw_origdir= s:NetGetcwd(1)
2247 exe 'cd '.b:netrw_curdir
2248" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2249" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2250 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002251 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002252 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002253
Bram Moolenaar8299df92004-07-10 09:47:34 +00002254 if v:shell_error == 0
2255 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002256" call Decho("refresh listing")
2257 let linenum= line(".")
2258 norm! H0
2259 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002260 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002261 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2262 exe "norm! ".hline."G0z\<CR>"
2263 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002264 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002265 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002266 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002267 endif
2268 redraw!
2269
2270 else
2271 " Remote mkdir:
2272 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002273 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002274" call Decho("exe silent! !".mkdircmd." ".newdirname)
2275 exe "silent! !".mkdircmd." ".newdirname
2276 if v:shell_error == 0
2277 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002278 let linenum= line(".")
2279 norm! H0
2280 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002281 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002282 exe "norm! ".hline."G0z\<CR>"
2283 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002284 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002285 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002286 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002287 endif
2288 redraw!
2289 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002290
Bram Moolenaar8299df92004-07-10 09:47:34 +00002291" call Dret("NetMakeDir")
2292endfun
2293
2294" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002295" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002296" 0: (user: <b>) bookmark current directory
2297" 1: (user: <B>) change to the bookmarked directory
2298" 2: (user: <q>) list bookmarks
2299" 3: (LocalBrowse) record current directory history
2300" 4: (user: <u>) go up (previous) bookmark
2301" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002302fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002303" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002304 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2305 " looks like a "b" was pressed while in the banner region
2306 if line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002307 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002308 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002309 if &ch > 1
2310 " "clear" the message
2311 echo ""
2312 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002313" call Dret("NetBookmarkDir - ignoring")
2314 return
2315 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002316
2317 if a:chg == 0
2318 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002319 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2320 if !exists("g:NETRW_BOOKMARKMAX")
2321 let g:NETRW_BOOKMARKMAX= v:count
2322 elseif v:count > g:NETRW_BOOKMARKMAX
2323 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002324 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002325 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002326
2327 elseif a:chg == 1
2328 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002329 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2330 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002331 else
2332 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2333 endif
2334
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002335 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002336 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002337 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002338" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2339 let cnt= 0
2340 while cnt <= g:NETRW_BOOKMARKMAX
2341 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2342" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2343 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2344 endif
2345 let cnt= cnt + 1
2346 endwhile
2347 endif
2348
2349 " list directory history
2350 let cnt = g:NETRW_DIRHIST_CNT
2351 let first = 1
2352 let histcnt = 0
2353 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2354" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2355 let histcnt= histcnt + 1
2356 if exists("g:NETRW_DIRHIST_{cnt}")
2357" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2358 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002359 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002360 let first = 0
2361 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2362 if cnt < 0
2363 let cnt= cnt + g:netrw_dirhistmax
2364 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002365 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002366
2367 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002368 " saves most recently visited directories (when they differ)
2369 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2370 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2371 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2372" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2373 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002374
2375 elseif a:chg == 4
2376 " u: change to the previous directory stored on the history list
2377 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2378 if g:NETRW_DIRHIST_CNT < 0
2379 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2380 endif
2381 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2382" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2383 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2384 else
2385 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2386 echo "Sorry, no predecessor directory exists yet"
2387 endif
2388
2389 elseif a:chg == 5
2390 " U: change to the subsequent directory stored on the history list
2391 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2392 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2393" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2394 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2395 else
2396 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2397 if g:NETRW_DIRHIST_CNT < 0
2398 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2399 endif
2400 echo "Sorry, no successor directory exists yet"
2401 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002402 endif
2403" call Dret("NetBookmarkDir")
2404endfun
2405
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002406" ---------------------------------------------------------------------
2407" NetObtain: obtain file under cursor (for remote browsing support) {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002408fun! netrw#NetObtain(...)
2409" call Dfunc("NetObtain() a:0=".a:0)
2410
2411 if a:0==0
2412 " no arguments -- use word under cursor
2413 let fname= expand("<cWORD>")
2414" call Decho("no arguments, use <".fname.">")
2415 elseif a:0 > 1
2416 " more than one argument, recurse with each argument separately
2417" call Decho("more than 1 argument, use recursion")
2418 let i=1
2419 while i <= a:0
2420 call netrw#NetObtain(a:{i})
2421 let i=i+1
2422 endwhile
2423 return
2424 else
2425 " one argument provided
2426 let fname = a:1
2427 let keep_netrw_choice = exists("b:netrw_choice")? b:netrw_choice : ""
2428 let keep_netrw_fname = exists("b:netrw_fname")? b:netrw_fname : ""
2429 let keep_netrw_wmethod = exists("w:netrw_method")? w:netrw_method : ""
2430 call s:NetMethod(fname)
2431 let w:netrw_method= b:netrw_method
2432 let fname = b:netrw_fname
2433" call Decho("g:netrw_scp_cmd<".g:netrw_scp_cmd.">")
2434" call Decho("g:netrw_machine<".g:netrw_machine.">")
2435" call Decho("fname<".fname.">")
2436 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002437
2438 " NetrwStatusLine support - for obtaining support
2439 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002440
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002441" call Decho("method=".w:netrw_method)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002442 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2443 if executable("ftp")
2444 let curdir = expand("%")
2445 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2446 let curline= line(".")
2447 let endline= line("$")+1
2448 set ma
2449 keepjumps $
2450
2451 ".........................................
2452 if w:netrw_method == 2
2453 " ftp + <.netrc>: Method #2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002454 setlocal ff=unix
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002455 if path != ""
2456 put ='cd '.path
2457" call Decho("ftp: cd ".path)
2458 endif
2459 put ='get '.fname
2460" call Decho("ftp: get ".fname)
2461 if exists("g:netrw_port") && g:netrw_port != ""
2462" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2463 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2464 else
2465" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2466 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2467 endif
2468
2469 ".........................................
2470 elseif w:netrw_method == 3
2471 " ftp + machine,id,passwd,filename: Method #3
2472 setlocal ff=unix
2473 if exists("g:netrw_port") && g:netrw_port != ""
2474 put ='open '.g:netrw_machine.' '.g:netrw_port
2475" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2476 else
2477 put ='open '.g:netrw_machine
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002478" call Decho('ftp: open '.g:netrw_machine)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002479 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002480
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002481 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2482 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002483 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002484" call Decho('ftp: g:netrw_uid')
2485" call Decho('ftp: g:netrw_passwd')
2486 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002487 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002488" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2489 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002490
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002491 if a:path != ""
2492 put ='cd '.a:path
2493" call Decho('cd '.a:path)
2494 endif
2495 exe "put ='".a:cmd."'"
2496" call Decho("ftp: ".a:cmd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002497
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002498 " perform ftp:
2499 " -i : turns off interactive prompting from ftp
2500 " -n unix : DON'T use <.netrc>, even though it exists
2501 " -n win32: quit being obnoxious about password
2502" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2503 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002504
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002505 ".........................................
2506 else
2507 echo "***warning*** unable to comply with your request<" . choice . ">"
2508 endif
2509 " restore
2510 exe "silent! ".endline.",$d"
2511 exe "keepjumps ".curline
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002512 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002513 else
2514 if !exists("g:netrw_quiet")
2515 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2516 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2517 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002518 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002519 let &stl = s:netrw_users_stl
2520 let &laststatus = s:netrw_users_ls
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002521 " restore NetMethod
2522 if exists("keep_netrw_method")
2523 call s:NetMethod(keep_netrw_choice)
2524 let w:netrw_method = keep_netrw_wmethod
2525 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002526" call Dret("NetObtain")
2527 return
2528 endif
2529
2530 ".........................................
2531 else
2532 " scp: Method#4
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002533 let curdir = expand("%")
2534 let path = substitute(curdir,'scp://[^/]\+/','','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002535" call Decho("path<".path.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002536 if exists("g:netrw_port") && g:netrw_port != ""
2537 let useport= " -P ".g:netrw_port
2538 else
2539 let useport= ""
2540 endif
2541 if g:netrw_cygwin == 1
2542 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002543" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2544 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002545 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002546" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2547 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002548 endif
2549 endif
2550
2551 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002552 let &stl = s:netrw_users_stl
2553 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002554 redraw!
2555
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002556 " restore NetMethod
2557 if exists("keep_netrw_method")
2558 call s:NetMethod(keep_netrw_choice)
2559 let w:netrw_method = keep_netrw_wmethod
2560 endif
2561
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002562" call Dret("NetObtain")
2563endfun
2564
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002565" ---------------------------------------------------------------------
2566" NetPrevWinOpen: opoen file/directory in previous window. {{{2
2567" If there's only one window, then the window will first be split.
2568fun! s:NetPrevWinOpen(islocal)
2569" call Dfunc("NetPrevWinOpen(islocal=".a:islocal.")")
2570
2571 " get last window number and the word currently under the cursor
2572 let lastwinnr = winnr("$")
2573 let curword = s:NetGetWord()
2574 let curdir = b:netrw_curdir
2575" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
2576
2577 let didsplit = 0
2578 if lastwinnr == 1
2579 " if only one window, open a new one first
2580" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
2581 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
2582 let didsplit = 1
2583
2584 else
2585 wincmd p
2586 " if the previous window's buffer has been changed (is modified),
2587 " and it doesn't appear in any other extant window, then ask the
2588 " user if s/he wants to abandon modifications therein.
2589 let bnr = winbufnr(0)
2590 let bnrcnt = 0
2591 if &mod
2592 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
2593" call Decho("bnr=".bnr." bnrcnt=".bnrcnt)
2594 if bnrcnt == 1
2595 let bufname= bufname(winbufnr(winnr()))
2596 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
2597
2598 if choice == 1
2599 " Yes -- write file & then browse
2600 let v:errmsg= ""
2601 silent w
2602 if v:errmsg != ""
2603 echohl Error | echo "***netrw*** "unable to write <".bufname.">!" | echohl None
2604 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2605 if didsplit
2606 q
2607 else
2608 wincmd p
2609 endif
2610" call Dret("NetPrevWinOpen : unable to write <".bufname.">")
2611 return
2612 endif
2613
2614 elseif choice == 2
2615 " No -- don't worry about changed file, just browse anyway
2616 set nomod
2617 echohl WarningMsg | echo "***netrw*** ".bufname." changes abandoned" | echohl None
2618
2619 else
2620 " Cancel -- don't do this
2621 if didsplit
2622 q
2623 else
2624 wincmd p
2625 endif
2626" call Dret("NetPrevWinOpen : cancelled")
2627 return
2628 endif
2629 endif
2630 endif
2631 endif
2632
2633 if a:islocal
2634 call s:LocalBrowse(s:LocalBrowseChgDir(curdir,curword))
2635 else
2636 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),curword))
2637 endif
2638" call Dret("NetPrevWinOpen")
2639endfun
2640
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002641" ---------------------------------------------------------------------
2642" NetMenu: generates the menu for gvim and netrw {{{2
2643fun! s:NetMenu()
2644
2645 if has("menu") && has("gui_running") && &go =~ 'm'
2646" call Dfunc("NetMenu()")
2647 if !exists("s:netrw_menu_enabled")
2648 let s:netrw_menu_enabled= 1
2649 if !exists("g:DrChipTopLvlMenu")
2650 let g:DrChipTopLvlMenu= "DrChip."
2651 endif
2652 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Help<tab>? ?'
2653 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Apply\ Special\ Viewer<tab>x x'
2654 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Bookmark\ Current\ Directory<tab>b Nb'
2655 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Go\ Up\ Directory<tab>- -'
2656 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Goto\ Bookmarked\ Directory<tab>B NB'
2657 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Recently\ Used\ Directory<tab>u u'
2658 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Subsequently\ Used\ Directory<tab>U U'
2659 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Delete\ File/Directory<tab>D D'
2660 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<c-h>"
2661 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory<tab><cr> '."\<cr>"
2662 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory,\ New\ Window<tab>o o'
2663 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory,\ New\ Vertical\ Window\ <tab>v v'
2664 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.List\ Bookmarks\ and\ History<tab>q q'
2665 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Listing\ Style\ (thin-long-wide)<tab>i i'
2666 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Make\ Subdirectory<tab>d d'
2667 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Normal-Hide-Show<tab>a a'
2668 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Obtain\ File<tab>O O'
2669 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Preview\ File/Directory<tab>p p'
2670 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Previous\ Window\ Browser<tab>P P'
2671 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
2672 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Rename\ File/Directory<tab>R R'
2673 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Reverse\ Sorting\ Order<tab>'."r r"
2674 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Select\ Sorting\ Style<tab>s s'
2675 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Sorting\ Sequence\ Edit<tab>S S'
2676 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Set\ Current\ Directory<tab>c c'
2677 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
2678 else
2679" call Decho("clear menus")
2680 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Help'
2681 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Apply\ Special\ Viewer'
2682 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Bookmark\ Current\ Directory'
2683 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Go\ Up\ Directory'
2684 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Goto\ Bookmarked\ Directory'
2685 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Recently\ Used\ Directory'
2686 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Subsequently\ Used\ Directory'
2687 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Delete\ File/Directory'
2688 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File\ Hiding\ List'
2689 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File'
2690 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Enter\ File/Directory'
2691 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Enter\ File/Directory\ (vertical\ split)'
2692 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.List\ Bookmarks\ and\ History'
2693 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Listing\ Style\ (thin-long-wide)'
2694 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Make\ Subdirectory'
2695 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Normal-Hide-Show'
2696 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Obtain\ File'
2697 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Preview\ File'
2698 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Previous\ Window\ Browser'
2699 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Refresh\ Listing'
2700 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Rename\ File/Directory'
2701 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Reverse\ Sorting\ Order'
2702 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Select\ Sorting\ Style'
2703 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Sorting\ Sequence\ Edit'
2704 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Set\ Current\ Directory'
2705 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Settings/Options'
2706 endif
2707" call Dret("NetMenu")
2708 endif
2709
2710endfun
2711
Bram Moolenaar83bab712005-08-01 21:58:57 +00002712" ==========================================
2713" Local Directory Browsing Support: {{{1
2714" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002715
2716" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002717" LocalBrowse: {{{2
2718fun! s:LocalBrowse(dirname)
2719 " unfortunate interaction -- debugging calls can't be used here;
2720 " the BufEnter event causes triggering when attempts to write to
2721 " the DBG buffer are made.
2722 if isdirectory(a:dirname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002723 silent! call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002724 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002725 " not a directory, ignore it
2726endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002727
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002728" ---------------------------------------------------------------------
2729" DirBrowse: supports local file/directory browsing {{{2
2730fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002731 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002732" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002733" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002734
Bram Moolenaar488c6512005-08-11 20:09:58 +00002735 if exists("s:netrw_skipbrowse")
2736 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002737" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002738 return
2739 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002740 if &fo =~ '[ta]'
2741 set fo-=t
2742 set fo-=a
2743 echohl Warning
2744 echo '***warning*** directory browsing and formatoptions "ta" are incompatible'
2745 echohl None
2746 endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002747
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002748 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002749
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002750 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002751 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002752 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002753 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002754 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002755 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002756" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002757 return
2758 endif
2759
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002760 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2761 call s:UseBufWinVars()
2762
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002763 " set up menus
2764 let b:netrw_browser_active= 1
2765 call s:NetMenu()
2766
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002767 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002768 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002769" call Decho("findbuf: bufnum=".bufnum)
2770 if bufnum > 0 && bufname(bufnum) != a:dirname
2771 let ibuf= 1
2772 let buflast= bufnr("$")
2773 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2774" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2775 let ibuf= ibuf + 1
2776 endwhile
2777 if ibuf > buflast
2778 let bufnum= -1
2779 else
2780 let bufnum= ibuf
2781 endif
2782" call Decho("findbuf: bufnum=".bufnum." (final)")
2783 endif
2784
2785 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002786 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002787 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002788" call Decho("enew buffer")
2789 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002790 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002791 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2792 if getline(2) =~ '^" Directory Listing '
2793 if !g:netrw_keepdir
2794" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002795 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002796 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002797 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002798" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002799 return
2800 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002801 endif
2802 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002803 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002804
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002805 " set up ShellCmdPost handling. Append current buffer to browselist
2806 if !exists("s:netrw_browselist")
2807 let s:netrw_browselist= []
2808 endif
2809 if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
2810 call add(s:netrw_browselist,bufnr("%"))
2811" call Decho("browselist=".string(s:netrw_browselist))
2812 endif
2813 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
2814" call Decho("setting up local-browser shell command refresh")
2815 let s:netrw_browser_shellcmd= 1
2816 augroup AuNetrwShellCmd
2817 au!
2818 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
2819 augroup END
2820 endif
2821
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002822 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002823 if has("win32") || has("win95") || has("win64") || has("win16")
2824 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2825 else
2826 let b:netrw_curdir= a:dirname
2827 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002828 if b:netrw_curdir =~ '[/\\]$'
2829 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2830 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002831 if b:netrw_curdir == ''
2832 " under unix, when the root directory is encountered, the result
2833 " from the preceding substitute is an empty string.
2834 let b:netrw_curdir= '/'
2835 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002836" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002837
Bram Moolenaar83bab712005-08-01 21:58:57 +00002838 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002839 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002840" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002841 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002842 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002843 catch /^Vim\%((\a\+)\)\=:E472/
2844 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2845 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2846 if exists("w:netrw_prvdir")
2847 let b:netrw_curdir= w:netrw_prvdir
2848 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002849 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002850" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002851 return
2852 endif
2853 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002854 endif
2855
2856 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002857 " Hmm. When another vim is open to the same directory, I get
2858 " a "Press ENTER" ... ok, setting "noswf" avoids it.
2859" call Decho('exe silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002860 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002861
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002862 " make this buffer not-a-file, modifiable, not line-numbered, etc
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002863 setlocal bt=nofile nobl ma nonu noswf nowrap
2864 if g:netrw_fastbrowse >= 2
2865 setlocal bh=hide
2866 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002867 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002868
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002869 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002870 " Perform Directory Listing:
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002871 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2872 echo "(netrw) Processing your browsing request..."
2873 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002874
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002875 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002876 call s:NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002877
Bram Moolenaar8299df92004-07-10 09:47:34 +00002878 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002879" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002880 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002881 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002882 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002883 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002884 if w:netrw_longlist != 2
2885 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2886 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2887 endif
2888 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2889 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002890 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2891 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2892 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002893 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002894 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002895 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2896 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002897 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002898 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002899 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002900 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>
2901 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002902 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2903 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002904 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002905 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002906 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002907 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2908 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002909 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002910 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002911 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002912 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002913 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002914 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002915 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002916 nnoremap <buffer> ? :he netrw-dir<cr>
2917
2918 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002919" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002920 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002921 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002922 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002923 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002924 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002925
2926 let sortby= g:netrw_sort_by
2927 if g:netrw_sort_direction =~ "^r"
2928 let sortby= sortby." reversed"
2929 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002930
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002931 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002932 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002933" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002934 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002935 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002936 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002937 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002938 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002939" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002940 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002941 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002942 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002943 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002944
2945 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002946 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002947 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002948 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002949 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002950 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002951 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002952 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002953 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002954 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2955 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002956 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002957
2958 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002959 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2960" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002961
2962 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002963 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002964
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002965 " set up syntax highlighting
2966 if has("syntax")
2967 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002968 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002969 setlocal ft=
2970 endif
2971 endif
2972
Bram Moolenaar8299df92004-07-10 09:47:34 +00002973 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002974 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002975 if g:netrw_hide && g:netrw_list_hide != ""
2976 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002977 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002978 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002979
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002980 if g:netrw_sort_by =~ "^n"
2981 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002982
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002983 if w:netrw_bannercnt < line("$")
2984 if g:netrw_sort_direction =~ 'n'
2985 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2986 else
2987 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2988 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002989 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002990 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002991
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002992 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002993 if w:netrw_bannercnt < line("$")
2994 if g:netrw_sort_direction =~ 'n'
2995 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2996 else
2997 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2998 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002999 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003000 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003001 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003002
Bram Moolenaar8299df92004-07-10 09:47:34 +00003003 endif
3004 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003005
3006 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003007 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003008 " place cursor on the top-left corner of the file listing
3009 exe 'silent '.w:netrw_bannercnt
3010 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003011 endif
3012
3013 " record previous current directory
3014 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00003015
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003016 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003017 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003018 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003019 setlocal noma nomod nonu nobl nowrap
3020 if g:netrw_fastbrowse >= 2
3021 setlocal bh=hide
3022 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003023
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003024" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003025endfun
3026
3027" ---------------------------------------------------------------------
3028" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003029fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003030" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003031
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003032 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00003033 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
3034 let dirnamelen = strlen(b:netrw_curdir)
3035 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003036" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003037 if filelist != ""
3038 let filelist= filelist."\n"
3039 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003040 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003041" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
3042
3043 " if the directory name includes a "$", and possibly other characters,
3044 " the glob() doesn't include "." and ".." entries.
3045 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
3046" call Decho("forcibly tacking on .")
3047 if filelist == ""
3048 let filelist= dirname."."
3049 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003050 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003051 endif
3052" call Decho("filelist<".filelist.">")
3053 endif
3054 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
3055" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003056 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003057" call Decho("filelist<".filelist.">")
3058 endif
3059 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003060 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003061
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003062" call Decho("dirname<".dirname.">")
3063" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003064" call Decho("filelist<".filelist.">")
3065
3066 while filelist != ""
3067 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003068 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003069 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
3070 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003071 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00003072 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00003073 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003074 let pfile= filename
3075 if isdirectory(filename)
3076 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00003077 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003078 if pfile =~ '//$'
3079 let pfile= substitute(pfile,'//$','/','e')
3080 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003081 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00003082 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00003083" call Decho(" ")
3084" call Decho("filename<".filename.">")
3085" call Decho("pfile <".pfile.">")
3086
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003087 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003088 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003089 let fsz = strpart(" ",1,15-strlen(sz)).sz
3090 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00003091" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003092 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003093
Bram Moolenaar8299df92004-07-10 09:47:34 +00003094 if g:netrw_sort_by =~ "^t"
3095 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003096" call Decho("getftime(".filename.")=".getftime(filename))
3097 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003098 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00003099" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003100 let ftpfile= ft.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003101 keepjumps silent! put=ftpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003102
Bram Moolenaar8299df92004-07-10 09:47:34 +00003103 elseif g:netrw_sort_by =~ "^s"
3104 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003105" call Decho("getfsize(".filename.")=".getfsize(filename))
3106 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003107 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00003108" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003109 let fszpfile= fsz.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003110 keepjumps silent! put =fszpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003111
Bram Moolenaar8299df92004-07-10 09:47:34 +00003112 else
3113 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003114" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003115 keepjumps silent! put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00003116 endif
3117 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003118
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003119 " cleanup any windows mess at end-of-line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003120 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00003121 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00003122
3123" call Dret("LocalBrowseList")
3124endfun
3125
3126" ---------------------------------------------------------------------
3127" LocalBrowseChgDir: constructs a new directory based on the current {{{2
3128" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003129fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003130" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003131
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003132 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003133 let newdir = a:newdir
3134
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003135 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003136 " apparently vim is "recognizing" that it is in the home directory and
3137 " is removing the "/". Bad idea, so I have to put it back.
3138 let dirname= dirname.'/'
3139" call Decho("adjusting dirname<".dirname.">")
3140 endif
3141
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003142 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003143 " handling a file
3144 let dirname= dirname.newdir
3145" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003146 " this lets NetBrowseX avoid the edit
3147 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003148" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
3149" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003150 if g:netrw_browse_split == 1
3151 new
3152 wincmd _
3153 elseif g:netrw_browse_split == 2
3154 rightb vert new
3155 wincmd |
3156 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003157 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003158 call s:NetMenu()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003159 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003160 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003161
3162 elseif newdir == './'
3163 " refresh the directory list
3164" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003165
3166 elseif newdir == '../'
3167 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003168 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003169" call Decho("go up one dir: dirname<".dirname.">")
3170
3171 else
3172 " go down one directory
3173 let dirname= dirname.newdir
3174" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
3175 endif
3176
3177" call Dret("LocalBrowseChgDir <".dirname.">")
3178 return dirname
3179endfun
3180
3181" ---------------------------------------------------------------------
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003182" LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
3183" performed any shell command. The idea is to cause all local-browsing
3184" buffers to be refreshed after a user has executed some shell command,
3185" on the chance that s/he removed/created a file/directory with it.
3186fun! s:LocalBrowseShellCmdRefresh()
3187" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
3188 " go through all buffers,
3189 " including unlisted (which is why I can't use bufdo)
3190 let curwin = winnr()
3191 let ibl = 0
3192 for ibuf in s:netrw_browselist
3193 if bufwinnr(ibuf) == -1
3194" call Decho("wiping buf#".ibuf)
3195 exe "bw ".ibuf
3196 call remove(s:netrw_browselist,ibl)
3197" call Decho("browselist=".string(s:netrw_browselist))
3198 continue
3199 else
3200" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
3201 exe bufwinnr(ibuf)."wincmd w"
3202 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
3203 endif
3204 let ibl= ibl + 1
3205 endfor
3206 exe curwin."wincmd w"
3207
3208" call Dret("LocalBrowseShellCmdRefresh")
3209endfun
3210
3211" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00003212" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003213fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003214" call Dfunc("LocalBrowseRm(path<".a:path.">)")
3215" call Decho("firstline=".a:firstline." lastline=".a:lastline)
3216
3217 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003218 let ctr = a:firstline
3219 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003220 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00003221
3222 " remove multiple files and directories
3223 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003224 exe "keepjumps ".ctr
3225
3226 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003227 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003228 let ctr= ctr + 1
3229 continue
3230 endif
3231 let curword= s:NetGetWord()
3232 if curword == "./" || curword == "../"
3233 let ctr= ctr + 1
3234 continue
3235 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003236
3237 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00003238 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003239" call Decho("rmfile<".rmfile.">")
3240
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003241 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003242 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003243 if !all
3244 echohl Statement
3245 call inputsave()
3246 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3247 call inputrestore()
3248 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003249 if ok == ""
3250 let ok="no"
3251 endif
3252" call Decho("response: ok<".ok.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003253 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003254" call Decho("response: ok<".ok."> (after sub)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003255 if ok =~ 'a\%[ll]'
3256 let all= 1
3257 endif
3258 endif
3259
3260 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003261 let ret= delete(rmfile)
3262" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003263 elseif ok =~ 'q\%[uit]'
3264 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003265 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003266
Bram Moolenaar8299df92004-07-10 09:47:34 +00003267 else
3268 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003269 if !all
3270 echohl Statement
3271 call inputsave()
3272 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3273 call inputrestore()
3274 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003275 if ok == ""
3276 let ok="no"
3277 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003278 if ok =~ 'a\%[ll]'
3279 let all= 1
3280 endif
3281 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003282 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003283
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003284 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003285" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
3286 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003287" call Decho("v:shell_error=".v:shell_error)
3288
3289 if v:shell_error != 0
3290" call Decho("2nd attempt to remove directory<".rmfile.">")
3291 let errcode= delete(rmfile)
3292" call Decho("errcode=".errcode)
3293
3294 if errcode != 0
3295 if has("unix")
3296" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003297call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003298 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003299 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003300 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003301endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003302 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003303 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003304 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00003305 endif
3306 endif
3307 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003308
3309 elseif ok =~ 'q\%[uit]'
3310 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003311 endif
3312 endif
3313
3314 let ctr= ctr + 1
3315 endwhile
3316
3317 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003318 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003319" call Decho("refresh the directory")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003320 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003321 exe curline
3322
3323" call Dret("LocalBrowseRm")
3324endfun
3325
3326" ---------------------------------------------------------------------
3327" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003328fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003329" call Dfunc("LocalBrowseRename(path<".a:path.">)")
3330
3331 " preparation for removing multiple files/directories
3332 let ctr= a:firstline
3333
3334 " attempt to rename files/directories
3335 while ctr <= a:lastline
3336 exe "keepjumps ".ctr
3337
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003338 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003339 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003340 let ctr= ctr + 1
3341 continue
3342 endif
3343 let curword= s:NetGetWord()
3344 if curword == "./" || curword == "../"
3345 let ctr= ctr + 1
3346 continue
3347 endif
3348
Bram Moolenaar8299df92004-07-10 09:47:34 +00003349 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00003350 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003351" call Decho("oldname<".oldname.">")
3352
3353 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003354 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00003355 call inputrestore()
3356
Bram Moolenaar83bab712005-08-01 21:58:57 +00003357 let ret= rename(oldname,newname)
3358" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003359
3360 let ctr= ctr + 1
3361 endwhile
3362
3363 " refresh the directory
3364 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00003365" call Decho("refresh the directory listing")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003366 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003367 exe "keepjumps ".curline
3368" call Dret("LocalBrowseRename")
3369endfun
3370
3371" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003372" LocalObtain: copy selected file to current working directory {{{2
3373fun! s:LocalObtain()
3374" call Dfunc("LocalObtain()")
3375 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
3376 let fname= expand("<cWORD>")
3377 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
3378 call writefile(fcopy,getcwd()."/".fname,"b")
3379 elseif !exists("b:netrw_curdir")
3380 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
3381 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3382 else
3383 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
3384 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3385 endif
3386" call Dret("LocalObtain")
3387endfun
3388
3389" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003390" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003391fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003392" call Dfunc("LocalPreview(path<".a:path.">)")
3393 if has("quickfix")
3394 if !isdirectory(a:path)
3395 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003396 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003397 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003398 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003399 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003400 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003401 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003402 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003403 endif
3404" call Dret("LocalPreview")
3405endfun
3406
3407" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003408" Explore: launch the local browser in the directory of the current file {{{2
3409" dosplit==0: the window will be split iff the current file has
3410" been modified
3411" dosplit==1: the window will be split before running the local
3412" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003413fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003414" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003415
3416 " if dosplit or file has been modified
3417 if a:dosplit || &modified
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003418 call s:SaveWinVars()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003419
Bram Moolenaar83bab712005-08-01 21:58:57 +00003420 if a:style == 0 " Explore, Sexplore
3421 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003422" call Decho("style=0: Explore or Sexplore")
3423
Bram Moolenaar83bab712005-08-01 21:58:57 +00003424 elseif a:style == 1 "Explore!, Sexplore!
3425 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003426" call Decho("style=1: Explore! or Sexplore!")
3427
Bram Moolenaar83bab712005-08-01 21:58:57 +00003428 elseif a:style == 2 " Hexplore
3429 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003430" call Decho("style=2: Hexplore")
3431
Bram Moolenaar83bab712005-08-01 21:58:57 +00003432 elseif a:style == 3 " Hexplore!
3433 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003434" call Decho("style=3: Hexplore!")
3435
Bram Moolenaar83bab712005-08-01 21:58:57 +00003436 elseif a:style == 4 " Vexplore
3437 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003438" call Decho("style=4: Vexplore")
3439
Bram Moolenaar83bab712005-08-01 21:58:57 +00003440 elseif a:style == 5 " Vexplore!
3441 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003442" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003443 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003444 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003445 endif
3446 norm! 0
3447
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003448 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003449 " Explore Hexplore Vexplore Sexplore
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003450" call Decho("Explore Hexplore Vexplore Sexplore")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003451 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3452 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3453" call Decho("calling NetBrowse(newdir<".newdir.">)")
3454 call s:NetBrowse(newdir)
3455 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003456 if newdir == ""|let newdir= getcwd()|endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003457" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3458 call s:LocalBrowse(newdir)
3459 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003460
Bram Moolenaar572cb562005-08-05 21:35:02 +00003461 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003462 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003463" call Decho("Nexplore Pexplore -or- Explore **/...")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003464
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003465 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003466 if !exists("w:netrw_explore_indx")
3467 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003468 endif
3469 let indx = a:indx
3470 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003471 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003472 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003473 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003474 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003475 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003476 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003477 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003478 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003479 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3480 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3481 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003482 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3483 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3484" call Dret("Explore")
3485 return
3486 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003487 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003488
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003489 " NetrwStatusLine support - for exploring support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003490 let w:netrw_explore_indx= indx
Bram Moolenaar488c6512005-08-11 20:09:58 +00003491" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003492
3493 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003494 if indx >= w:netrw_explore_listlen || indx < 0
3495 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003496 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003497 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3498" call Dret("Explore")
3499 return
3500 endif
3501
Bram Moolenaar488c6512005-08-11 20:09:58 +00003502 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003503" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003504 let newdir= substitute(dirfile,'/[^/]*$','','e')
3505" call Decho("newdir<".newdir.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003506
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003507" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3508 call s:LocalBrowse(newdir)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003509 if w:netrw_longlist == 0 || w:netrw_longlist == 1
3510 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3511 else
3512 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3513 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003514 let w:netrw_explore_mtchcnt = indx + 1
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003515 let w:netrw_explore_bufnr = bufnr("%")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003516 let w:netrw_explore_line = line(".")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003517 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar488c6512005-08-11 20:09:58 +00003518" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003519
3520 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003521 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003522 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 +00003523 endif
3524 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3525 endif
3526
Bram Moolenaar83bab712005-08-01 21:58:57 +00003527 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003528" call Decho("Explore newdir<".a:1.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003529 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003530 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003531 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003532
3533" call Dret("Explore")
3534endfun
3535
3536" ---------------------------------------------------------------------
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003537" SetupNetrwStatusLine: {{{2
3538fun! s:SetupNetrwStatusLine(statline)
3539" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
3540
3541 if !exists("s:netrw_setup_statline")
3542 let s:netrw_setup_statline= 1
3543" call Decho("do first-time status line setup")
3544
3545 if !exists("s:netrw_users_stl")
3546 let s:netrw_users_stl= &stl
3547 endif
3548 if !exists("s:netrw_users_ls")
3549 let s:netrw_users_ls= &laststatus
3550 endif
3551
3552 " set up User9 highlighting as needed
3553 let keepa= @a
3554 redir @a
3555 try
3556 hi User9
3557 catch /^Vim\%((\a\+)\)\=:E411/
3558 if &bg == "dark"
3559 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
3560 else
3561 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
3562 endif
3563 endtry
3564 redir END
3565 let @a= keepa
3566 endif
3567
3568 " set up status line (may use User9 highlighting)
3569 " insure that windows have a statusline
3570 " make sure statusline is displayed
3571 let &stl=a:statline
3572 set laststatus=2
3573" call Decho("stl=".&stl)
3574 redraw!
3575
3576" call Dret("SetupNetrwStatusLine : stl=".&stl)
3577endfun
3578
3579" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003580" NetrwStatusLine: {{{2
3581fun! NetrwStatusLine()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003582
3583 " vvv NetrwStatusLine() debugging vvv
3584" let g:stlmsg=""
3585" if !exists("w:netrw_explore_bufnr")
3586" let g:stlmsg="!X<explore_bufnr>"
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003587" elseif w:netrw_explore_bufnr != bufnr("%")
3588" let g:stlmsg="explore_bufnr!=".bufnr("%")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003589" endif
3590" if !exists("w:netrw_explore_line")
3591" let g:stlmsg=" !X<explore_line>"
3592" elseif w:netrw_explore_line != line(".")
3593" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
3594" endif
3595" if !exists("w:netrw_explore_list")
3596" let g:stlmsg=" !X<explore_list>"
3597" endif
3598 " ^^^ NetrwStatusLine() debugging ^^^
3599
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003600 if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003601 " restore user's status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003602 let &stl = s:netrw_users_stl
3603 let &laststatus = s:netrw_users_ls
Bram Moolenaar488c6512005-08-11 20:09:58 +00003604 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3605 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003606 return ""
3607 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003608 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003609 endif
3610endfun
3611
3612" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003613" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003614" Change backslashes to forward slashes, if any.
3615" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003616fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003617" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3618 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003619 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003620 let curdir= curdir.'/'
3621 endif
3622 if a:doesc
3623 let curdir= escape(curdir,s:netrw_cd_escape)
3624 endif
3625" call Dret("NetGetcwd <".curdir.">")
3626 return curdir
3627endfun
3628
3629" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003630" NetMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003631" method == 1: rcp
3632" 2: ftp + <.netrc>
3633" 3: ftp + machine, id, password, and [path]filename
3634" 4: scp
3635" 5: http (wget)
3636" 6: cadaver
3637" 7: rsync
3638" 8: fetch
3639" 9: sftp
3640fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003641" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003642
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003643 " initialization
3644 let b:netrw_method = 0
3645 let g:netrw_machine = ""
3646 let b:netrw_fname = ""
3647 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003648 let g:netrw_choice = a:choice
3649
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003650 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003651 " mipf : a:machine a:id password filename Use ftp
3652 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003653 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003654 " rcpurm : rcp://[user@]host/filename Use rcp
3655 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003656 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003657 " httpurm : http://[user@]host/filename Use wget
3658 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003659 " rsyncurm : rsync://host[:port]/path Use rsync
3660 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3661 " sftpurm : sftp://[user@]host/filename Use scp
3662 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3663 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3664 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003665 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003666 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003667 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003668 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003669 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003670 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3671 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3672 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003673
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003674" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003675 " Determine Method
3676 " rcp://user@hostname/...path-to-file
3677 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003678" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003679 let b:netrw_method = 1
3680 let userid = substitute(a:choice,rcpurm,'\1',"")
3681 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3682 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003683 if userid != ""
3684 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003685 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003686
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003687 " scp://user@hostname/...path-to-file
3688 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003689" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003690 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003691 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3692 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3693 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003694
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003695 " http://user@hostname/...path-to-file
3696 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003697" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003698 let b:netrw_method = 5
3699 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3700 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003701
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003702 " dav://hostname[:port]/..path-to-file..
3703 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003704" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003705 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003706 if a:choice =~ '^s'
3707 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3708 else
3709 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3710 endif
3711 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003712
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003713 " rsync://user@hostname/...path-to-file
3714 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003715" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003716 let b:netrw_method = 7
3717 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3718 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003719
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003720 " ftp://[user@]hostname[[:#]port]/...path-to-file
3721 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003722" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003723 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003724 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3725 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3726 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003727 if userid != ""
3728 let g:netrw_uid= userid
3729 endif
3730 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3731 let b:netrw_method = 3
3732 else
3733 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3734 let b:netrw_method= 2
3735 else
3736 if !exists("g:netrw_uid") || g:netrw_uid == ""
3737 call NetUserPass()
3738 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3739 call NetUserPass(g:netrw_uid)
3740 " else just use current g:netrw_uid and g:netrw_passwd
3741 endif
3742 let b:netrw_method= 3
3743 endif
3744 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003745
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003746 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003747" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003748 let b:netrw_method = 8
3749 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3750 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3751 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3752 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003753
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003754 " Issue an ftp : "machine id password [path/]filename"
3755 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003756" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003757 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003758 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3759 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3760 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3761 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003762
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003763 " Issue an ftp: "hostname [path/]filename"
3764 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003765" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003766 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3767 let b:netrw_method = 3
3768 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3769 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003770
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003771 elseif filereadable(expand("$HOME/.netrc"))
3772 let b:netrw_method = 2
3773 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3774 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3775 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003776
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003777 " sftp://user@hostname/...path-to-file
3778 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003779" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003780 let b:netrw_method = 9
3781 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3782 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003783
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003784 " Issue an rcp: hostname:filename" (this one should be last)
3785 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003786" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003787 let b:netrw_method = 1
3788 let userid = substitute(a:choice,rcphf,'\2',"")
3789 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3790 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003791" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3792" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3793" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3794" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003795 if userid != ""
3796 let g:netrw_uid= userid
3797 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003798 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003799 " don't let PCs try <.netrc>
3800 let b:netrw_method = 3
3801 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003802
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003803 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003804 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003805 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003806 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003807 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003808 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003809 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003810
3811 " remove any leading [:#] from port number
3812 if g:netrw_port != ""
3813 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3814 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003815
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003816" call Decho("a:choice <".a:choice.">")
3817" call Decho("b:netrw_method <".b:netrw_method.">")
3818" call Decho("g:netrw_machine<".g:netrw_machine.">")
3819" call Decho("g:netrw_port <".g:netrw_port.">")
3820" if exists("g:netrw_uid") "Decho
3821" call Decho("g:netrw_uid <".g:netrw_uid.">")
3822" endif "Decho
3823" if exists("g:netrw_passwd") "Decho
3824" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3825" endif "Decho
3826" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003827" call Dret("NetMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00003828endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003829
3830" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003831" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003832" Usage: :call NetUserPass() -- will prompt for userid and password
3833" :call NetUserPass("uid") -- will prompt for password
3834" :call NetUserPass("uid","password") -- sets global userid and password
3835fun! NetUserPass(...)
3836
3837 " get/set userid
3838 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003839" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003840 if !exists("g:netrw_uid") || g:netrw_uid == ""
3841 " via prompt
3842 let g:netrw_uid= input('Enter username: ')
3843 endif
3844 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003845" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003846 let g:netrw_uid= a:1
3847 endif
3848
3849 " get password
3850 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003851" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003852 let g:netrw_passwd= inputsecret("Enter Password: ")
3853 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003854" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003855 let g:netrw_passwd=a:2
3856 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003857
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003858" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003859endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003860
3861" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003862" NetOptionSave: save options and set to "standard" form {{{2
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003863fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003864" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003865 if !exists("w:netoptionsave")
3866 let w:netoptionsave= 1
3867 else
3868" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3869 return
3870 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003871
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003872 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003873 let w:aikeep = &ai
3874 " record autochdir setting and then insure its unset (tnx to David Fishburn)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003875 if &acd && (has("netbeans_intg") || has("sun_workshop"))
3876 set noacd
3877 echohl Warning | echomsg "***warning*** directory browsing and the acd setting are incompatible" |echohl None
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003878 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003879 let w:fokeep = &fo
3880 let w:aikeep = &ai
3881 let w:cikeep = &ci
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003882 let w:cinkeep = &cin
3883 let w:cinokeep = &cino
3884 let w:comkeep = &com
3885 let w:cpokeep = &cpo
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003886 let w:magickeep = &magic
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003887 if !g:netrw_keepdir
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003888 let w:dirkeep = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003889 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003890 let w:gdkeep = &gd
3891 let w:repkeep = &report
3892 let w:spellkeep = &spell
3893 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003894 setlocal cino =
3895 setlocal com =
3896 setlocal cpo -=aA
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003897 setlocal nocin noai noci magic nospell fo=nroql2
Bram Moolenaar8299df92004-07-10 09:47:34 +00003898 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003899 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003900 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003901 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003902 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003903" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003904 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003905
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003906" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003907endfun
3908
3909" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003910" NetOptionRestore: restore options {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003911fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003912" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003913 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003914" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003915 return
3916 endif
3917 unlet w:netoptionsave
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003918
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003919 if exists("w:aikeep")| let &ai= w:aikeep|endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003920 if exists("w:aikeep") |let &ai = w:aikeep |unlet w:aikeep |endif
3921 if exists("w:cikeep") |let &ci = w:cikeep |unlet w:cikeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003922 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3923 if exists("w:cinokeep") |let &cino = w:cinokeep |unlet w:cinokeep |endif
3924 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3925 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3926 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003927 if exists("w:fokeep") |let &fo = w:fokeep |unlet w:fokeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003928 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003929 if exists("w:magic") |let &magic = w:magic |unlet w:magic |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003930 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3931 if exists("w:spellkeep")|let &spell = w:spellkeep |unlet w:spellkeep|endif
3932 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003933 if exists("w:swfkeep")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003934 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003935 " user hasn't specified a swapfile directory;
3936 " netrw will temporarily make the swapfile
3937 " directory the current local one.
3938 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003939 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003940 set directory=
3941 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003942 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003943 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003944 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003945 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003946
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003947" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003948endfun
3949
3950" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003951" NetReadFixup: this sort of function is typically written by the user {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003952" to handle extra junk that their system's ftp dumps
3953" into the transfer. This function is provided as an
3954" example and as a fix for a Windows 95 problem: in my
3955" experience, win95's ftp always dumped four blank lines
3956" at the end of the transfer.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003957if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003958 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003959" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003960 if method == 3 " ftp (no <.netrc>)
3961 let fourblanklines= line2 - 3
3962 silent fourblanklines.",".line2."g/^\s*/d"
3963 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003964" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003965 endfun
3966endif
3967
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003968" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003969" NetSort: Piet Delport's BISort2() function, modified to take a range {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00003970if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003971 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00003972" " call Dfunc("NetSort()")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003973
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003974 let i = a:firstline + 1
3975 while i <= a:lastline
3976 " find insertion point via binary search
3977 let i_val = getline(i)
3978 let lo = a:firstline
3979 let hi = i
3980 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003981 let mid = (lo + hi) / 2
3982 let mid_val = getline(mid)
3983 if g:netrw_sort_direction =~ '^n'
3984 " normal sorting order
3985 if i_val < mid_val
3986 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003987 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003988 let lo = mid + 1
3989 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003990 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003991 else
3992 " reverse sorting order
3993 if i_val > mid_val
3994 let hi = mid
3995 else
3996 let lo = mid + 1
3997 if i_val == mid_val | break | endif
3998 endif
3999 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004000 endwhile
4001 " do insert
4002 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00004003 exe 'keepjumps '.i.'d_'
4004 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004005 endif
4006 let i = i + 1
4007 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004008
Bram Moolenaar83bab712005-08-01 21:58:57 +00004009" " call Dret("NetSort")
4010 endfun
4011endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004012
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004013" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004014" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00004015" What this function does is to compute a priority for the patterns
4016" in the g:netrw_sort_sequence. It applies a substitute to any
4017" "files" that satisfy each pattern, putting the priority / in
4018" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004019fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00004020" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004021 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00004022 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
4023 else
4024 let seqlist = g:netrw_sort_sequence
4025 endif
4026 " sanity check -- insure that * appears somewhere
4027 if seqlist == ""
4028 let seqlist= '*'
4029 elseif seqlist !~ '\*'
4030 let seqlist= seqlist.',*'
4031 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004032 let priority = 1
4033 while seqlist != ""
4034 if seqlist =~ ','
4035 let seq = substitute(seqlist,',.*$','','e')
4036 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
4037 else
4038 let seq = seqlist
4039 let seqlist = ""
4040 endif
4041 let eseq= escape(seq,'/')
4042 if priority < 10
4043 let spriority= "00".priority.'\/'
4044 elseif priority < 100
4045 let spriority= "0".priority.'\/'
4046 else
4047 let spriority= priority.'\/'
4048 endif
4049" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
4050
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004051 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00004052 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004053 " apparently no files were left after a Hiding pattern was used
4054" call Dret("SetSort : no files left after hiding")
4055 return
4056 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004057 if seq == '*'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004058 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004059 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004060 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004061 endif
4062 let priority = priority + 1
4063 endwhile
4064
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004065 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004066
4067" call Dret("SetSort")
4068endfun
4069
Bram Moolenaar488c6512005-08-11 20:09:58 +00004070" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004071" SaveWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004072fun! s:SaveWinVars()
4073" call Dfunc("SaveWinVars()")
4074 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
4075 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
4076 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
4077 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
4078 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
4079 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4080 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
4081 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004082 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00004083" call Dret("SaveWinVars")
4084endfun
4085
4086" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004087" CopyWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004088fun! s:CopyWinVars()
4089" call Dfunc("CopyWinVars()")
4090 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
4091 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
4092 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
4093 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
4094 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
4095 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
4096 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
4097 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004098 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00004099" call Dret("CopyWinVars")
4100endfun
4101
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004102" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004103" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004104" To allow separate windows to have their own activities, such as
4105" Explore **/pattern, several variables have been made window-oriented.
4106" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004107" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004108" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004109fun! s:SetBufWinVars()
4110" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004111 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004112 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
4113 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
4114 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
4115 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
4116 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
4117 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4118 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
4119 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
4120 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004121" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004122endfun
4123
4124" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004125" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004126" Matching function to BufferWinVars()
4127fun! s:UseBufWinVars()
4128" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004129 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004130 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
4131 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
4132 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
4133 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
4134 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
4135 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
4136 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
4137 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
4138 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
4139" call Dret("UseBufWinVars")
4140endfun
4141
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004142" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004143" RFC2396: converts %xx into characters {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004144fun! netrw#RFC2396(fname)
4145" call Dfunc("RFC2396(fname<".a:fname.">)")
4146 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
4147" call Dret("RFC2396 ".fname)
4148 return fname
4149endfun
4150
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004151" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004152" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004153let &cpo= s:keepcpo
4154unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004155
Bram Moolenaar071d4272004-06-13 20:20:40 +00004156" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00004157" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00004158" vim:ts=8 fdm=marker