blob: 00a3f3e8730c832e1dfdad9a0e82e0e4d8b7d02c [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 Moolenaar910f66f2006-04-05 20:41:53 +00003" Date: Mar 31, 2006
4" Version: 84
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 Moolenaar910f66f2006-04-05 20:41:53 +000026let g:loaded_netrw = "v84"
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 Moolenaar4ea8fe12006-03-09 22:32:39 +0000460 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000461" call Decho("netrw_fname<".netrw_fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000462 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000463 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000464 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000465" call Decho("filter input: ".getline("."))
466 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
467" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000468 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000469" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000470 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
471 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000472" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000473 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
474 endif
475 " 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 +0000476 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000477 let debugkeep= &debug
478 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000479 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000480 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000481 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000482 endif
483 bd!
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000484 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000485 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000486
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000487 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000488 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000489 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
490 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000491" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000492 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000493 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000494 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000495 if exists("g:netrw_port") && g:netrw_port != ""
496 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000497" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000498 else
499 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000500" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000501 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000502
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000503 if exists("g:netrw_ftp") && g:netrw_ftp == 1
504 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000505" call Decho("filter input: ".getline("."))
506 put ='\"'.g:netrw_passwd.'\"'
507" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000508 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000509 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
510" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000511 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000512
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
514 put =g:netrw_ftpmode
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000515" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000516 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000517 put ='get \"'.netrw_fname.'\" '.tmpfile
518" call Decho("filter input: ".getline("."))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000519
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000520 " perform ftp:
521 " -i : turns off interactive prompting from ftp
522 " -n unix : DON'T use <.netrc>, even though it exists
523 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000524 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000525" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000526 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
527 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
528 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000529" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000530 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000531 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000532 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000533 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000534 endif
535 bd!
536 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
537 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000538
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000539 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000540 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000541 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000542" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000543 if exists("g:netrw_port") && g:netrw_port != ""
544 let useport= " -P ".g:netrw_port
545 else
546 let useport= ""
547 endif
548 if g:netrw_cygwin == 1
549 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000550" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".cygtmpfile)
551 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 +0000552 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000553" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile)
554 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 +0000555 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000556 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000557 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000558
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000559 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000560 " http: NetRead Method #5 (wget) {{{3
561 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000562" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000563 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000564 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000565 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000566 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000567 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000568" call Dret("NetRead")
569 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000570 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000571
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000572 if match(b:netrw_fname,"#") == -1
573 " simple wget
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000574 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
575" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname)
576 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000577 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000578
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000579 else
580 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000581 let netrw_html= substitute(netrw_fname,"#.*$","","")
582 let netrw_tag = substitute(netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000583" call Decho("netrw_html<".netrw_html.">")
584" call Decho("netrw_tag <".netrw_tag.">")
585" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000586 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
587 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000588" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000589 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
590 endif
591 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000592
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000593 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000594 " cadaver: NetRead Method #6 {{{3
595 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000596" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000597
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000599 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000600 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000601 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 if exists("g:netrw_port") && g:netrw_port != ""
603 put ='open '.g:netrw_machine.' '.g:netrw_port
604 else
605 put ='open '.g:netrw_machine
606 endif
607 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000608
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000609 if g:netrw_cygwin == 1
610 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
611 put ='get '.netrw_fname.' '.cygtmpfile
612 else
613 put ='get '.netrw_fname.' '.tmpfile
614 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000615 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000616
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000617 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000618 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000619" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000620 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
621 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000623 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000624
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000625 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000626 " rsync: NetRead Method #7 {{{3
627 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000628" call Decho("read via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000629 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630 if g:netrw_cygwin == 1
631 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000632" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
633 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000634 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000635" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
636 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000637 endif
638 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
639 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000640
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000641 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000642 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000643 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000644 elseif b:netrw_method == 8
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000645 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000646 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000647 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000648 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000649 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000650 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000651" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000652 endif
653 if exists("g:netrw_option") && g:netrw_option == ":http"
654 let netrw_option= "http"
655 else
656 let netrw_option= "ftp"
657 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000658" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000659
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000660 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000661" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
662 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 +0000663 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000664" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname)
665 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000667
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000668 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
669 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000670
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000671 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000672 " sftp: NetRead Method #9 {{{3
673 elseif b:netrw_method == 9
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000674" call Decho("read via sftp (method #4)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000675 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000676 if g:netrw_cygwin == 1
677 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000678" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
679" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
680 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000681 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000682" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
683 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000684 endif
685 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
686 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000687
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000688 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000689 " Complain {{{3
690 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000691 echo "***warning*** unable to comply with your request<" . choice . ">"
692 endif
693 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000694
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000695 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000696" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000697 if exists("b:netrw_method")
698 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000699 unlet b:netrw_fname
700 endif
701 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000702
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000703" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000704endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705
706" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000707" NetGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000708" readcmd == %r : replace buffer with newly read file
709" == 0r : read file at top of buffer
710" == r : read file after current line
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000711fun! s:NetGetFile(readcmd, tfile, method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000712" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000713
714 " get name of remote filename (ie. url and all)
715 let rfile= bufname("%")
716" call Decho("rfile<".rfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000717
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000718 if exists("*NetReadFixup")
719 " for the use of NetReadFixup (not otherwise used internally)
720 let line2= line("$")
721 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000722
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000723 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000724 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000725 if g:netrw_cygwin
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000726 let tfile= a:tfile
727" call Decho("(win32 && cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000728 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000729 let tfile= substitute(a:tfile,'/','\\\\','ge')
730" call Decho("(win32 && !cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000731 endif
732 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000733 let tfile= a:tfile
734" call Decho("tfile=a:tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000735 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000736
737 if a:readcmd[0] == '%'
Bram Moolenaar81695252004-12-29 20:58:21 +0000738 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000739
Bram Moolenaar83bab712005-08-01 21:58:57 +0000740" call Dredir("ls!","starting buffer list")
741
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000742 " rename the current buffer to the temp file (ie. tfile)
743 keepalt exe "file ".tfile
744" call Dredir("ls!","after renaming current buffer to <".tfile.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000745
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000746 " edit temporary file (ie. read the temporary file in)
747 if rfile =~ '\.zip$'
748 call zip#Browse(tfile)
749 elseif rfile =~ '\.tar$'
750 call tar#Browse(tfile)
751 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000752" call Decho("edit temporary file")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000753 e
754 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000755
Bram Moolenaar81695252004-12-29 20:58:21 +0000756 " rename buffer back to remote filename
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000757 keepalt exe "file ".escape(rfile,' ')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000758 filetype detect
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000759" call Dredir("ls!","renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000760 let line1 = 1
761 let line2 = line("$")
762
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000763 elseif filereadable(tfile)
Bram Moolenaar81695252004-12-29 20:58:21 +0000764 " read file after current line
765 let curline = line(".")
766 let lastline= line("$")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000767" call Decho("exe<".a:readcmd." ".v:cmdarg." ".tfile."> line#".curline)
768 exe a:readcmd." ".v:cmdarg." ".tfile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000769 let line1= curline + 1
770 let line2= line("$") - lastline + 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000771
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000772 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000773 " not readable
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000774 echohl WarningMsg | echo "***netrw*** file <".tfile."> not readable"| echohl None
775 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
776" call Dret("NetGetFile : tfile<".tfile."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000777 return
778 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000779
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 " User-provided (ie. optional) fix-it-up command
781 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000782" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000783 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000784" else " Decho
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000785" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000786 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000787
788 " update the Buffers menu
789 if has("gui") && has("gui_running")
790 silent! emenu Buffers.Refresh\ menu
791 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000792
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000793" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".filereadable(a:tfile))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000794
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000795 " make sure file is being displayed
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000796 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000797" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000798endfun
799
800" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000801" NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000802fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000803" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000804
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000805 " option handling
806 let mod= 0
807 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000808
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000809 " Get Temporary Filename {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000810 let tmpfile= escape(tempname(),g:netrw_tmpfile_escape)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000811 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
812 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
813 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000814" call Dret("NetWrite")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000815 return
816 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000817
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 if a:0 == 0
819 let ichoice = 0
820 else
821 let ichoice = 1
822 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000823
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000824 if &binary
825 " for binary writes, write entire file. Line numbers don't really make sense.
826 " Supports the writing of tar and zip files.
827" call Decho("silent exe w! ".v:cmdarg." ".tmpfile)
828 silent exe "w! ".v:cmdarg." ".tmpfile
829 else
830 " write (selected portion of) file to temporary
831" call Decho("silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile)
832 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
833 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000834
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000835 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000836
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000837 " Process arguments: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000838 " attempt to repeat with previous host-file-etc
839 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000840" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000841 let choice = b:netrw_lastfile
842 let ichoice= ichoice + 1
843 else
844 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000845
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000846 " Reconstruct Choice if choice starts with '"'
847 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000848 echomsg 'NetWrite Usage:"'
849 echomsg ':Nwrite machine:path uses rcp'
850 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
851 echomsg ':Nwrite "machine id password path" uses ftp'
852 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
853 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
854 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
855 echomsg ':Nwrite rcp://machine/path uses rcp'
856 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
857 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
858 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000859 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000860
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000861 elseif match(choice,"^\"") != -1
862 if match(choice,"\"$") != -1
863 " case "..."
864 let choice=strpart(choice,1,strlen(choice)-2)
865 else
866 " case "... ... ..."
867 let choice = strpart(choice,1,strlen(choice)-1)
868 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000869
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000870 while match(choice,"\"$") == -1
871 let wholechoice= wholechoice . " " . choice
872 let ichoice = ichoice + 1
873 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000874 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000875 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000876 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000877 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000878" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000879 return
880 endif
881 let choice= a:{ichoice}
882 endwhile
883 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
884 endif
885 endif
886 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000887" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000888 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000889
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000890 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000891 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000892 let choice= substitute(choice,'\\','/','ge')
893 "ER: see NetRead()
894 exe 'lcd ' . fnamemodify(tmpfile,':h')
895 let tmpfile = fnamemodify(tmpfile,':t')
896 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000897
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000898 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000899 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000900
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000901 " =============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000902 " Perform Protocol-Based Write {{{3
903 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000904 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
905 echo "(netrw) Processing your write request..."
906 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000907
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000908 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000909 " rcp: NetWrite Method #1 {{{3
910 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000911" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000912 if s:netrw_has_nt_rcp == 1
913 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
914 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
915 else
916 let uid_machine = g:netrw_machine .'.'. $USERNAME
917 endif
918 else
919 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
920 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
921 else
922 let uid_machine = g:netrw_machine
923 endif
924 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000925 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
926" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname)
927 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000929
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000930 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000931 " ftp + <.netrc>: NetWrite Method #2 {{{3
932 elseif b:netrw_method == 2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000933 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000934 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000935 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000936 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000937" call Decho(" filter input: ".getline("."))
938 exe "put ='"."put ".tmpfile.' \"'.netrw_fname.'\"'."'"
939" call Decho(" filter input: ".getline("."))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000940 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000941" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000942 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000943 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000944" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000945 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000946 endif
947 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
948 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000949 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000950 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000951 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000952 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000953 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954 endif
955 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000956 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000957
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000958 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000959 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{3
960 elseif b:netrw_method == 3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000961 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000962 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000963 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000964 if exists("g:netrw_port") && g:netrw_port != ""
965 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000966" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000967 else
968 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000969" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000970 endif
971 if exists("g:netrw_ftp") && g:netrw_ftp == 1
972 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000973" call Decho("filter input: ".getline("."))
974 put ='\"'.g:netrw_passwd.'\"'
975" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000977 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
978" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000979 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000980 put ='put '.tmpfile.' \"'.netrw_fname.'\"'
981" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000982 " save choice/id/password for future use
983 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000984
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 " perform ftp:
986 " -i : turns off interactive prompting from ftp
987 " -n unix : DON'T use <.netrc>, even though it exists
988 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000989 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000990" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
992 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
993 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000994 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000995 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000996 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000997 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000998 let mod=1
999 endif
1000 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001001
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001002 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001003 " scp: NetWrite Method #4 {{{3
1004 elseif b:netrw_method == 4
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001005 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 if exists("g:netrw_port") && g:netrw_port != ""
1007 let useport= " -P ".g:netrw_port
1008 else
1009 let useport= ""
1010 endif
1011 if g:netrw_cygwin == 1
1012 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001013" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'")
1014 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001015 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001016" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'")
1017 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001018 endif
1019 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001020
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001021 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001022 " http: NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001023 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001024 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001025 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001026 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001027 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001028
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001029 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001030 " dav: NetWrite Method #6 (cadaver) {{{3
1031 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001032" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001033
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001034 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001035 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001036 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001037 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001038 if exists("g:netrw_port") && g:netrw_port != ""
1039 put ='open '.g:netrw_machine.' '.g:netrw_port
1040 else
1041 put ='open '.g:netrw_machine
1042 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001043 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001044
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001045 if g:netrw_cygwin == 1
1046 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
1047 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001048 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001049 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001050 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001051
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001052 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001053 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001054" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001055 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
1056 bd!
1057 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001058
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001059 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001060 " rsync: NetWrite Method #7 {{{3
1061 elseif b:netrw_method == 7
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001062 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001063 if g:netrw_cygwin == 1
1064 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001065" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname)
1066 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001067 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001068" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
1069 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001070 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001071 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001072
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001073 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001074 " sftp: NetWrite Method #9 {{{3
1075 elseif b:netrw_method == 9
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001076 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001077 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1078 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1079 else
1080 let uid_machine = g:netrw_machine
1081 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001082 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001083 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001084 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001085 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001086" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001087 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1088 bd!
1089 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001090
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001091 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001092 " Complain {{{3
1093 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001094 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001095 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001096 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001097
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001098 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001099" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001100 let result=delete(tmpfile)
1101 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001102
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001103 if a:firstline == 1 && a:lastline == line("$")
1104 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001105 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001106
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001107" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001108endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001109
Bram Moolenaar83bab712005-08-01 21:58:57 +00001110" ===========================================
1111" Remote Directory Browsing Support: {{{1
1112" ===========================================
1113
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001114" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001115" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001116" of the contents of a remote directory. It is assumed that the
1117" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1118" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001119fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001120 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1121" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001122
Bram Moolenaar488c6512005-08-11 20:09:58 +00001123 if exists("s:netrw_skipbrowse")
1124 unlet s:netrw_skipbrowse
1125" call Dret("NetBrowse")
1126 return
1127 endif
1128
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001129 call s:NetOptionSave()
1130
Bram Moolenaar843ee412004-06-30 16:16:41 +00001131 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001132 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1133" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001134 if !executable("ftp")
1135 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001136 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001137 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001138 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001139 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001140" call Dret("NetBrowse")
1141 return
1142 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001143 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001144 if !exists("g:netrw_quiet")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001145 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 +00001146 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001147 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001148
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001149 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001150" call Dret("NetBrowse")
1151 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001152 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001153
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001154 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1155 call s:UseBufWinVars()
1156
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001157 " set up menus
1158 let b:netrw_browser_active= 1
1159 call s:NetMenu()
1160
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001161 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001162 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001163
1164 " analyze a:dirname and g:netrw_list_cmd
1165 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001166 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001167" call Decho("dirname<".dirname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001168 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001169 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001170 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001171 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001172 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001173 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001174" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001175 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001176 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001177
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001178 let method = substitute(dirname,dirpat,'\1','')
1179 let user = substitute(dirname,dirpat,'\2','')
1180 let machine = substitute(dirname,dirpat,'\3','')
1181 let path = substitute(dirname,dirpat,'\4','')
1182 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001183" call Decho("set up method <".method .">")
1184" call Decho("set up user <".user .">")
1185" call Decho("set up machine<".machine.">")
1186" call Decho("set up path <".path .">")
1187" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001188
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001189 if method == "ftp" || method == "http"
1190 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001191 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001192 else
1193 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1194 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001195
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001196 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001197" call Decho("setting w:netrw_method<".b:netrw_method.">")
1198 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001199 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001200
Bram Moolenaar8299df92004-07-10 09:47:34 +00001201 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001202 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001203 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 +00001204 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001205 else
1206 if g:netrw_sort_by =~ "^t"
1207 let listcmd= listcmd."t"
1208 elseif g:netrw_sort_by =~ "^s"
1209 let listcmd= listcmd."S"
1210 endif
1211 " optionally sort in reverse
1212 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1213 let listcmd= listcmd."r"
1214 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001215 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001216
1217" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001218 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001219" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001220 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001221 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001222 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223" call Dret("NetBrowse : symlink")
1224 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001225
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001226 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001227 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001228" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001229
1230 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001231 " "this is a directory" indicator (/). There shouldn't be one of those,
1232 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001233 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001234" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001235
1236 " remote-read the requested file into current buffer
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001237 keepjumps keepalt enew!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001238 set ma
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001239" call Decho("exe file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001240 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001241 exe "silent doau BufReadPre ".fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001242 silent call netrw#NetRead(2,method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001243 exe "silent doau BufReadPost ".fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001244
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001245 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001246 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001247 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001248 setlocal nomod nowrap
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001249
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001250" call Dret("NetBrowse : file<".fname.">")
1251 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001252 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001253
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001254 " ---------------------------------------------------------------------
1255 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001256" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001257 " set up new buffer and map
1258 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001259 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001260" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001261 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001262 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001263" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001264 exe "b ".bufnamenr
1265 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001266 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001267" call Dret("NetBrowse")
1268 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001269 endif
1270 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001271" call Decho("generate a new buffer")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001272 keepjumps keepalt enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001273 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001274
1275 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001276 setlocal bt=nofile bh=wipe nobl noswf
1277 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001278" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001279 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001280" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001281 setlocal bt=nofile nobl nonu noswf
1282 if g:netrw_fastbrowse >= 1
1283 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001284 else
1285 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001286 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001287
1288 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001289 call s:NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001290
1291 " set up buffer-local mappings
1292" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001293 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001294 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'),0)<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001295 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001296 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 +00001297 if w:netrw_longlist != 2
1298 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1299 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1300 endif
1301 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1302 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001303 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1304 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001305 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001306 nnoremap <buffer> <silent> O :call netrw#NetObtain()<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001307 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001308 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1309 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>
1310 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>
1311 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001312 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1313 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001314 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001315 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001316 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001317 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001318 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001319 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001320 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001321 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001322 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001323 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00001324 nnoremap <buffer> <F1> :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001325 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001326
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001327 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001328" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1329 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001330 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001331 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001332 let w:netrw_bannercnt = 7
1333 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001334 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001335 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001336 endif
1337
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001338 if g:netrw_sort_by =~ "^n"
1339 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001340 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001341 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001342 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1343 else
1344 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001345 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001346 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001347 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001348" call Decho("g:netrw_hide=".g:netrw_hide)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001349 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001350 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001351 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001352 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001353 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001354 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001355 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001356 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 +00001357 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001358
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001359 " remote read the requested directory listing
1360 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1361 " Note that not all ftp servers honor the options for ls
1362 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001363 " use ftp to get remote file listing
1364" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001365 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001366 keepjumps 1d
1367
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001368 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001369 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001370" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001371 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001372
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001373 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001374 if g:netrw_ftp_browse_reject != ""
1375 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1376 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001377 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001378
1379 " if there's no ../ listed, then put ./ and ../ in
1380 let line1= line(".")
1381 keepjumps 1
1382 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1383 let line2= line(".")
1384 if line2 == 0
1385 keepjumps put='../'
1386 keepjumps put='./'
1387 endif
1388 exe "keepjumps ".line1
1389 keepjumps norm! 0
1390
1391 " more cleanup
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001392 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1393 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1394 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001395 endif
1396
1397 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001398 " use ssh to get remote file listing
1399" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001400 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001401" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001402 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1403 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001404 " cleanup
1405 if g:netrw_ftp_browse_reject != ""
1406 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001407 endif
1408 endif
1409
1410 " set up syntax highlighting
1411 if has("syntax")
1412 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001413 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001414 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001415 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1416 " sometimes the laststatus highlight bleeds into the entire display.
1417 " Only seems to happen with remote browsing. Weird.
1418 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001419 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001420 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001421
1422 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001423 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001424 if g:netrw_hide && g:netrw_list_hide != ""
1425 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001426 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001427
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001428 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001429 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001430" call Decho("manipulate long listing")
1431
1432 if method == "ftp"
1433 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001434 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001435 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001436 keepjumps d
1437 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001438 " if there's no ../ listed, then put ./ and ../ in
1439 let line1= line(".")
1440 keepjumps 1
1441 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1442 let line2= line(".")
1443 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001444 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1445 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001446 endif
1447 exe "keepjumps ".line1
1448 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001449 endif
1450
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001451 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1452 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1453 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001454 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001455
Bram Moolenaar488c6512005-08-11 20:09:58 +00001456 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001457 if g:netrw_sort_by =~ "^n"
1458 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001459 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001460 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001461 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001462 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001463 endif
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 Moolenaarafeb4fa2006-02-01 21:51:12 +00001498 if g:netrw_browse_split == 1
1499 new
1500 wincmd _
1501 elseif g:netrw_browse_split == 2
1502 rightb vert new
1503 wincmd |
1504 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001505 call s:NetMenu()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001506" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001507
1508 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001509 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001510" call Decho("refresh directory listing")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001511 setlocal ma nobl
1512 if g:netrw_fastbrowse >= 1
1513 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001514 else
1515 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001516 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001517 %d
1518
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001519 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001520 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001521 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001522
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001523 if trailer =~ '^\%(\.\./\)*$'
1524 " tack on a ../"
1525 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001526
1527 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001528 " strip off a directory name from dirname
1529 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001530 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001531" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001532
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001533 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001534 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001535 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001536" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001537 endif
1538
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001539" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001540 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001541endfun
1542
Bram Moolenaar843ee412004-06-30 16:16:41 +00001543" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001544" NetGetWord: it gets the directory named under the cursor {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001545fun! s:NetGetWord()
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001546" call Dfunc("NetGetWord() line#".line(".")." longlist=".g:netrw_longlist." virtcol=".virtcol("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001547 call s:UseBufWinVars()
1548
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001549 " insure that w:netrw_longlist is set up
1550 if !exists("w:netrw_longlist")
1551 if exists("g:netrw_longlist")
1552 let w:netrw_longlist= g:netrw_longlist
1553 else
1554 let w:netrw_longlist= 0
1555 endif
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001556" call Decho("w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001557 endif
1558
Bram Moolenaar488c6512005-08-11 20:09:58 +00001559 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001560 " Active Banner support
1561" call Decho("active banner handling")
1562 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001563 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001564 let curline= getline(".")
1565 if curline =~ '"\s*Sorted by\s'
1566 norm s
1567 let s:netrw_skipbrowse= 1
1568 echo 'Pressing "s" also works'
1569 elseif curline =~ '"\s*Sort sequence:'
1570 let s:netrw_skipbrowse= 1
1571 echo 'Press "S" to edit sorting sequence'
1572 elseif curline =~ '"\s*Quick Help:'
1573 norm ?
1574 let s:netrw_skipbrowse= 1
1575 echo 'Pressing "?" also works'
1576 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1577 norm a
1578 let s:netrw_skipbrowse= 1
1579 echo 'Pressing "a" also works'
1580 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001581 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001582 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001583
1584 elseif w:netrw_longlist == 0
1585" call Decho("thin column handling")
1586 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001587 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001588
1589 elseif w:netrw_longlist == 1
1590" call Decho("long column handling")
1591 norm! 0
1592 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1593
1594 else
1595" call Decho("obtain word from wide listing")
1596 let dirname= getline(".")
1597
1598 if !exists("b:netrw_cpf")
1599 let b:netrw_cpf= 0
1600 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1601" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001602 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001603
1604 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001605" 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 +00001606" call Decho("1: dirname<".dirname.">")
1607 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1608" call Decho("2: dirname<".dirname.">")
1609 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1610" call Decho("3: dirname<".dirname.">")
1611 let dirname = substitute(dirname,'\s\+$','','e')
1612" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001613 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001614
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001615" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001616 return dirname
1617endfun
1618
1619" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001620" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001621fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001622" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001623" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001624
1625 " preparation for removing multiple files/directories
1626 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001627 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001628
1629 " remove multiple files and directories
1630 while ctr <= a:lastline
1631 exe ctr
1632
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001633 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001634" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001635
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001636 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001637 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001638 if !all
1639 echohl Statement
1640 call inputsave()
1641 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1642 call inputrestore()
1643 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001644 if ok == ""
1645 let ok="no"
1646 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001647 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1648 if ok =~ 'a\%[ll]'
1649 let all= 1
1650 endif
1651 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001652
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001653 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001654 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001655 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001656 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001657 else
1658 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1659" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1660 let ret= system(netrw_rm_cmd)
1661" call Decho("returned=".ret." errcode=".v:shell_error)
1662 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001663 elseif ok =~ 'q\%[uit]'
1664 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001665 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001666
Bram Moolenaar843ee412004-06-30 16:16:41 +00001667 else
1668 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001669 if !all
1670 call inputsave()
1671 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1672 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001673 if ok == ""
1674 let ok="no"
1675 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001676 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1677 if ok =~ 'a\%[ll]'
1678 let all= 1
1679 endif
1680 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001681
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001682 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001683 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001684 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001685 else
1686 let rmfile = a:path.rmfile
1687 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1688" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1689 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001690" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001691
1692 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001693 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001694" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1695 let ret= system(netrw_rmf_cmd)
1696" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001697
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001698 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001699 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001700 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001701 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001702 endif
1703 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001704
1705 elseif ok =~ 'q\%[uit]'
1706 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001707 endif
1708 endif
1709
1710 let ctr= ctr + 1
1711 endwhile
1712
1713 " refresh the directory
1714 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001715" call Decho("refresh the directory")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001716 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001717 exe curline
1718
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001719" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001720endfun
1721
1722" ---------------------------------------------------------------------
1723" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001724fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001725" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001726
1727 " preparation for removing multiple files/directories
1728 let ctr = a:firstline
1729 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1730
1731 " attempt to rename files/directories
1732 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001733 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001734
1735 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001736 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001737" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001738
1739 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001740 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001741 call inputrestore()
1742
Bram Moolenaar488c6512005-08-11 20:09:58 +00001743 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001744 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001745 else
1746 let oldname= a:path.oldname
1747 let newname= a:path.newname
1748" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1749 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1750 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001751
1752 let ctr= ctr + 1
1753 endwhile
1754
1755 " refresh the directory
1756 let curline= line(".")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001757 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001758 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001759" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001760endfun
1761
1762" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001763" NetRefresh: {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001764fun! s:NetRefresh(dirname,islocal)
1765" call Dfunc("NetRefresh(dirname<".a:dirname.">,islocal=".a:islocal.")")
1766 call netrw#NetSavePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001767 set ma
1768 %d
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001769 if a:islocal
1770 call s:LocalBrowse(a:dirname)
1771 else
1772 call s:NetBrowse(a:dirname)
1773 endif
1774 call netrw#NetRestorePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001775 redraw!
1776" call Dret("NetRefresh")
1777endfun
1778
1779" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001780" NetSplit: mode {{{2
1781" =0 : net and o
1782" =1 : net and v
1783" =2 : local and o
1784" =3 : local and v
1785fun! s:NetSplit(mode)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001786" call Dfunc("NetSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001787
1788 call s:SaveWinVars()
1789 if a:mode == 0
1790 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1791 call s:CopyWinVars()
1792 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001793 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001794 elseif a:mode ==1
1795 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1796 call s:CopyWinVars()
1797 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001798 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001799 elseif a:mode ==2
1800 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1801 call s:CopyWinVars()
1802 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001803 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001804 else
1805 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1806 call s:CopyWinVars()
1807 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001808 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001809 endif
1810
1811" call Dret("NetSplit")
1812endfun
1813
1814" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001815" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001816" files given their extension. Passes 0=local, 1=remote
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001817fun! netrw#NetBrowseX(fname,remote)
1818" call Dfunc("NetBrowseX(fname<".a:fname."> remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001819
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001820 " set up the filename
1821 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001822 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001823 if has("win32") || has("win95") || has("win64") || has("win16")
1824 let exten= substitute(exten,'^.*$','\L&\E','')
1825 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001826 let fname= escape(a:fname,"%#")
1827" call Decho("fname<".fname."> after escape()")
1828
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001829 " seems kde systems often have gnome-open due to dependencies, even though
1830 " gnome-open's subsidiary display tools are largely absent. Kde systems
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001831 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
1832 if !exists("s:haskdeinit")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001833 if has("unix")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001834 silent! let s:haskdeinit= system('ps -e') =~ 'kdeinit'
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001835 if v:shell_error
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001836 let s:haskdeinit = 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001837 endif
1838 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001839 let s:haskdeinit= 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001840 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001841" call Decho("setting s:haskdeinit=".s:haskdeinit)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001842 endif
1843
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001844 if a:remote == 1
1845 " create a local copy
1846 let fname= tempname().".".exten
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001847" call Decho("a:remote==1: create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001848 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001849 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001850 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001851 q
1852 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001853" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001854
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001855 " set up redirection
1856 if &srr =~ "%s"
Bram Moolenaarf4cd3e82005-12-22 22:47:02 +00001857 let redir= substitute(&srr,"%s","/dev/null","")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001858 else
1859 let redir= &srr . "/dev/null"
1860 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001861" call Decho("redir{".redir."} srr{".&srr."}")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001862
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001863 if exists("g:netrw_browsex_viewer") && executable(g:netrw_browsex_viewer)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001864" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001865 if g:netrw_browsex_viewer == '-'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001866 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001867 else
1868" call Decho("exe silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."' ".redir)
1869 exe "silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."'".redir
1870 let ret= v:shell_error
1871 endif
1872
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001873 " execute the file handler
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001874 elseif has("win32") || has("win64")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001875" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1876 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1877 let ret= v:shell_error
1878
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001879 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaara5792f52005-11-23 21:25:05 +00001880" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1881 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1882 let ret= v:shell_error
1883
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001884 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001885" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1886 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1887 let ret= v:shell_error
1888
1889 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001890 " netrwFileHandlers#Invoke() always returns 0
1891 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001892 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001893
1894 " if unsuccessful, attempt netrwFileHandlers#Invoke()
1895 if ret
1896 let ret= netrwFileHandlers#Invoke(exten,fname)
1897 endif
1898
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001899 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001900
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001901 " cleanup: remove temporary file,
1902 " delete current buffer if success with handler,
1903 " return to prior buffer (directory listing)
1904 if a:remote == 1 && fname != a:fname
1905" call Decho("deleting temporary file<".fname.">")
1906 call delete(fname)
1907 endif
1908
1909 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001910 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001911 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001912 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001913 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001914
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001915" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001916endfun
1917
1918" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001919" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1920" This function assumes that a long listing will be received. Size, time,
1921" and reverse sorts will be requested of the server but not otherwise
1922" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001923fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001924" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001925
1926 " because WinXX ftp uses unix style input
1927 " curline is one more than the bannercnt in order to account
1928 " for the unwanted first blank line (doing a :put to an empty
1929 " buffer yields a blank first line)
1930 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001931 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001932 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001933 exe "silent! keepjumps ".curline.",$d"
1934
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001935 ".........................................
1936 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001937 " ftp + <.netrc>: Method #2
1938 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001939 put ='cd \"'.a:path.'\"'
1940" call Decho('ftp: '.getline("."))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001941 endif
1942 exe "put ='".a:cmd."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001943" call Decho("ftp: ".getline("."))
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001944" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001945 if exists("g:netrw_port") && g:netrw_port != ""
1946" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1947 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1948 else
1949" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1950 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1951 endif
1952
1953 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001954 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001955 " ftp + machine,id,passwd,filename: Method #3
1956 setlocal ff=unix
1957 if exists("g:netrw_port") && g:netrw_port != ""
1958 put ='open '.g:netrw_machine.' '.g:netrw_port
1959 else
1960 put ='open '.g:netrw_machine
1961 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001962
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001963 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1964 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001965 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001966 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001967 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001968 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001969
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001970 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001971 put ='cd \"'.a:path.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001972 endif
1973 exe "put ='".a:cmd."'"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001974
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001975 " perform ftp:
1976 " -i : turns off interactive prompting from ftp
1977 " -n unix : DON'T use <.netrc>, even though it exists
1978 " -n win32: quit being obnoxious about password
1979" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1980 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1981
1982 ".........................................
1983 else
1984 echo "***warning*** unable to comply with your request<" . choice . ">"
1985 endif
1986
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001987 " cleanup for Windows
1988 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001989 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001990 endif
1991 if a:cmd == "dir"
1992 " infer directory/link based on the file permission string
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001993 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1994 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001995 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001996 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001997 endif
1998 endif
1999
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002000 " ftp's ls doesn't seem to include ./ or ../
2001 if !search('^\.\/$','wn')
2002 exe 'keepjumps '.curline
2003 if a:path !~ '^$'
2004 put ='../'
2005 endif
2006 put ='./'
2007 exe 'keepjumps '.curline
2008 endif
2009
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002010 " restore settings
2011 let &ff= ffkeep
2012" call Dret("NetBrowseFtpCmd")
2013endfun
2014
2015" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00002016" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
2017" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002018fun! s:NetrwListHide()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002019" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002020
2021 let listhide= g:netrw_list_hide
2022 while listhide != ""
2023 if listhide =~ ','
2024 let hide = substitute(listhide,',.*$','','e')
2025 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
2026 else
2027 let hide = listhide
2028 let listhide= ""
2029 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002030
2031 " Prune the list by hiding any files which match
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002032 if g:netrw_hide == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002033" call Decho("hiding<".hide."> listhide<".listhide.">")
2034" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d')
2035 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002036 elseif g:netrw_hide == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002037" call Decho("showing<".hide."> listhide<".listhide.">")
2038" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d')
2039 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002040 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00002041 endwhile
2042
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002043" call Dret("NetrwListHide")
2044endfun
2045
2046" ---------------------------------------------------------------------
2047" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002048fun! s:NetHideEdit(islocal)
2049" call Dfunc("NetHideEdit(islocal=".a:islocal.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002050
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002051 " get new hiding list from user
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002052 call inputsave()
2053 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
2054 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002055 let g:netrw_list_hide= newhide
2056" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002057
2058 " refresh the listing
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002059 if a:islocal == 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002060 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2061 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002062 silent call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,"./"),a:islocal)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002063 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002064
2065" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002066endfun
2067
Bram Moolenaar8299df92004-07-10 09:47:34 +00002068" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002069" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002070fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002071" call Dfunc("NetSortSequence(mode=".a:mode.")")
2072
2073 call inputsave()
2074 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
2075 call inputrestore()
2076
2077 " refresh the listing
2078 let g:netrw_sort_sequence= newsortseq
2079 if a:mode == 0
2080 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2081 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002082 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002083 endif
2084
2085" call Dret("NetSortSequence")
2086endfun
2087
2088" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002089" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002090fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002091" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
2092 let fname = s:NetGetWord()
2093 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
2094" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002095
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002096 if w:netrw_longlist == 0
2097 " use one column listing
2098" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002099 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2100
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002101 elseif w:netrw_longlist == 1
2102 " use long list
2103" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002104 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002105
2106 else
2107 " give wide list
2108" call Decho("use wide list")
2109 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002110 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002111 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00002112
2113 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002114 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002115
2116 " refresh the listing
2117 if a:mode == 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002118 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002119 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002120 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002121 endif
2122
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002123 " keep cursor on the filename
2124 silent keepjumps $
2125 if fname =~ '/$'
2126 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2127 else
2128 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2129 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002130
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002131" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
2132endfun
2133
2134" ---------------------------------------------------------------------
2135" NetrwWideListing: {{{2
2136fun! s:NetrwWideListing()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002137" call Dfunc("NetrwWideListing() w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002138
2139 if w:netrw_longlist == 2
2140 " look for longest filename (cpf=characters per filename)
2141 " cpf: characters per file
2142 " fpl: files per line
2143 " fpc: files per column
2144 set ma
2145 let b:netrw_cpf= 0
2146 if line("$") >= w:netrw_bannercnt
2147 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2148 else
2149" call Dret("NetrwWideListing")
2150 return
2151 endif
2152" call Decho("max file strlen+1=".b:netrw_cpf)
2153 let b:netrw_cpf= b:netrw_cpf + 1
2154
2155 " determine qty files per line (fpl)
2156 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002157 if w:netrw_fpl <= 0
2158 let w:netrw_fpl= 1
2159 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002160" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
2161
2162 " make wide display
2163 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
2164 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
2165 let newcolstart = w:netrw_bannercnt + fpc
2166 let newcolend = newcolstart + fpc - 1
2167" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
2168 while line("$") >= newcolstart
2169 if newcolend > line("$") | let newcolend= line("$") | endif
2170 let newcolqty= newcolend - newcolstart
2171 exe newcolstart
2172 if newcolqty == 0
2173 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2174 else
2175 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2176 endif
2177 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002178 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002179 endwhile
2180 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002181 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002182 endif
2183
2184" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002185endfun
2186
2187" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002188" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002189" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2190" the same word even though the sorting has changed its order of appearance.
2191fun! s:NetSaveWordPosn()
2192" call Dfunc("NetSaveWordPosn()")
2193 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2194" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2195endfun
2196
2197" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002198" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002199fun! s:NetRestoreWordPosn()
2200" call Dfunc("NetRestoreWordPosn()")
2201 silent! call search(s:netrw_saveword,'w')
2202" call Dret("NetRestoreWordPosn")
2203endfun
2204
2205" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002206" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002207fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002208" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2209
2210 " get name of new directory from user. A bare <CR> will skip.
2211 " if its currently a directory, also request will be skipped, but with
2212 " a message.
2213 call inputsave()
2214 let newdirname= input("Please give directory name: ")
2215 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002216" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002217
2218 if newdirname == ""
2219" call Dret("NetMakeDir : user aborted with bare <cr>")
2220 return
2221 endif
2222
2223 if a:usrhost == ""
2224
2225 " Local mkdir:
2226 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002227 let fullnewdir= b:netrw_curdir.'/'.newdirname
2228" call Decho("fullnewdir<".fullnewdir.">")
2229 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002230 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002231 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002232 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002233 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002234" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2235 return
2236 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002237 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002238 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002239 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002240 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002241 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002242" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2243 return
2244 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002245
2246 " requested new local directory is neither a pre-existing file or
2247 " directory, so make it!
2248 if exists("*mkdir")
2249 call mkdir(fullnewdir,"p")
2250 else
2251 let netrw_origdir= s:NetGetcwd(1)
2252 exe 'cd '.b:netrw_curdir
2253" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2254" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2255 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002256 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002257 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002258
Bram Moolenaar8299df92004-07-10 09:47:34 +00002259 if v:shell_error == 0
2260 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002261" call Decho("refresh listing")
2262 let linenum= line(".")
2263 norm! H0
2264 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002265 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002266 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2267 exe "norm! ".hline."G0z\<CR>"
2268 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002269 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002270 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002271 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002272 endif
2273 redraw!
2274
2275 else
2276 " Remote mkdir:
2277 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002278 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002279" call Decho("exe silent! !".mkdircmd." ".newdirname)
2280 exe "silent! !".mkdircmd." ".newdirname
2281 if v:shell_error == 0
2282 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002283 let linenum= line(".")
2284 norm! H0
2285 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002286 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002287 exe "norm! ".hline."G0z\<CR>"
2288 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002289 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002290 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002291 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002292 endif
2293 redraw!
2294 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002295
Bram Moolenaar8299df92004-07-10 09:47:34 +00002296" call Dret("NetMakeDir")
2297endfun
2298
2299" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002300" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002301" 0: (user: <b>) bookmark current directory
2302" 1: (user: <B>) change to the bookmarked directory
2303" 2: (user: <q>) list bookmarks
2304" 3: (LocalBrowse) record current directory history
2305" 4: (user: <u>) go up (previous) bookmark
2306" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002307fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002308" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002309 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2310 " looks like a "b" was pressed while in the banner region
2311 if line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002312 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002313 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002314 if &ch > 1
2315 " "clear" the message
2316 echo ""
2317 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002318" call Dret("NetBookmarkDir - ignoring")
2319 return
2320 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002321
2322 if a:chg == 0
2323 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002324 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2325 if !exists("g:NETRW_BOOKMARKMAX")
2326 let g:NETRW_BOOKMARKMAX= v:count
2327 elseif v:count > g:NETRW_BOOKMARKMAX
2328 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002329 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002330 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002331
2332 elseif a:chg == 1
2333 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002334 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2335 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002336 else
2337 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2338 endif
2339
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002340 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002341 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002342 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002343" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2344 let cnt= 0
2345 while cnt <= g:NETRW_BOOKMARKMAX
2346 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2347" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2348 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2349 endif
2350 let cnt= cnt + 1
2351 endwhile
2352 endif
2353
2354 " list directory history
2355 let cnt = g:NETRW_DIRHIST_CNT
2356 let first = 1
2357 let histcnt = 0
2358 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2359" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2360 let histcnt= histcnt + 1
2361 if exists("g:NETRW_DIRHIST_{cnt}")
2362" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2363 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002364 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002365 let first = 0
2366 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2367 if cnt < 0
2368 let cnt= cnt + g:netrw_dirhistmax
2369 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002370 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002371
2372 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002373 " saves most recently visited directories (when they differ)
2374 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2375 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2376 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2377" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2378 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002379
2380 elseif a:chg == 4
2381 " u: change to the previous directory stored on the history list
2382 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2383 if g:NETRW_DIRHIST_CNT < 0
2384 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2385 endif
2386 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2387" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2388 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2389 else
2390 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2391 echo "Sorry, no predecessor directory exists yet"
2392 endif
2393
2394 elseif a:chg == 5
2395 " U: change to the subsequent directory stored on the history list
2396 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2397 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2398" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2399 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2400 else
2401 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2402 if g:NETRW_DIRHIST_CNT < 0
2403 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2404 endif
2405 echo "Sorry, no successor directory exists yet"
2406 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002407 endif
2408" call Dret("NetBookmarkDir")
2409endfun
2410
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002411" ---------------------------------------------------------------------
2412" NetObtain: obtain file under cursor (for remote browsing support) {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002413fun! netrw#NetObtain(...)
2414" call Dfunc("NetObtain() a:0=".a:0)
2415
2416 if a:0==0
2417 " no arguments -- use word under cursor
2418 let fname= expand("<cWORD>")
2419" call Decho("no arguments, use <".fname.">")
2420 elseif a:0 > 1
2421 " more than one argument, recurse with each argument separately
2422" call Decho("more than 1 argument, use recursion")
2423 let i=1
2424 while i <= a:0
2425 call netrw#NetObtain(a:{i})
2426 let i=i+1
2427 endwhile
2428 return
2429 else
2430 " one argument provided
2431 let fname = a:1
2432 let keep_netrw_choice = exists("b:netrw_choice")? b:netrw_choice : ""
2433 let keep_netrw_fname = exists("b:netrw_fname")? b:netrw_fname : ""
2434 let keep_netrw_wmethod = exists("w:netrw_method")? w:netrw_method : ""
2435 call s:NetMethod(fname)
2436 let w:netrw_method= b:netrw_method
2437 let fname = b:netrw_fname
2438" call Decho("g:netrw_scp_cmd<".g:netrw_scp_cmd.">")
2439" call Decho("g:netrw_machine<".g:netrw_machine.">")
2440" call Decho("fname<".fname.">")
2441 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002442
2443 " NetrwStatusLine support - for obtaining support
2444 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002445
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002446" call Decho("method=".w:netrw_method)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002447 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2448 if executable("ftp")
2449 let curdir = expand("%")
2450 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2451 let curline= line(".")
2452 let endline= line("$")+1
2453 set ma
2454 keepjumps $
2455
2456 ".........................................
2457 if w:netrw_method == 2
2458 " ftp + <.netrc>: Method #2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002459 setlocal ff=unix
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002460 if path != ""
2461 put ='cd '.path
2462" call Decho("ftp: cd ".path)
2463 endif
2464 put ='get '.fname
2465" call Decho("ftp: get ".fname)
2466 if exists("g:netrw_port") && g:netrw_port != ""
2467" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2468 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2469 else
2470" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2471 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2472 endif
2473
2474 ".........................................
2475 elseif w:netrw_method == 3
2476 " ftp + machine,id,passwd,filename: Method #3
2477 setlocal ff=unix
2478 if exists("g:netrw_port") && g:netrw_port != ""
2479 put ='open '.g:netrw_machine.' '.g:netrw_port
2480" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2481 else
2482 put ='open '.g:netrw_machine
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002483" call Decho('ftp: open '.g:netrw_machine)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002484 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002485
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002486 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2487 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002488 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002489" call Decho('ftp: g:netrw_uid')
2490" call Decho('ftp: g:netrw_passwd')
2491 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002492 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002493" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2494 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002495
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002496 if a:path != ""
2497 put ='cd '.a:path
2498" call Decho('cd '.a:path)
2499 endif
2500 exe "put ='".a:cmd."'"
2501" call Decho("ftp: ".a:cmd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002502
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002503 " perform ftp:
2504 " -i : turns off interactive prompting from ftp
2505 " -n unix : DON'T use <.netrc>, even though it exists
2506 " -n win32: quit being obnoxious about password
2507" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2508 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002509
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002510 ".........................................
2511 else
2512 echo "***warning*** unable to comply with your request<" . choice . ">"
2513 endif
2514 " restore
2515 exe "silent! ".endline.",$d"
2516 exe "keepjumps ".curline
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002517 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002518 else
2519 if !exists("g:netrw_quiet")
2520 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2521 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2522 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002523 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002524 let &stl = s:netrw_users_stl
2525 let &laststatus = s:netrw_users_ls
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002526 " restore NetMethod
2527 if exists("keep_netrw_method")
2528 call s:NetMethod(keep_netrw_choice)
2529 let w:netrw_method = keep_netrw_wmethod
2530 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002531" call Dret("NetObtain")
2532 return
2533 endif
2534
2535 ".........................................
2536 else
2537 " scp: Method#4
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002538 let curdir = expand("%")
2539 let path = substitute(curdir,'scp://[^/]\+/','','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002540" call Decho("path<".path.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002541 if exists("g:netrw_port") && g:netrw_port != ""
2542 let useport= " -P ".g:netrw_port
2543 else
2544 let useport= ""
2545 endif
2546 if g:netrw_cygwin == 1
2547 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002548" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2549 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002550 else
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 endif
2554 endif
2555
2556 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002557 let &stl = s:netrw_users_stl
2558 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002559 redraw!
2560
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002561 " restore NetMethod
2562 if exists("keep_netrw_method")
2563 call s:NetMethod(keep_netrw_choice)
2564 let w:netrw_method = keep_netrw_wmethod
2565 endif
2566
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002567" call Dret("NetObtain")
2568endfun
2569
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002570" ---------------------------------------------------------------------
2571" NetPrevWinOpen: opoen file/directory in previous window. {{{2
2572" If there's only one window, then the window will first be split.
2573fun! s:NetPrevWinOpen(islocal)
2574" call Dfunc("NetPrevWinOpen(islocal=".a:islocal.")")
2575
2576 " get last window number and the word currently under the cursor
2577 let lastwinnr = winnr("$")
2578 let curword = s:NetGetWord()
2579 let curdir = b:netrw_curdir
2580" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
2581
2582 let didsplit = 0
2583 if lastwinnr == 1
2584 " if only one window, open a new one first
2585" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
2586 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
2587 let didsplit = 1
2588
2589 else
2590 wincmd p
2591 " if the previous window's buffer has been changed (is modified),
2592 " and it doesn't appear in any other extant window, then ask the
2593 " user if s/he wants to abandon modifications therein.
2594 let bnr = winbufnr(0)
2595 let bnrcnt = 0
2596 if &mod
2597 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
2598" call Decho("bnr=".bnr." bnrcnt=".bnrcnt)
2599 if bnrcnt == 1
2600 let bufname= bufname(winbufnr(winnr()))
2601 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
2602
2603 if choice == 1
2604 " Yes -- write file & then browse
2605 let v:errmsg= ""
2606 silent w
2607 if v:errmsg != ""
2608 echohl Error | echo "***netrw*** "unable to write <".bufname.">!" | echohl None
2609 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2610 if didsplit
2611 q
2612 else
2613 wincmd p
2614 endif
2615" call Dret("NetPrevWinOpen : unable to write <".bufname.">")
2616 return
2617 endif
2618
2619 elseif choice == 2
2620 " No -- don't worry about changed file, just browse anyway
2621 set nomod
2622 echohl WarningMsg | echo "***netrw*** ".bufname." changes abandoned" | echohl None
2623
2624 else
2625 " Cancel -- don't do this
2626 if didsplit
2627 q
2628 else
2629 wincmd p
2630 endif
2631" call Dret("NetPrevWinOpen : cancelled")
2632 return
2633 endif
2634 endif
2635 endif
2636 endif
2637
2638 if a:islocal
2639 call s:LocalBrowse(s:LocalBrowseChgDir(curdir,curword))
2640 else
2641 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),curword))
2642 endif
2643" call Dret("NetPrevWinOpen")
2644endfun
2645
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002646" ---------------------------------------------------------------------
2647" NetMenu: generates the menu for gvim and netrw {{{2
2648fun! s:NetMenu()
2649
2650 if has("menu") && has("gui_running") && &go =~ 'm'
2651" call Dfunc("NetMenu()")
2652 if !exists("s:netrw_menu_enabled")
2653 let s:netrw_menu_enabled= 1
2654 if !exists("g:DrChipTopLvlMenu")
2655 let g:DrChipTopLvlMenu= "DrChip."
2656 endif
2657 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Help<tab>? ?'
2658 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Apply\ Special\ Viewer<tab>x x'
2659 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Bookmark\ Current\ Directory<tab>b Nb'
2660 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Go\ Up\ Directory<tab>- -'
2661 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Goto\ Bookmarked\ Directory<tab>B NB'
2662 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Recently\ Used\ Directory<tab>u u'
2663 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Subsequently\ Used\ Directory<tab>U U'
2664 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Delete\ File/Directory<tab>D D'
2665 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<c-h>"
2666 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory<tab><cr> '."\<cr>"
2667 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory,\ New\ Window<tab>o o'
2668 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory,\ New\ Vertical\ Window\ <tab>v v'
2669 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.List\ Bookmarks\ and\ History<tab>q q'
2670 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Listing\ Style\ (thin-long-wide)<tab>i i'
2671 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Make\ Subdirectory<tab>d d'
2672 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Normal-Hide-Show<tab>a a'
2673 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Obtain\ File<tab>O O'
2674 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Preview\ File/Directory<tab>p p'
2675 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Previous\ Window\ Browser<tab>P P'
2676 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
2677 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Rename\ File/Directory<tab>R R'
2678 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Reverse\ Sorting\ Order<tab>'."r r"
2679 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Select\ Sorting\ Style<tab>s s'
2680 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Sorting\ Sequence\ Edit<tab>S S'
2681 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Set\ Current\ Directory<tab>c c'
2682 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
2683 else
2684" call Decho("clear menus")
2685 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Help'
2686 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Apply\ Special\ Viewer'
2687 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Bookmark\ Current\ Directory'
2688 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Go\ Up\ Directory'
2689 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Goto\ Bookmarked\ Directory'
2690 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Recently\ Used\ Directory'
2691 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Subsequently\ Used\ Directory'
2692 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Delete\ File/Directory'
2693 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File\ Hiding\ List'
2694 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File'
2695 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Enter\ File/Directory'
2696 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Enter\ File/Directory\ (vertical\ split)'
2697 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.List\ Bookmarks\ and\ History'
2698 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Listing\ Style\ (thin-long-wide)'
2699 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Make\ Subdirectory'
2700 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Normal-Hide-Show'
2701 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Obtain\ File'
2702 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Preview\ File'
2703 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Previous\ Window\ Browser'
2704 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Refresh\ Listing'
2705 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Rename\ File/Directory'
2706 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Reverse\ Sorting\ Order'
2707 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Select\ Sorting\ Style'
2708 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Sorting\ Sequence\ Edit'
2709 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Set\ Current\ Directory'
2710 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Settings/Options'
2711 endif
2712" call Dret("NetMenu")
2713 endif
2714
2715endfun
2716
Bram Moolenaar83bab712005-08-01 21:58:57 +00002717" ==========================================
2718" Local Directory Browsing Support: {{{1
2719" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002720
2721" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002722" LocalBrowse: {{{2
2723fun! s:LocalBrowse(dirname)
2724 " unfortunate interaction -- debugging calls can't be used here;
2725 " the BufEnter event causes triggering when attempts to write to
2726 " the DBG buffer are made.
2727 if isdirectory(a:dirname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002728 silent! call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002729 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002730 " not a directory, ignore it
2731endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002732
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002733" ---------------------------------------------------------------------
2734" DirBrowse: supports local file/directory browsing {{{2
2735fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002736 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002737" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002738" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002739
Bram Moolenaar488c6512005-08-11 20:09:58 +00002740 if exists("s:netrw_skipbrowse")
2741 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002742" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002743 return
2744 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002745 if &fo =~ '[ta]'
2746 set fo-=t
2747 set fo-=a
2748 echohl Warning
2749 echo '***warning*** directory browsing and formatoptions "ta" are incompatible'
2750 echohl None
2751 endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002752
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002753 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002754
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002755 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002756 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002757 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002758 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002759 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002760 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002761" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002762 return
2763 endif
2764
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002765 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2766 call s:UseBufWinVars()
2767
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002768 " set up menus
2769 let b:netrw_browser_active= 1
2770 call s:NetMenu()
2771
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002772 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002773 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002774" call Decho("findbuf: bufnum=".bufnum)
2775 if bufnum > 0 && bufname(bufnum) != a:dirname
2776 let ibuf= 1
2777 let buflast= bufnr("$")
2778 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2779" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2780 let ibuf= ibuf + 1
2781 endwhile
2782 if ibuf > buflast
2783 let bufnum= -1
2784 else
2785 let bufnum= ibuf
2786 endif
2787" call Decho("findbuf: bufnum=".bufnum." (final)")
2788 endif
2789
2790 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002791 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002792 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002793" call Decho("enew buffer")
2794 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002795 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002796 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2797 if getline(2) =~ '^" Directory Listing '
2798 if !g:netrw_keepdir
2799" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002800 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002801 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002802 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002803" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002804 return
2805 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002806 endif
2807 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002808 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002809
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002810 " set up ShellCmdPost handling. Append current buffer to browselist
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00002811 call s:LocalFastBrowser()
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002812
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002813 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002814 if has("win32") || has("win95") || has("win64") || has("win16")
2815 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2816 else
2817 let b:netrw_curdir= a:dirname
2818 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002819 if b:netrw_curdir =~ '[/\\]$'
2820 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2821 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002822 if b:netrw_curdir == ''
2823 " under unix, when the root directory is encountered, the result
2824 " from the preceding substitute is an empty string.
2825 let b:netrw_curdir= '/'
2826 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002827" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002828
Bram Moolenaar83bab712005-08-01 21:58:57 +00002829 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002830 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002831" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002832 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002833 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002834 catch /^Vim\%((\a\+)\)\=:E472/
2835 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2836 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2837 if exists("w:netrw_prvdir")
2838 let b:netrw_curdir= w:netrw_prvdir
2839 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002840 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002841" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002842 return
2843 endif
2844 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002845 endif
2846
2847 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002848 " Hmm. When another vim is open to the same directory, I get
2849 " a "Press ENTER" ... ok, setting "noswf" avoids it.
2850" call Decho('exe silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002851 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002852
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002853 " make this buffer not-a-file, modifiable, not line-numbered, etc
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002854 setlocal bt=nofile nobl ma nonu noswf nowrap
2855 if g:netrw_fastbrowse >= 2
2856 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00002857 else
2858 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002859 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002860 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002861
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002862 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002863 " Perform Directory Listing:
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002864 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2865 echo "(netrw) Processing your browsing request..."
2866 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002867
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002868 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002869 call s:NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002870
Bram Moolenaar8299df92004-07-10 09:47:34 +00002871 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002872" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002873 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002874 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002875 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002876 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 +00002877 if w:netrw_longlist != 2
2878 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2879 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2880 endif
2881 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2882 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002883 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2884 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2885 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002886 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002887 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002888 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2889 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002890 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002891 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002892 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 +00002893 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>
2894 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002895 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2896 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002897 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002898 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002899 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002900 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2901 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002902 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002903 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002904 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002905 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002906 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002907 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002908 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00002909 nnoremap <buffer> <F1> :he netrw-dir<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002910
2911 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002912" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002913 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002914 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002915 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002916 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002917 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002918
2919 let sortby= g:netrw_sort_by
2920 if g:netrw_sort_direction =~ "^r"
2921 let sortby= sortby." reversed"
2922 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002923
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002924 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002925 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002926" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002927 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002928 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002929 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002930 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002931 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002932" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002933 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002934 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002935 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002936 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002937
2938 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002939 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002940 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002941 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002942 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002943 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002944 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002945 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002946 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002947 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 +00002948 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002949 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002950
2951 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002952 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2953" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002954
2955 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002956 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002957
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002958 " set up syntax highlighting
2959 if has("syntax")
2960 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002961 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002962 setlocal ft=
2963 endif
2964 endif
2965
Bram Moolenaar8299df92004-07-10 09:47:34 +00002966 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002967 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002968 if g:netrw_hide && g:netrw_list_hide != ""
2969 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002970 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002971 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002972
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002973 if g:netrw_sort_by =~ "^n"
2974 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002975
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002976 if w:netrw_bannercnt < line("$")
2977 if g:netrw_sort_direction =~ 'n'
2978 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2979 else
2980 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2981 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002982 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002983 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002984
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002985 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002986 if w:netrw_bannercnt < line("$")
2987 if g:netrw_sort_direction =~ 'n'
2988 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2989 else
2990 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2991 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002992 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002993 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002994 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002995
Bram Moolenaar8299df92004-07-10 09:47:34 +00002996 endif
2997 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002998
2999 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003000 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003001 " place cursor on the top-left corner of the file listing
3002 exe 'silent '.w:netrw_bannercnt
3003 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003004 endif
3005
3006 " record previous current directory
3007 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00003008
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003009 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003010 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003011 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003012 setlocal noma nomod nonu nobl nowrap
3013 if g:netrw_fastbrowse >= 2
3014 setlocal bh=hide
3015 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003016
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003017" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003018endfun
3019
3020" ---------------------------------------------------------------------
3021" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003022fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003023" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003024
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003025 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00003026 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
3027 let dirnamelen = strlen(b:netrw_curdir)
3028 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003029" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003030 if filelist != ""
3031 let filelist= filelist."\n"
3032 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003033 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003034" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
3035
3036 " if the directory name includes a "$", and possibly other characters,
3037 " the glob() doesn't include "." and ".." entries.
3038 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
3039" call Decho("forcibly tacking on .")
3040 if filelist == ""
3041 let filelist= dirname."."
3042 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003043 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003044 endif
3045" call Decho("filelist<".filelist.">")
3046 endif
3047 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
3048" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003049 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003050" call Decho("filelist<".filelist.">")
3051 endif
3052 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003053 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003054
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003055" call Decho("dirname<".dirname.">")
3056" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003057" call Decho("filelist<".filelist.">")
3058
3059 while filelist != ""
3060 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003061 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003062 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
3063 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003064 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00003065 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00003066 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003067 let pfile= filename
3068 if isdirectory(filename)
3069 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00003070 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003071 if pfile =~ '//$'
3072 let pfile= substitute(pfile,'//$','/','e')
3073 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003074 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00003075 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00003076" call Decho(" ")
3077" call Decho("filename<".filename.">")
3078" call Decho("pfile <".pfile.">")
3079
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003080 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003081 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003082 let fsz = strpart(" ",1,15-strlen(sz)).sz
3083 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00003084" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003085 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003086
Bram Moolenaar8299df92004-07-10 09:47:34 +00003087 if g:netrw_sort_by =~ "^t"
3088 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003089" call Decho("getftime(".filename.")=".getftime(filename))
3090 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003091 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00003092" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003093 let ftpfile= ft.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003094 keepjumps silent! put=ftpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003095
Bram Moolenaar8299df92004-07-10 09:47:34 +00003096 elseif g:netrw_sort_by =~ "^s"
3097 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003098" call Decho("getfsize(".filename.")=".getfsize(filename))
3099 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003100 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00003101" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003102 let fszpfile= fsz.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003103 keepjumps silent! put =fszpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003104
Bram Moolenaar8299df92004-07-10 09:47:34 +00003105 else
3106 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003107" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003108 keepjumps silent! put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00003109 endif
3110 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003111
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003112 " cleanup any windows mess at end-of-line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003113 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00003114 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00003115
3116" call Dret("LocalBrowseList")
3117endfun
3118
3119" ---------------------------------------------------------------------
3120" LocalBrowseChgDir: constructs a new directory based on the current {{{2
3121" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003122fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003123" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003124
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003125 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003126 let newdir = a:newdir
3127
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003128 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003129 " apparently vim is "recognizing" that it is in the home directory and
3130 " is removing the "/". Bad idea, so I have to put it back.
3131 let dirname= dirname.'/'
3132" call Decho("adjusting dirname<".dirname.">")
3133 endif
3134
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003135 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003136 " handling a file
3137 let dirname= dirname.newdir
3138" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003139 " this lets NetBrowseX avoid the edit
3140 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003141" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
3142" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003143 if g:netrw_browse_split == 1
3144 new
3145 wincmd _
3146 elseif g:netrw_browse_split == 2
3147 rightb vert new
3148 wincmd |
3149 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003150 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003151 call s:NetMenu()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003152 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003153 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003154
3155 elseif newdir == './'
3156 " refresh the directory list
3157" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003158
3159 elseif newdir == '../'
3160 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003161 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003162" call Decho("go up one dir: dirname<".dirname.">")
3163
3164 else
3165 " go down one directory
3166 let dirname= dirname.newdir
3167" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
3168 endif
3169
3170" call Dret("LocalBrowseChgDir <".dirname.">")
3171 return dirname
3172endfun
3173
3174" ---------------------------------------------------------------------
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003175" LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
3176" performed any shell command. The idea is to cause all local-browsing
3177" buffers to be refreshed after a user has executed some shell command,
3178" on the chance that s/he removed/created a file/directory with it.
3179fun! s:LocalBrowseShellCmdRefresh()
3180" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
3181 " go through all buffers,
3182 " including unlisted (which is why I can't use bufdo)
3183 let curwin = winnr()
3184 let ibl = 0
3185 for ibuf in s:netrw_browselist
3186 if bufwinnr(ibuf) == -1
3187" call Decho("wiping buf#".ibuf)
Bram Moolenaarc01140a2006-03-24 22:21:52 +00003188 exe "silent! bw ".ibuf
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003189 call remove(s:netrw_browselist,ibl)
3190" call Decho("browselist=".string(s:netrw_browselist))
3191 continue
3192 else
3193" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
3194 exe bufwinnr(ibuf)."wincmd w"
3195 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
3196 endif
3197 let ibl= ibl + 1
3198 endfor
3199 exe curwin."wincmd w"
3200
3201" call Dret("LocalBrowseShellCmdRefresh")
3202endfun
3203
3204" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00003205" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003206fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003207" call Dfunc("LocalBrowseRm(path<".a:path.">)")
3208" call Decho("firstline=".a:firstline." lastline=".a:lastline)
3209
3210 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003211 let ctr = a:firstline
3212 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003213 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00003214
3215 " remove multiple files and directories
3216 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003217 exe "keepjumps ".ctr
3218
3219 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003220 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003221 let ctr= ctr + 1
3222 continue
3223 endif
3224 let curword= s:NetGetWord()
3225 if curword == "./" || curword == "../"
3226 let ctr= ctr + 1
3227 continue
3228 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003229
3230 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00003231 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003232" call Decho("rmfile<".rmfile.">")
3233
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003234 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003235 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003236 if !all
3237 echohl Statement
3238 call inputsave()
3239 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3240 call inputrestore()
3241 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003242 if ok == ""
3243 let ok="no"
3244 endif
3245" call Decho("response: ok<".ok.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003246 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003247" call Decho("response: ok<".ok."> (after sub)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003248 if ok =~ 'a\%[ll]'
3249 let all= 1
3250 endif
3251 endif
3252
3253 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003254 let ret= delete(rmfile)
3255" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003256 elseif ok =~ 'q\%[uit]'
3257 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003258 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003259
Bram Moolenaar8299df92004-07-10 09:47:34 +00003260 else
3261 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003262 if !all
3263 echohl Statement
3264 call inputsave()
3265 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3266 call inputrestore()
3267 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003268 if ok == ""
3269 let ok="no"
3270 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003271 if ok =~ 'a\%[ll]'
3272 let all= 1
3273 endif
3274 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003275 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003276
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003277 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003278" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
3279 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003280" call Decho("v:shell_error=".v:shell_error)
3281
3282 if v:shell_error != 0
3283" call Decho("2nd attempt to remove directory<".rmfile.">")
3284 let errcode= delete(rmfile)
3285" call Decho("errcode=".errcode)
3286
3287 if errcode != 0
3288 if has("unix")
3289" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003290call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003291 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003292 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003293 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003294endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003295 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003296 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003297 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00003298 endif
3299 endif
3300 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003301
3302 elseif ok =~ 'q\%[uit]'
3303 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003304 endif
3305 endif
3306
3307 let ctr= ctr + 1
3308 endwhile
3309
3310 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003311 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003312" call Decho("refresh the directory")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003313 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003314 exe curline
3315
3316" call Dret("LocalBrowseRm")
3317endfun
3318
3319" ---------------------------------------------------------------------
3320" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003321fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003322" call Dfunc("LocalBrowseRename(path<".a:path.">)")
3323
3324 " preparation for removing multiple files/directories
3325 let ctr= a:firstline
3326
3327 " attempt to rename files/directories
3328 while ctr <= a:lastline
3329 exe "keepjumps ".ctr
3330
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003331 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003332 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003333 let ctr= ctr + 1
3334 continue
3335 endif
3336 let curword= s:NetGetWord()
3337 if curword == "./" || curword == "../"
3338 let ctr= ctr + 1
3339 continue
3340 endif
3341
Bram Moolenaar8299df92004-07-10 09:47:34 +00003342 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00003343 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003344" call Decho("oldname<".oldname.">")
3345
3346 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003347 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00003348 call inputrestore()
3349
Bram Moolenaar83bab712005-08-01 21:58:57 +00003350 let ret= rename(oldname,newname)
3351" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003352
3353 let ctr= ctr + 1
3354 endwhile
3355
3356 " refresh the directory
3357 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00003358" call Decho("refresh the directory listing")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003359 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003360 exe "keepjumps ".curline
3361" call Dret("LocalBrowseRename")
3362endfun
3363
3364" ---------------------------------------------------------------------
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003365" LocalFastBrowser: handles setting up/taking down fast browsing for the {{{2
3366" local browser
3367fun! s:LocalFastBrowser()
3368" call Dfunc("LocalFastBrowser()")
3369
3370 " initialize browselist, a list of buffer numbers that the local browser has used
3371 if !exists("s:netrw_browselist")
3372 let s:netrw_browselist= []
3373 endif
3374
3375 " append current buffer to fastbrowse list
3376 if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
3377 call add(s:netrw_browselist,bufnr("%"))
3378" call Decho("browselist=".string(s:netrw_browselist))
3379 endif
3380
3381 " enable autocmd events to handle refreshing/removing local browser buffers
3382 " If local browse buffer is currently showing: refresh it
3383 " If local browse buffer is currently hidden : wipe it
3384 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
3385" call Decho("setting up local-browser shell command refresh")
3386 let s:netrw_browser_shellcmd= 1
3387 augroup AuNetrwShellCmd
3388 au!
3389 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
3390 augroup END
3391
3392 " user must have changed fastbrowse to its fast setting, so remove
3393 " the associated autocmd events
3394 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
3395 unlet s:netrw_browser_shellcmd
3396 augroup AuNetrwShellCmd
3397 au!
3398 augroup END
3399 augroup! AuNetrwShellCmd
3400 endif
3401
3402" call Dret("LocalFastBrowser")
3403endfun
3404
3405" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003406" LocalObtain: copy selected file to current working directory {{{2
3407fun! s:LocalObtain()
3408" call Dfunc("LocalObtain()")
3409 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
3410 let fname= expand("<cWORD>")
3411 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
3412 call writefile(fcopy,getcwd()."/".fname,"b")
3413 elseif !exists("b:netrw_curdir")
3414 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
3415 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3416 else
3417 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
3418 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3419 endif
3420" call Dret("LocalObtain")
3421endfun
3422
3423" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003424" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003425fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003426" call Dfunc("LocalPreview(path<".a:path.">)")
3427 if has("quickfix")
3428 if !isdirectory(a:path)
3429 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003430 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003431 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003432 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003433 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003434 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003435 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003436 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003437 endif
3438" call Dret("LocalPreview")
3439endfun
3440
3441" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003442" Explore: launch the local browser in the directory of the current file {{{2
3443" dosplit==0: the window will be split iff the current file has
3444" been modified
3445" dosplit==1: the window will be split before running the local
3446" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003447fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003448" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003449
3450 " if dosplit or file has been modified
3451 if a:dosplit || &modified
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003452 call s:SaveWinVars()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003453
Bram Moolenaar83bab712005-08-01 21:58:57 +00003454 if a:style == 0 " Explore, Sexplore
3455 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003456" call Decho("style=0: Explore or Sexplore")
3457
Bram Moolenaar83bab712005-08-01 21:58:57 +00003458 elseif a:style == 1 "Explore!, Sexplore!
3459 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003460" call Decho("style=1: Explore! or Sexplore!")
3461
Bram Moolenaar83bab712005-08-01 21:58:57 +00003462 elseif a:style == 2 " Hexplore
3463 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003464" call Decho("style=2: Hexplore")
3465
Bram Moolenaar83bab712005-08-01 21:58:57 +00003466 elseif a:style == 3 " Hexplore!
3467 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003468" call Decho("style=3: Hexplore!")
3469
Bram Moolenaar83bab712005-08-01 21:58:57 +00003470 elseif a:style == 4 " Vexplore
3471 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003472" call Decho("style=4: Vexplore")
3473
Bram Moolenaar83bab712005-08-01 21:58:57 +00003474 elseif a:style == 5 " Vexplore!
3475 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003476" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003477 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003478 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003479 endif
3480 norm! 0
3481
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003482 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003483 " Explore Hexplore Vexplore Sexplore
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003484" call Decho("Explore Hexplore Vexplore Sexplore")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003485 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3486 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3487" call Decho("calling NetBrowse(newdir<".newdir.">)")
3488 call s:NetBrowse(newdir)
3489 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003490 if newdir == ""|let newdir= getcwd()|endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003491" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3492 call s:LocalBrowse(newdir)
3493 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003494
Bram Moolenaar572cb562005-08-05 21:35:02 +00003495 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003496 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003497" call Decho("Nexplore Pexplore -or- Explore **/...")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003498
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003499 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003500 if !exists("w:netrw_explore_indx")
3501 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003502 endif
3503 let indx = a:indx
3504 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003505 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003506 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003507 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003508 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003509 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003510 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003511 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003512 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003513 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3514 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3515 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003516 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3517 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3518" call Dret("Explore")
3519 return
3520 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003521 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003522
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003523 " NetrwStatusLine support - for exploring support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003524 let w:netrw_explore_indx= indx
Bram Moolenaar488c6512005-08-11 20:09:58 +00003525" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003526
3527 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003528 if indx >= w:netrw_explore_listlen || indx < 0
3529 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003530 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003531 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3532" call Dret("Explore")
3533 return
3534 endif
3535
Bram Moolenaar488c6512005-08-11 20:09:58 +00003536 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003537" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003538 let newdir= substitute(dirfile,'/[^/]*$','','e')
3539" call Decho("newdir<".newdir.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003540
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003541" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3542 call s:LocalBrowse(newdir)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003543 if w:netrw_longlist == 0 || w:netrw_longlist == 1
3544 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3545 else
3546 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3547 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003548 let w:netrw_explore_mtchcnt = indx + 1
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003549 let w:netrw_explore_bufnr = bufnr("%")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003550 let w:netrw_explore_line = line(".")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003551 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar488c6512005-08-11 20:09:58 +00003552" 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 +00003553
3554 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003555 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003556 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 +00003557 endif
3558 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3559 endif
3560
Bram Moolenaar83bab712005-08-01 21:58:57 +00003561 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003562" call Decho("Explore newdir<".a:1.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003563 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003564 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003565 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003566
3567" call Dret("Explore")
3568endfun
3569
3570" ---------------------------------------------------------------------
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003571" SetupNetrwStatusLine: {{{2
3572fun! s:SetupNetrwStatusLine(statline)
3573" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
3574
3575 if !exists("s:netrw_setup_statline")
3576 let s:netrw_setup_statline= 1
3577" call Decho("do first-time status line setup")
3578
3579 if !exists("s:netrw_users_stl")
3580 let s:netrw_users_stl= &stl
3581 endif
3582 if !exists("s:netrw_users_ls")
3583 let s:netrw_users_ls= &laststatus
3584 endif
3585
3586 " set up User9 highlighting as needed
3587 let keepa= @a
3588 redir @a
3589 try
3590 hi User9
3591 catch /^Vim\%((\a\+)\)\=:E411/
3592 if &bg == "dark"
3593 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
3594 else
3595 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
3596 endif
3597 endtry
3598 redir END
3599 let @a= keepa
3600 endif
3601
3602 " set up status line (may use User9 highlighting)
3603 " insure that windows have a statusline
3604 " make sure statusline is displayed
3605 let &stl=a:statline
3606 set laststatus=2
3607" call Decho("stl=".&stl)
3608 redraw!
3609
3610" call Dret("SetupNetrwStatusLine : stl=".&stl)
3611endfun
3612
3613" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003614" NetrwStatusLine: {{{2
3615fun! NetrwStatusLine()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003616
3617 " vvv NetrwStatusLine() debugging vvv
3618" let g:stlmsg=""
3619" if !exists("w:netrw_explore_bufnr")
3620" let g:stlmsg="!X<explore_bufnr>"
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003621" elseif w:netrw_explore_bufnr != bufnr("%")
3622" let g:stlmsg="explore_bufnr!=".bufnr("%")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003623" endif
3624" if !exists("w:netrw_explore_line")
3625" let g:stlmsg=" !X<explore_line>"
3626" elseif w:netrw_explore_line != line(".")
3627" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
3628" endif
3629" if !exists("w:netrw_explore_list")
3630" let g:stlmsg=" !X<explore_list>"
3631" endif
3632 " ^^^ NetrwStatusLine() debugging ^^^
3633
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003634 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 +00003635 " restore user's status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003636 let &stl = s:netrw_users_stl
3637 let &laststatus = s:netrw_users_ls
Bram Moolenaar488c6512005-08-11 20:09:58 +00003638 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3639 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003640 return ""
3641 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003642 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003643 endif
3644endfun
3645
3646" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003647" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003648" Change backslashes to forward slashes, if any.
3649" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003650fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003651" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3652 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003653 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003654 let curdir= curdir.'/'
3655 endif
3656 if a:doesc
3657 let curdir= escape(curdir,s:netrw_cd_escape)
3658 endif
3659" call Dret("NetGetcwd <".curdir.">")
3660 return curdir
3661endfun
3662
3663" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003664" NetMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003665" method == 1: rcp
3666" 2: ftp + <.netrc>
3667" 3: ftp + machine, id, password, and [path]filename
3668" 4: scp
3669" 5: http (wget)
3670" 6: cadaver
3671" 7: rsync
3672" 8: fetch
3673" 9: sftp
3674fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003675" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003676
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003677 " initialization
3678 let b:netrw_method = 0
3679 let g:netrw_machine = ""
3680 let b:netrw_fname = ""
3681 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003682 let g:netrw_choice = a:choice
3683
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003684 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003685 " mipf : a:machine a:id password filename Use ftp
3686 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003687 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003688 " rcpurm : rcp://[user@]host/filename Use rcp
3689 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003690 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003691 " httpurm : http://[user@]host/filename Use wget
3692 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003693 " rsyncurm : rsync://host[:port]/path Use rsync
3694 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3695 " sftpurm : sftp://[user@]host/filename Use scp
3696 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3697 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3698 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003699 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003700 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003701 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003702 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003703 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003704 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3705 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3706 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003707
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003708" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003709 " Determine Method
3710 " rcp://user@hostname/...path-to-file
3711 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003712" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003713 let b:netrw_method = 1
3714 let userid = substitute(a:choice,rcpurm,'\1',"")
3715 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3716 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003717 if userid != ""
3718 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003719 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003720
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003721 " scp://user@hostname/...path-to-file
3722 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003723" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003724 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003725 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3726 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3727 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003728
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003729 " http://user@hostname/...path-to-file
3730 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003731" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003732 let b:netrw_method = 5
3733 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3734 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003735
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003736 " dav://hostname[:port]/..path-to-file..
3737 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003738" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003739 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003740 if a:choice =~ '^s'
3741 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3742 else
3743 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3744 endif
3745 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003746
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003747 " rsync://user@hostname/...path-to-file
3748 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003749" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003750 let b:netrw_method = 7
3751 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3752 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003753
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003754 " ftp://[user@]hostname[[:#]port]/...path-to-file
3755 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003756" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003757 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003758 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3759 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3760 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003761 if userid != ""
3762 let g:netrw_uid= userid
3763 endif
3764 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3765 let b:netrw_method = 3
3766 else
3767 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3768 let b:netrw_method= 2
3769 else
3770 if !exists("g:netrw_uid") || g:netrw_uid == ""
3771 call NetUserPass()
3772 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3773 call NetUserPass(g:netrw_uid)
3774 " else just use current g:netrw_uid and g:netrw_passwd
3775 endif
3776 let b:netrw_method= 3
3777 endif
3778 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003779
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003780 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003781" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003782 let b:netrw_method = 8
3783 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3784 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3785 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3786 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003787
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003788 " Issue an ftp : "machine id password [path/]filename"
3789 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003790" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003791 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003792 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3793 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3794 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3795 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003796
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003797 " Issue an ftp: "hostname [path/]filename"
3798 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003799" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003800 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3801 let b:netrw_method = 3
3802 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3803 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003804
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003805 elseif filereadable(expand("$HOME/.netrc"))
3806 let b:netrw_method = 2
3807 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3808 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3809 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003810
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003811 " sftp://user@hostname/...path-to-file
3812 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003813" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003814 let b:netrw_method = 9
3815 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3816 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003817
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003818 " Issue an rcp: hostname:filename" (this one should be last)
3819 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003820" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003821 let b:netrw_method = 1
3822 let userid = substitute(a:choice,rcphf,'\2',"")
3823 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3824 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003825" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3826" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3827" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3828" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003829 if userid != ""
3830 let g:netrw_uid= userid
3831 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003832 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003833 " don't let PCs try <.netrc>
3834 let b:netrw_method = 3
3835 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003836
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003837 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003838 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003839 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003840 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003841 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003842 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003843 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003844
3845 " remove any leading [:#] from port number
3846 if g:netrw_port != ""
3847 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3848 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003849
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003850" call Decho("a:choice <".a:choice.">")
3851" call Decho("b:netrw_method <".b:netrw_method.">")
3852" call Decho("g:netrw_machine<".g:netrw_machine.">")
3853" call Decho("g:netrw_port <".g:netrw_port.">")
3854" if exists("g:netrw_uid") "Decho
3855" call Decho("g:netrw_uid <".g:netrw_uid.">")
3856" endif "Decho
3857" if exists("g:netrw_passwd") "Decho
3858" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3859" endif "Decho
3860" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003861" call Dret("NetMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00003862endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003863
3864" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003865" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003866" Usage: :call NetUserPass() -- will prompt for userid and password
3867" :call NetUserPass("uid") -- will prompt for password
3868" :call NetUserPass("uid","password") -- sets global userid and password
3869fun! NetUserPass(...)
3870
3871 " get/set userid
3872 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003873" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003874 if !exists("g:netrw_uid") || g:netrw_uid == ""
3875 " via prompt
3876 let g:netrw_uid= input('Enter username: ')
3877 endif
3878 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003879" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003880 let g:netrw_uid= a:1
3881 endif
3882
3883 " get password
3884 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003885" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003886 let g:netrw_passwd= inputsecret("Enter Password: ")
3887 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003888" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003889 let g:netrw_passwd=a:2
3890 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003891
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003892" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003893endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003894
3895" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003896" NetOptionSave: save options and set to "standard" form {{{2
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003897fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003898" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003899 if !exists("w:netoptionsave")
3900 let w:netoptionsave= 1
3901 else
3902" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3903 return
3904 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003905
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003906 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003907 let w:aikeep = &ai
Bram Moolenaarc01140a2006-03-24 22:21:52 +00003908" " netrw and the acd option do not work together properly
3909" if &acd && (has("netbeans_intg") || has("sun_workshop"))
3910" set noacd
3911" echohl Warning | echomsg "***warning*** directory browsing and the acd setting are incompatible" |echohl None
3912" endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003913 let w:fokeep = &fo
3914 let w:aikeep = &ai
3915 let w:cikeep = &ci
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003916 let w:cinkeep = &cin
3917 let w:cinokeep = &cino
3918 let w:comkeep = &com
3919 let w:cpokeep = &cpo
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003920 let w:hidkeep = &hidden
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003921 let w:magickeep = &magic
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003922 if !g:netrw_keepdir
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003923 let w:dirkeep = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003924 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003925 let w:gdkeep = &gd
3926 let w:repkeep = &report
3927 let w:spellkeep = &spell
3928 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003929 setlocal cino =
3930 setlocal com =
3931 setlocal cpo -=aA
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003932 setlocal nocin noai noci magic nospell fo=nroql2 nohid
Bram Moolenaar8299df92004-07-10 09:47:34 +00003933 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003934 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003935 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003936 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003937 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003938" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003939 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003940
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003941" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003942endfun
3943
3944" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003945" NetOptionRestore: restore options {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00003946fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003947" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003948 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003949" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003950 return
3951 endif
3952 unlet w:netoptionsave
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003953
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003954 if exists("w:aikeep")| let &ai= w:aikeep|endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003955 if exists("w:aikeep") |let &ai = w:aikeep |unlet w:aikeep |endif
3956 if exists("w:cikeep") |let &ci = w:cikeep |unlet w:cikeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003957 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3958 if exists("w:cinokeep") |let &cino = w:cinokeep |unlet w:cinokeep |endif
3959 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3960 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3961 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003962 if exists("w:fokeep") |let &fo = w:fokeep |unlet w:fokeep |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003963 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003964 if exists("w:hidkeep") |let &hidden = w:hidkeep |unlet w:hidkeep |endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003965 if exists("w:magic") |let &magic = w:magic |unlet w:magic |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003966 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3967 if exists("w:spellkeep")|let &spell = w:spellkeep |unlet w:spellkeep|endif
3968 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003969 if exists("w:swfkeep")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003970 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003971 " user hasn't specified a swapfile directory;
3972 " netrw will temporarily make the swapfile
3973 " directory the current local one.
3974 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003975 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003976 set directory=
3977 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003978 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003979 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003980 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003981 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003982
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003983" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003984endfun
3985
3986" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003987" NetReadFixup: this sort of function is typically written by the user {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003988" to handle extra junk that their system's ftp dumps
3989" into the transfer. This function is provided as an
3990" example and as a fix for a Windows 95 problem: in my
3991" experience, win95's ftp always dumped four blank lines
3992" at the end of the transfer.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003993if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003994 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003995" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003996 if method == 3 " ftp (no <.netrc>)
3997 let fourblanklines= line2 - 3
3998 silent fourblanklines.",".line2."g/^\s*/d"
3999 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004000" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00004001 endfun
4002endif
4003
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004004" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004005" NetSort: Piet Delport's BISort2() function, modified to take a range {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004006if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004007 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00004008" " call Dfunc("NetSort()")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004009
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004010 let i = a:firstline + 1
4011 while i <= a:lastline
4012 " find insertion point via binary search
4013 let i_val = getline(i)
4014 let lo = a:firstline
4015 let hi = i
4016 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00004017 let mid = (lo + hi) / 2
4018 let mid_val = getline(mid)
4019 if g:netrw_sort_direction =~ '^n'
4020 " normal sorting order
4021 if i_val < mid_val
4022 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004023 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00004024 let lo = mid + 1
4025 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004026 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00004027 else
4028 " reverse sorting order
4029 if i_val > mid_val
4030 let hi = mid
4031 else
4032 let lo = mid + 1
4033 if i_val == mid_val | break | endif
4034 endif
4035 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004036 endwhile
4037 " do insert
4038 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00004039 exe 'keepjumps '.i.'d_'
4040 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004041 endif
4042 let i = i + 1
4043 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00004044
Bram Moolenaar83bab712005-08-01 21:58:57 +00004045" " call Dret("NetSort")
4046 endfun
4047endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004048
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004049" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004050" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00004051" What this function does is to compute a priority for the patterns
4052" in the g:netrw_sort_sequence. It applies a substitute to any
4053" "files" that satisfy each pattern, putting the priority / in
4054" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004055fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00004056" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004057 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00004058 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
4059 else
4060 let seqlist = g:netrw_sort_sequence
4061 endif
4062 " sanity check -- insure that * appears somewhere
4063 if seqlist == ""
4064 let seqlist= '*'
4065 elseif seqlist !~ '\*'
4066 let seqlist= seqlist.',*'
4067 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004068 let priority = 1
4069 while seqlist != ""
4070 if seqlist =~ ','
4071 let seq = substitute(seqlist,',.*$','','e')
4072 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
4073 else
4074 let seq = seqlist
4075 let seqlist = ""
4076 endif
4077 let eseq= escape(seq,'/')
4078 if priority < 10
4079 let spriority= "00".priority.'\/'
4080 elseif priority < 100
4081 let spriority= "0".priority.'\/'
4082 else
4083 let spriority= priority.'\/'
4084 endif
4085" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
4086
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004087 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00004088 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004089 " apparently no files were left after a Hiding pattern was used
4090" call Dret("SetSort : no files left after hiding")
4091 return
4092 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004093 if seq == '*'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004094 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004095 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004096 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004097 endif
4098 let priority = priority + 1
4099 endwhile
4100
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004101 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004102
4103" call Dret("SetSort")
4104endfun
4105
Bram Moolenaar488c6512005-08-11 20:09:58 +00004106" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004107" SaveWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004108fun! s:SaveWinVars()
4109" call Dfunc("SaveWinVars()")
4110 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
4111 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
4112 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
4113 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
4114 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
4115 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4116 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
4117 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004118 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00004119" call Dret("SaveWinVars")
4120endfun
4121
4122" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004123" CopyWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004124fun! s:CopyWinVars()
4125" call Dfunc("CopyWinVars()")
4126 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
4127 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
4128 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
4129 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
4130 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
4131 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
4132 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
4133 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 +00004134 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 +00004135" call Dret("CopyWinVars")
4136endfun
4137
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004138" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004139" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004140" To allow separate windows to have their own activities, such as
4141" Explore **/pattern, several variables have been made window-oriented.
4142" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004143" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004144" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004145fun! s:SetBufWinVars()
4146" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004147 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004148 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
4149 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
4150 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
4151 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
4152 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
4153 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4154 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
4155 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
4156 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004157" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004158endfun
4159
4160" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004161" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004162" Matching function to BufferWinVars()
4163fun! s:UseBufWinVars()
4164" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004165 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004166 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
4167 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
4168 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
4169 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
4170 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
4171 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
4172 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
4173 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
4174 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
4175" call Dret("UseBufWinVars")
4176endfun
4177
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004178" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004179" RFC2396: converts %xx into characters {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004180fun! netrw#RFC2396(fname)
4181" call Dfunc("RFC2396(fname<".a:fname.">)")
4182 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
4183" call Dret("RFC2396 ".fname)
4184 return fname
4185endfun
4186
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004187" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004188" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004189let &cpo= s:keepcpo
4190unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004191
Bram Moolenaar071d4272004-06-13 20:20:40 +00004192" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00004193" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00004194" vim:ts=8 fdm=marker