blob: 7f4bd64e4d695145cfc6f484d1b9929662d194d3 [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 Moolenaar8dff8182006-04-06 20:18:50 +00003" Date: Apr 06, 2006
4" Version: 86
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 Moolenaar8dff8182006-04-06 20:18:50 +000026let g:loaded_netrw = "v86"
Bram Moolenaar578b49e2005-09-10 19:22:57 +000027if v:version < 700
28 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
29 finish
30endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000031let s:keepcpo= &cpo
32set cpo&vim
33" call Decho("doing autoload/netrw.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +000034
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000035" ======================
36" Netrw Variables: {{{1
37" ======================
38
Bram Moolenaar071d4272004-06-13 20:20:40 +000039" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000040" Default values for netrw's global protocol variables {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +000041if !exists("g:netrw_dav_cmd")
42 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar071d4272004-06-13 20:20:40 +000043endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000044if !exists("g:netrw_fetch_cmd")
45 if executable("fetch")
46 let g:netrw_fetch_cmd = "fetch -o"
47 else
48 let g:netrw_fetch_cmd = ""
49 endif
50endif
51if !exists("g:netrw_ftp_cmd")
52 let g:netrw_ftp_cmd = "ftp"
53endif
54if !exists("g:netrw_http_cmd")
55 if executable("wget")
56 let g:netrw_http_cmd = "wget -q -O"
57 elseif executable("fetch")
58 let g:netrw_http_cmd = "fetch -o"
59 else
60 let g:netrw_http_cmd = ""
61 endif
62endif
63if !exists("g:netrw_rcp_cmd")
64 let g:netrw_rcp_cmd = "rcp"
65endif
66if !exists("g:netrw_rsync_cmd")
67 let g:netrw_rsync_cmd = "rsync"
68endif
69if !exists("g:netrw_scp_cmd")
70 let g:netrw_scp_cmd = "scp -q"
71endif
72if !exists("g:netrw_sftp_cmd")
73 let g:netrw_sftp_cmd = "sftp"
74endif
75if !exists("g:netrw_ssh_cmd")
76 let g:netrw_ssh_cmd= "ssh"
77endif
78
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +000079if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +000080 \ && exists("g:netrw_use_nt_rcp")
81 \ && g:netrw_use_nt_rcp
82 \ && executable( $SystemRoot .'/system32/rcp.exe')
83 let s:netrw_has_nt_rcp = 1
84 let s:netrw_rcpmode = '-b'
85 else
86 let s:netrw_has_nt_rcp = 0
87 let s:netrw_rcpmode = ''
88endif
89
90" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000091" Default values for netrw's global variables {{{2
92" Default values - a-c ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +000093if !exists("g:netrw_alto")
94 let g:netrw_alto= 0
95endif
96if !exists("g:netrw_altv")
97 let g:netrw_altv= 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000098endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000099if !exists("g:netrw_browse_split")
100 let g:netrw_browse_split= 0
101endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000103 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000104 if &shell == "bash"
105 let g:netrw_cygwin= 1
106 else
107 let g:netrw_cygwin= 0
108 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109 else
110 let g:netrw_cygwin= 0
111 endif
112endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000113" Default values - d-f ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000114if !exists("g:NETRW_DIRHIST_CNT")
115 let g:NETRW_DIRHIST_CNT= 0
116endif
117if !exists("g:netrw_dirhistmax")
118 let g:netrw_dirhistmax= 10
119endif
120if !exists("g:netrw_ftp_browse_reject")
121 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$'
Bram Moolenaar843ee412004-06-30 16:16:41 +0000122endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000123if !exists("g:netrw_ftp_list_cmd")
124 if has("unix") || exists("g:netrw_cygwin")
125 let g:netrw_ftp_list_cmd= "ls -lF"
126 else
127 let g:netrw_ftp_list_cmd= "dir"
128 endif
129endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000130if !exists("g:netrw_ftpmode")
131 let g:netrw_ftpmode= "binary"
Bram Moolenaar61036992005-10-12 20:54:52 +0000132endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000133" Default values - h-lh ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000134if !exists("g:netrw_hide")
135 let g:netrw_hide= 1
Bram Moolenaar61036992005-10-12 20:54:52 +0000136endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000137if !exists("g:netrw_keepdir")
138 let g:netrw_keepdir= 1
139endif
140if !exists("g:netrw_list_cmd")
141 if executable(g:netrw_ssh_cmd)
142 " provide a default listing command
143 let g:netrw_list_cmd= g:netrw_ssh_cmd." HOSTNAME ls -FLa"
144 else
145" call Decho(g:netrw_ssh_cmd." is not executable, can't do remote directory exploring)
146 let g:netrw_list_cmd= ""
147 endif
148endif
149if !exists("g:netrw_list_hide")
150 let g:netrw_list_hide= ""
151endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000152" Default values - lh-lz ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000153if !exists("g:netrw_local_mkdir")
154 let g:netrw_local_mkdir= "mkdir"
155endif
156if !exists("g:netrw_local_rmdir")
157 let g:netrw_local_rmdir= "rmdir"
158endif
159if !exists("g:netrw_longlist")
160 let g:netrw_longlist= 0
161endif
162if g:netrw_longlist < 0 || g:netrw_longlist > 2
163 " sanity check
164 let g:netrw_longlist= 0
165endif
166if g:netrw_longlist == 1
167 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
168endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000169" Default values - m-r ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000170if !exists("g:netrw_maxfilenamelen")
171 let g:netrw_maxfilenamelen= 32
172endif
173if !exists("g:netrw_mkdir_cmd")
174 let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." HOSTNAME mkdir"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000175endif
176if !exists("g:netrw_rename_cmd")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000177 let g:netrw_rename_cmd= g:netrw_ssh_cmd." HOSTNAME mv"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000178endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000179if !exists("g:netrw_rm_cmd")
180 let g:netrw_rm_cmd = g:netrw_ssh_cmd." HOSTNAME rm"
181endif
182if !exists("g:netrw_rmdir_cmd")
183 let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." HOSTNAME rmdir"
184endif
185if !exists("g:netrw_rmf_cmd")
186 let g:netrw_rmf_cmd = g:netrw_ssh_cmd." HOSTNAME rm -f"
187endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000188" Default values - s ---------- {{{3
Bram Moolenaar843ee412004-06-30 16:16:41 +0000189if exists("g:netrw_silent") && g:netrw_silent != 0
190 let g:netrw_silentxfer= "silent "
191else
192 let g:netrw_silentxfer= ""
193endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000194if !exists("g:netrw_fastbrowse")
195 let g:netrw_fastbrowse= 1
196endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000197if !exists("g:netrw_sort_by")
198 " alternatives: date size
199 let g:netrw_sort_by= "name"
200endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000201if !exists("g:netrw_sort_direction")
202 " alternative: reverse (z y x ...)
203 let g:netrw_sort_direction= "normal"
204endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000205if !exists("g:netrw_sort_sequence")
206 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000207endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000208if !exists("g:netrw_ssh_browse_reject")
209 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
210endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000211" Default values - t-w ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000212if !exists("g:netrw_timefmt")
213 let g:netrw_timefmt= "%c"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000214endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000215if !exists("g:netrw_win95ftp")
216 let g:netrw_win95ftp= 1
217endif
218if !exists("g:netrw_winsize")
219 let g:netrw_winsize= ""
220endif
221" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000222" Default values for netrw's script variables: {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000223if !exists("s:netrw_cd_escape")
224 if has("win32") || has("win95") || has("win64") || has("win16")
225 let s:netrw_cd_escape="#% "
226 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000227 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000228 endif
229endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000230if !exists("g:netrw_fname_escape")
231 let g:netrw_fname_escape= ' ?&;'
232endif
233if !exists("g:netrw_tmpfile_escape")
234 let g:netrw_tmpfile_escape= ' ?&;'
235endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000236if !exists("s:netrw_glob_escape")
237 if has("win32") || has("win95") || has("win64") || has("win16")
238 let s:netrw_glob_escape= ""
239 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000240 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000241 endif
242endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000243
244" BufEnter event ignored by decho when following variable is true
245" Has a side effect that doau BufReadPost doesn't work, so
246" files read by network transfer aren't appropriately highlighted.
247"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000249" ==============================
250" Netrw Utility Functions: {{{1
251" ==============================
252
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000254" NetSavePosn: saves position of cursor on screen {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000255fun! netrw#NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000256" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000258 let w:netrw_winnr= winnr()
259 let w:netrw_line = line(".")
260 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
262 " Save top-of-screen line
263 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000264 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000266 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000267" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268endfun
269
270" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000271" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000272fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000273" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +0000274 let eikeep= &ei
275 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276
Bram Moolenaar81695252004-12-29 20:58:21 +0000277 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000278" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
279 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000280" if v:shell_error == 0
281" " as suggested by Bram M: redraw on no error
282" " allows protocol error messages to remain visible
283" redraw!
284" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000285
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000287" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
288 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000289
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000291" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
292 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293
Bram Moolenaar572cb562005-08-05 21:35:02 +0000294 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000295" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296endfun
297
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000298" ===============================
299" Netrw Transfer Functions: {{{1
300" ===============================
301
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000303" NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000304fun! netrw#NetRead(mode,...)
305" call Dfunc("NetRead(mode=".a:mode.",...) a:0=".a:0)
306
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000307 " save options
308 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000309
310 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000312 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000313 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000314 elseif a:mode == 2 " replace with remote file
315 let readcmd = "%r"
316 else
317 exe a:mode
318 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000319 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000320 let ichoice = (a:0 == 0)? 0 : 1
321" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
322
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000323 " get name of a temporary file and set up shell-quoting character {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000324 let tmpfile= tempname()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000325 let tmpfile= escape(substitute(tmpfile,'\','/','ge'),g:netrw_tmpfile_escape)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000326 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000327 echohl Error | echo "***netrw*** your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!" | echohl None
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000328 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
329" call Dret("NetRead")
330 return
331 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000332" call Decho("tmpfile<".tmpfile.">")
333
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000334 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000335
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000336 " attempt to repeat with previous host-file-etc
337 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000338" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000339 let choice = b:netrw_lastfile
340 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000341
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000342 else
343 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000344" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000345
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000346 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000347 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000348 echomsg 'NetRead Usage:'
349 echomsg ':Nread machine:path uses rcp'
350 echomsg ':Nread "machine path" uses ftp with <.netrc>'
351 echomsg ':Nread "machine id password path" uses ftp'
352 echomsg ':Nread dav://machine[:port]/path uses cadaver'
353 echomsg ':Nread fetch://machine/path uses fetch'
354 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
355 echomsg ':Nread http://[user@]machine/path uses http wget'
356 echomsg ':Nread rcp://[user@]machine/path uses rcp'
357 echomsg ':Nread rsync://machine[:port]/path uses rsync'
358 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
359 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000360 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000361
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000362 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000363 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000364" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000365 if match(choice,"\"$") != -1
366 " case "..."
367 let choice=strpart(choice,1,strlen(choice)-2)
368 else
369 " case "... ... ..."
370 let choice = strpart(choice,1,strlen(choice)-1)
371 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000372
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000373 while match(choice,"\"$") == -1
374 let wholechoice = wholechoice . " " . choice
375 let ichoice = ichoice + 1
376 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000377 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000378 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000379 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000380 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000381" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000382 return
383 endif
384 let choice= a:{ichoice}
385 endwhile
386 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
387 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388 endif
389 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000391" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000393
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000394 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000395 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000396 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000397" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 exe 'lcd ' . fnamemodify(tmpfile,':h')
400 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000401 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000402
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000403 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000404 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000405
Bram Moolenaar843ee412004-06-30 16:16:41 +0000406 " Check if NetBrowse() should be handling this request
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000407" call Decho("checking if NetBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000408 if choice =~ "^.*[\/]$"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000409" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000410 keepjumps call s:NetBrowse(choice)
411" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000414
415 " use filename's suffix for the temporary file
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000416 if b:netrw_fname =~ '\.[^./]\+$'
417 let suffix = substitute(b:netrw_fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000418 let tmpfile= substitute(tmpfile,"$",suffix,'e')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000419" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000420 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000421
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000422 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000423 " Perform Protocol-Based Read {{{3
424 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000425 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
426 echo "(netrw) Processing your read request..."
427 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000428
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000429 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000430 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000431 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000432" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 " ER: noting done with g:netrw_uid yet?
434 " ER: on Win2K" rcp machine[.user]:file tmpfile
435 " ER: if machine contains '.' adding .user is required (use $USERNAME)
436 " ER: the tmpfile is full path: rcp sees C:\... as host C
437 if s:netrw_has_nt_rcp == 1
438 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
439 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
440 else
441 " Any way needed it machine contains a '.'
442 let uid_machine = g:netrw_machine .'.'. $USERNAME
443 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000445 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
446 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
447 else
448 let uid_machine = g:netrw_machine
449 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000451" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
452 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000453 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
454 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000455
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000456 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000457 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000459" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000460 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000461 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000462 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000463 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000464" call Decho("filter input: ".getline("."))
465 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
466" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000467 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000468" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000469 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
470 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000471" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000472 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
473 endif
474 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000475 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000476 let debugkeep= &debug
477 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000478 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000479 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000480 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000481 endif
482 bd!
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000483 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000484 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000485
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000486 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000487 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000488 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
489 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000490" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000491 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000492 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000493 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000494 if exists("g:netrw_port") && g:netrw_port != ""
495 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000496" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000497 else
498 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000499" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000500 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000501
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000502 if exists("g:netrw_ftp") && g:netrw_ftp == 1
503 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000504" call Decho("filter input: ".getline("."))
505 put ='\"'.g:netrw_passwd.'\"'
506" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000507 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000508 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
509" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000510 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000511
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000512 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
513 put =g:netrw_ftpmode
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000514" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000515 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000516 put ='get \"'.netrw_fname.'\" '.tmpfile
517" call Decho("filter input: ".getline("."))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000518
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000519 " perform ftp:
520 " -i : turns off interactive prompting from ftp
521 " -n unix : DON'T use <.netrc>, even though it exists
522 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000523 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000524" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000525 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
526 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
527 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000528" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000529 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000530 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000531 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000532 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000533 endif
534 bd!
535 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
536 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000537
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000538 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000539 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000540 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000541" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000542 if exists("g:netrw_port") && g:netrw_port != ""
543 let useport= " -P ".g:netrw_port
544 else
545 let useport= ""
546 endif
547 if g:netrw_cygwin == 1
548 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000549" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".cygtmpfile)
550 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000551 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000552" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile)
553 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000554 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000555 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000556 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000557
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000559 " http: NetRead Method #5 (wget) {{{3
560 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000561" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000562 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000563 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000564 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000565 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000566 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000567" call Dret("NetRead")
568 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000569 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000570
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 if match(b:netrw_fname,"#") == -1
572 " simple wget
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000573 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
574" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname)
575 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000576 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000577
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000578 else
579 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000580 let netrw_html= substitute(netrw_fname,"#.*$","","")
581 let netrw_tag = substitute(netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000582" call Decho("netrw_html<".netrw_html.">")
583" call Decho("netrw_tag <".netrw_tag.">")
584" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000585 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
586 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000587" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
589 endif
590 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000591
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000592 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000593 " cadaver: NetRead Method #6 {{{3
594 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000595" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000596
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000597 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000598 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000599 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000600 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000601 if exists("g:netrw_port") && g:netrw_port != ""
602 put ='open '.g:netrw_machine.' '.g:netrw_port
603 else
604 put ='open '.g:netrw_machine
605 endif
606 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000607
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000608 if g:netrw_cygwin == 1
609 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
610 put ='get '.netrw_fname.' '.cygtmpfile
611 else
612 put ='get '.netrw_fname.' '.tmpfile
613 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000614 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000615
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000616 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000617 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000618" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000619 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
620 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000621 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000622 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000623
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000624 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000625 " rsync: NetRead Method #7 {{{3
626 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000627" call Decho("read via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000628 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629 if g:netrw_cygwin == 1
630 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000631" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
632 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000633 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000634" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
635 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000636 endif
637 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
638 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000639
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000640 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000641 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000643 elseif b:netrw_method == 8
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000644 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000646 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000647 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000648 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000649 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000650" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000651 endif
652 if exists("g:netrw_option") && g:netrw_option == ":http"
653 let netrw_option= "http"
654 else
655 let netrw_option= "ftp"
656 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000657" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000658
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000660" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
661 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000662 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000663" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname)
664 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000665 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000666
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000667 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
668 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000669
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000670 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000671 " sftp: NetRead Method #9 {{{3
672 elseif b:netrw_method == 9
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000673" call Decho("read via sftp (method #4)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000674 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000675 if g:netrw_cygwin == 1
676 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000677" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
678" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile)
679 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".cygtmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000680 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000681" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
682 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000683 endif
684 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
685 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000686
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000687 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000688 " Complain {{{3
689 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 echo "***warning*** unable to comply with your request<" . choice . ">"
691 endif
692 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000693
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000694 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000695" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000696 if exists("b:netrw_method")
697 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 unlet b:netrw_fname
699 endif
700 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000701
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000702" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000703endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000704
705" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000706" NetGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000707" readcmd == %r : replace buffer with newly read file
708" == 0r : read file at top of buffer
709" == r : read file after current line
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000710fun! s:NetGetFile(readcmd, tfile, method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000711" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000712
713 " get name of remote filename (ie. url and all)
714 let rfile= bufname("%")
715" call Decho("rfile<".rfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000716
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000717 if exists("*NetReadFixup")
718 " for the use of NetReadFixup (not otherwise used internally)
719 let line2= line("$")
720 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000721
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000722 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000724 if g:netrw_cygwin
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000725 let tfile= a:tfile
726" call Decho("(win32 && cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000728 let tfile= substitute(a:tfile,'/','\\\\','ge')
729" call Decho("(win32 && !cygwin) tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730 endif
731 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000732 let tfile= a:tfile
733" call Decho("tfile=a:tfile<".tfile.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000734 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000735
736 if a:readcmd[0] == '%'
Bram Moolenaar81695252004-12-29 20:58:21 +0000737 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000738
Bram Moolenaar83bab712005-08-01 21:58:57 +0000739" call Dredir("ls!","starting buffer list")
740
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000741 " rename the current buffer to the temp file (ie. tfile)
742 keepalt exe "file ".tfile
743" call Dredir("ls!","after renaming current buffer to <".tfile.">")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000744
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000745 " edit temporary file (ie. read the temporary file in)
746 if rfile =~ '\.zip$'
747 call zip#Browse(tfile)
748 elseif rfile =~ '\.tar$'
749 call tar#Browse(tfile)
750 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000751" call Decho("edit temporary file")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000752 e
753 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000754
Bram Moolenaar81695252004-12-29 20:58:21 +0000755 " rename buffer back to remote filename
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000756 keepalt exe "file ".escape(rfile,' ')
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000757 filetype detect
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000758" call Dredir("ls!","renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000759 let line1 = 1
760 let line2 = line("$")
761
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000762 elseif filereadable(tfile)
Bram Moolenaar81695252004-12-29 20:58:21 +0000763 " read file after current line
764 let curline = line(".")
765 let lastline= line("$")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000766" call Decho("exe<".a:readcmd." ".v:cmdarg." ".tfile."> line#".curline)
767 exe a:readcmd." ".v:cmdarg." ".tfile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000768 let line1= curline + 1
769 let line2= line("$") - lastline + 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000770
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000771 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000772 " not readable
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000773 echohl WarningMsg | echo "***netrw*** file <".tfile."> not readable"| echohl None
774 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
775" call Dret("NetGetFile : tfile<".tfile."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000776 return
777 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000778
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000779 " User-provided (ie. optional) fix-it-up command
780 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000781" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000783" else " Decho
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000784" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000786
787 " update the Buffers menu
788 if has("gui") && has("gui_running")
789 silent! emenu Buffers.Refresh\ menu
790 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000791
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000792" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".filereadable(a:tfile))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000793
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000794 " make sure file is being displayed
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000796" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000797endfun
798
799" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000800" NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000801fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000802" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000803
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 " option handling
805 let mod= 0
806 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000807
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000808 " Get Temporary Filename {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000809 let tmpfile= escape(tempname(),g:netrw_tmpfile_escape)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000810 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
811 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
812 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000813" call Dret("NetWrite")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000814 return
815 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000816
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000817 if a:0 == 0
818 let ichoice = 0
819 else
820 let ichoice = 1
821 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000822
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000823 if &binary
824 " for binary writes, write entire file. Line numbers don't really make sense.
825 " Supports the writing of tar and zip files.
826" call Decho("silent exe w! ".v:cmdarg." ".tmpfile)
827 silent exe "w! ".v:cmdarg." ".tmpfile
828 else
829 " write (selected portion of) file to temporary
830" call Decho("silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile)
831 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
832 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000833
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000835
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000836 " Process arguments: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000837 " attempt to repeat with previous host-file-etc
838 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000839" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000840 let choice = b:netrw_lastfile
841 let ichoice= ichoice + 1
842 else
843 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000844
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000845 " Reconstruct Choice if choice starts with '"'
846 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000847 echomsg 'NetWrite Usage:"'
848 echomsg ':Nwrite machine:path uses rcp'
849 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
850 echomsg ':Nwrite "machine id password path" uses ftp'
851 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
852 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
853 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
854 echomsg ':Nwrite rcp://machine/path uses rcp'
855 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
856 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
857 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000858 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000859
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 elseif match(choice,"^\"") != -1
861 if match(choice,"\"$") != -1
862 " case "..."
863 let choice=strpart(choice,1,strlen(choice)-2)
864 else
865 " case "... ... ..."
866 let choice = strpart(choice,1,strlen(choice)-1)
867 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000868
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 while match(choice,"\"$") == -1
870 let wholechoice= wholechoice . " " . choice
871 let ichoice = ichoice + 1
872 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000873 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000874 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000875 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000876 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000877" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000878 return
879 endif
880 let choice= a:{ichoice}
881 endwhile
882 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
883 endif
884 endif
885 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000886" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000887 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000888
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000889 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000890 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000891 let choice= substitute(choice,'\\','/','ge')
892 "ER: see NetRead()
893 exe 'lcd ' . fnamemodify(tmpfile,':h')
894 let tmpfile = fnamemodify(tmpfile,':t')
895 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000896
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000897 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000899
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 " =============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000901 " Perform Protocol-Based Write {{{3
902 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000903 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
904 echo "(netrw) Processing your write request..."
905 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000906
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000907 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000908 " rcp: NetWrite Method #1 {{{3
909 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000910" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000911 if s:netrw_has_nt_rcp == 1
912 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
913 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
914 else
915 let uid_machine = g:netrw_machine .'.'. $USERNAME
916 endif
917 else
918 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
919 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
920 else
921 let uid_machine = g:netrw_machine
922 endif
923 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000924 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
925" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname)
926 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000928
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000929 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000930 " ftp + <.netrc>: NetWrite Method #2 {{{3
931 elseif b:netrw_method == 2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000932 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000933 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000934 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000935 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000936" call Decho(" filter input: ".getline("."))
937 exe "put ='"."put ".tmpfile.' \"'.netrw_fname.'\"'."'"
938" call Decho(" filter input: ".getline("."))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000939 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000940" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000941 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000942 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000943" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000944 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000945 endif
946 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
947 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000948 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000949 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000950 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000951 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000952 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953 endif
954 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000955 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000956
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000958 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{3
959 elseif b:netrw_method == 3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000960 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000962 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000963 if exists("g:netrw_port") && g:netrw_port != ""
964 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000965" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966 else
967 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000968" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969 endif
970 if exists("g:netrw_ftp") && g:netrw_ftp == 1
971 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000972" call Decho("filter input: ".getline("."))
973 put ='\"'.g:netrw_passwd.'\"'
974" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000975 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000976 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
977" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000979 put ='put '.tmpfile.' \"'.netrw_fname.'\"'
980" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000981 " save choice/id/password for future use
982 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000984 " perform ftp:
985 " -i : turns off interactive prompting from ftp
986 " -n unix : DON'T use <.netrc>, even though it exists
987 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000988 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000989" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000990 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
991 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
992 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000993 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000994 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000995 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000996 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000997 let mod=1
998 endif
999 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001002 " scp: NetWrite Method #4 {{{3
1003 elseif b:netrw_method == 4
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001004 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001005 if exists("g:netrw_port") && g:netrw_port != ""
1006 let useport= " -P ".g:netrw_port
1007 else
1008 let useport= ""
1009 endif
1010 if g:netrw_cygwin == 1
1011 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001012" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'")
1013 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001015" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'")
1016 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." '".g:netrw_machine.":".netrw_fname."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 endif
1018 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001019
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001020 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001021 " http: NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001023 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001024 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001025 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001026 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001027
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001028 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001029 " dav: NetWrite Method #6 (cadaver) {{{3
1030 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001031" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001032
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001033 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001034 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001035 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001036 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001037 if exists("g:netrw_port") && g:netrw_port != ""
1038 put ='open '.g:netrw_machine.' '.g:netrw_port
1039 else
1040 put ='open '.g:netrw_machine
1041 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001042 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001043
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001044 if g:netrw_cygwin == 1
1045 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
1046 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001047 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001048 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001049 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001050
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001051 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001052 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001053" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001054 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
1055 bd!
1056 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001057
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001059 " rsync: NetWrite Method #7 {{{3
1060 elseif b:netrw_method == 7
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001061 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001062 if g:netrw_cygwin == 1
1063 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001064" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname)
1065 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001066 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001067" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
1068 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001069 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001070 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001071
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001072 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001073 " sftp: NetWrite Method #9 {{{3
1074 elseif b:netrw_method == 9
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001075 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001076 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1077 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1078 else
1079 let uid_machine = g:netrw_machine
1080 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001081 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001082 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001083 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001084 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001085" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001086 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1087 bd!
1088 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001089
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001090 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001091 " Complain {{{3
1092 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001093 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001094 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001095 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001096
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001097 " cleanup {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001098" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001099 let result=delete(tmpfile)
1100 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001101
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001102 if a:firstline == 1 && a:lastline == line("$")
1103 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001104 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001105
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001106" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001107endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001108
Bram Moolenaar83bab712005-08-01 21:58:57 +00001109" ===========================================
1110" Remote Directory Browsing Support: {{{1
1111" ===========================================
1112
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001113" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001114" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001115" of the contents of a remote directory. It is assumed that the
1116" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1117" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001118fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001119 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1120" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001121
Bram Moolenaar488c6512005-08-11 20:09:58 +00001122 if exists("s:netrw_skipbrowse")
1123 unlet s:netrw_skipbrowse
1124" call Dret("NetBrowse")
1125 return
1126 endif
1127
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001128 call s:NetOptionSave()
1129
Bram Moolenaar843ee412004-06-30 16:16:41 +00001130 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001131 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1132" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001133 if !executable("ftp")
1134 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001135 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001136 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001137 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001138 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001139" call Dret("NetBrowse")
1140 return
1141 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001142 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001143 if !exists("g:netrw_quiet")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001144 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ".g:netrw_list_cmd | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001145 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001146 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001147
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001148 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001149" call Dret("NetBrowse")
1150 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001151 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001152
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001153 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1154 call s:UseBufWinVars()
1155
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001156 " set up menus
1157 let b:netrw_browser_active= 1
1158 call s:NetMenu()
1159
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001161 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162
1163 " analyze a:dirname and g:netrw_list_cmd
1164 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001165 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001166" call Decho("dirname<".dirname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001167 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001168 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001169 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001170 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001171 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001172 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001173" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001174 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001175 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001176
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001177 let method = substitute(dirname,dirpat,'\1','')
1178 let user = substitute(dirname,dirpat,'\2','')
1179 let machine = substitute(dirname,dirpat,'\3','')
1180 let path = substitute(dirname,dirpat,'\4','')
1181 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001182" call Decho("set up method <".method .">")
1183" call Decho("set up user <".user .">")
1184" call Decho("set up machine<".machine.">")
1185" call Decho("set up path <".path .">")
1186" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001187
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001188 if method == "ftp" || method == "http"
1189 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001190 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001191 else
1192 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1193 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001194
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001195 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001196" call Decho("setting w:netrw_method<".b:netrw_method.">")
1197 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001199
Bram Moolenaar8299df92004-07-10 09:47:34 +00001200 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001201 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001202 echohl WarningMsg | echo "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001203 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001204 else
1205 if g:netrw_sort_by =~ "^t"
1206 let listcmd= listcmd."t"
1207 elseif g:netrw_sort_by =~ "^s"
1208 let listcmd= listcmd."S"
1209 endif
1210 " optionally sort in reverse
1211 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1212 let listcmd= listcmd."r"
1213 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001214 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001215
1216" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001217 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001218" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001219 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001220 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001221 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001222" call Dret("NetBrowse : symlink")
1223 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001224
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001225 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001226 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001227" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001228
1229 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001230 " "this is a directory" indicator (/). There shouldn't be one of those,
1231 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001232 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001233" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001234
1235 " remote-read the requested file into current buffer
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001236 keepjumps keepalt enew!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001237 set ma
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001238" call Decho("exe file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001239 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001240 exe "silent doau BufReadPre ".fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001241 silent call netrw#NetRead(2,method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001242 exe "silent doau BufReadPost ".fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001243
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001244 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001245 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001246 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001247 setlocal nomod nowrap
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001248
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249" call Dret("NetBrowse : file<".fname.">")
1250 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001251 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001252
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001253 " ---------------------------------------------------------------------
1254 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001255" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001256 " set up new buffer and map
1257 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001258 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001259" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001260 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001261 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001262" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001263 exe "b ".bufnamenr
1264 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001265 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001266" call Dret("NetBrowse")
1267 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001268 endif
1269 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001270" call Decho("generate a new buffer")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001271 keepjumps keepalt enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001272 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001273
1274 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001275 setlocal bt=nofile bh=wipe nobl noswf
1276 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001277" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001278 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001279" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001280 setlocal bt=nofile nobl nonu noswf
1281 if g:netrw_fastbrowse >= 1
1282 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001283 else
1284 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001285 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001286
1287 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001288 call s:NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001289
1290 " set up buffer-local mappings
1291" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001292 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001293 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'),0)<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001294 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001295 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001296 if w:netrw_longlist != 2
1297 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1298 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1299 endif
1300 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1301 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001302 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1303 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001304 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001305 nnoremap <buffer> <silent> O :call netrw#NetObtain()<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001306 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001307 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1308 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1309 nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
1310 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001311 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1312 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001313 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001314 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001315 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001316 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001317 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001318 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001319 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001320 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001321 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001322 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00001323 nnoremap <buffer> <F1> :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001324 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001325
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001326 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001327" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1328 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001329 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001330 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001331 let w:netrw_bannercnt = 7
1332 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001333 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001334 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001335 endif
1336
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001337 if g:netrw_sort_by =~ "^n"
1338 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001339 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001340 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001341 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1342 else
1343 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001344 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001345 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001346 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001347" call Decho("g:netrw_hide=".g:netrw_hide)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001348 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001349 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001350 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001351 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001352 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001353 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001354 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001355 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001356 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001357
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001358 " remote read the requested directory listing
1359 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1360 " Note that not all ftp servers honor the options for ls
1361 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001362 " use ftp to get remote file listing
1363" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001364 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001365 keepjumps 1d
1366
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001367 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001368 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001369" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001370 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001371
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001372 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001373 if g:netrw_ftp_browse_reject != ""
1374 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1375 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001376 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001377
1378 " if there's no ../ listed, then put ./ and ../ in
1379 let line1= line(".")
1380 keepjumps 1
1381 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1382 let line2= line(".")
1383 if line2 == 0
1384 keepjumps put='../'
1385 keepjumps put='./'
1386 endif
1387 exe "keepjumps ".line1
1388 keepjumps norm! 0
1389
1390 " more cleanup
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001391 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1392 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1393 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001394 endif
1395
1396 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001397 " use ssh to get remote file listing
1398" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001399 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001400" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001401 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1402 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001403 " cleanup
1404 if g:netrw_ftp_browse_reject != ""
1405 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001406 endif
1407 endif
1408
1409 " set up syntax highlighting
1410 if has("syntax")
1411 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001412 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001413 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001414 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1415 " sometimes the laststatus highlight bleeds into the entire display.
1416 " Only seems to happen with remote browsing. Weird.
1417 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001418 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001419 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001420
1421 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001422 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001423 if g:netrw_hide && g:netrw_list_hide != ""
1424 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001425 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001426
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001427 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001428 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001429" call Decho("manipulate long listing")
1430
1431 if method == "ftp"
1432 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001433 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001434 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001435 keepjumps d
1436 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001437 " if there's no ../ listed, then put ./ and ../ in
1438 let line1= line(".")
1439 keepjumps 1
1440 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1441 let line2= line(".")
1442 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001443 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1444 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001445 endif
1446 exe "keepjumps ".line1
1447 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001448 endif
1449
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001450 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1451 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1452 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001453 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001454
Bram Moolenaar488c6512005-08-11 20:09:58 +00001455 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001456 if g:netrw_sort_by =~ "^n"
1457 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001458 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001459 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001460 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001461 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001462 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001463 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001464 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001465 if w:netrw_longlist == 1
1466 " shorten the list to keep its width <= winwidth characters
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001467 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001468 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001469 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001470 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001471
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001472 call s:NetrwWideListing()
1473 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001474 " place cursor on the top-left corner of the file listing
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001475 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001476 norm! 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001477 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001478
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001479 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001480 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001481
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001482" call Dret("NetBrowse")
1483 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001484endfun
1485
1486" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001487" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001488fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001489" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001490
1491 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001492 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001493
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001494 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001495 " handling a file
1496 let dirname= dirname.newdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001497 if g:netrw_browse_split == 1
1498 new
1499 wincmd _
1500 elseif g:netrw_browse_split == 2
1501 rightb vert new
1502 wincmd |
1503 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001504 call s:NetMenu()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001505" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001506
1507 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001508 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001509" call Decho("refresh directory listing")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001510 setlocal ma nobl
1511 if g:netrw_fastbrowse >= 1
1512 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001513 else
1514 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001515 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001516 %d
1517
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001518 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001519 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001520 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001521
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001522 if trailer =~ '^\%(\.\./\)*$'
1523 " tack on a ../"
1524 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001525
1526 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001527 " strip off a directory name from dirname
1528 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001529 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001530" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001531
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001532 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001533 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001534 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001535" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001536 endif
1537
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001538" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001539 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001540endfun
1541
Bram Moolenaar843ee412004-06-30 16:16:41 +00001542" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001543" NetGetWord: it gets the directory named under the cursor {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001544fun! s:NetGetWord()
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001545" call Dfunc("NetGetWord() line#".line(".")." longlist=".g:netrw_longlist." virtcol=".virtcol("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001546 call s:UseBufWinVars()
1547
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001548 " insure that w:netrw_longlist is set up
1549 if !exists("w:netrw_longlist")
1550 if exists("g:netrw_longlist")
1551 let w:netrw_longlist= g:netrw_longlist
1552 else
1553 let w:netrw_longlist= 0
1554 endif
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001555" call Decho("w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001556 endif
1557
Bram Moolenaar488c6512005-08-11 20:09:58 +00001558 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001559 " Active Banner support
1560" call Decho("active banner handling")
1561 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001562 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001563 let curline= getline(".")
1564 if curline =~ '"\s*Sorted by\s'
1565 norm s
1566 let s:netrw_skipbrowse= 1
1567 echo 'Pressing "s" also works'
1568 elseif curline =~ '"\s*Sort sequence:'
1569 let s:netrw_skipbrowse= 1
1570 echo 'Press "S" to edit sorting sequence'
1571 elseif curline =~ '"\s*Quick Help:'
1572 norm ?
1573 let s:netrw_skipbrowse= 1
1574 echo 'Pressing "?" also works'
1575 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1576 norm a
1577 let s:netrw_skipbrowse= 1
1578 echo 'Pressing "a" also works'
1579 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001580 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001581 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001582
1583 elseif w:netrw_longlist == 0
1584" call Decho("thin column handling")
1585 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001586 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001587
1588 elseif w:netrw_longlist == 1
1589" call Decho("long column handling")
1590 norm! 0
1591 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1592
1593 else
1594" call Decho("obtain word from wide listing")
1595 let dirname= getline(".")
1596
1597 if !exists("b:netrw_cpf")
1598 let b:netrw_cpf= 0
1599 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1600" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001601 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001602
1603 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001604" 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 +00001605" call Decho("1: dirname<".dirname.">")
1606 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1607" call Decho("2: dirname<".dirname.">")
1608 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1609" call Decho("3: dirname<".dirname.">")
1610 let dirname = substitute(dirname,'\s\+$','','e')
1611" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001612 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001613
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001614" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001615 return dirname
1616endfun
1617
1618" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001619" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001620fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarc01140a2006-03-24 22:21:52 +00001621" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001622" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001623
1624 " preparation for removing multiple files/directories
1625 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001626 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001627
1628 " remove multiple files and directories
1629 while ctr <= a:lastline
1630 exe ctr
1631
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001632 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001633" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001634
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001635 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001636 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001637 if !all
1638 echohl Statement
1639 call inputsave()
1640 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1641 call inputrestore()
1642 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001643 if ok == ""
1644 let ok="no"
1645 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001646 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1647 if ok =~ 'a\%[ll]'
1648 let all= 1
1649 endif
1650 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001651
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001652 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001653 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001654 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001655 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001656 else
1657 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1658" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1659 let ret= system(netrw_rm_cmd)
1660" call Decho("returned=".ret." errcode=".v:shell_error)
1661 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001662 elseif ok =~ 'q\%[uit]'
1663 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001664 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001665
Bram Moolenaar843ee412004-06-30 16:16:41 +00001666 else
1667 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001668 if !all
1669 call inputsave()
1670 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1671 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001672 if ok == ""
1673 let ok="no"
1674 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001675 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1676 if ok =~ 'a\%[ll]'
1677 let all= 1
1678 endif
1679 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001680
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001681 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001682 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001683 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001684 else
1685 let rmfile = a:path.rmfile
1686 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1687" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1688 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001689" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001690
1691 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001692 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001693" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1694 let ret= system(netrw_rmf_cmd)
1695" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001696
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001697 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001698 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001699 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001700 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001701 endif
1702 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001703
1704 elseif ok =~ 'q\%[uit]'
1705 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001706 endif
1707 endif
1708
1709 let ctr= ctr + 1
1710 endwhile
1711
1712 " refresh the directory
1713 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001714" call Decho("refresh the directory")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001715 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001716 exe curline
1717
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001718" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001719endfun
1720
1721" ---------------------------------------------------------------------
1722" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001723fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001724" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001725
1726 " preparation for removing multiple files/directories
1727 let ctr = a:firstline
1728 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1729
1730 " attempt to rename files/directories
1731 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001732 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001733
1734 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001735 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001736" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001737
1738 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001739 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001740 call inputrestore()
1741
Bram Moolenaar488c6512005-08-11 20:09:58 +00001742 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001743 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001744 else
1745 let oldname= a:path.oldname
1746 let newname= a:path.newname
1747" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1748 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1749 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001750
1751 let ctr= ctr + 1
1752 endwhile
1753
1754 " refresh the directory
1755 let curline= line(".")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001756 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001757 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001758" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001759endfun
1760
1761" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001762" NetRefresh: {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001763fun! s:NetRefresh(dirname,islocal)
1764" call Dfunc("NetRefresh(dirname<".a:dirname.">,islocal=".a:islocal.")")
1765 call netrw#NetSavePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001766 set ma
1767 %d
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001768 if a:islocal
1769 call s:LocalBrowse(a:dirname)
1770 else
1771 call s:NetBrowse(a:dirname)
1772 endif
1773 call netrw#NetRestorePosn()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001774 redraw!
1775" call Dret("NetRefresh")
1776endfun
1777
1778" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001779" NetSplit: mode {{{2
1780" =0 : net and o
1781" =1 : net and v
1782" =2 : local and o
1783" =3 : local and v
1784fun! s:NetSplit(mode)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001785" call Dfunc("NetSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001786
1787 call s:SaveWinVars()
1788 if a:mode == 0
1789 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1790 call s:CopyWinVars()
1791 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001792 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001793 elseif a:mode ==1
1794 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1795 call s:CopyWinVars()
1796 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001797 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001798 elseif a:mode ==2
1799 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1800 call s:CopyWinVars()
1801 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001802 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001803 else
1804 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1805 call s:CopyWinVars()
1806 exe "norm! 0"
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001807 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,s:NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001808 endif
1809
1810" call Dret("NetSplit")
1811endfun
1812
1813" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001814" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001815" files given their extension. Passes 0=local, 1=remote
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001816fun! netrw#NetBrowseX(fname,remote)
1817" call Dfunc("NetBrowseX(fname<".a:fname."> remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001818
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001819 " set up the filename
1820 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001821 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001822 if has("win32") || has("win95") || has("win64") || has("win16")
1823 let exten= substitute(exten,'^.*$','\L&\E','')
1824 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001825 let fname= escape(a:fname,"%#")
1826" call Decho("fname<".fname."> after escape()")
1827
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001828 " seems kde systems often have gnome-open due to dependencies, even though
1829 " gnome-open's subsidiary display tools are largely absent. Kde systems
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001830 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
1831 if !exists("s:haskdeinit")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001832 if has("unix")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001833 silent! let s:haskdeinit= system('ps -e') =~ 'kdeinit'
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001834 if v:shell_error
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001835 let s:haskdeinit = 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001836 endif
1837 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001838 let s:haskdeinit= 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001839 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001840" call Decho("setting s:haskdeinit=".s:haskdeinit)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001841 endif
1842
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001843 if a:remote == 1
1844 " create a local copy
1845 let fname= tempname().".".exten
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001846" call Decho("a:remote==1: create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001847 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001848 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001849 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001850 q
1851 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001852" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001853
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001854 " set up redirection
1855 if &srr =~ "%s"
Bram Moolenaarf4cd3e82005-12-22 22:47:02 +00001856 let redir= substitute(&srr,"%s","/dev/null","")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001857 else
1858 let redir= &srr . "/dev/null"
1859 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001860" call Decho("redir{".redir."} srr{".&srr."}")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001861
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001862 if exists("g:netrw_browsex_viewer") && executable(g:netrw_browsex_viewer)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001863" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001864 if g:netrw_browsex_viewer == '-'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001865 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001866 else
1867" call Decho("exe silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."' ".redir)
1868 exe "silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."'".redir
1869 let ret= v:shell_error
1870 endif
1871
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001872 " execute the file handler
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001873 elseif has("win32") || has("win64")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001874" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1875 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1876 let ret= v:shell_error
1877
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001878 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaara5792f52005-11-23 21:25:05 +00001879" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1880 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1881 let ret= v:shell_error
1882
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001883 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001884" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1885 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1886 let ret= v:shell_error
1887
1888 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001889 " netrwFileHandlers#Invoke() always returns 0
1890 let ret= netrwFileHandlers#Invoke(exten,fname)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001891 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001892
1893 " if unsuccessful, attempt netrwFileHandlers#Invoke()
1894 if ret
1895 let ret= netrwFileHandlers#Invoke(exten,fname)
1896 endif
1897
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001898 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001899
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001900 " cleanup: remove temporary file,
1901 " delete current buffer if success with handler,
1902 " return to prior buffer (directory listing)
1903 if a:remote == 1 && fname != a:fname
1904" call Decho("deleting temporary file<".fname.">")
1905 call delete(fname)
1906 endif
1907
1908 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001909 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001910 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001911 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001912 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001913
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001914" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001915endfun
1916
1917" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001918" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1919" This function assumes that a long listing will be received. Size, time,
1920" and reverse sorts will be requested of the server but not otherwise
1921" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001922fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001923" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001924
1925 " because WinXX ftp uses unix style input
1926 " curline is one more than the bannercnt in order to account
1927 " for the unwanted first blank line (doing a :put to an empty
1928 " buffer yields a blank first line)
1929 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001930 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001931 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001932 exe "silent! keepjumps ".curline.",$d"
1933
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001934 ".........................................
1935 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001936 " ftp + <.netrc>: Method #2
1937 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001938 put ='cd \"'.a:path.'\"'
1939" call Decho('ftp: '.getline("."))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001940 endif
1941 exe "put ='".a:cmd."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001942" call Decho("ftp: ".getline("."))
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001943" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001944 if exists("g:netrw_port") && g:netrw_port != ""
1945" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1946 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1947 else
1948" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1949 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1950 endif
1951
1952 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001953 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001954 " ftp + machine,id,passwd,filename: Method #3
1955 setlocal ff=unix
1956 if exists("g:netrw_port") && g:netrw_port != ""
1957 put ='open '.g:netrw_machine.' '.g:netrw_port
1958 else
1959 put ='open '.g:netrw_machine
1960 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001961
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001962 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1963 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001964 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001965 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001966 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001967 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001968
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001969 if a:path != ""
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001970 put ='cd \"'.a:path.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001971 endif
1972 exe "put ='".a:cmd."'"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001973
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001974 " perform ftp:
1975 " -i : turns off interactive prompting from ftp
1976 " -n unix : DON'T use <.netrc>, even though it exists
1977 " -n win32: quit being obnoxious about password
1978" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1979 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1980
1981 ".........................................
1982 else
1983 echo "***warning*** unable to comply with your request<" . choice . ">"
1984 endif
1985
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001986 " cleanup for Windows
1987 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001988 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001989 endif
1990 if a:cmd == "dir"
1991 " infer directory/link based on the file permission string
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001992 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1993 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001994 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001995 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001996 endif
1997 endif
1998
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001999 " ftp's ls doesn't seem to include ./ or ../
2000 if !search('^\.\/$','wn')
2001 exe 'keepjumps '.curline
2002 if a:path !~ '^$'
2003 put ='../'
2004 endif
2005 put ='./'
2006 exe 'keepjumps '.curline
2007 endif
2008
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002009 " restore settings
2010 let &ff= ffkeep
2011" call Dret("NetBrowseFtpCmd")
2012endfun
2013
2014" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00002015" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
2016" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002017fun! s:NetrwListHide()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002018" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002019
2020 let listhide= g:netrw_list_hide
2021 while listhide != ""
2022 if listhide =~ ','
2023 let hide = substitute(listhide,',.*$','','e')
2024 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
2025 else
2026 let hide = listhide
2027 let listhide= ""
2028 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002029
2030 " Prune the list by hiding any files which match
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002031 if g:netrw_hide == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002032" call Decho("hiding<".hide."> listhide<".listhide.">")
2033" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d')
2034 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002035 elseif g:netrw_hide == 2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002036" call Decho("showing<".hide."> listhide<".listhide.">")
2037" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d')
2038 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002039 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00002040 endwhile
2041
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002042" call Dret("NetrwListHide")
2043endfun
2044
2045" ---------------------------------------------------------------------
2046" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002047fun! s:NetHideEdit(islocal)
2048" call Dfunc("NetHideEdit(islocal=".a:islocal.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002049
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002050 " get new hiding list from user
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002051 call inputsave()
2052 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
2053 call inputrestore()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002054 let g:netrw_list_hide= newhide
2055" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002056
2057 " refresh the listing
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002058 if a:islocal == 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002059 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2060 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002061 silent call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,"./"),a:islocal)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002062 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002063
2064" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00002065endfun
2066
Bram Moolenaar8299df92004-07-10 09:47:34 +00002067" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002068" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002069fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002070" call Dfunc("NetSortSequence(mode=".a:mode.")")
2071
2072 call inputsave()
2073 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
2074 call inputrestore()
2075
2076 " refresh the listing
2077 let g:netrw_sort_sequence= newsortseq
2078 if a:mode == 0
2079 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
2080 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002081 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002082 endif
2083
2084" call Dret("NetSortSequence")
2085endfun
2086
2087" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002088" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002089fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002090" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
2091 let fname = s:NetGetWord()
2092 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
2093" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002094
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002095 if w:netrw_longlist == 0
2096 " use one column listing
2097" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002098 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2099
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002100 elseif w:netrw_longlist == 1
2101 " use long list
2102" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002103 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002104
2105 else
2106 " give wide list
2107" call Decho("use wide list")
2108 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002109 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002110 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00002111
2112 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002113 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002114
2115 " refresh the listing
2116 if a:mode == 0
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002117 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002118 else
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002119 silent call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002120 endif
2121
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002122 " keep cursor on the filename
2123 silent keepjumps $
2124 if fname =~ '/$'
2125 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2126 else
2127 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
2128 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002129
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002130" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
2131endfun
2132
2133" ---------------------------------------------------------------------
2134" NetrwWideListing: {{{2
2135fun! s:NetrwWideListing()
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002136" call Dfunc("NetrwWideListing() w:netrw_longlist=".w:netrw_longlist)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002137
2138 if w:netrw_longlist == 2
2139 " look for longest filename (cpf=characters per filename)
2140 " cpf: characters per file
2141 " fpl: files per line
2142 " fpc: files per column
2143 set ma
2144 let b:netrw_cpf= 0
2145 if line("$") >= w:netrw_bannercnt
2146 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2147 else
2148" call Dret("NetrwWideListing")
2149 return
2150 endif
2151" call Decho("max file strlen+1=".b:netrw_cpf)
2152 let b:netrw_cpf= b:netrw_cpf + 1
2153
2154 " determine qty files per line (fpl)
2155 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002156 if w:netrw_fpl <= 0
2157 let w:netrw_fpl= 1
2158 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002159" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
2160
2161 " make wide display
2162 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
2163 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
2164 let newcolstart = w:netrw_bannercnt + fpc
2165 let newcolend = newcolstart + fpc - 1
2166" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
2167 while line("$") >= newcolstart
2168 if newcolend > line("$") | let newcolend= line("$") | endif
2169 let newcolqty= newcolend - newcolstart
2170 exe newcolstart
2171 if newcolqty == 0
2172 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2173 else
2174 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2175 endif
2176 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002177 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002178 endwhile
2179 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002180 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002181 endif
2182
2183" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002184endfun
2185
2186" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002187" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002188" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2189" the same word even though the sorting has changed its order of appearance.
2190fun! s:NetSaveWordPosn()
2191" call Dfunc("NetSaveWordPosn()")
2192 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2193" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2194endfun
2195
2196" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002197" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002198fun! s:NetRestoreWordPosn()
2199" call Dfunc("NetRestoreWordPosn()")
2200 silent! call search(s:netrw_saveword,'w')
2201" call Dret("NetRestoreWordPosn")
2202endfun
2203
2204" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002205" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002206fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002207" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2208
2209 " get name of new directory from user. A bare <CR> will skip.
2210 " if its currently a directory, also request will be skipped, but with
2211 " a message.
2212 call inputsave()
2213 let newdirname= input("Please give directory name: ")
2214 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002215" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002216
2217 if newdirname == ""
2218" call Dret("NetMakeDir : user aborted with bare <cr>")
2219 return
2220 endif
2221
2222 if a:usrhost == ""
2223
2224 " Local mkdir:
2225 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002226 let fullnewdir= b:netrw_curdir.'/'.newdirname
2227" call Decho("fullnewdir<".fullnewdir.">")
2228 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002229 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002230 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002231 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002232 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002233" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2234 return
2235 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002236 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002237 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002238 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002239 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002240 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002241" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2242 return
2243 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002244
2245 " requested new local directory is neither a pre-existing file or
2246 " directory, so make it!
2247 if exists("*mkdir")
2248 call mkdir(fullnewdir,"p")
2249 else
2250 let netrw_origdir= s:NetGetcwd(1)
2251 exe 'cd '.b:netrw_curdir
2252" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2253" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2254 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002255 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002256 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002257
Bram Moolenaar8299df92004-07-10 09:47:34 +00002258 if v:shell_error == 0
2259 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002260" call Decho("refresh listing")
2261 let linenum= line(".")
2262 norm! H0
2263 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002264 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002265 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2266 exe "norm! ".hline."G0z\<CR>"
2267 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002268 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002269 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002270 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002271 endif
2272 redraw!
2273
2274 else
2275 " Remote mkdir:
2276 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002277 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002278" call Decho("exe silent! !".mkdircmd." ".newdirname)
2279 exe "silent! !".mkdircmd." ".newdirname
2280 if v:shell_error == 0
2281 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002282 let linenum= line(".")
2283 norm! H0
2284 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002285 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002286 exe "norm! ".hline."G0z\<CR>"
2287 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002288 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002289 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002290 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002291 endif
2292 redraw!
2293 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002294
Bram Moolenaar8299df92004-07-10 09:47:34 +00002295" call Dret("NetMakeDir")
2296endfun
2297
2298" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002299" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002300" 0: (user: <b>) bookmark current directory
2301" 1: (user: <B>) change to the bookmarked directory
2302" 2: (user: <q>) list bookmarks
2303" 3: (LocalBrowse) record current directory history
2304" 4: (user: <u>) go up (previous) bookmark
2305" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002306fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002307" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002308 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2309 " looks like a "b" was pressed while in the banner region
2310 if line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002311 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002312 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002313 if &ch > 1
2314 " "clear" the message
2315 echo ""
2316 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002317" call Dret("NetBookmarkDir - ignoring")
2318 return
2319 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002320
2321 if a:chg == 0
2322 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002323 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2324 if !exists("g:NETRW_BOOKMARKMAX")
2325 let g:NETRW_BOOKMARKMAX= v:count
2326 elseif v:count > g:NETRW_BOOKMARKMAX
2327 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002328 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002329 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002330
2331 elseif a:chg == 1
2332 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002333 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2334 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002335 else
2336 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2337 endif
2338
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002339 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002340 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002341 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002342" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2343 let cnt= 0
2344 while cnt <= g:NETRW_BOOKMARKMAX
2345 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2346" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2347 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2348 endif
2349 let cnt= cnt + 1
2350 endwhile
2351 endif
2352
2353 " list directory history
2354 let cnt = g:NETRW_DIRHIST_CNT
2355 let first = 1
2356 let histcnt = 0
2357 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2358" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2359 let histcnt= histcnt + 1
2360 if exists("g:NETRW_DIRHIST_{cnt}")
2361" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2362 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002363 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002364 let first = 0
2365 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2366 if cnt < 0
2367 let cnt= cnt + g:netrw_dirhistmax
2368 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002369 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002370
2371 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002372 " saves most recently visited directories (when they differ)
2373 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2374 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2375 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2376" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2377 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002378
2379 elseif a:chg == 4
2380 " u: change to the previous directory stored on the history list
2381 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2382 if g:NETRW_DIRHIST_CNT < 0
2383 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2384 endif
2385 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2386" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2387 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2388 else
2389 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2390 echo "Sorry, no predecessor directory exists yet"
2391 endif
2392
2393 elseif a:chg == 5
2394 " U: change to the subsequent directory stored on the history list
2395 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2396 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2397" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2398 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2399 else
2400 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2401 if g:NETRW_DIRHIST_CNT < 0
2402 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2403 endif
2404 echo "Sorry, no successor directory exists yet"
2405 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002406 endif
2407" call Dret("NetBookmarkDir")
2408endfun
2409
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002410" ---------------------------------------------------------------------
2411" NetObtain: obtain file under cursor (for remote browsing support) {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002412fun! netrw#NetObtain(...)
2413" call Dfunc("NetObtain() a:0=".a:0)
2414
2415 if a:0==0
2416 " no arguments -- use word under cursor
2417 let fname= expand("<cWORD>")
2418" call Decho("no arguments, use <".fname.">")
2419 elseif a:0 > 1
2420 " more than one argument, recurse with each argument separately
2421" call Decho("more than 1 argument, use recursion")
2422 let i=1
2423 while i <= a:0
2424 call netrw#NetObtain(a:{i})
2425 let i=i+1
2426 endwhile
2427 return
2428 else
2429 " one argument provided
2430 let fname = a:1
2431 let keep_netrw_choice = exists("b:netrw_choice")? b:netrw_choice : ""
2432 let keep_netrw_fname = exists("b:netrw_fname")? b:netrw_fname : ""
2433 let keep_netrw_wmethod = exists("w:netrw_method")? w:netrw_method : ""
2434 call s:NetMethod(fname)
2435 let w:netrw_method= b:netrw_method
2436 let fname = b:netrw_fname
2437" call Decho("g:netrw_scp_cmd<".g:netrw_scp_cmd.">")
2438" call Decho("g:netrw_machine<".g:netrw_machine.">")
2439" call Decho("fname<".fname.">")
2440 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002441
2442 " NetrwStatusLine support - for obtaining support
2443 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002444
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002445" call Decho("method=".w:netrw_method)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002446 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2447 if executable("ftp")
2448 let curdir = expand("%")
2449 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2450 let curline= line(".")
2451 let endline= line("$")+1
2452 set ma
2453 keepjumps $
2454
2455 ".........................................
2456 if w:netrw_method == 2
2457 " ftp + <.netrc>: Method #2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002458 setlocal ff=unix
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002459 if path != ""
2460 put ='cd '.path
2461" call Decho("ftp: cd ".path)
2462 endif
2463 put ='get '.fname
2464" call Decho("ftp: get ".fname)
2465 if exists("g:netrw_port") && g:netrw_port != ""
2466" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2467 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2468 else
2469" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2470 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2471 endif
2472
2473 ".........................................
2474 elseif w:netrw_method == 3
2475 " ftp + machine,id,passwd,filename: Method #3
2476 setlocal ff=unix
2477 if exists("g:netrw_port") && g:netrw_port != ""
2478 put ='open '.g:netrw_machine.' '.g:netrw_port
2479" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2480 else
2481 put ='open '.g:netrw_machine
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002482" call Decho('ftp: open '.g:netrw_machine)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002483 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002484
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002485 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2486 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002487 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002488" call Decho('ftp: g:netrw_uid')
2489" call Decho('ftp: g:netrw_passwd')
2490 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002491 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002492" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2493 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002494
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002495 if a:path != ""
2496 put ='cd '.a:path
2497" call Decho('cd '.a:path)
2498 endif
2499 exe "put ='".a:cmd."'"
2500" call Decho("ftp: ".a:cmd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002501
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002502 " perform ftp:
2503 " -i : turns off interactive prompting from ftp
2504 " -n unix : DON'T use <.netrc>, even though it exists
2505 " -n win32: quit being obnoxious about password
2506" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2507 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002508
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002509 ".........................................
2510 else
2511 echo "***warning*** unable to comply with your request<" . choice . ">"
2512 endif
2513 " restore
2514 exe "silent! ".endline.",$d"
2515 exe "keepjumps ".curline
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002516 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002517 else
2518 if !exists("g:netrw_quiet")
2519 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2520 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2521 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002522 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002523 let &stl = s:netrw_users_stl
2524 let &laststatus = s:netrw_users_ls
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002525 " restore NetMethod
2526 if exists("keep_netrw_method")
2527 call s:NetMethod(keep_netrw_choice)
2528 let w:netrw_method = keep_netrw_wmethod
2529 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002530" call Dret("NetObtain")
2531 return
2532 endif
2533
2534 ".........................................
2535 else
2536 " scp: Method#4
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002537 let curdir = expand("%")
2538 let path = substitute(curdir,'scp://[^/]\+/','','e')
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002539" call Decho("path<".path.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002540 if exists("g:netrw_port") && g:netrw_port != ""
2541 let useport= " -P ".g:netrw_port
2542 else
2543 let useport= ""
2544 endif
2545 if g:netrw_cygwin == 1
2546 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002547" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2548 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002549 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002550" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
2551 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002552 endif
2553 endif
2554
2555 " restore status line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002556 let &stl = s:netrw_users_stl
2557 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002558 redraw!
2559
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002560 " restore NetMethod
2561 if exists("keep_netrw_method")
2562 call s:NetMethod(keep_netrw_choice)
2563 let w:netrw_method = keep_netrw_wmethod
2564 endif
2565
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002566" call Dret("NetObtain")
2567endfun
2568
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002569" ---------------------------------------------------------------------
2570" NetPrevWinOpen: opoen file/directory in previous window. {{{2
2571" If there's only one window, then the window will first be split.
2572fun! s:NetPrevWinOpen(islocal)
2573" call Dfunc("NetPrevWinOpen(islocal=".a:islocal.")")
2574
2575 " get last window number and the word currently under the cursor
2576 let lastwinnr = winnr("$")
2577 let curword = s:NetGetWord()
2578 let curdir = b:netrw_curdir
2579" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
2580
2581 let didsplit = 0
2582 if lastwinnr == 1
2583 " if only one window, open a new one first
2584" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
2585 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
2586 let didsplit = 1
2587
2588 else
2589 wincmd p
2590 " if the previous window's buffer has been changed (is modified),
2591 " and it doesn't appear in any other extant window, then ask the
2592 " user if s/he wants to abandon modifications therein.
2593 let bnr = winbufnr(0)
2594 let bnrcnt = 0
2595 if &mod
2596 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
2597" call Decho("bnr=".bnr." bnrcnt=".bnrcnt)
2598 if bnrcnt == 1
2599 let bufname= bufname(winbufnr(winnr()))
2600 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
2601
2602 if choice == 1
2603 " Yes -- write file & then browse
2604 let v:errmsg= ""
2605 silent w
2606 if v:errmsg != ""
2607 echohl Error | echo "***netrw*** "unable to write <".bufname.">!" | echohl None
2608 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2609 if didsplit
2610 q
2611 else
2612 wincmd p
2613 endif
2614" call Dret("NetPrevWinOpen : unable to write <".bufname.">")
2615 return
2616 endif
2617
2618 elseif choice == 2
2619 " No -- don't worry about changed file, just browse anyway
2620 set nomod
2621 echohl WarningMsg | echo "***netrw*** ".bufname." changes abandoned" | echohl None
2622
2623 else
2624 " Cancel -- don't do this
2625 if didsplit
2626 q
2627 else
2628 wincmd p
2629 endif
2630" call Dret("NetPrevWinOpen : cancelled")
2631 return
2632 endif
2633 endif
2634 endif
2635 endif
2636
2637 if a:islocal
2638 call s:LocalBrowse(s:LocalBrowseChgDir(curdir,curword))
2639 else
2640 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),curword))
2641 endif
2642" call Dret("NetPrevWinOpen")
2643endfun
2644
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002645" ---------------------------------------------------------------------
2646" NetMenu: generates the menu for gvim and netrw {{{2
2647fun! s:NetMenu()
2648
2649 if has("menu") && has("gui_running") && &go =~ 'm'
2650" call Dfunc("NetMenu()")
2651 if !exists("s:netrw_menu_enabled")
2652 let s:netrw_menu_enabled= 1
2653 if !exists("g:DrChipTopLvlMenu")
2654 let g:DrChipTopLvlMenu= "DrChip."
2655 endif
2656 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Help<tab>? ?'
2657 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Apply\ Special\ Viewer<tab>x x'
2658 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Bookmark\ Current\ Directory<tab>b Nb'
2659 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Go\ Up\ Directory<tab>- -'
2660 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Goto\ Bookmarked\ Directory<tab>B NB'
2661 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Recently\ Used\ Directory<tab>u u'
2662 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Subsequently\ Used\ Directory<tab>U U'
2663 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Delete\ File/Directory<tab>D D'
2664 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<c-h>"
2665 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory<tab><cr> '."\<cr>"
2666 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory,\ New\ Window<tab>o o'
2667 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File/Directory,\ New\ Vertical\ Window\ <tab>v v'
2668 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.List\ Bookmarks\ and\ History<tab>q q'
2669 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Listing\ Style\ (thin-long-wide)<tab>i i'
2670 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Make\ Subdirectory<tab>d d'
2671 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Normal-Hide-Show<tab>a a'
2672 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Obtain\ File<tab>O O'
2673 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Preview\ File/Directory<tab>p p'
2674 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Previous\ Window\ Browser<tab>P P'
2675 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
2676 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Rename\ File/Directory<tab>R R'
2677 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Reverse\ Sorting\ Order<tab>'."r r"
2678 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Select\ Sorting\ Style<tab>s s'
2679 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Sorting\ Sequence\ Edit<tab>S S'
2680 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Set\ Current\ Directory<tab>c c'
2681 exe 'silent! menu '.g:DrChipTopLvlMenu.'Netrw.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
2682 else
2683" call Decho("clear menus")
2684 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Help'
2685 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Apply\ Special\ Viewer'
2686 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Bookmark\ Current\ Directory'
2687 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Go\ Up\ Directory'
2688 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Goto\ Bookmarked\ Directory'
2689 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Recently\ Used\ Directory'
2690 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Change\ To\ Subsequently\ Used\ Directory'
2691 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Delete\ File/Directory'
2692 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File\ Hiding\ List'
2693 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Edit\ File'
2694 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Enter\ File/Directory'
2695 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Enter\ File/Directory\ (vertical\ split)'
2696 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.List\ Bookmarks\ and\ History'
2697 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Listing\ Style\ (thin-long-wide)'
2698 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Make\ Subdirectory'
2699 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Normal-Hide-Show'
2700 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Obtain\ File'
2701 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Preview\ File'
2702 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Previous\ Window\ Browser'
2703 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Refresh\ Listing'
2704 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Rename\ File/Directory'
2705 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Reverse\ Sorting\ Order'
2706 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Select\ Sorting\ Style'
2707 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Sorting\ Sequence\ Edit'
2708 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Set\ Current\ Directory'
2709 exe 'silent! unmenu '.g:DrChipTopLvlMenu.'Netrw.Settings/Options'
2710 endif
2711" call Dret("NetMenu")
2712 endif
2713
2714endfun
2715
Bram Moolenaar83bab712005-08-01 21:58:57 +00002716" ==========================================
2717" Local Directory Browsing Support: {{{1
2718" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002719
2720" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002721" LocalBrowse: {{{2
2722fun! s:LocalBrowse(dirname)
2723 " unfortunate interaction -- debugging calls can't be used here;
2724 " the BufEnter event causes triggering when attempts to write to
2725 " the DBG buffer are made.
2726 if isdirectory(a:dirname)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002727 silent! call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002728 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002729 " not a directory, ignore it
2730endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002731
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002732" ---------------------------------------------------------------------
2733" DirBrowse: supports local file/directory browsing {{{2
2734fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002735 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002736" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002737" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002738
Bram Moolenaar488c6512005-08-11 20:09:58 +00002739 if exists("s:netrw_skipbrowse")
2740 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002741" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002742 return
2743 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002744 if &fo =~ '[ta]'
2745 set fo-=t
2746 set fo-=a
2747 echohl Warning
2748 echo '***warning*** directory browsing and formatoptions "ta" are incompatible'
2749 echohl None
2750 endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002751
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002752 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002753
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002754 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002755 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002756 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002757 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002758 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002759 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002760" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002761 return
2762 endif
2763
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002764 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2765 call s:UseBufWinVars()
2766
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002767 " set up menus
2768 let b:netrw_browser_active= 1
2769 call s:NetMenu()
2770
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002771 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002772 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002773" call Decho("findbuf: bufnum=".bufnum)
2774 if bufnum > 0 && bufname(bufnum) != a:dirname
2775 let ibuf= 1
2776 let buflast= bufnr("$")
2777 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2778" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2779 let ibuf= ibuf + 1
2780 endwhile
2781 if ibuf > buflast
2782 let bufnum= -1
2783 else
2784 let bufnum= ibuf
2785 endif
2786" call Decho("findbuf: bufnum=".bufnum." (final)")
2787 endif
2788
2789 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002790 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002791 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002792" call Decho("enew buffer")
2793 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002794 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002795 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2796 if getline(2) =~ '^" Directory Listing '
2797 if !g:netrw_keepdir
2798" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002799 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002800 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002801 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002802" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002803 return
2804 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002805 endif
2806 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002807 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002808
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002809 " set up ShellCmdPost handling. Append current buffer to browselist
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00002810 call s:LocalFastBrowser()
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00002811
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002812 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002813 if has("win32") || has("win95") || has("win64") || has("win16")
2814 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2815 else
2816 let b:netrw_curdir= a:dirname
2817 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002818 if b:netrw_curdir =~ '[/\\]$'
2819 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2820 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002821 if b:netrw_curdir == ''
2822 " under unix, when the root directory is encountered, the result
2823 " from the preceding substitute is an empty string.
2824 let b:netrw_curdir= '/'
2825 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002826" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002827
Bram Moolenaar83bab712005-08-01 21:58:57 +00002828 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002829 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002830" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002831 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002832 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002833 catch /^Vim\%((\a\+)\)\=:E472/
2834 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2835 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2836 if exists("w:netrw_prvdir")
2837 let b:netrw_curdir= w:netrw_prvdir
2838 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002839 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002840" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002841 return
2842 endif
2843 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002844 endif
2845
2846 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002847 " Hmm. When another vim is open to the same directory, I get
2848 " a "Press ENTER" ... ok, setting "noswf" avoids it.
2849" call Decho('exe silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002850 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002851
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002852 " make this buffer not-a-file, modifiable, not line-numbered, etc
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002853 setlocal bt=nofile nobl ma nonu noswf nowrap
2854 if g:netrw_fastbrowse >= 2
2855 setlocal bh=hide
Bram Moolenaarc01140a2006-03-24 22:21:52 +00002856 else
2857 setlocal bh=delete
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002858 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002859 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002860
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002861 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002862 " Perform Directory Listing:
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002863 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2864 echo "(netrw) Processing your browsing request..."
2865 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002866
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002867 " save current directory on directory history list
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002868 call s:NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002869
Bram Moolenaar8299df92004-07-10 09:47:34 +00002870 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002871" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002872 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002873 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'),1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002874 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002875 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 +00002876 if w:netrw_longlist != 2
2877 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2878 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2879 endif
2880 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2881 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002882 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2883 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2884 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002885 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002886 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002887 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2888 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002889 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002890 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002891 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 +00002892 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>
2893 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002894 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2895 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002896 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002897 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002898 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002899 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2900 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002901 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002902 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002903 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002904 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002905 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002906 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002907 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar433f7c82006-03-21 21:29:36 +00002908 nnoremap <buffer> <F1> :he netrw-dir<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002909
2910 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002911" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002912 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002913 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002914 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002915 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002916 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002917
2918 let sortby= g:netrw_sort_by
2919 if g:netrw_sort_direction =~ "^r"
2920 let sortby= sortby." reversed"
2921 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002922
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002923 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002924 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002925" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002926 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002927 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002928 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002929 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002930 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002931" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002932 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002933 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002934 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002935 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002936
2937 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002938 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002939 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002940 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002941 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002942 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002943 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002944 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002945 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002946 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 +00002947 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002948 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002949
2950 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002951 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2952" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002953
2954 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002955 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002956
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002957 " set up syntax highlighting
2958 if has("syntax")
2959 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002960 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002961 setlocal ft=
2962 endif
2963 endif
2964
Bram Moolenaar8299df92004-07-10 09:47:34 +00002965 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002966 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002967 if g:netrw_hide && g:netrw_list_hide != ""
2968 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002969 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002970 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002971
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002972 if g:netrw_sort_by =~ "^n"
2973 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002974
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002975 if w:netrw_bannercnt < line("$")
2976 if g:netrw_sort_direction =~ 'n'
2977 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2978 else
2979 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2980 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002981 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002982 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002983
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002984 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002985 if w:netrw_bannercnt < line("$")
2986 if g:netrw_sort_direction =~ 'n'
2987 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2988 else
2989 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2990 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002991 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002992 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002993 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002994
Bram Moolenaar8299df92004-07-10 09:47:34 +00002995 endif
2996 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002997
2998 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002999 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003000 " place cursor on the top-left corner of the file listing
3001 exe 'silent '.w:netrw_bannercnt
3002 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003003 endif
3004
3005 " record previous current directory
3006 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00003007
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003008 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003009 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003010 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003011 setlocal noma nomod nonu nobl nowrap
3012 if g:netrw_fastbrowse >= 2
3013 setlocal bh=hide
3014 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003015
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003016" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003017endfun
3018
3019" ---------------------------------------------------------------------
3020" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003021fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003022" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003023
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003024 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00003025 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
3026 let dirnamelen = strlen(b:netrw_curdir)
3027 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003028" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003029 if filelist != ""
3030 let filelist= filelist."\n"
3031 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003032 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003033" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
3034
3035 " if the directory name includes a "$", and possibly other characters,
3036 " the glob() doesn't include "." and ".." entries.
3037 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
3038" call Decho("forcibly tacking on .")
3039 if filelist == ""
3040 let filelist= dirname."."
3041 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003042 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003043 endif
3044" call Decho("filelist<".filelist.">")
3045 endif
3046 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
3047" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003048 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003049" call Decho("filelist<".filelist.">")
3050 endif
3051 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003052 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003053
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003054" call Decho("dirname<".dirname.">")
3055" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003056" call Decho("filelist<".filelist.">")
3057
3058 while filelist != ""
3059 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003060 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003061 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
3062 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003063 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00003064 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00003065 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003066 let pfile= filename
3067 if isdirectory(filename)
3068 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00003069 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003070 if pfile =~ '//$'
3071 let pfile= substitute(pfile,'//$','/','e')
3072 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003073 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00003074 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00003075" call Decho(" ")
3076" call Decho("filename<".filename.">")
3077" call Decho("pfile <".pfile.">")
3078
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003079 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003080 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003081 let fsz = strpart(" ",1,15-strlen(sz)).sz
3082 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00003083" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003084 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003085
Bram Moolenaar8299df92004-07-10 09:47:34 +00003086 if g:netrw_sort_by =~ "^t"
3087 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003088" call Decho("getftime(".filename.")=".getftime(filename))
3089 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003090 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00003091" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003092 let ftpfile= ft.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003093 keepjumps silent! put=ftpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003094
Bram Moolenaar8299df92004-07-10 09:47:34 +00003095 elseif g:netrw_sort_by =~ "^s"
3096 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003097" call Decho("getfsize(".filename.")=".getfsize(filename))
3098 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003099 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00003100" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003101 let fszpfile= fsz.'/'.pfile
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003102 keepjumps silent! put =fszpfile
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003103
Bram Moolenaar8299df92004-07-10 09:47:34 +00003104 else
3105 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003106" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003107 keepjumps silent! put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00003108 endif
3109 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003110
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003111 " cleanup any windows mess at end-of-line
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003112 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00003113 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00003114
3115" call Dret("LocalBrowseList")
3116endfun
3117
3118" ---------------------------------------------------------------------
3119" LocalBrowseChgDir: constructs a new directory based on the current {{{2
3120" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003121fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003122" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003123
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003124 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003125 let newdir = a:newdir
3126
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003127 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003128 " apparently vim is "recognizing" that it is in the home directory and
3129 " is removing the "/". Bad idea, so I have to put it back.
3130 let dirname= dirname.'/'
3131" call Decho("adjusting dirname<".dirname.">")
3132 endif
3133
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003134 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00003135 " handling a file
3136 let dirname= dirname.newdir
3137" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003138 " this lets NetBrowseX avoid the edit
3139 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003140" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
3141" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003142 if g:netrw_browse_split == 1
3143 new
3144 wincmd _
3145 elseif g:netrw_browse_split == 2
3146 rightb vert new
3147 wincmd |
3148 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003149 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003150 call s:NetMenu()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003151 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003152 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003153
3154 elseif newdir == './'
3155 " refresh the directory list
3156" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003157
3158 elseif newdir == '../'
3159 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003160 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003161" call Decho("go up one dir: dirname<".dirname.">")
3162
3163 else
3164 " go down one directory
3165 let dirname= dirname.newdir
3166" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
3167 endif
3168
3169" call Dret("LocalBrowseChgDir <".dirname.">")
3170 return dirname
3171endfun
3172
3173" ---------------------------------------------------------------------
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003174" LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
3175" performed any shell command. The idea is to cause all local-browsing
3176" buffers to be refreshed after a user has executed some shell command,
3177" on the chance that s/he removed/created a file/directory with it.
3178fun! s:LocalBrowseShellCmdRefresh()
3179" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
3180 " go through all buffers,
3181 " including unlisted (which is why I can't use bufdo)
3182 let curwin = winnr()
3183 let ibl = 0
3184 for ibuf in s:netrw_browselist
3185 if bufwinnr(ibuf) == -1
3186" call Decho("wiping buf#".ibuf)
Bram Moolenaarc01140a2006-03-24 22:21:52 +00003187 exe "silent! bw ".ibuf
Bram Moolenaar1f4d4de2006-03-14 23:00:46 +00003188 call remove(s:netrw_browselist,ibl)
3189" call Decho("browselist=".string(s:netrw_browselist))
3190 continue
3191 else
3192" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
3193 exe bufwinnr(ibuf)."wincmd w"
3194 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
3195 endif
3196 let ibl= ibl + 1
3197 endfor
3198 exe curwin."wincmd w"
3199
3200" call Dret("LocalBrowseShellCmdRefresh")
3201endfun
3202
3203" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00003204" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003205fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003206" call Dfunc("LocalBrowseRm(path<".a:path.">)")
3207" call Decho("firstline=".a:firstline." lastline=".a:lastline)
3208
3209 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003210 let ctr = a:firstline
3211 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003212 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00003213
3214 " remove multiple files and directories
3215 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003216 exe "keepjumps ".ctr
3217
3218 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003219 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003220 let ctr= ctr + 1
3221 continue
3222 endif
3223 let curword= s:NetGetWord()
3224 if curword == "./" || curword == "../"
3225 let ctr= ctr + 1
3226 continue
3227 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00003228
3229 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00003230 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003231" call Decho("rmfile<".rmfile.">")
3232
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003233 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003234 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003235 if !all
3236 echohl Statement
3237 call inputsave()
3238 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3239 call inputrestore()
3240 echohl NONE
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003241 if ok == ""
3242 let ok="no"
3243 endif
3244" call Decho("response: ok<".ok.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003245 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003246" call Decho("response: ok<".ok."> (after sub)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003247 if ok =~ 'a\%[ll]'
3248 let all= 1
3249 endif
3250 endif
3251
3252 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003253 let ret= delete(rmfile)
3254" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003255 elseif ok =~ 'q\%[uit]'
3256 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003257 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003258
Bram Moolenaar8299df92004-07-10 09:47:34 +00003259 else
3260 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003261 if !all
3262 echohl Statement
3263 call inputsave()
3264 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
3265 call inputrestore()
3266 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003267 if ok == ""
3268 let ok="no"
3269 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003270 if ok =~ 'a\%[ll]'
3271 let all= 1
3272 endif
3273 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003274 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003275
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003276 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003277" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
3278 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00003279" call Decho("v:shell_error=".v:shell_error)
3280
3281 if v:shell_error != 0
3282" call Decho("2nd attempt to remove directory<".rmfile.">")
3283 let errcode= delete(rmfile)
3284" call Decho("errcode=".errcode)
3285
3286 if errcode != 0
3287 if has("unix")
3288" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003289call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003290 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003291 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003292 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003293endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003294 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003295 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003296 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00003297 endif
3298 endif
3299 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003300
3301 elseif ok =~ 'q\%[uit]'
3302 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00003303 endif
3304 endif
3305
3306 let ctr= ctr + 1
3307 endwhile
3308
3309 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003310 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003311" call Decho("refresh the directory")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003312 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003313 exe curline
3314
3315" call Dret("LocalBrowseRm")
3316endfun
3317
3318" ---------------------------------------------------------------------
3319" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003320fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00003321" call Dfunc("LocalBrowseRename(path<".a:path.">)")
3322
3323 " preparation for removing multiple files/directories
3324 let ctr= a:firstline
3325
3326 " attempt to rename files/directories
3327 while ctr <= a:lastline
3328 exe "keepjumps ".ctr
3329
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003330 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00003331 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003332 let ctr= ctr + 1
3333 continue
3334 endif
3335 let curword= s:NetGetWord()
3336 if curword == "./" || curword == "../"
3337 let ctr= ctr + 1
3338 continue
3339 endif
3340
Bram Moolenaar8299df92004-07-10 09:47:34 +00003341 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00003342 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00003343" call Decho("oldname<".oldname.">")
3344
3345 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003346 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00003347 call inputrestore()
3348
Bram Moolenaar83bab712005-08-01 21:58:57 +00003349 let ret= rename(oldname,newname)
3350" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00003351
3352 let ctr= ctr + 1
3353 endwhile
3354
3355 " refresh the directory
3356 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00003357" call Decho("refresh the directory listing")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003358 call s:NetRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'),1)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003359 exe "keepjumps ".curline
3360" call Dret("LocalBrowseRename")
3361endfun
3362
3363" ---------------------------------------------------------------------
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003364" LocalFastBrowser: handles setting up/taking down fast browsing for the {{{2
3365" local browser
3366fun! s:LocalFastBrowser()
3367" call Dfunc("LocalFastBrowser()")
3368
3369 " initialize browselist, a list of buffer numbers that the local browser has used
3370 if !exists("s:netrw_browselist")
3371 let s:netrw_browselist= []
3372 endif
3373
3374 " append current buffer to fastbrowse list
3375 if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
3376 call add(s:netrw_browselist,bufnr("%"))
3377" call Decho("browselist=".string(s:netrw_browselist))
3378 endif
3379
3380 " enable autocmd events to handle refreshing/removing local browser buffers
3381 " If local browse buffer is currently showing: refresh it
3382 " If local browse buffer is currently hidden : wipe it
3383 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
3384" call Decho("setting up local-browser shell command refresh")
3385 let s:netrw_browser_shellcmd= 1
3386 augroup AuNetrwShellCmd
3387 au!
3388 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
3389 augroup END
Bram Moolenaar8dff8182006-04-06 20:18:50 +00003390 endif
Bram Moolenaar7d47b6e2006-03-15 22:59:18 +00003391
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 Moolenaar8dff8182006-04-06 20:18:50 +00004101 " I'm afraid that I don't remember why the following line was present. It
4102 " has something to do with priority -- items that satisfy a two or more
4103 " priority patterns get preceded by two or more priority patterns: ###/
4104 " So, I want to remove priority patterns, but not ###/ directory names.
4105 " Following pattern retains just one priority pattern.
4106 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+\ze./\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004107
4108" call Dret("SetSort")
4109endfun
4110
Bram Moolenaar488c6512005-08-11 20:09:58 +00004111" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004112" SaveWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004113fun! s:SaveWinVars()
4114" call Dfunc("SaveWinVars()")
4115 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
4116 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
4117 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
4118 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
4119 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
4120 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4121 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
4122 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004123 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00004124" call Dret("SaveWinVars")
4125endfun
4126
4127" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004128" CopyWinVars: (used by Explore()) {{{2
Bram Moolenaar488c6512005-08-11 20:09:58 +00004129fun! s:CopyWinVars()
4130" call Dfunc("CopyWinVars()")
4131 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
4132 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
4133 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
4134 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
4135 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
4136 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
4137 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
4138 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 +00004139 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 +00004140" call Dret("CopyWinVars")
4141endfun
4142
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004143" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004144" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004145" To allow separate windows to have their own activities, such as
4146" Explore **/pattern, several variables have been made window-oriented.
4147" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004148" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004149" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004150fun! s:SetBufWinVars()
4151" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004152 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004153 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
4154 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
4155 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
4156 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
4157 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
4158 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
4159 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
4160 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
4161 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004162" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004163endfun
4164
4165" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004166" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004167" Matching function to BufferWinVars()
4168fun! s:UseBufWinVars()
4169" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00004170 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00004171 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
4172 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
4173 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
4174 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
4175 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
4176 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
4177 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
4178 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
4179 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
4180" call Dret("UseBufWinVars")
4181endfun
4182
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004183" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004184" RFC2396: converts %xx into characters {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004185fun! netrw#RFC2396(fname)
4186" call Dfunc("RFC2396(fname<".a:fname.">)")
4187 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
4188" call Dret("RFC2396 ".fname)
4189 return fname
4190endfun
4191
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004192" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004193" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00004194let &cpo= s:keepcpo
4195unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004196
Bram Moolenaar071d4272004-06-13 20:20:40 +00004197" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00004198" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00004199" vim:ts=8 fdm=marker