blob: 1a865fabe541260c5d6ddf850fb0e1f866f37728 [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 Moolenaar7fc904b2006-04-13 20:37:35 +00003" Date: Apr 12, 2006
4" Version: 87
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 Moolenaar7fc904b2006-04-13 20:37:35 +000026let g:loaded_netrw = "v87"
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 Moolenaar910f66f2006-04-05 20:41:53 +0000407" call Decho("checking if NetBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000408 if choice =~ "^.*[\/]$"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000409" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000410 keepjumps call s:NetBrowse(choice)
411" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000414
415 " use filename's suffix for the temporary file
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000416 if b:netrw_fname =~ '\.[^./]\+$'
417 let suffix = substitute(b:netrw_fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000418 let tmpfile= substitute(tmpfile,"$",suffix,'e')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000419" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000420 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000421
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000422 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000423 " Perform Protocol-Based Read {{{3
424 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000425 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
426 echo "(netrw) Processing your read request..."
427 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000428
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000429 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000430 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000431 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000432" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 " ER: noting done with g:netrw_uid yet?
434 " ER: on Win2K" rcp machine[.user]:file tmpfile
435 " ER: if machine contains '.' adding .user is required (use $USERNAME)
436 " ER: the tmpfile is full path: rcp sees C:\... as host C
437 if s:netrw_has_nt_rcp == 1
438 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
439 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
440 else
441 " Any way needed it machine contains a '.'
442 let uid_machine = g:netrw_machine .'.'. $USERNAME
443 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000445 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
446 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
447 else
448 let uid_machine = g:netrw_machine
449 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000451" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
452 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 +0000453 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
454 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000455
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000456 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000457 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000459" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000460 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000461 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000462 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000463 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000464" call Decho("filter input: ".getline("."))
465 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
466" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000467 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000468" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000469 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
470 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000471" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000472 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
473 endif
474 " 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 +0000475 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000476 let debugkeep= &debug
477 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000478 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000479 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000480 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000481 endif
482 bd!
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000483 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000484 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000485
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000486 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000487 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000488 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
489 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000490" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000491 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000492 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000493 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000494 if exists("g:netrw_port") && g:netrw_port != ""
495 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000496" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000497 else
498 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000499" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000500 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000501
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000502 if exists("g:netrw_ftp") && g:netrw_ftp == 1
503 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000504" call Decho("filter input: ".getline("."))
505 put ='\"'.g:netrw_passwd.'\"'
506" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000507 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000508 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
509" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000510 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000511
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000512 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
513 put =g:netrw_ftpmode
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000514" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000515 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000516 put ='get \"'.netrw_fname.'\" '.tmpfile
517" call Decho("filter input: ".getline("."))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000518
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000519 " perform ftp:
520 " -i : turns off interactive prompting from ftp
521 " -n unix : DON'T use <.netrc>, even though it exists
522 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000523 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000524" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000525 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
526 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
527 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000528" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000529 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000530 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000531 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000532 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000533 endif
534 bd!
535 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
536 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000537
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000538 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000539 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000540 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000541" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000542 if exists("g:netrw_port") && g:netrw_port != ""
543 let useport= " -P ".g:netrw_port
544 else
545 let useport= ""
546 endif
547 if g:netrw_cygwin == 1
548 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000549" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".cygtmpfile)
550 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 +0000551 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000552" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile)
553 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 +0000554 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000555 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000556 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000557
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000559 " http: NetRead Method #5 (wget) {{{3
560 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000561" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000562 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000563 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000564 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000565 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000566 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000567" call Dret("NetRead")
568 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000569 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000570
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 if match(b:netrw_fname,"#") == -1
572 " simple wget
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000573 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
574" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname)
575 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000576 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000577
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000578 else
579 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000580 let netrw_html= substitute(netrw_fname,"#.*$","","")
581 let netrw_tag = substitute(netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000582" call Decho("netrw_html<".netrw_html.">")
583" call Decho("netrw_tag <".netrw_tag.">")
584" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000585 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
586 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000587" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
589 endif
590 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000591
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000592 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000593 " cadaver: NetRead Method #6 {{{3
594 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000595" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000596
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000597 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000598 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000599 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000600 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000601 if exists("g:netrw_port") && g:netrw_port != ""
602 put ='open '.g:netrw_machine.' '.g:netrw_port
603 else
604 put ='open '.g:netrw_machine
605 endif
606 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000607
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000608 if g:netrw_cygwin == 1
609 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
610 put ='get '.netrw_fname.' '.cygtmpfile
611 else
612 put ='get '.netrw_fname.' '.tmpfile
613 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000614 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000615
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000616 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000617 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000618" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000619 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
620 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000621 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000622 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000623
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000624 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000625 " rsync: NetRead Method #7 {{{3
626 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000627" call Decho("read via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000628 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629 if g:netrw_cygwin == 1
630 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000631" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
632 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000633 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000634" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
635 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000636 endif
637 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
638 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000639
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000640 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000641 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000643 elseif b:netrw_method == 8
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000644 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000646 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000647 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000648 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000649 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000650" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000651 endif
652 if exists("g:netrw_option") && g:netrw_option == ":http"
653 let netrw_option= "http"
654 else
655 let netrw_option= "ftp"
656 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000657" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000658
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000660" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
661 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 +0000662 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000663" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname)
664 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000665 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000666
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000667 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
668 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000669
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000670 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000671 " sftp: NetRead Method #9 {{{3
672 elseif b:netrw_method == 9
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000673" call Decho("read via sftp (method #4)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000674 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000675 if g:netrw_cygwin == 1
676 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000677" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
678" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
679 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000680 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000681" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
682 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000683 endif
684 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
685 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000686
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000687 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000688 " Complain {{{3
689 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 echo "***warning*** unable to comply with your request<" . choice . ">"
691 endif
692 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000693
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000694 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000695" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000696 if exists("b:netrw_method")
697 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 unlet b:netrw_fname
699 endif
700 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000701
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000702" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000703endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000704
705" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000706" NetGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000707" readcmd == %r : replace buffer with newly read file
708" == 0r : read file at top of buffer
709" == r : read file after current line
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000710fun! s:NetGetFile(readcmd, tfile, method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000711" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000712
713 " get name of remote filename (ie. url and all)
714 let rfile= bufname("%")
715" call Decho("rfile<".rfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000716
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000717 if exists("*NetReadFixup")
718 " for the use of NetReadFixup (not otherwise used internally)
719 let line2= line("$")
720 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000721
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000722 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000724 if g:netrw_cygwin
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000725 let tfile= a:tfile
726" call Decho("(win32 && cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000728 let tfile= substitute(a:tfile,'/','\\\\','ge')
729" call Decho("(win32 && !cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730 endif
731 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000732 let tfile= a:tfile
733" call Decho("tfile=a:tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000734 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000735
736 if a:readcmd[0] == '%'
Bram Moolenaar81695252004-12-29 20:58:21 +0000737 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000738
Bram Moolenaar83bab712005-08-01 21:58:57 +0000739" call Dredir("ls!","starting buffer list")
740
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000741 " rename the current buffer to the temp file (ie. tfile)
742 keepalt exe "file ".tfile
743" call Dredir("ls!","after renaming current buffer to <".tfile.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000744
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000745 " edit temporary file (ie. read the temporary file in)
746 if rfile =~ '\.zip$'
747 call zip#Browse(tfile)
748 elseif rfile =~ '\.tar$'
749 call tar#Browse(tfile)
750 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000751" call Decho("edit temporary file")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000752 e
753 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000754
Bram Moolenaar81695252004-12-29 20:58:21 +0000755 " rename buffer back to remote filename
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000756 keepalt exe "file ".escape(rfile,' ')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000757 filetype detect
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000758" call Dredir("ls!","renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000759 let line1 = 1
760 let line2 = line("$")
761
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000762 elseif filereadable(tfile)
Bram Moolenaar81695252004-12-29 20:58:21 +0000763 " read file after current line
764 let curline = line(".")
765 let lastline= line("$")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000766" call Decho("exe<".a:readcmd." ".v:cmdarg." ".tfile."> line#".curline)
767 exe a:readcmd." ".v:cmdarg." ".tfile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000768 let line1= curline + 1
769 let line2= line("$") - lastline + 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000770
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000771 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000772 " not readable
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000773 echohl WarningMsg | echo "***netrw*** file <".tfile."> not readable"| echohl None
774 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
775" call Dret("NetGetFile : tfile<".tfile."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000776 return
777 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000778
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000779 " User-provided (ie. optional) fix-it-up command
780 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000781" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000783" else " Decho
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000784" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000786
787 " update the Buffers menu
788 if has("gui") && has("gui_running")
789 silent! emenu Buffers.Refresh\ menu
790 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000791
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000792" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".filereadable(a:tfile))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000793
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000794 " make sure file is being displayed
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000796" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000797endfun
798
799" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000800" NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000801fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000802" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000803
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 " option handling
805 let mod= 0
806 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000807
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000808 " Get Temporary Filename {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000809 let tmpfile= escape(tempname(),g:netrw_tmpfile_escape)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000810 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
811 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
812 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000813" call Dret("NetWrite")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000814 return
815 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000816
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000817 if a:0 == 0
818 let ichoice = 0
819 else
820 let ichoice = 1
821 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000822
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000823 if &binary
824 " for binary writes, write entire file. Line numbers don't really make sense.
825 " Supports the writing of tar and zip files.
826" call Decho("silent exe w! ".v:cmdarg." ".tmpfile)
827 silent exe "w! ".v:cmdarg." ".tmpfile
828 else
829 " write (selected portion of) file to temporary
830" call Decho("silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile)
831 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
832 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000833
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000835
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000836 " Process arguments: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000837 " attempt to repeat with previous host-file-etc
838 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000839" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000840 let choice = b:netrw_lastfile
841 let ichoice= ichoice + 1
842 else
843 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000844
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000845 " Reconstruct Choice if choice starts with '"'
846 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000847 echomsg 'NetWrite Usage:"'
848 echomsg ':Nwrite machine:path uses rcp'
849 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
850 echomsg ':Nwrite "machine id password path" uses ftp'
851 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
852 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
853 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
854 echomsg ':Nwrite rcp://machine/path uses rcp'
855 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
856 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
857 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000858 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000859
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 elseif match(choice,"^\"") != -1
861 if match(choice,"\"$") != -1
862 " case "..."
863 let choice=strpart(choice,1,strlen(choice)-2)
864 else
865 " case "... ... ..."
866 let choice = strpart(choice,1,strlen(choice)-1)
867 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000868
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 while match(choice,"\"$") == -1
870 let wholechoice= wholechoice . " " . choice
871 let ichoice = ichoice + 1
872 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000873 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000874 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000875 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000876 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000877" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000878 return
879 endif
880 let choice= a:{ichoice}
881 endwhile
882 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
883 endif
884 endif
885 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000886" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000887 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000888
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000889 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000890 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000891 let choice= substitute(choice,'\\','/','ge')
892 "ER: see NetRead()
893 exe 'lcd ' . fnamemodify(tmpfile,':h')
894 let tmpfile = fnamemodify(tmpfile,':t')
895 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000896
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000897 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000899
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 " =============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000901 " Perform Protocol-Based Write {{{3
902 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000903 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
904 echo "(netrw) Processing your write request..."
905 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000906
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000907 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000908 " rcp: NetWrite Method #1 {{{3
909 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000910" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000911 if s:netrw_has_nt_rcp == 1
912 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
913 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
914 else
915 let uid_machine = g:netrw_machine .'.'. $USERNAME
916 endif
917 else
918 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
919 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
920 else
921 let uid_machine = g:netrw_machine
922 endif
923 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000924 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
925" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname)
926 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000928
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000929 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000930 " ftp + <.netrc>: NetWrite Method #2 {{{3
931 elseif b:netrw_method == 2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000932 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000933 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000934 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000935 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000936" call Decho(" filter input: ".getline("."))
937 exe "put ='"."put ".tmpfile.' \"'.netrw_fname.'\"'."'"
938" call Decho(" filter input: ".getline("."))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000939 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000940" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000941 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000942 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000943" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000944 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000945 endif
946 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
947 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000948 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000949 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000950 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000951 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000952 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953 endif
954 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000955 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000956
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000958 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{3
959 elseif b:netrw_method == 3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000960 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000962 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000963 if exists("g:netrw_port") && g:netrw_port != ""
964 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000965" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966 else
967 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000968" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969 endif
970 if exists("g:netrw_ftp") && g:netrw_ftp == 1
971 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000972" call Decho("filter input: ".getline("."))
973 put ='\"'.g:netrw_passwd.'\"'
974" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000975 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000976 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
977" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000979 put ='put '.tmpfile.' \"'.netrw_fname.'\"'
980" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000981 " save choice/id/password for future use
982 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000984 " perform ftp:
985 " -i : turns off interactive prompting from ftp
986 " -n unix : DON'T use <.netrc>, even though it exists
987 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000988 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000989" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000990 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
991 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
992 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000993 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000994 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000995 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000996 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000997 let mod=1
998 endif
999 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001002 " scp: NetWrite Method #4 {{{3
1003 elseif b:netrw_method == 4
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001004 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001005 if exists("g:netrw_port") && g:netrw_port != ""
1006 let useport= " -P ".g:netrw_port
1007 else
1008 let useport= ""
1009 endif
1010 if g:netrw_cygwin == 1
1011 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001012" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'")
1013 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001015" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'")
1016 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 endif
1018 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001019
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001020 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001021 " http: NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001023 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001024 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001025 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001026 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001027
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001028 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001029 " dav: NetWrite Method #6 (cadaver) {{{3
1030 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001031" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001032
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001033 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001034 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001035 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001036 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001037 if exists("g:netrw_port") && g:netrw_port != ""
1038 put ='open '.g:netrw_machine.' '.g:netrw_port
1039 else
1040 put ='open '.g:netrw_machine
1041 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001042 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001043
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001044 if g:netrw_cygwin == 1
1045 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
1046 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001047 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001048 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001049 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001050
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001051 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001052 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001053" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001054 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
1055 bd!
1056 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001057
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001059 " rsync: NetWrite Method #7 {{{3
1060 elseif b:netrw_method == 7
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001061 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001062 if g:netrw_cygwin == 1
1063 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001064" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname)
1065 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001066 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001067" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
1068 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001069 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001070 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001071
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001072 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001073 " sftp: NetWrite Method #9 {{{3
1074 elseif b:netrw_method == 9
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001075 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001076 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1077 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1078 else
1079 let uid_machine = g:netrw_machine
1080 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001081 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001082 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001083 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001084 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001085" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001086 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1087 bd!
1088 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001089
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001090 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001091 " Complain {{{3
1092 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001093 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001094 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001095 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001096
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001097 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001098" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001099 let result=delete(tmpfile)
1100 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001101
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001102 if a:firstline == 1 && a:lastline == line("$")
1103 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001104 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001105
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001106" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001107endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001108
Bram Moolenaar83bab712005-08-01 21:58:57 +00001109" ===========================================
1110" Remote Directory Browsing Support: {{{1
1111" ===========================================
1112
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001113" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001114" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001115" of the contents of a remote directory. It is assumed that the
1116" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1117" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001118fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001119 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1120" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001121
Bram Moolenaar488c6512005-08-11 20:09:58 +00001122 if exists("s:netrw_skipbrowse")
1123 unlet s:netrw_skipbrowse
1124" call Dret("NetBrowse")
1125 return
1126 endif
1127
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001128 call s:NetOptionSave()
1129
Bram Moolenaar843ee412004-06-30 16:16:41 +00001130 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001131 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1132" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001133 if !executable("ftp")
1134 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001135 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001136 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001137 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001138 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001139" call Dret("NetBrowse")
1140 return
1141 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001142 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001143 if !exists("g:netrw_quiet")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001144 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 +00001145 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001146 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001147
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001148 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001149" call Dret("NetBrowse")
1150 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001151 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001152
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001153 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1154 call s:UseBufWinVars()
1155
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001156 " set up menus
1157 let b:netrw_browser_active= 1
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00001158 call s:NetMenu(1)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001159
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001161 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162
1163 " analyze a:dirname and g:netrw_list_cmd
1164 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001165 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001166" call Decho("dirname<".dirname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001167 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001168 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001169 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001170 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001171 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001172 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001173" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001174 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001175 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001176
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001177 let method = substitute(dirname,dirpat,'\1','')
1178 let user = substitute(dirname,dirpat,'\2','')
1179 let machine = substitute(dirname,dirpat,'\3','')
1180 let path = substitute(dirname,dirpat,'\4','')
1181 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001182" call Decho("set up method <".method .">")
1183" call Decho("set up user <".user .">")
1184" call Decho("set up machine<".machine.">")
1185" call Decho("set up path <".path .">")
1186" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001187
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001188 if method == "ftp" || method == "http"
1189 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001190 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001191 else
1192 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1193 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001194
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001195 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001196" call Decho("setting w:netrw_method<".b:netrw_method.">")
1197 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001199
Bram Moolenaar8299df92004-07-10 09:47:34 +00001200 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001201 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001202 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 +00001203 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001204 else
1205 if g:netrw_sort_by =~ "^t"
1206 let listcmd= listcmd."t"
1207 elseif g:netrw_sort_by =~ "^s"
1208 let listcmd= listcmd."S"
1209 endif
1210 " optionally sort in reverse
1211 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1212 let listcmd= listcmd."r"
1213 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001214 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001215
1216" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001217 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001218" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001219 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001220 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001221 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001222" call Dret("NetBrowse : symlink")
1223 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001224
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001225 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001226 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001227" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001228
1229 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001230 " "this is a directory" indicator (/). There shouldn't be one of those,
1231 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001232 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001233" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001234
1235 " remote-read the requested file into current buffer
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001236 keepjumps keepalt enew!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001237 set ma
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001238" call Decho("exe file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001239 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001240 exe "silent doau BufReadPre ".fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001241 silent call netrw#NetRead(2,method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001242 exe "silent doau BufReadPost ".fname
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
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001283 else
1284 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001285 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001286
1287 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001288 call s:NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001289
1290 " set up buffer-local mappings
1291" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001292 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001293 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'),0)<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001294 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001295 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 +00001296 if w:netrw_longlist != 2
1297 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1298 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1299 endif
1300 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1301 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001302 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1303 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001304 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001305 nnoremap <buffer> <silent> O :call netrw#NetObtain()<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001306 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001307 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1308 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>
1309 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>
1310 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001311 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1312 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001313 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001314 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001315 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001316 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001317 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001318 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001319 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001320 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001321 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001322 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00001323 nnoremap <buffer> <F1> :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001324 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001325
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001326 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001327" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1328 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001329 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001330 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001331 let w:netrw_bannercnt = 7
1332 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001333 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001334 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001335 endif
1336
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001337 if g:netrw_sort_by =~ "^n"
1338 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001339 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001340 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001341 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1342 else
1343 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001344 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001345 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001346 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001347" call Decho("g:netrw_hide=".g:netrw_hide)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001348 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001349 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001350 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001351 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001352 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001353 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001354 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001355 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001356 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001357
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001358 " remote read the requested directory listing
1359 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1360 " Note that not all ftp servers honor the options for ls
1361 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001362 " use ftp to get remote file listing
1363" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001364 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001365 keepjumps 1d
1366
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001367 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001368 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001369" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001370 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001371
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001372 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001373 if g:netrw_ftp_browse_reject != ""
1374 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1375 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001376 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001377
1378 " if there's no ../ listed, then put ./ and ../ in
1379 let line1= line(".")
1380 keepjumps 1
1381 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1382 let line2= line(".")
1383 if line2 == 0
1384 keepjumps put='../'
1385 keepjumps put='./'
1386 endif
1387 exe "keepjumps ".line1
1388 keepjumps norm! 0
1389
1390 " more cleanup
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001391 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1392 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1393 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001394 endif
1395
1396 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001397 " use ssh to get remote file listing
1398" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001399 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001400" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001401 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1402 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001403 " cleanup
1404 if g:netrw_ftp_browse_reject != ""
1405 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001406 endif
1407 endif
1408
1409 " set up syntax highlighting
1410 if has("syntax")
1411 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001412 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001413 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001414 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1415 " sometimes the laststatus highlight bleeds into the entire display.
1416 " Only seems to happen with remote browsing. Weird.
1417 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001418 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001419 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001420
1421 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001422 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001423 if g:netrw_hide && g:netrw_list_hide != ""
1424 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001425 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001426
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001427 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001428 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001429" call Decho("manipulate long listing")
1430
1431 if method == "ftp"
1432 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001433 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001434 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001435 keepjumps d
1436 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001437 " if there's no ../ listed, then put ./ and ../ in
1438 let line1= line(".")
1439 keepjumps 1
1440 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1441 let line2= line(".")
1442 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001443 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1444 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001445 endif
1446 exe "keepjumps ".line1
1447 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001448 endif
1449
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001450 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1451 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1452 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001453 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001454
Bram Moolenaar488c6512005-08-11 20:09:58 +00001455 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001456 if g:netrw_sort_by =~ "^n"
1457 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001458 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001459 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001460 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001461 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001462 endif
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00001463 " remove priority pattern prefix
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001464 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001465 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001466 if w:netrw_longlist == 1
1467 " shorten the list to keep its width <= winwidth characters
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001468 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001469 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001470 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001471 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001472
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001473 call s:NetrwWideListing()
1474 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001475 " place cursor on the top-left corner of the file listing
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001476 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001477 norm! 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001478 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001479
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001480 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001481 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001482
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001483" call Dret("NetBrowse")
1484 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001485endfun
1486
1487" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001488" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001489fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001490" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001491
1492 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001493 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001494
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001495 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001496 " handling a file
1497 let dirname= dirname.newdir
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00001498 let didfile= 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001499 if g:netrw_browse_split == 1
1500 new
1501 wincmd _
1502 elseif g:netrw_browse_split == 2
1503 rightb vert new
1504 wincmd |
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00001505 else
1506 " handling a file, didn't split, so possibly remove menu
1507 call s:NetMenu(0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001508 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001509" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001510
1511 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001512 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001513" call Decho("refresh directory listing")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001514 setlocal ma nobl
1515 if g:netrw_fastbrowse >= 1
1516 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001517 else
1518 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001519 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001520 %d
1521
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001522 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001523 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001524 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001525
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001526 if trailer =~ '^\%(\.\./\)*$'
1527 " tack on a ../"
1528 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001529
1530 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001531 " strip off a directory name from dirname
1532 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001533 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001534" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001535
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001536 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001537 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001538 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001539" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001540 endif
1541
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001542" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001543 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001544endfun
1545
Bram Moolenaar843ee412004-06-30 16:16:41 +00001546" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001547" NetGetWord: it gets the directory named under the cursor {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001548fun! s:NetGetWord()
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001549" call Dfunc("NetGetWord() line#".line(".")." longlist=".g:netrw_longlist." virtcol=".virtcol("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001550 call s:UseBufWinVars()
1551
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001552 " insure that w:netrw_longlist is set up
1553 if !exists("w:netrw_longlist")
1554 if exists("g:netrw_longlist")
1555 let w:netrw_longlist= g:netrw_longlist
1556 else
1557 let w:netrw_longlist= 0
1558 endif
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001559" call Decho("w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001560 endif
1561
Bram Moolenaar488c6512005-08-11 20:09:58 +00001562 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001563 " Active Banner support
1564" call Decho("active banner handling")
1565 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001566 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001567 let curline= getline(".")
1568 if curline =~ '"\s*Sorted by\s'
1569 norm s
1570 let s:netrw_skipbrowse= 1
1571 echo 'Pressing "s" also works'
1572 elseif curline =~ '"\s*Sort sequence:'
1573 let s:netrw_skipbrowse= 1
1574 echo 'Press "S" to edit sorting sequence'
1575 elseif curline =~ '"\s*Quick Help:'
1576 norm ?
1577 let s:netrw_skipbrowse= 1
1578 echo 'Pressing "?" also works'
1579 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1580 norm a
1581 let s:netrw_skipbrowse= 1
1582 echo 'Pressing "a" also works'
1583 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001584 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001585 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001586
1587 elseif w:netrw_longlist == 0
1588" call Decho("thin column handling")
1589 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001590 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001591
1592 elseif w:netrw_longlist == 1
1593" call Decho("long column handling")
1594 norm! 0
1595 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1596
1597 else
1598" call Decho("obtain word from wide listing")
1599 let dirname= getline(".")
1600
1601 if !exists("b:netrw_cpf")
1602 let b:netrw_cpf= 0
1603 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1604" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001605 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001606
1607 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001608" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001609" call Decho("1: dirname<".dirname.">")
1610 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1611" call Decho("2: dirname<".dirname.">")
1612 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1613" call Decho("3: dirname<".dirname.">")
1614 let dirname = substitute(dirname,'\s\+$','','e')
1615" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001616 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001617
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001618" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001619 return dirname
1620endfun
1621
1622" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001623" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001624fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001625" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001626" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001627
1628 " preparation for removing multiple files/directories
1629 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001630 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001631
1632 " remove multiple files and directories
1633 while ctr <= a:lastline
1634 exe ctr
1635
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001636 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001637" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001638
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001639 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001640 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001641 if !all
1642 echohl Statement
1643 call inputsave()
1644 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1645 call inputrestore()
1646 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001647 if ok == ""
1648 let ok="no"
1649 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001650 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1651 if ok =~ 'a\%[ll]'
1652 let all= 1
1653 endif
1654 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001655
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001656 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001657 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001658 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001659 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001660 else
1661 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1662" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1663 let ret= system(netrw_rm_cmd)
1664" call Decho("returned=".ret." errcode=".v:shell_error)
1665 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001666 elseif ok =~ 'q\%[uit]'
1667 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001668 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001669
Bram Moolenaar843ee412004-06-30 16:16:41 +00001670 else
1671 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001672 if !all
1673 call inputsave()
1674 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1675 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001676 if ok == ""
1677 let ok="no"
1678 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001679 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1680 if ok =~ 'a\%[ll]'
1681 let all= 1
1682 endif
1683 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001684
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001685 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001686 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001687 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001688 else
1689 let rmfile = a:path.rmfile
1690 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1691" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1692 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001693" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001694
1695 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001696 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001697" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1698 let ret= system(netrw_rmf_cmd)
1699" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001700
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001701 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001702 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001703 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001704 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001705 endif
1706 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001707
1708 elseif ok =~ 'q\%[uit]'
1709 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001710 endif
1711 endif
1712
1713 let ctr= ctr + 1
1714 endwhile
1715
1716 " refresh the directory
1717 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001718" call Decho("refresh the directory")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001719 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001720 exe curline
1721
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001722" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001723endfun
1724
1725" ---------------------------------------------------------------------
1726" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001727fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001728" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001729
1730 " preparation for removing multiple files/directories
1731 let ctr = a:firstline
1732 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1733
1734 " attempt to rename files/directories
1735 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001736 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001737
1738 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001739 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001740" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001741
1742 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001743 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001744 call inputrestore()
1745
Bram Moolenaar488c6512005-08-11 20:09:58 +00001746 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001747 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001748 else
1749 let oldname= a:path.oldname
1750 let newname= a:path.newname
1751" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1752 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1753 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001754
1755 let ctr= ctr + 1
1756 endwhile
1757
1758 " refresh the directory
1759 let curline= line(".")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001760 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001761 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001762" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001763endfun
1764
1765" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001766" NetRefresh: {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001767fun! s:NetRefresh(dirname,islocal)
1768" call Dfunc("NetRefresh(dirname<".a:dirname.">,islocal=".a:islocal.")")
1769 call netrw#NetSavePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001770 set ma
1771 %d
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001772 if a:islocal
1773 call s:LocalBrowse(a:dirname)
1774 else
1775 call s:NetBrowse(a:dirname)
1776 endif
1777 call netrw#NetRestorePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001778 redraw!
1779" call Dret("NetRefresh")
1780endfun
1781
1782" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001783" NetSplit: mode {{{2
1784" =0 : net and o
1785" =1 : net and v
1786" =2 : local and o
1787" =3 : local and v
1788fun! s:NetSplit(mode)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001789" call Dfunc("NetSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001790
1791 call s:SaveWinVars()
1792 if a:mode == 0
1793 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1794 call s:CopyWinVars()
1795 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001796 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001797 elseif a:mode ==1
1798 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1799 call s:CopyWinVars()
1800 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001801 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001802 elseif a:mode ==2
1803 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1804 call s:CopyWinVars()
1805 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001806 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001807 else
1808 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1809 call s:CopyWinVars()
1810 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001811 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001812 endif
1813
1814" call Dret("NetSplit")
1815endfun
1816
1817" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001818" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001819" files given their extension. Passes 0=local, 1=remote
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001820fun! netrw#NetBrowseX(fname,remote)
1821" call Dfunc("NetBrowseX(fname<".a:fname."> remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001822
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001823 " set up the filename
1824 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001825 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001826 if has("win32") || has("win95") || has("win64") || has("win16")
1827 let exten= substitute(exten,'^.*$','\L&\E','')
1828 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001829 let fname= escape(a:fname,"%#")
1830" call Decho("fname<".fname."> after escape()")
1831
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001832 " seems kde systems often have gnome-open due to dependencies, even though
1833 " gnome-open's subsidiary display tools are largely absent. Kde systems
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001834 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
1835 if !exists("s:haskdeinit")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001836 if has("unix")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001837 silent! let s:haskdeinit= system('ps -e') =~ 'kdeinit'
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001838 if v:shell_error
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001839 let s:haskdeinit = 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001840 endif
1841 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001842 let s:haskdeinit= 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001843 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001844" call Decho("setting s:haskdeinit=".s:haskdeinit)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001845 endif
1846
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001847 if a:remote == 1
1848 " create a local copy
1849 let fname= tempname().".".exten
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001850" call Decho("a:remote==1: create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001851 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001852 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001853 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001854 q
1855 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001856" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001857
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001858 " set up redirection
1859 if &srr =~ "%s"
Bram Moolenaarf4cd3e82005-12-22 22:47:02 +00001860 let redir= substitute(&srr,"%s","/dev/null","")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001861 else
1862 let redir= &srr . "/dev/null"
1863 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001864" call Decho("redir{".redir."} srr{".&srr."}")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001865
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001866 if exists("g:netrw_browsex_viewer") && executable(g:netrw_browsex_viewer)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001867" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001868 if g:netrw_browsex_viewer == '-'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001869 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001870 else
1871" call Decho("exe silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."' ".redir)
1872 exe "silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."'".redir
1873 let ret= v:shell_error
1874 endif
1875
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001876 " execute the file handler
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001877 elseif has("win32") || has("win64")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001878" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1879 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1880 let ret= v:shell_error
1881
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001882 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaara5792f52005-11-23 21:25:05 +00001883" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1884 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1885 let ret= v:shell_error
1886
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001887 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001888" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1889 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1890 let ret= v:shell_error
1891
1892 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001893 " netrwFileHandlers#Invoke() always returns 0
1894 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001895 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001896
1897 " if unsuccessful, attempt netrwFileHandlers#Invoke()
1898 if ret
1899 let ret= netrwFileHandlers#Invoke(exten,fname)
1900 endif
1901
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001902 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001903
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001904 " cleanup: remove temporary file,
1905 " delete current buffer if success with handler,
1906 " return to prior buffer (directory listing)
1907 if a:remote == 1 && fname != a:fname
1908" call Decho("deleting temporary file<".fname.">")
1909 call delete(fname)
1910 endif
1911
1912 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001913 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001914 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001915 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001916 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001917
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001918" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001919endfun
1920
1921" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001922" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1923" This function assumes that a long listing will be received. Size, time,
1924" and reverse sorts will be requested of the server but not otherwise
1925" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001926fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001927" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001928
1929 " because WinXX ftp uses unix style input
1930 " curline is one more than the bannercnt in order to account
1931 " for the unwanted first blank line (doing a :put to an empty
1932 " buffer yields a blank first line)
1933 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001934 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001935 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001936 exe "silent! keepjumps ".curline.",$d"
1937
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001938 ".........................................
1939 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001940 " ftp + <.netrc>: Method #2
1941 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001942 put ='cd \"'.a:path.'\"'
1943" call Decho('ftp: '.getline("."))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001944 endif
1945 exe "put ='".a:cmd."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001946" call Decho("ftp: ".getline("."))
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001947" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001948 if exists("g:netrw_port") && g:netrw_port != ""
1949" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1950 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1951 else
1952" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1953 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1954 endif
1955
1956 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001957 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001958 " ftp + machine,id,passwd,filename: Method #3
1959 setlocal ff=unix
1960 if exists("g:netrw_port") && g:netrw_port != ""
1961 put ='open '.g:netrw_machine.' '.g:netrw_port
1962 else
1963 put ='open '.g:netrw_machine
1964 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001965
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001966 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1967 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001968 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001969 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001970 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001971 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001972
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001973 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001974 put ='cd \"'.a:path.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001975 endif
1976 exe "put ='".a:cmd."'"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001977
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001978 " perform ftp:
1979 " -i : turns off interactive prompting from ftp
1980 " -n unix : DON'T use <.netrc>, even though it exists
1981 " -n win32: quit being obnoxious about password
1982" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1983 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1984
1985 ".........................................
1986 else
1987 echo "***warning*** unable to comply with your request<" . choice . ">"
1988 endif
1989
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001990 " cleanup for Windows
1991 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001992 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001993 endif
1994 if a:cmd == "dir"
1995 " infer directory/link based on the file permission string
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001996 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1997 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001998 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001999 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002000 endif
2001 endif
2002
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002003 " ftp's ls doesn't seem to include ./ or ../
2004 if !search('^\.\/$','wn')
2005 exe 'keepjumps '.curline
2006 if a:path !~ '^$'
2007 put ='../'
2008 endif
2009 put ='./'
2010 exe 'keepjumps '.curline
2011 endif
2012
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002013 " restore settings
2014 let &ff= ffkeep
2015" call Dret("NetBrowseFtpCmd")
2016endfun
2017
2018" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00002019" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
2020" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002021fun! s:NetrwListHide()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002022" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002023
2024 let listhide= g:netrw_list_hide
2025 while listhide != ""
2026 if listhide =~ ','
2027 let hide = substitute(listhide,',.*$','','e')
2028 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
2029 else
2030 let hide = listhide
2031 let listhide= ""
2032 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002033
2034 " Prune the list by hiding any files which match
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002035 if g:netrw_hide == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002036" call Decho("hiding<".hide."> listhide<".listhide.">")
2037" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d')
2038 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002039 elseif g:netrw_hide == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002040" call Decho("showing<".hide."> listhide<".listhide.">")
2041" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d')
2042 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002043 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00002044 endwhile
2045
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002046" call Dret("NetrwListHide")
2047endfun
2048
2049" ---------------------------------------------------------------------
2050" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002051fun! s:NetHideEdit(islocal)
2052" call Dfunc("NetHideEdit(islocal=".a:islocal.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002053
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002054 " get new hiding list from user
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002055 call inputsave()
2056 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
2057 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002058 let g:netrw_list_hide= newhide
2059" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002060
2061 " refresh the listing
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002062 if a:islocal == 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002063 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2064 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002065 silent call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,"./"),a:islocal)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002066 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002067
2068" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002069endfun
2070
Bram Moolenaar8299df92004-07-10 09:47:34 +00002071" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002072" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002073fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002074" call Dfunc("NetSortSequence(mode=".a:mode.")")
2075
2076 call inputsave()
2077 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
2078 call inputrestore()
2079
2080 " refresh the listing
2081 let g:netrw_sort_sequence= newsortseq
2082 if a:mode == 0
2083 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2084 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002085 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002086 endif
2087
2088" call Dret("NetSortSequence")
2089endfun
2090
2091" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002092" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002093fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002094" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
2095 let fname = s:NetGetWord()
2096 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
2097" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002098
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002099 if w:netrw_longlist == 0
2100 " use one column listing
2101" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002102 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2103
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002104 elseif w:netrw_longlist == 1
2105 " use long list
2106" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002107 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002108
2109 else
2110 " give wide list
2111" call Decho("use wide list")
2112 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002113 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002114 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00002115
2116 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002117 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002118
2119 " refresh the listing
2120 if a:mode == 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002121 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002122 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002123 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002124 endif
2125
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002126 " keep cursor on the filename
2127 silent keepjumps $
2128 if fname =~ '/$'
2129 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2130 else
2131 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2132 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002133
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002134" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
2135endfun
2136
2137" ---------------------------------------------------------------------
2138" NetrwWideListing: {{{2
2139fun! s:NetrwWideListing()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002140" call Dfunc("NetrwWideListing() w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002141
2142 if w:netrw_longlist == 2
2143 " look for longest filename (cpf=characters per filename)
2144 " cpf: characters per file
2145 " fpl: files per line
2146 " fpc: files per column
2147 set ma
2148 let b:netrw_cpf= 0
2149 if line("$") >= w:netrw_bannercnt
2150 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2151 else
2152" call Dret("NetrwWideListing")
2153 return
2154 endif
2155" call Decho("max file strlen+1=".b:netrw_cpf)
2156 let b:netrw_cpf= b:netrw_cpf + 1
2157
2158 " determine qty files per line (fpl)
2159 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002160 if w:netrw_fpl <= 0
2161 let w:netrw_fpl= 1
2162 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002163" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
2164
2165 " make wide display
2166 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
2167 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
2168 let newcolstart = w:netrw_bannercnt + fpc
2169 let newcolend = newcolstart + fpc - 1
2170" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
2171 while line("$") >= newcolstart
2172 if newcolend > line("$") | let newcolend= line("$") | endif
2173 let newcolqty= newcolend - newcolstart
2174 exe newcolstart
2175 if newcolqty == 0
2176 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2177 else
2178 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2179 endif
2180 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002181 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002182 endwhile
2183 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002184 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002185 endif
2186
2187" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002188endfun
2189
2190" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002191" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002192" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2193" the same word even though the sorting has changed its order of appearance.
2194fun! s:NetSaveWordPosn()
2195" call Dfunc("NetSaveWordPosn()")
2196 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2197" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2198endfun
2199
2200" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002201" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002202fun! s:NetRestoreWordPosn()
2203" call Dfunc("NetRestoreWordPosn()")
2204 silent! call search(s:netrw_saveword,'w')
2205" call Dret("NetRestoreWordPosn")
2206endfun
2207
2208" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002209" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002210fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002211" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2212
2213 " get name of new directory from user. A bare <CR> will skip.
2214 " if its currently a directory, also request will be skipped, but with
2215 " a message.
2216 call inputsave()
2217 let newdirname= input("Please give directory name: ")
2218 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002219" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002220
2221 if newdirname == ""
2222" call Dret("NetMakeDir : user aborted with bare <cr>")
2223 return
2224 endif
2225
2226 if a:usrhost == ""
2227
2228 " Local mkdir:
2229 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002230 let fullnewdir= b:netrw_curdir.'/'.newdirname
2231" call Decho("fullnewdir<".fullnewdir.">")
2232 if isdirectory(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 directory!" | 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 : directory<".newdirname."> exists previously")
2238 return
2239 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002240 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002241 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002242 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002243 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002244 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002245" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2246 return
2247 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002248
2249 " requested new local directory is neither a pre-existing file or
2250 " directory, so make it!
2251 if exists("*mkdir")
2252 call mkdir(fullnewdir,"p")
2253 else
2254 let netrw_origdir= s:NetGetcwd(1)
2255 exe 'cd '.b:netrw_curdir
2256" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2257" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2258 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002259 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002260 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002261
Bram Moolenaar8299df92004-07-10 09:47:34 +00002262 if v:shell_error == 0
2263 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002264" call Decho("refresh listing")
2265 let linenum= line(".")
2266 norm! H0
2267 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002268 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002269 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2270 exe "norm! ".hline."G0z\<CR>"
2271 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002272 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002273 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002274 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002275 endif
2276 redraw!
2277
2278 else
2279 " Remote mkdir:
2280 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002281 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002282" call Decho("exe silent! !".mkdircmd." ".newdirname)
2283 exe "silent! !".mkdircmd." ".newdirname
2284 if v:shell_error == 0
2285 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002286 let linenum= line(".")
2287 norm! H0
2288 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002289 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002290 exe "norm! ".hline."G0z\<CR>"
2291 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002292 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002293 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002294 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002295 endif
2296 redraw!
2297 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002298
Bram Moolenaar8299df92004-07-10 09:47:34 +00002299" call Dret("NetMakeDir")
2300endfun
2301
2302" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002303" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002304" 0: (user: <b>) bookmark current directory
2305" 1: (user: <B>) change to the bookmarked directory
2306" 2: (user: <q>) list bookmarks
2307" 3: (LocalBrowse) record current directory history
2308" 4: (user: <u>) go up (previous) bookmark
2309" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002310fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002311" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002312 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2313 " looks like a "b" was pressed while in the banner region
2314 if line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002315 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002316 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002317 if &ch > 1
2318 " "clear" the message
2319 echo ""
2320 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002321" call Dret("NetBookmarkDir - ignoring")
2322 return
2323 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002324
2325 if a:chg == 0
2326 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002327 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2328 if !exists("g:NETRW_BOOKMARKMAX")
2329 let g:NETRW_BOOKMARKMAX= v:count
2330 elseif v:count > g:NETRW_BOOKMARKMAX
2331 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002332 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002333 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002334
2335 elseif a:chg == 1
2336 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002337 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2338 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002339 else
2340 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2341 endif
2342
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002343 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002344 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002345 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002346" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2347 let cnt= 0
2348 while cnt <= g:NETRW_BOOKMARKMAX
2349 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2350" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2351 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2352 endif
2353 let cnt= cnt + 1
2354 endwhile
2355 endif
2356
2357 " list directory history
2358 let cnt = g:NETRW_DIRHIST_CNT
2359 let first = 1
2360 let histcnt = 0
2361 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2362" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2363 let histcnt= histcnt + 1
2364 if exists("g:NETRW_DIRHIST_{cnt}")
2365" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2366 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002367 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002368 let first = 0
2369 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2370 if cnt < 0
2371 let cnt= cnt + g:netrw_dirhistmax
2372 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002373 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002374
2375 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002376 " saves most recently visited directories (when they differ)
2377 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2378 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2379 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2380" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2381 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002382
2383 elseif a:chg == 4
2384 " u: change to the previous directory stored on the history list
2385 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2386 if g:NETRW_DIRHIST_CNT < 0
2387 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2388 endif
2389 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2390" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2391 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2392 else
2393 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2394 echo "Sorry, no predecessor directory exists yet"
2395 endif
2396
2397 elseif a:chg == 5
2398 " U: change to the subsequent directory stored on the history list
2399 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2400 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2401" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2402 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2403 else
2404 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2405 if g:NETRW_DIRHIST_CNT < 0
2406 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2407 endif
2408 echo "Sorry, no successor directory exists yet"
2409 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002410 endif
2411" call Dret("NetBookmarkDir")
2412endfun
2413
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002414" ---------------------------------------------------------------------
2415" NetObtain: obtain file under cursor (for remote browsing support) {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002416fun! netrw#NetObtain(...)
2417" call Dfunc("NetObtain() a:0=".a:0)
2418
2419 if a:0==0
2420 " no arguments -- use word under cursor
2421 let fname= expand("<cWORD>")
2422" call Decho("no arguments, use <".fname.">")
2423 elseif a:0 > 1
2424 " more than one argument, recurse with each argument separately
2425" call Decho("more than 1 argument, use recursion")
2426 let i=1
2427 while i <= a:0
2428 call netrw#NetObtain(a:{i})
2429 let i=i+1
2430 endwhile
2431 return
2432 else
2433 " one argument provided
2434 let fname = a:1
2435 let keep_netrw_choice = exists("b:netrw_choice")? b:netrw_choice : ""
2436 let keep_netrw_fname = exists("b:netrw_fname")? b:netrw_fname : ""
2437 let keep_netrw_wmethod = exists("w:netrw_method")? w:netrw_method : ""
2438 call s:NetMethod(fname)
2439 let w:netrw_method= b:netrw_method
2440 let fname = b:netrw_fname
2441" call Decho("g:netrw_scp_cmd<".g:netrw_scp_cmd.">")
2442" call Decho("g:netrw_machine<".g:netrw_machine.">")
2443" call Decho("fname<".fname.">")
2444 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002445
2446 " NetrwStatusLine support - for obtaining support
2447 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002448
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002449" call Decho("method=".w:netrw_method)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002450 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2451 if executable("ftp")
2452 let curdir = expand("%")
2453 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2454 let curline= line(".")
2455 let endline= line("$")+1
2456 set ma
2457 keepjumps $
2458
2459 ".........................................
2460 if w:netrw_method == 2
2461 " ftp + <.netrc>: Method #2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002462 setlocal ff=unix
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002463 if path != ""
2464 put ='cd '.path
2465" call Decho("ftp: cd ".path)
2466 endif
2467 put ='get '.fname
2468" call Decho("ftp: get ".fname)
2469 if exists("g:netrw_port") && g:netrw_port != ""
2470" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2471 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2472 else
2473" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2474 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2475 endif
2476
2477 ".........................................
2478 elseif w:netrw_method == 3
2479 " ftp + machine,id,passwd,filename: Method #3
2480 setlocal ff=unix
2481 if exists("g:netrw_port") && g:netrw_port != ""
2482 put ='open '.g:netrw_machine.' '.g:netrw_port
2483" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2484 else
2485 put ='open '.g:netrw_machine
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002486" call Decho('ftp: open '.g:netrw_machine)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002487 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002488
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002489 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2490 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002491 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002492" call Decho('ftp: g:netrw_uid')
2493" call Decho('ftp: g:netrw_passwd')
2494 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002495 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002496" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2497 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002498
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002499 if a:path != ""
2500 put ='cd '.a:path
2501" call Decho('cd '.a:path)
2502 endif
2503 exe "put ='".a:cmd."'"
2504" call Decho("ftp: ".a:cmd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002505
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002506 " perform ftp:
2507 " -i : turns off interactive prompting from ftp
2508 " -n unix : DON'T use <.netrc>, even though it exists
2509 " -n win32: quit being obnoxious about password
2510" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2511 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002512
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002513 ".........................................
2514 else
2515 echo "***warning*** unable to comply with your request<" . choice . ">"
2516 endif
2517 " restore
2518 exe "silent! ".endline.",$d"
2519 exe "keepjumps ".curline
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002520 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002521 else
2522 if !exists("g:netrw_quiet")
2523 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2524 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2525 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002526 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002527 let &stl = s:netrw_users_stl
2528 let &laststatus = s:netrw_users_ls
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002529 " restore NetMethod
2530 if exists("keep_netrw_method")
2531 call s:NetMethod(keep_netrw_choice)
2532 let w:netrw_method = keep_netrw_wmethod
2533 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002534" call Dret("NetObtain")
2535 return
2536 endif
2537
2538 ".........................................
2539 else
2540 " scp: Method#4
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002541 let curdir = expand("%")
2542 let path = substitute(curdir,'scp://[^/]\+/','','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002543" call Decho("path<".path.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002544 if exists("g:netrw_port") && g:netrw_port != ""
2545 let useport= " -P ".g:netrw_port
2546 else
2547 let useport= ""
2548 endif
2549 if g:netrw_cygwin == 1
2550 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002551" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2552 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002553 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002554" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2555 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002556 endif
2557 endif
2558
2559 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002560 let &stl = s:netrw_users_stl
2561 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002562 redraw!
2563
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002564 " restore NetMethod
2565 if exists("keep_netrw_method")
2566 call s:NetMethod(keep_netrw_choice)
2567 let w:netrw_method = keep_netrw_wmethod
2568 endif
2569
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002570" call Dret("NetObtain")
2571endfun
2572
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002573" ---------------------------------------------------------------------
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002574" NetPrevWinOpen: open file/directory in previous window. {{{2
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002575" If there's only one window, then the window will first be split.
2576fun! s:NetPrevWinOpen(islocal)
2577" call Dfunc("NetPrevWinOpen(islocal=".a:islocal.")")
2578
2579 " get last window number and the word currently under the cursor
2580 let lastwinnr = winnr("$")
2581 let curword = s:NetGetWord()
2582 let curdir = b:netrw_curdir
2583" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
2584
2585 let didsplit = 0
2586 if lastwinnr == 1
2587 " if only one window, open a new one first
2588" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
2589 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
2590 let didsplit = 1
2591
2592 else
2593 wincmd p
2594 " if the previous window's buffer has been changed (is modified),
2595 " and it doesn't appear in any other extant window, then ask the
2596 " user if s/he wants to abandon modifications therein.
2597 let bnr = winbufnr(0)
2598 let bnrcnt = 0
2599 if &mod
2600 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
2601" call Decho("bnr=".bnr." bnrcnt=".bnrcnt)
2602 if bnrcnt == 1
2603 let bufname= bufname(winbufnr(winnr()))
2604 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
2605
2606 if choice == 1
2607 " Yes -- write file & then browse
2608 let v:errmsg= ""
2609 silent w
2610 if v:errmsg != ""
2611 echohl Error | echo "***netrw*** "unable to write <".bufname.">!" | echohl None
2612 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2613 if didsplit
2614 q
2615 else
2616 wincmd p
2617 endif
2618" call Dret("NetPrevWinOpen : unable to write <".bufname.">")
2619 return
2620 endif
2621
2622 elseif choice == 2
2623 " No -- don't worry about changed file, just browse anyway
2624 set nomod
2625 echohl WarningMsg | echo "***netrw*** ".bufname." changes abandoned" | echohl None
2626
2627 else
2628 " Cancel -- don't do this
2629 if didsplit
2630 q
2631 else
2632 wincmd p
2633 endif
2634" call Dret("NetPrevWinOpen : cancelled")
2635 return
2636 endif
2637 endif
2638 endif
2639 endif
2640
2641 if a:islocal
2642 call s:LocalBrowse(s:LocalBrowseChgDir(curdir,curword))
2643 else
2644 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),curword))
2645 endif
2646" call Dret("NetPrevWinOpen")
2647endfun
2648
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002649" ---------------------------------------------------------------------
2650" NetMenu: generates the menu for gvim and netrw {{{2
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002651fun! s:NetMenu(domenu)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002652
2653 if has("menu") && has("gui_running") && &go =~ 'm'
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002654" call Dfunc("NetMenu(domenu=".a:domenu.")")
2655 if !exists("s:netrw_menu_enabled") && a:domenu
2656" call Decho("initialize menu")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002657 let s:netrw_menu_enabled= 1
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002658 if !exists("g:NetrwTopLvlMenu")
2659 let g:NetrwTopLvlMenu= "Netrw."
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002660 endif
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002661 exe 'silent! menu '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
2662 exe 'silent! menu '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
2663 exe 'silent! menu '.g:NetrwTopLvlMenu.'Bookmark\ Current\ Directory<tab>b Nb'
2664 exe 'silent! menu '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
2665 exe 'silent! menu '.g:NetrwTopLvlMenu.'Goto\ Bookmarked\ Directory<tab>B NB'
2666 exe 'silent! menu '.g:NetrwTopLvlMenu.'Change\ To\ Recently\ Used\ Directory<tab>u u'
2667 exe 'silent! menu '.g:NetrwTopLvlMenu.'Change\ To\ Subsequently\ Used\ Directory<tab>U U'
2668 exe 'silent! menu '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
2669 exe 'silent! menu '.g:NetrwTopLvlMenu.'Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<c-h>"
2670 exe 'silent! menu '.g:NetrwTopLvlMenu.'Edit\ File/Directory<tab><cr> '."\<cr>"
2671 exe 'silent! menu '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Window<tab>o o'
2672 exe 'silent! menu '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Vertical\ Window<tab>v v'
2673 exe 'silent! menu '.g:NetrwTopLvlMenu.'List\ Bookmarks\ and\ History<tab>q q'
2674 exe 'silent! menu '.g:NetrwTopLvlMenu.'Listing\ Style\ (thin-long-wide)<tab>i i'
2675 exe 'silent! menu '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
2676 exe 'silent! menu '.g:NetrwTopLvlMenu.'Normal-Hide-Show<tab>a a'
2677 exe 'silent! menu '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
2678 exe 'silent! menu '.g:NetrwTopLvlMenu.'Preview\ File/Directory<tab>p p'
2679 exe 'silent! menu '.g:NetrwTopLvlMenu.'Previous\ Window\ Browser<tab>P P'
2680 exe 'silent! menu '.g:NetrwTopLvlMenu.'Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
2681 exe 'silent! menu '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
2682 exe 'silent! menu '.g:NetrwTopLvlMenu.'Reverse\ Sorting\ Order<tab>'."r r"
2683 exe 'silent! menu '.g:NetrwTopLvlMenu.'Select\ Sorting\ Style<tab>s s'
2684 exe 'silent! menu '.g:NetrwTopLvlMenu.'Sorting\ Sequence\ Edit<tab>S S'
2685 exe 'silent! menu '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
2686 exe 'silent! menu '.g:NetrwTopLvlMenu.'Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
2687 elseif !a:domenu
2688 let s:netrwcnt = 0
2689 let curwin = winnr()
2690 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
2691 exe curwin."wincmd w"
2692
2693 if s:netrwcnt <= 1
2694" call Decho("clear menus")
2695 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Help'
2696 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer'
2697 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmark\ Current\ Directory'
2698 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Go\ Up\ Directory'
2699 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Goto\ Bookmarked\ Directory'
2700 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Change\ To\ Recently\ Used\ Directory'
2701 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Change\ To\ Subsequently\ Used\ Directory'
2702 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Delete\ File/Directory'
2703 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File/Directory'
2704 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Window'
2705 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Vertical\ Window'
2706 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File\ Hiding\ List'
2707 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File'
2708 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Enter\ File/Directory'
2709 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Enter\ File/Directory\ (vertical\ split)'
2710 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'List\ Bookmarks\ and\ History'
2711 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Listing\ Style\ (thin-long-wide)'
2712 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Make\ Subdirectory'
2713 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Normal-Hide-Show'
2714 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Obtain\ File'
2715 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Preview\ File/Directory'
2716 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Previous\ Window\ Browser'
2717 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Refresh\ Listing'
2718 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Rename\ File/Directory'
2719 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Reverse\ Sorting\ Order'
2720 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Select\ Sorting\ Style'
2721 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Sorting\ Sequence\ Edit'
2722 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Set\ Current\ Directory'
2723 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Settings/Options'
2724 unlet s:netrw_menu_enabled
2725 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002726 endif
2727" call Dret("NetMenu")
2728 endif
2729
2730endfun
2731
Bram Moolenaar83bab712005-08-01 21:58:57 +00002732" ==========================================
2733" Local Directory Browsing Support: {{{1
2734" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002735
2736" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002737" LocalBrowse: {{{2
2738fun! s:LocalBrowse(dirname)
2739 " unfortunate interaction -- debugging calls can't be used here;
2740 " the BufEnter event causes triggering when attempts to write to
2741 " the DBG buffer are made.
2742 if isdirectory(a:dirname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002743 silent! call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002744 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002745 " not a directory, ignore it
2746endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002747
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002748" ---------------------------------------------------------------------
2749" DirBrowse: supports local file/directory browsing {{{2
2750fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002751 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002752" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002753" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002754
Bram Moolenaar488c6512005-08-11 20:09:58 +00002755 if exists("s:netrw_skipbrowse")
2756 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002757" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002758 return
2759 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002760 if &fo =~ '[ta]'
2761 set fo-=t
2762 set fo-=a
2763 echohl Warning
2764 echo '***warning*** directory browsing and formatoptions "ta" are incompatible'
2765 echohl None
2766 endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002767
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002768 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002769
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002770 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002771 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002772 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002773 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002774 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002775 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002776" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002777 return
2778 endif
2779
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002780 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2781 call s:UseBufWinVars()
2782
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002783 " set up menus
2784 let b:netrw_browser_active= 1
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002785 call s:NetMenu(1)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002786
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002787 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002788 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002789" call Decho("findbuf: bufnum=".bufnum)
2790 if bufnum > 0 && bufname(bufnum) != a:dirname
2791 let ibuf= 1
2792 let buflast= bufnr("$")
2793 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2794" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2795 let ibuf= ibuf + 1
2796 endwhile
2797 if ibuf > buflast
2798 let bufnum= -1
2799 else
2800 let bufnum= ibuf
2801 endif
2802" call Decho("findbuf: bufnum=".bufnum." (final)")
2803 endif
2804
2805 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002806 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002807 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002808" call Decho("enew buffer")
2809 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002810 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002811 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002812 if getline(2) =~ '^" Netrw Directory Listing '
Bram Moolenaar572cb562005-08-05 21:35:02 +00002813 if !g:netrw_keepdir
2814" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002815 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002816 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002817 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002818" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002819 return
2820 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002821 endif
2822 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002823 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002824
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002825 " set up ShellCmdPost handling. Append current buffer to browselist
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00002826 call s:LocalFastBrowser()
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002827
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002828 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002829 if has("win32") || has("win95") || has("win64") || has("win16")
2830 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2831 else
2832 let b:netrw_curdir= a:dirname
2833 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002834 if b:netrw_curdir =~ '[/\\]$'
2835 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2836 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002837 if b:netrw_curdir == ''
2838 " under unix, when the root directory is encountered, the result
2839 " from the preceding substitute is an empty string.
2840 let b:netrw_curdir= '/'
2841 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002842" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002843
Bram Moolenaar83bab712005-08-01 21:58:57 +00002844 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002845 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002846" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002847 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002848 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002849 catch /^Vim\%((\a\+)\)\=:E472/
2850 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2851 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2852 if exists("w:netrw_prvdir")
2853 let b:netrw_curdir= w:netrw_prvdir
2854 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002855 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002856" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002857 return
2858 endif
2859 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002860 endif
2861
2862 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002863 " Hmm. When another vim is open to the same directory, I get
2864 " a "Press ENTER" ... ok, setting "noswf" avoids it.
2865" call Decho('exe silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002866 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002867
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002868 " make this buffer not-a-file, modifiable, not line-numbered, etc
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002869 setlocal bt=nofile nobl ma nonu noswf nowrap
2870 if g:netrw_fastbrowse >= 2
2871 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00002872 else
2873 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002874 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002875 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002876
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002877 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002878 " Perform Directory Listing:
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002879 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2880 echo "(netrw) Processing your browsing request..."
2881 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002882
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002883 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002884 call s:NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002885
Bram Moolenaar8299df92004-07-10 09:47:34 +00002886 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002887" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002888 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002889 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002890 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002891 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 +00002892 if w:netrw_longlist != 2
2893 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2894 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2895 endif
2896 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2897 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002898 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2899 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2900 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002901 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002902 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002903 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2904 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002905 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002906 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002907 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 +00002908 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>
2909 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002910 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2911 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002912 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002913 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002914 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002915 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2916 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002917 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002918 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002919 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002920 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002921 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002922 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002923 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00002924 nnoremap <buffer> <F1> :he netrw-dir<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002925
2926 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002927" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002928 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002929 keepjumps 1d
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002930 keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002931 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002932 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002933
2934 let sortby= g:netrw_sort_by
2935 if g:netrw_sort_direction =~ "^r"
2936 let sortby= sortby." reversed"
2937 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002938
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002939 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002940 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002941" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002942 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002943 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002944 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002945 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002946 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002947" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002948 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002949 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002950 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002951 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002952
2953 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002954 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002955 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002956 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002957 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002958 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002959 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002960 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002961 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002962 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002963 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002964 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002965
2966 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002967 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2968" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002969
2970 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002971 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002972
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002973 " set up syntax highlighting
2974 if has("syntax")
2975 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002976 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002977 setlocal ft=
2978 endif
2979 endif
2980
Bram Moolenaar8299df92004-07-10 09:47:34 +00002981 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002982 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002983 if g:netrw_hide && g:netrw_list_hide != ""
2984 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002985 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002986 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002987
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002988 if g:netrw_sort_by =~ "^n"
2989 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002990
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002991 if w:netrw_bannercnt < line("$")
2992 if g:netrw_sort_direction =~ 'n'
2993 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2994 else
2995 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2996 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002997 endif
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00002998 " remove priority pattern prefix
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002999 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003000
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003001 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003002 if w:netrw_bannercnt < line("$")
3003 if g:netrw_sort_direction =~ 'n'
3004 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
3005 else
3006 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
3007 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003008 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003009 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003010 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003011
Bram Moolenaar8299df92004-07-10 09:47:34 +00003012 endif
3013 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003014
3015 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003016 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003017 " place cursor on the top-left corner of the file listing
3018 exe 'silent '.w:netrw_bannercnt
3019 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003020 endif
3021
3022 " record previous current directory
3023 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00003024
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003025 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003026 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003027 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003028 setlocal noma nomod nonu nobl nowrap
3029 if g:netrw_fastbrowse >= 2
3030 setlocal bh=hide
3031 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003032
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003033" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003034endfun
3035
3036" ---------------------------------------------------------------------
3037" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003038fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003039" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003040
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003041 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00003042 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
3043 let dirnamelen = strlen(b:netrw_curdir)
3044 let filelist = glob(dirname."/*")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00003045" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003046 if filelist != ""
3047 let filelist= filelist."\n"
3048 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003049 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00003050" call Decho("glob(dirname<".dirname."/.*>)=".glob(dirname.".*"))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003051
3052 " if the directory name includes a "$", and possibly other characters,
3053 " the glob() doesn't include "." and ".." entries.
3054 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
3055" call Decho("forcibly tacking on .")
3056 if filelist == ""
3057 let filelist= dirname."."
3058 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003059 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003060 endif
3061" call Decho("filelist<".filelist.">")
3062 endif
3063 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
3064" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003065 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003066" call Decho("filelist<".filelist.">")
3067 endif
3068 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003069 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003070
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003071" call Decho("dirname<".dirname.">")
3072" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003073" call Decho("filelist<".filelist.">")
3074
3075 while filelist != ""
3076 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003077 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003078 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
3079 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003080 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00003081 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00003082 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003083 let pfile= filename
3084 if isdirectory(filename)
3085 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00003086 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003087 if pfile =~ '//$'
3088 let pfile= substitute(pfile,'//$','/','e')
3089 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003090 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00003091 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00003092" call Decho(" ")
3093" call Decho("filename<".filename.">")
3094" call Decho("pfile <".pfile.">")
3095
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003096 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003097 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003098 let fsz = strpart(" ",1,15-strlen(sz)).sz
3099 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00003100" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003101 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003102
Bram Moolenaar8299df92004-07-10 09:47:34 +00003103 if g:netrw_sort_by =~ "^t"
3104 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003105" call Decho("getftime(".filename.")=".getftime(filename))
3106 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003107 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00003108" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003109 let ftpfile= ft.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003110 keepjumps silent! put=ftpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003111
Bram Moolenaar8299df92004-07-10 09:47:34 +00003112 elseif g:netrw_sort_by =~ "^s"
3113 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003114" call Decho("getfsize(".filename.")=".getfsize(filename))
3115 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003116 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00003117" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003118 let fszpfile= fsz.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003119 keepjumps silent! put =fszpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003120
Bram Moolenaar8299df92004-07-10 09:47:34 +00003121 else
3122 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003123" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003124 keepjumps silent! put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00003125 endif
3126 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003127
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003128 " cleanup any windows mess at end-of-line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003129 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00003130 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00003131
3132" call Dret("LocalBrowseList")
3133endfun
3134
3135" ---------------------------------------------------------------------
3136" LocalBrowseChgDir: constructs a new directory based on the current {{{2
3137" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003138fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003139" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003140
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003141 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003142 let newdir = a:newdir
3143
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003144 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003145 " apparently vim is "recognizing" that it is in the home directory and
3146 " is removing the "/". Bad idea, so I have to put it back.
3147 let dirname= dirname.'/'
3148" call Decho("adjusting dirname<".dirname.">")
3149 endif
3150
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003151 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003152 " handling a file
3153 let dirname= dirname.newdir
3154" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003155 " this lets NetBrowseX avoid the edit
3156 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003157" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
3158" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003159 if g:netrw_browse_split == 1
3160 new
3161 wincmd _
3162 elseif g:netrw_browse_split == 2
3163 rightb vert new
3164 wincmd |
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00003165 else
3166 " handling a file, didn't split, so possibly remove menu
3167 call s:NetMenu(0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003168 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003169 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003170 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003171 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003172
3173 elseif newdir == './'
3174 " refresh the directory list
3175" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003176
3177 elseif newdir == '../'
3178 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003179 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003180" call Decho("go up one dir: dirname<".dirname.">")
3181
3182 else
3183 " go down one directory
3184 let dirname= dirname.newdir
3185" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
3186 endif
3187
3188" call Dret("LocalBrowseChgDir <".dirname.">")
3189 return dirname
3190endfun
3191
3192" ---------------------------------------------------------------------
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003193" LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
3194" performed any shell command. The idea is to cause all local-browsing
3195" buffers to be refreshed after a user has executed some shell command,
3196" on the chance that s/he removed/created a file/directory with it.
3197fun! s:LocalBrowseShellCmdRefresh()
3198" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00003199 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
3200 " | refresh any netrw window
3201 " | wipe out any non-displaying netrw buffer
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003202 let curwin = winnr()
3203 let ibl = 0
3204 for ibuf in s:netrw_browselist
3205 if bufwinnr(ibuf) == -1
3206" call Decho("wiping buf#".ibuf)
Bram Moolenaarc01140a2006-03-24 22:21:52 +00003207 exe "silent! bw ".ibuf
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003208 call remove(s:netrw_browselist,ibl)
3209" call Decho("browselist=".string(s:netrw_browselist))
3210 continue
3211 else
3212" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
3213 exe bufwinnr(ibuf)."wincmd w"
3214 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
3215 endif
3216 let ibl= ibl + 1
3217 endfor
3218 exe curwin."wincmd w"
3219
3220" call Dret("LocalBrowseShellCmdRefresh")
3221endfun
3222
3223" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00003224" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003225fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003226" call Dfunc("LocalBrowseRm(path<".a:path.">)")
3227" call Decho("firstline=".a:firstline." lastline=".a:lastline)
3228
3229 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003230 let ctr = a:firstline
3231 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003232 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00003233
3234 " remove multiple files and directories
3235 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003236 exe "keepjumps ".ctr
3237
3238 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003239 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003240 let ctr= ctr + 1
3241 continue
3242 endif
3243 let curword= s:NetGetWord()
3244 if curword == "./" || curword == "../"
3245 let ctr= ctr + 1
3246 continue
3247 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003248
3249 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00003250 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003251" call Decho("rmfile<".rmfile.">")
3252
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003253 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003254 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003255 if !all
3256 echohl Statement
3257 call inputsave()
3258 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3259 call inputrestore()
3260 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003261 if ok == ""
3262 let ok="no"
3263 endif
3264" call Decho("response: ok<".ok.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003265 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003266" call Decho("response: ok<".ok."> (after sub)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003267 if ok =~ 'a\%[ll]'
3268 let all= 1
3269 endif
3270 endif
3271
3272 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003273 let ret= delete(rmfile)
3274" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003275 elseif ok =~ 'q\%[uit]'
3276 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003277 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003278
Bram Moolenaar8299df92004-07-10 09:47:34 +00003279 else
3280 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003281 if !all
3282 echohl Statement
3283 call inputsave()
3284 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3285 call inputrestore()
3286 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003287 if ok == ""
3288 let ok="no"
3289 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003290 if ok =~ 'a\%[ll]'
3291 let all= 1
3292 endif
3293 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003294 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003295
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003296 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003297" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
3298 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003299" call Decho("v:shell_error=".v:shell_error)
3300
3301 if v:shell_error != 0
3302" call Decho("2nd attempt to remove directory<".rmfile.">")
3303 let errcode= delete(rmfile)
3304" call Decho("errcode=".errcode)
3305
3306 if errcode != 0
3307 if has("unix")
3308" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003309call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003310 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003311 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003312 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003313endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003314 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003315 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003316 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00003317 endif
3318 endif
3319 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003320
3321 elseif ok =~ 'q\%[uit]'
3322 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003323 endif
3324 endif
3325
3326 let ctr= ctr + 1
3327 endwhile
3328
3329 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003330 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003331" call Decho("refresh the directory")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003332 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003333 exe curline
3334
3335" call Dret("LocalBrowseRm")
3336endfun
3337
3338" ---------------------------------------------------------------------
3339" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003340fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003341" call Dfunc("LocalBrowseRename(path<".a:path.">)")
3342
3343 " preparation for removing multiple files/directories
3344 let ctr= a:firstline
3345
3346 " attempt to rename files/directories
3347 while ctr <= a:lastline
3348 exe "keepjumps ".ctr
3349
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003350 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003351 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003352 let ctr= ctr + 1
3353 continue
3354 endif
3355 let curword= s:NetGetWord()
3356 if curword == "./" || curword == "../"
3357 let ctr= ctr + 1
3358 continue
3359 endif
3360
Bram Moolenaar8299df92004-07-10 09:47:34 +00003361 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00003362 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003363" call Decho("oldname<".oldname.">")
3364
3365 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003366 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00003367 call inputrestore()
3368
Bram Moolenaar83bab712005-08-01 21:58:57 +00003369 let ret= rename(oldname,newname)
3370" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003371
3372 let ctr= ctr + 1
3373 endwhile
3374
3375 " refresh the directory
3376 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00003377" call Decho("refresh the directory listing")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003378 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003379 exe "keepjumps ".curline
3380" call Dret("LocalBrowseRename")
3381endfun
3382
3383" ---------------------------------------------------------------------
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003384" LocalFastBrowser: handles setting up/taking down fast browsing for the {{{2
3385" local browser
3386fun! s:LocalFastBrowser()
3387" call Dfunc("LocalFastBrowser()")
3388
3389 " initialize browselist, a list of buffer numbers that the local browser has used
3390 if !exists("s:netrw_browselist")
3391 let s:netrw_browselist= []
3392 endif
3393
3394 " append current buffer to fastbrowse list
3395 if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
3396 call add(s:netrw_browselist,bufnr("%"))
3397" call Decho("browselist=".string(s:netrw_browselist))
3398 endif
3399
3400 " enable autocmd events to handle refreshing/removing local browser buffers
3401 " If local browse buffer is currently showing: refresh it
3402 " If local browse buffer is currently hidden : wipe it
3403 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
3404" call Decho("setting up local-browser shell command refresh")
3405 let s:netrw_browser_shellcmd= 1
3406 augroup AuNetrwShellCmd
3407 au!
3408 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
3409 augroup END
Bram Moolenaar8dff8182006-04-06 20:18:50 +00003410 endif
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003411
3412 " user must have changed fastbrowse to its fast setting, so remove
3413 " the associated autocmd events
3414 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
3415 unlet s:netrw_browser_shellcmd
3416 augroup AuNetrwShellCmd
3417 au!
3418 augroup END
3419 augroup! AuNetrwShellCmd
3420 endif
3421
3422" call Dret("LocalFastBrowser")
3423endfun
3424
3425" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003426" LocalObtain: copy selected file to current working directory {{{2
3427fun! s:LocalObtain()
3428" call Dfunc("LocalObtain()")
3429 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
3430 let fname= expand("<cWORD>")
3431 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
3432 call writefile(fcopy,getcwd()."/".fname,"b")
3433 elseif !exists("b:netrw_curdir")
3434 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
3435 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3436 else
3437 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
3438 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3439 endif
3440" call Dret("LocalObtain")
3441endfun
3442
3443" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003444" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003445fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003446" call Dfunc("LocalPreview(path<".a:path.">)")
3447 if has("quickfix")
3448 if !isdirectory(a:path)
3449 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003450 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003451 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003452 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003453 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003454 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003455 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003456 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003457 endif
3458" call Dret("LocalPreview")
3459endfun
3460
3461" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003462" Explore: launch the local browser in the directory of the current file {{{2
3463" dosplit==0: the window will be split iff the current file has
3464" been modified
3465" dosplit==1: the window will be split before running the local
3466" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003467fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003468" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003469
3470 " if dosplit or file has been modified
3471 if a:dosplit || &modified
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003472 call s:SaveWinVars()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003473
Bram Moolenaar83bab712005-08-01 21:58:57 +00003474 if a:style == 0 " Explore, Sexplore
3475 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003476" call Decho("style=0: Explore or Sexplore")
3477
Bram Moolenaar83bab712005-08-01 21:58:57 +00003478 elseif a:style == 1 "Explore!, Sexplore!
3479 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003480" call Decho("style=1: Explore! or Sexplore!")
3481
Bram Moolenaar83bab712005-08-01 21:58:57 +00003482 elseif a:style == 2 " Hexplore
3483 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003484" call Decho("style=2: Hexplore")
3485
Bram Moolenaar83bab712005-08-01 21:58:57 +00003486 elseif a:style == 3 " Hexplore!
3487 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003488" call Decho("style=3: Hexplore!")
3489
Bram Moolenaar83bab712005-08-01 21:58:57 +00003490 elseif a:style == 4 " Vexplore
3491 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003492" call Decho("style=4: Vexplore")
3493
Bram Moolenaar83bab712005-08-01 21:58:57 +00003494 elseif a:style == 5 " Vexplore!
3495 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003496" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003497 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003498 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003499 endif
3500 norm! 0
3501
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003502 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003503 " Explore Hexplore Vexplore Sexplore
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003504" call Decho("Explore Hexplore Vexplore Sexplore")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003505 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3506 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3507" call Decho("calling NetBrowse(newdir<".newdir.">)")
3508 call s:NetBrowse(newdir)
3509 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003510 if newdir == ""|let newdir= getcwd()|endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003511" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3512 call s:LocalBrowse(newdir)
3513 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003514
Bram Moolenaar572cb562005-08-05 21:35:02 +00003515 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003516 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003517" call Decho("Nexplore Pexplore -or- Explore **/...")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003518
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003519 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003520 if !exists("w:netrw_explore_indx")
3521 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003522 endif
3523 let indx = a:indx
3524 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003525 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003526 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003527 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003528 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003529 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003530 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003531 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003532 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003533 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3534 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3535 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003536 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3537 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3538" call Dret("Explore")
3539 return
3540 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003541 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003542
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003543 " NetrwStatusLine support - for exploring support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003544 let w:netrw_explore_indx= indx
Bram Moolenaar488c6512005-08-11 20:09:58 +00003545" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003546
3547 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003548 if indx >= w:netrw_explore_listlen || indx < 0
3549 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003550 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003551 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3552" call Dret("Explore")
3553 return
3554 endif
3555
Bram Moolenaar488c6512005-08-11 20:09:58 +00003556 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003557" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003558 let newdir= substitute(dirfile,'/[^/]*$','','e')
3559" call Decho("newdir<".newdir.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003560
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003561" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3562 call s:LocalBrowse(newdir)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003563 if w:netrw_longlist == 0 || w:netrw_longlist == 1
3564 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3565 else
3566 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3567 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003568 let w:netrw_explore_mtchcnt = indx + 1
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003569 let w:netrw_explore_bufnr = bufnr("%")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003570 let w:netrw_explore_line = line(".")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003571 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar488c6512005-08-11 20:09:58 +00003572" 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 +00003573
3574 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003575 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003576 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 +00003577 endif
3578 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3579 endif
3580
Bram Moolenaar83bab712005-08-01 21:58:57 +00003581 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003582" call Decho("Explore newdir<".a:1.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003583 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003584 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003585 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003586
3587" call Dret("Explore")
3588endfun
3589
3590" ---------------------------------------------------------------------
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003591" SetupNetrwStatusLine: {{{2
3592fun! s:SetupNetrwStatusLine(statline)
3593" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
3594
3595 if !exists("s:netrw_setup_statline")
3596 let s:netrw_setup_statline= 1
3597" call Decho("do first-time status line setup")
3598
3599 if !exists("s:netrw_users_stl")
3600 let s:netrw_users_stl= &stl
3601 endif
3602 if !exists("s:netrw_users_ls")
3603 let s:netrw_users_ls= &laststatus
3604 endif
3605
3606 " set up User9 highlighting as needed
3607 let keepa= @a
3608 redir @a
3609 try
3610 hi User9
3611 catch /^Vim\%((\a\+)\)\=:E411/
3612 if &bg == "dark"
3613 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
3614 else
3615 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
3616 endif
3617 endtry
3618 redir END
3619 let @a= keepa
3620 endif
3621
3622 " set up status line (may use User9 highlighting)
3623 " insure that windows have a statusline
3624 " make sure statusline is displayed
3625 let &stl=a:statline
3626 set laststatus=2
3627" call Decho("stl=".&stl)
3628 redraw!
3629
3630" call Dret("SetupNetrwStatusLine : stl=".&stl)
3631endfun
3632
3633" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003634" NetrwStatusLine: {{{2
3635fun! NetrwStatusLine()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003636
3637 " vvv NetrwStatusLine() debugging vvv
3638" let g:stlmsg=""
3639" if !exists("w:netrw_explore_bufnr")
3640" let g:stlmsg="!X<explore_bufnr>"
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003641" elseif w:netrw_explore_bufnr != bufnr("%")
3642" let g:stlmsg="explore_bufnr!=".bufnr("%")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003643" endif
3644" if !exists("w:netrw_explore_line")
3645" let g:stlmsg=" !X<explore_line>"
3646" elseif w:netrw_explore_line != line(".")
3647" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
3648" endif
3649" if !exists("w:netrw_explore_list")
3650" let g:stlmsg=" !X<explore_list>"
3651" endif
3652 " ^^^ NetrwStatusLine() debugging ^^^
3653
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003654 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 +00003655 " restore user's status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003656 let &stl = s:netrw_users_stl
3657 let &laststatus = s:netrw_users_ls
Bram Moolenaar488c6512005-08-11 20:09:58 +00003658 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3659 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003660 return ""
3661 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003662 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003663 endif
3664endfun
3665
3666" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003667" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003668" Change backslashes to forward slashes, if any.
3669" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003670fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003671" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3672 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003673 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003674 let curdir= curdir.'/'
3675 endif
3676 if a:doesc
3677 let curdir= escape(curdir,s:netrw_cd_escape)
3678 endif
3679" call Dret("NetGetcwd <".curdir.">")
3680 return curdir
3681endfun
3682
3683" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003684" NetMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003685" method == 1: rcp
3686" 2: ftp + <.netrc>
3687" 3: ftp + machine, id, password, and [path]filename
3688" 4: scp
3689" 5: http (wget)
3690" 6: cadaver
3691" 7: rsync
3692" 8: fetch
3693" 9: sftp
3694fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003695" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003696
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003697 " initialization
3698 let b:netrw_method = 0
3699 let g:netrw_machine = ""
3700 let b:netrw_fname = ""
3701 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003702 let g:netrw_choice = a:choice
3703
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003704 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003705 " mipf : a:machine a:id password filename Use ftp
3706 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003707 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003708 " rcpurm : rcp://[user@]host/filename Use rcp
3709 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003710 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003711 " httpurm : http://[user@]host/filename Use wget
3712 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003713 " rsyncurm : rsync://host[:port]/path Use rsync
3714 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3715 " sftpurm : sftp://[user@]host/filename Use scp
3716 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3717 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3718 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003719 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003720 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003721 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003722 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003723 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003724 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3725 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3726 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003727
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003728" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003729 " Determine Method
3730 " rcp://user@hostname/...path-to-file
3731 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003732" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003733 let b:netrw_method = 1
3734 let userid = substitute(a:choice,rcpurm,'\1',"")
3735 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3736 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003737 if userid != ""
3738 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003739 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003740
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003741 " scp://user@hostname/...path-to-file
3742 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003743" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003744 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003745 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3746 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3747 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003748
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003749 " http://user@hostname/...path-to-file
3750 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003751" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003752 let b:netrw_method = 5
3753 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3754 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003755
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003756 " dav://hostname[:port]/..path-to-file..
3757 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003758" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003759 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003760 if a:choice =~ '^s'
3761 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3762 else
3763 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3764 endif
3765 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003766
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003767 " rsync://user@hostname/...path-to-file
3768 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003769" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003770 let b:netrw_method = 7
3771 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3772 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003773
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003774 " ftp://[user@]hostname[[:#]port]/...path-to-file
3775 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003776" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003777 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003778 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3779 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3780 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003781 if userid != ""
3782 let g:netrw_uid= userid
3783 endif
3784 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3785 let b:netrw_method = 3
3786 else
3787 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3788 let b:netrw_method= 2
3789 else
3790 if !exists("g:netrw_uid") || g:netrw_uid == ""
3791 call NetUserPass()
3792 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3793 call NetUserPass(g:netrw_uid)
3794 " else just use current g:netrw_uid and g:netrw_passwd
3795 endif
3796 let b:netrw_method= 3
3797 endif
3798 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003799
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003800 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003801" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003802 let b:netrw_method = 8
3803 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3804 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3805 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3806 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003807
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003808 " Issue an ftp : "machine id password [path/]filename"
3809 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003810" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003811 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003812 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3813 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3814 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3815 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003816
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003817 " Issue an ftp: "hostname [path/]filename"
3818 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003819" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003820 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3821 let b:netrw_method = 3
3822 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3823 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003824
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003825 elseif filereadable(expand("$HOME/.netrc"))
3826 let b:netrw_method = 2
3827 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3828 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3829 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003830
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003831 " sftp://user@hostname/...path-to-file
3832 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003833" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003834 let b:netrw_method = 9
3835 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3836 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003837
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003838 " Issue an rcp: hostname:filename" (this one should be last)
3839 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003840" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003841 let b:netrw_method = 1
3842 let userid = substitute(a:choice,rcphf,'\2',"")
3843 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3844 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003845" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3846" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3847" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3848" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003849 if userid != ""
3850 let g:netrw_uid= userid
3851 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003852 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003853 " don't let PCs try <.netrc>
3854 let b:netrw_method = 3
3855 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003856
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003857 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003858 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003859 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003860 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003861 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003862 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003863 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003864
3865 " remove any leading [:#] from port number
3866 if g:netrw_port != ""
3867 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3868 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003869
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003870" call Decho("a:choice <".a:choice.">")
3871" call Decho("b:netrw_method <".b:netrw_method.">")
3872" call Decho("g:netrw_machine<".g:netrw_machine.">")
3873" call Decho("g:netrw_port <".g:netrw_port.">")
3874" if exists("g:netrw_uid") "Decho
3875" call Decho("g:netrw_uid <".g:netrw_uid.">")
3876" endif "Decho
3877" if exists("g:netrw_passwd") "Decho
3878" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3879" endif "Decho
3880" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003881" call Dret("NetMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00003882endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003883
3884" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003885" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003886" Usage: :call NetUserPass() -- will prompt for userid and password
3887" :call NetUserPass("uid") -- will prompt for password
3888" :call NetUserPass("uid","password") -- sets global userid and password
3889fun! NetUserPass(...)
3890
3891 " get/set userid
3892 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003893" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003894 if !exists("g:netrw_uid") || g:netrw_uid == ""
3895 " via prompt
3896 let g:netrw_uid= input('Enter username: ')
3897 endif
3898 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003899" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003900 let g:netrw_uid= a:1
3901 endif
3902
3903 " get password
3904 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003905" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003906 let g:netrw_passwd= inputsecret("Enter Password: ")
3907 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003908" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003909 let g:netrw_passwd=a:2
3910 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003911
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003912" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003913endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003914
3915" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003916" NetOptionSave: save options and set to "standard" form {{{2
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003917fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003918" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003919 if !exists("w:netoptionsave")
3920 let w:netoptionsave= 1
3921 else
3922" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3923 return
3924 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003925
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003926 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003927 let w:aikeep = &ai
Bram Moolenaarc01140a2006-03-24 22:21:52 +00003928" " netrw and the acd option do not work together properly
3929" if &acd && (has("netbeans_intg") || has("sun_workshop"))
3930" set noacd
3931" echohl Warning | echomsg "***warning*** directory browsing and the acd setting are incompatible" |echohl None
3932" endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003933 let w:fokeep = &fo
3934 let w:aikeep = &ai
3935 let w:cikeep = &ci
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003936 let w:cinkeep = &cin
3937 let w:cinokeep = &cino
3938 let w:comkeep = &com
3939 let w:cpokeep = &cpo
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003940 let w:hidkeep = &hidden
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003941 let w:magickeep = &magic
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003942 if !g:netrw_keepdir
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003943 let w:dirkeep = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003944 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003945 let w:gdkeep = &gd
3946 let w:repkeep = &report
3947 let w:spellkeep = &spell
3948 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003949 setlocal cino =
3950 setlocal com =
3951 setlocal cpo -=aA
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003952 setlocal nocin noai noci magic nospell fo=nroql2 nohid
Bram Moolenaar8299df92004-07-10 09:47:34 +00003953 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003954 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003955 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003956 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003957 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003958" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003959 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003960
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003961" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003962endfun
3963
3964" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003965" NetOptionRestore: restore options {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003966fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003967" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003968 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003969" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003970 return
3971 endif
3972 unlet w:netoptionsave
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003973
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003974 if exists("w:aikeep")| let &ai= w:aikeep|endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003975 if exists("w:aikeep") |let &ai = w:aikeep |unlet w:aikeep |endif
3976 if exists("w:cikeep") |let &ci = w:cikeep |unlet w:cikeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003977 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3978 if exists("w:cinokeep") |let &cino = w:cinokeep |unlet w:cinokeep |endif
3979 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3980 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3981 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003982 if exists("w:fokeep") |let &fo = w:fokeep |unlet w:fokeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003983 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003984 if exists("w:hidkeep") |let &hidden = w:hidkeep |unlet w:hidkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003985 if exists("w:magic") |let &magic = w:magic |unlet w:magic |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003986 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3987 if exists("w:spellkeep")|let &spell = w:spellkeep |unlet w:spellkeep|endif
3988 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003989 if exists("w:swfkeep")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003990 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003991 " user hasn't specified a swapfile directory;
3992 " netrw will temporarily make the swapfile
3993 " directory the current local one.
3994 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003995 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003996 set directory=
3997 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003998 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003999 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00004000 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00004001 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004002
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004003" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00004004endfun
4005
4006" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004007" NetReadFixup: this sort of function is typically written by the user {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004008" to handle extra junk that their system's ftp dumps
4009" into the transfer. This function is provided as an
4010" example and as a fix for a Windows 95 problem: in my
4011" experience, win95's ftp always dumped four blank lines
4012" at the end of the transfer.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004013if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00004014 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004015" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00004016 if method == 3 " ftp (no <.netrc>)
4017 let fourblanklines= line2 - 3
4018 silent fourblanklines.",".line2."g/^\s*/d"
4019 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004020" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00004021 endfun
4022endif
4023
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004024" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004025" NetSort: Piet Delport's BISort2() function, modified to take a range {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004026if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004027 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00004028" " call Dfunc("NetSort()")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004029
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004030 let i = a:firstline + 1
4031 while i <= a:lastline
4032 " find insertion point via binary search
4033 let i_val = getline(i)
4034 let lo = a:firstline
4035 let hi = i
4036 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00004037 let mid = (lo + hi) / 2
4038 let mid_val = getline(mid)
4039 if g:netrw_sort_direction =~ '^n'
4040 " normal sorting order
4041 if i_val < mid_val
4042 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004043 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00004044 let lo = mid + 1
4045 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004046 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00004047 else
4048 " reverse sorting order
4049 if i_val > mid_val
4050 let hi = mid
4051 else
4052 let lo = mid + 1
4053 if i_val == mid_val | break | endif
4054 endif
4055 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004056 endwhile
4057 " do insert
4058 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00004059 exe 'keepjumps '.i.'d_'
4060 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004061 endif
4062 let i = i + 1
4063 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004064
Bram Moolenaar83bab712005-08-01 21:58:57 +00004065" " call Dret("NetSort")
4066 endfun
4067endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004068
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004069" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004070" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00004071" What this function does is to compute a priority for the patterns
4072" in the g:netrw_sort_sequence. It applies a substitute to any
4073" "files" that satisfy each pattern, putting the priority / in
4074" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004075fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00004076" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004077 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00004078 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
4079 else
4080 let seqlist = g:netrw_sort_sequence
4081 endif
4082 " sanity check -- insure that * appears somewhere
4083 if seqlist == ""
4084 let seqlist= '*'
4085 elseif seqlist !~ '\*'
4086 let seqlist= seqlist.',*'
4087 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004088 let priority = 1
4089 while seqlist != ""
4090 if seqlist =~ ','
4091 let seq = substitute(seqlist,',.*$','','e')
4092 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
4093 else
4094 let seq = seqlist
4095 let seqlist = ""
4096 endif
4097 let eseq= escape(seq,'/')
4098 if priority < 10
4099 let spriority= "00".priority.'\/'
4100 elseif priority < 100
4101 let spriority= "0".priority.'\/'
4102 else
4103 let spriority= priority.'\/'
4104 endif
4105" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
4106
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004107 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00004108 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004109 " apparently no files were left after a Hiding pattern was used
4110" call Dret("SetSort : no files left after hiding")
4111 return
4112 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004113 if seq == '*'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004114 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004115 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004116 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004117 endif
4118 let priority = priority + 1
4119 endwhile
4120
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00004121 " Following line associated with priority -- items that satisfy a priority
4122 " pattern get prefixed by ###/ which permits easy sorting by priority.
4123 " Sometimes files can satisfy multiple priority patterns -- only the latest
4124 " priority pattern needs to be retained. So, at this point, these excess
4125 " priority prefixes need to be removed, but not directories that happen to
4126 " be just digits themselves.
Bram Moolenaar8dff8182006-04-06 20:18:50 +00004127 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+\ze./\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004128
4129" call Dret("SetSort")
4130endfun
4131
Bram Moolenaar488c6512005-08-11 20:09:58 +00004132" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004133" SaveWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004134fun! s:SaveWinVars()
4135" call Dfunc("SaveWinVars()")
4136 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
4137 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
4138 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
4139 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
4140 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
4141 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4142 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
4143 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004144 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00004145" call Dret("SaveWinVars")
4146endfun
4147
4148" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004149" CopyWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004150fun! s:CopyWinVars()
4151" call Dfunc("CopyWinVars()")
4152 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
4153 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
4154 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
4155 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
4156 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
4157 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
4158 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
4159 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 +00004160 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 +00004161" call Dret("CopyWinVars")
4162endfun
4163
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004164" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004165" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004166" To allow separate windows to have their own activities, such as
4167" Explore **/pattern, several variables have been made window-oriented.
4168" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004169" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004170" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004171fun! s:SetBufWinVars()
4172" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004173 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004174 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
4175 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
4176 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
4177 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
4178 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
4179 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4180 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
4181 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
4182 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004183" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004184endfun
4185
4186" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004187" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004188" Matching function to BufferWinVars()
4189fun! s:UseBufWinVars()
4190" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004191 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004192 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
4193 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
4194 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
4195 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
4196 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
4197 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
4198 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
4199 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
4200 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
4201" call Dret("UseBufWinVars")
4202endfun
4203
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004204" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004205" RFC2396: converts %xx into characters {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004206fun! netrw#RFC2396(fname)
4207" call Dfunc("RFC2396(fname<".a:fname.">)")
4208 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
4209" call Dret("RFC2396 ".fname)
4210 return fname
4211endfun
4212
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004213" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004214" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004215let &cpo= s:keepcpo
4216unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004217
Bram Moolenaar071d4272004-06-13 20:20:40 +00004218" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00004219" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00004220" vim:ts=8 fdm=marker