blob: 1e181d05d175571f0c7e592c9bdcd7b523c669c5 [file] [log] [blame]
Bram Moolenaar9964e462007-05-05 17:54:07 +00001" netrw.vim: Handles file transfer and remote directory listing across
2" AUTOLOAD SECTION
Bram Moolenaared39e1d2008-08-09 17:55:22 +00003" Date: Aug 08, 2008
4" Version: 132
Bram Moolenaar9964e462007-05-05 17:54:07 +00005" Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar446cb832008-06-24 21:56:24 +00007" Copyright: Copyright (C) 1999-2008 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
Bram Moolenaar446cb832008-06-24 21:56:24 +000012" *as is* and come with no warranty of any kind, either
Bram Moolenaar1afcace2005-11-25 19:54:28 +000013" 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 Moolenaar446cb832008-06-24 21:56:24 +000016"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
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 Moolenaar9964e462007-05-05 17:54:07 +000021" Load Once: {{{1
Bram Moolenaar1afcace2005-11-25 19:54:28 +000022if &cp || exists("g:loaded_netrw")
23 finish
24endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000025if !exists("s:NOTE")
26 let s:NOTE = 0
27 let s:WARNING = 1
28 let s:ERROR = 2
29endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +000030let g:loaded_netrw = "v132"
Bram Moolenaar446cb832008-06-24 21:56:24 +000031
32" sanity checks
Bram Moolenaar578b49e2005-09-10 19:22:57 +000033if v:version < 700
Bram Moolenaar9964e462007-05-05 17:54:07 +000034 call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1)
Bram Moolenaar578b49e2005-09-10 19:22:57 +000035 finish
36endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000037
Bram Moolenaar1afcace2005-11-25 19:54:28 +000038let s:keepcpo= &cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +000039setlocal cpo&vim
40"DechoTabOn
41"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000043" ======================
44" Netrw Variables: {{{1
45" ======================
46
Bram Moolenaar071d4272004-06-13 20:20:40 +000047" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000048" Netrw Constants: {{{2
49if !exists("g:NETRW_BOOKMARKMAX")
50 let g:NETRW_BOOKMARKMAX= 0
51endif
52if !exists("g:NETRW_DIRHIST_CNT")
53 let g:NETRW_DIRHIST_CNT= 0
54endif
55if !exists("s:LONGLIST")
56 let s:THINLIST = 0
57 let s:LONGLIST = 1
58 let s:WIDELIST = 2
59 let s:TREELIST = 3
60 let s:MAXLIST = 4
61endif
62
63" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000064" Default values for netrw's global protocol variables {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +000065if !exists("g:netrw_dav_cmd")
66 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar071d4272004-06-13 20:20:40 +000067endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000068if !exists("g:netrw_fetch_cmd")
69 if executable("fetch")
70 let g:netrw_fetch_cmd = "fetch -o"
71 else
72 let g:netrw_fetch_cmd = ""
73 endif
74endif
75if !exists("g:netrw_ftp_cmd")
76 let g:netrw_ftp_cmd = "ftp"
77endif
78if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +000079 if executable("elinks")
80 let g:netrw_http_cmd = "elinks"
81 let g:netrw_http_xcmd= "-dump >"
82 elseif executable("links")
83 let g:netrw_http_cmd = "links"
84 let g:netrw_http_xcmd= "-dump >"
85 elseif executable("curl")
Bram Moolenaar9964e462007-05-05 17:54:07 +000086 let g:netrw_http_cmd = "curl -o"
87 elseif executable("wget")
Bram Moolenaar1afcace2005-11-25 19:54:28 +000088 let g:netrw_http_cmd = "wget -q -O"
89 elseif executable("fetch")
90 let g:netrw_http_cmd = "fetch -o"
91 else
92 let g:netrw_http_cmd = ""
93 endif
94endif
95if !exists("g:netrw_rcp_cmd")
96 let g:netrw_rcp_cmd = "rcp"
97endif
98if !exists("g:netrw_rsync_cmd")
99 let g:netrw_rsync_cmd = "rsync"
100endif
101if !exists("g:netrw_scp_cmd")
102 let g:netrw_scp_cmd = "scp -q"
103endif
104if !exists("g:netrw_sftp_cmd")
105 let g:netrw_sftp_cmd = "sftp"
106endif
107if !exists("g:netrw_ssh_cmd")
108 let g:netrw_ssh_cmd= "ssh"
109endif
110
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000111if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000112 \ && exists("g:netrw_use_nt_rcp")
113 \ && g:netrw_use_nt_rcp
114 \ && executable( $SystemRoot .'/system32/rcp.exe')
115 let s:netrw_has_nt_rcp = 1
116 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000117else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000118 let s:netrw_has_nt_rcp = 0
119 let s:netrw_rcpmode = ''
120endif
121
122" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000123" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000124" Cygwin Detection ------- {{{3
125if !exists("g:netrw_cygwin")
126 if has("win32") || has("win95") || has("win64") || has("win16")
127 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
128 let g:netrw_cygwin= 1
129 else
130 let g:netrw_cygwin= 0
131 endif
132 else
133 let g:netrw_cygwin= 0
134 endif
135endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000136" Default values - a-c ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000137if !exists("g:netrw_alto")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000138 let g:netrw_alto= &sb
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000139endif
140if !exists("g:netrw_altv")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000141 let g:netrw_altv= &spr
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000143if !exists("g:netrw_browse_split")
144 let g:netrw_browse_split= 0
145endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000146if !exists("g:netrw_chgwin")
147 let g:netrw_chgwin = -1
148endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000149if !exists("g:netrw_compress")
150 let g:netrw_compress= "gzip"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000152if !exists("g:netrw_ctags")
153 let g:netrw_ctags= "ctags"
154endif
155" Default values - d-g ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000156if !exists("g:NETRW_DIRHIST_CNT")
157 let g:NETRW_DIRHIST_CNT= 0
158endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000159if !exists("g:netrw_decompress")
160 let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
161endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000162if !exists("g:netrw_dirhistmax")
163 let g:netrw_dirhistmax= 10
164endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000165if !exists("g:netrw_fastbrowse")
166 let g:netrw_fastbrowse= 1
167endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000168if !exists("g:netrw_ftp_browse_reject")
169 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 +0000170endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000171if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000172 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
173 let g:netrw_ftp_list_cmd = "ls -lF"
174 let g:netrw_ftp_timelist_cmd = "ls -tlF"
175 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000176 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000177 let g:netrw_ftp_list_cmd = "dir"
178 let g:netrw_ftp_timelist_cmd = "dir"
179 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000180 endif
181endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000182if !exists("g:netrw_ftpmode")
183 let g:netrw_ftpmode= "binary"
Bram Moolenaar61036992005-10-12 20:54:52 +0000184endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000185" Default values - h-lh ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000186if !exists("g:netrw_hide")
187 let g:netrw_hide= 1
Bram Moolenaar61036992005-10-12 20:54:52 +0000188endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000189if !exists("g:netrw_ignorenetrc")
190 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
191 let g:netrw_ignorenetrc= 1
192 else
193 let g:netrw_ignorenetrc= 0
194 endif
195endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000196if !exists("g:netrw_keepdir")
197 let g:netrw_keepdir= 1
198endif
199if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000200 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
201 " provide a 'pscp' listing command
202 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
203 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
204 endif
205 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
206 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000207 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000208 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000209 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000210" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000211 let g:netrw_list_cmd= ""
212 endif
213endif
214if !exists("g:netrw_list_hide")
215 let g:netrw_list_hide= ""
216endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000217" Default values - lh-lz ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000218if !exists("g:netrw_localcopycmd")
219 if has("win32") || has("win95") || has("win64") || has("win16")
220 if g:netrw_cygwin
221 let g:netrw_localcopycmd= "cp"
222 else
223 let g:netrw_localcopycmd= "copy"
224 endif
225 elseif has("unix") || has("macunix")
226 let g:netrw_localcopycmd= "cp"
227 else
228 let g:netrw_localcopycmd= ""
229 endif
230endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000231if !exists("g:netrw_local_mkdir")
232 let g:netrw_local_mkdir= "mkdir"
233endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000234if !exists("g:netrw_localmovecmd")
235 if has("win32") || has("win95") || has("win64") || has("win16")
236 if g:netrw_cygwin
237 let g:netrw_localmovecmd= "mv"
238 else
239 let g:netrw_localmovecmd= "move"
240 endif
241 elseif has("unix") || has("macunix")
242 let g:netrw_localmovecmd= "mv"
243 else
244 let g:netrw_localmovecmd= ""
245 endif
246endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000247if !exists("g:netrw_local_rmdir")
248 let g:netrw_local_rmdir= "rmdir"
249endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000250if !exists("g:netrw_liststyle")
251 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000252endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000253if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000254 " sanity check
Bram Moolenaar9964e462007-05-05 17:54:07 +0000255 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000256endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000257if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000258 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
259endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000260" Default values - m-r ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000261if !exists("g:netrw_markfileesc")
262 let g:netrw_markfileesc= '*./[\~'
263endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000264if !exists("g:netrw_maxfilenamelen")
265 let g:netrw_maxfilenamelen= 32
266endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000267if !exists("g:netrw_menu")
268 let g:netrw_menu= 1
269endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000270if !exists("g:netrw_mkdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000271 let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000272endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000273if !exists("g:netrw_mousemaps")
274 if exists("&mouse") && &mouse =~ '[anh]'
275 let g:netrw_mousemaps= 1
276 else
277 let g:netrw_mousemaps= 0
278 endif
279endif
280if !exists("g:netrw_retmap")
281 let g:netrw_retmap= 0
282endif
283if !exists("g:netrw_preview")
284 let g:netrw_preview= 0
285endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000286if !exists("g:netrw_scpport")
287 let g:netrw_scpport= "-P"
288endif
289if !exists("g:netrw_sshport")
290 let g:netrw_sshport= "-p"
291endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000292if !exists("g:netrw_rename_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000293 let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000294endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000295if !exists("g:netrw_rm_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000296 let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000297endif
298if !exists("g:netrw_rmdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000299 let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000300endif
301if !exists("g:netrw_rmf_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000302 let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000303endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000304" Default values - s ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000305 " set up shell quoting character
Bram Moolenaar843ee412004-06-30 16:16:41 +0000306if exists("g:netrw_silent") && g:netrw_silent != 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000307 let s:netrw_silentxfer= "silent "
Bram Moolenaar843ee412004-06-30 16:16:41 +0000308else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000309 let s:netrw_silentxfer= ""
Bram Moolenaar9964e462007-05-05 17:54:07 +0000310endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000311if !exists("g:netrw_sort_by")
312 " alternatives: date size
313 let g:netrw_sort_by= "name"
314endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000315if !exists("g:netrw_sort_options")
316 let g:netrw_sort_options= ""
317endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000318if !exists("g:netrw_sort_direction")
319 " alternative: reverse (z y x ...)
320 let g:netrw_sort_direction= "normal"
321endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000322if !exists("g:netrw_sort_sequence")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000323 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
324endif
325if !exists("g:netrw_special_syntax")
326 let g:netrw_special_syntax= 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000327endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000328if !exists("g:netrw_ssh_browse_reject")
329 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
330endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000331if !has("patch192")
332 if !exists("g:netrw_use_noswf")
333 let g:netrw_use_noswf= 1
334 endif
335else
336 let g:netrw_use_noswf= 0
337endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000338" Default values - t-w ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000339if !exists("g:netrw_timefmt")
340 let g:netrw_timefmt= "%c"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000341endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000342if !exists("g:netrw_xstrlen")
343 let g:netrw_xstrlen= 1
344endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000345if !exists("g:NetrwTopLvlMenu")
346 let g:NetrwTopLvlMenu= "Netrw."
347endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000348if !exists("g:netrw_use_errorwindow")
349 let g:netrw_use_errorwindow= 1
350endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000351if !exists("g:netrw_win95ftp")
352 let g:netrw_win95ftp= 1
353endif
354if !exists("g:netrw_winsize")
355 let g:netrw_winsize= ""
356endif
357" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000358" Default values for netrw's script variables: {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000359if !exists("g:netrw_fname_escape")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000360 let g:netrw_fname_escape= ' ?&;%'
361endif
362if !exists("g:netrw_glob_escape")
363 let g:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000364endif
365if !exists("g:netrw_tmpfile_escape")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000366 let g:netrw_tmpfile_escape= ' &;'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000367endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000368let s:netrw_map_escape = "<|\n\r\\\<C-V>\""
Bram Moolenaar8299df92004-07-10 09:47:34 +0000369
370" BufEnter event ignored by decho when following variable is true
371" Has a side effect that doau BufReadPost doesn't work, so
372" files read by network transfer aren't appropriately highlighted.
373"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000374
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000375" ==============================
376" Netrw Utility Functions: {{{1
377" ==============================
378
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000380" s:NetrwOptionSave: save options and set to "standard" form {{{2
381" 06/08/07 : removed call to NetrwSafeOptions(), either placed
382" immediately after NetrwOptionSave() calls in NetRead
383" and NetWrite, or after the s:NetrwEnew() call in
384" NetrwBrowse.
385" vt: normally its "w:" or "s:" (a variable type)
386fun! s:NetrwOptionSave(vt)
387" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388
Bram Moolenaar446cb832008-06-24 21:56:24 +0000389" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
390 if !exists("{a:vt}netrw_optionsave")
391 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000392 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000393" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000394 return
395 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000396" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000397
398 " Save current settings and current directory
399 let s:yykeep = @@
400 if exists("&l:acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000401 let {a:vt}netrw_acdkeep = &l:acd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000402 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000403 let {a:vt}netrw_aikeep = &l:ai
404 let {a:vt}netrw_awkeep = &l:aw
405 let {a:vt}netrw_cikeep = &l:ci
406 let {a:vt}netrw_cinkeep = &l:cin
407 let {a:vt}netrw_cinokeep = &l:cino
408 let {a:vt}netrw_comkeep = &l:com
409 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +0000410 if g:netrw_keepdir
Bram Moolenaar446cb832008-06-24 21:56:24 +0000411 let {a:vt}netrw_dirkeep = getcwd()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000412 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000413 let {a:vt}netrw_fokeep = &l:fo " formatoptions
414 let {a:vt}netrw_gdkeep = &l:gd " gdefault
415 let {a:vt}netrw_hidkeep = &l:hidden
416 let {a:vt}netrw_magickeep = &l:magic
417 let {a:vt}netrw_repkeep = &l:report
418 let {a:vt}netrw_spellkeep = &l:spell
419 let {a:vt}netrw_twkeep = &l:tw " textwidth
420 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar9964e462007-05-05 17:54:07 +0000421 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000422 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000423 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000424 if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif
425 silent! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000426
Bram Moolenaar446cb832008-06-24 21:56:24 +0000427" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000428endfun
429
430" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000431" s:NetrwOptionRestore: restore options {{{2
432fun! s:NetrwOptionRestore(vt)
433" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%"))
434 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000435" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000436" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000437 return
438 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000439 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000440
441 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000442 if exists("{a:vt}netrw_acdkeep")
443" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
444 let curdir = getcwd()
445 let &l:acd = {a:vt}netrw_acdkeep
446 unlet {a:vt}netrw_acdkeep
447 if &l:acd
448" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
449 try
450 if !exists("&l:acd") && !&l:acd
451 exe 'keepjumps lcd '.fnameescape(curdir)
452 endif
453 catch /^Vim\%((\a\+)\)\=:E472/
454 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
455 endtry
456 endif
457 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000458 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000459 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
460 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
461 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
462 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
463 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
464 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
465 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
466 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
467 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
468 if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
469 endif
470 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
471 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
472 if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif
473 if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif
474 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
475 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
476 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
477 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
478 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
479 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000480 if &directory == ""
481 " user hasn't specified a swapfile directory;
482 " netrw will temporarily set the swapfile directory
483 " to the current directory as returned by getcwd().
484 let &l:directory = getcwd()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000485 silent! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000486 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000487 unlet {a:vt}netrw_swfkeep
488 elseif &l:swf != {a:vt}netrw_swfkeep
489 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
490 silent! let &l:swf= {a:vt}netrw_swfkeep
491 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000492 endif
493 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000494 if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
495 if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000496
Bram Moolenaar446cb832008-06-24 21:56:24 +0000497" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
498" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaarc236c162008-07-13 17:41:49 +0000499" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000500" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000501endfun
502
503" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000504" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000505fun! s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000506" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
507" call Decho("window's ft=".&ft)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000508 setlocal cino=
509 setlocal com=
510 setlocal cpo-=aA
Bram Moolenaar446cb832008-06-24 21:56:24 +0000511 if exists("&acd") | setlocal noacd | endif
512 setlocal nocin noai noci magic nospell nohid wig= noaw
513 setlocal fo=nroql2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000514 setlocal tw=0
515 setlocal report=10000
516 if g:netrw_use_noswf && has("win32") && !has("win95")
517 setlocal noswf
518 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000519" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000520" call Dret("s:NetrwSafeOptions")
521endfun
522
Bram Moolenaar446cb832008-06-24 21:56:24 +0000523" ---------------------------------------------------------------------
524" netrw#NetrwClean: remove netrw {{{2
525" supports :NetrwClean -- remove netrw from first directory on runtimepath
526" :NetrwClean! -- remove netrw from all directories on runtimepath
527fun! netrw#NetrwClean(sys)
528" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
529
530 if a:sys
531 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
532 else
533 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
534 endif
535" call Decho("choice=".choice)
536 let diddel= 0
537 let diddir= ""
538
539 if choice == 1
540 for dir in split(&rtp,',')
541 if filereadable(dir."/plugin/netrwPlugin.vim")
542" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000543 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
544 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
545 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
546 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
547 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
548 if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000549 let diddir= dir
550 let diddel= diddel + 1
551 if !a:sys|break|endif
552 endif
553 endfor
554 endif
555
556 echohl WarningMsg
557 if diddel == 0
558 echomsg "netrw is either not installed or not removable"
559 elseif diddel == 1
560 echomsg "removed one copy of netrw from <".diddir.">"
561 else
562 echomsg "removed ".diddel." copies of netrw"
563 endif
564 echohl None
565
566" call Dret("netrw#NetrwClean")
567endfun
568
Bram Moolenaar9964e462007-05-05 17:54:07 +0000569" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000570" Netrw Transfer Functions: {{{1
571" ===============================
572
Bram Moolenaar071d4272004-06-13 20:20:40 +0000573" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000574" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000575" mode: =0 read remote file and insert before current line
576" =1 read remote file and insert after current line
577" =2 replace with remote file
578" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000579fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000580" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000581
Bram Moolenaar9964e462007-05-05 17:54:07 +0000582 " save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000583 call s:NetrwOptionSave("w:")
584 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000585
Bram Moolenaar9964e462007-05-05 17:54:07 +0000586 " interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000587 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000589 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000590 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000591 elseif a:mode == 2 " replace with remote file
592 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000593 elseif a:mode == 3 " skip read of file (leave as temporary)
594 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000595 else
596 exe a:mode
597 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000599 let ichoice = (a:0 == 0)? 0 : 1
600" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
601
Bram Moolenaar9964e462007-05-05 17:54:07 +0000602 " Get Temporary Filename {{{3
603 let tmpfile= s:GetTempfile("")
604 if tmpfile == ""
605" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000606 return
607 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000608
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000609 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000610
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000611 " attempt to repeat with previous host-file-etc
612 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000613" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000614 let choice = b:netrw_lastfile
615 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000616
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000617 else
618 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000619" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000620
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000621 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000622 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000623 echomsg 'NetRead Usage:'
624 echomsg ':Nread machine:path uses rcp'
625 echomsg ':Nread "machine path" uses ftp with <.netrc>'
626 echomsg ':Nread "machine id password path" uses ftp'
627 echomsg ':Nread dav://machine[:port]/path uses cadaver'
628 echomsg ':Nread fetch://machine/path uses fetch'
629 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
630 echomsg ':Nread http://[user@]machine/path uses http wget'
631 echomsg ':Nread rcp://[user@]machine/path uses rcp'
632 echomsg ':Nread rsync://machine[:port]/path uses rsync'
633 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
634 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000635 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000636 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000637
Bram Moolenaar9964e462007-05-05 17:54:07 +0000638 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000639 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000640" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000641 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 " case "..."
643 let choice=strpart(choice,1,strlen(choice)-2)
644 else
645 " case "... ... ..."
646 let choice = strpart(choice,1,strlen(choice)-1)
647 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000648
Bram Moolenaar9964e462007-05-05 17:54:07 +0000649 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650 let wholechoice = wholechoice . " " . choice
651 let ichoice = ichoice + 1
652 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000653 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000654 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000655 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000656" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000657 return
658 endif
659 let choice= a:{ichoice}
660 endwhile
661 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
662 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000663 endif
664 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000665
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000666" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000667 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000668
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000669 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000670 call s:NetrwMethod(choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000671 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000672
Bram Moolenaar446cb832008-06-24 21:56:24 +0000673 " Check if NetrwBrowse() should be handling this request
674" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000675 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000676" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000677 keepjumps call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000678" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000679 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000680 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000681
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000682 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000683 " Perform Protocol-Based Read {{{3
684 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000685 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
686 echo "(netrw) Processing your read request..."
687 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000688
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000689 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000690 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000691 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000692" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000693 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000694 " ER: on Win2K" rcp machine[.user]:file tmpfile
695 " ER: if machine contains '.' adding .user is required (use $USERNAME)
696 " ER: the tmpfile is full path: rcp sees C:\... as host C
697 if s:netrw_has_nt_rcp == 1
698 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
699 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
700 else
701 " Any way needed it machine contains a '.'
702 let uid_machine = g:netrw_machine .'.'. $USERNAME
703 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000704 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
706 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
707 else
708 let uid_machine = g:netrw_machine
709 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000710 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000711" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
712 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000713 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000714 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000715
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000717 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000718 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000719" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000720 let netrw_fname= b:netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +0000721 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000722 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000723 setlocal ff=unix
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000724 put =g:netrw_ftpmode
725" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000726 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000727 put =g:netrw_ftpextracmd
728" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000729 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000730 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
731" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000732 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000733" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1))
734 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000735 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000736" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
737 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000738 endif
739 " 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 +0000740 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000741 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000742 setlocal debug=msg
743 call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000744 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000745 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000746 call s:SaveBufVars()
747 bd!
748 if bufname("%") == "" && line("$") == 1 && getline("$") == ""
749 q!
750 endif
751 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000752 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000753 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000754
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000755 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000756 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000757 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
758 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000759" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000760 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000761 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000762 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000763 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000764 if exists("g:netrw_port") && g:netrw_port != ""
765 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000766" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000767 else
768 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000769" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000770 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000771
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000772 if exists("g:netrw_ftp") && g:netrw_ftp == 1
773 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000774" call Decho("filter input: ".getline('.'))
775 put ='\"'.s:netrw_passwd.'\"'
776" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000777 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000778 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
779" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000781
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
783 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000784" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000786 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000787 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000788" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000789 endif
790 put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000791" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000792
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000793 " perform ftp:
794 " -i : turns off interactive prompting from ftp
795 " -n unix : DON'T use <.netrc>, even though it exists
796 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000797 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000798" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000799 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000800 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
801 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000802" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000803 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000804 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000805 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000806 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000807 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
808 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000809 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000810
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000811 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000812 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000813 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000814" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000815 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000816 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000817 else
818 let useport= ""
819 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000820" call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
821 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000822 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000823 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000824
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000826 " http: NetRead Method #5 (wget) {{{3
827 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000828" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000829 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000830 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000831 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000832 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000833" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000834 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000835 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000836
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000837 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
838 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000839" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000840 if exists("g:netrw_http_xcmd")
841" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1))
842 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
843 else
844" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
845 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
846 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000847 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000848
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000849 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000850 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000851" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000852 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
853 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000854" call Decho("netrw_html<".netrw_html.">")
855" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000856" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
857 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000858 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000859" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
861 endif
862 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000863 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000864
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000866 " cadaver: NetRead Method #6 {{{3
867 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000868" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000869
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000870 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000871 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000872 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000873 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000874 if exists("g:netrw_port") && g:netrw_port != ""
875 put ='open '.g:netrw_machine.' '.g:netrw_port
876 else
877 put ='open '.g:netrw_machine
878 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000879 put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000880 put ='get '.netrw_fname.' '.tmpfile
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000881 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000882
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000883 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000884 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000885" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000886 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000887 bd!
Bram Moolenaar446cb832008-06-24 21:56:24 +0000888 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000889 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000890
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000891 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000892 " rsync: NetRead Method #7 {{{3
893 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000894" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000895" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
896 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000897 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 let b:netrw_lastfile = 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 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000902 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000903 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000904" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000906 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000907 call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000908 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000909" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000910 endif
911 if exists("g:netrw_option") && g:netrw_option == ":http"
912 let netrw_option= "http"
913 else
914 let netrw_option= "ftp"
915 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000916" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000917
Bram Moolenaar446cb832008-06-24 21:56:24 +0000918 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000919" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1))
920 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000921 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000922" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
923 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000925
Bram Moolenaar446cb832008-06-24 21:56:24 +0000926 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000928 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000929
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000930 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000931 " sftp: NetRead Method #9 {{{3
932 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000933" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000934" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
935 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000936 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000937 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000938
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000939 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000940 " Complain {{{3
941 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000942 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943 endif
944 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000945
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000946 " cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000947 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000948" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000949 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950 unlet b:netrw_fname
951 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000952 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
953" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000954 call s:NetrwDelete(fnameescape(tmpfile))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000955 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000956 call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000957
Bram Moolenaar9964e462007-05-05 17:54:07 +0000958" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000959endfun
960
961" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000962" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000963fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000964" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000965
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966 " option handling
967 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000968 call s:NetrwOptionSave("w:")
969 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000970
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000971 " Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000972 let tmpfile= s:GetTempfile("")
973 if tmpfile == ""
974" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000975 return
976 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000977
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978 if a:0 == 0
979 let ichoice = 0
980 else
981 let ichoice = 1
982 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaar9964e462007-05-05 17:54:07 +0000984 let curbufname= expand("%")
985" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000986 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000987 " For binary writes, always write entire file.
988 " (line numbers don't really make sense for that).
989 " Also supports the writing of tar and zip files.
Bram Moolenaarc236c162008-07-13 17:41:49 +0000990" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
991 silent exe "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000992 elseif g:netrw_cygwin
993 " write (selected portion of) file to temporary
994 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +0000995" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
996 silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000997 else
998 " write (selected portion of) file to temporary
Bram Moolenaarc236c162008-07-13 17:41:49 +0000999" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1000 silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001001 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001002
Bram Moolenaar9964e462007-05-05 17:54:07 +00001003 if curbufname == ""
1004 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1005 " on the temporary file's name. Deletion of the temporary file during
1006 " cleanup then causes an error message.
1007 0file!
1008 endif
1009
1010 " While choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001011 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001012
Bram Moolenaar9964e462007-05-05 17:54:07 +00001013 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014 " attempt to repeat with previous host-file-etc
1015 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001016" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 let choice = b:netrw_lastfile
1018 let ichoice= ichoice + 1
1019 else
1020 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001021
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 " Reconstruct Choice if choice starts with '"'
1023 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001024 echomsg 'NetWrite Usage:"'
1025 echomsg ':Nwrite machine:path uses rcp'
1026 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1027 echomsg ':Nwrite "machine id password path" uses ftp'
1028 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1029 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1030 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1031 echomsg ':Nwrite rcp://machine/path uses rcp'
1032 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1033 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1034 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001035 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001036 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001037
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001038 elseif match(choice,"^\"") != -1
1039 if match(choice,"\"$") != -1
1040 " case "..."
1041 let choice=strpart(choice,1,strlen(choice)-2)
1042 else
1043 " case "... ... ..."
1044 let choice = strpart(choice,1,strlen(choice)-1)
1045 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001046
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001047 while match(choice,"\"$") == -1
1048 let wholechoice= wholechoice . " " . choice
1049 let ichoice = ichoice + 1
1050 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001051 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001052 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001053 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001054" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001055 return
1056 endif
1057 let choice= a:{ichoice}
1058 endwhile
1059 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1060 endif
1061 endif
1062 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001063 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001064" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001065
Bram Moolenaar9964e462007-05-05 17:54:07 +00001066 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar446cb832008-06-24 21:56:24 +00001067 call s:NetrwMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001068
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001069 " =============
Bram Moolenaar9964e462007-05-05 17:54:07 +00001070 " Perform Protocol-Based Write {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001071 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001072 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1073 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001074" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001075 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001076
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001077 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001078 " rcp: NetWrite Method #1 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001079 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001080" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001081 if s:netrw_has_nt_rcp == 1
1082 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1083 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1084 else
1085 let uid_machine = g:netrw_machine .'.'. $USERNAME
1086 endif
1087 else
1088 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1089 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1090 else
1091 let uid_machine = g:netrw_machine
1092 endif
1093 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001094" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1095 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001096 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001097
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001098 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001099 " ftp + <.netrc>: NetWrite Method #2 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001100 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001101" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001102 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001103 new
Bram Moolenaar446cb832008-06-24 21:56:24 +00001104" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001105 setlocal ff=unix
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001106 put =g:netrw_ftpmode
1107" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001108 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001109 put =g:netrw_ftpextracmd
1110" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001111 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001112 call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
1113" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001114 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001115" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1116 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001117 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001118" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00001119" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1120 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001121 endif
1122 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1123 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001124 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001125 call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001126 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001128 endif
1129 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001130 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001131
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001132 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001133 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001134 elseif b:netrw_method == 3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001135 " Construct execution string (four lines) which will be passed through filter
1136" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001137 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001138 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001139 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001140 if exists("g:netrw_port") && g:netrw_port != ""
1141 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001142" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001143 else
1144 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001145" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001146 endif
1147 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1148 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001149" call Decho("filter input: ".getline('.'))
1150 put ='\"'.s:netrw_passwd.'\"'
1151" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001152 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001153 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1154" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001155 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001156 put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001157" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001158 " save choice/id/password for future use
1159 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001160
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001161 " perform ftp:
1162 " -i : turns off interactive prompting from ftp
1163 " -n unix : DON'T use <.netrc>, even though it exists
1164 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001165 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001166" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001167 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001168 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1169 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001170 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001171 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001172 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 let mod=1
1174 endif
1175 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001176
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001177 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001178 " scp: NetWrite Method #4 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001179 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001180" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001181 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001182 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001183 else
1184 let useport= ""
1185 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001186" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1187 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001188 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001189
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001190 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001191 " http: NetWrite Method #5 {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001192 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001193" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001194 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001195 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001196 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001197
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001198 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001199 " dav: NetWrite Method #6 (cadaver) {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001200 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001201" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001202
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001203 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001204 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001205 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001206 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001207 if exists("g:netrw_port") && g:netrw_port != ""
1208 put ='open '.g:netrw_machine.' '.g:netrw_port
1209 else
1210 put ='open '.g:netrw_machine
1211 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001212 if exists("g:netrw_uid") && exists("s:netrw_passwd")
1213 put ='user '.g:netrw_uid.' '.s:netrw_passwd
1214 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001215 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001216
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001217 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001218 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001219" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001220 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001221 bd!
1222 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001223
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001224 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001225 " rsync: NetWrite Method #7 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001226 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001227" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001228" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1229 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001230 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001231
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001232 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001233 " sftp: NetWrite Method #9 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001234 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001235" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001236 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001237 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1238 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1239 else
1240 let uid_machine = g:netrw_machine
1241 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001242 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001243 setlocal ff=unix
Bram Moolenaar9964e462007-05-05 17:54:07 +00001244 put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00001245" call Decho("filter input: ".getline('.'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001246 norm! 1Gdd
Bram Moolenaarc236c162008-07-13 17:41:49 +00001247" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1248 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001249 bd!
1250 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001251
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001252 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001253 " Complain {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001254 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001255 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001256 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001257 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001258
Bram Moolenaar9964e462007-05-05 17:54:07 +00001259 " Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001260" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001261 if s:FileReadable(tmpfile)
1262" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001263 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001264 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001265 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001266
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001267 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001268 " restore modifiability; usually equivalent to set nomod
1269 let &mod= mod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001270 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001271
Bram Moolenaar9964e462007-05-05 17:54:07 +00001272" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001273endfun
1274
1275" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001276" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001277" uses NetRead to get a copy of the file into a temporarily file,
1278" then sources that file,
1279" then removes that file.
1280fun! netrw#NetSource(...)
1281" call Dfunc("netrw#NetSource() a:0=".a:0)
1282 if a:0 > 0 && a:1 == '?'
1283 " give help
1284 echomsg 'NetSource Usage:'
1285 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1286 echomsg ':Nsource fetch://machine/path uses fetch'
1287 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1288 echomsg ':Nsource http://[user@]machine/path uses http wget'
1289 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1290 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1291 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1292 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1293 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001294 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001295 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001296 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001297 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001298" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001299 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001300" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1301 exe "so ".fnameescape(s:netrw_tmpfile)
1302" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001303 call delete(s:netrw_tmpfile)
1304 unlet s:netrw_tmpfile
1305 else
1306 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1307 endif
1308 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001309 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001310 endif
1311" call Dret("netrw#NetSource")
1312endfun
1313
1314" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001315" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001316" readcmd == %r : replace buffer with newly read file
1317" == 0r : read file at top of buffer
1318" == r : read file after current line
1319" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001320fun! s:NetrwGetFile(readcmd, tfile, method)
1321" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001322
1323 " readcmd=='t': simply do nothing
1324 if a:readcmd == 't'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001325" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001326" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001327 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001328 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001329
Bram Moolenaar9964e462007-05-05 17:54:07 +00001330 " get name of remote filename (ie. url and all)
1331 let rfile= bufname("%")
1332" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001333
Bram Moolenaar9964e462007-05-05 17:54:07 +00001334 if exists("*NetReadFixup")
1335 " for the use of NetReadFixup (not otherwise used internally)
1336 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001337 endif
1338
Bram Moolenaar9964e462007-05-05 17:54:07 +00001339 if a:readcmd[0] == '%'
1340 " get file into buffer
1341" call Decho("get file into buffer")
1342
1343 " rename the current buffer to the temp file (ie. tfile)
1344 if g:netrw_cygwin
1345 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1346 else
1347 let tfile= a:tfile
1348 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001349" call Decho("exe silent! keepalt file ".fnameescape(tfile))
1350 exe "silent! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001351
1352 " edit temporary file (ie. read the temporary file in)
1353 if rfile =~ '\.zip$'
1354" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1355 call zip#Browse(tfile)
1356 elseif rfile =~ '\.tar$'
1357" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1358 call tar#Browse(tfile)
1359 elseif rfile =~ '\.tar\.gz'
1360" call Decho("handling remote gzip-compressed tar file")
1361 call tar#Browse(tfile)
1362 elseif rfile =~ '\.tar\.bz2'
1363" call Decho("handling remote bz2-compressed tar file")
1364 call tar#Browse(tfile)
1365 else
1366" call Decho("edit temporary file")
1367 e!
1368 endif
1369
1370 " rename buffer back to remote filename
Bram Moolenaarc236c162008-07-13 17:41:49 +00001371" call Decho("exe silent! keepalt file ".fnameescape(rfile))
1372 exe "silent! keepalt file ".fnameescape(rfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001373 if a:method == 5
1374 set ft=html
1375 else
1376 filetype detect
1377 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001378" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1379 let line1 = 1
1380 let line2 = line("$")
1381
1382 elseif s:FileReadable(a:tfile)
1383 " read file after current line
1384" call Decho("read file<".a:tfile."> after current line")
1385 let curline = line(".")
1386 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001387" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
1388 exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001389 let line1= curline + 1
1390 let line2= line("$") - lastline + 1
1391
1392 else
1393 " not readable
Bram Moolenaarc236c162008-07-13 17:41:49 +00001394" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001395" call Decho("tfile<".a:tfile."> not readable")
1396 call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001397" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001398 return
1399 endif
1400
1401 " User-provided (ie. optional) fix-it-up command
1402 if exists("*NetReadFixup")
1403" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1404 call NetReadFixup(a:method, line1, line2)
1405" else " Decho
1406" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1407 endif
1408
Bram Moolenaar446cb832008-06-24 21:56:24 +00001409 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
1410 " update the Buffers menu
1411 call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001412 endif
1413
1414" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1415
1416 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001417" redraw!
1418
Bram Moolenaarc236c162008-07-13 17:41:49 +00001419" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001420" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001421endfun
1422
Bram Moolenaar9964e462007-05-05 17:54:07 +00001423" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001424" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001425" method == 1: rcp
1426" 2: ftp + <.netrc>
1427" 3: ftp + machine, id, password, and [path]filename
1428" 4: scp
1429" 5: http (wget)
1430" 6: cadaver
1431" 7: rsync
1432" 8: fetch
1433" 9: sftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001434fun! s:NetrwMethod(choice) " globals: method machine id passwd fname
1435" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001436
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001437 " initialization
1438 let b:netrw_method = 0
1439 let g:netrw_machine = ""
1440 let b:netrw_fname = ""
1441 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001442 let g:netrw_choice = a:choice
1443
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001444 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001445 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001446 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1447 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001448 " rcpurm : rcp://[user@]host/filename Use rcp
1449 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001450 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001451 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar446cb832008-06-24 21:56:24 +00001452 " davurm : dav[s]://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001453 " rsyncurm : rsync://host[:port]/path Use rsync
1454 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1455 " sftpurm : sftp://[user@]host/filename Use scp
1456 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1457 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1458 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001459 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001460 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001461 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001462 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001463 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001464 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1465 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1466 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001467
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001468" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001469 " Determine Method
1470 " rcp://user@hostname/...path-to-file
1471 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001472" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001473 let b:netrw_method = 1
1474 let userid = substitute(a:choice,rcpurm,'\1',"")
1475 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1476 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001477 if userid != ""
1478 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001479 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001480
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001481 " scp://user@hostname/...path-to-file
1482 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001483" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001484 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001485 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1486 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1487 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001488
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001489 " http://user@hostname/...path-to-file
1490 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001491" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001492 let b:netrw_method = 5
1493 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1494 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001495
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001496 " dav://hostname[:port]/..path-to-file..
1497 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001498" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001499 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001500 if a:choice =~ '^s'
1501 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1502 else
1503 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1504 endif
1505 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001506
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001507 " rsync://user@hostname/...path-to-file
1508 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001509" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001510 let b:netrw_method = 7
1511 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1512 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001513
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001514 " ftp://[user@]hostname[[:#]port]/...path-to-file
1515 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001516" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001517 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001518 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1519 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1520 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001521 if userid != ""
1522 let g:netrw_uid= userid
1523 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001524 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001525 let b:netrw_method = 3
1526 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001527 if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001528 let b:netrw_method= 2
1529 else
1530 if !exists("g:netrw_uid") || g:netrw_uid == ""
1531 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001532 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001533 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001534 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001535 endif
1536 let b:netrw_method= 3
1537 endif
1538 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001539
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001540 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001541" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001542 let b:netrw_method = 8
1543 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1544 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1545 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1546 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001547
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001548 " Issue an ftp : "machine id password [path/]filename"
1549 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001550" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001551 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001552 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1553 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001554 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001555 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001556
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001557 " Issue an ftp: "hostname [path/]filename"
1558 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001559" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001560 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001561 let b:netrw_method = 3
1562 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1563 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001564
Bram Moolenaar9964e462007-05-05 17:54:07 +00001565 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001566 let b:netrw_method = 2
1567 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1568 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1569 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001570
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001571 " sftp://user@hostname/...path-to-file
1572 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001573" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001574 let b:netrw_method = 9
1575 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1576 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001577
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001578 " Issue an rcp: hostname:filename" (this one should be last)
1579 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001580" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001581 let b:netrw_method = 1
1582 let userid = substitute(a:choice,rcphf,'\2',"")
1583 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1584 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001585" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1586" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1587" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1588" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001589 if userid != ""
1590 let g:netrw_uid= userid
1591 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001592
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001593 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001594 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001595 call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001596 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001597 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001598 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00001599
1600 " remove any leading [:#] from port number
1601 if g:netrw_port != ""
1602 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1603 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001604
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001605" call Decho("a:choice <".a:choice.">")
1606" call Decho("b:netrw_method <".b:netrw_method.">")
1607" call Decho("g:netrw_machine<".g:netrw_machine.">")
1608" call Decho("g:netrw_port <".g:netrw_port.">")
1609" if exists("g:netrw_uid") "Decho
1610" call Decho("g:netrw_uid <".g:netrw_uid.">")
1611" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001612" if exists("s:netrw_passwd") "Decho
1613" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001614" endif "Decho
1615" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001616" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001617endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001618
1619" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001620" NetReadFixup: this sort of function is typically written by the user {{{2
1621" to handle extra junk that their system's ftp dumps
1622" into the transfer. This function is provided as an
1623" example and as a fix for a Windows 95 problem: in my
1624" experience, win95's ftp always dumped four blank lines
1625" at the end of the transfer.
1626if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1627 fun! NetReadFixup(method, line1, line2)
1628" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
1629 if method == 3 " ftp (no <.netrc>)
1630 let fourblanklines= line2 - 3
1631 silent fourblanklines.",".line2."g/^\s*/d"
1632 endif
1633" call Dret("NetReadFixup")
1634 endfun
1635endif
1636
1637" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001638" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001639" Usage: :call NetUserPass() -- will prompt for userid and password
1640" :call NetUserPass("uid") -- will prompt for password
1641" :call NetUserPass("uid","password") -- sets global userid and password
1642fun! NetUserPass(...)
1643
1644 " get/set userid
1645 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001646" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001647 if !exists("g:netrw_uid") || g:netrw_uid == ""
1648 " via prompt
1649 let g:netrw_uid= input('Enter username: ')
1650 endif
1651 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001652" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001653 let g:netrw_uid= a:1
1654 endif
1655
1656 " get password
1657 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001658" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001659 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001660 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001661" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001662 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001663 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001664
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001665" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001666endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001667
Bram Moolenaar9964e462007-05-05 17:54:07 +00001668" ===========================================
1669" Shared Browsing Support: {{{1
1670" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001671
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001672" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001673" s:BrowserMaps: {{{2
1674fun! s:BrowserMaps(islocal)
1675" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1676 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001677" call Decho("make local maps")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001678 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1679 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1680 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1681 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1682 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1683 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1684 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1685 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1686 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1687 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1688 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1689 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1690 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1691 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1692 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1693 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1694 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1695 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1696 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1697 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
1698 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1699 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001700 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001701 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1702 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1703 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1704 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1705 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1706 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1707 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1708 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1709 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1710 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
1711 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001712 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001713 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1714 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr>
1715 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr>
1716 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1717 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001718 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001719 if !hasmapto('<Plug>NetrwHideEdit')
1720 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
1721 endif
1722 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1723 if !hasmapto('<Plug>NetrwRefresh')
1724 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
1725 endif
1726 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001727 if s:didstarstar || !mapcheck("<s-down>","n")
1728 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
1729 endif
1730 if s:didstarstar || !mapcheck("<s-up>","n")
1731 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
1732 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001733 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001734 if g:netrw_mousemaps == 1
1735 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1736 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1737 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001738 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1739 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001740 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001741 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1742 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1743 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1744 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1745 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1746 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001747 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
1748 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001749
Bram Moolenaar9964e462007-05-05 17:54:07 +00001750 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001751" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001752 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001753 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1754 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1755 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1756 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
1757 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1758 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1759 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1760 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1761 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1762 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1763 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1764 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1765 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1766 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1767 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1768 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1769 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1770 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1771 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1772 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1773 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
1774 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001775 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001776 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
1777 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
1778 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
1779 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1780 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
1781 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1782 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1783 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1784 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1785 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001786 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001787 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
1788 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr>
1789 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr>
1790 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
1791 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001792 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001793 if !hasmapto('<Plug>NetrwHideEdit')
1794 nmap <buffer> <c-h> <Plug>NetrwHideEdit
1795 endif
1796 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
1797 if !hasmapto('<Plug>NetrwRefresh')
1798 nmap <buffer> <c-l> <Plug>NetrwRefresh
1799 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001800
1801 let mapsafepath = escape(s:path, s:netrw_map_escape)
1802 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
1803
Bram Moolenaar446cb832008-06-24 21:56:24 +00001804 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1805 if g:netrw_mousemaps == 1
1806 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
1807 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
1808 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001809 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1810 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001811 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001812 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1813 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1814 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
1815 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1816 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1817 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1818 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001819 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001820 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001821 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001822" call Dret("s:BrowserMaps")
1823endfun
1824
1825" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001826" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1827fun! s:ExplorePatHls(pattern)
1828" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
1829 let repat= substitute(a:pattern,'^**/\{1,2}','','')
1830" call Decho("repat<".repat.">")
1831 let repat= escape(repat,'][.\')
1832" call Decho("repat<".repat.">")
1833 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
1834" call Dret("s:ExplorePatHls repat<".repat.">")
1835 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00001836endfun
1837
1838" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001839" s:NetrwBookmarkDir: {{{2
1840" 0: (user: <mb>) bookmark current directory
1841" 1: (user: <gb>) change to the bookmarked directory
1842" 2: (user: <qb>) list bookmarks
1843" 3: (browsing) record current directory history
1844" 4: (user: <u>) go up (previous) bookmark
1845" 5: (user: <U>) go down (next) bookmark
1846" 6: (user: <mB>) delete bookmark
1847fun! s:NetrwBookmarkDir(chg,curdir)
1848" call Dfunc("NetrwBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." bookmax=".g:NETRW_BOOKMARKMAX." histmax=".g:netrw_dirhistmax)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001849
1850 if a:chg == 0
1851 " bookmark the current directory
1852" call Decho("(user: <b>) bookmark the current directory")
1853 if v:count > 0
1854 " handle bookmark# specified via the count
1855 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1856 if !exists("g:NETRW_BOOKMARKMAX")
1857 let g:NETRW_BOOKMARKMAX= v:count
1858 elseif v:count > g:NETRW_BOOKMARKMAX
1859 let g:NETRW_BOOKMARKMAX= v:count
1860 endif
1861 else
1862 " handle no count specified
1863 let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
1864 let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
1865 endif
1866 echo "bookmarked the current directory"
1867
1868 elseif a:chg == 1
1869 " change to the bookmarked directory
1870" call Decho("(user: <B>) change to the bookmarked directory")
1871 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001872 exe "e ".fnameescape(g:NETRW_BOOKMARKDIR_{v:count})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001873 else
1874 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1875 endif
1876
1877 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00001878" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00001879 let didwork= 0
1880 " list user's bookmarks
1881" call Decho("(user: <q>) list user's bookmarks")
1882 if exists("g:NETRW_BOOKMARKMAX")
1883" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1884 let cnt= 0
1885 while cnt <= g:NETRW_BOOKMARKMAX
1886 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1887" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1888 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1889 let didwork= 1
1890 endif
1891 let cnt= cnt + 1
1892 endwhile
1893 endif
1894
1895 " list directory history
1896 let cnt = g:NETRW_DIRHIST_CNT
1897 let first = 1
1898 let histcnt = 0
1899 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1900" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1901 let histcnt= histcnt + 1
1902 if exists("g:NETRW_DIRHIST_{cnt}")
1903" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1904 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
1905 let didwork= 1
1906 endif
1907 let first = 0
1908 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1909 if cnt < 0
1910 let cnt= cnt + g:netrw_dirhistmax
1911 endif
1912 endwhile
1913 if didwork
1914 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
1915 endif
1916
1917 elseif a:chg == 3
1918 " saves most recently visited directories (when they differ)
1919" call Decho("(browsing) record curdir history")
1920 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
1921 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1922" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1923 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
1924" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1925 endif
1926
1927 elseif a:chg == 4
1928 " u: change to the previous directory stored on the history list
1929" call Decho("(user: <u>) chg to prev dir from history")
1930 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1931 if g:NETRW_DIRHIST_CNT < 0
1932 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1933 endif
1934 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1935" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1936 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1937 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001938" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001939 %d
1940 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001941" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001942 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001943" " call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1944 exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001945 else
1946 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1947 echo "Sorry, no predecessor directory exists yet"
1948 endif
1949
1950 elseif a:chg == 5
1951 " U: change to the subsequent directory stored on the history list
1952" call Decho("(user: <U>) chg to next dir from history")
1953 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1954 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1955" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1956 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1957 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001958" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001959 %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00001960" call Decho("removed all lines from buffer (%d)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001961 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001962" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001963 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001964" call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1965 exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001966 else
1967 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1968 if g:NETRW_DIRHIST_CNT < 0
1969 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1970 endif
1971 echo "Sorry, no successor directory exists yet"
1972 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001973
1974 elseif a:chg == 6
1975 if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
1976 " delete the v:count'th bookmark
1977" call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
1978 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1979 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1980
1981 elseif v:count > 0
1982" call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
1983 let cnt= v:count
1984 while cnt < g:NETRW_BOOKMARKMAX
1985 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1986 let cnt = cnt + 1
1987 endwhile
1988 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1989 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1990
1991 elseif exists("b:netrw_curdir")
1992 " look for current directory amongst the bookmarks and remove that bookmark
1993" call Decho("search for bookmark<".b:netrw_curdir.">")
1994 let cnt= 1
1995 while cnt <= g:NETRW_BOOKMARKMAX
1996" call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
1997 if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
1998 if cnt < g:NETRW_BOOKMARKMAX
1999" call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
2000 while cnt < g:NETRW_BOOKMARMAX
2001 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
2002 let cnt = cnt + 1
2003 endwhile
2004 endif
2005 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
2006 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
2007 endif
2008 let cnt= cnt + 1
2009 endwhile
2010 endif
2011
Bram Moolenaar9964e462007-05-05 17:54:07 +00002012 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002013 call s:NetrwBookmarkMenu()
2014" call Dret("NetrwBookmarkDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002015endfun
2016
2017" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002018" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2019" list of the contents of a local or remote directory. It is assumed that the
2020" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2021" with the requested remote hostname first.
2022fun! s:NetrwBrowse(islocal,dirname)
2023 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2024" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
2025" call Decho("tab#".tabpagenr()." win#".winnr())
2026" call Dredir("ls!")
2027
2028 if exists("s:netrw_skipbrowse")
2029 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002030" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002031" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2032 return
2033 endif
2034 if !exists("*shellescape")
2035 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2036" call Dret("s:NetrwBrowse : missing shellescape()")
2037 return
2038 endif
2039 if !exists("*fnameescape")
2040 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2041" call Dret("s:NetrwBrowse : missing fnameescape()")
2042 return
2043 endif
2044
2045 call s:NetrwOptionSave("w:")
2046 call s:NetrwSafeOptions()
2047
2048 " re-instate any marked files
2049 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2050" call Decho("clearing marked files")
2051 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2052 endif
2053
2054 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2055" call Decho("handle w:netrw_acdkeep:")
2056" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
2057 exe 'keepjumps lcd '.fnameescape(a:dirname)
2058" call Decho("getcwd<".getcwd().">")
2059
2060 elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
2061 " looks like a regular file, attempt transfer
2062" call Decho("attempt transfer as regular file<".a:dirname.">")
2063
2064 " remove any filetype indicator from end of dirname, except for the {{{3
2065 " "this is a directory" indicator (/).
2066 " There shouldn't be one of those here, anyway.
2067 let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
2068" call Decho("new path<".path.">")
2069 call s:RemotePathAnalysis(a:dirname)
2070
2071 " remote-read the requested file into current buffer {{{3
2072 mark '
2073 call s:NetrwEnew(a:dirname)
2074 setlocal ma noro
2075" call Decho("setlocal ma noro")
2076 let b:netrw_curdir= a:dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002077" call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
2078 exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2079 exe "silent keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002080 silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
2081 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
2082 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaarc236c162008-07-13 17:41:49 +00002083 exe "silent keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002084 endif
2085
2086 " save certain window-oriented variables into buffer-oriented variables {{{3
2087 call s:SetBufWinVars()
2088 call s:NetrwOptionRestore("w:")
2089 setlocal ma nomod
2090
Bram Moolenaarc236c162008-07-13 17:41:49 +00002091" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002092" call Dret("s:NetrwBrowse : file<".s:fname.">")
2093 return
2094 endif
2095
2096 " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
2097 call s:UseBufWinVars()
2098
2099 " set up some variables {{{3
2100 let b:netrw_browser_active = 1
2101 let dirname = a:dirname
2102 let s:last_sort_by = g:netrw_sort_by
2103
2104 " set up menu {{{3
2105 call s:NetrwMenu(1)
2106
2107 " set up buffer {{{3
2108 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2109 " maintain markfile highlighting
2110 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2111" call Decho("bufnr(%)=".bufnr('%'))
2112" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2113 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2114 else
2115" call Decho("2match none")
2116 2match none
2117 endif
2118 if reusing
2119 call s:NetrwOptionRestore("w:")
2120 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002121" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002122" call Dret("s:NetrwBrowse : re-using buffer")
2123 return
2124 endif
2125
2126 " set b:netrw_curdir to the new directory name {{{3
2127" call Decho("set b:netrw_curdir to the new directory name:")
2128 let b:netrw_curdir= dirname
2129 if b:netrw_curdir =~ '[/\\]$'
2130 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2131 endif
2132 if b:netrw_curdir == ''
2133 if has("amiga")
2134 " On the Amiga, the empty string connotes the current directory
2135 let b:netrw_curdir= getcwd()
2136 else
2137 " under unix, when the root directory is encountered, the result
2138 " from the preceding substitute is an empty string.
2139 let b:netrw_curdir= '/'
2140 endif
2141 endif
2142 if !a:islocal && b:netrw_curdir !~ '/$'
2143 let b:netrw_curdir= b:netrw_curdir.'/'
2144 endif
2145" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2146
2147 " ------------
2148 " (local only) {{{3
2149 " ------------
2150 if a:islocal
2151" call Decho("local only:")
2152
2153 " Set up ShellCmdPost handling. Append current buffer to browselist
2154 call s:LocalFastBrowser()
2155
2156 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2157 if !g:netrw_keepdir
2158" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2159" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2160 if !exists("&l:acd") || !&l:acd
2161" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2162 try
2163 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
2164 catch /^Vim\%((\a\+)\)\=:E472/
2165 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2166 if exists("w:netrw_prvdir")
2167 let b:netrw_curdir= w:netrw_prvdir
2168 else
2169 call s:NetrwOptionRestore("w:")
2170 setlocal noma nomod nowrap
2171 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002172" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002173" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2174 return
2175 endif
2176 endtry
2177 endif
2178 endif
2179
2180 " --------------------------------
2181 " remote handling: {{{3
2182 " --------------------------------
2183 else
2184" call Decho("remote only:")
2185
2186 " analyze a:dirname and g:netrw_list_cmd {{{4
2187" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
2188 if a:dirname =~ "^NetrwTreeListing\>"
2189 let dirname= b:netrw_curdir
2190" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
2191 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2192 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2193 if dirname !~ '/$'
2194 let dirname= dirname.'/'
2195 endif
2196 let b:netrw_curdir = dirname
2197" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2198 else
2199 let dirname = substitute(a:dirname,'\\','/','g')
2200" call Decho("(normal) dirname<".dirname.">")
2201 endif
2202
2203 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2204 if dirname !~ dirpat
2205 if !exists("g:netrw_quiet")
2206 call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
2207 endif
2208 call s:NetrwOptionRestore("w:")
2209 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002210" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002211" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2212 return
2213 endif
2214 let b:netrw_curdir= dirname
2215" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2216 endif " (additional remote handling)
2217
2218 " -----------------------
2219 " Directory Listing: {{{3
2220 " -----------------------
2221 call s:BrowserMaps(a:islocal)
2222 call s:PerformListing(a:islocal)
2223
Bram Moolenaarc236c162008-07-13 17:41:49 +00002224" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002225" call Dret("s:NetrwBrowse : did PerformListing")
2226 return
2227endfun
2228
2229" ---------------------------------------------------------------------
2230" s:NetrwFileInfo: supports qf (query for file information) {{{2
2231fun! s:NetrwFileInfo(islocal,fname)
2232" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2233 if a:islocal
2234 if (has("unix") || has("macunix")) && executable("/bin/ls")
2235 if exists("b:netrw_curdir")
2236" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2237 if b:netrw_curdir =~ '/$'
2238 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2239 else
2240 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2241 endif
2242 else
2243" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2244 echo system("/bin/ls -lsad ".shellescape(a:fname))
2245 endif
2246 else
2247 " use vim functions to return information about file below cursor
2248" call Decho("using vim functions to query for file info")
2249 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2250 let fname= substitute(a:fname,".$","","")
2251 else
2252 let fname= a:fname
2253 endif
2254 let t = getftime(fname)
2255 let sz = getfsize(fname)
2256 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2257" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2258 endif
2259 else
2260 echo "sorry, \"qf\" not supported yet for remote files"
2261 endif
2262" call Dret("s:NetrwFileInfo")
2263endfun
2264
2265" ---------------------------------------------------------------------
2266" s:NetrwGetBuffer: {{{2
2267" returns 0=cleared buffer
2268" 1=re-used buffer
2269fun! s:NetrwGetBuffer(islocal,dirname)
2270" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2271 let dirname= a:dirname
2272
2273 " re-use buffer if possible {{{3
2274" call Decho("--re-use a buffer if possible--")
2275 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2276 " find NetrwTreeList buffer if there is one
2277 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2278" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2279 let eikeep= &ei
2280 set ei=all
2281 exe "b ".w:netrw_treebufnr
2282 let &ei= eikeep
2283" call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
2284 return
2285 endif
2286 let bufnum= -1
2287" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2288
2289 else
2290 " find buffer number of buffer named precisely the same as dirname {{{3
2291" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2292" call Dredir("ls!")
2293
2294 " get dirname and associated buffer number
2295 let bufnum = bufnr(escape(dirname,'\'))
2296" call Decho(" find buffer<".dirname.">'s number ")
2297" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2298
2299 if bufnum < 0 && dirname !~ '/$'
2300 " trying appending a trailing /
2301" call Decho(" try appending a trailing / to dirname<".dirname.">")
2302 let bufnum= bufnr(escape(dirname.'/','\'))
2303 if bufnum > 0
2304 let dirname= dirname.'/'
2305 endif
2306 endif
2307
2308 if bufnum < 0 && dirname =~ '/$'
2309 " trying removing a trailing /
2310" call Decho(" try removing a trailing / from dirname<".dirname.">")
2311 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2312 if bufnum > 0
2313 let dirname= substitute(dirname,'/$','','')
2314 endif
2315 endif
2316
2317" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2318 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2319 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2320 " handle approximate matches
Bram Moolenaarc236c162008-07-13 17:41:49 +00002321" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx=dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002322 let ibuf = 1
2323 let buflast = bufnr("$")
2324" call Decho(" findbuf2: buflast=".buflast)
2325 while ibuf <= buflast
2326 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002327 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002328" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002329 if bname != '' && dirname =~ '/'.bname.'/\=$' | break | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002330 if bname =~ '^'.dirname.'/\=$' | break | endif
2331 if dirname =~ '^'.bname.'/$' | break | endif
2332 let ibuf= ibuf + 1
2333 endwhile
2334 if ibuf > buflast
2335 let bufnum= -1
2336 else
2337 let bufnum= ibuf
2338 endif
2339" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2340 endif
2341 endif
2342
2343 " get enew buffer and name it -or- re-use buffer {{{3
2344" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")")
2345 mark '
2346 if bufnum < 0 || !bufexists(bufnum)
2347 call s:NetrwEnew(dirname)
2348" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2349 " name the buffer
2350 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2351 " Got enew buffer; transform into a NetrwTreeListing
2352" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2353 if !exists("s:netrw_treelistnum")
2354 let s:netrw_treelistnum= 1
2355 else
2356 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2357 endif
2358 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002359" call Decho(" exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
2360 exe 'silent! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002361 nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
2362 nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
2363 nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr>
2364 nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr>
2365" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2366 else
2367" let v:errmsg= "" " Decho
2368 let escdirname= fnameescape(dirname)
2369" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002370" call Decho(' exe silent! keepalt file '.escdirname)
2371 exe 'silent! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002372" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2373 endif
2374" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2375
2376 else " Re-use the buffer
2377" call Decho("--re-use buffer#".bufnum.": --")
2378 let eikeep= &ei
2379 set ei=all
2380 if getline(2) =~ '^" Netrw Directory Listing'
2381" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
2382 exe "keepalt b ".bufnum
2383 else
2384" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
2385 exe "b ".bufnum
2386 endif
2387 if bufname("%") == '.'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002388" call Decho("exe silent! keepalt file ".fnameescape(getcwd()))
2389 exe "silent! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002390 endif
2391 let &ei= eikeep
2392 if line("$") <= 1
2393 call s:NetrwListSettings(a:islocal)
2394" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2395 return 0
2396 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2397" call Decho("--re-use tree listing--")
2398" call Decho(" clear buffer<".expand("%")."> with :%d")
2399 silent %d
2400 call s:NetrwListSettings(a:islocal)
2401" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2402 return 0
2403 else
2404" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2405 return 1
2406 endif
2407 endif
2408
2409 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2410 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2411 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2412 " med 1 D H
2413 " fast 2 H H
2414" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--")
2415 let fname= expand("%")
2416 call s:NetrwListSettings(a:islocal)
Bram Moolenaarc236c162008-07-13 17:41:49 +00002417" call Decho("exe keepalt file ".fnameescape(fname))
2418 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002419
2420 " delete all lines from buffer {{{3
2421" call Decho("--delete all lines from buffer--")
2422" call Decho(" clear buffer<".expand("%")."> with :%d")
2423 keepalt silent! %d
2424
2425" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2426 return 0
2427endfun
2428
2429" ---------------------------------------------------------------------
2430" s:NetrwGetcwd: get the current directory. {{{2
2431" Change backslashes to forward slashes, if any.
2432" If doesc is true, escape certain troublesome characters
2433fun! s:NetrwGetcwd(doesc)
2434" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2435 let curdir= substitute(getcwd(),'\\','/','ge')
2436 if curdir !~ '[\/]$'
2437 let curdir= curdir.'/'
2438 endif
2439 if a:doesc
2440 let curdir= fnameescape(curdir)
2441 endif
2442" call Dret("NetrwGetcwd <".curdir.">")
2443 return curdir
2444endfun
2445
2446" ---------------------------------------------------------------------
2447" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2448fun! s:NetrwGetWord()
2449" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2450 call s:UseBufWinVars()
2451
2452 " insure that w:netrw_liststyle is set up
2453 if !exists("w:netrw_liststyle")
2454 if exists("g:netrw_liststyle")
2455 let w:netrw_liststyle= g:netrw_liststyle
2456 else
2457 let w:netrw_liststyle= s:THINLIST
2458 endif
2459" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2460 endif
2461
2462 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2463 " Active Banner support
2464" call Decho("active banner handling")
2465 norm! 0
2466 let dirname= "./"
2467 let curline= getline('.')
2468
2469 if curline =~ '"\s*Sorted by\s'
2470 norm s
2471 let s:netrw_skipbrowse= 1
2472 echo 'Pressing "s" also works'
2473
2474 elseif curline =~ '"\s*Sort sequence:'
2475 let s:netrw_skipbrowse= 1
2476 echo 'Press "S" to edit sorting sequence'
2477
2478 elseif curline =~ '"\s*Quick Help:'
2479 norm ?
2480 let s:netrw_skipbrowse= 1
2481 echo 'Pressing "?" also works'
2482
2483 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
2484 norm a
2485 let s:netrw_skipbrowse= 1
2486 echo 'Pressing "a" also works'
2487
2488 elseif line("$") > w:netrw_bannercnt
2489 exe 'silent keepjumps '.w:netrw_bannercnt
2490 endif
2491
2492 elseif w:netrw_liststyle == s:THINLIST
2493" call Decho("thin column handling")
2494 norm! 0
2495 let dirname= getline('.')
2496
2497 elseif w:netrw_liststyle == s:LONGLIST
2498" call Decho("long column handling")
2499 norm! 0
2500 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2501
2502 elseif w:netrw_liststyle == s:TREELIST
2503" call Decho("treelist handling")
2504 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2505
2506 else
2507" call Decho("obtain word from wide listing")
2508 let dirname= getline('.')
2509
2510 if !exists("b:netrw_cpf")
2511 let b:netrw_cpf= 0
2512 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2513" call Decho("computed cpf=".b:netrw_cpf)
2514 endif
2515
2516" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2517 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2518" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2519" call Decho("1: dirname<".dirname.">")
2520 if filestart == 0
2521 norm! 0ma
2522 else
2523 call cursor(line("."),filestart+1)
2524 norm! ma
2525 endif
2526 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002527 let eofname= filestart + b:netrw_cpf + 1
2528 if eofname <= col("$")
2529 call cursor(line("."),filestart+b:netrw_cpf+1)
2530 norm! "ay`a
2531 else
2532 norm! "ay$
2533 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002534 let dirname = @a
2535 let @a = rega
2536" call Decho("2: dirname<".dirname.">")
2537 let dirname= substitute(dirname,'\s\+$','','e')
2538" call Decho("3: dirname<".dirname.">")
2539 endif
2540
2541 " symlinks are indicated by a trailing "@". Remove it before further processing.
2542 let dirname= substitute(dirname,"@$","","")
2543
2544 " executables are indicated by a trailing "*". Remove it before further processing.
2545 let dirname= substitute(dirname,"\*$","","")
2546
2547" call Dret("s:NetrwGetWord <".dirname.">")
2548 return dirname
2549endfun
2550
2551" ---------------------------------------------------------------------
2552" s:NetrwListSettings: {{{2
2553fun! s:NetrwListSettings(islocal)
2554" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2555 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002556" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002557 setlocal bt=nofile nobl ma nonu nowrap noro
2558" call Decho("exe keepalt file ".fnameescape(fname))
2559 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002560 if g:netrw_use_noswf
2561 setlocal noswf
2562 endif
2563" call Dredir("ls!")
2564" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2565 exe "setlocal ts=".g:netrw_maxfilenamelen
2566 setlocal isk+=.,~,-
2567 if g:netrw_fastbrowse > a:islocal
2568 setlocal bh=hide
2569 else
2570 setlocal bh=delete
2571 endif
2572" call Dret("s:NetrwListSettings")
2573endfun
2574
2575" ---------------------------------------------------------------------
2576" s:NetrwListStyle: {{{2
2577" islocal=0: remote browsing
2578" =1: local browsing
2579fun! s:NetrwListStyle(islocal)
2580" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2581 let fname = s:NetrwGetWord()
2582 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2583 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2584" call Decho("fname<".fname.">")
2585" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2586" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2587
2588 if w:netrw_liststyle == s:THINLIST
2589 " use one column listing
2590" call Decho("use one column list")
2591 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2592
2593 elseif w:netrw_liststyle == s:LONGLIST
2594 " use long list
2595" call Decho("use long list")
2596 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2597
2598 elseif w:netrw_liststyle == s:WIDELIST
2599 " give wide list
2600" call Decho("use wide list")
2601 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2602
2603 elseif w:netrw_liststyle == s:TREELIST
2604" call Decho("use tree list")
2605 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2606
2607 else
2608 call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2609 let g:netrw_liststyle = s:THINLIST
2610 let w:netrw_liststyle = g:netrw_liststyle
2611 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2612 endif
2613 setlocal ma noro
2614" call Decho("setlocal ma noro")
2615
2616 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2617" call Decho("clear buffer<".expand("%")."> with :%d")
2618 %d
2619
2620 " refresh the listing
2621 let svpos= netrw#NetrwSavePosn()
2622 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2623 call netrw#NetrwRestorePosn(svpos)
2624
2625 " keep cursor on the filename
2626 silent keepjumps $
2627 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2628" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2629 if result <= 0 && exists("w:netrw_bannercnt")
2630 exe "keepjumps ".w:netrw_bannercnt
2631 endif
2632
2633" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2634endfun
2635
2636" ---------------------------------------------------------------------
2637" s:NetrwBookmarkMenu: Uses menu priorities {{{2
2638" .2.[cnt] for bookmarks, and
2639" .3.[cnt] for history
2640" (see s:NetrwMenu())
2641fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002642 if !exists("s:netrw_menucnt")
2643 return
2644 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002645" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
2646
2647 " the following test assures that gvim is running, has menus available, and has menus enabled.
2648 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00002649 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002650" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
2651 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002652 endif
2653
2654 " show bookmarked places
Bram Moolenaar446cb832008-06-24 21:56:24 +00002655 let cnt = 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002656 while cnt <= g:NETRW_BOOKMARKMAX
2657 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002658 let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
2659" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.bmdir)
2660 exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002661 endif
2662 let cnt= cnt + 1
2663 endwhile
2664
2665 " show directory browsing history
2666 let cnt = g:NETRW_DIRHIST_CNT
2667 let first = 1
2668 let histcnt = 0
2669 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2670 let histcnt = histcnt + 1
2671 let priority = g:NETRW_DIRHIST_CNT + histcnt
2672 if exists("g:NETRW_DIRHIST_{cnt}")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002673 let bmdir= escape(g:NETRW_DIRHIST_{cnt},'/&? ')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002674" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir)
2675 exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002676 endif
2677 let first = 0
2678 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2679 if cnt < 0
2680 let cnt= cnt + g:netrw_dirhistmax
2681 endif
2682 endwhile
2683 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002684" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002685endfun
2686
2687" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002688" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
2689" directory and a new directory name. Also, if the
2690" "new directory name" is actually a file,
2691" NetrwBrowseChgDir() edits the file.
2692fun! s:NetrwBrowseChgDir(islocal,newdir,...)
2693" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002694
Bram Moolenaar446cb832008-06-24 21:56:24 +00002695 if !exists("b:netrw_curdir")
2696 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
2697 " and the current window is the NetrwMessage window.
2698" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
2699" call Decho("getcwd<".getcwd().">")
2700" call Dredir("ls!")
2701" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002702 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00002703 endif
2704
Bram Moolenaar446cb832008-06-24 21:56:24 +00002705 call s:NetrwOptionSave("s:")
2706 call s:NetrwSafeOptions()
2707 let nbcd_curpos = netrw#NetrwSavePosn()
2708 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
2709 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
2710 let newdir = a:newdir
2711 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002712
Bram Moolenaar446cb832008-06-24 21:56:24 +00002713 " set up o/s-dependent directory recognition pattern
2714 if has("amiga")
2715 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002716 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002717 let dirpat= '[\/]$'
2718 endif
2719" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
2720
2721 if dirname !~ dirpat
2722 " apparently vim is "recognizing" that it is in a directory and
2723 " is removing the trailing "/". Bad idea, so I put it back.
2724 let dirname= dirname.'/'
2725" call Decho("adjusting dirname<".dirname.">")
2726 endif
2727
2728 if newdir !~ dirpat
2729 " ------------
2730 " edit a file:
2731 " ------------
2732" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2733 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2734 let dirname= s:NetrwTreeDir()
2735 if dirname =~ '/$'
2736 let dirname= dirname.newdir
2737 else
2738 let dirname= s:NetrwTreeDir()."/".newdir
2739 endif
2740" call Decho("tree listing")
2741 elseif newdir =~ '^\(/\|\a:\)'
2742 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00002743 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002744 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002745 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002746" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
2747 " this lets NetrwBrowseX avoid the edit
2748 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002749" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
2750 call s:NetrwOptionRestore("s:")
2751 if !exists("s:didsplit")
2752 if g:netrw_browse_split == 1
2753 new
2754 wincmd _
2755 elseif g:netrw_browse_split == 2
2756 rightb vert new
2757 wincmd |
2758 elseif g:netrw_browse_split == 3
2759 tabnew
2760 elseif g:netrw_browse_split == 4
2761 if s:NetrwPrevWinOpen(2) == 3
2762" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002763 return
2764 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002765 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002766 " handling a file, didn't split, so remove menu
2767" call Decho("handling a file+didn't split, so remove menu")
2768 call s:NetrwMenu(0)
2769 " optional change to window
2770 if g:netrw_chgwin >= 1
2771 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002772 endif
2773 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002774 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002775 " the point where netrw actually edits the (local) file
2776 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
2777 if a:islocal
2778" call Decho("edit local file: exe e! ".fnameescape(dirname))
2779 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002780 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002781" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002782 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002783 let dolockout= 1
2784 endif
2785
2786 elseif newdir =~ '^/'
2787 " ---------------------------------
2788 " just go to the new directory spec
2789 " ---------------------------------
2790" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
2791 let dirname= newdir
2792 call s:SetRexDir(a:islocal,dirname)
2793 call s:NetrwOptionRestore("s:")
2794
2795 elseif newdir == './'
2796 " --------------------------
2797 " refresh the directory list
2798 " --------------------------
2799" call Decho('case "refresh directory listing": newdir == "./"')
2800 call s:SetRexDir(a:islocal,dirname)
2801
2802 elseif newdir == '../'
2803 " -------------------
2804 " go up one directory
2805 " -------------------
2806" call Decho('case "go up one directory": newdir == "../"')
2807
2808 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2809 " force a refresh
2810" call Decho("clear buffer<".expand("%")."> with :%d")
2811 setlocal noro ma
2812" call Decho("setlocal noro ma")
2813 keepjumps %d
2814 endif
2815
2816 if has("amiga")
2817 " amiga
2818" call Decho('case "go up one directory": newdir == "../" and amiga')
2819 if a:islocal
2820 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
2821 let dirname= substitute(dirname,'/$','','')
2822 else
2823 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
2824 endif
2825" call Decho("amiga: dirname<".dirname."> (go up one dir)")
2826
2827 else
2828 " unix or cygwin
2829" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
2830 if a:islocal
2831 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
2832 if dirname == ""
2833 let dirname= '/'
2834 endif
2835 else
2836 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
2837 endif
2838" call Decho("unix: dirname<".dirname."> (go up one dir)")
2839 endif
2840 call s:SetRexDir(a:islocal,dirname)
2841
2842 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2843" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
2844 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
2845 setlocal noro ma
2846" call Decho("setlocal noro ma")
2847 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
2848" call Decho("clear buffer<".expand("%")."> with :%d")
2849 keepjumps %d
2850 endif
2851 let treedir = s:NetrwTreeDir()
2852 let s:treecurpos = nbcd_curpos
2853 let haskey= 0
2854" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
2855
2856 " search treedict for tree dir as-is
2857 if has_key(w:netrw_treedict,treedir)
2858" call Decho('....searched for treedir<'.treedir.'> : found it!')
2859 let haskey= 1
2860 else
2861" call Decho('....searched for treedir<'.treedir.'> : not found')
2862 endif
2863
2864 " search treedict for treedir with a / appended
2865 if !haskey && treedir !~ '/$'
2866 if has_key(w:netrw_treedict,treedir."/")
2867 let treedir= treedir."/"
2868" call Decho('....searched.for treedir<'.treedir.'> found it!')
2869 let haskey = 1
2870 else
2871" call Decho('....searched for treedir<'.treedir.'/> : not found')
2872 endif
2873 endif
2874
2875 " search treedict for treedir with any trailing / elided
2876 if !haskey && treedir =~ '/$'
2877 let treedir= substitute(treedir,'/$','','')
2878 if has_key(w:netrw_treedict,treedir)
2879" call Decho('....searched.for treedir<'.treedir.'> found it!')
2880 let haskey = 1
2881 else
2882" call Decho('....searched for treedir<'.treedir.'> : not found')
2883 endif
2884 endif
2885
2886 if haskey
2887 " close tree listing for selected subdirectory
2888" call Decho("closing selected subdirectory<".dirname.">")
2889 call remove(w:netrw_treedict,treedir)
2890" call Decho("removed entry<".dirname."> from treedict")
2891" call Decho("yielding treedict<".string(w:netrw_treedict).">")
2892 let dirname= w:netrw_treetop
2893 else
2894 " go down one directory
2895 let dirname= substitute(treedir,'/*$','/','')
2896" call Decho("go down one dir: treedir<".treedir.">")
2897 endif
2898 call s:SetRexDir(a:islocal,dirname)
2899
2900 else
2901 " go down one directory
2902 let dirname= s:ComposePath(dirname,newdir)
2903" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2904 call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002905 endif
2906
Bram Moolenaar446cb832008-06-24 21:56:24 +00002907 call s:NetrwOptionRestore("s:")
2908 if dolockout
2909" call Decho("doing modification lockout settings: ma nomod noro")
2910 setlocal ma nomod noro
2911" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002912 endif
2913
Bram Moolenaar446cb832008-06-24 21:56:24 +00002914" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
2915 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00002916endfun
2917
2918" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002919" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2
2920" files given their extension. Passes 0=local, 1=remote
2921fun! netrw#NetrwBrowseX(fname,remote)
2922" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
2923
2924 " set up the filename
2925 " (lower case the extension, make a local copy of a remote file)
2926 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
2927 if has("win32") || has("win95") || has("win64") || has("win16")
2928 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00002929 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002930
2931 " seems kde systems often have gnome-open due to dependencies, even though
2932 " gnome-open's subsidiary display tools are largely absent. Kde systems
2933 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
2934 if !exists("s:haskdeinit")
2935 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002936 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002937 if v:shell_error
2938 let s:haskdeinit = 0
2939 endif
2940 else
2941 let s:haskdeinit= 0
2942 endif
2943" call Decho("setting s:haskdeinit=".s:haskdeinit)
2944 endif
2945
2946 if a:remote == 1
2947 " create a local copy
2948 let fname= fnamemodify(tempname(),":r").".".exten
Bram Moolenaarc236c162008-07-13 17:41:49 +00002949" call Decho("a:remote=".a:remote.": create a local copy of <".fname."> as <".fname.">")
2950 exe "silent keepjumps bot 1new ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002951 setlocal bh=delete
Bram Moolenaarc236c162008-07-13 17:41:49 +00002952" call Decho("read <".fnameescape(fname).">, now writing: exe w! ".fnameescape(fname))
2953 exe "silent! w! ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002954 q
Bram Moolenaarc236c162008-07-13 17:41:49 +00002955 else
2956 let fname= a:fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002957 endif
2958" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
2959
2960 " set up redirection
2961 if &srr =~ "%s"
2962 if (has("win32") || has("win95") || has("win64") || has("win16"))
2963 let redir= substitute(&srr,"%s","nul","")
2964 else
2965 let redir= substitute(&srr,"%s","/dev/null","")
2966 endif
2967 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
2968 let redir= &srr . "nul"
2969 else
2970 let redir= &srr . "/dev/null"
2971 endif
2972" call Decho("redir{".redir."} srr{".&srr."}")
2973
2974 " extract any viewing options. Assumes that they're set apart by quotes.
2975 if exists("g:netrw_browsex_viewer")
2976 if g:netrw_browsex_viewer =~ '\s'
2977 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
2978 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
2979 let oviewer = ''
2980 let cnt = 1
2981 while !executable(viewer) && viewer != oviewer
2982 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
2983 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
2984 let cnt = cnt + 1
2985 let oviewer = viewer
2986" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
2987 endwhile
2988 else
2989 let viewer = g:netrw_browsex_viewer
2990 let viewopt = ""
2991 endif
2992" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
2993 endif
2994
2995 " execute the file handler
2996 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
2997" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2998 let ret= netrwFileHandlers#Invoke(exten,fname)
2999
3000 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3001" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003002" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir)
3003 exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003004 let ret= v:shell_error
3005
3006 elseif has("win32") || has("win64")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003007" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3008 exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003009 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3010 let ret= v:shell_error
3011
3012 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00003013" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir)
3014 exe "silent !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003015 let ret= v:shell_error
3016
3017 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00003018" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir)
3019 exe "silent !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003020 let ret= v:shell_error
3021
3022 elseif has("macunix") && executable("open")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003023" call Decho("exe silent !open ".shellescape(fname,1)." ".redir)
3024 exe "silent !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003025 let ret= v:shell_error
3026
3027 else
3028 " netrwFileHandlers#Invoke() always returns 0
3029 let ret= netrwFileHandlers#Invoke(exten,fname)
3030 endif
3031
3032 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3033 if ret
3034 let ret= netrwFileHandlers#Invoke(exten,fname)
3035 endif
3036
Bram Moolenaarc236c162008-07-13 17:41:49 +00003037 " restoring redraw! after external file handlers
3038 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003039
3040 " cleanup: remove temporary file,
3041 " delete current buffer if success with handler,
3042 " return to prior buffer (directory listing)
3043 " Feb 12, 2008: had to de-activiate removal of
3044 " temporary file because it wasn't getting seen.
3045" if a:remote == 1 && fname != a:fname
3046" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003047" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003048" endif
3049
3050 if a:remote == 1
3051 setlocal bh=delete bt=nofile
3052 if g:netrw_use_noswf
3053 setlocal noswf
3054 endif
3055 exe "norm! \<c-o>"
3056" redraw!
3057 endif
3058
3059" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003060endfun
3061
3062" ---------------------------------------------------------------------
3063" netrw#Explore: launch the local browser in the directory of the current file {{{2
3064" dosplit==0: the window will be split iff the current file has
3065" been modified
3066" dosplit==1: the window will be split before running the local
3067" browser
3068fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003069" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003070 if !exists("b:netrw_curdir")
3071 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003072" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003073 endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003074 let curfile= b:netrw_curdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003075" call Decho("curfile<".curfile.">")
3076
3077 " save registers
3078 silent! let keepregstar = @*
3079 silent! let keepregplus = @+
3080 silent! let keepregslash= @/
3081
3082 " if dosplit or file has been modified
3083 if a:dosplit || &modified || a:style == 6
3084" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
3085 call s:SaveWinVars()
3086
3087 if a:style == 0 " Explore, Sexplore
3088" call Decho("style=0: Explore or Sexplore")
3089 exe g:netrw_winsize."wincmd s"
3090
3091 elseif a:style == 1 "Explore!, Sexplore!
3092" call Decho("style=1: Explore! or Sexplore!")
3093 exe g:netrw_winsize."wincmd v"
3094
3095 elseif a:style == 2 " Hexplore
3096" call Decho("style=2: Hexplore")
3097 exe "bel ".g:netrw_winsize."wincmd s"
3098
3099 elseif a:style == 3 " Hexplore!
3100" call Decho("style=3: Hexplore!")
3101 exe "abo ".g:netrw_winsize."wincmd s"
3102
3103 elseif a:style == 4 " Vexplore
3104" call Decho("style=4: Vexplore")
3105 exe "lefta ".g:netrw_winsize."wincmd v"
3106
3107 elseif a:style == 5 " Vexplore!
3108" call Decho("style=5: Vexplore!")
3109 exe "rightb ".g:netrw_winsize."wincmd v"
3110
3111 elseif a:style == 6 " Texplore
3112 call s:SaveBufVars()
3113" call Decho("style = 6: Texplore")
3114 tabnew
3115 call s:RestoreBufVars()
3116 endif
3117 call s:RestoreWinVars()
3118 endif
3119 norm! 0
3120
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003121 if a:0 > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003122" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003123 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
3124 let dirname= substitute(a:1,'\~',expand("$HOME"),'')
3125" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3126 elseif a:1 == '.'
3127 let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
3128 if dirname !~ '/$'
3129 let dirname= dirname."/"
3130 endif
3131" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3132 elseif a:1 =~ '\$'
3133 let dirname= expand(a:1)
3134 else
3135 let dirname= a:1
3136" call Decho("using dirname<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003137 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003138 else
3139 " clear explore
3140" call Decho("clearing explore variables")
3141 2match none
3142 if exists("s:explore_match") |unlet s:explore_match |endif
3143 if exists("s:explore_indx") |unlet s:explore_indx |endif
3144 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3145 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3146 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3147 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3148 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3149 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3150" redraw!
3151 echo " "
3152 echo " "
3153" call Dret("netrw#Explore : cleared list")
3154 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003155 endif
3156
Bram Moolenaar446cb832008-06-24 21:56:24 +00003157 if dirname =~ '/\*\*/'
3158 " handle .../**/.../filepat
3159" call Decho("case Explore .../**/.../filepat")
3160 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3161 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3162 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003163 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003164 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003165 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003166 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3167 let starpat= 4;
3168" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3169" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003170
Bram Moolenaar446cb832008-06-24 21:56:24 +00003171 elseif dirname =~ '^\*//'
3172 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3173" call Decho("case Explore *//pattern")
3174 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3175 let starpat= 1
3176" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3177 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3178
3179 elseif dirname =~ '^\*\*//'
3180 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3181" call Decho("case Explore **//pattern")
3182 let pattern= substitute(dirname,'^\*\*//','','')
3183 let starpat= 2
3184" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3185
3186 elseif dirname =~ '^\*/'
3187 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3188 let starpat= 3
3189" call Decho("case Explore */filepat (starpat=".starpat.")")
3190
3191 elseif dirname=~ '^\*\*/'
3192 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3193 let starpat= 4
3194" call Decho("case Explore **/filepat (starpat=".starpat.")")
3195 else
3196 let starpat= 0
3197 endif
3198
3199 if starpat == 0 && a:indx >= 0
3200 " [Explore Hexplore Vexplore Sexplore] [dirname]
3201" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore")
3202 if dirname == ""
3203 let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3204 endif
3205 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3206" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3207 call s:NetrwBrowse(0,dirname)
3208 else
3209 if dirname == ""|let dirname= getcwd()|endif
3210" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3211 call netrw#LocalBrowseCheck(dirname)
3212 endif
3213
3214" call Decho("curfile<".curfile.">")
3215 if has("win32") || has("win95") || has("win64") || has("win16")
3216 call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
3217 else
3218 call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
3219 endif
3220
3221 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3222 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3223 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3224 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3225 elseif a:indx <= 0
3226 " Nexplore, Pexplore, Explore: handle starpat
3227" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003228 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3229" call Decho("set up <s-up> and <s-down> maps")
3230 let s:didstarstar= 1
3231 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3232 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3233 endif
3234
3235 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003236" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003237 if !exists("w:netrw_explore_indx")
3238 let w:netrw_explore_indx= 0
3239 endif
3240 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003241" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003242"
3243 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003244 " Nexplore
3245" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003246 if !exists("w:netrw_explore_list") " sanity check
3247 call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
3248 silent! let @* = keepregstar
3249 silent! let @+ = keepregstar
3250 silent! let @/ = keepregslash
3251" call Dret("netrw#Explore")
3252 return
3253 endif
3254 let indx= w:netrw_explore_indx
3255 if indx < 0 | let indx= 0 | endif
3256 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3257 let curfile= w:netrw_explore_list[indx]
3258" call Decho("indx=".indx." curfile<".curfile.">")
3259 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3260 let indx= indx + 1
3261" call Decho("indx=".indx." (Nexplore while loop)")
3262 endwhile
3263 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3264" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3265
3266 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003267 " Pexplore
3268" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003269 if !exists("w:netrw_explore_list") " sanity check
3270 call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
3271 silent! let @* = keepregstar
3272 silent! let @+ = keepregstar
3273 silent! let @/ = keepregslash
3274" call Dret("netrw#Explore")
3275 return
3276 endif
3277 let indx= w:netrw_explore_indx
3278 if indx < 0 | let indx= 0 | endif
3279 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3280 let curfile= w:netrw_explore_list[indx]
3281" call Decho("indx=".indx." curfile<".curfile.">")
3282 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3283 let indx= indx - 1
3284" call Decho("indx=".indx." (Pexplore while loop)")
3285 endwhile
3286 if indx < 0 | let indx= 0 | endif
3287" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3288
3289 else
3290 " Explore -- initialize
3291 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003292" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003293 let w:netrw_explore_indx= 0
3294 if !exists("b:netrw_curdir")
3295 let b:netrw_curdir= getcwd()
3296 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003297" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003298
Bram Moolenaar446cb832008-06-24 21:56:24 +00003299 " switch on starpat to build the w:netrw_explore_list of files
3300 if starpat == 1
3301 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3302" call Decho("starpat=".starpat.": build *//pattern list")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003303 exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003304 let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
3305 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3306
3307 elseif starpat == 2
3308 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3309" call Decho("starpat=".starpat.": build **//pattern list")
3310 try
3311 exe "silent vimgrep /".pattern."/gj "."**/*"
3312 catch /^Vim\%((\a\+)\)\=:E480/
3313 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003314 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003315 silent! let @* = keepregstar
3316 silent! let @+ = keepregstar
3317 silent! let @/ = keepregslash
3318" call Dret("netrw#Explore : no files matched pattern")
3319 return
3320 endtry
3321 let s:netrw_curdir = b:netrw_curdir
3322 let w:netrw_explore_list = getqflist()
3323 let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
3324
3325 elseif starpat == 3
3326 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3327" call Decho("starpat=".starpat.": build */filepat list")
3328 let dirname = substitute(dirname,'^\*/','','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003329 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3330 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003331
3332 elseif starpat == 4
3333 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3334" call Decho("starpat=".starpat.": build **/filepat list")
3335 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3336 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3337 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003338
3339 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003340" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3341" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003342
3343 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3344 call netrw#ErrorMsg(s:WARNING,"no files matched",42)
3345 silent! let @* = keepregstar
3346 silent! let @+ = keepregstar
3347 silent! let @/ = keepregslash
3348" call Dret("netrw#Explore : no files matched")
3349 return
3350 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003351 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003352
3353 " NetrwStatusLine support - for exploring support
3354 let w:netrw_explore_indx= indx
3355" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
3356
3357 " wrap the indx around, but issue a note
3358 if indx >= w:netrw_explore_listlen || indx < 0
3359" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3360 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3361 let w:netrw_explore_indx= indx
3362 call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
3363 sleep 1
3364 endif
3365
3366 exe "let dirfile= w:netrw_explore_list[".indx."]"
3367" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3368 let newdir= substitute(dirfile,'/[^/]*$','','e')
3369" call Decho("newdir<".newdir.">")
3370
3371" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3372 call netrw#LocalBrowseCheck(newdir)
3373 if !exists("w:netrw_liststyle")
3374 let w:netrw_liststyle= g:netrw_liststyle
3375 endif
3376 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
3377 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3378 else
3379 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3380 endif
3381 let w:netrw_explore_mtchcnt = indx + 1
3382 let w:netrw_explore_bufnr = bufnr("%")
3383 let w:netrw_explore_line = line(".")
3384 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3385" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3386
3387 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003388" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003389 if !exists("g:netrw_quiet")
3390 call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3391 endif
3392 silent! let @* = keepregstar
3393 silent! let @+ = keepregstar
3394 silent! let @/ = keepregslash
3395" call Dret("netrw#Explore : missing +path_extra")
3396 return
3397 endif
3398
3399 else
3400" call Decho("case Explore newdir<".dirname.">")
3401 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
3402 silent! unlet w:netrw_treedict
3403 silent! unlet w:netrw_treetop
3404 endif
3405 let newdir= dirname
3406 if !exists("b:netrw_curdir")
3407 call netrw#LocalBrowseCheck(getcwd())
3408 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003409 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003410 endif
3411 endif
3412
Bram Moolenaar446cb832008-06-24 21:56:24 +00003413 " visual display of **/ **// */ Exploration files
3414 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
3415 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3416 " only update match list if current directory isn't the same as before
3417 let s:explore_prvdir = b:netrw_curdir
3418 let s:explore_match = ""
3419 let dirlen = strlen(b:netrw_curdir)
3420 if b:netrw_curdir !~ '/$'
3421 let dirlen= dirlen + 1
3422 endif
3423 let prvfname= ""
3424 for fname in w:netrw_explore_list
3425" call Decho("fname<".fname.">")
3426 if fname =~ '^'.b:netrw_curdir
3427 if s:explore_match == ""
3428 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3429 else
3430 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3431 endif
3432 elseif fname !~ '^/' && fname != prvfname
3433 if s:explore_match == ""
3434 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3435 else
3436 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3437 endif
3438 endif
3439 let prvfname= fname
3440 endfor
3441" call Decho("explore_match<".s:explore_match.">")
3442 exe "2match netrwMarkFile /".s:explore_match."/"
3443 endif
3444 echo "<s-up>==Pexplore <s-down>==Nexplore"
3445 else
3446 2match none
3447 if exists("s:explore_match") | unlet s:explore_match | endif
3448 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3449 echo " "
3450" call Decho("cleared explore match list")
3451 endif
3452
Bram Moolenaar9964e462007-05-05 17:54:07 +00003453 silent! let @* = keepregstar
3454 silent! let @+ = keepregstar
3455 silent! let @/ = keepregslash
3456" call Dret("netrw#Explore : @/<".@/.">")
3457endfun
3458
3459" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003460" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
3461" and switches the hiding mode. The actual hiding is done by
3462" s:NetrwListHide().
3463" g:netrw_hide= 0: show all
3464" 1: show not-hidden files
3465" 2: show hidden files only
3466fun! s:NetrwHide(islocal)
3467" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
3468 let svpos= netrw#NetrwSavePosn()
3469
3470 if exists("s:netrwmarkfilelist_{bufnr('%')}")
3471" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
3472" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
3473
3474 " hide the files in the markfile list
3475 for fname in s:netrwmarkfilelist_{bufnr("%")}
3476" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
3477 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
3478 " remove fname from hiding list
3479 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
3480 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
3481 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
3482" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
3483 else
3484 " append fname to hiding list
3485 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
3486 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
3487 else
3488 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
3489 endif
3490" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
3491 endif
3492 endfor
3493 unlet s:netrwmarkfilelist_{bufnr("%")}
3494 unlet s:netrwmarkfilemtch_{bufnr("%")}
3495 2match none
3496 let g:netrw_hide= 1
3497
3498 else
3499
3500 " switch between show-all/show-not-hidden/show-hidden
3501 let g:netrw_hide=(g:netrw_hide+1)%3
3502 exe "norm! 0"
3503 if g:netrw_hide && g:netrw_list_hide == ""
3504 call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
3505" call Dret("NetrwHide")
3506 return
3507 endif
3508 endif
3509
3510 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3511 call netrw#NetrwRestorePosn(svpos)
3512" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003513endfun
3514
3515" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003516" s:NetrwHidden: invoked by "gh" {{{2
3517fun! s:NetrwHidden(islocal)
3518" call Dfunc("s:NetrwHidden()")
3519 " save current position
3520 let svpos= netrw#NetrwSavePosn()
3521
3522 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
3523 " remove pattern from hiding list
3524 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
3525 elseif strlen(g:netrw_list_hide) >= 1
3526 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
3527 else
3528 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
3529 endif
3530
3531 " refresh screen and return to saved position
3532 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3533 call netrw#NetrwRestorePosn(svpos)
3534" call Dret("s:NetrwHidden")
3535endfun
3536
3537" ---------------------------------------------------------------------
3538" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
3539fun! s:NetrwLeftmouse(islocal)
3540" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
3541 if a:islocal
3542 if exists("b:netrw_curdir")
3543 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
3544 endif
3545 else
3546 if exists("b:netrw_curdir")
3547 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
3548 endif
3549 endif
3550" call Dret("s:NetrwLeftmouse")
3551endfun
3552
3553" ---------------------------------------------------------------------
3554" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
3555" separated patterns given in g:netrw_list_hide
3556fun! s:NetrwListHide()
3557" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
3558
3559 " find a character not in the "hide" string to use as a separator for :g and :v commands
3560 " How-it-works: take the hiding command, convert it into a range. Duplicate
3561 " characters don't matter. Remove all such characters from the '/~...90'
3562 " string. Use the first character left as a separator character.
3563 let listhide= g:netrw_list_hide
3564 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
3565" call Decho("sep=".sep)
3566
3567 while listhide != ""
3568 if listhide =~ ','
3569 let hide = substitute(listhide,',.*$','','e')
3570 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
3571 else
3572 let hide = listhide
3573 let listhide = ""
3574 endif
3575
3576 " Prune the list by hiding any files which match
3577 if g:netrw_hide == 1
3578" call Decho("hiding<".hide."> listhide<".listhide.">")
3579 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
3580 elseif g:netrw_hide == 2
3581" call Decho("showing<".hide."> listhide<".listhide.">")
3582 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
3583 endif
3584 endwhile
3585 if g:netrw_hide == 2
3586 exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
3587 exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
3588 endif
3589
3590" call Dret("NetrwListHide")
3591endfun
3592
3593" ---------------------------------------------------------------------
3594" NetrwHideEdit: allows user to edit the file/directory hiding list
3595fun! s:NetrwHideEdit(islocal)
3596" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
3597
3598 " save current cursor position
3599 let svpos= netrw#NetrwSavePosn()
3600
3601 " get new hiding list from user
3602 call inputsave()
3603 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
3604 call inputrestore()
3605 let g:netrw_list_hide= newhide
3606" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
3607
3608 " refresh the listing
3609 silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
3610
3611 " restore cursor position
3612 call netrw#NetrwRestorePosn(svpos)
3613
3614" call Dret("NetrwHideEdit")
3615endfun
3616
3617" ---------------------------------------------------------------------
3618" NetSortSequence: allows user to edit the sorting sequence
3619fun! s:NetSortSequence(islocal)
3620" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
3621
3622 let svpos= netrw#NetrwSavePosn()
3623 call inputsave()
3624 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
3625 call inputrestore()
3626
3627 " refresh the listing
3628 let g:netrw_sort_sequence= newsortseq
3629 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3630 call netrw#NetrwRestorePosn(svpos)
3631
3632" call Dret("NetSortSequence")
3633endfun
3634
3635" ---------------------------------------------------------------------
3636" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
3637fun! s:NetrwMakeDir(usrhost)
3638" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
3639
3640 " get name of new directory from user. A bare <CR> will skip.
3641 " if its currently a directory, also request will be skipped, but with
3642 " a message.
3643 call inputsave()
3644 let newdirname= input("Please give directory name: ")
3645 call inputrestore()
3646" call Decho("newdirname<".newdirname.">")
3647
3648 if newdirname == ""
3649" call Dret("NetrwMakeDir : user aborted with bare <cr>")
3650 return
3651 endif
3652
3653 if a:usrhost == ""
3654" call Decho("local mkdir")
3655
3656 " Local mkdir:
3657 " sanity checks
3658 let fullnewdir= b:netrw_curdir.'/'.newdirname
3659" call Decho("fullnewdir<".fullnewdir.">")
3660 if isdirectory(fullnewdir)
3661 if !exists("g:netrw_quiet")
3662 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
3663 endif
3664" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
3665 return
3666 endif
3667 if s:FileReadable(fullnewdir)
3668 if !exists("g:netrw_quiet")
3669 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
3670 endif
3671" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
3672 return
3673 endif
3674
3675 " requested new local directory is neither a pre-existing file or
3676 " directory, so make it!
3677 if exists("*mkdir")
3678 call mkdir(fullnewdir,"p")
3679 else
3680 let netrw_origdir= s:NetrwGetcwd(1)
3681 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
3682" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003683" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
3684 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003685 if !g:netrw_keepdir
3686 exe 'keepjumps lcd '.fnameescape(netrw_origdir)
3687" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
3688 endif
3689 endif
3690
3691 if v:shell_error == 0
3692 " refresh listing
3693" call Decho("refresh listing")
3694 let svpos= netrw#NetrwSavePosn()
3695 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
3696 call netrw#NetrwRestorePosn(svpos)
3697 elseif !exists("g:netrw_quiet")
3698 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
3699 endif
3700" redraw!
3701
3702 elseif !exists("b:netrw_method") || b:netrw_method == 4
3703 " Remote mkdir:
3704" call Decho("remote mkdir")
3705 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
3706 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00003707" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1))
3708 exe "silent! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003709 if v:shell_error == 0
3710 " refresh listing
3711 let svpos= netrw#NetrwSavePosn()
3712 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
3713 call netrw#NetrwRestorePosn(svpos)
3714 elseif !exists("g:netrw_quiet")
3715 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
3716 endif
3717" redraw!
3718
3719 elseif b:netrw_method == 2
3720 " COMBAK -- future work
3721 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3722 elseif b:netrw_method == 3
3723 " COMBAK -- future work
3724 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3725 endif
3726
3727" call Dret("NetrwMakeDir")
3728endfun
3729
3730" ---------------------------------------------------------------------
3731" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
3732" mark and unmark files. If a markfile list exists,
3733" then the rename and delete functions will use it instead
3734" of whatever may happen to be under the cursor at that
3735" moment. When the mouse and gui are available,
3736" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003737"
3738" Creates two lists
3739" s:netrwmarkfilelist -- holds complete paths to all marked files
3740" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
3741"
3742" Creates a marked file match string
3743" s:netrwmarfilemtch_# -- used with 2match to display marked files
3744"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00003745" Creates a buffer version of islocal
3746" b:netrw_islocal
3747"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003748fun! s:NetrwMarkFile(islocal,fname)
3749" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
3750 let curbufnr= bufnr("%")
3751 let curdir = b:netrw_curdir
3752 if exists("s:netrwmarkfilelist_{curbufnr}")
3753 " markfile list exists
3754" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3755" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00003756 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00003757
3758 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00003759 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00003760" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3761 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3762 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3763
3764 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00003765 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00003766" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3767 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
3768 if s:netrwmarkfilelist_{curbufnr} == []
3769 " local markfilelist is empty; remove it entirely
3770" call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
3771 call s:NetrwUnmarkList(curbufnr,curdir)
3772 else
3773 " rebuild match list to display markings correctly
3774" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
3775 let s:netrwmarkfilemtch_{curbufnr}= ""
3776 let first = 1
3777 for fname in s:netrwmarkfilelist_{curbufnr}
3778 if first
3779 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3780 else
3781 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3782 endif
3783 let first= 0
3784 endfor
3785" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3786" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3787 endif
3788 endif
3789
3790 else
3791 " initialize new markfilelist
3792
3793" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
3794 let s:netrwmarkfilelist_{curbufnr}= []
3795 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3796" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3797
3798 " build initial markfile matching pattern
3799 if a:fname =~ '/$'
3800 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
3801 else
3802 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
3803 endif
3804" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3805 endif
3806
3807 " handle global markfilelist
3808 if exists("s:netrwmarkfilelist")
3809 let dname= s:ComposePath(b:netrw_curdir,a:fname)
3810 if index(s:netrwmarkfilelist,dname) == -1
3811 " append new filename to global markfilelist
3812 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3813" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
3814 else
3815 " remove new filename from global markfilelist
3816" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
3817 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
3818" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
3819 if s:netrwmarkfilelist == []
3820 unlet s:netrwmarkfilelist
3821 endif
3822 endif
3823 else
3824 " initialize new global-directory markfilelist
3825 let s:netrwmarkfilelist= []
3826 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3827" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
3828 endif
3829
3830 " set up 2match'ing to netrwmarkfilemtch list
3831 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
3832" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
3833 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
3834 else
3835" call Decho("2match none")
3836 2match none
3837 endif
3838" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
3839endfun
3840
3841" ---------------------------------------------------------------------
3842" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
3843" compress/decompress files using the programs
3844" in g:netrw_compress and g:netrw_uncompress,
3845" using g:netrw_compress_suffix to know which to
3846" do. By default:
3847" g:netrw_compress = "gzip"
3848" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
3849fun! s:NetrwMarkFileCompress(islocal)
3850" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
3851 let svpos = netrw#NetrwSavePosn()
3852 let curdir = b:netrw_curdir
3853 let curbufnr = bufnr("%")
3854
3855 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
3856 for fname in s:netrwmarkfilelist_{curbufnr}
3857 " for every filename in the marked list
3858 for sfx in sort(keys(g:netrw_decompress))
3859 if fname =~ '\'.sfx.'$'
3860 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaarc236c162008-07-13 17:41:49 +00003861 let exe= s:WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00003862" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
3863 if a:islocal
3864 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00003865 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003866 endif
3867 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003868 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003869 endif
3870 if executable(exe)
3871 if a:islocal
3872 call system(exe." ".fname)
3873 else
3874 call s:RemoteSystem(exe." ".fname)
3875 endif
3876 else
3877 call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
3878 endif
3879 break
3880 endif
3881 endfor
3882 if exists("exe")
3883 unlet exe
3884 elseif a:islocal
3885 " fname not a compressed file, so compress it
Bram Moolenaarc236c162008-07-13 17:41:49 +00003886 call system(s:WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003887 else
3888 " fname not a compressed file, so compress it
Bram Moolenaarc236c162008-07-13 17:41:49 +00003889 call s:RemoteSystem(s:WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003890 endif
3891 endfor
3892 call s:NetrwUnmarkList(curbufnr,curdir)
3893 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3894 call netrw#NetrwRestorePosn(svpos)
3895 endif
3896" call Dret("s:NetrwMarkFileCompress")
3897endfun
3898
3899" ---------------------------------------------------------------------
3900" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
3901" If no marked files, then set up directory as the
3902" target. Currently does not support copying entire
3903" directories. Uses the local-buffer marked file list.
3904" Returns 1=success (used by NetrwMarkFileMove())
3905" 0=failure
3906fun! s:NetrwMarkFileCopy(islocal)
3907" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
3908
3909 " sanity checks
3910 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
3911 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
3912" call Dret("s:NetrwMarkFileCopy 0")
3913 return 0
3914 endif
3915" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
3916 if !exists("s:netrwmftgt")
3917 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
3918" call Dret("s:NetrwMarkFileCopy 0")
3919 return 0
3920 endif
3921" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
3922 let curdir = b:netrw_curdir
3923 let curbufnr = bufnr("%")
3924
3925 if a:islocal && s:netrwmftgt_islocal
3926 " Copy marked files, local directory to local directory
3927" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003928 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003929" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003930 call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003931
3932 elseif a:islocal && !s:netrwmftgt_islocal
3933 " Copy marked files, local directory to remote directory
3934" call Decho("copy from local to remote")
3935 call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3936
3937 elseif !a:islocal && s:netrwmftgt_islocal
3938" call Decho("copy from remote to local")
3939 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3940
3941 elseif !a:islocal && !s:netrwmftgt_islocal
3942" call Decho("copy from remote to remote")
3943 let curdir = getcwd()
3944 let tmpdir = s:GetTempfile("")
3945 if tmpdir !~ '/'
3946 let tmpdir= curdir."/".tmpdir
3947 endif
3948 if exists("*mkdir")
3949 call mkdir(tmpdir)
3950 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00003951 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003952 endif
3953 if isdirectory(tmpdir)
3954 exe "keepjumps lcd ".fnameescape(tmpdir)
3955 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003956 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003957 call s:NetrwUpload(localfiles,s:netrwmftgt)
3958 if getcwd() == tmpdir
3959 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaarc236c162008-07-13 17:41:49 +00003960 call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003961 endfor
3962 exe "keepjumps lcd ".fnameescape(curdir)
Bram Moolenaarc236c162008-07-13 17:41:49 +00003963 exe "silent !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003964 else
3965 exe "keepjumps lcd ".fnameescape(curdir)
3966 endif
3967 endif
3968 endif
3969
3970 " -------
3971 " cleanup
3972 " -------
3973" call Decho("cleanup")
3974
3975 " remove markings from local buffer
3976 call s:NetrwUnmarkList(curbufnr,curdir)
3977
3978 " refresh buffers
3979 if !s:netrwmftgt_islocal
3980 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
3981 endif
3982 if a:islocal
3983 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
3984 endif
3985 call s:LocalBrowseShellCmdRefresh()
3986
3987" call Dret("s:NetrwMarkFileCopy 1")
3988 return 1
3989endfun
3990
3991" ---------------------------------------------------------------------
3992" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
3993" invoke vim's diff mode on the marked files.
3994" Either two or three files can be so handled.
3995" Uses the global marked file list.
3996fun! s:NetrwMarkFileDiff(islocal)
3997" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
3998 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003999
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004000 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004001 let cnt = 0
4002 let curdir = b:netrw_curdir
4003 for fname in s:netrwmarkfilelist
4004 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004005 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004006" call Decho("diffthis: fname<".fname.">")
4007 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004008 diffthis
4009 elseif cnt == 2 || cnt == 3
4010 vsplit
4011 wincmd l
4012" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004013 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004014 diffthis
4015 else
4016 break
4017 endif
4018 endfor
4019 call s:NetrwUnmarkList(curbufnr,curdir)
4020 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004021
Bram Moolenaar446cb832008-06-24 21:56:24 +00004022" call Dret("s:NetrwMarkFileDiff")
4023endfun
4024
4025" ---------------------------------------------------------------------
4026" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
4027" Uses global markfilelist
4028fun! s:NetrwMarkFileEdit(islocal)
4029" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
4030
4031 let curdir = b:netrw_curdir
4032 let curbufnr = bufnr("%")
4033 if exists("s:netrwmarkfilelist_{curbufnr}")
4034 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004035 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004036 " unmark markedfile list
4037" call s:NetrwUnmarkList(curbufnr,curdir)
4038 call s:NetrwUnmarkAll()
4039" call Decho("exe silent args ".flist)
4040 exe "silent args ".flist
4041 endif
4042
4043" call Dret("s:NetrwMarkFileEdit")
4044endfun
4045
4046" ---------------------------------------------------------------------
4047" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4048" Uses the local marked-file list.
4049fun! s:NetrwMarkFileExe(islocal)
4050" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4051 let svpos = netrw#NetrwSavePosn()
4052 let curdir = b:netrw_curdir
4053 let curbufnr = bufnr("%")
4054
4055 if exists("s:netrwmarkfilelist_{curbufnr}")
4056 " get the command
4057 call inputsave()
4058 let cmd= input("Enter command: ","","file")
4059 call inputrestore()
4060" call Decho("cmd<".cmd.">")
4061
4062 " apply command to marked files. Substitute: filename -> %
4063 " If no %, then append a space and the filename to the command
4064 for fname in s:netrwmarkfilelist_{curbufnr}
4065 if a:islocal
4066 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004067 let fname= shellescape(s:WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004068 endif
4069 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004070 let fname= shellescape(s:WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004071 endif
4072 if cmd =~ '%'
4073 let xcmd= substitute(cmd,'%',fname,'g')
4074 else
4075 let xcmd= cmd.' '.fname
4076 endif
4077 if a:islocal
4078" call Decho("local: xcmd<".xcmd.">")
4079 let ret= system(xcmd)
4080 else
4081" call Decho("remote: xcmd<".xcmd.">")
4082 let ret= s:RemoteSystem(xcmd)
4083 endif
4084 if v:shell_error < 0
4085 call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
4086 break
4087 else
4088 echo ret
4089 endif
4090 endfor
4091
4092 " unmark marked file list
4093 call s:NetrwUnmarkList(curbufnr,curdir)
4094
4095 " refresh the listing
4096 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4097 call netrw#NetrwRestorePosn(svpos)
4098 else
4099 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4100 endif
4101
4102" call Dret("s:NetrwMarkFileExe")
4103endfun
4104
4105" ---------------------------------------------------------------------
4106" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4107" as the marked file(s) (toggles suffix presence)
4108" Uses the local marked file list.
4109fun! s:NetrwMarkHideSfx(islocal)
4110" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4111 let svpos = netrw#NetrwSavePosn()
4112 let curbufnr = bufnr("%")
4113
4114 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4115 if exists("s:netrwmarkfilelist_{curbufnr}")
4116
4117 for fname in s:netrwmarkfilelist_{curbufnr}
4118" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4119 " construct suffix pattern
4120 if fname =~ '\.'
4121 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4122 else
4123 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4124 endif
4125 " determine if its in the hiding list or not
4126 let inhidelist= 0
4127 if g:netrw_list_hide != ""
4128 let itemnum = 0
4129 let hidelist= split(g:netrw_list_hide,',')
4130 for hidepat in hidelist
4131 if sfxpat == hidepat
4132 let inhidelist= 1
4133 break
4134 endif
4135 let itemnum= itemnum + 1
4136 endfor
4137 endif
4138" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4139 if inhidelist
4140 " remove sfxpat from list
4141 call remove(hidelist,itemnum)
4142 let g:netrw_list_hide= join(hidelist,",")
4143 elseif g:netrw_list_hide != ""
4144 " append sfxpat to non-empty list
4145 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4146 else
4147 " set hiding list to sfxpat
4148 let g:netrw_list_hide= sfxpat
4149 endif
4150 endfor
4151
4152 " refresh the listing
4153 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4154 call netrw#NetrwRestorePosn(svpos)
4155 else
4156 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4157 endif
4158
4159" call Dret("s:NetrwMarkHideSfx")
4160endfun
4161
4162" ---------------------------------------------------------------------
4163" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4164" Uses the global markfilelist
4165fun! s:NetrwMarkFileGrep(islocal)
4166" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4167 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004168 let curbufnr = bufnr("%")
4169
4170 if exists("s:netrwmarkfilelist")
4171" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004172 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004173 call s:NetrwUnmarkAll()
4174
4175 " ask user for pattern
4176 call inputsave()
4177 let pat= input("Enter pattern: ","")
4178 call inputrestore()
4179 if pat !~ '^\s'
4180 if pat !~ '^/'
4181 let pat= '/'.pat.'/'
4182 endif
4183 let pat= " ".pat
4184 endif
4185
4186 " use vimgrep for both local and remote
4187" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
4188 exe "vimgrep".pat." ".netrwmarkfilelist
4189
4190 2match none
4191 call netrw#NetrwRestorePosn(svpos)
4192 endif
4193
4194" call Dret("s:NetrwMarkFileGrep")
4195endfun
4196
4197" ---------------------------------------------------------------------
4198" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4199" uses the global marked file list
4200" s:netrwmfloc= 0: target directory is remote
4201" = 1: target directory is local
4202fun! s:NetrwMarkFileMove(islocal)
4203" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4204 let curdir = b:netrw_curdir
4205 let curbufnr = bufnr("%")
4206
4207 " sanity check
4208 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4209 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4210" call Dret("s:NetrwMarkFileMove")
4211 return
4212 endif
4213" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4214 if !exists("s:netrwmftgt")
4215 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4216" call Dret("s:NetrwMarkFileCopy 0")
4217 return 0
4218 endif
4219" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4220
4221 if a:islocal && s:netrwmftgt_islocal
4222 " move: local -> local
4223" call Decho("move from local to local")
4224" call Decho("(s:NetrwMarkFileMove) local to local move")
4225 if executable(g:netrw_localmovecmd)
4226 for fname in s:netrwmarkfilelist_{bufnr("%")}
4227" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4228 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4229 if v:shell_error < 0
4230 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4231 break
4232 endif
4233 endfor
4234 else
4235 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4236 endif
4237
4238 elseif a:islocal && !s:netrwmftgt_islocal
4239 " move: local -> remote
4240" call Decho("move from local to remote")
4241" call Decho("copy")
4242 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4243 call s:NetrwMarkFileCopy(a:islocal)
4244" call Decho("remove")
4245 for fname in mflist
4246 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4247 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4248 endfor
4249 unlet mflist
4250
4251 elseif !a:islocal && s:netrwmftgt_islocal
4252 " move: remote -> local
4253" call Decho("move from remote to local")
4254" call Decho("copy")
4255 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4256 call s:NetrwMarkFileCopy(a:islocal)
4257" call Decho("remove")
4258 for fname in mflist
4259 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4260 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4261 endfor
4262 unlet mflist
4263
4264 elseif !a:islocal && !s:netrwmftgt_islocal
4265 " move: remote -> remote
4266" call Decho("move from remote to remote")
4267" call Decho("copy")
4268 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4269 call s:NetrwMarkFileCopy(a:islocal)
4270" call Decho("remove")
4271 for fname in mflist
4272 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4273 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4274 endfor
4275 unlet mflist
4276 endif
4277
4278 " -------
4279 " cleanup
4280 " -------
4281" call Decho("cleanup")
4282
4283 " remove markings from local buffer
4284 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
4285
4286 " refresh buffers
4287 if !s:netrwmftgt_islocal
4288 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4289 endif
4290 if a:islocal
4291 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4292 endif
4293 call s:LocalBrowseShellCmdRefresh()
4294
4295" call Dret("s:NetrwMarkFileMove")
4296endfun
4297
4298" ---------------------------------------------------------------------
4299" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
4300" using the hardcopy command. Local marked-file list only.
4301fun! s:NetrwMarkFilePrint(islocal)
4302" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
4303 let curbufnr= bufnr("%")
4304 if exists("s:netrwmarkfilelist_{curbufnr}")
4305 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4306 let curdir = b:netrw_curdir
4307 call s:NetrwUnmarkList(curbufnr,curdir)
4308 for fname in netrwmarkfilelist
4309 if a:islocal
4310 if g:netrw_keepdir
4311 let fname= s:ComposePath(curdir,fname)
4312 endif
4313 else
4314 let fname= curdir.fname
4315 endif
4316 1split
4317 " the autocmds will handle both local and remote files
4318" call Decho("exe silent e ".escape(fname,' '))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004319 exe "silent e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004320" call Decho("hardcopy")
4321 hardcopy
4322 q
4323 endfor
4324 2match none
4325 endif
4326" call Dret("s:NetrwMarkFilePrint")
4327endfun
4328
4329" ---------------------------------------------------------------------
4330" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
4331" files when given a regexp (for which a prompt is
4332" issued).
4333fun! s:NetrwMarkFileRegexp(islocal)
4334" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
4335
4336 " get the regular expression
4337 call inputsave()
4338 let regexp= input("Enter regexp: ","","file")
4339 call inputrestore()
4340
4341 if a:islocal
4342 " get the matching list of files using local glob()
4343" call Decho("handle local regexp")
4344 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
4345 let filelist = glob(s:ComposePath(dirname,regexp))
4346 if filelist != ""
4347 let filelist= filelist."\n"
4348 endif
4349
4350 " mark the list of files
4351 while filelist != ""
4352 if filelist =~ '\n'
4353 let filename = substitute(filelist,'\n.*$','','e')
4354 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
4355 else
4356 let filename = filelist
4357 let filelist = ""
4358 endif
4359" call Decho("filelist<".filelist.">")
4360" call Decho("filename<".filename.">")
4361 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4362 endwhile
4363
4364 else
4365" call Decho("handle remote regexp")
4366
4367 " convert displayed listing into a filelist
4368 let eikeep = &ei
4369 let areg = @a
4370 silent %y a
4371 set ei=all ma
4372" call Decho("set ei=all ma")
4373 1split
4374 enew
4375 silent norm! "ap
4376 2
4377 let bannercnt= search('^" =====','W')
4378 exe "silent 1,".bannercnt."d"
4379 set bt=nofile
4380 if g:netrw_liststyle == s:LONGLIST
4381 silent %s/\s\{2,}\S.*$//e
4382 elseif g:netrw_liststyle == s:WIDELIST
4383 silent %s/\s\{2,}/\r/ge
4384 elseif g:netrw_liststyle == s:TREELIST
4385 silent %s/^| //e
4386 silent! g/^ .*$/d
4387 endif
4388 " convert regexp into the more usual glob-style format
4389 let regexp= substitute(regexp,'\*','.*','g')
4390" call Decho("regexp<".regexp.">")
4391 exe "silent! v/".escape(regexp,'/')."/d"
4392 let filelist= getline(1,line("$"))
4393 q!
4394 for filename in filelist
4395 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4396 endfor
4397 unlet filelist
4398 let @a = areg
4399 let &ei = eikeep
4400 endif
4401
4402" call Dret("s:NetrwMarkFileRegexp")
4403endfun
4404
4405" ---------------------------------------------------------------------
4406" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
4407" Uses the local marked file list.
4408fun! s:NetrwMarkFileSource(islocal)
4409" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
4410 let curbufnr= bufnr("%")
4411 if exists("s:netrwmarkfilelist_{curbufnr}")
4412 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
4413 let curdir = b:netrw_curdir
4414 call s:NetrwUnmarkList(curbufnr,curdir)
4415 for fname in netrwmarkfilelist
4416 if a:islocal
4417 if g:netrw_keepdir
4418 let fname= s:ComposePath(curdir,fname)
4419 endif
4420 else
4421 let fname= curdir.fname
4422 endif
4423 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00004424" call Decho("exe so ".fnameescape(fname))
4425 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004426 endfor
4427 2match none
4428 endif
4429" call Dret("s:NetrwMarkFileSource")
4430endfun
4431
4432" ---------------------------------------------------------------------
4433" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
4434" Uses the global markfilelist
4435fun! s:NetrwMarkFileTag(islocal)
4436" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
4437 let svpos = netrw#NetrwSavePosn()
4438 let curdir = b:netrw_curdir
4439 let curbufnr = bufnr("%")
4440
4441 if exists("s:netrwmarkfilelist")
4442" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004443 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004444 call s:NetrwUnmarkAll()
4445
4446 if a:islocal
4447 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004448" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
4449 call system(g:netrw_ctags." ".netrwmarkfilelist)
4450 else
4451 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
4452 endif
4453 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004454 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004455 call netrw#NetrwObtain(a:islocal,"tags")
4456 let curdir= b:netrw_curdir
4457 1split
4458 e tags
4459 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
4460" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004461 exe '%s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004462 wq!
4463 endif
4464 2match none
4465 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4466 call netrw#NetrwRestorePosn(svpos)
4467 endif
4468
4469" call Dret("s:NetrwMarkFileTag")
4470endfun
4471
4472" ---------------------------------------------------------------------
4473" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
4474" Sets up two variables,
4475" s:netrwmftgt : holds the target directory
4476" s:netrwmftgt_islocal : 0=target directory is remote
4477" 1=target directory is local
4478fun! s:NetrwMarkFileTgt(islocal)
4479" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
4480 let svpos = netrw#NetrwSavePosn()
4481 let curdir = b:netrw_curdir
4482 let hadtgt = exists("s:netrwmftgt")
4483 if !exists("w:netrw_bannercnt")
4484 let w:netrw_bannercnt= b:netrw_bannercnt
4485 endif
4486
4487 " set up target
4488 if line(".") < w:netrw_bannercnt
4489 " if cursor in banner region, use b:netrw_curdir for the target
4490 let s:netrwmftgt= b:netrw_curdir
4491" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
4492
4493 else
4494 " get word under cursor.
4495 " * If directory, use it for the target.
4496 " * If file, use b:netrw_curdir for the target
4497 let curword= s:NetrwGetWord()
4498 let tgtdir = s:ComposePath(curdir,curword)
4499 if a:islocal && isdirectory(tgtdir)
4500 let s:netrwmftgt = tgtdir
4501" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
4502 elseif !a:islocal && tgtdir =~ '/$'
4503 let s:netrwmftgt = tgtdir
4504" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
4505 else
4506 let s:netrwmftgt = curdir
4507" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
4508 endif
4509 endif
4510 if a:islocal
4511 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
4512 let s:netrwmftgt= simplify(s:netrwmftgt)
4513" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
4514 endif
4515 if g:netrw_cygwin
4516 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
4517 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
4518 endif
4519 let s:netrwmftgt_islocal= a:islocal
4520
4521 if g:netrw_fastbrowse > 0
4522 call s:LocalBrowseShellCmdRefresh()
4523 endif
4524 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4525 call netrw#NetrwRestorePosn(svpos)
4526 if !hadtgt
4527 norm! j
4528 endif
4529
4530" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
4531endfun
4532
4533" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00004534" s:NetrwOpenFile: query user for a filename and open it {{{2
4535fun! s:NetrwOpenFile(islocal)
4536" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
4537 call inputsave()
4538 let fname= input("Enter filename: ")
4539 call inputrestore()
4540 if fname !~ '[/\\]'
4541 if exists("b:netrw_curdir")
4542 if exists("g:netrw_quiet")
4543 let netrw_quiet_keep = g:netrw_quiet
4544 endif
4545 let g:netrw_quiet = 1
4546 if b:netrw_curdir =~ '/$'
4547 exe "e ".fnameescape(b:netrw_curdir.fname)
4548 else
4549 exe "e ".fnameescape(b:netrw_curdir."/".fname)
4550 endif
4551 if exists("netrw_quiet_keep")
4552 let g:netrw_quiet= netrw_quiet_keep
4553 else
4554 unlet g:netrw_quiet
4555 endif
4556 endif
4557 else
4558 exe "e ".fnameescape(fname)
4559 endif
4560" call Dret("s:NetrwOpenFile")
4561endfun
4562
4563" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004564" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
4565fun! s:NetrwUnmarkList(curbufnr,curdir)
4566" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
4567
4568 " remove all files in local marked-file list from global list
4569 if exists("s:netrwmarkfilelist_{a:curbufnr}")
4570 for mfile in s:netrwmarkfilelist_{a:curbufnr}
4571 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
4572 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
4573 call remove(s:netrwmarkfilelist,idx) " remove from global list
4574 endfor
4575 if s:netrwmarkfilelist == []
4576 unlet s:netrwmarkfilelist
4577 endif
4578
4579 " getting rid of the local marked-file lists is easy
4580 unlet s:netrwmarkfilelist_{a:curbufnr}
4581 endif
4582 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
4583 unlet s:netrwmarkfilemtch_{a:curbufnr}
4584 endif
4585 2match none
4586" call Dret("s:NetrwUnmarkList")
4587endfun
4588
4589" ---------------------------------------------------------------------
4590" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
4591fun! s:NetrwUnmarkAll()
4592" call Dfunc("s:NetrwUnmarkAll()")
4593 if exists("s:netrwmarkfilelist")
4594 unlet s:netrwmarkfilelist
4595 endif
4596 silent call s:NetrwUnmarkAll2()
4597 2match none
4598" call Dret("s:NetrwUnmarkAll")
4599endfun
4600
4601" ---------------------------------------------------------------------
4602" s:NetrwUnmarkAll2: {{{2
4603fun! s:NetrwUnmarkAll2()
4604" call Dfunc("s:NetrwUnmarkAll2()")
4605 redir => netrwmarkfilelist_let
4606 let
4607 redir END
4608 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
4609 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
4610 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
4611 for flist in netrwmarkfilelist_list
4612 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
4613 unlet s:netrwmarkfilelist_{curbufnr}
4614 unlet s:netrwmarkfilemtch_{curbufnr}
4615 endfor
4616" call Dret("s:NetrwUnmarkAll2")
4617endfun
4618
4619" ---------------------------------------------------------------------
4620" s:NetrwUnMarkFile: {{{2
4621fun! s:NetrwUnMarkFile(islocal)
4622" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
4623 let svpos = netrw#NetrwSavePosn()
4624 let curbufnr = bufnr("%")
4625
4626 " unmark marked file list (although I expect s:NetrwUpload()
4627 " to do it, I'm just making sure)
4628 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4629" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
4630 unlet s:netrwmarkfilelist
4631 unlet s:netrwmarkfilelist_{curbufnr}
4632 unlet s:netrwmarkfilemtch_{curbufnr}
4633 2match none
4634 endif
4635
4636" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4637 call netrw#NetrwRestorePosn(svpos)
4638" call Dret("s:NetrwUnMarkFile")
4639endfun
4640
4641" ---------------------------------------------------------------------
4642" s:NetrwMenu: generates the menu for gvim and netrw {{{2
4643fun! s:NetrwMenu(domenu)
4644
4645 if !exists("g:NetrwMenuPriority")
4646 let g:NetrwMenuPriority= 80
4647 endif
4648
4649 if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
4650" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
4651
4652 if !exists("s:netrw_menu_enabled") && a:domenu
4653" call Decho("initialize menu")
4654 let s:netrw_menu_enabled= 1
4655 exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
4656 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4
4657 exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
4658 exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
4659 exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
4660 exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
4661 exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB mB'
4662 exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb'
4663 exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
4664 exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
4665 exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
4666 exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit"
4667 exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
4668 exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
4669 exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh"
4670 exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
4671 exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
4672 exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
4673 exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
4674 exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
4675 exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
4676 exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
4677 exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
4678 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
4679 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
4680 exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
4681 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
4682 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
4683 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
4684 exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
4685 exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
4686 exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
4687 exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
4688 exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
4689 exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
4690 exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
4691 exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
4692 exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
4693 exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
4694 exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
4695 exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
4696 exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
4697 exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
4698 exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
4699 exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
4700 exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
4701 exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
4702 exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
4703 exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
4704 exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
4705 exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
4706 exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
4707 let s:netrw_menucnt= 28
4708
4709 elseif !a:domenu
4710 let s:netrwcnt = 0
4711 let curwin = winnr()
4712 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
4713 exe curwin."wincmd w"
4714
4715 if s:netrwcnt <= 1
4716" call Decho("clear menus")
4717 exe 'silent! unmenu '.g:NetrwTopLvlMenu
4718" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
4719 silent! unlet s:netrw_menu_enabled
4720 endif
4721 endif
4722" call Dret("NetrwMenu")
4723 endif
4724
4725endfun
4726
4727" ---------------------------------------------------------------------
4728" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
4729" Used by the O maps (as <SID>NetrwObtain())
4730fun! s:NetrwObtain(islocal)
4731" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
4732
4733 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4734 let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
4735 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
4736 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
4737 else
4738 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
4739 endif
4740
4741" call Dret("NetrwObtain")
4742endfun
4743
4744" ---------------------------------------------------------------------
4745" netrw#NetrwObtain: {{{2
4746" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
4747" islocal=0 obtain from remote source
4748" =1 obtain from local source
4749" fname : a filename or a list of filenames
4750" tgtdir : optional place where files are to go (not present, uses getcwd())
4751fun! netrw#NetrwObtain(islocal,fname,...)
4752" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
4753 " NetrwStatusLine support - for obtaining support
4754
4755 if type(a:fname) == 1
4756 let fnamelist= [ a:fname ]
4757 elseif type(a:fname) == 3
4758 let fnamelist= a:fname
4759 else
4760 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
4761" call Dret("netrw#NetrwObtain")
4762 return
4763 endif
4764" call Decho("fnamelist<".string(fnamelist).">")
4765 if a:0 > 0
4766 let tgtdir= a:1
4767 else
4768 let tgtdir= getcwd()
4769 endif
4770" call Decho("tgtdir<".tgtdir.">")
4771
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004772 if b:netrw_islocal
4773 " obtain a file from local b:netrw_curdir to (local) tgtdir
4774" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004775 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
4776 let topath= s:ComposePath(tgtdir,"")
4777 if (has("win32") || has("win95") || has("win64") || has("win16"))
4778 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004779" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004780 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00004781" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
4782 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004783 endfor
4784 else
4785 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004786" call Decho("transfer files with one command")
4787 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004788" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
4789 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
4790 endif
4791 elseif !exists("b:netrw_curdir")
4792 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
4793 else
4794 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
4795 endif
4796
4797 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004798 " obtain files from remote b:netrw_curdir to local tgtdir
4799" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004800 if type(a:fname) == 1
4801 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
4802 endif
4803 call s:NetrwMethod(b:netrw_curdir)
4804
4805 if b:netrw_method == 4
4806 " obtain file using scp
4807" call Decho("obtain via scp (method#4)")
4808 if exists("g:netrw_port") && g:netrw_port != ""
4809 let useport= " ".g:netrw_scpport." ".g:netrw_port
4810 else
4811 let useport= ""
4812 endif
4813 if b:netrw_fname =~ '/'
4814 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
4815 else
4816 let path= ""
4817 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004818 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00004819" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
4820 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004821
4822 elseif b:netrw_method == 2
4823 " obtain file using ftp + .netrc
4824" call Decho("obtain via ftp+.netrc (method #2)")
4825 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4826 let tmpbufnr= bufnr("%")
4827 setlocal ff=unix
4828 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004829 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00004830" call Decho("filter input: ".getline('$'))
4831 endif
4832
4833 if exists("b:netrw_fname") && b:netrw_fname != ""
4834 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4835" call Decho("filter input: ".getline('$'))
4836 endif
4837
4838 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004839 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00004840" call Decho("filter input: ".getline('$'))
4841 endif
4842 for fname in fnamelist
4843 call setline(line("$")+1,'get "'.fname.'"')
4844" call Decho("filter input: ".getline('$'))
4845 endfor
4846 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00004847" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
4848 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004849 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004850" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
4851 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004852 endif
4853 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4854 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
4855 let debugkeep= &debug
4856 setlocal debug=msg
4857 call netrw#ErrorMsg(s:ERROR,getline(1),4)
4858 let &debug= debugkeep
4859 endif
4860
4861 elseif b:netrw_method == 3
4862 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
4863" call Decho("obtain via ftp+mipf (method #3)")
4864 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4865 let tmpbufnr= bufnr("%")
4866 setlocal ff=unix
4867
4868 if exists("g:netrw_port") && g:netrw_port != ""
4869 put ='open '.g:netrw_machine.' '.g:netrw_port
4870" call Decho("filter input: ".getline('$'))
4871 else
4872 put ='open '.g:netrw_machine
4873" call Decho("filter input: ".getline('$'))
4874 endif
4875
4876 if exists("g:netrw_ftp") && g:netrw_ftp == 1
4877 put =g:netrw_uid
4878" call Decho("filter input: ".getline('$'))
4879 put ='\"'.s:netrw_passwd.'\"'
4880" call Decho("filter input: ".getline('$'))
4881 else
4882 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
4883" call Decho("filter input: ".getline('$'))
4884 endif
4885
4886 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4887 put =g:netrw_ftpmode
4888" call Decho("filter input: ".getline('$'))
4889 endif
4890
4891 if exists("b:netrw_fname") && b:netrw_fname != ""
4892 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4893" call Decho("filter input: ".getline('$'))
4894 endif
4895
4896 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004897 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00004898" call Decho("filter input: ".getline('$'))
4899 endif
4900
4901 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004902 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00004903" call Decho("filter input: ".getline('$'))
4904 endif
4905 for fname in fnamelist
4906 call setline(line("$")+1,'get "'.fname.'"')
4907 endfor
4908" call Decho("filter input: ".getline('$'))
4909
4910 " perform ftp:
4911 " -i : turns off interactive prompting from ftp
4912 " -n unix : DON'T use <.netrc>, even though it exists
4913 " -n win32: quit being obnoxious about password
4914 norm! 1Gdd
4915" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
4916 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
4917 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4918 if getline(1) !~ "^$"
4919" call Decho("error<".getline(1).">")
4920 if !exists("g:netrw_quiet")
4921 call netrw#ErrorMsg(s:ERROR,getline(1),5)
4922 endif
4923 endif
4924 endif
4925
4926 endif
4927
4928 " cleanup
4929 if exists("tmpbufnr")
4930 if bufnr("%") != tmpbufnr
4931 exe tmpbufnr."bw!"
4932 else
4933 q!
4934 endif
4935 endif
4936
4937" call Dret("netrw#NetrwObtain")
4938endfun
4939
4940" ---------------------------------------------------------------------
4941" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
4942" If there's only one window, then the window will first be split.
4943" Returns:
4944" choice = 0 : didn't have to choose
4945" choice = 1 : saved modified file in window first
4946" choice = 2 : didn't save modified file, opened window
4947" choice = 3 : cancel open
4948fun! s:NetrwPrevWinOpen(islocal)
4949" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4950
4951 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
4952 let curdir = b:netrw_curdir
4953
4954 " get last window number and the word currently under the cursor
4955 let lastwinnr = winnr("$")
4956 let curword = s:NetrwGetWord()
4957 let choice = 0
4958" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4959
4960 let didsplit = 0
4961 if lastwinnr == 1
4962 " if only one window, open a new one first
4963" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4964 if g:netrw_preview
4965" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4966 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4967 else
4968" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4969 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4970 endif
4971 let didsplit = 1
4972
4973 else
4974 call s:SaveBufVars()
4975" call Decho("wincmd p")
4976 wincmd p
4977 call s:RestoreBufVars()
4978 " if the previous window's buffer has been changed (is modified),
4979 " and it doesn't appear in any other extant window, then ask the
4980 " user if s/he wants to abandon modifications therein.
4981 let bnr = winbufnr(0)
4982 let bnrcnt = 0
4983 if &mod
4984" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4985 let eikeep= &ei
4986 set ei=all
4987 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4988 exe bnr."wincmd p"
4989 let &ei= eikeep
4990" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4991 if bnrcnt == 1
4992 let bufname= bufname(winbufnr(winnr()))
4993 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4994" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4995
4996 if choice == 1
4997 " Yes -- write file & then browse
4998 let v:errmsg= ""
4999 silent w
5000 if v:errmsg != ""
5001 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
5002 if didsplit
5003 q
5004 else
5005 wincmd p
5006 endif
5007" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
5008 return choice
5009 endif
5010
5011 elseif choice == 2
5012 " No -- don't worry about changed file, just browse anyway
5013 setlocal nomod
5014 call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
5015 wincmd p
5016
5017 else
5018 " Cancel -- don't do this
5019 if didsplit
5020 q
5021 else
5022 wincmd p
5023 endif
5024" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5025 return choice
5026 endif
5027 endif
5028 endif
5029 endif
5030
5031 " restore b:netrw_curdir (window split/enew may have lost it)
5032 let b:netrw_curdir= curdir
5033 if a:islocal < 2
5034 if a:islocal
5035 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5036 else
5037 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5038 endif
5039 endif
5040" call Dret("NetrwPrevWinOpen ".choice)
5041 return choice
5042endfun
5043
5044" ---------------------------------------------------------------------
5045" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5046" Always assumed to be local -> remote
5047" call s:NetrwUpload(filename, target)
5048" call s:NetrwUpload(filename, target, fromdirectory)
5049fun! s:NetrwUpload(fname,tgt,...)
5050" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5051
5052 if a:tgt =~ '^\a\+://'
5053 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5054 else
5055 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5056 endif
5057" call Decho("tgtdir<".tgtdir.">")
5058
5059 if a:0 > 0
5060 let fromdir= a:1
5061 else
5062 let fromdir= getcwd()
5063 endif
5064" call Decho("fromdir<".fromdir.">")
5065
5066 if type(a:fname) == 1
5067 " handle uploading a single file using NetWrite
5068" call Decho("handle uploading a single file via NetWrite")
5069 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005070" call Decho("exe e ".fnameescape(a:fname))
5071 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005072" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5073 if a:tgt =~ '/$'
5074 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005075" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005076 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005077 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005078" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
5079 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005080" call Decho("done writing local->remote")
5081 endif
5082 q!
5083
5084 elseif type(a:fname) == 3
5085 " handle uploading a list of files via scp
5086" call Decho("handle uploading a list of files via scp")
5087 let curdir= getcwd()
5088 if a:tgt =~ '^scp:'
5089 exe "keepjumps silent lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005090 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
5091 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005092 if exists("g:netrw_port") && g:netrw_port != ""
5093 let useport= " ".g:netrw_scpport." ".g:netrw_port
5094 else
5095 let useport= ""
5096 endif
5097 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5098 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005099" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
5100 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005101 exe "keepjumps silent lcd ".fnameescape(curdir)
5102
5103 elseif a:tgt =~ '^ftp:'
5104 call s:NetrwMethod(a:tgt)
5105
5106 if b:netrw_method == 2
5107 " handle uploading a list of files via ftp+.netrc
5108 let netrw_fname = b:netrw_fname
5109 silent keepjumps new
5110" call Decho("filter input window#".winnr())
5111
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005112 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005113" call Decho("filter input: ".getline('$'))
5114
5115 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005116 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005117" call Decho("filter input: ".getline('$'))
5118 endif
5119
5120 call setline(line("$")+1,'lcd "'.fromdir.'"')
5121" call Decho("filter input: ".getline('$'))
5122
5123 call setline(line("$")+1,'cd "'.tgtdir.'"')
5124" call Decho("filter input: ".getline('$'))
5125
5126 for fname in a:fname
5127 call setline(line("$")+1,'put "'.fname.'"')
5128" call Decho("filter input: ".getline('$'))
5129 endfor
5130
5131 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00005132" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5133 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005134 else
5135" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00005136" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5137 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005138 endif
5139 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5140 silent g/Local directory now/d
5141 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5142 call netrw#ErrorMsg(s:ERROR,getline(1),14)
5143 else
5144 bw!|q
5145 endif
5146
5147 elseif b:netrw_method == 3
5148 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5149 let netrw_fname= b:netrw_fname
5150 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5151 let tmpbufnr= bufnr("%")
5152 setlocal ff=unix
5153
5154 if exists("g:netrw_port") && g:netrw_port != ""
5155 put ='open '.g:netrw_machine.' '.g:netrw_port
5156" call Decho("filter input: ".getline('$'))
5157 else
5158 put ='open '.g:netrw_machine
5159" call Decho("filter input: ".getline('$'))
5160 endif
5161
5162 if exists("g:netrw_ftp") && g:netrw_ftp == 1
5163 put =g:netrw_uid
5164" call Decho("filter input: ".getline('$'))
5165 call setline(line("$")+1,'"'.s:netrw_passwd.'"')
5166" call Decho("filter input: ".getline('$'))
5167 else
5168 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
5169" call Decho("filter input: ".getline('$'))
5170 endif
5171
5172 call setline(line("$")+1,'lcd "'.fromdir.'"')
5173" call Decho("filter input: ".getline('$'))
5174
5175 if exists("b:netrw_fname") && b:netrw_fname != ""
5176 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5177" call Decho("filter input: ".getline('$'))
5178 endif
5179
5180 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005181 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005182" call Decho("filter input: ".getline('$'))
5183 endif
5184
5185 for fname in a:fname
5186 call setline(line("$")+1,'put "'.fname.'"')
5187" call Decho("filter input: ".getline('$'))
5188 endfor
5189
5190 " perform ftp:
5191 " -i : turns off interactive prompting from ftp
5192 " -n unix : DON'T use <.netrc>, even though it exists
5193 " -n win32: quit being obnoxious about password
5194 norm! 1Gdd
5195" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n")
5196 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5197 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5198 silent g/Local directory now/d
5199 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5200 let debugkeep= &debug
5201 setlocal debug=msg
5202 call netrw#ErrorMsg(s:ERROR,getline(1),15)
5203 let &debug = debugkeep
5204 let mod = 1
5205 else
5206 bw!|q
5207 endif
5208 endif
5209 else
5210 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5211 endif
5212 endif
5213
5214" call Dret("s:NetrwUpload")
5215endfun
5216
5217" ---------------------------------------------------------------------
5218" s:NetrwPreview: {{{2
5219fun! s:NetrwPreview(path) range
5220" call Dfunc("NetrwPreview(path<".a:path.">)")
5221 call s:NetrwOptionSave("s:")
5222 call s:NetrwSafeOptions()
5223 if has("quickfix")
5224 if !isdirectory(a:path)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005225 exe (g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005226 elseif !exists("g:netrw_quiet")
5227 call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
5228 endif
5229 elseif !exists("g:netrw_quiet")
5230 call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
5231 endif
5232 call s:NetrwOptionRestore("s:")
5233" call Dret("NetrwPreview")
5234endfun
5235
5236" ---------------------------------------------------------------------
5237" s:NetrwRefresh: {{{2
5238fun! s:NetrwRefresh(islocal,dirname)
5239" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
5240 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
5241 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
5242 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
5243 setlocal ma noro
5244" call Decho("setlocal ma noro")
5245" call Decho("clear buffer<".expand("%")."> with :%d")
5246 %d
5247 if a:islocal
5248 call netrw#LocalBrowseCheck(a:dirname)
5249 else
5250 call s:NetrwBrowse(a:islocal,a:dirname)
5251 endif
5252 call netrw#NetrwRestorePosn()
5253
5254 " restore file marks
5255 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
5256" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
5257 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
5258 else
5259" call Decho("2match none")
5260 2match none
5261 endif
5262
5263" redraw!
5264" call Dret("NetrwRefresh")
5265endfun
5266
5267" ---------------------------------------------------------------------
5268" s:NetrwRefreshDir: refreshes a directory by name {{{2
5269" Called by NetrwMarkFileCopy()
5270" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
5271fun! s:NetrwRefreshDir(islocal,dirname)
5272" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
5273 if g:netrw_fastbrowse == 0
5274 " slowest mode (keep buffers refreshed, local or remote)
5275" call Decho("slowest mode: keep buffers refreshed, local or remote")
5276 let tgtwin= bufwinnr(a:dirname)
5277" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
5278
5279 if tgtwin > 0
5280 " tgtwin is being displayed, so refresh it
5281 let curwin= winnr()
5282" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
5283 exe tgtwin."wincmd w"
5284 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5285 exe curwin."wincmd w"
5286
5287 elseif bufnr(a:dirname) > 0
5288 let bn= bufnr(a:dirname)
5289" call Decho("bd bufnr(".a:dirname.")=".bn)
5290 exe "silent bd ".bn
5291 endif
5292
5293 elseif g:netrw_fastbrowse <= 1
5294" call Decho("medium-speed mode: refresh local buffers only")
5295 call s:LocalBrowseShellCmdRefresh()
5296 endif
5297" call Dret("s:NetrwRefreshDir")
5298endfun
5299
5300" ---------------------------------------------------------------------
5301" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
5302" What this function does is to compute a priority for the patterns
5303" in the g:netrw_sort_sequence. It applies a substitute to any
5304" "files" that satisfy each pattern, putting the priority / in
5305" front. An "*" pattern handles the default priority.
5306fun! s:NetrwSetSort()
5307" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
5308 if w:netrw_liststyle == s:LONGLIST
5309 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
5310 else
5311 let seqlist = g:netrw_sort_sequence
5312 endif
5313 " sanity check -- insure that * appears somewhere
5314 if seqlist == ""
5315 let seqlist= '*'
5316 elseif seqlist !~ '\*'
5317 let seqlist= seqlist.',*'
5318 endif
5319 let priority = 1
5320 while seqlist != ""
5321 if seqlist =~ ','
5322 let seq = substitute(seqlist,',.*$','','e')
5323 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5324 else
5325 let seq = seqlist
5326 let seqlist = ""
5327 endif
5328 let sepchr= "\<Char-0xff>"
5329 if priority < 10
5330 let spriority= "00".priority.sepchr
5331 elseif priority < 100
5332 let spriority= "0".priority.sepchr
5333 else
5334 let spriority= priority.sepchr
5335 endif
5336" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
5337
5338 " sanity check
5339 if w:netrw_bannercnt > line("$")
5340 " apparently no files were left after a Hiding pattern was used
5341" call Dret("SetSort : no files left after hiding")
5342 return
5343 endif
5344 if seq == '*'
5345 let starpriority= spriority
5346 else
5347 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
5348 " sometimes multiple sorting patterns will match the same file or directory.
5349 " The following substitute is intended to remove the excess matches.
5350 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e'
5351 endif
5352 let priority = priority + 1
5353 endwhile
5354 if exists("starpriority")
5355 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/'
5356 endif
5357
5358 " Following line associated with priority -- items that satisfy a priority
5359 " pattern get prefixed by ###/ which permits easy sorting by priority.
5360 " Sometimes files can satisfy multiple priority patterns -- only the latest
5361 " priority pattern needs to be retained. So, at this point, these excess
5362 " priority prefixes need to be removed, but not directories that happen to
5363 " be just digits themselves.
5364 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e'
5365
5366" call Dret("SetSort")
5367endfun
5368
5369" =====================================================================
5370" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
5371fun! s:NetrwSortStyle(islocal)
5372" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
5373 call s:NetrwSaveWordPosn()
5374 let svpos= netrw#NetrwSavePosn()
5375
5376 let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
5377 norm! 0
5378 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5379 call netrw#NetrwRestorePosn(svpos)
5380
5381" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
5382endfun
5383
5384" ---------------------------------------------------------------------
5385" s:NetrwSplit: mode {{{2
5386" =0 : net and o
5387" =1 : net and t
5388" =2 : net and v
5389" =3 : local and o
5390" =4 : local and t
5391" =5 : local and v
5392fun! s:NetrwSplit(mode)
5393" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
5394
5395 call s:SaveWinVars()
5396
5397 if a:mode == 0
5398 " remote and o
5399" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5400 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5401 let s:didsplit= 1
5402 call s:RestoreWinVars()
5403 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5404 unlet s:didsplit
5405
5406 elseif a:mode == 1
5407 " remote and t
5408 let cursorword = s:NetrwGetWord()
5409" call Decho("tabnew")
5410 tabnew
5411 let s:didsplit= 1
5412 call s:RestoreWinVars()
5413 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword))
5414 unlet s:didsplit
5415
5416 elseif a:mode == 2
5417 " remote and v
5418" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5419 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5420 let s:didsplit= 1
5421 call s:RestoreWinVars()
5422 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5423 unlet s:didsplit
5424
5425 elseif a:mode == 3
5426 " local and o
5427" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5428 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5429 let s:didsplit= 1
5430 call s:RestoreWinVars()
5431 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5432 unlet s:didsplit
5433
5434 elseif a:mode == 4
5435 " local and t
5436 let netrw_curdir= b:netrw_curdir
5437 let cursorword = s:NetrwGetWord()
5438" call Decho("tabnew")
5439 tabnew
5440 let b:netrw_curdir= netrw_curdir
5441 let s:didsplit= 1
5442 call s:RestoreWinVars()
5443 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
5444 unlet s:didsplit
5445
5446 elseif a:mode == 5
5447 " local and v
5448" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5449 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5450 let s:didsplit= 1
5451 call s:RestoreWinVars()
5452 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5453 unlet s:didsplit
5454
5455 else
5456 call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
5457 endif
5458
5459" call Dret("s:NetrwSplit")
5460endfun
5461
5462" ---------------------------------------------------------------------
5463" NetrwStatusLine: {{{2
5464fun! NetrwStatusLine()
5465
5466" vvv NetrwStatusLine() debugging vvv
5467" let g:stlmsg=""
5468" if !exists("w:netrw_explore_bufnr")
5469" let g:stlmsg="!X<explore_bufnr>"
5470" elseif w:netrw_explore_bufnr != bufnr("%")
5471" let g:stlmsg="explore_bufnr!=".bufnr("%")
5472" endif
5473" if !exists("w:netrw_explore_line")
5474" let g:stlmsg=" !X<explore_line>"
5475" elseif w:netrw_explore_line != line(".")
5476" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
5477" endif
5478" if !exists("w:netrw_explore_list")
5479" let g:stlmsg=" !X<explore_list>"
5480" endif
5481" ^^^ NetrwStatusLine() debugging ^^^
5482
5483 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")
5484 " restore user's status line
5485 let &stl = s:netrw_users_stl
5486 let &laststatus = s:netrw_users_ls
5487 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
5488 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
5489 return ""
5490 else
5491 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5492 endif
5493endfun
5494
5495" ---------------------------------------------------------------------
5496" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
5497" (full path directory with trailing slash returned)
5498fun! s:NetrwTreeDir()
5499" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
5500
5501 let treedir= b:netrw_curdir
5502" call Decho("set initial treedir<".treedir.">")
5503 let s:treecurpos= netrw#NetrwSavePosn()
5504
5505 if w:netrw_liststyle == s:TREELIST
5506" call Decho("w:netrrw_liststyle is TREELIST:")
5507" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
5508 if getline('.') =~ '/$'
5509 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
5510 else
5511 let treedir= ""
5512 endif
5513
5514" call Decho("treedir<".treedir.">")
5515
5516 " detect user attempting to close treeroot
5517 if getline('.') !~ '|' && getline('.') != '..'
5518" call Decho("user attempted to close treeroot")
5519 " now force a refresh
5520" call Decho("clear buffer<".expand("%")."> with :%d")
5521 keepjumps %d
5522" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5523 return b:netrw_curdir
5524 endif
5525
5526 " elide all non-depth information
5527 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
5528" call Decho("depth<".depth."> 1st subst")
5529
5530 " elide first depth
5531 let depth = substitute(depth,'^| ','','')
5532" call Decho("depth<".depth."> 2nd subst")
5533
5534 " construct treedir by searching backwards at correct depth
5535" call Decho("constructing treedir<".treedir."> depth<".depth.">")
5536 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
5537 let dirname= substitute(getline('.'),'^\(| \)*','','e')
5538 let treedir= dirname.treedir
5539 let depth = substitute(depth,'^| ','','')
5540" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
5541 endwhile
5542 if w:netrw_treetop =~ '/$'
5543 let treedir= w:netrw_treetop.treedir
5544 else
5545 let treedir= w:netrw_treetop.'/'.treedir
5546 endif
5547" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
5548 endif
5549 let treedir= substitute(treedir,'//$','/','')
5550
5551" " now force a refresh
5552"" call DECHO("clear buffer<".expand("%")."> with :%d")
5553" setlocal ma noro
5554" keepjumps %d
5555
5556" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5557 return treedir
5558endfun
5559
5560" ---------------------------------------------------------------------
5561" s:NetrwTreeDisplay: recursive tree display {{{2
5562fun! s:NetrwTreeDisplay(dir,depth)
5563" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
5564
5565 " insure that there are no folds
5566 setlocal nofen
5567
5568 " install ../ and shortdir
5569 if a:depth == ""
5570 call setline(line("$")+1,'../')
5571" call Decho("setline#".line("$")." ../ (depth is zero)")
5572 endif
5573 if a:dir =~ '^\a\+://'
5574 if a:dir == w:netrw_treetop
5575 let shortdir= a:dir
5576 else
5577 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
5578 endif
5579 call setline(line("$")+1,a:depth.shortdir)
5580 else
5581 let shortdir= substitute(a:dir,'^.*/','','e')
5582 call setline(line("$")+1,a:depth.shortdir.'/')
5583 endif
5584" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
5585
5586 " append a / to dir if its missing one
5587 let dir= a:dir
5588 if dir !~ '/$'
5589 let dir= dir.'/'
5590 endif
5591
5592 " display subtrees (if any)
5593 let depth= "| ".a:depth
5594
5595" call Decho("display subtrees with depth<".depth."> and current leaves")
5596 for entry in w:netrw_treedict[a:dir]
5597 let direntry= substitute(dir.entry,'/$','','e')
5598" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
5599 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
5600" call Decho("<".direntry."> is a key in treedict - display subtree for it")
5601 call s:NetrwTreeDisplay(direntry,depth)
5602 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
5603" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
5604 call s:NetrwTreeDisplay(direntry.'/',depth)
5605 else
5606" call Decho("<".entry."> is not a key in treedict (no subtree)")
5607 call setline(line("$")+1,depth.entry)
5608 endif
5609 endfor
5610" call Dret("NetrwTreeDisplay")
5611endfun
5612
5613" ---------------------------------------------------------------------
5614" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
5615fun! s:NetrwTreeListing(dirname)
5616 if w:netrw_liststyle == s:TREELIST
5617" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
5618" call Decho("curdir<".a:dirname.">")
5619" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exit")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"))
5620
5621 " update the treetop
5622" call Decho("update the treetop")
5623 if !exists("w:netrw_treetop")
5624 let w:netrw_treetop= a:dirname
5625" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
5626 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
5627 let w:netrw_treetop= a:dirname
5628" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
5629 endif
5630
5631 " insure that we have at least an empty treedict
5632 if !exists("w:netrw_treedict")
5633 let w:netrw_treedict= {}
5634 endif
5635
5636 " update the directory listing for the current directory
5637" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
5638" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
5639 exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
5640 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
5641" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname])
5642 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
5643
5644 " if past banner, record word
5645 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
5646 let fname= expand("<cword>")
5647 else
5648 let fname= ""
5649 endif
5650" call Decho("fname<".fname.">")
5651
5652 " display from treetop on down
5653 call s:NetrwTreeDisplay(w:netrw_treetop,"")
5654
5655" call Dret("NetrwTreeListing : bufname<".expand("%").">")
5656 endif
5657endfun
5658
5659" ---------------------------------------------------------------------
5660" s:NetrwWideListing: {{{2
5661fun! s:NetrwWideListing()
5662
5663 if w:netrw_liststyle == s:WIDELIST
5664" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
5665 " look for longest filename (cpf=characters per filename)
5666 " cpf: characters per file
5667 " fpl: files per line
5668 " fpc: files per column
5669 setlocal ma noro
5670" call Decho("setlocal ma noro")
5671 let b:netrw_cpf= 0
5672 if line("$") >= w:netrw_bannercnt
5673 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
5674 else
5675" call Dret("NetrwWideListing")
5676 return
5677 endif
5678" call Decho("max file strlen+1=".b:netrw_cpf)
5679 let b:netrw_cpf= b:netrw_cpf + 1
5680
5681 " determine qty files per line (fpl)
5682 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
5683 if w:netrw_fpl <= 0
5684 let w:netrw_fpl= 1
5685 endif
5686" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
5687
5688 " make wide display
5689 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
5690 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
5691 let newcolstart = w:netrw_bannercnt + fpc
5692 let newcolend = newcolstart + fpc - 1
5693" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
5694 silent! let keepregstar = @*
5695 while line("$") >= newcolstart
5696 if newcolend > line("$") | let newcolend= line("$") | endif
5697 let newcolqty= newcolend - newcolstart
5698 exe newcolstart
5699 if newcolqty == 0
5700 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
5701 else
5702 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
5703 endif
5704 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
5705 exe 'silent keepjumps '.w:netrw_bannercnt
5706 endwhile
5707 silent! let @*= keepregstar
5708 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
5709 setlocal noma nomod ro
5710" call Dret("NetrwWideListing")
5711 endif
5712
5713endfun
5714
5715" ---------------------------------------------------------------------
5716" s:PerformListing: {{{2
5717fun! s:PerformListing(islocal)
5718" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
5719
5720 call s:NetrwSafeOptions()
5721 setlocal noro ma
5722" call Decho("setlocal noro ma")
5723
5724" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
5725" call Decho("(netrw) Processing your browsing request...")
5726" endif " Decho
5727
5728" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
5729 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5730 " force a refresh for tree listings
5731" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
5732 keepjumps %d
5733 endif
5734
5735 " save current directory on directory history list
5736 call s:NetrwBookmarkDir(3,b:netrw_curdir)
5737
5738 " Set up the banner {{{3
5739" call Decho("set up banner")
5740 keepjumps put ='\" ============================================================================'
5741 keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
5742 keepjumps put ='\" '.b:netrw_curdir
5743 keepjumps 1d
5744 let w:netrw_bannercnt= 3
5745 exe "keepjumps ".w:netrw_bannercnt
5746
5747 let sortby= g:netrw_sort_by
5748 if g:netrw_sort_direction =~ "^r"
5749 let sortby= sortby." reversed"
5750 endif
5751
5752 " Sorted by... {{{3
5753" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
5754 if g:netrw_sort_by =~ "^n"
5755" call Decho("directories will be sorted by name")
5756 " sorted by name
5757 keepjumps put ='\" Sorted by '.sortby
5758 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
5759 let w:netrw_bannercnt= w:netrw_bannercnt + 2
5760 else
5761" call Decho("directories will be sorted by size or time")
5762 " sorted by size or date
5763 keepjumps put ='\" Sorted by '.sortby
5764 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5765 endif
5766 exe "keepjumps ".w:netrw_bannercnt
5767
5768 " show copy/move target, if any
5769 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
5770" call Decho("show copy/move target<".s:netrwmftgt.">")
5771 keepjumps put =''
5772 if s:netrwmftgt_islocal
5773 call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
5774 else
5775 call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
5776 endif
5777 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5778 else
5779" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
5780 endif
5781 exe "keepjumps ".w:netrw_bannercnt
5782
5783 " Hiding... -or- Showing... {{{3
5784" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
5785 if g:netrw_list_hide != "" && g:netrw_hide
5786 if g:netrw_hide == 1
5787 keepjumps put ='\" Hiding: '.g:netrw_list_hide
5788 else
5789 keepjumps put ='\" Showing: '.g:netrw_list_hide
5790 endif
5791 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5792 endif
5793 exe "keepjumps ".w:netrw_bannercnt
5794 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
5795 keepjumps put ='\" ============================================================================'
5796 let w:netrw_bannercnt= w:netrw_bannercnt + 2
5797
5798 " bannercnt should index the line just after the banner
5799 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5800 exe "keepjumps ".w:netrw_bannercnt
5801" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
5802
5803 " set up syntax highlighting {{{3
5804" call Decho("set up syntax highlighting")
5805 if has("syntax")
5806 setlocal ft=netrw
5807 if !exists("g:syntax_on") || !g:syntax_on
5808 setlocal ft=
5809 endif
5810 endif
5811
5812 " get list of files
5813" call Decho("Get list of files - islocal=".a:islocal)
5814 if a:islocal
5815 call s:LocalListing()
5816 else " remote
5817 call s:NetrwRemoteListing()
5818 endif
5819" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
5820
5821 " manipulate the directory listing (hide, sort) {{{3
5822 if line("$") >= w:netrw_bannercnt
5823" call Decho("manipulate directory listing (hide)")
5824" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
5825 if g:netrw_hide && g:netrw_list_hide != ""
5826 call s:NetrwListHide()
5827 endif
5828 if line("$") >= w:netrw_bannercnt
5829" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
5830
5831 if g:netrw_sort_by =~ "^n"
5832 " sort by name
5833 call s:NetrwSetSort()
5834
5835 if w:netrw_bannercnt < line("$")
5836" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
5837 if g:netrw_sort_direction =~ 'n'
5838 " normal direction sorting
Bram Moolenaarc236c162008-07-13 17:41:49 +00005839 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005840 else
5841 " reverse direction sorting
Bram Moolenaarc236c162008-07-13 17:41:49 +00005842 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005843 endif
5844 endif
5845 " remove priority pattern prefix
5846" call Decho("remove priority pattern prefix")
5847 let sepchr= "\<Char-0xff>"
5848 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e'
5849
5850 elseif a:islocal
5851 if w:netrw_bannercnt < line("$")
5852" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
5853 if g:netrw_sort_direction =~ 'n'
5854" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005855 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005856 else
5857" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005858 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005859 endif
5860 endif
5861 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
5862 endif
5863
5864 elseif g:netrw_sort_direction =~ 'r'
5865" call Decho('reverse the sorted listing')
5866 exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
5867 endif
5868 endif
5869
5870 " convert to wide/tree listing {{{3
5871" call Decho("modify display if wide/tree listing style")
5872 call s:NetrwWideListing()
5873 call s:NetrwTreeListing(b:netrw_curdir)
5874
5875 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
5876 " place cursor on the top-left corner of the file listing
5877" call Decho("place cursor on top-left corner of file listing")
5878 exe 'silent keepjumps '.w:netrw_bannercnt
5879 norm! 0
5880 endif
5881
5882 " record previous current directory
5883 let w:netrw_prvdir= b:netrw_curdir
5884" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
5885
5886 " save certain window-oriented variables into buffer-oriented variables {{{3
5887 call s:SetBufWinVars()
5888 call s:NetrwOptionRestore("w:")
5889
5890 " set display to netrw display settings
5891" call Decho("set display to netrw display settings (noma nomod etc)")
5892 setlocal noma nomod nonu nobl nowrap ro
5893 if exists("s:treecurpos")
5894
5895 call netrw#NetrwRestorePosn(s:treecurpos)
5896 unlet s:treecurpos
5897 endif
5898
5899" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
5900endfun
5901
5902" ---------------------------------------------------------------------
5903" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00005904fun! s:SetupNetrwStatusLine(statline)
5905" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5906
5907 if !exists("s:netrw_setup_statline")
5908 let s:netrw_setup_statline= 1
5909" call Decho("do first-time status line setup")
5910
5911 if !exists("s:netrw_users_stl")
5912 let s:netrw_users_stl= &stl
5913 endif
5914 if !exists("s:netrw_users_ls")
5915 let s:netrw_users_ls= &laststatus
5916 endif
5917
5918 " set up User9 highlighting as needed
5919 let keepa= @a
5920 redir @a
5921 try
5922 hi User9
5923 catch /^Vim\%((\a\+)\)\=:E411/
5924 if &bg == "dark"
5925 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5926 else
5927 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5928 endif
5929 endtry
5930 redir END
5931 let @a= keepa
5932 endif
5933
5934 " set up status line (may use User9 highlighting)
5935 " insure that windows have a statusline
5936 " make sure statusline is displayed
5937 let &stl=a:statline
5938 setlocal laststatus=2
5939" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005940 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00005941
5942" call Dret("SetupNetrwStatusLine : stl=".&stl)
5943endfun
5944
5945" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005946" Remote Directory Browsing Support: {{{1
5947" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00005948
5949" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005950" s:NetrwRemoteListing: {{{2
5951fun! s:NetrwRemoteListing()
5952" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00005953
Bram Moolenaar446cb832008-06-24 21:56:24 +00005954 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005955
Bram Moolenaar446cb832008-06-24 21:56:24 +00005956 " sanity check:
5957 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
5958" call Decho("b:netrw_method=".b:netrw_method)
5959 if !executable("ftp")
5960 if !exists("g:netrw_quiet")
5961 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
5962 endif
5963 call s:NetrwOptionRestore("w:")
5964" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005965 return
5966 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005967
5968 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
5969 if !exists("g:netrw_quiet")
5970 if g:netrw_list_cmd == ""
5971 call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
5972 else
5973 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
5974 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005975 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005976
Bram Moolenaar446cb832008-06-24 21:56:24 +00005977 call s:NetrwOptionRestore("w:")
5978" call Dret("s:NetrwRemoteListing")
5979 return
5980 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005981
Bram Moolenaar446cb832008-06-24 21:56:24 +00005982 if exists("b:netrw_method")
5983" call Decho("setting w:netrw_method<".b:netrw_method.">")
5984 let w:netrw_method= b:netrw_method
5985 endif
5986
5987 if s:method == "ftp"
5988 " use ftp to get remote file listing
5989" call Decho("use ftp to get remote file listing")
5990 let s:method = "ftp"
5991 let listcmd = g:netrw_ftp_list_cmd
5992 if g:netrw_sort_by =~ '^t'
5993 let listcmd= g:netrw_ftp_timelist_cmd
5994 elseif g:netrw_sort_by =~ '^s'
5995 let listcmd= g:netrw_ftp_sizelist_cmd
5996 endif
5997" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
5998 call s:NetrwRemoteFtpCmd(s:path,listcmd)
5999" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
6000
6001 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6002 " shorten the listing
6003" call Decho("generate short listing")
6004 exe "keepjumps ".w:netrw_bannercnt
6005
6006 " cleanup
6007 if g:netrw_ftp_browse_reject != ""
6008 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
6009 endif
6010 silent! keepjumps %s/\r$//e
6011
6012 " if there's no ../ listed, then put ./ and ../ in
6013 let line1= line(".")
6014 exe "keepjumps ".w:netrw_bannercnt
6015 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
6016 if line2 == 0
6017" call Decho("netrw is putting ./ and ../ into listing")
6018 keepjumps put='../'
6019 keepjumps put='./'
6020 endif
6021 exe "keepjumps ".line1
6022 keepjumps norm! 0
6023
6024" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
6025 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6026" call Decho("M$ ftp cleanup")
6027 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
6028 else " normal ftp cleanup
6029" call Decho("normal ftp cleanup")
6030 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
6031 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
6032 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
6033 endif
6034 endif
6035
6036 else
6037 " use ssh to get remote file listing {{{3
6038" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
6039 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
6040" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
6041 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006042" call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1))
6043 exe "silent r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006044 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
6045 g/^Listing directory/d
6046 g/^d[-rwx][-rwx][-rwx]/s+$+/+e
6047 silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e
6048 if g:netrw_liststyle != s:LONGLIST
6049 g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e
6050 endif
6051 else
6052 if s:path == ""
6053" call Decho("2: exe silent r! ".listcmd)
6054 exe "silent r! ".listcmd
6055 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006056" call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1))
6057 exe "silent r! ".listcmd.' '.shellescape(s:path,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006058" call Decho("listcmd<".listcmd."> path<".s:path.">")
6059 endif
6060 endif
6061
6062 " cleanup
6063 if g:netrw_ftp_browse_reject != ""
6064" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
6065 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
6066 endif
6067 endif
6068
6069 if w:netrw_liststyle == s:LONGLIST
6070 " do a long listing; these substitutions need to be done prior to sorting {{{3
6071" call Decho("fix long listing:")
6072
6073 if s:method == "ftp"
6074 " cleanup
6075 exe "keepjumps ".w:netrw_bannercnt
6076 while getline('.') =~ g:netrw_ftp_browse_reject
6077 keepjumps d
6078 endwhile
6079 " if there's no ../ listed, then put ./ and ../ in
6080 let line1= line(".")
6081 keepjumps 1
6082 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
6083 let line2= line(".")
6084 if line2 == 0
6085 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
6086 if b:netrw_curdir != '/'
6087 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
6088 endif
6089 endif
6090 exe "keepjumps ".line1
6091 keepjumps norm! 0
6092 endif
6093
6094 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6095" call Decho("M$ ftp site listing cleanup")
6096 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
6097 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6098" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
6099 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
6100 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6101 exe 'silent keepjumps '.w:netrw_bannercnt
6102 endif
6103 endif
6104
6105" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
6106" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
6107" endif " Decho
6108" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006109endfun
6110
Bram Moolenaar446cb832008-06-24 21:56:24 +00006111" ---------------------------------------------------------------------
6112" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6113fun! s:NetrwRemoteRm(usrhost,path) range
6114" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6115" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6116 let svpos= netrw#NetrwSavePosn()
6117
6118 let all= 0
6119 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6120 " remove all marked files
6121 for fname in s:netrwmarkfilelist_{bufnr("%")}
6122 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6123 if ok =~ 'q\%[uit]'
6124 break
6125 elseif ok =~ 'a\%[ll]'
6126 let all= 1
6127 endif
6128 endfor
6129 unlet s:netrwmarkfilelist_{bufnr("%")}
6130 unlet s:netrwmarkfilemtch_{bufnr("%")}
6131 2match none
6132
6133 else
6134 " remove files specified by range
6135
6136 " preparation for removing multiple files/directories
6137 let ctr= a:firstline
6138
6139 " remove multiple files and directories
6140 while ctr <= a:lastline
6141 exe ctr
6142 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6143 if ok =~ 'q\%[uit]'
6144 break
6145 elseif ok =~ 'a\%[ll]'
6146 let all= 1
6147 endif
6148 let ctr= ctr + 1
6149 endwhile
6150 endif
6151
6152 " refresh the (remote) directory listing
6153" call Decho("refresh remote directory listing")
6154 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6155 call netrw#NetrwRestorePosn(svpos)
6156
6157" call Dret("s:NetrwRemoteRm")
6158endfun
6159
6160" ---------------------------------------------------------------------
6161" s:NetrwRemoteRmFile: {{{2
6162fun! s:NetrwRemoteRmFile(path,rmfile,all)
6163" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6164
6165 let all= a:all
6166 let ok = ""
6167
6168 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6169 " attempt to remove file
6170" call Decho("attempt to remove file (all=".all.")")
6171 if !all
6172 echohl Statement
6173" call Decho("case all=0:")
6174 call inputsave()
6175 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6176 call inputrestore()
6177 echohl NONE
6178 if ok == ""
6179 let ok="no"
6180 endif
6181 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6182 if ok =~ 'a\%[ll]'
6183 let all= 1
6184 endif
6185 endif
6186
6187 if all || ok =~ 'y\%[es]' || ok == ""
6188" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
6189 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6190" call Decho("case ftp:")
6191 let path= a:path
6192 if path =~ '^\a\+://'
6193 let path= substitute(path,'^\a\+://[^/]\+/','','')
6194 endif
6195 silent! keepjumps .,$d
6196 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
6197 else
6198" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
6199 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
6200" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6201 if !exists("b:netrw_curdir")
6202 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
6203 let ok="q"
6204 else
6205 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6206" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6207" call Decho("remotedir<".remotedir.">")
6208" call Decho("rmfile<".a:rmfile.">")
6209 if remotedir != ""
6210 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
6211 else
6212 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
6213 endif
6214" call Decho("call system(".netrw_rm_cmd.")")
6215 let ret= system(netrw_rm_cmd)
6216 if ret != 0
6217 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
6218 endif
6219" call Decho("returned=".ret." errcode=".v:shell_error)
6220 endif
6221 endif
6222 elseif ok =~ 'q\%[uit]'
6223" call Decho("ok==".ok)
6224 break
6225 endif
6226
6227 else
6228 " attempt to remove directory
6229" call Decho("attempt to remove directory")
6230 if !all
6231 call inputsave()
6232 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6233 call inputrestore()
6234 if ok == ""
6235 let ok="no"
6236 endif
6237 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6238 if ok =~ 'a\%[ll]'
6239 let all= 1
6240 endif
6241 endif
6242
6243 if all || ok =~ 'y\%[es]' || ok == ""
6244 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6245 call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
6246 else
6247 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006248 let netrw_rmdir_cmd = s:MakeSshCmd(s:WinPath(g:netrw_rmdir_cmd)).' '.shellescape(s:WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006249" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006250 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006251" call Decho("returned=".ret." errcode=".v:shell_error)
6252
6253 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00006254" call Decho("v:shell_error not 0")
6255 let netrw_rmf_cmd= s:MakeSshCmd(s:WinPath(g:netrw_rmf_cmd)).' '.shellescape(s:WinPath(substitute(rmfile,'[\/]$','','e')))
6256" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
6257 let ret= system(netrw_rmf_cmd)
6258" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006259
6260 if v:shell_error != 0 && !exists("g:netrw_quiet")
6261 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
6262 endif
6263 endif
6264 endif
6265
6266 elseif ok =~ 'q\%[uit]'
6267 break
6268 endif
6269 endif
6270
6271" call Dret("s:NetrwRemoteRmFile ".ok)
6272 return ok
6273endfun
6274
6275" ---------------------------------------------------------------------
6276" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
6277" This function assumes that a long listing will be received. Size, time,
6278" and reverse sorts will be requested of the server but not otherwise
6279" enforced here.
6280fun! s:NetrwRemoteFtpCmd(path,listcmd)
6281" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
6282" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
6283
6284 " because WinXX ftp uses unix style input
6285 let ffkeep= &ff
6286 setlocal ma ff=unix noro
6287" call Decho("setlocal ma ff=unix noro")
6288
6289 " clear off any older non-banner lines
6290 " note that w:netrw_bannercnt indexes the line after the banner
6291" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
6292 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
6293
6294 ".........................................
6295 if w:netrw_method == 2 || w:netrw_method == 5
6296 " ftp + <.netrc>: Method #2
6297 if a:path != ""
6298 put ='cd \"'.a:path.'\"'
6299 endif
6300 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006301 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006302" call Decho("filter input: ".getline('.'))
6303 endif
6304 call setline(line("$")+1,a:listcmd)
6305" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6306 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006307" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6308 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006309 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006310" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6311 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006312 endif
6313
6314 ".........................................
6315 elseif w:netrw_method == 3
6316 " ftp + machine,id,passwd,filename: Method #3
6317 setlocal ff=unix
6318 if exists("g:netrw_port") && g:netrw_port != ""
6319 put ='open '.g:netrw_machine.' '.g:netrw_port
6320 else
6321 put ='open '.g:netrw_machine
6322 endif
6323
6324 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6325 put =g:netrw_uid
6326 put ='\"'.s:netrw_passwd.'\"'
6327 else
6328 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6329 endif
6330
6331 if a:path != ""
6332 put ='cd \"'.a:path.'\"'
6333 endif
6334 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006335 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006336" call Decho("filter input: ".getline('.'))
6337 endif
6338 call setline(line("$")+1,a:listcmd)
6339
6340 " perform ftp:
6341 " -i : turns off interactive prompting from ftp
6342 " -n unix : DON'T use <.netrc>, even though it exists
6343 " -n win32: quit being obnoxious about password
6344" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6345" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
6346 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
6347
6348 ".........................................
6349 else
6350 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
6351 endif
6352
6353 " cleanup for Windows
6354 if has("win32") || has("win95") || has("win64") || has("win16")
6355 silent! keepjumps %s/\r$//e
6356 endif
6357 if a:listcmd == "dir"
6358 " infer directory/link based on the file permission string
6359 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
6360 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
6361 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6362 exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
6363 endif
6364 endif
6365
6366 " ftp's listing doesn't seem to include ./ or ../
6367 if !search('^\.\/$\|\s\.\/$','wn')
6368 exe 'keepjumps '.w:netrw_bannercnt
6369 put ='./'
6370 endif
6371 if !search('^\.\.\/$\|\s\.\.\/$','wn')
6372 exe 'keepjumps '.w:netrw_bannercnt
6373 put ='../'
6374 endif
6375
6376 " restore settings
6377 let &ff= ffkeep
6378" call Dret("NetrwRemoteFtpCmd")
6379endfun
6380
6381" ---------------------------------------------------------------------
6382" s:NetrwRemoteRename: rename a remote file or directory {{{2
6383fun! s:NetrwRemoteRename(usrhost,path) range
6384" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
6385
6386 " preparation for removing multiple files/directories
6387 let svpos = netrw#NetrwSavePosn()
6388 let ctr = a:firstline
6389 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
6390
6391 " rename files given by the markfilelist
6392 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6393 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6394" call Decho("oldname<".oldname.">")
6395 if exists("subfrom")
6396 let newname= substitute(oldname,subfrom,subto,'')
6397" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6398 else
6399 call inputsave()
6400 let newname= input("Moving ".oldname." to : ",oldname)
6401 call inputrestore()
6402 if newname =~ '^s/'
6403 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6404 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6405 let newname = substitute(oldname,subfrom,subto,'')
6406" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6407 endif
6408 endif
6409
6410 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6411 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6412 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006413 let oldname= shellescape(a:path.oldname)
6414 let newname= shellescape(a:path.newname)
6415" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")")
6416 let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006417 endif
6418
6419 endfor
6420 call s:NetrwUnMarkFile(1)
6421
6422 else
6423
6424 " attempt to rename files/directories
6425 while ctr <= a:lastline
6426 exe "keepjumps ".ctr
6427
6428 let oldname= s:NetrwGetWord()
6429" call Decho("oldname<".oldname.">")
6430
6431 call inputsave()
6432 let newname= input("Moving ".oldname." to : ",oldname)
6433 call inputrestore()
6434
6435 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6436 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6437 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006438 let oldname= shellescape(a:path.oldname)
6439 let newname= shellescape(a:path.newname)
6440" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")")
6441 let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006442 endif
6443
6444 let ctr= ctr + 1
6445 endwhile
6446 endif
6447
6448 " refresh the directory
6449 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6450 call netrw#NetrwRestorePosn(svpos)
6451
6452" call Dret("NetrwRemoteRename")
6453endfun
6454
6455" ---------------------------------------------------------------------
6456" Local Directory Browsing Support: {{{1
6457" ==========================================
6458
6459" ---------------------------------------------------------------------
6460" netrw#LocalBrowseCheck: {{{2
6461fun! netrw#LocalBrowseCheck(dirname)
6462 " unfortunate interaction -- split window debugging can't be
6463 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
6464 " event triggers another call to LocalBrowseCheck() when attempts
6465 " to write to the DBG buffer are made.
6466 " The &ft == "netrw" test was installed because the BufEnter event
6467 " would hit when re-entering netrw windows, creating unexpected
6468 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
6469" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname))
6470 if isdirectory(a:dirname)
6471" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
6472 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
6473 silent! call s:NetrwBrowse(1,a:dirname)
6474 elseif &ft == "netrw" && line("$") == 1
6475 silent! call s:NetrwBrowse(1,a:dirname)
6476 endif
6477 endif
6478 " not a directory, ignore it
6479endfun
6480
6481" ---------------------------------------------------------------------
6482" s:LocalListing: does the job of "ls" for local directories {{{2
6483fun! s:LocalListing()
6484" call Dfunc("s:LocalListing()")
6485" call Decho("&ma=".&ma)
6486" call Decho("&mod=".&mod)
6487" call Decho("&ro=".&ro)
6488" call Decho("bufname(%)<".bufname("%").">")
6489
6490" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
6491" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif
6492
6493 " get the list of files contained in the current directory
6494 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6495 let dirnamelen = strlen(b:netrw_curdir)
6496 let filelist = glob(s:ComposePath(dirname,"*"))
6497" call Decho("glob(dirname<".dirname."/*>)=".filelist)
6498 if filelist != ""
6499 let filelist= filelist."\n"
6500 endif
6501 let filelist= filelist.glob(s:ComposePath(dirname,".*"))
6502" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
6503
6504 " Coding choice: either elide ./ if present
6505 " or include ./ if not present
6506 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
6507 " elide /path/. from glob() entries if present
6508" call Decho("elide /path/. from glob entries if present")
6509 let filelist = substitute(filelist,'\n','\t','g')
6510 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
6511 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
6512 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
6513 let filelist = substitute(filelist,'\t','\n','g')
6514 endif
6515" call Decho("filelist<".filelist.">")
6516 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
6517 " include ../ in the glob() entry if its missing
6518" call Decho("forcibly tacking on ..")
6519 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
6520" call Decho("filelist<".filelist.">")
6521 endif
6522 if b:netrw_curdir == '/'
6523 " remove .. from filelist when current directory is root directory
6524" call Decho("remove .. from filelist")
6525 let filelist= substitute(filelist,'/\.\.\n','','')
6526 endif
6527 " remove multiple contiguous newlines
6528 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
6529 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6530 " change all \s to /s
6531" call Decho('change all \s to /s')
6532 let filelist= substitute(filelist,'\','/','g')
6533 else
6534 " escape all \s to \\
6535" call Decho('escape all \s to \\')
6536 let filelist= substitute(filelist,'\','\\','g')
6537 endif
6538
6539" call Decho("(before while) dirname<".dirname.">")
6540" call Decho("(before while) dirnamelen<".dirnamelen.">")
6541" call Decho("(before while) filelist<".filelist.">")
6542
6543 while filelist != ""
6544 if filelist =~ '\n'
6545 let filename = substitute(filelist,'\n.*$','','e')
6546 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
6547 else
6548 let filename = filelist
6549 let filelist = ""
6550 endif
6551" call Decho(" ")
6552" call Decho("(while) filelist<".filelist.">")
6553" call Decho("(while) filename<".filename.">")
6554
6555 if getftype(filename) == "link"
6556 " indicate a symbolic link
6557" call Decho("indicate <".filename."> is a symbolic link with trailing @")
6558 let pfile= filename."@"
6559
6560 elseif getftype(filename) == "socket"
6561 " indicate a socket
6562" call Decho("indicate <".filename."> is a socket with trailing =")
6563 let pfile= filename."="
6564
6565 elseif getftype(filename) == "fifo"
6566 " indicate a fifo
6567" call Decho("indicate <".filename."> is a fifo with trailing |")
6568 let pfile= filename."|"
6569
6570 elseif isdirectory(filename)
6571 " indicate a directory
6572" call Decho("indicate <".filename."> is a directory with trailing /")
6573 let pfile= filename."/"
6574
6575 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
6576 if (has("win32") || has("win95") || has("win64") || has("win16"))
6577 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
6578 " indicate an executable
6579" call Decho("indicate <".filename."> is executable with trailing *")
6580 let pfile= filename."*"
6581 else
6582 " normal file
6583 let pfile= filename
6584 endif
6585 elseif executable(filename)
6586 " indicate an executable
6587" call Decho("indicate <".filename."> is executable with trailing *")
6588 let pfile= filename."*"
6589 else
6590 " normal file
6591 let pfile= filename
6592 endif
6593
6594 else
6595 " normal file
6596 let pfile= filename
6597 endif
6598" call Decho("pfile<".pfile."> (after *@/ appending)")
6599
6600 if pfile =~ '//$'
6601 let pfile= substitute(pfile,'//$','/','e')
6602" call Decho("change // to /: pfile<".pfile.">")
6603 endif
6604 let pfile= strpart(pfile,dirnamelen)
6605 let pfile= substitute(pfile,'^[/\\]','','e')
6606" call Decho("filename<".filename.">")
6607" call Decho("pfile <".pfile.">")
6608
6609 if w:netrw_liststyle == s:LONGLIST
6610 let sz = getfsize(filename)
6611 let fsz = strpart(" ",1,15-s:Strlen(sz)).sz
6612 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
6613" call Decho("sz=".sz." fsz=".fsz)
6614 endif
6615
6616 if g:netrw_sort_by =~ "^t"
6617 " sort by time (handles time up to 1 quintillion seconds, US)
6618" call Decho("getftime(".filename.")=".getftime(filename))
6619 let t = getftime(filename)
6620 let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t
6621" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
6622 let ftpfile= ft.'/'.pfile
6623 keepjumps silent! put=ftpfile
6624
6625 elseif g:netrw_sort_by =~ "^s"
6626 " sort by size (handles file sizes up to 1 quintillion bytes, US)
6627" call Decho("getfsize(".filename.")=".getfsize(filename))
6628 let sz = getfsize(filename)
6629 let fsz = strpart("000000000000000000",1,18-s:Strlen(sz)).sz
6630" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
6631 let fszpfile= fsz.'/'.pfile
6632 keepjumps silent! put =fszpfile
6633
6634 else
6635 " sort by name
6636" call Decho("exe keepjumps put ='".pfile."'")
6637 keepjumps silent! put=pfile
6638 endif
6639 endwhile
6640
6641 " cleanup any windows mess at end-of-line
6642 silent! keepjumps %s/\r$//e
6643 exe "setlocal ts=".g:netrw_maxfilenamelen
6644" call Decho("setlocal ts=".g:netrw_maxfilenamelen)
6645
6646" call Dret("s:LocalListing")
6647endfun
6648
6649" ---------------------------------------------------------------------
6650" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
6651" performed any shell command. The idea is to cause all local-browsing
6652" buffers to be refreshed after a user has executed some shell command,
6653" on the chance that s/he removed/created a file/directory with it.
6654fun! s:LocalBrowseShellCmdRefresh()
6655" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
6656 " determine which buffers currently reside in a tab
6657 if !exists("s:netrw_browselist")
6658" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
6659 return
6660 endif
6661 if !exists("w:netrw_bannercnt")
6662" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo")
6663 return
6664 endif
6665 let itab = 1
6666 let buftablist = []
6667 while itab <= tabpagenr("$")
6668 let buftablist = buftablist + tabpagebuflist()
6669 let itab = itab + 1
6670 tabn
6671 endwhile
6672" call Decho("buftablist".string(buftablist))
6673" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
6674 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
6675 " | refresh any netrw window
6676 " | wipe out any non-displaying netrw buffer
6677 let curwin = winnr()
6678 let ibl = 0
6679 for ibuf in s:netrw_browselist
6680" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
6681 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
6682 " wipe out any non-displaying netrw buffer
6683" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006684 exe "silent! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006685 call remove(s:netrw_browselist,ibl)
6686" call Decho("browselist=".string(s:netrw_browselist))
6687 continue
6688 elseif index(tabpagebuflist(),ibuf) != -1
6689 " refresh any netrw buffer
6690" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
6691 exe bufwinnr(ibuf)."wincmd w"
6692 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6693 endif
6694 let ibl= ibl + 1
6695 endfor
6696 exe curwin."wincmd w"
6697
6698" call Dret("LocalBrowseShellCmdRefresh")
6699endfun
6700
6701" ---------------------------------------------------------------------
6702" s:NetrwLocalRm: {{{2
6703fun! s:NetrwLocalRm(path) range
6704" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
6705" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6706
6707 " preparation for removing multiple files/directories
6708 let ret = 0
6709 let all = 0
6710 let svpos = netrw#NetrwSavePosn()
6711
6712 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6713 " remove all marked files
6714" call Decho("remove all marked files")
6715 for fname in s:netrwmarkfilelist_{bufnr("%")}
6716 let ok= s:NetrwLocalRmFile(a:path,fname,all)
6717 if ok =~ 'q\%[uit]' || ok == "no"
6718 break
6719 elseif ok =~ 'a\%[ll]'
6720 let all= 1
6721 endif
6722 endfor
6723 call s:NetrwUnMarkFile(1)
6724
6725 else
6726 " remove (multiple) files and directories
6727" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
6728
6729 let ctr = a:firstline
6730 while ctr <= a:lastline
6731 exe "keepjumps ".ctr
6732
6733 " sanity checks
6734 if line(".") < w:netrw_bannercnt
6735 let ctr= ctr + 1
6736 continue
6737 endif
6738 let curword= s:NetrwGetWord()
6739 if curword == "./" || curword == "../"
6740 let ctr= ctr + 1
6741 continue
6742 endif
6743 let ok= s:NetrwLocalRmFile(a:path,curword,all)
6744 if ok =~ 'q\%[uit]' || ok == "no"
6745 break
6746 elseif ok =~ 'a\%[ll]'
6747 let all= 1
6748 endif
6749 let ctr= ctr + 1
6750 endwhile
6751 endif
6752
6753 " refresh the directory
6754" call Decho("bufname<".bufname("%").">")
6755 if bufname("%") != "NetrwMessage"
6756 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6757 call netrw#NetrwRestorePosn(svpos)
6758 endif
6759
6760" call Dret("s:NetrwLocalRm")
6761endfun
6762
6763" ---------------------------------------------------------------------
6764" s:NetrwLocalRmFile: remove file fname given the path {{{2
6765" Give confirmation prompt unless all==1
6766fun! s:NetrwLocalRmFile(path,fname,all)
6767" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
6768
6769 let all= a:all
6770 let ok = ""
6771 norm! 0
6772 let rmfile= s:ComposePath(a:path,a:fname)
6773" call Decho("rmfile<".rmfile.">")
6774
6775 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
6776 " attempt to remove file
6777" call Decho("attempt to remove file<".rmfile.">")
6778 if !all
6779 echohl Statement
6780 call inputsave()
6781 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6782 call inputrestore()
6783 echohl NONE
6784 if ok == ""
6785 let ok="no"
6786 endif
6787" call Decho("response: ok<".ok.">")
6788 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6789" call Decho("response: ok<".ok."> (after sub)")
6790 if ok =~ 'a\%[ll]'
6791 let all= 1
6792 endif
6793 endif
6794
6795 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006796 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006797" call Decho("errcode=".v:shell_error." ret=".ret)
6798 endif
6799
6800 else
6801 " attempt to remove directory
6802 if !all
6803 echohl Statement
6804 call inputsave()
6805 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6806 call inputrestore()
6807 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6808 if ok == ""
6809 let ok="no"
6810 endif
6811 if ok =~ 'a\%[ll]'
6812 let all= 1
6813 endif
6814 endif
6815 let rmfile= substitute(rmfile,'[\/]$','','e')
6816
6817 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006818" call Decho("1st attempt: system(s:WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
6819 call system(s:WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006820" call Decho("v:shell_error=".v:shell_error)
6821
6822 if v:shell_error != 0
6823" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006824 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006825" call Decho("errcode=".errcode)
6826
6827 if errcode != 0
6828 if has("unix")
6829" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006830 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006831 if v:shell_error != 0 && !exists("g:netrw_quiet")
6832 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
6833 let ok="no"
6834 endif
6835 elseif !exists("g:netrw_quiet")
6836 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
6837 let ok="no"
6838 endif
6839 endif
6840 endif
6841 endif
6842 endif
6843
6844" call Dret("s:NetrwLocalRmFile ".ok)
6845 return ok
6846endfun
6847
6848" ---------------------------------------------------------------------
6849" s:NetrwLocalRename: rename a remote file or directory {{{2
6850fun! s:NetrwLocalRename(path) range
6851" call Dfunc("NetrwLocalRename(path<".a:path.">)")
6852
6853 " preparation for removing multiple files/directories
6854 let ctr = a:firstline
6855 let svpos= netrw#NetrwSavePosn()
6856
6857 " rename files given by the markfilelist
6858 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6859 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6860" call Decho("oldname<".oldname.">")
6861 if exists("subfrom")
6862 let newname= substitute(oldname,subfrom,subto,'')
6863" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6864 else
6865 call inputsave()
6866 let newname= input("Moving ".oldname." to : ",oldname)
6867 call inputrestore()
6868 if newname =~ '^s/'
6869 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6870 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6871" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6872 let newname = substitute(oldname,subfrom,subto,'')
6873 endif
6874 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006875 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006876 endfor
6877 2match none
6878 unlet s:netrwmarkfilelist_{bufnr("%")}
6879 unlet s:netrwmarkfilemtch_{bufnr("%")}
6880
6881 else
6882
6883 " attempt to rename files/directories
6884 while ctr <= a:lastline
6885 exe "keepjumps ".ctr
6886
6887 " sanity checks
6888 if line(".") < w:netrw_bannercnt
6889 let ctr= ctr + 1
6890 continue
6891 endif
6892 let curword= s:NetrwGetWord()
6893 if curword == "./" || curword == "../"
6894 let ctr= ctr + 1
6895 continue
6896 endif
6897
6898 norm! 0
6899 let oldname= s:ComposePath(a:path,curword)
6900" call Decho("oldname<".oldname.">")
6901
6902 call inputsave()
6903 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
6904 call inputrestore()
6905
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006906 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006907" call Decho("renaming <".oldname."> to <".newname.">")
6908
6909 let ctr= ctr + 1
6910 endwhile
6911 endif
6912
6913 " refresh the directory
6914" call Decho("refresh the directory listing")
6915 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6916 call netrw#NetrwRestorePosn(svpos)
6917
6918" call Dret("NetrwLocalRename")
6919endfun
6920
6921" ---------------------------------------------------------------------
6922" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
6923"
6924" g:netrw_ Directory Is
6925" fastbrowse Local Remote
6926" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
6927" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
6928" fast 2 H H
6929"
6930" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
6931" Hiding a buffer means that it will be re-used when examined, hence "fast".
6932" (re-using a buffer may not be as accurate)
6933fun! s:LocalFastBrowser()
6934" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
6935
6936 " initialize browselist, a list of buffer numbers that the local browser has used
6937 if !exists("s:netrw_browselist")
6938" call Decho("initialize s:netrw_browselist")
6939 let s:netrw_browselist= []
6940 endif
6941
6942 " append current buffer to fastbrowse list
6943 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
6944" call Decho("appendng current buffer to browselist")
6945 call add(s:netrw_browselist,bufnr("%"))
6946" call Decho("browselist=".string(s:netrw_browselist))
6947 endif
6948
6949 " enable autocmd events to handle refreshing/removing local browser buffers
6950 " If local browse buffer is currently showing: refresh it
6951 " If local browse buffer is currently hidden : wipe it
6952 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
6953" call Decho("setting up local-browser shell command refresh")
6954 let s:netrw_browser_shellcmd= 1
6955 augroup AuNetrwShellCmd
6956 au!
6957 if (has("win32") || has("win95") || has("win64") || has("win16"))
6958 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
6959 else
6960 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
6961 endif
6962 augroup END
6963 endif
6964
6965 " user must have changed fastbrowse to its fast setting, so remove
6966 " the associated autocmd events
6967 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
6968" call Decho("remove AuNetrwShellCmd autcmd group")
6969 unlet s:netrw_browser_shellcmd
6970 augroup AuNetrwShellCmd
6971 au!
6972 augroup END
6973 augroup! AuNetrwShellCmd
6974 endif
6975
6976" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
6977endfun
6978
6979" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00006980" Support Functions: {{{1
6981
Bram Moolenaar488c6512005-08-11 20:09:58 +00006982" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00006983" netrw#ErrorMsg: {{{2
6984" 0=note = s:NOTE
6985" 1=warning = s:WARNING
6986" 2=error = s:ERROR
Bram Moolenaarc236c162008-07-13 17:41:49 +00006987" Jul 08, 2008 : max errnum currently is 71
Bram Moolenaar9964e462007-05-05 17:54:07 +00006988fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006989" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
Bram Moolenaar9964e462007-05-05 17:54:07 +00006990
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006991 if a:level == 1
6992 let level= "**warning** (netrw) "
6993 elseif a:level == 2
6994 let level= "**error** (netrw) "
6995 else
6996 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00006997 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006998" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006999
7000 if g:netrw_use_errorwindow
7001 " (default) netrw creates a one-line window to show error/warning
7002 " messages (reliably displayed)
7003
Bram Moolenaar446cb832008-06-24 21:56:24 +00007004 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007005 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007006" call Decho("s:winBeforeErr=".s:winBeforeErr)
7007
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007008 " getting messages out reliably is just plain difficult!
7009 " This attempt splits the current window, creating a one line window.
7010 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007011" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007012 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007013" call Decho("setlocal ma noro")
7014 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007015 call setline(line("$")+1,level.a:msg)
7016 $
7017 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007018" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007019 bo 1split
7020 enew
7021 setlocal bt=nofile
7022 file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00007023" call Decho("setlocal ma noro")
7024 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007025 call setline(line("$"),level.a:msg)
7026 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007027" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007028 if &fo !~ '[ta]'
7029 syn clear
7030 syn match netrwMesgNote "^\*\*note\*\*"
7031 syn match netrwMesgWarning "^\*\*warning\*\*"
7032 syn match netrwMesgError "^\*\*error\*\*"
7033 hi link netrwMesgWarning WarningMsg
7034 hi link netrwMesgError Error
7035 endif
7036 setlocal noma ro bh=wipe
7037
7038 else
7039 " (optional) netrw will show messages using echomsg. Even if the
7040 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00007041" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007042 if a:level == s:WARNING
7043 echohl WarningMsg
7044 elseif a:level == s:ERROR
7045 echohl Error
7046 endif
7047 echomsg level.a:msg
7048" call Decho("echomsg ***netrw*** ".a:msg)
7049 echohl None
7050 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007051
7052" call Dret("netrw#ErrorMsg")
7053endfun
7054
7055" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007056" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7057fun! netrw#NetrwRestorePosn(...)
7058" call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1))
7059 let eikeep= &ei
7060 set ei=all
7061 if expand("%") == "NetrwMessage"
7062 exe s:winBeforeErr."wincmd w"
7063 endif
7064
7065 if a:0 > 0
7066 exe a:1
7067 endif
7068
7069 " restore window
7070 if exists("w:netrw_winnr")
7071" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
7072 exe "silent! ".w:netrw_winnr."wincmd w"
7073 endif
7074 if v:shell_error == 0
7075 " as suggested by Bram M: redraw on no error
7076 " allows protocol error messages to remain visible
7077" redraw!
7078 endif
7079
7080 " restore top-of-screen line
7081 if exists("w:netrw_hline")
7082" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
7083 exe "norm! ".w:netrw_hline."G0z\<CR>"
7084 endif
7085
7086 " restore position
7087 if exists("w:netrw_line") && exists("w:netrw_col")
7088" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
7089 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
7090 endif
7091
7092 let &ei= eikeep
7093" call Dret("netrw#NetrwRestorePosn")
7094endfun
7095
7096" ---------------------------------------------------------------------
7097" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7098fun! netrw#NetrwSavePosn()
7099" call Dfunc("netrw#NetrwSavePosn()")
7100 " Save current line and column
7101 let w:netrw_winnr= winnr()
7102 let w:netrw_line = line(".")
7103 let w:netrw_col = virtcol(".")
7104
7105 " Save top-of-screen line
7106 norm! H0
7107 let w:netrw_hline= line(".")
7108
7109 " set up string holding position parameters
7110 let ret = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline
7111
7112 call netrw#NetrwRestorePosn()
7113" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7114 return ret
7115endfun
7116
7117" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007118" netrw#RFC2396: converts %xx into characters {{{2
7119fun! netrw#RFC2396(fname)
7120" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7121 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7122" call Dret("netrw#RFC2396 ".fname)
7123 return fname
7124endfun
7125
7126" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007127" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
7128fun! s:ComposePath(base,subdir)
7129" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
7130
7131 if(has("amiga"))
7132" call Decho("amiga")
7133 let ec = a:base[strlen(a:base)-1]
7134 if ec != '/' && ec != ':'
7135 let ret = a:base . "/" . a:subdir
7136 else
7137 let ret = a:base . a:subdir
7138 endif
7139
7140 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7141" call Decho("windows")
7142 let ret= a:subdir
7143
7144 elseif a:base =~ '^\a\+://'
7145" call Decho("remote linux/macos")
7146 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
7147 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
7148 if a:subdir == '../'
7149 if curpath =~ '[^/]/[^/]\+/$'
7150 let curpath= substitute(curpath,'[^/]\+/$','','')
7151 else
7152 let curpath=""
7153 endif
7154 let ret= urlbase.curpath
7155 else
7156 let ret= urlbase.curpath.a:subdir
7157 endif
7158" call Decho("urlbase<".urlbase.">")
7159" call Decho("curpath<".curpath.">")
7160" call Decho("ret<".ret.">")
7161
7162 else
7163" call Decho("local linux/macos")
7164 let ret = substitute(a:base."/".a:subdir,"//","/","g")
7165 if a:base =~ '^//'
7166 " keeping initial '//' for the benefit of network share listing support
7167 let ret= '/'.ret
7168 endif
7169 let ret= simplify(ret)
7170 endif
7171
7172" call Dret("s:ComposePath ".ret)
7173 return ret
7174endfun
7175
7176" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007177" s:FileReadable: o/s independent filereadable {{{2
7178fun! s:FileReadable(fname)
7179" call Dfunc("s:FileReadable(fname<".a:fname.">)")
7180
7181 if g:netrw_cygwin
7182 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
7183 else
7184 let ret= filereadable(a:fname)
7185 endif
7186
7187" call Dret("s:FileReadable ".ret)
7188 return ret
7189endfun
7190
7191" ---------------------------------------------------------------------
7192" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
7193" Places correct suffix on end of temporary filename,
7194" using the suffix provided with fname
7195fun! s:GetTempfile(fname)
7196" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
7197
7198 if !exists("b:netrw_tmpfile")
7199 " get a brand new temporary filename
7200 let tmpfile= tempname()
7201" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007202
Bram Moolenaarc236c162008-07-13 17:41:49 +00007203 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007204" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007205
Bram Moolenaar9964e462007-05-05 17:54:07 +00007206 " sanity check -- does the temporary file's directory exist?
7207 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00007208" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007209 call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
7210" call Dret("s:GetTempfile getcwd<".getcwd().">")
7211 return ""
7212 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007213
Bram Moolenaar9964e462007-05-05 17:54:07 +00007214 " let netrw#NetSource() know about the tmpfile
7215 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource()
7216" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007217
Bram Moolenaar9964e462007-05-05 17:54:07 +00007218 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00007219 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00007220 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
7221 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007222 if !exists("+shellslash") || !&ssl
7223 let tmpfile = substitute(tmpfile,'/','\','g')
7224 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007225 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007226 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00007227 endif
7228 let b:netrw_tmpfile= tmpfile
7229" call Decho("o/s dependent fixed tempname<".tmpfile.">")
7230 else
7231 " re-use temporary filename
7232 let tmpfile= b:netrw_tmpfile
7233" call Decho("tmpfile<".tmpfile."> re-using")
7234 endif
7235
7236 " use fname's suffix for the temporary file
7237 if a:fname != ""
7238 if a:fname =~ '\.[^./]\+$'
7239" call Decho("using fname<".a:fname.">'s suffix")
7240 if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2'
7241 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7242 else
7243 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7244 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007245" call Decho("suffix<".suffix.">")
7246 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
7247" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
7248 let tmpfile .= suffix
7249" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
7250 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
7251 endif
7252 endif
7253
Bram Moolenaarc236c162008-07-13 17:41:49 +00007254" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007255" call Dret("s:GetTempfile <".tmpfile.">")
7256 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007257endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00007258
7259" ---------------------------------------------------------------------
7260" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00007261" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00007262fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007263" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007264 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
7265 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007266 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007267 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007268 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007269 else
7270 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
7271 endif
7272" call Dret("s:MakeSshCmd <".sshcmd.">")
7273 return sshcmd
7274endfun
7275
7276" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007277" s:NetrwBMShow: {{{2
7278fun! s:NetrwBMShow()
7279" call Dfunc("s:NetrwBMShow()")
7280 redir => bmshowraw
7281 menu
7282 redir END
7283 let bmshowlist = split(bmshowraw,'\n')
7284 if bmshowlist != []
7285 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
7286 if bmshowfuncs != []
7287 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
7288 if bmshowfunc =~ '^call.*BMShow()'
7289 exe "silent! ".bmshowfunc
7290 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007291 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007292 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00007293" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
7294endfun
7295
7296" ---------------------------------------------------------------------
7297" s:NetrwDelete: Deletes a file. {{{2
7298" Uses Steve Hall's idea to insure that Windows paths stay
7299" acceptable. No effect on Unix paths.
7300" Examples of use: let result= s:NetrwDelete(path)
7301fun! s:NetrwDelete(path)
7302" call Dfunc("s:NetrwDelete(path<".a:path.">)")
7303
7304 let path = s:WinPath(a:path)
7305 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7306 if exists("+shellslash")
7307 let sskeep= &shellslash
7308 setlocal noshellslash
7309 let result = delete(path)
7310 let &shellslash = sskeep
7311 else
7312" call Decho("exe let result= ".a:cmd."('".path."')")
7313 let result= delete(path)
7314 endif
7315 else
7316" call Decho("let result= delete(".path.")")
7317 let result= delete(path)
7318 endif
7319 if result < 0
7320 call Netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
7321 endif
7322
7323" call Dret("s:NetrwDelete ".result)
7324 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00007325endfun
7326
7327" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007328" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
7329fun! s:NetrwEnew(curdir)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007330" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007331
Bram Moolenaar446cb832008-06-24 21:56:24 +00007332 " grab a function-local-variable copy of buffer variables
Bram Moolenaar9964e462007-05-05 17:54:07 +00007333 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
7334 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
7335 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
7336 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
7337 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7338 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
7339 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
7340 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
7341 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
7342 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7343 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
7344 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
7345 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
7346 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
7347 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
7348 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
7349
Bram Moolenaar446cb832008-06-24 21:56:24 +00007350 call s:NetrwOptionRestore("w:")
7351" call Decho("generate a buffer with keepjumps keepalt enew!")
7352 keepjumps keepalt enew!
7353 call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007354
Bram Moolenaar446cb832008-06-24 21:56:24 +00007355 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar9964e462007-05-05 17:54:07 +00007356 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
7357 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
7358 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
7359 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
7360 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
7361 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
7362 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
7363 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
7364 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
7365 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
7366 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
7367 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
7368 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
7369 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
7370 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
7371 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
7372
7373 let b:netrw_curdir= a:curdir
7374 if b:netrw_curdir =~ '/$'
7375 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
7376 file NetrwTreeListing
Bram Moolenaar446cb832008-06-24 21:56:24 +00007377 nno <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
7378 nno <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00007379 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007380 exe "silent! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007381 endif
7382 endif
7383
Bram Moolenaar446cb832008-06-24 21:56:24 +00007384" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007385endfun
7386
7387" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007388" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
7389" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
7390fun! s:NetrwSaveWordPosn()
7391" call Dfunc("NetrwSaveWordPosn()")
7392 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
7393" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
7394endfun
7395
7396" ---------------------------------------------------------------------
7397" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
7398" changed sorting, etc. Also see s:NetrwSaveWordPosn().
7399fun! s:NetrwRestoreWordPosn()
7400" call Dfunc("NetrwRestoreWordPosn()")
7401 silent! call search(s:netrw_saveword,'w')
7402" call Dret("NetrwRestoreWordPosn")
7403endfun
7404
7405" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007406" s:RestoreBufVars: {{{2
7407fun! s:RestoreBufVars()
7408" call Dfunc("s:RestoreBufVars()")
7409
7410 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
7411 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
7412 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
7413 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
7414 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
7415 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
7416
7417" call Dret("s:RestoreBufVars")
7418endfun
7419
7420" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007421" s:RemotePathAnalysis: {{{2
7422fun! s:RemotePathAnalysis(dirname)
7423" call Dfunc("s:RemotePathAnalysis()")
7424
7425 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
7426 let s:method = substitute(a:dirname,dirpat,'\1','')
7427 let s:user = substitute(a:dirname,dirpat,'\2','')
7428 let s:machine = substitute(a:dirname,dirpat,'\3','')
7429 let s:port = substitute(a:dirname,dirpat,'\4','')
7430 let s:path = substitute(a:dirname,dirpat,'\5','')
7431 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
7432
7433" call Decho("set up s:method <".s:method .">")
7434" call Decho("set up s:user <".s:user .">")
7435" call Decho("set up s:machine<".s:machine.">")
7436" call Decho("set up s:port <".s:port.">")
7437" call Decho("set up s:path <".s:path .">")
7438" call Decho("set up s:fname <".s:fname .">")
7439
7440" call Dret("s:RemotePathAnalysis")
7441endfun
7442
7443" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007444" s:RemoteSystem: runs a command on a remote host using ssh {{{2
7445" Returns status
7446" Runs system() on
7447" [cd REMOTEDIRPATH;] a:cmd
7448" Note that it doesn't do shellescape(a:cmd)!
7449fun! s:RemoteSystem(cmd)
7450" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
7451 if !executable(g:netrw_ssh_cmd)
7452 call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
7453 elseif !exists("b:netrw_curdir")
7454 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
7455 else
7456 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
7457 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7458 if remotedir != ""
7459 let cmd= cmd.' cd '.shellescape(remotedir).";"
7460 else
7461 let cmd= cmd.' '
7462 endif
7463 let cmd= cmd.a:cmd
7464" call Decho("call system(".cmd.")")
7465 let ret= system(cmd)
7466 endif
7467" call Dret("s:RemoteSystem ".ret)
7468 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00007469endfun
7470
7471" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007472" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007473fun! s:RestoreWinVars()
7474" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00007475 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007476 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
7477 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
7478 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
7479 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
7480 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
7481 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
7482 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
7483 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
7484 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
7485 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
7486 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
7487 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00007488 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
7489 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007490 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
7491 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
7492 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
7493" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00007494endfun
7495
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007496" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007497" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
7498"
7499" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
7500" is true) and a command, :Rexplore, which call this function.
7501"
7502" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
7503fun! s:NetrwRexplore(islocal,dirname)
7504" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)")
7505 if a:islocal
7506 call netrw#LocalBrowseCheck(a:dirname)
7507 else
7508 call s:NetrwBrowse(0,a:dirname)
7509 endif
7510 if exists("s:nbcd_curpos_{bufnr('%')}")
7511 call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
7512 unlet s:nbcd_curpos_{bufnr('%')}
7513 endif
7514" call Dret("s:NetrwRexplore")
7515endfun
7516
7517" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007518" s:SaveBufVars: {{{2
7519fun! s:SaveBufVars()
7520" call Dfunc("s:SaveBufVars()")
7521
7522 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
7523 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
7524 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
7525 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
7526 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
7527 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
7528
7529" call Dret("s:SaveBufVars")
7530endfun
7531
7532" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007533" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007534fun! s:SaveWinVars()
7535" call Dfunc("s:SaveWinVars()")
7536 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
7537 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
7538 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
7539 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
7540 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
7541 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
7542 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
7543 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
7544 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
7545 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
7546 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
7547 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
7548 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
7549 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
7550 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
7551 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
7552 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
7553 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
7554" call Dret("s:SaveWinVars")
7555endfun
7556
7557" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007558" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007559" To allow separate windows to have their own activities, such as
7560" Explore **/pattern, several variables have been made window-oriented.
7561" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007562" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007563" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007564fun! s:SetBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007565" call Dfunc("s:SetBufWinVars()")
7566 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
7567 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
7568 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
7569 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
7570 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
7571 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
7572 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
7573 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
7574 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
7575 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
7576" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007577endfun
7578
7579" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007580" s:SetRexDir: set directory for :Rexplore {{{2
7581fun! s:SetRexDir(islocal,dirname)
7582" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
7583 " set up Rex and leftmouse-double-click
7584 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007585 exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007586 if g:netrw_retmap
7587 silent! unmap <2-leftmouse>
7588 if !hasmapto("<Plug>NetrwReturn")
7589 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7590 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007591 let dir = escape(a:dirname, s:netrw_map_escape)
7592 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.dir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007593 endif
7594 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007595 exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007596 if g:netrw_retmap
7597 silent! unmap <2-leftmouse>
7598 if !hasmapto("<Plug>NetrwReturn")
7599 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7600 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007601 let dir = escape(a:dirname, s:netrw_map_escape)
7602 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.dir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007603 endif
7604 endif
7605" call Dret("s:SetRexDir")
7606endfun
7607
7608" ---------------------------------------------------------------------
7609" s:Strlen: this function returns the length of a string, even if its {{{2
7610" using two-byte etc characters.
7611" Currently, its only used if g:Align_xstrlen is set to a
7612" nonzero value. Solution from Nicolai Weibull, vim docs
7613" (:help strlen()), Tony Mechelynck, and my own invention.
7614fun! s:Strlen(x)
7615" call Dfunc("s:Strlen(x<".a:x.">")
7616 if g:netrw_xstrlen == 1
7617 " number of codepoints (Latin a + combining circumflex is two codepoints)
7618 " (comment from TM, solution from NW)
7619 let ret= strlen(substitute(a:x,'.','c','g'))
7620
7621 elseif g:netrw_xstrlen == 2
7622 " number of spacing codepoints (Latin a + combining circumflex is one spacing
7623 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
7624 " (comment from TM, solution from TM)
7625 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
7626
7627 elseif g:netrw_xstrlen == 3
7628 " virtual length (counting, for instance, tabs as anything between 1 and
7629 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
7630 " preceded by lam, one otherwise, etc.)
7631 " (comment from TM, solution from me)
7632 let modkeep= &mod
7633 exe "norm! o\<esc>"
7634 call setline(line("."),a:x)
7635 let ret= virtcol("$") - 1
7636 d
7637 let &mod= modkeep
7638
7639 else
7640 " at least give a decent default
7641 ret= strlen(a:x)
7642 endif
7643" call Dret("s:Strlen ".ret)
7644 return ret
7645endfun
7646
7647" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007648" s:TreeListMove: {{{2
7649fun! s:TreeListMove(dir)
7650" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
7651 let curline = getline('.')
7652 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
7653 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
7654 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
7655 let indentm1 = substitute(curindent,'^| ','','')
7656" call Decho("prvline <".prvline."> #".line(".")-1)
7657" call Decho("curline <".curline."> #".line("."))
7658" call Decho("nxtline <".nxtline."> #".line(".")+1)
7659" call Decho("curindent<".curindent.">")
7660" call Decho("indentm1 <".indentm1.">")
7661
7662 if curline !~ '/$'
7663" call Decho('regfile')
7664 if a:dir == '[' && prvline != ''
7665 norm! 0
7666 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
7667" call Decho("regfile srch back: ".nl)
7668 elseif a:dir == ']' && nxtline != ''
7669 norm! $
7670 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
7671" call Decho("regfile srch fwd: ".nl)
7672 endif
7673
7674 elseif a:dir == '[' && prvline != ''
7675 norm! 0
7676 let curline= line(".")
7677 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
7678" call Decho("dir srch back ind: ".nl)
7679 if nl != 0
7680 if line(".") == curline-1
7681 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
7682" call Decho("dir srch back ind-1: ".nl)
7683 endif
7684 endif
7685
7686 elseif a:dir == ']' && nxtline != ''
7687 norm! $
7688 let curline = line(".")
7689 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
7690" call Decho("dir srch fwd ind: ".nl)
7691 if nl != 0
7692 if line(".") == curline+1
7693 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
7694" call Decho("dir srch fwd ind-1: ".nl)
7695 endif
7696 endif
7697
7698 endif
7699
7700" call Dret("s:TreeListMove")
7701endfun
7702
7703" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007704" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
7705" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
7706" can't be called except via emenu. But due to locale, that menu line may not be called
7707" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
7708fun! s:UpdateBuffersMenu()
7709" call Dfunc("s:UpdateBuffersMenu()")
7710 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
7711 try
7712 silent emenu Buffers.Refresh\ menu
7713 catch /^Vim\%((\a\+)\)\=:E/
7714 let v:errmsg= ""
7715 silent call s:NetrwBMShow()
7716 endtry
7717 endif
7718" call Dret("s:UpdateBuffersMenu")
7719endfun
7720
7721" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007722" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007723" Matching function to BufferWinVars()
7724fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007725" call Dfunc("s:UseBufWinVars()")
7726 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007727 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
7728 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
7729 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
7730 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
7731 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
7732 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7733 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7734 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
7735 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007736" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007737endfun
7738
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007739" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007740" s:WinPath: {{{2
7741fun! s:WinPath(path)
7742" call Dfunc("s:WinPath(path<".a:path.">)")
7743 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7744 " remove trailing slash (Win95)
7745 let path = substitute(a:path, '\(\\\|/\)$', '', 'g')
7746 " remove escaped spaces
7747 let path = substitute(path, '\ ', ' ', 'g')
7748 " convert slashes to backslashes
7749 let path = substitute(path, '/', '\', 'g')
7750 else
7751 let path= a:path
7752 endif
7753" call Dret("s:WinPath <".path.">")
7754 return path
7755endfun
7756
7757" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00007758" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00007759let &cpo= s:keepcpo
7760unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00007761
Bram Moolenaar071d4272004-06-13 20:20:40 +00007762" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00007763" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00007764" vim:ts=8 fdm=marker