blob: 4f8f0a1c072b8c8ba5962e123dc65885be6abdad [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 Moolenaar433f7c82006-03-21 21:29:36 +00003" Date: Mar 21, 2006
4" Version: 82
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 Moolenaar433f7c82006-03-21 21:29:36 +000026let g:loaded_netrw = "v82"
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 Moolenaar433f7c82006-03-21 21:29:36 +00001321 nnoremap <buffer> <F1> :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
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00002806 call s:LocalFastBrowser()
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002807
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002808 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002809 if has("win32") || has("win95") || has("win64") || has("win16")
2810 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2811 else
2812 let b:netrw_curdir= a:dirname
2813 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002814 if b:netrw_curdir =~ '[/\\]$'
2815 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2816 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002817 if b:netrw_curdir == ''
2818 " under unix, when the root directory is encountered, the result
2819 " from the preceding substitute is an empty string.
2820 let b:netrw_curdir= '/'
2821 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002822" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002823
Bram Moolenaar83bab712005-08-01 21:58:57 +00002824 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002825 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002826" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002827 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002828 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002829 catch /^Vim\%((\a\+)\)\=:E472/
2830 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2831 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2832 if exists("w:netrw_prvdir")
2833 let b:netrw_curdir= w:netrw_prvdir
2834 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002835 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002836" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002837 return
2838 endif
2839 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002840 endif
2841
2842 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002843 " Hmm. When another vim is open to the same directory, I get
2844 " a "Press ENTER" ... ok, setting "noswf" avoids it.
2845" call Decho('exe silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002846 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002847
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002848 " make this buffer not-a-file, modifiable, not line-numbered, etc
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002849 setlocal bt=nofile nobl ma nonu noswf nowrap
2850 if g:netrw_fastbrowse >= 2
2851 setlocal bh=hide
2852 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002853 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002854
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002855 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002856 " Perform Directory Listing:
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002857 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2858 echo "(netrw) Processing your browsing request..."
2859 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002860
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002861 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002862 call s:NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002863
Bram Moolenaar8299df92004-07-10 09:47:34 +00002864 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002865" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002866 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002867 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002868 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002869 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 +00002870 if w:netrw_longlist != 2
2871 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2872 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2873 endif
2874 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2875 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002876 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2877 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2878 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002879 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002880 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002881 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2882 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002883 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002884 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002885 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 +00002886 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>
2887 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002888 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2889 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002890 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002891 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002892 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002893 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2894 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002895 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002896 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002897 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002898 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002899 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002900 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002901 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00002902 nnoremap <buffer> <F1> :he netrw-dir<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002903
2904 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002905" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002906 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002907 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002908 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002909 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002910 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002911
2912 let sortby= g:netrw_sort_by
2913 if g:netrw_sort_direction =~ "^r"
2914 let sortby= sortby." reversed"
2915 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002916
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002917 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002918 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002919" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002920 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002921 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002922 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002923 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002924 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002925" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002926 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002927 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002928 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002929 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002930
2931 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002932 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002933 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002934 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002935 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002936 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002937 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002938 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002939 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002940 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2941 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002942 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002943
2944 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002945 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2946" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002947
2948 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002949 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002950
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002951 " set up syntax highlighting
2952 if has("syntax")
2953 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002954 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002955 setlocal ft=
2956 endif
2957 endif
2958
Bram Moolenaar8299df92004-07-10 09:47:34 +00002959 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002960 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002961 if g:netrw_hide && g:netrw_list_hide != ""
2962 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002963 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002964 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002965
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002966 if g:netrw_sort_by =~ "^n"
2967 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002968
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002969 if w:netrw_bannercnt < line("$")
2970 if g:netrw_sort_direction =~ 'n'
2971 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2972 else
2973 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2974 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002975 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002976 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002977
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002978 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002979 if w:netrw_bannercnt < line("$")
2980 if g:netrw_sort_direction =~ 'n'
2981 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2982 else
2983 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2984 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002985 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002986 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002987 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002988
Bram Moolenaar8299df92004-07-10 09:47:34 +00002989 endif
2990 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002991
2992 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002993 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002994 " place cursor on the top-left corner of the file listing
2995 exe 'silent '.w:netrw_bannercnt
2996 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002997 endif
2998
2999 " record previous current directory
3000 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00003001
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003002 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003003 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003004 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003005 setlocal noma nomod nonu nobl nowrap
3006 if g:netrw_fastbrowse >= 2
3007 setlocal bh=hide
3008 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003009
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003010" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003011endfun
3012
3013" ---------------------------------------------------------------------
3014" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003015fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003016" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003017
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003018 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00003019 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
3020 let dirnamelen = strlen(b:netrw_curdir)
3021 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003022" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003023 if filelist != ""
3024 let filelist= filelist."\n"
3025 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003026 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003027" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
3028
3029 " if the directory name includes a "$", and possibly other characters,
3030 " the glob() doesn't include "." and ".." entries.
3031 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
3032" call Decho("forcibly tacking on .")
3033 if filelist == ""
3034 let filelist= dirname."."
3035 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003036 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003037 endif
3038" call Decho("filelist<".filelist.">")
3039 endif
3040 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
3041" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003042 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003043" call Decho("filelist<".filelist.">")
3044 endif
3045 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003046 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003047
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003048" call Decho("dirname<".dirname.">")
3049" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003050" call Decho("filelist<".filelist.">")
3051
3052 while filelist != ""
3053 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003054 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003055 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
3056 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003057 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00003058 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00003059 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003060 let pfile= filename
3061 if isdirectory(filename)
3062 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00003063 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003064 if pfile =~ '//$'
3065 let pfile= substitute(pfile,'//$','/','e')
3066 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003067 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00003068 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00003069" call Decho(" ")
3070" call Decho("filename<".filename.">")
3071" call Decho("pfile <".pfile.">")
3072
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003073 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003074 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003075 let fsz = strpart(" ",1,15-strlen(sz)).sz
3076 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00003077" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003078 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003079
Bram Moolenaar8299df92004-07-10 09:47:34 +00003080 if g:netrw_sort_by =~ "^t"
3081 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003082" call Decho("getftime(".filename.")=".getftime(filename))
3083 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003084 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00003085" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003086 let ftpfile= ft.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003087 keepjumps silent! put=ftpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003088
Bram Moolenaar8299df92004-07-10 09:47:34 +00003089 elseif g:netrw_sort_by =~ "^s"
3090 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003091" call Decho("getfsize(".filename.")=".getfsize(filename))
3092 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003093 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00003094" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003095 let fszpfile= fsz.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003096 keepjumps silent! put =fszpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003097
Bram Moolenaar8299df92004-07-10 09:47:34 +00003098 else
3099 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003100" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003101 keepjumps silent! put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00003102 endif
3103 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003104
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003105 " cleanup any windows mess at end-of-line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003106 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00003107 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00003108
3109" call Dret("LocalBrowseList")
3110endfun
3111
3112" ---------------------------------------------------------------------
3113" LocalBrowseChgDir: constructs a new directory based on the current {{{2
3114" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003115fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003116" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003117
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003118 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003119 let newdir = a:newdir
3120
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003121 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003122 " apparently vim is "recognizing" that it is in the home directory and
3123 " is removing the "/". Bad idea, so I have to put it back.
3124 let dirname= dirname.'/'
3125" call Decho("adjusting dirname<".dirname.">")
3126 endif
3127
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003128 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003129 " handling a file
3130 let dirname= dirname.newdir
3131" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003132 " this lets NetBrowseX avoid the edit
3133 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003134" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
3135" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003136 if g:netrw_browse_split == 1
3137 new
3138 wincmd _
3139 elseif g:netrw_browse_split == 2
3140 rightb vert new
3141 wincmd |
3142 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003143 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003144 call s:NetMenu()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003145 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003146 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003147
3148 elseif newdir == './'
3149 " refresh the directory list
3150" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003151
3152 elseif newdir == '../'
3153 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003154 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003155" call Decho("go up one dir: dirname<".dirname.">")
3156
3157 else
3158 " go down one directory
3159 let dirname= dirname.newdir
3160" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
3161 endif
3162
3163" call Dret("LocalBrowseChgDir <".dirname.">")
3164 return dirname
3165endfun
3166
3167" ---------------------------------------------------------------------
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003168" LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
3169" performed any shell command. The idea is to cause all local-browsing
3170" buffers to be refreshed after a user has executed some shell command,
3171" on the chance that s/he removed/created a file/directory with it.
3172fun! s:LocalBrowseShellCmdRefresh()
3173" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
3174 " go through all buffers,
3175 " including unlisted (which is why I can't use bufdo)
3176 let curwin = winnr()
3177 let ibl = 0
3178 for ibuf in s:netrw_browselist
3179 if bufwinnr(ibuf) == -1
3180" call Decho("wiping buf#".ibuf)
3181 exe "bw ".ibuf
3182 call remove(s:netrw_browselist,ibl)
3183" call Decho("browselist=".string(s:netrw_browselist))
3184 continue
3185 else
3186" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
3187 exe bufwinnr(ibuf)."wincmd w"
3188 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
3189 endif
3190 let ibl= ibl + 1
3191 endfor
3192 exe curwin."wincmd w"
3193
3194" call Dret("LocalBrowseShellCmdRefresh")
3195endfun
3196
3197" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00003198" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003199fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003200" call Dfunc("LocalBrowseRm(path<".a:path.">)")
3201" call Decho("firstline=".a:firstline." lastline=".a:lastline)
3202
3203 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003204 let ctr = a:firstline
3205 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003206 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00003207
3208 " remove multiple files and directories
3209 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003210 exe "keepjumps ".ctr
3211
3212 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003213 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003214 let ctr= ctr + 1
3215 continue
3216 endif
3217 let curword= s:NetGetWord()
3218 if curword == "./" || curword == "../"
3219 let ctr= ctr + 1
3220 continue
3221 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003222
3223 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00003224 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003225" call Decho("rmfile<".rmfile.">")
3226
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003227 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003228 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003229 if !all
3230 echohl Statement
3231 call inputsave()
3232 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3233 call inputrestore()
3234 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003235 if ok == ""
3236 let ok="no"
3237 endif
3238" call Decho("response: ok<".ok.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003239 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003240" call Decho("response: ok<".ok."> (after sub)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003241 if ok =~ 'a\%[ll]'
3242 let all= 1
3243 endif
3244 endif
3245
3246 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003247 let ret= delete(rmfile)
3248" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003249 elseif ok =~ 'q\%[uit]'
3250 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003251 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003252
Bram Moolenaar8299df92004-07-10 09:47:34 +00003253 else
3254 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003255 if !all
3256 echohl Statement
3257 call inputsave()
3258 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3259 call inputrestore()
3260 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003261 if ok == ""
3262 let ok="no"
3263 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003264 if ok =~ 'a\%[ll]'
3265 let all= 1
3266 endif
3267 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003268 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003269
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003270 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003271" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
3272 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003273" call Decho("v:shell_error=".v:shell_error)
3274
3275 if v:shell_error != 0
3276" call Decho("2nd attempt to remove directory<".rmfile.">")
3277 let errcode= delete(rmfile)
3278" call Decho("errcode=".errcode)
3279
3280 if errcode != 0
3281 if has("unix")
3282" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003283call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003284 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003285 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003286 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003287endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003288 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003289 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003290 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00003291 endif
3292 endif
3293 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003294
3295 elseif ok =~ 'q\%[uit]'
3296 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003297 endif
3298 endif
3299
3300 let ctr= ctr + 1
3301 endwhile
3302
3303 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003304 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003305" call Decho("refresh the directory")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003306 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003307 exe curline
3308
3309" call Dret("LocalBrowseRm")
3310endfun
3311
3312" ---------------------------------------------------------------------
3313" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003314fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003315" call Dfunc("LocalBrowseRename(path<".a:path.">)")
3316
3317 " preparation for removing multiple files/directories
3318 let ctr= a:firstline
3319
3320 " attempt to rename files/directories
3321 while ctr <= a:lastline
3322 exe "keepjumps ".ctr
3323
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003324 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003325 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003326 let ctr= ctr + 1
3327 continue
3328 endif
3329 let curword= s:NetGetWord()
3330 if curword == "./" || curword == "../"
3331 let ctr= ctr + 1
3332 continue
3333 endif
3334
Bram Moolenaar8299df92004-07-10 09:47:34 +00003335 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00003336 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003337" call Decho("oldname<".oldname.">")
3338
3339 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003340 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00003341 call inputrestore()
3342
Bram Moolenaar83bab712005-08-01 21:58:57 +00003343 let ret= rename(oldname,newname)
3344" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003345
3346 let ctr= ctr + 1
3347 endwhile
3348
3349 " refresh the directory
3350 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00003351" call Decho("refresh the directory listing")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003352 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003353 exe "keepjumps ".curline
3354" call Dret("LocalBrowseRename")
3355endfun
3356
3357" ---------------------------------------------------------------------
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003358" LocalFastBrowser: handles setting up/taking down fast browsing for the {{{2
3359" local browser
3360fun! s:LocalFastBrowser()
3361" call Dfunc("LocalFastBrowser()")
3362
3363 " initialize browselist, a list of buffer numbers that the local browser has used
3364 if !exists("s:netrw_browselist")
3365 let s:netrw_browselist= []
3366 endif
3367
3368 " append current buffer to fastbrowse list
3369 if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
3370 call add(s:netrw_browselist,bufnr("%"))
3371" call Decho("browselist=".string(s:netrw_browselist))
3372 endif
3373
3374 " enable autocmd events to handle refreshing/removing local browser buffers
3375 " If local browse buffer is currently showing: refresh it
3376 " If local browse buffer is currently hidden : wipe it
3377 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
3378" call Decho("setting up local-browser shell command refresh")
3379 let s:netrw_browser_shellcmd= 1
3380 augroup AuNetrwShellCmd
3381 au!
3382 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
3383 augroup END
3384
3385 " user must have changed fastbrowse to its fast setting, so remove
3386 " the associated autocmd events
3387 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
3388 unlet s:netrw_browser_shellcmd
3389 augroup AuNetrwShellCmd
3390 au!
3391 augroup END
3392 augroup! AuNetrwShellCmd
3393 endif
3394
3395" call Dret("LocalFastBrowser")
3396endfun
3397
3398" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003399" LocalObtain: copy selected file to current working directory {{{2
3400fun! s:LocalObtain()
3401" call Dfunc("LocalObtain()")
3402 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
3403 let fname= expand("<cWORD>")
3404 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
3405 call writefile(fcopy,getcwd()."/".fname,"b")
3406 elseif !exists("b:netrw_curdir")
3407 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
3408 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3409 else
3410 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
3411 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3412 endif
3413" call Dret("LocalObtain")
3414endfun
3415
3416" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003417" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003418fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003419" call Dfunc("LocalPreview(path<".a:path.">)")
3420 if has("quickfix")
3421 if !isdirectory(a:path)
3422 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003423 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003424 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003425 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003426 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003427 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003428 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003429 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003430 endif
3431" call Dret("LocalPreview")
3432endfun
3433
3434" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003435" Explore: launch the local browser in the directory of the current file {{{2
3436" dosplit==0: the window will be split iff the current file has
3437" been modified
3438" dosplit==1: the window will be split before running the local
3439" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003440fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003441" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003442
3443 " if dosplit or file has been modified
3444 if a:dosplit || &modified
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003445 call s:SaveWinVars()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003446
Bram Moolenaar83bab712005-08-01 21:58:57 +00003447 if a:style == 0 " Explore, Sexplore
3448 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003449" call Decho("style=0: Explore or Sexplore")
3450
Bram Moolenaar83bab712005-08-01 21:58:57 +00003451 elseif a:style == 1 "Explore!, Sexplore!
3452 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003453" call Decho("style=1: Explore! or Sexplore!")
3454
Bram Moolenaar83bab712005-08-01 21:58:57 +00003455 elseif a:style == 2 " Hexplore
3456 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003457" call Decho("style=2: Hexplore")
3458
Bram Moolenaar83bab712005-08-01 21:58:57 +00003459 elseif a:style == 3 " Hexplore!
3460 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003461" call Decho("style=3: Hexplore!")
3462
Bram Moolenaar83bab712005-08-01 21:58:57 +00003463 elseif a:style == 4 " Vexplore
3464 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003465" call Decho("style=4: Vexplore")
3466
Bram Moolenaar83bab712005-08-01 21:58:57 +00003467 elseif a:style == 5 " Vexplore!
3468 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003469" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003470 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003471 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003472 endif
3473 norm! 0
3474
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003475 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003476 " Explore Hexplore Vexplore Sexplore
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003477" call Decho("Explore Hexplore Vexplore Sexplore")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003478 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3479 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3480" call Decho("calling NetBrowse(newdir<".newdir.">)")
3481 call s:NetBrowse(newdir)
3482 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003483 if newdir == ""|let newdir= getcwd()|endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003484" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3485 call s:LocalBrowse(newdir)
3486 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003487
Bram Moolenaar572cb562005-08-05 21:35:02 +00003488 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003489 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003490" call Decho("Nexplore Pexplore -or- Explore **/...")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003491
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003492 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003493 if !exists("w:netrw_explore_indx")
3494 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003495 endif
3496 let indx = a:indx
3497 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003498 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003499 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003500 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003501 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003502 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003503 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003504 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003505 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003506 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3507 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3508 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003509 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3510 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3511" call Dret("Explore")
3512 return
3513 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003514 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003515
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003516 " NetrwStatusLine support - for exploring support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003517 let w:netrw_explore_indx= indx
Bram Moolenaar488c6512005-08-11 20:09:58 +00003518" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003519
3520 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003521 if indx >= w:netrw_explore_listlen || indx < 0
3522 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003523 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003524 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3525" call Dret("Explore")
3526 return
3527 endif
3528
Bram Moolenaar488c6512005-08-11 20:09:58 +00003529 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003530" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003531 let newdir= substitute(dirfile,'/[^/]*$','','e')
3532" call Decho("newdir<".newdir.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003533
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003534" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3535 call s:LocalBrowse(newdir)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003536 if w:netrw_longlist == 0 || w:netrw_longlist == 1
3537 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3538 else
3539 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3540 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003541 let w:netrw_explore_mtchcnt = indx + 1
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003542 let w:netrw_explore_bufnr = bufnr("%")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003543 let w:netrw_explore_line = line(".")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003544 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar488c6512005-08-11 20:09:58 +00003545" 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 +00003546
3547 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003548 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003549 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 +00003550 endif
3551 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3552 endif
3553
Bram Moolenaar83bab712005-08-01 21:58:57 +00003554 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003555" call Decho("Explore newdir<".a:1.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003556 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003557 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003558 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003559
3560" call Dret("Explore")
3561endfun
3562
3563" ---------------------------------------------------------------------
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003564" SetupNetrwStatusLine: {{{2
3565fun! s:SetupNetrwStatusLine(statline)
3566" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
3567
3568 if !exists("s:netrw_setup_statline")
3569 let s:netrw_setup_statline= 1
3570" call Decho("do first-time status line setup")
3571
3572 if !exists("s:netrw_users_stl")
3573 let s:netrw_users_stl= &stl
3574 endif
3575 if !exists("s:netrw_users_ls")
3576 let s:netrw_users_ls= &laststatus
3577 endif
3578
3579 " set up User9 highlighting as needed
3580 let keepa= @a
3581 redir @a
3582 try
3583 hi User9
3584 catch /^Vim\%((\a\+)\)\=:E411/
3585 if &bg == "dark"
3586 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
3587 else
3588 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
3589 endif
3590 endtry
3591 redir END
3592 let @a= keepa
3593 endif
3594
3595 " set up status line (may use User9 highlighting)
3596 " insure that windows have a statusline
3597 " make sure statusline is displayed
3598 let &stl=a:statline
3599 set laststatus=2
3600" call Decho("stl=".&stl)
3601 redraw!
3602
3603" call Dret("SetupNetrwStatusLine : stl=".&stl)
3604endfun
3605
3606" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003607" NetrwStatusLine: {{{2
3608fun! NetrwStatusLine()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003609
3610 " vvv NetrwStatusLine() debugging vvv
3611" let g:stlmsg=""
3612" if !exists("w:netrw_explore_bufnr")
3613" let g:stlmsg="!X<explore_bufnr>"
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003614" elseif w:netrw_explore_bufnr != bufnr("%")
3615" let g:stlmsg="explore_bufnr!=".bufnr("%")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003616" endif
3617" if !exists("w:netrw_explore_line")
3618" let g:stlmsg=" !X<explore_line>"
3619" elseif w:netrw_explore_line != line(".")
3620" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
3621" endif
3622" if !exists("w:netrw_explore_list")
3623" let g:stlmsg=" !X<explore_list>"
3624" endif
3625 " ^^^ NetrwStatusLine() debugging ^^^
3626
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003627 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 +00003628 " restore user's status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003629 let &stl = s:netrw_users_stl
3630 let &laststatus = s:netrw_users_ls
Bram Moolenaar488c6512005-08-11 20:09:58 +00003631 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3632 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003633 return ""
3634 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003635 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003636 endif
3637endfun
3638
3639" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003640" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003641" Change backslashes to forward slashes, if any.
3642" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003643fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003644" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3645 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003646 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003647 let curdir= curdir.'/'
3648 endif
3649 if a:doesc
3650 let curdir= escape(curdir,s:netrw_cd_escape)
3651 endif
3652" call Dret("NetGetcwd <".curdir.">")
3653 return curdir
3654endfun
3655
3656" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003657" NetMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003658" method == 1: rcp
3659" 2: ftp + <.netrc>
3660" 3: ftp + machine, id, password, and [path]filename
3661" 4: scp
3662" 5: http (wget)
3663" 6: cadaver
3664" 7: rsync
3665" 8: fetch
3666" 9: sftp
3667fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003668" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003669
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003670 " initialization
3671 let b:netrw_method = 0
3672 let g:netrw_machine = ""
3673 let b:netrw_fname = ""
3674 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003675 let g:netrw_choice = a:choice
3676
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003677 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003678 " mipf : a:machine a:id password filename Use ftp
3679 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003680 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003681 " rcpurm : rcp://[user@]host/filename Use rcp
3682 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003683 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003684 " httpurm : http://[user@]host/filename Use wget
3685 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003686 " rsyncurm : rsync://host[:port]/path Use rsync
3687 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3688 " sftpurm : sftp://[user@]host/filename Use scp
3689 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3690 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3691 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003692 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003693 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003694 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003695 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003696 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003697 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3698 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3699 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003700
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003701" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003702 " Determine Method
3703 " rcp://user@hostname/...path-to-file
3704 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003705" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003706 let b:netrw_method = 1
3707 let userid = substitute(a:choice,rcpurm,'\1',"")
3708 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3709 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003710 if userid != ""
3711 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003712 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003713
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003714 " scp://user@hostname/...path-to-file
3715 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003716" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003717 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003718 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3719 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3720 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003721
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003722 " http://user@hostname/...path-to-file
3723 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003724" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003725 let b:netrw_method = 5
3726 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3727 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003728
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003729 " dav://hostname[:port]/..path-to-file..
3730 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003731" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003732 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003733 if a:choice =~ '^s'
3734 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3735 else
3736 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3737 endif
3738 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003739
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003740 " rsync://user@hostname/...path-to-file
3741 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003742" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003743 let b:netrw_method = 7
3744 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3745 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003746
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003747 " ftp://[user@]hostname[[:#]port]/...path-to-file
3748 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003749" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003750 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003751 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3752 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3753 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003754 if userid != ""
3755 let g:netrw_uid= userid
3756 endif
3757 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3758 let b:netrw_method = 3
3759 else
3760 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3761 let b:netrw_method= 2
3762 else
3763 if !exists("g:netrw_uid") || g:netrw_uid == ""
3764 call NetUserPass()
3765 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3766 call NetUserPass(g:netrw_uid)
3767 " else just use current g:netrw_uid and g:netrw_passwd
3768 endif
3769 let b:netrw_method= 3
3770 endif
3771 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003772
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003773 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003774" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003775 let b:netrw_method = 8
3776 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3777 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3778 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3779 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003780
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003781 " Issue an ftp : "machine id password [path/]filename"
3782 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003783" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003784 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003785 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3786 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3787 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3788 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003789
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003790 " Issue an ftp: "hostname [path/]filename"
3791 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003792" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003793 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3794 let b:netrw_method = 3
3795 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3796 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003797
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003798 elseif filereadable(expand("$HOME/.netrc"))
3799 let b:netrw_method = 2
3800 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3801 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3802 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003803
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003804 " sftp://user@hostname/...path-to-file
3805 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003806" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003807 let b:netrw_method = 9
3808 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3809 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003810
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003811 " Issue an rcp: hostname:filename" (this one should be last)
3812 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003813" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003814 let b:netrw_method = 1
3815 let userid = substitute(a:choice,rcphf,'\2',"")
3816 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3817 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003818" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3819" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3820" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3821" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003822 if userid != ""
3823 let g:netrw_uid= userid
3824 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003825 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003826 " don't let PCs try <.netrc>
3827 let b:netrw_method = 3
3828 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003829
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003830 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003831 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003832 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003833 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003834 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003835 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003836 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003837
3838 " remove any leading [:#] from port number
3839 if g:netrw_port != ""
3840 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3841 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003842
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003843" call Decho("a:choice <".a:choice.">")
3844" call Decho("b:netrw_method <".b:netrw_method.">")
3845" call Decho("g:netrw_machine<".g:netrw_machine.">")
3846" call Decho("g:netrw_port <".g:netrw_port.">")
3847" if exists("g:netrw_uid") "Decho
3848" call Decho("g:netrw_uid <".g:netrw_uid.">")
3849" endif "Decho
3850" if exists("g:netrw_passwd") "Decho
3851" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3852" endif "Decho
3853" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003854" call Dret("NetMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00003855endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003856
3857" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003858" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003859" Usage: :call NetUserPass() -- will prompt for userid and password
3860" :call NetUserPass("uid") -- will prompt for password
3861" :call NetUserPass("uid","password") -- sets global userid and password
3862fun! NetUserPass(...)
3863
3864 " get/set userid
3865 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003866" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003867 if !exists("g:netrw_uid") || g:netrw_uid == ""
3868 " via prompt
3869 let g:netrw_uid= input('Enter username: ')
3870 endif
3871 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003872" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003873 let g:netrw_uid= a:1
3874 endif
3875
3876 " get password
3877 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003878" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003879 let g:netrw_passwd= inputsecret("Enter Password: ")
3880 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003881" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003882 let g:netrw_passwd=a:2
3883 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003884
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003885" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003886endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003887
3888" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003889" NetOptionSave: save options and set to "standard" form {{{2
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003890fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003891" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003892 if !exists("w:netoptionsave")
3893 let w:netoptionsave= 1
3894 else
3895" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3896 return
3897 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003898
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003899 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003900 let w:aikeep = &ai
3901 " record autochdir setting and then insure its unset (tnx to David Fishburn)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003902 if &acd && (has("netbeans_intg") || has("sun_workshop"))
3903 set noacd
3904 echohl Warning | echomsg "***warning*** directory browsing and the acd setting are incompatible" |echohl None
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003905 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003906 let w:fokeep = &fo
3907 let w:aikeep = &ai
3908 let w:cikeep = &ci
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003909 let w:cinkeep = &cin
3910 let w:cinokeep = &cino
3911 let w:comkeep = &com
3912 let w:cpokeep = &cpo
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003913 let w:hidkeep = &hidden
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003914 let w:magickeep = &magic
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003915 if !g:netrw_keepdir
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003916 let w:dirkeep = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003917 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003918 let w:gdkeep = &gd
3919 let w:repkeep = &report
3920 let w:spellkeep = &spell
3921 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003922 setlocal cino =
3923 setlocal com =
3924 setlocal cpo -=aA
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003925 setlocal nocin noai noci magic nospell fo=nroql2 nohid
Bram Moolenaar8299df92004-07-10 09:47:34 +00003926 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003927 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003928 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003929 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003930 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003931" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003932 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003933
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003934" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003935endfun
3936
3937" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003938" NetOptionRestore: restore options {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003939fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003940" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003941 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003942" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003943 return
3944 endif
3945 unlet w:netoptionsave
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003946
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003947 if exists("w:aikeep")| let &ai= w:aikeep|endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003948 if exists("w:aikeep") |let &ai = w:aikeep |unlet w:aikeep |endif
3949 if exists("w:cikeep") |let &ci = w:cikeep |unlet w:cikeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003950 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3951 if exists("w:cinokeep") |let &cino = w:cinokeep |unlet w:cinokeep |endif
3952 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3953 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3954 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003955 if exists("w:fokeep") |let &fo = w:fokeep |unlet w:fokeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003956 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003957 if exists("w:hidkeep") |let &hidden = w:hidkeep |unlet w:hidkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003958 if exists("w:magic") |let &magic = w:magic |unlet w:magic |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003959 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3960 if exists("w:spellkeep")|let &spell = w:spellkeep |unlet w:spellkeep|endif
3961 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003962 if exists("w:swfkeep")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003963 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003964 " user hasn't specified a swapfile directory;
3965 " netrw will temporarily make the swapfile
3966 " directory the current local one.
3967 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003968 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003969 set directory=
3970 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003971 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003972 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003973 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003974 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003975
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003976" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003977endfun
3978
3979" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003980" NetReadFixup: this sort of function is typically written by the user {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003981" to handle extra junk that their system's ftp dumps
3982" into the transfer. This function is provided as an
3983" example and as a fix for a Windows 95 problem: in my
3984" experience, win95's ftp always dumped four blank lines
3985" at the end of the transfer.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003986if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003987 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003988" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003989 if method == 3 " ftp (no <.netrc>)
3990 let fourblanklines= line2 - 3
3991 silent fourblanklines.",".line2."g/^\s*/d"
3992 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003993" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003994 endfun
3995endif
3996
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003997" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003998" NetSort: Piet Delport's BISort2() function, modified to take a range {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00003999if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004000 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00004001" " call Dfunc("NetSort()")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004002
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004003 let i = a:firstline + 1
4004 while i <= a:lastline
4005 " find insertion point via binary search
4006 let i_val = getline(i)
4007 let lo = a:firstline
4008 let hi = i
4009 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00004010 let mid = (lo + hi) / 2
4011 let mid_val = getline(mid)
4012 if g:netrw_sort_direction =~ '^n'
4013 " normal sorting order
4014 if i_val < mid_val
4015 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004016 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00004017 let lo = mid + 1
4018 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004019 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00004020 else
4021 " reverse sorting order
4022 if i_val > mid_val
4023 let hi = mid
4024 else
4025 let lo = mid + 1
4026 if i_val == mid_val | break | endif
4027 endif
4028 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004029 endwhile
4030 " do insert
4031 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00004032 exe 'keepjumps '.i.'d_'
4033 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004034 endif
4035 let i = i + 1
4036 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004037
Bram Moolenaar83bab712005-08-01 21:58:57 +00004038" " call Dret("NetSort")
4039 endfun
4040endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004041
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004042" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004043" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00004044" What this function does is to compute a priority for the patterns
4045" in the g:netrw_sort_sequence. It applies a substitute to any
4046" "files" that satisfy each pattern, putting the priority / in
4047" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004048fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00004049" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004050 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00004051 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
4052 else
4053 let seqlist = g:netrw_sort_sequence
4054 endif
4055 " sanity check -- insure that * appears somewhere
4056 if seqlist == ""
4057 let seqlist= '*'
4058 elseif seqlist !~ '\*'
4059 let seqlist= seqlist.',*'
4060 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004061 let priority = 1
4062 while seqlist != ""
4063 if seqlist =~ ','
4064 let seq = substitute(seqlist,',.*$','','e')
4065 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
4066 else
4067 let seq = seqlist
4068 let seqlist = ""
4069 endif
4070 let eseq= escape(seq,'/')
4071 if priority < 10
4072 let spriority= "00".priority.'\/'
4073 elseif priority < 100
4074 let spriority= "0".priority.'\/'
4075 else
4076 let spriority= priority.'\/'
4077 endif
4078" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
4079
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004080 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00004081 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004082 " apparently no files were left after a Hiding pattern was used
4083" call Dret("SetSort : no files left after hiding")
4084 return
4085 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004086 if seq == '*'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004087 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004088 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004089 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004090 endif
4091 let priority = priority + 1
4092 endwhile
4093
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004094 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004095
4096" call Dret("SetSort")
4097endfun
4098
Bram Moolenaar488c6512005-08-11 20:09:58 +00004099" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004100" SaveWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004101fun! s:SaveWinVars()
4102" call Dfunc("SaveWinVars()")
4103 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
4104 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
4105 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
4106 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
4107 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
4108 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4109 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
4110 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004111 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00004112" call Dret("SaveWinVars")
4113endfun
4114
4115" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004116" CopyWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004117fun! s:CopyWinVars()
4118" call Dfunc("CopyWinVars()")
4119 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
4120 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
4121 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
4122 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
4123 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
4124 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
4125 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
4126 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 +00004127 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 +00004128" call Dret("CopyWinVars")
4129endfun
4130
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004131" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004132" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004133" To allow separate windows to have their own activities, such as
4134" Explore **/pattern, several variables have been made window-oriented.
4135" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004136" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004137" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004138fun! s:SetBufWinVars()
4139" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004140 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004141 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
4142 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
4143 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
4144 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
4145 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
4146 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4147 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
4148 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
4149 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004150" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004151endfun
4152
4153" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004154" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004155" Matching function to BufferWinVars()
4156fun! s:UseBufWinVars()
4157" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004158 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004159 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
4160 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
4161 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
4162 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
4163 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
4164 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
4165 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
4166 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
4167 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
4168" call Dret("UseBufWinVars")
4169endfun
4170
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004171" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004172" RFC2396: converts %xx into characters {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004173fun! netrw#RFC2396(fname)
4174" call Dfunc("RFC2396(fname<".a:fname.">)")
4175 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
4176" call Dret("RFC2396 ".fname)
4177 return fname
4178endfun
4179
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004180" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004181" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004182let &cpo= s:keepcpo
4183unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004184
Bram Moolenaar071d4272004-06-13 20:20:40 +00004185" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00004186" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00004187" vim:ts=8 fdm=marker