blob: 8bd597aaf973c5d954a52031c72fef7c6834e73e [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 Moolenaare37d50a2008-08-06 17:06:04 +00003" Date: Aug 01, 2008
4" Version: 131
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 Moolenaare37d50a2008-08-06 17:06:04 +000030let g:loaded_netrw = "v131"
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 Moolenaar446cb832008-06-24 21:56:24 +0000746 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
747 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000748 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000749
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000750 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000751 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
753 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000754" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000755 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000756 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000757 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000758 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000759 if exists("g:netrw_port") && g:netrw_port != ""
760 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000761" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000762 else
763 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000764" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000765 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000766
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000767 if exists("g:netrw_ftp") && g:netrw_ftp == 1
768 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000769" call Decho("filter input: ".getline('.'))
770 put ='\"'.s:netrw_passwd.'\"'
771" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000772 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000773 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
774" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000775 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000776
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000777 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
778 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000779" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000781 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000782 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000783" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000784 endif
785 put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000786" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000787
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000788 " perform ftp:
789 " -i : turns off interactive prompting from ftp
790 " -n unix : DON'T use <.netrc>, even though it exists
791 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000792 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000793" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000794 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
796 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000797" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000798 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000799 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000800 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000801 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000802 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
803 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000805
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000806 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000807 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000808 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000809" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000810 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000811 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000812 else
813 let useport= ""
814 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000815" call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
816 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 +0000817 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000819
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000820 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000821 " http: NetRead Method #5 (wget) {{{3
822 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000823" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000824 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000825 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000826 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000827 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000828" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000829 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000830 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000831
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000832 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
833 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000834" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000835 if exists("g:netrw_http_xcmd")
836" 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))
837 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
838 else
839" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
840 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
841 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000842 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000843
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000844 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000845 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000846" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000847 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
848 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho("netrw_html<".netrw_html.">")
850" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000851" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
852 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 +0000853 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000854" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000855 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
856 endif
857 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000858 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000859
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000861 " cadaver: NetRead Method #6 {{{3
862 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000863" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000864
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000866 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000867 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000868 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 if exists("g:netrw_port") && g:netrw_port != ""
870 put ='open '.g:netrw_machine.' '.g:netrw_port
871 else
872 put ='open '.g:netrw_machine
873 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000874 put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000875 put ='get '.netrw_fname.' '.tmpfile
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000876 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000877
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000878 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000879 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000880" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000881 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000882 bd!
Bram Moolenaar446cb832008-06-24 21:56:24 +0000883 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000884 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000885
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000886 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000887 " rsync: NetRead Method #7 {{{3
888 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000889" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000890" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
891 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 +0000892 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000893 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000894
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000895 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000896 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000897 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000898 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000899" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000901 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000902 call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000903 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000904" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905 endif
906 if exists("g:netrw_option") && g:netrw_option == ":http"
907 let netrw_option= "http"
908 else
909 let netrw_option= "ftp"
910 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000911" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000912
Bram Moolenaar446cb832008-06-24 21:56:24 +0000913 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000914" 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))
915 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 +0000916 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000917" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
918 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 +0000919 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000920
Bram Moolenaar446cb832008-06-24 21:56:24 +0000921 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000922 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000923 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000924
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000925 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000926 " sftp: NetRead Method #9 {{{3
927 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000928" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000929" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
930 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000931 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000932 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000933
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000934 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000935 " Complain {{{3
936 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000937 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938 endif
939 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000940
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000941 " cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000942 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000943" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000944 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000945 unlet b:netrw_fname
946 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000947 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
948" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000949 call s:NetrwDelete(fnameescape(tmpfile))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000950 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000951 call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000952
Bram Moolenaar9964e462007-05-05 17:54:07 +0000953" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954endfun
955
956" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000957" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000958fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000959" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000960
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 " option handling
962 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000963 call s:NetrwOptionSave("w:")
964 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000965
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000966 " Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000967 let tmpfile= s:GetTempfile("")
968 if tmpfile == ""
969" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000970 return
971 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000972
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000973 if a:0 == 0
974 let ichoice = 0
975 else
976 let ichoice = 1
977 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000978
Bram Moolenaar9964e462007-05-05 17:54:07 +0000979 let curbufname= expand("%")
980" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000981 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000982 " For binary writes, always write entire file.
983 " (line numbers don't really make sense for that).
984 " Also supports the writing of tar and zip files.
Bram Moolenaarc236c162008-07-13 17:41:49 +0000985" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
986 silent exe "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000987 elseif g:netrw_cygwin
988 " write (selected portion of) file to temporary
989 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +0000990" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
991 silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000992 else
993 " write (selected portion of) file to temporary
Bram Moolenaarc236c162008-07-13 17:41:49 +0000994" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
995 silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000996 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000997
Bram Moolenaar9964e462007-05-05 17:54:07 +0000998 if curbufname == ""
999 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1000 " on the temporary file's name. Deletion of the temporary file during
1001 " cleanup then causes an error message.
1002 0file!
1003 endif
1004
1005 " While choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001007
Bram Moolenaar9964e462007-05-05 17:54:07 +00001008 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001009 " attempt to repeat with previous host-file-etc
1010 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001011" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001012 let choice = b:netrw_lastfile
1013 let ichoice= ichoice + 1
1014 else
1015 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001016
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 " Reconstruct Choice if choice starts with '"'
1018 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001019 echomsg 'NetWrite Usage:"'
1020 echomsg ':Nwrite machine:path uses rcp'
1021 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1022 echomsg ':Nwrite "machine id password path" uses ftp'
1023 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1024 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1025 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1026 echomsg ':Nwrite rcp://machine/path uses rcp'
1027 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1028 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1029 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001030 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001031 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001032
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001033 elseif match(choice,"^\"") != -1
1034 if match(choice,"\"$") != -1
1035 " case "..."
1036 let choice=strpart(choice,1,strlen(choice)-2)
1037 else
1038 " case "... ... ..."
1039 let choice = strpart(choice,1,strlen(choice)-1)
1040 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001041
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001042 while match(choice,"\"$") == -1
1043 let wholechoice= wholechoice . " " . choice
1044 let ichoice = ichoice + 1
1045 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001046 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001047 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001048 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001049" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001050 return
1051 endif
1052 let choice= a:{ichoice}
1053 endwhile
1054 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1055 endif
1056 endif
1057 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001059" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001060
Bram Moolenaar9964e462007-05-05 17:54:07 +00001061 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar446cb832008-06-24 21:56:24 +00001062 call s:NetrwMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001063
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001064 " =============
Bram Moolenaar9964e462007-05-05 17:54:07 +00001065 " Perform Protocol-Based Write {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001066 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001067 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1068 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001069" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001070 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001071
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001072 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001073 " rcp: NetWrite Method #1 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001074 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001075" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001076 if s:netrw_has_nt_rcp == 1
1077 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1078 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1079 else
1080 let uid_machine = g:netrw_machine .'.'. $USERNAME
1081 endif
1082 else
1083 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1084 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1085 else
1086 let uid_machine = g:netrw_machine
1087 endif
1088 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001089" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1090 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 +00001091 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001092
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001093 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001094 " ftp + <.netrc>: NetWrite Method #2 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001095 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001096" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001097 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001098 new
Bram Moolenaar446cb832008-06-24 21:56:24 +00001099" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001100 setlocal ff=unix
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001101 put =g:netrw_ftpmode
1102" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001103 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001104 put =g:netrw_ftpextracmd
1105" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001106 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001107 call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
1108" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001109 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001110" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1111 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 +00001112 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001113" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00001114" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1115 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001116 endif
1117 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1118 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001119 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001120 call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001121 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001122 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001123 endif
1124 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001125 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001126
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001128 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001129 elseif b:netrw_method == 3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001130 " Construct execution string (four lines) which will be passed through filter
1131" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001132 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001134 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001135 if exists("g:netrw_port") && g:netrw_port != ""
1136 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001137" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001138 else
1139 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001140" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001141 endif
1142 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1143 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001144" call Decho("filter input: ".getline('.'))
1145 put ='\"'.s:netrw_passwd.'\"'
1146" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001147 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001148 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1149" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001151 put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001152" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001153 " save choice/id/password for future use
1154 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001155
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001156 " perform ftp:
1157 " -i : turns off interactive prompting from ftp
1158 " -n unix : DON'T use <.netrc>, even though it exists
1159 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001160 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001161" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001162 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001163 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1164 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001165 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001166 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001167 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001168 let mod=1
1169 endif
1170 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001171
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001172 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001173 " scp: NetWrite Method #4 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001174 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001175" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001176 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001177 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001178 else
1179 let useport= ""
1180 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001181" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1182 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 +00001183 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001184
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001185 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001186 " http: NetWrite Method #5 {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001187 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001188" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001189 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001190 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001191 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001192
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001193 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001194 " dav: NetWrite Method #6 (cadaver) {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001195 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001196" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001197
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001198 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001199 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001200 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001201 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001202 if exists("g:netrw_port") && g:netrw_port != ""
1203 put ='open '.g:netrw_machine.' '.g:netrw_port
1204 else
1205 put ='open '.g:netrw_machine
1206 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001207 if exists("g:netrw_uid") && exists("s:netrw_passwd")
1208 put ='user '.g:netrw_uid.' '.s:netrw_passwd
1209 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001210 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001211
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001212 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001213 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001214" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001215 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001216 bd!
1217 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001218
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001219 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001220 " rsync: NetWrite Method #7 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001221 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001222" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001223" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1224 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 +00001225 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001226
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001227 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001228 " sftp: NetWrite Method #9 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001229 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001230" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001231 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001232 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1233 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1234 else
1235 let uid_machine = g:netrw_machine
1236 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001237 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001238 setlocal ff=unix
Bram Moolenaar9964e462007-05-05 17:54:07 +00001239 put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00001240" call Decho("filter input: ".getline('.'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001241 norm! 1Gdd
Bram Moolenaarc236c162008-07-13 17:41:49 +00001242" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1243 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001244 bd!
1245 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001246
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001247 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001248 " Complain {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001249 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001250 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001251 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001252 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001253
Bram Moolenaar9964e462007-05-05 17:54:07 +00001254 " Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001255" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001256 if s:FileReadable(tmpfile)
1257" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001258 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001259 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001260 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001261
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001262 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001263 " restore modifiability; usually equivalent to set nomod
1264 let &mod= mod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001265 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001266
Bram Moolenaar9964e462007-05-05 17:54:07 +00001267" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001268endfun
1269
1270" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001271" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001272" uses NetRead to get a copy of the file into a temporarily file,
1273" then sources that file,
1274" then removes that file.
1275fun! netrw#NetSource(...)
1276" call Dfunc("netrw#NetSource() a:0=".a:0)
1277 if a:0 > 0 && a:1 == '?'
1278 " give help
1279 echomsg 'NetSource Usage:'
1280 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1281 echomsg ':Nsource fetch://machine/path uses fetch'
1282 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1283 echomsg ':Nsource http://[user@]machine/path uses http wget'
1284 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1285 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1286 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1287 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1288 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001289 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001290 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001291 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001292 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001293" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001294 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001295" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1296 exe "so ".fnameescape(s:netrw_tmpfile)
1297" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001298 call delete(s:netrw_tmpfile)
1299 unlet s:netrw_tmpfile
1300 else
1301 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1302 endif
1303 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001304 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001305 endif
1306" call Dret("netrw#NetSource")
1307endfun
1308
1309" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001310" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001311" readcmd == %r : replace buffer with newly read file
1312" == 0r : read file at top of buffer
1313" == r : read file after current line
1314" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001315fun! s:NetrwGetFile(readcmd, tfile, method)
1316" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001317
1318 " readcmd=='t': simply do nothing
1319 if a:readcmd == 't'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001320" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001321" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001322 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001323 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001324
Bram Moolenaar9964e462007-05-05 17:54:07 +00001325 " get name of remote filename (ie. url and all)
1326 let rfile= bufname("%")
1327" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001328
Bram Moolenaar9964e462007-05-05 17:54:07 +00001329 if exists("*NetReadFixup")
1330 " for the use of NetReadFixup (not otherwise used internally)
1331 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001332 endif
1333
Bram Moolenaar9964e462007-05-05 17:54:07 +00001334 if a:readcmd[0] == '%'
1335 " get file into buffer
1336" call Decho("get file into buffer")
1337
1338 " rename the current buffer to the temp file (ie. tfile)
1339 if g:netrw_cygwin
1340 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1341 else
1342 let tfile= a:tfile
1343 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001344" call Decho("exe silent! keepalt file ".fnameescape(tfile))
1345 exe "silent! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001346
1347 " edit temporary file (ie. read the temporary file in)
1348 if rfile =~ '\.zip$'
1349" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1350 call zip#Browse(tfile)
1351 elseif rfile =~ '\.tar$'
1352" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1353 call tar#Browse(tfile)
1354 elseif rfile =~ '\.tar\.gz'
1355" call Decho("handling remote gzip-compressed tar file")
1356 call tar#Browse(tfile)
1357 elseif rfile =~ '\.tar\.bz2'
1358" call Decho("handling remote bz2-compressed tar file")
1359 call tar#Browse(tfile)
1360 else
1361" call Decho("edit temporary file")
1362 e!
1363 endif
1364
1365 " rename buffer back to remote filename
Bram Moolenaarc236c162008-07-13 17:41:49 +00001366" call Decho("exe silent! keepalt file ".fnameescape(rfile))
1367 exe "silent! keepalt file ".fnameescape(rfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001368 if a:method == 5
1369 set ft=html
1370 else
1371 filetype detect
1372 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001373" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1374 let line1 = 1
1375 let line2 = line("$")
1376
1377 elseif s:FileReadable(a:tfile)
1378 " read file after current line
1379" call Decho("read file<".a:tfile."> after current line")
1380 let curline = line(".")
1381 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001382" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
1383 exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001384 let line1= curline + 1
1385 let line2= line("$") - lastline + 1
1386
1387 else
1388 " not readable
Bram Moolenaarc236c162008-07-13 17:41:49 +00001389" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001390" call Decho("tfile<".a:tfile."> not readable")
1391 call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001392" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001393 return
1394 endif
1395
1396 " User-provided (ie. optional) fix-it-up command
1397 if exists("*NetReadFixup")
1398" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1399 call NetReadFixup(a:method, line1, line2)
1400" else " Decho
1401" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1402 endif
1403
Bram Moolenaar446cb832008-06-24 21:56:24 +00001404 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
1405 " update the Buffers menu
1406 call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001407 endif
1408
1409" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1410
1411 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001412" redraw!
1413
Bram Moolenaarc236c162008-07-13 17:41:49 +00001414" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001415" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001416endfun
1417
Bram Moolenaar9964e462007-05-05 17:54:07 +00001418" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001419" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001420" method == 1: rcp
1421" 2: ftp + <.netrc>
1422" 3: ftp + machine, id, password, and [path]filename
1423" 4: scp
1424" 5: http (wget)
1425" 6: cadaver
1426" 7: rsync
1427" 8: fetch
1428" 9: sftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001429fun! s:NetrwMethod(choice) " globals: method machine id passwd fname
1430" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001431
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001432 " initialization
1433 let b:netrw_method = 0
1434 let g:netrw_machine = ""
1435 let b:netrw_fname = ""
1436 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001437 let g:netrw_choice = a:choice
1438
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001439 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001440 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001441 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1442 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001443 " rcpurm : rcp://[user@]host/filename Use rcp
1444 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001445 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001446 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar446cb832008-06-24 21:56:24 +00001447 " davurm : dav[s]://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001448 " rsyncurm : rsync://host[:port]/path Use rsync
1449 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1450 " sftpurm : sftp://[user@]host/filename Use scp
1451 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1452 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1453 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001454 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001455 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001456 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001457 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001458 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001459 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1460 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1461 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001462
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001463" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001464 " Determine Method
1465 " rcp://user@hostname/...path-to-file
1466 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001467" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001468 let b:netrw_method = 1
1469 let userid = substitute(a:choice,rcpurm,'\1',"")
1470 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1471 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001472 if userid != ""
1473 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001474 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001475
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001476 " scp://user@hostname/...path-to-file
1477 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001478" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001479 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001480 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1481 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1482 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001483
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001484 " http://user@hostname/...path-to-file
1485 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001486" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001487 let b:netrw_method = 5
1488 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1489 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001490
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001491 " dav://hostname[:port]/..path-to-file..
1492 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001493" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001494 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001495 if a:choice =~ '^s'
1496 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1497 else
1498 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1499 endif
1500 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001501
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001502 " rsync://user@hostname/...path-to-file
1503 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001504" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001505 let b:netrw_method = 7
1506 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1507 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001508
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001509 " ftp://[user@]hostname[[:#]port]/...path-to-file
1510 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001511" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001512 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001513 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1514 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1515 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001516 if userid != ""
1517 let g:netrw_uid= userid
1518 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001519 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001520 let b:netrw_method = 3
1521 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001522 if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001523 let b:netrw_method= 2
1524 else
1525 if !exists("g:netrw_uid") || g:netrw_uid == ""
1526 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001527 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001528 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001529 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001530 endif
1531 let b:netrw_method= 3
1532 endif
1533 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001534
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001535 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001536" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001537 let b:netrw_method = 8
1538 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1539 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1540 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1541 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001542
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001543 " Issue an ftp : "machine id password [path/]filename"
1544 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001545" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001546 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001547 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1548 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001549 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001550 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001551
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001552 " Issue an ftp: "hostname [path/]filename"
1553 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001554" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001555 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001556 let b:netrw_method = 3
1557 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1558 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001559
Bram Moolenaar9964e462007-05-05 17:54:07 +00001560 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001561 let b:netrw_method = 2
1562 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1563 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1564 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001565
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001566 " sftp://user@hostname/...path-to-file
1567 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001568" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001569 let b:netrw_method = 9
1570 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1571 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001572
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001573 " Issue an rcp: hostname:filename" (this one should be last)
1574 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001575" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001576 let b:netrw_method = 1
1577 let userid = substitute(a:choice,rcphf,'\2',"")
1578 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1579 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001580" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1581" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1582" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1583" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001584 if userid != ""
1585 let g:netrw_uid= userid
1586 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001587
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001588 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001589 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001590 call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001591 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001592 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001593 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00001594
1595 " remove any leading [:#] from port number
1596 if g:netrw_port != ""
1597 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1598 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001599
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001600" call Decho("a:choice <".a:choice.">")
1601" call Decho("b:netrw_method <".b:netrw_method.">")
1602" call Decho("g:netrw_machine<".g:netrw_machine.">")
1603" call Decho("g:netrw_port <".g:netrw_port.">")
1604" if exists("g:netrw_uid") "Decho
1605" call Decho("g:netrw_uid <".g:netrw_uid.">")
1606" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001607" if exists("s:netrw_passwd") "Decho
1608" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001609" endif "Decho
1610" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001611" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001612endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001613
1614" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001615" NetReadFixup: this sort of function is typically written by the user {{{2
1616" to handle extra junk that their system's ftp dumps
1617" into the transfer. This function is provided as an
1618" example and as a fix for a Windows 95 problem: in my
1619" experience, win95's ftp always dumped four blank lines
1620" at the end of the transfer.
1621if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1622 fun! NetReadFixup(method, line1, line2)
1623" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
1624 if method == 3 " ftp (no <.netrc>)
1625 let fourblanklines= line2 - 3
1626 silent fourblanklines.",".line2."g/^\s*/d"
1627 endif
1628" call Dret("NetReadFixup")
1629 endfun
1630endif
1631
1632" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001633" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001634" Usage: :call NetUserPass() -- will prompt for userid and password
1635" :call NetUserPass("uid") -- will prompt for password
1636" :call NetUserPass("uid","password") -- sets global userid and password
1637fun! NetUserPass(...)
1638
1639 " get/set userid
1640 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001641" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001642 if !exists("g:netrw_uid") || g:netrw_uid == ""
1643 " via prompt
1644 let g:netrw_uid= input('Enter username: ')
1645 endif
1646 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001647" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001648 let g:netrw_uid= a:1
1649 endif
1650
1651 " get password
1652 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001653" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001654 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001655 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001656" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001657 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001658 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001659
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001660" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001661endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001662
Bram Moolenaar9964e462007-05-05 17:54:07 +00001663" ===========================================
1664" Shared Browsing Support: {{{1
1665" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001666
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001667" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001668" s:BrowserMaps: {{{2
1669fun! s:BrowserMaps(islocal)
1670" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1671 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001672" call Decho("make local maps")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001673 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1674 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1675 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1676 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1677 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1678 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1679 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1680 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1681 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1682 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1683 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1684 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1685 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1686 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1687 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1688 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1689 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1690 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1691 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1692 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
1693 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1694 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001695 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001696 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1697 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1698 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1699 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1700 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1701 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1702 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1703 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1704 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1705 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>
1706 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001707 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001708 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1709 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr>
1710 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr>
1711 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1712 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001713 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001714 if !hasmapto('<Plug>NetrwHideEdit')
1715 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
1716 endif
1717 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1718 if !hasmapto('<Plug>NetrwRefresh')
1719 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
1720 endif
1721 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001722 if s:didstarstar || !mapcheck("<s-down>","n")
1723 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
1724 endif
1725 if s:didstarstar || !mapcheck("<s-up>","n")
1726 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
1727 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001728 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001729 if g:netrw_mousemaps == 1
1730 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1731 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1732 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001733 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1734 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001735 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001736 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1737 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1738 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1739 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1740 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1741 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001742 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
1743 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001744
Bram Moolenaar9964e462007-05-05 17:54:07 +00001745 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001746" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001747 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001748 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1749 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1750 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1751 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
1752 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1753 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1754 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1755 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1756 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1757 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1758 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1759 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1760 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1761 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1762 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1763 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1764 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1765 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1766 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1767 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1768 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
1769 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001770 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001771 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
1772 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
1773 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
1774 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1775 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
1776 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1777 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1778 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1779 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>
1780 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001781 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001782 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
1783 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr>
1784 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr>
1785 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
1786 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001787 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001788 if !hasmapto('<Plug>NetrwHideEdit')
1789 nmap <buffer> <c-h> <Plug>NetrwHideEdit
1790 endif
1791 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
1792 if !hasmapto('<Plug>NetrwRefresh')
1793 nmap <buffer> <c-l> <Plug>NetrwRefresh
1794 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001795
1796 let mapsafepath = escape(s:path, s:netrw_map_escape)
1797 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
1798
Bram Moolenaar446cb832008-06-24 21:56:24 +00001799 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1800 if g:netrw_mousemaps == 1
1801 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
1802 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
1803 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001804 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1805 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001806 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001807 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1808 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1809 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
1810 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1811 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1812 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1813 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001814 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001815 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001816 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001817" call Dret("s:BrowserMaps")
1818endfun
1819
1820" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001821" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1822fun! s:ExplorePatHls(pattern)
1823" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
1824 let repat= substitute(a:pattern,'^**/\{1,2}','','')
1825" call Decho("repat<".repat.">")
1826 let repat= escape(repat,'][.\')
1827" call Decho("repat<".repat.">")
1828 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
1829" call Dret("s:ExplorePatHls repat<".repat.">")
1830 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00001831endfun
1832
1833" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001834" s:NetrwBookmarkDir: {{{2
1835" 0: (user: <mb>) bookmark current directory
1836" 1: (user: <gb>) change to the bookmarked directory
1837" 2: (user: <qb>) list bookmarks
1838" 3: (browsing) record current directory history
1839" 4: (user: <u>) go up (previous) bookmark
1840" 5: (user: <U>) go down (next) bookmark
1841" 6: (user: <mB>) delete bookmark
1842fun! s:NetrwBookmarkDir(chg,curdir)
1843" 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 +00001844
1845 if a:chg == 0
1846 " bookmark the current directory
1847" call Decho("(user: <b>) bookmark the current directory")
1848 if v:count > 0
1849 " handle bookmark# specified via the count
1850 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1851 if !exists("g:NETRW_BOOKMARKMAX")
1852 let g:NETRW_BOOKMARKMAX= v:count
1853 elseif v:count > g:NETRW_BOOKMARKMAX
1854 let g:NETRW_BOOKMARKMAX= v:count
1855 endif
1856 else
1857 " handle no count specified
1858 let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
1859 let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
1860 endif
1861 echo "bookmarked the current directory"
1862
1863 elseif a:chg == 1
1864 " change to the bookmarked directory
1865" call Decho("(user: <B>) change to the bookmarked directory")
1866 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001867 exe "e ".fnameescape(g:NETRW_BOOKMARKDIR_{v:count})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001868 else
1869 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1870 endif
1871
1872 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00001873" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00001874 let didwork= 0
1875 " list user's bookmarks
1876" call Decho("(user: <q>) list user's bookmarks")
1877 if exists("g:NETRW_BOOKMARKMAX")
1878" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1879 let cnt= 0
1880 while cnt <= g:NETRW_BOOKMARKMAX
1881 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1882" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1883 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1884 let didwork= 1
1885 endif
1886 let cnt= cnt + 1
1887 endwhile
1888 endif
1889
1890 " list directory history
1891 let cnt = g:NETRW_DIRHIST_CNT
1892 let first = 1
1893 let histcnt = 0
1894 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1895" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1896 let histcnt= histcnt + 1
1897 if exists("g:NETRW_DIRHIST_{cnt}")
1898" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1899 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
1900 let didwork= 1
1901 endif
1902 let first = 0
1903 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1904 if cnt < 0
1905 let cnt= cnt + g:netrw_dirhistmax
1906 endif
1907 endwhile
1908 if didwork
1909 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
1910 endif
1911
1912 elseif a:chg == 3
1913 " saves most recently visited directories (when they differ)
1914" call Decho("(browsing) record curdir history")
1915 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
1916 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1917" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1918 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
1919" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1920 endif
1921
1922 elseif a:chg == 4
1923 " u: change to the previous directory stored on the history list
1924" call Decho("(user: <u>) chg to prev dir from history")
1925 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1926 if g:NETRW_DIRHIST_CNT < 0
1927 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1928 endif
1929 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1930" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1931 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1932 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001933" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001934 %d
1935 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001936" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001937 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001938" " call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1939 exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001940 else
1941 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1942 echo "Sorry, no predecessor directory exists yet"
1943 endif
1944
1945 elseif a:chg == 5
1946 " U: change to the subsequent directory stored on the history list
1947" call Decho("(user: <U>) chg to next dir from history")
1948 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1949 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1950" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1951 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1952 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001953" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001954 %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00001955" call Decho("removed all lines from buffer (%d)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001956 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001957" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001958 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001959" call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1960 exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001961 else
1962 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1963 if g:NETRW_DIRHIST_CNT < 0
1964 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1965 endif
1966 echo "Sorry, no successor directory exists yet"
1967 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001968
1969 elseif a:chg == 6
1970 if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
1971 " delete the v:count'th bookmark
1972" call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
1973 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1974 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1975
1976 elseif v:count > 0
1977" call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
1978 let cnt= v:count
1979 while cnt < g:NETRW_BOOKMARKMAX
1980 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1981 let cnt = cnt + 1
1982 endwhile
1983 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1984 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1985
1986 elseif exists("b:netrw_curdir")
1987 " look for current directory amongst the bookmarks and remove that bookmark
1988" call Decho("search for bookmark<".b:netrw_curdir.">")
1989 let cnt= 1
1990 while cnt <= g:NETRW_BOOKMARKMAX
1991" call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
1992 if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
1993 if cnt < g:NETRW_BOOKMARKMAX
1994" call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
1995 while cnt < g:NETRW_BOOKMARMAX
1996 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1997 let cnt = cnt + 1
1998 endwhile
1999 endif
2000 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
2001 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
2002 endif
2003 let cnt= cnt + 1
2004 endwhile
2005 endif
2006
Bram Moolenaar9964e462007-05-05 17:54:07 +00002007 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002008 call s:NetrwBookmarkMenu()
2009" call Dret("NetrwBookmarkDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002010endfun
2011
2012" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002013" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2014" list of the contents of a local or remote directory. It is assumed that the
2015" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2016" with the requested remote hostname first.
2017fun! s:NetrwBrowse(islocal,dirname)
2018 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2019" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
2020" call Decho("tab#".tabpagenr()." win#".winnr())
2021" call Dredir("ls!")
2022
2023 if exists("s:netrw_skipbrowse")
2024 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002025" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002026" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2027 return
2028 endif
2029 if !exists("*shellescape")
2030 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2031" call Dret("s:NetrwBrowse : missing shellescape()")
2032 return
2033 endif
2034 if !exists("*fnameescape")
2035 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2036" call Dret("s:NetrwBrowse : missing fnameescape()")
2037 return
2038 endif
2039
2040 call s:NetrwOptionSave("w:")
2041 call s:NetrwSafeOptions()
2042
2043 " re-instate any marked files
2044 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2045" call Decho("clearing marked files")
2046 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2047 endif
2048
2049 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2050" call Decho("handle w:netrw_acdkeep:")
2051" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
2052 exe 'keepjumps lcd '.fnameescape(a:dirname)
2053" call Decho("getcwd<".getcwd().">")
2054
2055 elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
2056 " looks like a regular file, attempt transfer
2057" call Decho("attempt transfer as regular file<".a:dirname.">")
2058
2059 " remove any filetype indicator from end of dirname, except for the {{{3
2060 " "this is a directory" indicator (/).
2061 " There shouldn't be one of those here, anyway.
2062 let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
2063" call Decho("new path<".path.">")
2064 call s:RemotePathAnalysis(a:dirname)
2065
2066 " remote-read the requested file into current buffer {{{3
2067 mark '
2068 call s:NetrwEnew(a:dirname)
2069 setlocal ma noro
2070" call Decho("setlocal ma noro")
2071 let b:netrw_curdir= a:dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002072" call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
2073 exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2074 exe "silent keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002075 silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
2076 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
2077 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaarc236c162008-07-13 17:41:49 +00002078 exe "silent keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002079 endif
2080
2081 " save certain window-oriented variables into buffer-oriented variables {{{3
2082 call s:SetBufWinVars()
2083 call s:NetrwOptionRestore("w:")
2084 setlocal ma nomod
2085
Bram Moolenaarc236c162008-07-13 17:41:49 +00002086" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002087" call Dret("s:NetrwBrowse : file<".s:fname.">")
2088 return
2089 endif
2090
2091 " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
2092 call s:UseBufWinVars()
2093
2094 " set up some variables {{{3
2095 let b:netrw_browser_active = 1
2096 let dirname = a:dirname
2097 let s:last_sort_by = g:netrw_sort_by
2098
2099 " set up menu {{{3
2100 call s:NetrwMenu(1)
2101
2102 " set up buffer {{{3
2103 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2104 " maintain markfile highlighting
2105 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2106" call Decho("bufnr(%)=".bufnr('%'))
2107" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2108 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2109 else
2110" call Decho("2match none")
2111 2match none
2112 endif
2113 if reusing
2114 call s:NetrwOptionRestore("w:")
2115 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002116" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002117" call Dret("s:NetrwBrowse : re-using buffer")
2118 return
2119 endif
2120
2121 " set b:netrw_curdir to the new directory name {{{3
2122" call Decho("set b:netrw_curdir to the new directory name:")
2123 let b:netrw_curdir= dirname
2124 if b:netrw_curdir =~ '[/\\]$'
2125 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2126 endif
2127 if b:netrw_curdir == ''
2128 if has("amiga")
2129 " On the Amiga, the empty string connotes the current directory
2130 let b:netrw_curdir= getcwd()
2131 else
2132 " under unix, when the root directory is encountered, the result
2133 " from the preceding substitute is an empty string.
2134 let b:netrw_curdir= '/'
2135 endif
2136 endif
2137 if !a:islocal && b:netrw_curdir !~ '/$'
2138 let b:netrw_curdir= b:netrw_curdir.'/'
2139 endif
2140" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2141
2142 " ------------
2143 " (local only) {{{3
2144 " ------------
2145 if a:islocal
2146" call Decho("local only:")
2147
2148 " Set up ShellCmdPost handling. Append current buffer to browselist
2149 call s:LocalFastBrowser()
2150
2151 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2152 if !g:netrw_keepdir
2153" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2154" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2155 if !exists("&l:acd") || !&l:acd
2156" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2157 try
2158 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
2159 catch /^Vim\%((\a\+)\)\=:E472/
2160 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2161 if exists("w:netrw_prvdir")
2162 let b:netrw_curdir= w:netrw_prvdir
2163 else
2164 call s:NetrwOptionRestore("w:")
2165 setlocal noma nomod nowrap
2166 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002167" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002168" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2169 return
2170 endif
2171 endtry
2172 endif
2173 endif
2174
2175 " --------------------------------
2176 " remote handling: {{{3
2177 " --------------------------------
2178 else
2179" call Decho("remote only:")
2180
2181 " analyze a:dirname and g:netrw_list_cmd {{{4
2182" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
2183 if a:dirname =~ "^NetrwTreeListing\>"
2184 let dirname= b:netrw_curdir
2185" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
2186 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2187 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2188 if dirname !~ '/$'
2189 let dirname= dirname.'/'
2190 endif
2191 let b:netrw_curdir = dirname
2192" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2193 else
2194 let dirname = substitute(a:dirname,'\\','/','g')
2195" call Decho("(normal) dirname<".dirname.">")
2196 endif
2197
2198 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2199 if dirname !~ dirpat
2200 if !exists("g:netrw_quiet")
2201 call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
2202 endif
2203 call s:NetrwOptionRestore("w:")
2204 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002205" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002206" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2207 return
2208 endif
2209 let b:netrw_curdir= dirname
2210" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2211 endif " (additional remote handling)
2212
2213 " -----------------------
2214 " Directory Listing: {{{3
2215 " -----------------------
2216 call s:BrowserMaps(a:islocal)
2217 call s:PerformListing(a:islocal)
2218
Bram Moolenaarc236c162008-07-13 17:41:49 +00002219" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002220" call Dret("s:NetrwBrowse : did PerformListing")
2221 return
2222endfun
2223
2224" ---------------------------------------------------------------------
2225" s:NetrwFileInfo: supports qf (query for file information) {{{2
2226fun! s:NetrwFileInfo(islocal,fname)
2227" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2228 if a:islocal
2229 if (has("unix") || has("macunix")) && executable("/bin/ls")
2230 if exists("b:netrw_curdir")
2231" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2232 if b:netrw_curdir =~ '/$'
2233 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2234 else
2235 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2236 endif
2237 else
2238" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2239 echo system("/bin/ls -lsad ".shellescape(a:fname))
2240 endif
2241 else
2242 " use vim functions to return information about file below cursor
2243" call Decho("using vim functions to query for file info")
2244 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2245 let fname= substitute(a:fname,".$","","")
2246 else
2247 let fname= a:fname
2248 endif
2249 let t = getftime(fname)
2250 let sz = getfsize(fname)
2251 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2252" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2253 endif
2254 else
2255 echo "sorry, \"qf\" not supported yet for remote files"
2256 endif
2257" call Dret("s:NetrwFileInfo")
2258endfun
2259
2260" ---------------------------------------------------------------------
2261" s:NetrwGetBuffer: {{{2
2262" returns 0=cleared buffer
2263" 1=re-used buffer
2264fun! s:NetrwGetBuffer(islocal,dirname)
2265" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2266 let dirname= a:dirname
2267
2268 " re-use buffer if possible {{{3
2269" call Decho("--re-use a buffer if possible--")
2270 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2271 " find NetrwTreeList buffer if there is one
2272 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2273" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2274 let eikeep= &ei
2275 set ei=all
2276 exe "b ".w:netrw_treebufnr
2277 let &ei= eikeep
2278" call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
2279 return
2280 endif
2281 let bufnum= -1
2282" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2283
2284 else
2285 " find buffer number of buffer named precisely the same as dirname {{{3
2286" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2287" call Dredir("ls!")
2288
2289 " get dirname and associated buffer number
2290 let bufnum = bufnr(escape(dirname,'\'))
2291" call Decho(" find buffer<".dirname.">'s number ")
2292" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2293
2294 if bufnum < 0 && dirname !~ '/$'
2295 " trying appending a trailing /
2296" call Decho(" try appending a trailing / to dirname<".dirname.">")
2297 let bufnum= bufnr(escape(dirname.'/','\'))
2298 if bufnum > 0
2299 let dirname= dirname.'/'
2300 endif
2301 endif
2302
2303 if bufnum < 0 && dirname =~ '/$'
2304 " trying removing a trailing /
2305" call Decho(" try removing a trailing / from dirname<".dirname.">")
2306 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2307 if bufnum > 0
2308 let dirname= substitute(dirname,'/$','','')
2309 endif
2310 endif
2311
2312" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2313 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2314 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2315 " handle approximate matches
Bram Moolenaarc236c162008-07-13 17:41:49 +00002316" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx=dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002317 let ibuf = 1
2318 let buflast = bufnr("$")
2319" call Decho(" findbuf2: buflast=".buflast)
2320 while ibuf <= buflast
2321 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002322 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002323" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002324 if bname != '' && dirname =~ '/'.bname.'/\=$' | break | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002325 if bname =~ '^'.dirname.'/\=$' | break | endif
2326 if dirname =~ '^'.bname.'/$' | break | endif
2327 let ibuf= ibuf + 1
2328 endwhile
2329 if ibuf > buflast
2330 let bufnum= -1
2331 else
2332 let bufnum= ibuf
2333 endif
2334" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2335 endif
2336 endif
2337
2338 " get enew buffer and name it -or- re-use buffer {{{3
2339" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")")
2340 mark '
2341 if bufnum < 0 || !bufexists(bufnum)
2342 call s:NetrwEnew(dirname)
2343" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2344 " name the buffer
2345 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2346 " Got enew buffer; transform into a NetrwTreeListing
2347" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2348 if !exists("s:netrw_treelistnum")
2349 let s:netrw_treelistnum= 1
2350 else
2351 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2352 endif
2353 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002354" call Decho(" exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
2355 exe 'silent! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002356 nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
2357 nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
2358 nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr>
2359 nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr>
2360" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2361 else
2362" let v:errmsg= "" " Decho
2363 let escdirname= fnameescape(dirname)
2364" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002365" call Decho(' exe silent! keepalt file '.escdirname)
2366 exe 'silent! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002367" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2368 endif
2369" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2370
2371 else " Re-use the buffer
2372" call Decho("--re-use buffer#".bufnum.": --")
2373 let eikeep= &ei
2374 set ei=all
2375 if getline(2) =~ '^" Netrw Directory Listing'
2376" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
2377 exe "keepalt b ".bufnum
2378 else
2379" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
2380 exe "b ".bufnum
2381 endif
2382 if bufname("%") == '.'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002383" call Decho("exe silent! keepalt file ".fnameescape(getcwd()))
2384 exe "silent! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002385 endif
2386 let &ei= eikeep
2387 if line("$") <= 1
2388 call s:NetrwListSettings(a:islocal)
2389" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2390 return 0
2391 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2392" call Decho("--re-use tree listing--")
2393" call Decho(" clear buffer<".expand("%")."> with :%d")
2394 silent %d
2395 call s:NetrwListSettings(a:islocal)
2396" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2397 return 0
2398 else
2399" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2400 return 1
2401 endif
2402 endif
2403
2404 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2405 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2406 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2407 " med 1 D H
2408 " fast 2 H H
2409" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--")
2410 let fname= expand("%")
2411 call s:NetrwListSettings(a:islocal)
Bram Moolenaarc236c162008-07-13 17:41:49 +00002412" call Decho("exe keepalt file ".fnameescape(fname))
2413 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002414
2415 " delete all lines from buffer {{{3
2416" call Decho("--delete all lines from buffer--")
2417" call Decho(" clear buffer<".expand("%")."> with :%d")
2418 keepalt silent! %d
2419
2420" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2421 return 0
2422endfun
2423
2424" ---------------------------------------------------------------------
2425" s:NetrwGetcwd: get the current directory. {{{2
2426" Change backslashes to forward slashes, if any.
2427" If doesc is true, escape certain troublesome characters
2428fun! s:NetrwGetcwd(doesc)
2429" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2430 let curdir= substitute(getcwd(),'\\','/','ge')
2431 if curdir !~ '[\/]$'
2432 let curdir= curdir.'/'
2433 endif
2434 if a:doesc
2435 let curdir= fnameescape(curdir)
2436 endif
2437" call Dret("NetrwGetcwd <".curdir.">")
2438 return curdir
2439endfun
2440
2441" ---------------------------------------------------------------------
2442" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2443fun! s:NetrwGetWord()
2444" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2445 call s:UseBufWinVars()
2446
2447 " insure that w:netrw_liststyle is set up
2448 if !exists("w:netrw_liststyle")
2449 if exists("g:netrw_liststyle")
2450 let w:netrw_liststyle= g:netrw_liststyle
2451 else
2452 let w:netrw_liststyle= s:THINLIST
2453 endif
2454" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2455 endif
2456
2457 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2458 " Active Banner support
2459" call Decho("active banner handling")
2460 norm! 0
2461 let dirname= "./"
2462 let curline= getline('.')
2463
2464 if curline =~ '"\s*Sorted by\s'
2465 norm s
2466 let s:netrw_skipbrowse= 1
2467 echo 'Pressing "s" also works'
2468
2469 elseif curline =~ '"\s*Sort sequence:'
2470 let s:netrw_skipbrowse= 1
2471 echo 'Press "S" to edit sorting sequence'
2472
2473 elseif curline =~ '"\s*Quick Help:'
2474 norm ?
2475 let s:netrw_skipbrowse= 1
2476 echo 'Pressing "?" also works'
2477
2478 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
2479 norm a
2480 let s:netrw_skipbrowse= 1
2481 echo 'Pressing "a" also works'
2482
2483 elseif line("$") > w:netrw_bannercnt
2484 exe 'silent keepjumps '.w:netrw_bannercnt
2485 endif
2486
2487 elseif w:netrw_liststyle == s:THINLIST
2488" call Decho("thin column handling")
2489 norm! 0
2490 let dirname= getline('.')
2491
2492 elseif w:netrw_liststyle == s:LONGLIST
2493" call Decho("long column handling")
2494 norm! 0
2495 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2496
2497 elseif w:netrw_liststyle == s:TREELIST
2498" call Decho("treelist handling")
2499 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2500
2501 else
2502" call Decho("obtain word from wide listing")
2503 let dirname= getline('.')
2504
2505 if !exists("b:netrw_cpf")
2506 let b:netrw_cpf= 0
2507 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2508" call Decho("computed cpf=".b:netrw_cpf)
2509 endif
2510
2511" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2512 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2513" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2514" call Decho("1: dirname<".dirname.">")
2515 if filestart == 0
2516 norm! 0ma
2517 else
2518 call cursor(line("."),filestart+1)
2519 norm! ma
2520 endif
2521 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002522 let eofname= filestart + b:netrw_cpf + 1
2523 if eofname <= col("$")
2524 call cursor(line("."),filestart+b:netrw_cpf+1)
2525 norm! "ay`a
2526 else
2527 norm! "ay$
2528 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002529 let dirname = @a
2530 let @a = rega
2531" call Decho("2: dirname<".dirname.">")
2532 let dirname= substitute(dirname,'\s\+$','','e')
2533" call Decho("3: dirname<".dirname.">")
2534 endif
2535
2536 " symlinks are indicated by a trailing "@". Remove it before further processing.
2537 let dirname= substitute(dirname,"@$","","")
2538
2539 " executables are indicated by a trailing "*". Remove it before further processing.
2540 let dirname= substitute(dirname,"\*$","","")
2541
2542" call Dret("s:NetrwGetWord <".dirname.">")
2543 return dirname
2544endfun
2545
2546" ---------------------------------------------------------------------
2547" s:NetrwListSettings: {{{2
2548fun! s:NetrwListSettings(islocal)
2549" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2550 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002551" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002552 setlocal bt=nofile nobl ma nonu nowrap noro
2553" call Decho("exe keepalt file ".fnameescape(fname))
2554 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002555 if g:netrw_use_noswf
2556 setlocal noswf
2557 endif
2558" call Dredir("ls!")
2559" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2560 exe "setlocal ts=".g:netrw_maxfilenamelen
2561 setlocal isk+=.,~,-
2562 if g:netrw_fastbrowse > a:islocal
2563 setlocal bh=hide
2564 else
2565 setlocal bh=delete
2566 endif
2567" call Dret("s:NetrwListSettings")
2568endfun
2569
2570" ---------------------------------------------------------------------
2571" s:NetrwListStyle: {{{2
2572" islocal=0: remote browsing
2573" =1: local browsing
2574fun! s:NetrwListStyle(islocal)
2575" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2576 let fname = s:NetrwGetWord()
2577 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2578 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2579" call Decho("fname<".fname.">")
2580" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2581" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2582
2583 if w:netrw_liststyle == s:THINLIST
2584 " use one column listing
2585" call Decho("use one column list")
2586 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2587
2588 elseif w:netrw_liststyle == s:LONGLIST
2589 " use long list
2590" call Decho("use long list")
2591 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2592
2593 elseif w:netrw_liststyle == s:WIDELIST
2594 " give wide list
2595" call Decho("use wide list")
2596 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2597
2598 elseif w:netrw_liststyle == s:TREELIST
2599" call Decho("use tree list")
2600 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2601
2602 else
2603 call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2604 let g:netrw_liststyle = s:THINLIST
2605 let w:netrw_liststyle = g:netrw_liststyle
2606 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2607 endif
2608 setlocal ma noro
2609" call Decho("setlocal ma noro")
2610
2611 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2612" call Decho("clear buffer<".expand("%")."> with :%d")
2613 %d
2614
2615 " refresh the listing
2616 let svpos= netrw#NetrwSavePosn()
2617 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2618 call netrw#NetrwRestorePosn(svpos)
2619
2620 " keep cursor on the filename
2621 silent keepjumps $
2622 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2623" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2624 if result <= 0 && exists("w:netrw_bannercnt")
2625 exe "keepjumps ".w:netrw_bannercnt
2626 endif
2627
2628" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2629endfun
2630
2631" ---------------------------------------------------------------------
2632" s:NetrwBookmarkMenu: Uses menu priorities {{{2
2633" .2.[cnt] for bookmarks, and
2634" .3.[cnt] for history
2635" (see s:NetrwMenu())
2636fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002637 if !exists("s:netrw_menucnt")
2638 return
2639 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002640" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
2641
2642 " the following test assures that gvim is running, has menus available, and has menus enabled.
2643 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00002644 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002645" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
2646 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002647 endif
2648
2649 " show bookmarked places
Bram Moolenaar446cb832008-06-24 21:56:24 +00002650 let cnt = 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002651 while cnt <= g:NETRW_BOOKMARKMAX
2652 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002653 let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
2654" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.bmdir)
2655 exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002656 endif
2657 let cnt= cnt + 1
2658 endwhile
2659
2660 " show directory browsing history
2661 let cnt = g:NETRW_DIRHIST_CNT
2662 let first = 1
2663 let histcnt = 0
2664 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2665 let histcnt = histcnt + 1
2666 let priority = g:NETRW_DIRHIST_CNT + histcnt
2667 if exists("g:NETRW_DIRHIST_{cnt}")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002668 let bmdir= escape(g:NETRW_DIRHIST_{cnt},'/&? ')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002669" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir)
2670 exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002671 endif
2672 let first = 0
2673 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2674 if cnt < 0
2675 let cnt= cnt + g:netrw_dirhistmax
2676 endif
2677 endwhile
2678 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002679" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002680endfun
2681
2682" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002683" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
2684" directory and a new directory name. Also, if the
2685" "new directory name" is actually a file,
2686" NetrwBrowseChgDir() edits the file.
2687fun! s:NetrwBrowseChgDir(islocal,newdir,...)
2688" 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 +00002689
Bram Moolenaar446cb832008-06-24 21:56:24 +00002690 if !exists("b:netrw_curdir")
2691 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
2692 " and the current window is the NetrwMessage window.
2693" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
2694" call Decho("getcwd<".getcwd().">")
2695" call Dredir("ls!")
2696" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002697 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00002698 endif
2699
Bram Moolenaar446cb832008-06-24 21:56:24 +00002700 call s:NetrwOptionSave("s:")
2701 call s:NetrwSafeOptions()
2702 let nbcd_curpos = netrw#NetrwSavePosn()
2703 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
2704 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
2705 let newdir = a:newdir
2706 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002707
Bram Moolenaar446cb832008-06-24 21:56:24 +00002708 " set up o/s-dependent directory recognition pattern
2709 if has("amiga")
2710 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002711 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002712 let dirpat= '[\/]$'
2713 endif
2714" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
2715
2716 if dirname !~ dirpat
2717 " apparently vim is "recognizing" that it is in a directory and
2718 " is removing the trailing "/". Bad idea, so I put it back.
2719 let dirname= dirname.'/'
2720" call Decho("adjusting dirname<".dirname.">")
2721 endif
2722
2723 if newdir !~ dirpat
2724 " ------------
2725 " edit a file:
2726 " ------------
2727" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2728 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2729 let dirname= s:NetrwTreeDir()
2730 if dirname =~ '/$'
2731 let dirname= dirname.newdir
2732 else
2733 let dirname= s:NetrwTreeDir()."/".newdir
2734 endif
2735" call Decho("tree listing")
2736 elseif newdir =~ '^\(/\|\a:\)'
2737 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00002738 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002739 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002740 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002741" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
2742 " this lets NetrwBrowseX avoid the edit
2743 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002744" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
2745 call s:NetrwOptionRestore("s:")
2746 if !exists("s:didsplit")
2747 if g:netrw_browse_split == 1
2748 new
2749 wincmd _
2750 elseif g:netrw_browse_split == 2
2751 rightb vert new
2752 wincmd |
2753 elseif g:netrw_browse_split == 3
2754 tabnew
2755 elseif g:netrw_browse_split == 4
2756 if s:NetrwPrevWinOpen(2) == 3
2757" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002758 return
2759 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002760 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002761 " handling a file, didn't split, so remove menu
2762" call Decho("handling a file+didn't split, so remove menu")
2763 call s:NetrwMenu(0)
2764 " optional change to window
2765 if g:netrw_chgwin >= 1
2766 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002767 endif
2768 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002769 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002770 " the point where netrw actually edits the (local) file
2771 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
2772 if a:islocal
2773" call Decho("edit local file: exe e! ".fnameescape(dirname))
2774 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002775 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002776" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002777 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002778 let dolockout= 1
2779 endif
2780
2781 elseif newdir =~ '^/'
2782 " ---------------------------------
2783 " just go to the new directory spec
2784 " ---------------------------------
2785" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
2786 let dirname= newdir
2787 call s:SetRexDir(a:islocal,dirname)
2788 call s:NetrwOptionRestore("s:")
2789
2790 elseif newdir == './'
2791 " --------------------------
2792 " refresh the directory list
2793 " --------------------------
2794" call Decho('case "refresh directory listing": newdir == "./"')
2795 call s:SetRexDir(a:islocal,dirname)
2796
2797 elseif newdir == '../'
2798 " -------------------
2799 " go up one directory
2800 " -------------------
2801" call Decho('case "go up one directory": newdir == "../"')
2802
2803 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2804 " force a refresh
2805" call Decho("clear buffer<".expand("%")."> with :%d")
2806 setlocal noro ma
2807" call Decho("setlocal noro ma")
2808 keepjumps %d
2809 endif
2810
2811 if has("amiga")
2812 " amiga
2813" call Decho('case "go up one directory": newdir == "../" and amiga')
2814 if a:islocal
2815 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
2816 let dirname= substitute(dirname,'/$','','')
2817 else
2818 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
2819 endif
2820" call Decho("amiga: dirname<".dirname."> (go up one dir)")
2821
2822 else
2823 " unix or cygwin
2824" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
2825 if a:islocal
2826 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
2827 if dirname == ""
2828 let dirname= '/'
2829 endif
2830 else
2831 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
2832 endif
2833" call Decho("unix: dirname<".dirname."> (go up one dir)")
2834 endif
2835 call s:SetRexDir(a:islocal,dirname)
2836
2837 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2838" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
2839 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
2840 setlocal noro ma
2841" call Decho("setlocal noro ma")
2842 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
2843" call Decho("clear buffer<".expand("%")."> with :%d")
2844 keepjumps %d
2845 endif
2846 let treedir = s:NetrwTreeDir()
2847 let s:treecurpos = nbcd_curpos
2848 let haskey= 0
2849" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
2850
2851 " search treedict for tree dir as-is
2852 if has_key(w:netrw_treedict,treedir)
2853" call Decho('....searched for treedir<'.treedir.'> : found it!')
2854 let haskey= 1
2855 else
2856" call Decho('....searched for treedir<'.treedir.'> : not found')
2857 endif
2858
2859 " search treedict for treedir with a / appended
2860 if !haskey && treedir !~ '/$'
2861 if has_key(w:netrw_treedict,treedir."/")
2862 let treedir= treedir."/"
2863" call Decho('....searched.for treedir<'.treedir.'> found it!')
2864 let haskey = 1
2865 else
2866" call Decho('....searched for treedir<'.treedir.'/> : not found')
2867 endif
2868 endif
2869
2870 " search treedict for treedir with any trailing / elided
2871 if !haskey && treedir =~ '/$'
2872 let treedir= substitute(treedir,'/$','','')
2873 if has_key(w:netrw_treedict,treedir)
2874" call Decho('....searched.for treedir<'.treedir.'> found it!')
2875 let haskey = 1
2876 else
2877" call Decho('....searched for treedir<'.treedir.'> : not found')
2878 endif
2879 endif
2880
2881 if haskey
2882 " close tree listing for selected subdirectory
2883" call Decho("closing selected subdirectory<".dirname.">")
2884 call remove(w:netrw_treedict,treedir)
2885" call Decho("removed entry<".dirname."> from treedict")
2886" call Decho("yielding treedict<".string(w:netrw_treedict).">")
2887 let dirname= w:netrw_treetop
2888 else
2889 " go down one directory
2890 let dirname= substitute(treedir,'/*$','/','')
2891" call Decho("go down one dir: treedir<".treedir.">")
2892 endif
2893 call s:SetRexDir(a:islocal,dirname)
2894
2895 else
2896 " go down one directory
2897 let dirname= s:ComposePath(dirname,newdir)
2898" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2899 call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002900 endif
2901
Bram Moolenaar446cb832008-06-24 21:56:24 +00002902 call s:NetrwOptionRestore("s:")
2903 if dolockout
2904" call Decho("doing modification lockout settings: ma nomod noro")
2905 setlocal ma nomod noro
2906" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002907 endif
2908
Bram Moolenaar446cb832008-06-24 21:56:24 +00002909" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
2910 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00002911endfun
2912
2913" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002914" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2
2915" files given their extension. Passes 0=local, 1=remote
2916fun! netrw#NetrwBrowseX(fname,remote)
2917" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
2918
2919 " set up the filename
2920 " (lower case the extension, make a local copy of a remote file)
2921 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
2922 if has("win32") || has("win95") || has("win64") || has("win16")
2923 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00002924 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002925
2926 " seems kde systems often have gnome-open due to dependencies, even though
2927 " gnome-open's subsidiary display tools are largely absent. Kde systems
2928 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
2929 if !exists("s:haskdeinit")
2930 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002931 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002932 if v:shell_error
2933 let s:haskdeinit = 0
2934 endif
2935 else
2936 let s:haskdeinit= 0
2937 endif
2938" call Decho("setting s:haskdeinit=".s:haskdeinit)
2939 endif
2940
2941 if a:remote == 1
2942 " create a local copy
2943 let fname= fnamemodify(tempname(),":r").".".exten
Bram Moolenaarc236c162008-07-13 17:41:49 +00002944" call Decho("a:remote=".a:remote.": create a local copy of <".fname."> as <".fname.">")
2945 exe "silent keepjumps bot 1new ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002946 setlocal bh=delete
Bram Moolenaarc236c162008-07-13 17:41:49 +00002947" call Decho("read <".fnameescape(fname).">, now writing: exe w! ".fnameescape(fname))
2948 exe "silent! w! ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002949 q
Bram Moolenaarc236c162008-07-13 17:41:49 +00002950 else
2951 let fname= a:fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002952 endif
2953" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
2954
2955 " set up redirection
2956 if &srr =~ "%s"
2957 if (has("win32") || has("win95") || has("win64") || has("win16"))
2958 let redir= substitute(&srr,"%s","nul","")
2959 else
2960 let redir= substitute(&srr,"%s","/dev/null","")
2961 endif
2962 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
2963 let redir= &srr . "nul"
2964 else
2965 let redir= &srr . "/dev/null"
2966 endif
2967" call Decho("redir{".redir."} srr{".&srr."}")
2968
2969 " extract any viewing options. Assumes that they're set apart by quotes.
2970 if exists("g:netrw_browsex_viewer")
2971 if g:netrw_browsex_viewer =~ '\s'
2972 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
2973 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
2974 let oviewer = ''
2975 let cnt = 1
2976 while !executable(viewer) && viewer != oviewer
2977 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
2978 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
2979 let cnt = cnt + 1
2980 let oviewer = viewer
2981" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
2982 endwhile
2983 else
2984 let viewer = g:netrw_browsex_viewer
2985 let viewopt = ""
2986 endif
2987" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
2988 endif
2989
2990 " execute the file handler
2991 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
2992" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2993 let ret= netrwFileHandlers#Invoke(exten,fname)
2994
2995 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
2996" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002997" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir)
2998 exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00002999 let ret= v:shell_error
3000
3001 elseif has("win32") || has("win64")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003002" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3003 exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003004 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3005 let ret= v:shell_error
3006
3007 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00003008" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir)
3009 exe "silent !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003010 let ret= v:shell_error
3011
3012 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00003013" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir)
3014 exe "silent !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003015 let ret= v:shell_error
3016
3017 elseif has("macunix") && executable("open")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003018" call Decho("exe silent !open ".shellescape(fname,1)." ".redir)
3019 exe "silent !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003020 let ret= v:shell_error
3021
3022 else
3023 " netrwFileHandlers#Invoke() always returns 0
3024 let ret= netrwFileHandlers#Invoke(exten,fname)
3025 endif
3026
3027 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3028 if ret
3029 let ret= netrwFileHandlers#Invoke(exten,fname)
3030 endif
3031
Bram Moolenaarc236c162008-07-13 17:41:49 +00003032 " restoring redraw! after external file handlers
3033 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003034
3035 " cleanup: remove temporary file,
3036 " delete current buffer if success with handler,
3037 " return to prior buffer (directory listing)
3038 " Feb 12, 2008: had to de-activiate removal of
3039 " temporary file because it wasn't getting seen.
3040" if a:remote == 1 && fname != a:fname
3041" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003042" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003043" endif
3044
3045 if a:remote == 1
3046 setlocal bh=delete bt=nofile
3047 if g:netrw_use_noswf
3048 setlocal noswf
3049 endif
3050 exe "norm! \<c-o>"
3051" redraw!
3052 endif
3053
3054" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003055endfun
3056
3057" ---------------------------------------------------------------------
3058" netrw#Explore: launch the local browser in the directory of the current file {{{2
3059" dosplit==0: the window will be split iff the current file has
3060" been modified
3061" dosplit==1: the window will be split before running the local
3062" browser
3063fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003064" 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 +00003065 if !exists("b:netrw_curdir")
3066 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003067" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003068 endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003069 let curfile= b:netrw_curdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003070" call Decho("curfile<".curfile.">")
3071
3072 " save registers
3073 silent! let keepregstar = @*
3074 silent! let keepregplus = @+
3075 silent! let keepregslash= @/
3076
3077 " if dosplit or file has been modified
3078 if a:dosplit || &modified || a:style == 6
3079" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
3080 call s:SaveWinVars()
3081
3082 if a:style == 0 " Explore, Sexplore
3083" call Decho("style=0: Explore or Sexplore")
3084 exe g:netrw_winsize."wincmd s"
3085
3086 elseif a:style == 1 "Explore!, Sexplore!
3087" call Decho("style=1: Explore! or Sexplore!")
3088 exe g:netrw_winsize."wincmd v"
3089
3090 elseif a:style == 2 " Hexplore
3091" call Decho("style=2: Hexplore")
3092 exe "bel ".g:netrw_winsize."wincmd s"
3093
3094 elseif a:style == 3 " Hexplore!
3095" call Decho("style=3: Hexplore!")
3096 exe "abo ".g:netrw_winsize."wincmd s"
3097
3098 elseif a:style == 4 " Vexplore
3099" call Decho("style=4: Vexplore")
3100 exe "lefta ".g:netrw_winsize."wincmd v"
3101
3102 elseif a:style == 5 " Vexplore!
3103" call Decho("style=5: Vexplore!")
3104 exe "rightb ".g:netrw_winsize."wincmd v"
3105
3106 elseif a:style == 6 " Texplore
3107 call s:SaveBufVars()
3108" call Decho("style = 6: Texplore")
3109 tabnew
3110 call s:RestoreBufVars()
3111 endif
3112 call s:RestoreWinVars()
3113 endif
3114 norm! 0
3115
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003116 if a:0 > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003117" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003118 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
3119 let dirname= substitute(a:1,'\~',expand("$HOME"),'')
3120" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3121 elseif a:1 == '.'
3122 let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
3123 if dirname !~ '/$'
3124 let dirname= dirname."/"
3125 endif
3126" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3127 elseif a:1 =~ '\$'
3128 let dirname= expand(a:1)
3129 else
3130 let dirname= a:1
3131" call Decho("using dirname<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003132 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003133 else
3134 " clear explore
3135" call Decho("clearing explore variables")
3136 2match none
3137 if exists("s:explore_match") |unlet s:explore_match |endif
3138 if exists("s:explore_indx") |unlet s:explore_indx |endif
3139 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3140 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3141 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3142 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3143 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3144 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3145" redraw!
3146 echo " "
3147 echo " "
3148" call Dret("netrw#Explore : cleared list")
3149 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003150 endif
3151
Bram Moolenaar446cb832008-06-24 21:56:24 +00003152 if dirname =~ '/\*\*/'
3153 " handle .../**/.../filepat
3154" call Decho("case Explore .../**/.../filepat")
3155 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3156 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3157 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003158 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003159 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003160 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003161 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3162 let starpat= 4;
3163" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3164" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003165
Bram Moolenaar446cb832008-06-24 21:56:24 +00003166 elseif dirname =~ '^\*//'
3167 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3168" call Decho("case Explore *//pattern")
3169 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3170 let starpat= 1
3171" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3172 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3173
3174 elseif dirname =~ '^\*\*//'
3175 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3176" call Decho("case Explore **//pattern")
3177 let pattern= substitute(dirname,'^\*\*//','','')
3178 let starpat= 2
3179" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3180
3181 elseif dirname =~ '^\*/'
3182 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3183 let starpat= 3
3184" call Decho("case Explore */filepat (starpat=".starpat.")")
3185
3186 elseif dirname=~ '^\*\*/'
3187 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3188 let starpat= 4
3189" call Decho("case Explore **/filepat (starpat=".starpat.")")
3190 else
3191 let starpat= 0
3192 endif
3193
3194 if starpat == 0 && a:indx >= 0
3195 " [Explore Hexplore Vexplore Sexplore] [dirname]
3196" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore")
3197 if dirname == ""
3198 let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3199 endif
3200 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3201" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3202 call s:NetrwBrowse(0,dirname)
3203 else
3204 if dirname == ""|let dirname= getcwd()|endif
3205" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3206 call netrw#LocalBrowseCheck(dirname)
3207 endif
3208
3209" call Decho("curfile<".curfile.">")
3210 if has("win32") || has("win95") || has("win64") || has("win16")
3211 call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
3212 else
3213 call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
3214 endif
3215
3216 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3217 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3218 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3219 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3220 elseif a:indx <= 0
3221 " Nexplore, Pexplore, Explore: handle starpat
3222" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003223 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3224" call Decho("set up <s-up> and <s-down> maps")
3225 let s:didstarstar= 1
3226 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3227 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3228 endif
3229
3230 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003231" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003232 if !exists("w:netrw_explore_indx")
3233 let w:netrw_explore_indx= 0
3234 endif
3235 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003236" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003237"
3238 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003239 " Nexplore
3240" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003241 if !exists("w:netrw_explore_list") " sanity check
3242 call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
3243 silent! let @* = keepregstar
3244 silent! let @+ = keepregstar
3245 silent! let @/ = keepregslash
3246" call Dret("netrw#Explore")
3247 return
3248 endif
3249 let indx= w:netrw_explore_indx
3250 if indx < 0 | let indx= 0 | endif
3251 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3252 let curfile= w:netrw_explore_list[indx]
3253" call Decho("indx=".indx." curfile<".curfile.">")
3254 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3255 let indx= indx + 1
3256" call Decho("indx=".indx." (Nexplore while loop)")
3257 endwhile
3258 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3259" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3260
3261 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003262 " Pexplore
3263" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003264 if !exists("w:netrw_explore_list") " sanity check
3265 call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
3266 silent! let @* = keepregstar
3267 silent! let @+ = keepregstar
3268 silent! let @/ = keepregslash
3269" call Dret("netrw#Explore")
3270 return
3271 endif
3272 let indx= w:netrw_explore_indx
3273 if indx < 0 | let indx= 0 | endif
3274 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3275 let curfile= w:netrw_explore_list[indx]
3276" call Decho("indx=".indx." curfile<".curfile.">")
3277 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3278 let indx= indx - 1
3279" call Decho("indx=".indx." (Pexplore while loop)")
3280 endwhile
3281 if indx < 0 | let indx= 0 | endif
3282" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3283
3284 else
3285 " Explore -- initialize
3286 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003287" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003288 let w:netrw_explore_indx= 0
3289 if !exists("b:netrw_curdir")
3290 let b:netrw_curdir= getcwd()
3291 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003292" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003293
Bram Moolenaar446cb832008-06-24 21:56:24 +00003294 " switch on starpat to build the w:netrw_explore_list of files
3295 if starpat == 1
3296 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3297" call Decho("starpat=".starpat.": build *//pattern list")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003298 exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003299 let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
3300 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3301
3302 elseif starpat == 2
3303 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3304" call Decho("starpat=".starpat.": build **//pattern list")
3305 try
3306 exe "silent vimgrep /".pattern."/gj "."**/*"
3307 catch /^Vim\%((\a\+)\)\=:E480/
3308 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003309 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003310 silent! let @* = keepregstar
3311 silent! let @+ = keepregstar
3312 silent! let @/ = keepregslash
3313" call Dret("netrw#Explore : no files matched pattern")
3314 return
3315 endtry
3316 let s:netrw_curdir = b:netrw_curdir
3317 let w:netrw_explore_list = getqflist()
3318 let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
3319
3320 elseif starpat == 3
3321 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3322" call Decho("starpat=".starpat.": build */filepat list")
3323 let dirname = substitute(dirname,'^\*/','','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003324 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3325 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003326
3327 elseif starpat == 4
3328 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3329" call Decho("starpat=".starpat.": build **/filepat list")
3330 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3331 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3332 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003333
3334 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003335" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3336" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003337
3338 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3339 call netrw#ErrorMsg(s:WARNING,"no files matched",42)
3340 silent! let @* = keepregstar
3341 silent! let @+ = keepregstar
3342 silent! let @/ = keepregslash
3343" call Dret("netrw#Explore : no files matched")
3344 return
3345 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003346 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003347
3348 " NetrwStatusLine support - for exploring support
3349 let w:netrw_explore_indx= indx
3350" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
3351
3352 " wrap the indx around, but issue a note
3353 if indx >= w:netrw_explore_listlen || indx < 0
3354" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3355 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3356 let w:netrw_explore_indx= indx
3357 call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
3358 sleep 1
3359 endif
3360
3361 exe "let dirfile= w:netrw_explore_list[".indx."]"
3362" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3363 let newdir= substitute(dirfile,'/[^/]*$','','e')
3364" call Decho("newdir<".newdir.">")
3365
3366" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3367 call netrw#LocalBrowseCheck(newdir)
3368 if !exists("w:netrw_liststyle")
3369 let w:netrw_liststyle= g:netrw_liststyle
3370 endif
3371 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
3372 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3373 else
3374 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3375 endif
3376 let w:netrw_explore_mtchcnt = indx + 1
3377 let w:netrw_explore_bufnr = bufnr("%")
3378 let w:netrw_explore_line = line(".")
3379 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3380" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3381
3382 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003383" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003384 if !exists("g:netrw_quiet")
3385 call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3386 endif
3387 silent! let @* = keepregstar
3388 silent! let @+ = keepregstar
3389 silent! let @/ = keepregslash
3390" call Dret("netrw#Explore : missing +path_extra")
3391 return
3392 endif
3393
3394 else
3395" call Decho("case Explore newdir<".dirname.">")
3396 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
3397 silent! unlet w:netrw_treedict
3398 silent! unlet w:netrw_treetop
3399 endif
3400 let newdir= dirname
3401 if !exists("b:netrw_curdir")
3402 call netrw#LocalBrowseCheck(getcwd())
3403 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003404 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003405 endif
3406 endif
3407
Bram Moolenaar446cb832008-06-24 21:56:24 +00003408 " visual display of **/ **// */ Exploration files
3409 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
3410 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3411 " only update match list if current directory isn't the same as before
3412 let s:explore_prvdir = b:netrw_curdir
3413 let s:explore_match = ""
3414 let dirlen = strlen(b:netrw_curdir)
3415 if b:netrw_curdir !~ '/$'
3416 let dirlen= dirlen + 1
3417 endif
3418 let prvfname= ""
3419 for fname in w:netrw_explore_list
3420" call Decho("fname<".fname.">")
3421 if fname =~ '^'.b:netrw_curdir
3422 if s:explore_match == ""
3423 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3424 else
3425 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3426 endif
3427 elseif fname !~ '^/' && fname != prvfname
3428 if s:explore_match == ""
3429 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3430 else
3431 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3432 endif
3433 endif
3434 let prvfname= fname
3435 endfor
3436" call Decho("explore_match<".s:explore_match.">")
3437 exe "2match netrwMarkFile /".s:explore_match."/"
3438 endif
3439 echo "<s-up>==Pexplore <s-down>==Nexplore"
3440 else
3441 2match none
3442 if exists("s:explore_match") | unlet s:explore_match | endif
3443 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3444 echo " "
3445" call Decho("cleared explore match list")
3446 endif
3447
Bram Moolenaar9964e462007-05-05 17:54:07 +00003448 silent! let @* = keepregstar
3449 silent! let @+ = keepregstar
3450 silent! let @/ = keepregslash
3451" call Dret("netrw#Explore : @/<".@/.">")
3452endfun
3453
3454" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003455" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
3456" and switches the hiding mode. The actual hiding is done by
3457" s:NetrwListHide().
3458" g:netrw_hide= 0: show all
3459" 1: show not-hidden files
3460" 2: show hidden files only
3461fun! s:NetrwHide(islocal)
3462" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
3463 let svpos= netrw#NetrwSavePosn()
3464
3465 if exists("s:netrwmarkfilelist_{bufnr('%')}")
3466" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
3467" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
3468
3469 " hide the files in the markfile list
3470 for fname in s:netrwmarkfilelist_{bufnr("%")}
3471" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
3472 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
3473 " remove fname from hiding list
3474 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
3475 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
3476 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
3477" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
3478 else
3479 " append fname to hiding list
3480 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
3481 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
3482 else
3483 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
3484 endif
3485" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
3486 endif
3487 endfor
3488 unlet s:netrwmarkfilelist_{bufnr("%")}
3489 unlet s:netrwmarkfilemtch_{bufnr("%")}
3490 2match none
3491 let g:netrw_hide= 1
3492
3493 else
3494
3495 " switch between show-all/show-not-hidden/show-hidden
3496 let g:netrw_hide=(g:netrw_hide+1)%3
3497 exe "norm! 0"
3498 if g:netrw_hide && g:netrw_list_hide == ""
3499 call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
3500" call Dret("NetrwHide")
3501 return
3502 endif
3503 endif
3504
3505 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3506 call netrw#NetrwRestorePosn(svpos)
3507" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003508endfun
3509
3510" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003511" s:NetrwHidden: invoked by "gh" {{{2
3512fun! s:NetrwHidden(islocal)
3513" call Dfunc("s:NetrwHidden()")
3514 " save current position
3515 let svpos= netrw#NetrwSavePosn()
3516
3517 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
3518 " remove pattern from hiding list
3519 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
3520 elseif strlen(g:netrw_list_hide) >= 1
3521 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
3522 else
3523 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
3524 endif
3525
3526 " refresh screen and return to saved position
3527 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3528 call netrw#NetrwRestorePosn(svpos)
3529" call Dret("s:NetrwHidden")
3530endfun
3531
3532" ---------------------------------------------------------------------
3533" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
3534fun! s:NetrwLeftmouse(islocal)
3535" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
3536 if a:islocal
3537 if exists("b:netrw_curdir")
3538 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
3539 endif
3540 else
3541 if exists("b:netrw_curdir")
3542 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
3543 endif
3544 endif
3545" call Dret("s:NetrwLeftmouse")
3546endfun
3547
3548" ---------------------------------------------------------------------
3549" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
3550" separated patterns given in g:netrw_list_hide
3551fun! s:NetrwListHide()
3552" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
3553
3554 " find a character not in the "hide" string to use as a separator for :g and :v commands
3555 " How-it-works: take the hiding command, convert it into a range. Duplicate
3556 " characters don't matter. Remove all such characters from the '/~...90'
3557 " string. Use the first character left as a separator character.
3558 let listhide= g:netrw_list_hide
3559 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
3560" call Decho("sep=".sep)
3561
3562 while listhide != ""
3563 if listhide =~ ','
3564 let hide = substitute(listhide,',.*$','','e')
3565 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
3566 else
3567 let hide = listhide
3568 let listhide = ""
3569 endif
3570
3571 " Prune the list by hiding any files which match
3572 if g:netrw_hide == 1
3573" call Decho("hiding<".hide."> listhide<".listhide.">")
3574 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
3575 elseif g:netrw_hide == 2
3576" call Decho("showing<".hide."> listhide<".listhide.">")
3577 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
3578 endif
3579 endwhile
3580 if g:netrw_hide == 2
3581 exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
3582 exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
3583 endif
3584
3585" call Dret("NetrwListHide")
3586endfun
3587
3588" ---------------------------------------------------------------------
3589" NetrwHideEdit: allows user to edit the file/directory hiding list
3590fun! s:NetrwHideEdit(islocal)
3591" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
3592
3593 " save current cursor position
3594 let svpos= netrw#NetrwSavePosn()
3595
3596 " get new hiding list from user
3597 call inputsave()
3598 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
3599 call inputrestore()
3600 let g:netrw_list_hide= newhide
3601" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
3602
3603 " refresh the listing
3604 silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
3605
3606 " restore cursor position
3607 call netrw#NetrwRestorePosn(svpos)
3608
3609" call Dret("NetrwHideEdit")
3610endfun
3611
3612" ---------------------------------------------------------------------
3613" NetSortSequence: allows user to edit the sorting sequence
3614fun! s:NetSortSequence(islocal)
3615" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
3616
3617 let svpos= netrw#NetrwSavePosn()
3618 call inputsave()
3619 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
3620 call inputrestore()
3621
3622 " refresh the listing
3623 let g:netrw_sort_sequence= newsortseq
3624 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3625 call netrw#NetrwRestorePosn(svpos)
3626
3627" call Dret("NetSortSequence")
3628endfun
3629
3630" ---------------------------------------------------------------------
3631" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
3632fun! s:NetrwMakeDir(usrhost)
3633" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
3634
3635 " get name of new directory from user. A bare <CR> will skip.
3636 " if its currently a directory, also request will be skipped, but with
3637 " a message.
3638 call inputsave()
3639 let newdirname= input("Please give directory name: ")
3640 call inputrestore()
3641" call Decho("newdirname<".newdirname.">")
3642
3643 if newdirname == ""
3644" call Dret("NetrwMakeDir : user aborted with bare <cr>")
3645 return
3646 endif
3647
3648 if a:usrhost == ""
3649" call Decho("local mkdir")
3650
3651 " Local mkdir:
3652 " sanity checks
3653 let fullnewdir= b:netrw_curdir.'/'.newdirname
3654" call Decho("fullnewdir<".fullnewdir.">")
3655 if isdirectory(fullnewdir)
3656 if !exists("g:netrw_quiet")
3657 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
3658 endif
3659" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
3660 return
3661 endif
3662 if s:FileReadable(fullnewdir)
3663 if !exists("g:netrw_quiet")
3664 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
3665 endif
3666" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
3667 return
3668 endif
3669
3670 " requested new local directory is neither a pre-existing file or
3671 " directory, so make it!
3672 if exists("*mkdir")
3673 call mkdir(fullnewdir,"p")
3674 else
3675 let netrw_origdir= s:NetrwGetcwd(1)
3676 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
3677" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003678" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
3679 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003680 if !g:netrw_keepdir
3681 exe 'keepjumps lcd '.fnameescape(netrw_origdir)
3682" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
3683 endif
3684 endif
3685
3686 if v:shell_error == 0
3687 " refresh listing
3688" call Decho("refresh listing")
3689 let svpos= netrw#NetrwSavePosn()
3690 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
3691 call netrw#NetrwRestorePosn(svpos)
3692 elseif !exists("g:netrw_quiet")
3693 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
3694 endif
3695" redraw!
3696
3697 elseif !exists("b:netrw_method") || b:netrw_method == 4
3698 " Remote mkdir:
3699" call Decho("remote mkdir")
3700 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
3701 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00003702" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1))
3703 exe "silent! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003704 if v:shell_error == 0
3705 " refresh listing
3706 let svpos= netrw#NetrwSavePosn()
3707 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
3708 call netrw#NetrwRestorePosn(svpos)
3709 elseif !exists("g:netrw_quiet")
3710 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
3711 endif
3712" redraw!
3713
3714 elseif b:netrw_method == 2
3715 " COMBAK -- future work
3716 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3717 elseif b:netrw_method == 3
3718 " COMBAK -- future work
3719 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3720 endif
3721
3722" call Dret("NetrwMakeDir")
3723endfun
3724
3725" ---------------------------------------------------------------------
3726" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
3727" mark and unmark files. If a markfile list exists,
3728" then the rename and delete functions will use it instead
3729" of whatever may happen to be under the cursor at that
3730" moment. When the mouse and gui are available,
3731" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003732"
3733" Creates two lists
3734" s:netrwmarkfilelist -- holds complete paths to all marked files
3735" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
3736"
3737" Creates a marked file match string
3738" s:netrwmarfilemtch_# -- used with 2match to display marked files
3739"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003740fun! s:NetrwMarkFile(islocal,fname)
3741" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
3742 let curbufnr= bufnr("%")
3743 let curdir = b:netrw_curdir
3744 if exists("s:netrwmarkfilelist_{curbufnr}")
3745 " markfile list exists
3746" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3747" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
3748
3749 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
3750 " append filename to local-directory markfilelist
3751" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3752 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3753 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3754
3755 else
3756 " remove filename from local markfilelist
3757" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3758 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
3759 if s:netrwmarkfilelist_{curbufnr} == []
3760 " local markfilelist is empty; remove it entirely
3761" call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
3762 call s:NetrwUnmarkList(curbufnr,curdir)
3763 else
3764 " rebuild match list to display markings correctly
3765" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
3766 let s:netrwmarkfilemtch_{curbufnr}= ""
3767 let first = 1
3768 for fname in s:netrwmarkfilelist_{curbufnr}
3769 if first
3770 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3771 else
3772 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3773 endif
3774 let first= 0
3775 endfor
3776" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3777" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3778 endif
3779 endif
3780
3781 else
3782 " initialize new markfilelist
3783
3784" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
3785 let s:netrwmarkfilelist_{curbufnr}= []
3786 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3787" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3788
3789 " build initial markfile matching pattern
3790 if a:fname =~ '/$'
3791 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
3792 else
3793 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
3794 endif
3795" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3796 endif
3797
3798 " handle global markfilelist
3799 if exists("s:netrwmarkfilelist")
3800 let dname= s:ComposePath(b:netrw_curdir,a:fname)
3801 if index(s:netrwmarkfilelist,dname) == -1
3802 " append new filename to global markfilelist
3803 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3804" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
3805 else
3806 " remove new filename from global markfilelist
3807" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
3808 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
3809" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
3810 if s:netrwmarkfilelist == []
3811 unlet s:netrwmarkfilelist
3812 endif
3813 endif
3814 else
3815 " initialize new global-directory markfilelist
3816 let s:netrwmarkfilelist= []
3817 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3818" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
3819 endif
3820
3821 " set up 2match'ing to netrwmarkfilemtch list
3822 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
3823" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
3824 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
3825 else
3826" call Decho("2match none")
3827 2match none
3828 endif
3829" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
3830endfun
3831
3832" ---------------------------------------------------------------------
3833" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
3834" compress/decompress files using the programs
3835" in g:netrw_compress and g:netrw_uncompress,
3836" using g:netrw_compress_suffix to know which to
3837" do. By default:
3838" g:netrw_compress = "gzip"
3839" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
3840fun! s:NetrwMarkFileCompress(islocal)
3841" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
3842 let svpos = netrw#NetrwSavePosn()
3843 let curdir = b:netrw_curdir
3844 let curbufnr = bufnr("%")
3845
3846 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
3847 for fname in s:netrwmarkfilelist_{curbufnr}
3848 " for every filename in the marked list
3849 for sfx in sort(keys(g:netrw_decompress))
3850 if fname =~ '\'.sfx.'$'
3851 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaarc236c162008-07-13 17:41:49 +00003852 let exe= s:WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00003853" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
3854 if a:islocal
3855 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00003856 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003857 endif
3858 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003859 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003860 endif
3861 if executable(exe)
3862 if a:islocal
3863 call system(exe." ".fname)
3864 else
3865 call s:RemoteSystem(exe." ".fname)
3866 endif
3867 else
3868 call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
3869 endif
3870 break
3871 endif
3872 endfor
3873 if exists("exe")
3874 unlet exe
3875 elseif a:islocal
3876 " fname not a compressed file, so compress it
Bram Moolenaarc236c162008-07-13 17:41:49 +00003877 call system(s:WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003878 else
3879 " fname not a compressed file, so compress it
Bram Moolenaarc236c162008-07-13 17:41:49 +00003880 call s:RemoteSystem(s:WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003881 endif
3882 endfor
3883 call s:NetrwUnmarkList(curbufnr,curdir)
3884 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3885 call netrw#NetrwRestorePosn(svpos)
3886 endif
3887" call Dret("s:NetrwMarkFileCompress")
3888endfun
3889
3890" ---------------------------------------------------------------------
3891" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
3892" If no marked files, then set up directory as the
3893" target. Currently does not support copying entire
3894" directories. Uses the local-buffer marked file list.
3895" Returns 1=success (used by NetrwMarkFileMove())
3896" 0=failure
3897fun! s:NetrwMarkFileCopy(islocal)
3898" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
3899
3900 " sanity checks
3901 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
3902 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
3903" call Dret("s:NetrwMarkFileCopy 0")
3904 return 0
3905 endif
3906" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
3907 if !exists("s:netrwmftgt")
3908 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
3909" call Dret("s:NetrwMarkFileCopy 0")
3910 return 0
3911 endif
3912" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
3913 let curdir = b:netrw_curdir
3914 let curbufnr = bufnr("%")
3915
3916 if a:islocal && s:netrwmftgt_islocal
3917 " Copy marked files, local directory to local directory
3918" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003919 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003920" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003921 call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003922
3923 elseif a:islocal && !s:netrwmftgt_islocal
3924 " Copy marked files, local directory to remote directory
3925" call Decho("copy from local to remote")
3926 call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3927
3928 elseif !a:islocal && s:netrwmftgt_islocal
3929" call Decho("copy from remote to local")
3930 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3931
3932 elseif !a:islocal && !s:netrwmftgt_islocal
3933" call Decho("copy from remote to remote")
3934 let curdir = getcwd()
3935 let tmpdir = s:GetTempfile("")
3936 if tmpdir !~ '/'
3937 let tmpdir= curdir."/".tmpdir
3938 endif
3939 if exists("*mkdir")
3940 call mkdir(tmpdir)
3941 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00003942 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003943 endif
3944 if isdirectory(tmpdir)
3945 exe "keepjumps lcd ".fnameescape(tmpdir)
3946 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003947 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003948 call s:NetrwUpload(localfiles,s:netrwmftgt)
3949 if getcwd() == tmpdir
3950 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaarc236c162008-07-13 17:41:49 +00003951 call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003952 endfor
3953 exe "keepjumps lcd ".fnameescape(curdir)
Bram Moolenaarc236c162008-07-13 17:41:49 +00003954 exe "silent !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003955 else
3956 exe "keepjumps lcd ".fnameescape(curdir)
3957 endif
3958 endif
3959 endif
3960
3961 " -------
3962 " cleanup
3963 " -------
3964" call Decho("cleanup")
3965
3966 " remove markings from local buffer
3967 call s:NetrwUnmarkList(curbufnr,curdir)
3968
3969 " refresh buffers
3970 if !s:netrwmftgt_islocal
3971 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
3972 endif
3973 if a:islocal
3974 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
3975 endif
3976 call s:LocalBrowseShellCmdRefresh()
3977
3978" call Dret("s:NetrwMarkFileCopy 1")
3979 return 1
3980endfun
3981
3982" ---------------------------------------------------------------------
3983" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
3984" invoke vim's diff mode on the marked files.
3985" Either two or three files can be so handled.
3986" Uses the global marked file list.
3987fun! s:NetrwMarkFileDiff(islocal)
3988" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
3989 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003990
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003991 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003992 let cnt = 0
3993 let curdir = b:netrw_curdir
3994 for fname in s:netrwmarkfilelist
3995 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003996 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003997" call Decho("diffthis: fname<".fname.">")
3998 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003999 diffthis
4000 elseif cnt == 2 || cnt == 3
4001 vsplit
4002 wincmd l
4003" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004004 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004005 diffthis
4006 else
4007 break
4008 endif
4009 endfor
4010 call s:NetrwUnmarkList(curbufnr,curdir)
4011 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004012
Bram Moolenaar446cb832008-06-24 21:56:24 +00004013" call Dret("s:NetrwMarkFileDiff")
4014endfun
4015
4016" ---------------------------------------------------------------------
4017" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
4018" Uses global markfilelist
4019fun! s:NetrwMarkFileEdit(islocal)
4020" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
4021
4022 let curdir = b:netrw_curdir
4023 let curbufnr = bufnr("%")
4024 if exists("s:netrwmarkfilelist_{curbufnr}")
4025 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004026 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004027 " unmark markedfile list
4028" call s:NetrwUnmarkList(curbufnr,curdir)
4029 call s:NetrwUnmarkAll()
4030" call Decho("exe silent args ".flist)
4031 exe "silent args ".flist
4032 endif
4033
4034" call Dret("s:NetrwMarkFileEdit")
4035endfun
4036
4037" ---------------------------------------------------------------------
4038" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4039" Uses the local marked-file list.
4040fun! s:NetrwMarkFileExe(islocal)
4041" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4042 let svpos = netrw#NetrwSavePosn()
4043 let curdir = b:netrw_curdir
4044 let curbufnr = bufnr("%")
4045
4046 if exists("s:netrwmarkfilelist_{curbufnr}")
4047 " get the command
4048 call inputsave()
4049 let cmd= input("Enter command: ","","file")
4050 call inputrestore()
4051" call Decho("cmd<".cmd.">")
4052
4053 " apply command to marked files. Substitute: filename -> %
4054 " If no %, then append a space and the filename to the command
4055 for fname in s:netrwmarkfilelist_{curbufnr}
4056 if a:islocal
4057 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004058 let fname= shellescape(s:WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004059 endif
4060 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004061 let fname= shellescape(s:WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004062 endif
4063 if cmd =~ '%'
4064 let xcmd= substitute(cmd,'%',fname,'g')
4065 else
4066 let xcmd= cmd.' '.fname
4067 endif
4068 if a:islocal
4069" call Decho("local: xcmd<".xcmd.">")
4070 let ret= system(xcmd)
4071 else
4072" call Decho("remote: xcmd<".xcmd.">")
4073 let ret= s:RemoteSystem(xcmd)
4074 endif
4075 if v:shell_error < 0
4076 call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
4077 break
4078 else
4079 echo ret
4080 endif
4081 endfor
4082
4083 " unmark marked file list
4084 call s:NetrwUnmarkList(curbufnr,curdir)
4085
4086 " refresh the listing
4087 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4088 call netrw#NetrwRestorePosn(svpos)
4089 else
4090 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4091 endif
4092
4093" call Dret("s:NetrwMarkFileExe")
4094endfun
4095
4096" ---------------------------------------------------------------------
4097" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4098" as the marked file(s) (toggles suffix presence)
4099" Uses the local marked file list.
4100fun! s:NetrwMarkHideSfx(islocal)
4101" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4102 let svpos = netrw#NetrwSavePosn()
4103 let curbufnr = bufnr("%")
4104
4105 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4106 if exists("s:netrwmarkfilelist_{curbufnr}")
4107
4108 for fname in s:netrwmarkfilelist_{curbufnr}
4109" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4110 " construct suffix pattern
4111 if fname =~ '\.'
4112 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4113 else
4114 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4115 endif
4116 " determine if its in the hiding list or not
4117 let inhidelist= 0
4118 if g:netrw_list_hide != ""
4119 let itemnum = 0
4120 let hidelist= split(g:netrw_list_hide,',')
4121 for hidepat in hidelist
4122 if sfxpat == hidepat
4123 let inhidelist= 1
4124 break
4125 endif
4126 let itemnum= itemnum + 1
4127 endfor
4128 endif
4129" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4130 if inhidelist
4131 " remove sfxpat from list
4132 call remove(hidelist,itemnum)
4133 let g:netrw_list_hide= join(hidelist,",")
4134 elseif g:netrw_list_hide != ""
4135 " append sfxpat to non-empty list
4136 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4137 else
4138 " set hiding list to sfxpat
4139 let g:netrw_list_hide= sfxpat
4140 endif
4141 endfor
4142
4143 " refresh the listing
4144 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4145 call netrw#NetrwRestorePosn(svpos)
4146 else
4147 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4148 endif
4149
4150" call Dret("s:NetrwMarkHideSfx")
4151endfun
4152
4153" ---------------------------------------------------------------------
4154" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4155" Uses the global markfilelist
4156fun! s:NetrwMarkFileGrep(islocal)
4157" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4158 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004159 let curbufnr = bufnr("%")
4160
4161 if exists("s:netrwmarkfilelist")
4162" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004163 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004164 call s:NetrwUnmarkAll()
4165
4166 " ask user for pattern
4167 call inputsave()
4168 let pat= input("Enter pattern: ","")
4169 call inputrestore()
4170 if pat !~ '^\s'
4171 if pat !~ '^/'
4172 let pat= '/'.pat.'/'
4173 endif
4174 let pat= " ".pat
4175 endif
4176
4177 " use vimgrep for both local and remote
4178" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
4179 exe "vimgrep".pat." ".netrwmarkfilelist
4180
4181 2match none
4182 call netrw#NetrwRestorePosn(svpos)
4183 endif
4184
4185" call Dret("s:NetrwMarkFileGrep")
4186endfun
4187
4188" ---------------------------------------------------------------------
4189" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4190" uses the global marked file list
4191" s:netrwmfloc= 0: target directory is remote
4192" = 1: target directory is local
4193fun! s:NetrwMarkFileMove(islocal)
4194" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4195 let curdir = b:netrw_curdir
4196 let curbufnr = bufnr("%")
4197
4198 " sanity check
4199 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4200 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4201" call Dret("s:NetrwMarkFileMove")
4202 return
4203 endif
4204" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4205 if !exists("s:netrwmftgt")
4206 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4207" call Dret("s:NetrwMarkFileCopy 0")
4208 return 0
4209 endif
4210" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4211
4212 if a:islocal && s:netrwmftgt_islocal
4213 " move: local -> local
4214" call Decho("move from local to local")
4215" call Decho("(s:NetrwMarkFileMove) local to local move")
4216 if executable(g:netrw_localmovecmd)
4217 for fname in s:netrwmarkfilelist_{bufnr("%")}
4218" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4219 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4220 if v:shell_error < 0
4221 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4222 break
4223 endif
4224 endfor
4225 else
4226 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4227 endif
4228
4229 elseif a:islocal && !s:netrwmftgt_islocal
4230 " move: local -> remote
4231" call Decho("move from local to remote")
4232" call Decho("copy")
4233 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4234 call s:NetrwMarkFileCopy(a:islocal)
4235" call Decho("remove")
4236 for fname in mflist
4237 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4238 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4239 endfor
4240 unlet mflist
4241
4242 elseif !a:islocal && s:netrwmftgt_islocal
4243 " move: remote -> local
4244" call Decho("move from remote to local")
4245" call Decho("copy")
4246 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4247 call s:NetrwMarkFileCopy(a:islocal)
4248" call Decho("remove")
4249 for fname in mflist
4250 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4251 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4252 endfor
4253 unlet mflist
4254
4255 elseif !a:islocal && !s:netrwmftgt_islocal
4256 " move: remote -> remote
4257" call Decho("move from remote to remote")
4258" call Decho("copy")
4259 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4260 call s:NetrwMarkFileCopy(a:islocal)
4261" call Decho("remove")
4262 for fname in mflist
4263 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4264 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4265 endfor
4266 unlet mflist
4267 endif
4268
4269 " -------
4270 " cleanup
4271 " -------
4272" call Decho("cleanup")
4273
4274 " remove markings from local buffer
4275 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
4276
4277 " refresh buffers
4278 if !s:netrwmftgt_islocal
4279 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4280 endif
4281 if a:islocal
4282 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4283 endif
4284 call s:LocalBrowseShellCmdRefresh()
4285
4286" call Dret("s:NetrwMarkFileMove")
4287endfun
4288
4289" ---------------------------------------------------------------------
4290" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
4291" using the hardcopy command. Local marked-file list only.
4292fun! s:NetrwMarkFilePrint(islocal)
4293" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
4294 let curbufnr= bufnr("%")
4295 if exists("s:netrwmarkfilelist_{curbufnr}")
4296 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4297 let curdir = b:netrw_curdir
4298 call s:NetrwUnmarkList(curbufnr,curdir)
4299 for fname in netrwmarkfilelist
4300 if a:islocal
4301 if g:netrw_keepdir
4302 let fname= s:ComposePath(curdir,fname)
4303 endif
4304 else
4305 let fname= curdir.fname
4306 endif
4307 1split
4308 " the autocmds will handle both local and remote files
4309" call Decho("exe silent e ".escape(fname,' '))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004310 exe "silent e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004311" call Decho("hardcopy")
4312 hardcopy
4313 q
4314 endfor
4315 2match none
4316 endif
4317" call Dret("s:NetrwMarkFilePrint")
4318endfun
4319
4320" ---------------------------------------------------------------------
4321" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
4322" files when given a regexp (for which a prompt is
4323" issued).
4324fun! s:NetrwMarkFileRegexp(islocal)
4325" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
4326
4327 " get the regular expression
4328 call inputsave()
4329 let regexp= input("Enter regexp: ","","file")
4330 call inputrestore()
4331
4332 if a:islocal
4333 " get the matching list of files using local glob()
4334" call Decho("handle local regexp")
4335 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
4336 let filelist = glob(s:ComposePath(dirname,regexp))
4337 if filelist != ""
4338 let filelist= filelist."\n"
4339 endif
4340
4341 " mark the list of files
4342 while filelist != ""
4343 if filelist =~ '\n'
4344 let filename = substitute(filelist,'\n.*$','','e')
4345 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
4346 else
4347 let filename = filelist
4348 let filelist = ""
4349 endif
4350" call Decho("filelist<".filelist.">")
4351" call Decho("filename<".filename.">")
4352 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4353 endwhile
4354
4355 else
4356" call Decho("handle remote regexp")
4357
4358 " convert displayed listing into a filelist
4359 let eikeep = &ei
4360 let areg = @a
4361 silent %y a
4362 set ei=all ma
4363" call Decho("set ei=all ma")
4364 1split
4365 enew
4366 silent norm! "ap
4367 2
4368 let bannercnt= search('^" =====','W')
4369 exe "silent 1,".bannercnt."d"
4370 set bt=nofile
4371 if g:netrw_liststyle == s:LONGLIST
4372 silent %s/\s\{2,}\S.*$//e
4373 elseif g:netrw_liststyle == s:WIDELIST
4374 silent %s/\s\{2,}/\r/ge
4375 elseif g:netrw_liststyle == s:TREELIST
4376 silent %s/^| //e
4377 silent! g/^ .*$/d
4378 endif
4379 " convert regexp into the more usual glob-style format
4380 let regexp= substitute(regexp,'\*','.*','g')
4381" call Decho("regexp<".regexp.">")
4382 exe "silent! v/".escape(regexp,'/')."/d"
4383 let filelist= getline(1,line("$"))
4384 q!
4385 for filename in filelist
4386 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4387 endfor
4388 unlet filelist
4389 let @a = areg
4390 let &ei = eikeep
4391 endif
4392
4393" call Dret("s:NetrwMarkFileRegexp")
4394endfun
4395
4396" ---------------------------------------------------------------------
4397" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
4398" Uses the local marked file list.
4399fun! s:NetrwMarkFileSource(islocal)
4400" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
4401 let curbufnr= bufnr("%")
4402 if exists("s:netrwmarkfilelist_{curbufnr}")
4403 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
4404 let curdir = b:netrw_curdir
4405 call s:NetrwUnmarkList(curbufnr,curdir)
4406 for fname in netrwmarkfilelist
4407 if a:islocal
4408 if g:netrw_keepdir
4409 let fname= s:ComposePath(curdir,fname)
4410 endif
4411 else
4412 let fname= curdir.fname
4413 endif
4414 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00004415" call Decho("exe so ".fnameescape(fname))
4416 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004417 endfor
4418 2match none
4419 endif
4420" call Dret("s:NetrwMarkFileSource")
4421endfun
4422
4423" ---------------------------------------------------------------------
4424" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
4425" Uses the global markfilelist
4426fun! s:NetrwMarkFileTag(islocal)
4427" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
4428 let svpos = netrw#NetrwSavePosn()
4429 let curdir = b:netrw_curdir
4430 let curbufnr = bufnr("%")
4431
4432 if exists("s:netrwmarkfilelist")
4433" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004434 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004435 call s:NetrwUnmarkAll()
4436
4437 if a:islocal
4438 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004439" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
4440 call system(g:netrw_ctags." ".netrwmarkfilelist)
4441 else
4442 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
4443 endif
4444 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004445 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004446 call netrw#NetrwObtain(a:islocal,"tags")
4447 let curdir= b:netrw_curdir
4448 1split
4449 e tags
4450 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
4451" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004452 exe '%s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004453 wq!
4454 endif
4455 2match none
4456 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4457 call netrw#NetrwRestorePosn(svpos)
4458 endif
4459
4460" call Dret("s:NetrwMarkFileTag")
4461endfun
4462
4463" ---------------------------------------------------------------------
4464" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
4465" Sets up two variables,
4466" s:netrwmftgt : holds the target directory
4467" s:netrwmftgt_islocal : 0=target directory is remote
4468" 1=target directory is local
4469fun! s:NetrwMarkFileTgt(islocal)
4470" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
4471 let svpos = netrw#NetrwSavePosn()
4472 let curdir = b:netrw_curdir
4473 let hadtgt = exists("s:netrwmftgt")
4474 if !exists("w:netrw_bannercnt")
4475 let w:netrw_bannercnt= b:netrw_bannercnt
4476 endif
4477
4478 " set up target
4479 if line(".") < w:netrw_bannercnt
4480 " if cursor in banner region, use b:netrw_curdir for the target
4481 let s:netrwmftgt= b:netrw_curdir
4482" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
4483
4484 else
4485 " get word under cursor.
4486 " * If directory, use it for the target.
4487 " * If file, use b:netrw_curdir for the target
4488 let curword= s:NetrwGetWord()
4489 let tgtdir = s:ComposePath(curdir,curword)
4490 if a:islocal && isdirectory(tgtdir)
4491 let s:netrwmftgt = tgtdir
4492" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
4493 elseif !a:islocal && tgtdir =~ '/$'
4494 let s:netrwmftgt = tgtdir
4495" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
4496 else
4497 let s:netrwmftgt = curdir
4498" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
4499 endif
4500 endif
4501 if a:islocal
4502 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
4503 let s:netrwmftgt= simplify(s:netrwmftgt)
4504" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
4505 endif
4506 if g:netrw_cygwin
4507 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
4508 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
4509 endif
4510 let s:netrwmftgt_islocal= a:islocal
4511
4512 if g:netrw_fastbrowse > 0
4513 call s:LocalBrowseShellCmdRefresh()
4514 endif
4515 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4516 call netrw#NetrwRestorePosn(svpos)
4517 if !hadtgt
4518 norm! j
4519 endif
4520
4521" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
4522endfun
4523
4524" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00004525" s:NetrwOpenFile: query user for a filename and open it {{{2
4526fun! s:NetrwOpenFile(islocal)
4527" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
4528 call inputsave()
4529 let fname= input("Enter filename: ")
4530 call inputrestore()
4531 if fname !~ '[/\\]'
4532 if exists("b:netrw_curdir")
4533 if exists("g:netrw_quiet")
4534 let netrw_quiet_keep = g:netrw_quiet
4535 endif
4536 let g:netrw_quiet = 1
4537 if b:netrw_curdir =~ '/$'
4538 exe "e ".fnameescape(b:netrw_curdir.fname)
4539 else
4540 exe "e ".fnameescape(b:netrw_curdir."/".fname)
4541 endif
4542 if exists("netrw_quiet_keep")
4543 let g:netrw_quiet= netrw_quiet_keep
4544 else
4545 unlet g:netrw_quiet
4546 endif
4547 endif
4548 else
4549 exe "e ".fnameescape(fname)
4550 endif
4551" call Dret("s:NetrwOpenFile")
4552endfun
4553
4554" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004555" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
4556fun! s:NetrwUnmarkList(curbufnr,curdir)
4557" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
4558
4559 " remove all files in local marked-file list from global list
4560 if exists("s:netrwmarkfilelist_{a:curbufnr}")
4561 for mfile in s:netrwmarkfilelist_{a:curbufnr}
4562 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
4563 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
4564 call remove(s:netrwmarkfilelist,idx) " remove from global list
4565 endfor
4566 if s:netrwmarkfilelist == []
4567 unlet s:netrwmarkfilelist
4568 endif
4569
4570 " getting rid of the local marked-file lists is easy
4571 unlet s:netrwmarkfilelist_{a:curbufnr}
4572 endif
4573 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
4574 unlet s:netrwmarkfilemtch_{a:curbufnr}
4575 endif
4576 2match none
4577" call Dret("s:NetrwUnmarkList")
4578endfun
4579
4580" ---------------------------------------------------------------------
4581" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
4582fun! s:NetrwUnmarkAll()
4583" call Dfunc("s:NetrwUnmarkAll()")
4584 if exists("s:netrwmarkfilelist")
4585 unlet s:netrwmarkfilelist
4586 endif
4587 silent call s:NetrwUnmarkAll2()
4588 2match none
4589" call Dret("s:NetrwUnmarkAll")
4590endfun
4591
4592" ---------------------------------------------------------------------
4593" s:NetrwUnmarkAll2: {{{2
4594fun! s:NetrwUnmarkAll2()
4595" call Dfunc("s:NetrwUnmarkAll2()")
4596 redir => netrwmarkfilelist_let
4597 let
4598 redir END
4599 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
4600 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
4601 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
4602 for flist in netrwmarkfilelist_list
4603 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
4604 unlet s:netrwmarkfilelist_{curbufnr}
4605 unlet s:netrwmarkfilemtch_{curbufnr}
4606 endfor
4607" call Dret("s:NetrwUnmarkAll2")
4608endfun
4609
4610" ---------------------------------------------------------------------
4611" s:NetrwUnMarkFile: {{{2
4612fun! s:NetrwUnMarkFile(islocal)
4613" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
4614 let svpos = netrw#NetrwSavePosn()
4615 let curbufnr = bufnr("%")
4616
4617 " unmark marked file list (although I expect s:NetrwUpload()
4618 " to do it, I'm just making sure)
4619 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4620" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
4621 unlet s:netrwmarkfilelist
4622 unlet s:netrwmarkfilelist_{curbufnr}
4623 unlet s:netrwmarkfilemtch_{curbufnr}
4624 2match none
4625 endif
4626
4627" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4628 call netrw#NetrwRestorePosn(svpos)
4629" call Dret("s:NetrwUnMarkFile")
4630endfun
4631
4632" ---------------------------------------------------------------------
4633" s:NetrwMenu: generates the menu for gvim and netrw {{{2
4634fun! s:NetrwMenu(domenu)
4635
4636 if !exists("g:NetrwMenuPriority")
4637 let g:NetrwMenuPriority= 80
4638 endif
4639
4640 if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
4641" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
4642
4643 if !exists("s:netrw_menu_enabled") && a:domenu
4644" call Decho("initialize menu")
4645 let s:netrw_menu_enabled= 1
4646 exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
4647 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4
4648 exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
4649 exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
4650 exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
4651 exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
4652 exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB mB'
4653 exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb'
4654 exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
4655 exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
4656 exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
4657 exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit"
4658 exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
4659 exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
4660 exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh"
4661 exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
4662 exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
4663 exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
4664 exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
4665 exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
4666 exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
4667 exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
4668 exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
4669 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
4670 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
4671 exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
4672 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
4673 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
4674 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
4675 exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
4676 exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
4677 exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
4678 exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
4679 exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
4680 exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
4681 exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
4682 exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
4683 exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
4684 exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
4685 exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
4686 exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
4687 exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
4688 exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
4689 exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
4690 exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
4691 exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
4692 exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
4693 exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
4694 exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
4695 exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
4696 exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
4697 exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
4698 let s:netrw_menucnt= 28
4699
4700 elseif !a:domenu
4701 let s:netrwcnt = 0
4702 let curwin = winnr()
4703 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
4704 exe curwin."wincmd w"
4705
4706 if s:netrwcnt <= 1
4707" call Decho("clear menus")
4708 exe 'silent! unmenu '.g:NetrwTopLvlMenu
4709" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
4710 silent! unlet s:netrw_menu_enabled
4711 endif
4712 endif
4713" call Dret("NetrwMenu")
4714 endif
4715
4716endfun
4717
4718" ---------------------------------------------------------------------
4719" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
4720" Used by the O maps (as <SID>NetrwObtain())
4721fun! s:NetrwObtain(islocal)
4722" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
4723
4724 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4725 let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
4726 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
4727 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
4728 else
4729 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
4730 endif
4731
4732" call Dret("NetrwObtain")
4733endfun
4734
4735" ---------------------------------------------------------------------
4736" netrw#NetrwObtain: {{{2
4737" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
4738" islocal=0 obtain from remote source
4739" =1 obtain from local source
4740" fname : a filename or a list of filenames
4741" tgtdir : optional place where files are to go (not present, uses getcwd())
4742fun! netrw#NetrwObtain(islocal,fname,...)
4743" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
4744 " NetrwStatusLine support - for obtaining support
4745
4746 if type(a:fname) == 1
4747 let fnamelist= [ a:fname ]
4748 elseif type(a:fname) == 3
4749 let fnamelist= a:fname
4750 else
4751 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
4752" call Dret("netrw#NetrwObtain")
4753 return
4754 endif
4755" call Decho("fnamelist<".string(fnamelist).">")
4756 if a:0 > 0
4757 let tgtdir= a:1
4758 else
4759 let tgtdir= getcwd()
4760 endif
4761" call Decho("tgtdir<".tgtdir.">")
4762
4763 if a:islocal
4764 " obtain a file from b:netrw_curdir to getcwd()
4765" call Decho("obtain a local file from ".b:netrw_curdir." to ".tgtdir
4766 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
4767 let topath= s:ComposePath(tgtdir,"")
4768 if (has("win32") || has("win95") || has("win64") || has("win16"))
4769 " transfer files one at time
4770 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00004771" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
4772 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004773 endfor
4774 else
4775 " transfer files with one command
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004776 let filelist= join(map(deepcopy(fname),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004777" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
4778 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
4779 endif
4780 elseif !exists("b:netrw_curdir")
4781 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
4782 else
4783 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
4784 endif
4785
4786 else
4787" call Decho("obtain a remote file from ".b:netrw_curdir." to ".tgtdir)
4788 if type(a:fname) == 1
4789 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
4790 endif
4791 call s:NetrwMethod(b:netrw_curdir)
4792
4793 if b:netrw_method == 4
4794 " obtain file using scp
4795" call Decho("obtain via scp (method#4)")
4796 if exists("g:netrw_port") && g:netrw_port != ""
4797 let useport= " ".g:netrw_scpport." ".g:netrw_port
4798 else
4799 let useport= ""
4800 endif
4801 if b:netrw_fname =~ '/'
4802 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
4803 else
4804 let path= ""
4805 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004806 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00004807" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
4808 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004809
4810 elseif b:netrw_method == 2
4811 " obtain file using ftp + .netrc
4812" call Decho("obtain via ftp+.netrc (method #2)")
4813 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4814 let tmpbufnr= bufnr("%")
4815 setlocal ff=unix
4816 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004817 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00004818" call Decho("filter input: ".getline('$'))
4819 endif
4820
4821 if exists("b:netrw_fname") && b:netrw_fname != ""
4822 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4823" call Decho("filter input: ".getline('$'))
4824 endif
4825
4826 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004827 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00004828" call Decho("filter input: ".getline('$'))
4829 endif
4830 for fname in fnamelist
4831 call setline(line("$")+1,'get "'.fname.'"')
4832" call Decho("filter input: ".getline('$'))
4833 endfor
4834 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00004835" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
4836 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 +00004837 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004838" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
4839 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004840 endif
4841 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4842 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
4843 let debugkeep= &debug
4844 setlocal debug=msg
4845 call netrw#ErrorMsg(s:ERROR,getline(1),4)
4846 let &debug= debugkeep
4847 endif
4848
4849 elseif b:netrw_method == 3
4850 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
4851" call Decho("obtain via ftp+mipf (method #3)")
4852 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4853 let tmpbufnr= bufnr("%")
4854 setlocal ff=unix
4855
4856 if exists("g:netrw_port") && g:netrw_port != ""
4857 put ='open '.g:netrw_machine.' '.g:netrw_port
4858" call Decho("filter input: ".getline('$'))
4859 else
4860 put ='open '.g:netrw_machine
4861" call Decho("filter input: ".getline('$'))
4862 endif
4863
4864 if exists("g:netrw_ftp") && g:netrw_ftp == 1
4865 put =g:netrw_uid
4866" call Decho("filter input: ".getline('$'))
4867 put ='\"'.s:netrw_passwd.'\"'
4868" call Decho("filter input: ".getline('$'))
4869 else
4870 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
4871" call Decho("filter input: ".getline('$'))
4872 endif
4873
4874 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4875 put =g:netrw_ftpmode
4876" call Decho("filter input: ".getline('$'))
4877 endif
4878
4879 if exists("b:netrw_fname") && b:netrw_fname != ""
4880 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4881" call Decho("filter input: ".getline('$'))
4882 endif
4883
4884 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004885 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00004886" call Decho("filter input: ".getline('$'))
4887 endif
4888
4889 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004890 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00004891" call Decho("filter input: ".getline('$'))
4892 endif
4893 for fname in fnamelist
4894 call setline(line("$")+1,'get "'.fname.'"')
4895 endfor
4896" call Decho("filter input: ".getline('$'))
4897
4898 " perform ftp:
4899 " -i : turns off interactive prompting from ftp
4900 " -n unix : DON'T use <.netrc>, even though it exists
4901 " -n win32: quit being obnoxious about password
4902 norm! 1Gdd
4903" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
4904 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
4905 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4906 if getline(1) !~ "^$"
4907" call Decho("error<".getline(1).">")
4908 if !exists("g:netrw_quiet")
4909 call netrw#ErrorMsg(s:ERROR,getline(1),5)
4910 endif
4911 endif
4912 endif
4913
4914 endif
4915
4916 " cleanup
4917 if exists("tmpbufnr")
4918 if bufnr("%") != tmpbufnr
4919 exe tmpbufnr."bw!"
4920 else
4921 q!
4922 endif
4923 endif
4924
4925" call Dret("netrw#NetrwObtain")
4926endfun
4927
4928" ---------------------------------------------------------------------
4929" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
4930" If there's only one window, then the window will first be split.
4931" Returns:
4932" choice = 0 : didn't have to choose
4933" choice = 1 : saved modified file in window first
4934" choice = 2 : didn't save modified file, opened window
4935" choice = 3 : cancel open
4936fun! s:NetrwPrevWinOpen(islocal)
4937" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4938
4939 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
4940 let curdir = b:netrw_curdir
4941
4942 " get last window number and the word currently under the cursor
4943 let lastwinnr = winnr("$")
4944 let curword = s:NetrwGetWord()
4945 let choice = 0
4946" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4947
4948 let didsplit = 0
4949 if lastwinnr == 1
4950 " if only one window, open a new one first
4951" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4952 if g:netrw_preview
4953" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4954 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4955 else
4956" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4957 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4958 endif
4959 let didsplit = 1
4960
4961 else
4962 call s:SaveBufVars()
4963" call Decho("wincmd p")
4964 wincmd p
4965 call s:RestoreBufVars()
4966 " if the previous window's buffer has been changed (is modified),
4967 " and it doesn't appear in any other extant window, then ask the
4968 " user if s/he wants to abandon modifications therein.
4969 let bnr = winbufnr(0)
4970 let bnrcnt = 0
4971 if &mod
4972" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4973 let eikeep= &ei
4974 set ei=all
4975 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4976 exe bnr."wincmd p"
4977 let &ei= eikeep
4978" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4979 if bnrcnt == 1
4980 let bufname= bufname(winbufnr(winnr()))
4981 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4982" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4983
4984 if choice == 1
4985 " Yes -- write file & then browse
4986 let v:errmsg= ""
4987 silent w
4988 if v:errmsg != ""
4989 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4990 if didsplit
4991 q
4992 else
4993 wincmd p
4994 endif
4995" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4996 return choice
4997 endif
4998
4999 elseif choice == 2
5000 " No -- don't worry about changed file, just browse anyway
5001 setlocal nomod
5002 call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
5003 wincmd p
5004
5005 else
5006 " Cancel -- don't do this
5007 if didsplit
5008 q
5009 else
5010 wincmd p
5011 endif
5012" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5013 return choice
5014 endif
5015 endif
5016 endif
5017 endif
5018
5019 " restore b:netrw_curdir (window split/enew may have lost it)
5020 let b:netrw_curdir= curdir
5021 if a:islocal < 2
5022 if a:islocal
5023 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5024 else
5025 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5026 endif
5027 endif
5028" call Dret("NetrwPrevWinOpen ".choice)
5029 return choice
5030endfun
5031
5032" ---------------------------------------------------------------------
5033" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5034" Always assumed to be local -> remote
5035" call s:NetrwUpload(filename, target)
5036" call s:NetrwUpload(filename, target, fromdirectory)
5037fun! s:NetrwUpload(fname,tgt,...)
5038" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5039
5040 if a:tgt =~ '^\a\+://'
5041 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5042 else
5043 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5044 endif
5045" call Decho("tgtdir<".tgtdir.">")
5046
5047 if a:0 > 0
5048 let fromdir= a:1
5049 else
5050 let fromdir= getcwd()
5051 endif
5052" call Decho("fromdir<".fromdir.">")
5053
5054 if type(a:fname) == 1
5055 " handle uploading a single file using NetWrite
5056" call Decho("handle uploading a single file via NetWrite")
5057 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005058" call Decho("exe e ".fnameescape(a:fname))
5059 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005060" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5061 if a:tgt =~ '/$'
5062 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005063" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005064 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005065 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005066" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
5067 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005068" call Decho("done writing local->remote")
5069 endif
5070 q!
5071
5072 elseif type(a:fname) == 3
5073 " handle uploading a list of files via scp
5074" call Decho("handle uploading a list of files via scp")
5075 let curdir= getcwd()
5076 if a:tgt =~ '^scp:'
5077 exe "keepjumps silent lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005078 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
5079 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005080 if exists("g:netrw_port") && g:netrw_port != ""
5081 let useport= " ".g:netrw_scpport." ".g:netrw_port
5082 else
5083 let useport= ""
5084 endif
5085 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5086 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005087" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
5088 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005089 exe "keepjumps silent lcd ".fnameescape(curdir)
5090
5091 elseif a:tgt =~ '^ftp:'
5092 call s:NetrwMethod(a:tgt)
5093
5094 if b:netrw_method == 2
5095 " handle uploading a list of files via ftp+.netrc
5096 let netrw_fname = b:netrw_fname
5097 silent keepjumps new
5098" call Decho("filter input window#".winnr())
5099
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005100 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005101" call Decho("filter input: ".getline('$'))
5102
5103 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005104 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005105" call Decho("filter input: ".getline('$'))
5106 endif
5107
5108 call setline(line("$")+1,'lcd "'.fromdir.'"')
5109" call Decho("filter input: ".getline('$'))
5110
5111 call setline(line("$")+1,'cd "'.tgtdir.'"')
5112" call Decho("filter input: ".getline('$'))
5113
5114 for fname in a:fname
5115 call setline(line("$")+1,'put "'.fname.'"')
5116" call Decho("filter input: ".getline('$'))
5117 endfor
5118
5119 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00005120" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5121 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 +00005122 else
5123" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00005124" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5125 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005126 endif
5127 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5128 silent g/Local directory now/d
5129 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5130 call netrw#ErrorMsg(s:ERROR,getline(1),14)
5131 else
5132 bw!|q
5133 endif
5134
5135 elseif b:netrw_method == 3
5136 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5137 let netrw_fname= b:netrw_fname
5138 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5139 let tmpbufnr= bufnr("%")
5140 setlocal ff=unix
5141
5142 if exists("g:netrw_port") && g:netrw_port != ""
5143 put ='open '.g:netrw_machine.' '.g:netrw_port
5144" call Decho("filter input: ".getline('$'))
5145 else
5146 put ='open '.g:netrw_machine
5147" call Decho("filter input: ".getline('$'))
5148 endif
5149
5150 if exists("g:netrw_ftp") && g:netrw_ftp == 1
5151 put =g:netrw_uid
5152" call Decho("filter input: ".getline('$'))
5153 call setline(line("$")+1,'"'.s:netrw_passwd.'"')
5154" call Decho("filter input: ".getline('$'))
5155 else
5156 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
5157" call Decho("filter input: ".getline('$'))
5158 endif
5159
5160 call setline(line("$")+1,'lcd "'.fromdir.'"')
5161" call Decho("filter input: ".getline('$'))
5162
5163 if exists("b:netrw_fname") && b:netrw_fname != ""
5164 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5165" call Decho("filter input: ".getline('$'))
5166 endif
5167
5168 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005169 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005170" call Decho("filter input: ".getline('$'))
5171 endif
5172
5173 for fname in a:fname
5174 call setline(line("$")+1,'put "'.fname.'"')
5175" call Decho("filter input: ".getline('$'))
5176 endfor
5177
5178 " perform ftp:
5179 " -i : turns off interactive prompting from ftp
5180 " -n unix : DON'T use <.netrc>, even though it exists
5181 " -n win32: quit being obnoxious about password
5182 norm! 1Gdd
5183" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n")
5184 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5185 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5186 silent g/Local directory now/d
5187 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5188 let debugkeep= &debug
5189 setlocal debug=msg
5190 call netrw#ErrorMsg(s:ERROR,getline(1),15)
5191 let &debug = debugkeep
5192 let mod = 1
5193 else
5194 bw!|q
5195 endif
5196 endif
5197 else
5198 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5199 endif
5200 endif
5201
5202" call Dret("s:NetrwUpload")
5203endfun
5204
5205" ---------------------------------------------------------------------
5206" s:NetrwPreview: {{{2
5207fun! s:NetrwPreview(path) range
5208" call Dfunc("NetrwPreview(path<".a:path.">)")
5209 call s:NetrwOptionSave("s:")
5210 call s:NetrwSafeOptions()
5211 if has("quickfix")
5212 if !isdirectory(a:path)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005213 exe (g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005214 elseif !exists("g:netrw_quiet")
5215 call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
5216 endif
5217 elseif !exists("g:netrw_quiet")
5218 call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
5219 endif
5220 call s:NetrwOptionRestore("s:")
5221" call Dret("NetrwPreview")
5222endfun
5223
5224" ---------------------------------------------------------------------
5225" s:NetrwRefresh: {{{2
5226fun! s:NetrwRefresh(islocal,dirname)
5227" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
5228 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
5229 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
5230 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
5231 setlocal ma noro
5232" call Decho("setlocal ma noro")
5233" call Decho("clear buffer<".expand("%")."> with :%d")
5234 %d
5235 if a:islocal
5236 call netrw#LocalBrowseCheck(a:dirname)
5237 else
5238 call s:NetrwBrowse(a:islocal,a:dirname)
5239 endif
5240 call netrw#NetrwRestorePosn()
5241
5242 " restore file marks
5243 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
5244" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
5245 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
5246 else
5247" call Decho("2match none")
5248 2match none
5249 endif
5250
5251" redraw!
5252" call Dret("NetrwRefresh")
5253endfun
5254
5255" ---------------------------------------------------------------------
5256" s:NetrwRefreshDir: refreshes a directory by name {{{2
5257" Called by NetrwMarkFileCopy()
5258" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
5259fun! s:NetrwRefreshDir(islocal,dirname)
5260" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
5261 if g:netrw_fastbrowse == 0
5262 " slowest mode (keep buffers refreshed, local or remote)
5263" call Decho("slowest mode: keep buffers refreshed, local or remote")
5264 let tgtwin= bufwinnr(a:dirname)
5265" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
5266
5267 if tgtwin > 0
5268 " tgtwin is being displayed, so refresh it
5269 let curwin= winnr()
5270" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
5271 exe tgtwin."wincmd w"
5272 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5273 exe curwin."wincmd w"
5274
5275 elseif bufnr(a:dirname) > 0
5276 let bn= bufnr(a:dirname)
5277" call Decho("bd bufnr(".a:dirname.")=".bn)
5278 exe "silent bd ".bn
5279 endif
5280
5281 elseif g:netrw_fastbrowse <= 1
5282" call Decho("medium-speed mode: refresh local buffers only")
5283 call s:LocalBrowseShellCmdRefresh()
5284 endif
5285" call Dret("s:NetrwRefreshDir")
5286endfun
5287
5288" ---------------------------------------------------------------------
5289" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
5290" What this function does is to compute a priority for the patterns
5291" in the g:netrw_sort_sequence. It applies a substitute to any
5292" "files" that satisfy each pattern, putting the priority / in
5293" front. An "*" pattern handles the default priority.
5294fun! s:NetrwSetSort()
5295" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
5296 if w:netrw_liststyle == s:LONGLIST
5297 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
5298 else
5299 let seqlist = g:netrw_sort_sequence
5300 endif
5301 " sanity check -- insure that * appears somewhere
5302 if seqlist == ""
5303 let seqlist= '*'
5304 elseif seqlist !~ '\*'
5305 let seqlist= seqlist.',*'
5306 endif
5307 let priority = 1
5308 while seqlist != ""
5309 if seqlist =~ ','
5310 let seq = substitute(seqlist,',.*$','','e')
5311 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5312 else
5313 let seq = seqlist
5314 let seqlist = ""
5315 endif
5316 let sepchr= "\<Char-0xff>"
5317 if priority < 10
5318 let spriority= "00".priority.sepchr
5319 elseif priority < 100
5320 let spriority= "0".priority.sepchr
5321 else
5322 let spriority= priority.sepchr
5323 endif
5324" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
5325
5326 " sanity check
5327 if w:netrw_bannercnt > line("$")
5328 " apparently no files were left after a Hiding pattern was used
5329" call Dret("SetSort : no files left after hiding")
5330 return
5331 endif
5332 if seq == '*'
5333 let starpriority= spriority
5334 else
5335 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
5336 " sometimes multiple sorting patterns will match the same file or directory.
5337 " The following substitute is intended to remove the excess matches.
5338 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e'
5339 endif
5340 let priority = priority + 1
5341 endwhile
5342 if exists("starpriority")
5343 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/'
5344 endif
5345
5346 " Following line associated with priority -- items that satisfy a priority
5347 " pattern get prefixed by ###/ which permits easy sorting by priority.
5348 " Sometimes files can satisfy multiple priority patterns -- only the latest
5349 " priority pattern needs to be retained. So, at this point, these excess
5350 " priority prefixes need to be removed, but not directories that happen to
5351 " be just digits themselves.
5352 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e'
5353
5354" call Dret("SetSort")
5355endfun
5356
5357" =====================================================================
5358" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
5359fun! s:NetrwSortStyle(islocal)
5360" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
5361 call s:NetrwSaveWordPosn()
5362 let svpos= netrw#NetrwSavePosn()
5363
5364 let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
5365 norm! 0
5366 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5367 call netrw#NetrwRestorePosn(svpos)
5368
5369" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
5370endfun
5371
5372" ---------------------------------------------------------------------
5373" s:NetrwSplit: mode {{{2
5374" =0 : net and o
5375" =1 : net and t
5376" =2 : net and v
5377" =3 : local and o
5378" =4 : local and t
5379" =5 : local and v
5380fun! s:NetrwSplit(mode)
5381" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
5382
5383 call s:SaveWinVars()
5384
5385 if a:mode == 0
5386 " remote and o
5387" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5388 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5389 let s:didsplit= 1
5390 call s:RestoreWinVars()
5391 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5392 unlet s:didsplit
5393
5394 elseif a:mode == 1
5395 " remote and t
5396 let cursorword = s:NetrwGetWord()
5397" call Decho("tabnew")
5398 tabnew
5399 let s:didsplit= 1
5400 call s:RestoreWinVars()
5401 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword))
5402 unlet s:didsplit
5403
5404 elseif a:mode == 2
5405 " remote and v
5406" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5407 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5408 let s:didsplit= 1
5409 call s:RestoreWinVars()
5410 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5411 unlet s:didsplit
5412
5413 elseif a:mode == 3
5414 " local and o
5415" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5416 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5417 let s:didsplit= 1
5418 call s:RestoreWinVars()
5419 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5420 unlet s:didsplit
5421
5422 elseif a:mode == 4
5423 " local and t
5424 let netrw_curdir= b:netrw_curdir
5425 let cursorword = s:NetrwGetWord()
5426" call Decho("tabnew")
5427 tabnew
5428 let b:netrw_curdir= netrw_curdir
5429 let s:didsplit= 1
5430 call s:RestoreWinVars()
5431 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
5432 unlet s:didsplit
5433
5434 elseif a:mode == 5
5435 " local and v
5436" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5437 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5438 let s:didsplit= 1
5439 call s:RestoreWinVars()
5440 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5441 unlet s:didsplit
5442
5443 else
5444 call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
5445 endif
5446
5447" call Dret("s:NetrwSplit")
5448endfun
5449
5450" ---------------------------------------------------------------------
5451" NetrwStatusLine: {{{2
5452fun! NetrwStatusLine()
5453
5454" vvv NetrwStatusLine() debugging vvv
5455" let g:stlmsg=""
5456" if !exists("w:netrw_explore_bufnr")
5457" let g:stlmsg="!X<explore_bufnr>"
5458" elseif w:netrw_explore_bufnr != bufnr("%")
5459" let g:stlmsg="explore_bufnr!=".bufnr("%")
5460" endif
5461" if !exists("w:netrw_explore_line")
5462" let g:stlmsg=" !X<explore_line>"
5463" elseif w:netrw_explore_line != line(".")
5464" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
5465" endif
5466" if !exists("w:netrw_explore_list")
5467" let g:stlmsg=" !X<explore_list>"
5468" endif
5469" ^^^ NetrwStatusLine() debugging ^^^
5470
5471 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")
5472 " restore user's status line
5473 let &stl = s:netrw_users_stl
5474 let &laststatus = s:netrw_users_ls
5475 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
5476 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
5477 return ""
5478 else
5479 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5480 endif
5481endfun
5482
5483" ---------------------------------------------------------------------
5484" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
5485" (full path directory with trailing slash returned)
5486fun! s:NetrwTreeDir()
5487" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
5488
5489 let treedir= b:netrw_curdir
5490" call Decho("set initial treedir<".treedir.">")
5491 let s:treecurpos= netrw#NetrwSavePosn()
5492
5493 if w:netrw_liststyle == s:TREELIST
5494" call Decho("w:netrrw_liststyle is TREELIST:")
5495" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
5496 if getline('.') =~ '/$'
5497 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
5498 else
5499 let treedir= ""
5500 endif
5501
5502" call Decho("treedir<".treedir.">")
5503
5504 " detect user attempting to close treeroot
5505 if getline('.') !~ '|' && getline('.') != '..'
5506" call Decho("user attempted to close treeroot")
5507 " now force a refresh
5508" call Decho("clear buffer<".expand("%")."> with :%d")
5509 keepjumps %d
5510" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5511 return b:netrw_curdir
5512 endif
5513
5514 " elide all non-depth information
5515 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
5516" call Decho("depth<".depth."> 1st subst")
5517
5518 " elide first depth
5519 let depth = substitute(depth,'^| ','','')
5520" call Decho("depth<".depth."> 2nd subst")
5521
5522 " construct treedir by searching backwards at correct depth
5523" call Decho("constructing treedir<".treedir."> depth<".depth.">")
5524 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
5525 let dirname= substitute(getline('.'),'^\(| \)*','','e')
5526 let treedir= dirname.treedir
5527 let depth = substitute(depth,'^| ','','')
5528" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
5529 endwhile
5530 if w:netrw_treetop =~ '/$'
5531 let treedir= w:netrw_treetop.treedir
5532 else
5533 let treedir= w:netrw_treetop.'/'.treedir
5534 endif
5535" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
5536 endif
5537 let treedir= substitute(treedir,'//$','/','')
5538
5539" " now force a refresh
5540"" call DECHO("clear buffer<".expand("%")."> with :%d")
5541" setlocal ma noro
5542" keepjumps %d
5543
5544" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5545 return treedir
5546endfun
5547
5548" ---------------------------------------------------------------------
5549" s:NetrwTreeDisplay: recursive tree display {{{2
5550fun! s:NetrwTreeDisplay(dir,depth)
5551" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
5552
5553 " insure that there are no folds
5554 setlocal nofen
5555
5556 " install ../ and shortdir
5557 if a:depth == ""
5558 call setline(line("$")+1,'../')
5559" call Decho("setline#".line("$")." ../ (depth is zero)")
5560 endif
5561 if a:dir =~ '^\a\+://'
5562 if a:dir == w:netrw_treetop
5563 let shortdir= a:dir
5564 else
5565 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
5566 endif
5567 call setline(line("$")+1,a:depth.shortdir)
5568 else
5569 let shortdir= substitute(a:dir,'^.*/','','e')
5570 call setline(line("$")+1,a:depth.shortdir.'/')
5571 endif
5572" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
5573
5574 " append a / to dir if its missing one
5575 let dir= a:dir
5576 if dir !~ '/$'
5577 let dir= dir.'/'
5578 endif
5579
5580 " display subtrees (if any)
5581 let depth= "| ".a:depth
5582
5583" call Decho("display subtrees with depth<".depth."> and current leaves")
5584 for entry in w:netrw_treedict[a:dir]
5585 let direntry= substitute(dir.entry,'/$','','e')
5586" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
5587 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
5588" call Decho("<".direntry."> is a key in treedict - display subtree for it")
5589 call s:NetrwTreeDisplay(direntry,depth)
5590 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
5591" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
5592 call s:NetrwTreeDisplay(direntry.'/',depth)
5593 else
5594" call Decho("<".entry."> is not a key in treedict (no subtree)")
5595 call setline(line("$")+1,depth.entry)
5596 endif
5597 endfor
5598" call Dret("NetrwTreeDisplay")
5599endfun
5600
5601" ---------------------------------------------------------------------
5602" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
5603fun! s:NetrwTreeListing(dirname)
5604 if w:netrw_liststyle == s:TREELIST
5605" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
5606" call Decho("curdir<".a:dirname.">")
5607" 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"))
5608
5609 " update the treetop
5610" call Decho("update the treetop")
5611 if !exists("w:netrw_treetop")
5612 let w:netrw_treetop= a:dirname
5613" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
5614 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
5615 let w:netrw_treetop= a:dirname
5616" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
5617 endif
5618
5619 " insure that we have at least an empty treedict
5620 if !exists("w:netrw_treedict")
5621 let w:netrw_treedict= {}
5622 endif
5623
5624 " update the directory listing for the current directory
5625" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
5626" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
5627 exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
5628 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
5629" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname])
5630 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
5631
5632 " if past banner, record word
5633 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
5634 let fname= expand("<cword>")
5635 else
5636 let fname= ""
5637 endif
5638" call Decho("fname<".fname.">")
5639
5640 " display from treetop on down
5641 call s:NetrwTreeDisplay(w:netrw_treetop,"")
5642
5643" call Dret("NetrwTreeListing : bufname<".expand("%").">")
5644 endif
5645endfun
5646
5647" ---------------------------------------------------------------------
5648" s:NetrwWideListing: {{{2
5649fun! s:NetrwWideListing()
5650
5651 if w:netrw_liststyle == s:WIDELIST
5652" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
5653 " look for longest filename (cpf=characters per filename)
5654 " cpf: characters per file
5655 " fpl: files per line
5656 " fpc: files per column
5657 setlocal ma noro
5658" call Decho("setlocal ma noro")
5659 let b:netrw_cpf= 0
5660 if line("$") >= w:netrw_bannercnt
5661 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
5662 else
5663" call Dret("NetrwWideListing")
5664 return
5665 endif
5666" call Decho("max file strlen+1=".b:netrw_cpf)
5667 let b:netrw_cpf= b:netrw_cpf + 1
5668
5669 " determine qty files per line (fpl)
5670 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
5671 if w:netrw_fpl <= 0
5672 let w:netrw_fpl= 1
5673 endif
5674" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
5675
5676 " make wide display
5677 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
5678 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
5679 let newcolstart = w:netrw_bannercnt + fpc
5680 let newcolend = newcolstart + fpc - 1
5681" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
5682 silent! let keepregstar = @*
5683 while line("$") >= newcolstart
5684 if newcolend > line("$") | let newcolend= line("$") | endif
5685 let newcolqty= newcolend - newcolstart
5686 exe newcolstart
5687 if newcolqty == 0
5688 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
5689 else
5690 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
5691 endif
5692 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
5693 exe 'silent keepjumps '.w:netrw_bannercnt
5694 endwhile
5695 silent! let @*= keepregstar
5696 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
5697 setlocal noma nomod ro
5698" call Dret("NetrwWideListing")
5699 endif
5700
5701endfun
5702
5703" ---------------------------------------------------------------------
5704" s:PerformListing: {{{2
5705fun! s:PerformListing(islocal)
5706" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
5707
5708 call s:NetrwSafeOptions()
5709 setlocal noro ma
5710" call Decho("setlocal noro ma")
5711
5712" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
5713" call Decho("(netrw) Processing your browsing request...")
5714" endif " Decho
5715
5716" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
5717 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5718 " force a refresh for tree listings
5719" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
5720 keepjumps %d
5721 endif
5722
5723 " save current directory on directory history list
5724 call s:NetrwBookmarkDir(3,b:netrw_curdir)
5725
5726 " Set up the banner {{{3
5727" call Decho("set up banner")
5728 keepjumps put ='\" ============================================================================'
5729 keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
5730 keepjumps put ='\" '.b:netrw_curdir
5731 keepjumps 1d
5732 let w:netrw_bannercnt= 3
5733 exe "keepjumps ".w:netrw_bannercnt
5734
5735 let sortby= g:netrw_sort_by
5736 if g:netrw_sort_direction =~ "^r"
5737 let sortby= sortby." reversed"
5738 endif
5739
5740 " Sorted by... {{{3
5741" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
5742 if g:netrw_sort_by =~ "^n"
5743" call Decho("directories will be sorted by name")
5744 " sorted by name
5745 keepjumps put ='\" Sorted by '.sortby
5746 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
5747 let w:netrw_bannercnt= w:netrw_bannercnt + 2
5748 else
5749" call Decho("directories will be sorted by size or time")
5750 " sorted by size or date
5751 keepjumps put ='\" Sorted by '.sortby
5752 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5753 endif
5754 exe "keepjumps ".w:netrw_bannercnt
5755
5756 " show copy/move target, if any
5757 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
5758" call Decho("show copy/move target<".s:netrwmftgt.">")
5759 keepjumps put =''
5760 if s:netrwmftgt_islocal
5761 call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
5762 else
5763 call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
5764 endif
5765 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5766 else
5767" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
5768 endif
5769 exe "keepjumps ".w:netrw_bannercnt
5770
5771 " Hiding... -or- Showing... {{{3
5772" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
5773 if g:netrw_list_hide != "" && g:netrw_hide
5774 if g:netrw_hide == 1
5775 keepjumps put ='\" Hiding: '.g:netrw_list_hide
5776 else
5777 keepjumps put ='\" Showing: '.g:netrw_list_hide
5778 endif
5779 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5780 endif
5781 exe "keepjumps ".w:netrw_bannercnt
5782 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
5783 keepjumps put ='\" ============================================================================'
5784 let w:netrw_bannercnt= w:netrw_bannercnt + 2
5785
5786 " bannercnt should index the line just after the banner
5787 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5788 exe "keepjumps ".w:netrw_bannercnt
5789" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
5790
5791 " set up syntax highlighting {{{3
5792" call Decho("set up syntax highlighting")
5793 if has("syntax")
5794 setlocal ft=netrw
5795 if !exists("g:syntax_on") || !g:syntax_on
5796 setlocal ft=
5797 endif
5798 endif
5799
5800 " get list of files
5801" call Decho("Get list of files - islocal=".a:islocal)
5802 if a:islocal
5803 call s:LocalListing()
5804 else " remote
5805 call s:NetrwRemoteListing()
5806 endif
5807" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
5808
5809 " manipulate the directory listing (hide, sort) {{{3
5810 if line("$") >= w:netrw_bannercnt
5811" call Decho("manipulate directory listing (hide)")
5812" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
5813 if g:netrw_hide && g:netrw_list_hide != ""
5814 call s:NetrwListHide()
5815 endif
5816 if line("$") >= w:netrw_bannercnt
5817" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
5818
5819 if g:netrw_sort_by =~ "^n"
5820 " sort by name
5821 call s:NetrwSetSort()
5822
5823 if w:netrw_bannercnt < line("$")
5824" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
5825 if g:netrw_sort_direction =~ 'n'
5826 " normal direction sorting
Bram Moolenaarc236c162008-07-13 17:41:49 +00005827 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005828 else
5829 " reverse direction sorting
Bram Moolenaarc236c162008-07-13 17:41:49 +00005830 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005831 endif
5832 endif
5833 " remove priority pattern prefix
5834" call Decho("remove priority pattern prefix")
5835 let sepchr= "\<Char-0xff>"
5836 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e'
5837
5838 elseif a:islocal
5839 if w:netrw_bannercnt < line("$")
5840" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
5841 if g:netrw_sort_direction =~ 'n'
5842" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005843 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005844 else
5845" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005846 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00005847 endif
5848 endif
5849 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
5850 endif
5851
5852 elseif g:netrw_sort_direction =~ 'r'
5853" call Decho('reverse the sorted listing')
5854 exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
5855 endif
5856 endif
5857
5858 " convert to wide/tree listing {{{3
5859" call Decho("modify display if wide/tree listing style")
5860 call s:NetrwWideListing()
5861 call s:NetrwTreeListing(b:netrw_curdir)
5862
5863 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
5864 " place cursor on the top-left corner of the file listing
5865" call Decho("place cursor on top-left corner of file listing")
5866 exe 'silent keepjumps '.w:netrw_bannercnt
5867 norm! 0
5868 endif
5869
5870 " record previous current directory
5871 let w:netrw_prvdir= b:netrw_curdir
5872" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
5873
5874 " save certain window-oriented variables into buffer-oriented variables {{{3
5875 call s:SetBufWinVars()
5876 call s:NetrwOptionRestore("w:")
5877
5878 " set display to netrw display settings
5879" call Decho("set display to netrw display settings (noma nomod etc)")
5880 setlocal noma nomod nonu nobl nowrap ro
5881 if exists("s:treecurpos")
5882
5883 call netrw#NetrwRestorePosn(s:treecurpos)
5884 unlet s:treecurpos
5885 endif
5886
5887" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
5888endfun
5889
5890" ---------------------------------------------------------------------
5891" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00005892fun! s:SetupNetrwStatusLine(statline)
5893" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5894
5895 if !exists("s:netrw_setup_statline")
5896 let s:netrw_setup_statline= 1
5897" call Decho("do first-time status line setup")
5898
5899 if !exists("s:netrw_users_stl")
5900 let s:netrw_users_stl= &stl
5901 endif
5902 if !exists("s:netrw_users_ls")
5903 let s:netrw_users_ls= &laststatus
5904 endif
5905
5906 " set up User9 highlighting as needed
5907 let keepa= @a
5908 redir @a
5909 try
5910 hi User9
5911 catch /^Vim\%((\a\+)\)\=:E411/
5912 if &bg == "dark"
5913 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5914 else
5915 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5916 endif
5917 endtry
5918 redir END
5919 let @a= keepa
5920 endif
5921
5922 " set up status line (may use User9 highlighting)
5923 " insure that windows have a statusline
5924 " make sure statusline is displayed
5925 let &stl=a:statline
5926 setlocal laststatus=2
5927" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005928 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00005929
5930" call Dret("SetupNetrwStatusLine : stl=".&stl)
5931endfun
5932
5933" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005934" Remote Directory Browsing Support: {{{1
5935" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00005936
5937" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005938" s:NetrwRemoteListing: {{{2
5939fun! s:NetrwRemoteListing()
5940" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00005941
Bram Moolenaar446cb832008-06-24 21:56:24 +00005942 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005943
Bram Moolenaar446cb832008-06-24 21:56:24 +00005944 " sanity check:
5945 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
5946" call Decho("b:netrw_method=".b:netrw_method)
5947 if !executable("ftp")
5948 if !exists("g:netrw_quiet")
5949 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
5950 endif
5951 call s:NetrwOptionRestore("w:")
5952" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005953 return
5954 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005955
5956 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
5957 if !exists("g:netrw_quiet")
5958 if g:netrw_list_cmd == ""
5959 call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
5960 else
5961 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
5962 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005963 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005964
Bram Moolenaar446cb832008-06-24 21:56:24 +00005965 call s:NetrwOptionRestore("w:")
5966" call Dret("s:NetrwRemoteListing")
5967 return
5968 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005969
Bram Moolenaar446cb832008-06-24 21:56:24 +00005970 if exists("b:netrw_method")
5971" call Decho("setting w:netrw_method<".b:netrw_method.">")
5972 let w:netrw_method= b:netrw_method
5973 endif
5974
5975 if s:method == "ftp"
5976 " use ftp to get remote file listing
5977" call Decho("use ftp to get remote file listing")
5978 let s:method = "ftp"
5979 let listcmd = g:netrw_ftp_list_cmd
5980 if g:netrw_sort_by =~ '^t'
5981 let listcmd= g:netrw_ftp_timelist_cmd
5982 elseif g:netrw_sort_by =~ '^s'
5983 let listcmd= g:netrw_ftp_sizelist_cmd
5984 endif
5985" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
5986 call s:NetrwRemoteFtpCmd(s:path,listcmd)
5987" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
5988
5989 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
5990 " shorten the listing
5991" call Decho("generate short listing")
5992 exe "keepjumps ".w:netrw_bannercnt
5993
5994 " cleanup
5995 if g:netrw_ftp_browse_reject != ""
5996 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
5997 endif
5998 silent! keepjumps %s/\r$//e
5999
6000 " if there's no ../ listed, then put ./ and ../ in
6001 let line1= line(".")
6002 exe "keepjumps ".w:netrw_bannercnt
6003 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
6004 if line2 == 0
6005" call Decho("netrw is putting ./ and ../ into listing")
6006 keepjumps put='../'
6007 keepjumps put='./'
6008 endif
6009 exe "keepjumps ".line1
6010 keepjumps norm! 0
6011
6012" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
6013 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6014" call Decho("M$ ftp cleanup")
6015 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
6016 else " normal ftp cleanup
6017" call Decho("normal ftp cleanup")
6018 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
6019 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
6020 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
6021 endif
6022 endif
6023
6024 else
6025 " use ssh to get remote file listing {{{3
6026" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
6027 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
6028" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
6029 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006030" call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1))
6031 exe "silent r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006032 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
6033 g/^Listing directory/d
6034 g/^d[-rwx][-rwx][-rwx]/s+$+/+e
6035 silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e
6036 if g:netrw_liststyle != s:LONGLIST
6037 g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e
6038 endif
6039 else
6040 if s:path == ""
6041" call Decho("2: exe silent r! ".listcmd)
6042 exe "silent r! ".listcmd
6043 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006044" call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1))
6045 exe "silent r! ".listcmd.' '.shellescape(s:path,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006046" call Decho("listcmd<".listcmd."> path<".s:path.">")
6047 endif
6048 endif
6049
6050 " cleanup
6051 if g:netrw_ftp_browse_reject != ""
6052" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
6053 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
6054 endif
6055 endif
6056
6057 if w:netrw_liststyle == s:LONGLIST
6058 " do a long listing; these substitutions need to be done prior to sorting {{{3
6059" call Decho("fix long listing:")
6060
6061 if s:method == "ftp"
6062 " cleanup
6063 exe "keepjumps ".w:netrw_bannercnt
6064 while getline('.') =~ g:netrw_ftp_browse_reject
6065 keepjumps d
6066 endwhile
6067 " if there's no ../ listed, then put ./ and ../ in
6068 let line1= line(".")
6069 keepjumps 1
6070 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
6071 let line2= line(".")
6072 if line2 == 0
6073 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
6074 if b:netrw_curdir != '/'
6075 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
6076 endif
6077 endif
6078 exe "keepjumps ".line1
6079 keepjumps norm! 0
6080 endif
6081
6082 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6083" call Decho("M$ ftp site listing cleanup")
6084 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/'
6085 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6086" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
6087 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
6088 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6089 exe 'silent keepjumps '.w:netrw_bannercnt
6090 endif
6091 endif
6092
6093" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
6094" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
6095" endif " Decho
6096" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006097endfun
6098
Bram Moolenaar446cb832008-06-24 21:56:24 +00006099" ---------------------------------------------------------------------
6100" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6101fun! s:NetrwRemoteRm(usrhost,path) range
6102" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6103" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6104 let svpos= netrw#NetrwSavePosn()
6105
6106 let all= 0
6107 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6108 " remove all marked files
6109 for fname in s:netrwmarkfilelist_{bufnr("%")}
6110 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6111 if ok =~ 'q\%[uit]'
6112 break
6113 elseif ok =~ 'a\%[ll]'
6114 let all= 1
6115 endif
6116 endfor
6117 unlet s:netrwmarkfilelist_{bufnr("%")}
6118 unlet s:netrwmarkfilemtch_{bufnr("%")}
6119 2match none
6120
6121 else
6122 " remove files specified by range
6123
6124 " preparation for removing multiple files/directories
6125 let ctr= a:firstline
6126
6127 " remove multiple files and directories
6128 while ctr <= a:lastline
6129 exe ctr
6130 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6131 if ok =~ 'q\%[uit]'
6132 break
6133 elseif ok =~ 'a\%[ll]'
6134 let all= 1
6135 endif
6136 let ctr= ctr + 1
6137 endwhile
6138 endif
6139
6140 " refresh the (remote) directory listing
6141" call Decho("refresh remote directory listing")
6142 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6143 call netrw#NetrwRestorePosn(svpos)
6144
6145" call Dret("s:NetrwRemoteRm")
6146endfun
6147
6148" ---------------------------------------------------------------------
6149" s:NetrwRemoteRmFile: {{{2
6150fun! s:NetrwRemoteRmFile(path,rmfile,all)
6151" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6152
6153 let all= a:all
6154 let ok = ""
6155
6156 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6157 " attempt to remove file
6158" call Decho("attempt to remove file (all=".all.")")
6159 if !all
6160 echohl Statement
6161" call Decho("case all=0:")
6162 call inputsave()
6163 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6164 call inputrestore()
6165 echohl NONE
6166 if ok == ""
6167 let ok="no"
6168 endif
6169 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6170 if ok =~ 'a\%[ll]'
6171 let all= 1
6172 endif
6173 endif
6174
6175 if all || ok =~ 'y\%[es]' || ok == ""
6176" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
6177 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6178" call Decho("case ftp:")
6179 let path= a:path
6180 if path =~ '^\a\+://'
6181 let path= substitute(path,'^\a\+://[^/]\+/','','')
6182 endif
6183 silent! keepjumps .,$d
6184 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
6185 else
6186" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
6187 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
6188" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6189 if !exists("b:netrw_curdir")
6190 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
6191 let ok="q"
6192 else
6193 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6194" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6195" call Decho("remotedir<".remotedir.">")
6196" call Decho("rmfile<".a:rmfile.">")
6197 if remotedir != ""
6198 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
6199 else
6200 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
6201 endif
6202" call Decho("call system(".netrw_rm_cmd.")")
6203 let ret= system(netrw_rm_cmd)
6204 if ret != 0
6205 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
6206 endif
6207" call Decho("returned=".ret." errcode=".v:shell_error)
6208 endif
6209 endif
6210 elseif ok =~ 'q\%[uit]'
6211" call Decho("ok==".ok)
6212 break
6213 endif
6214
6215 else
6216 " attempt to remove directory
6217" call Decho("attempt to remove directory")
6218 if !all
6219 call inputsave()
6220 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6221 call inputrestore()
6222 if ok == ""
6223 let ok="no"
6224 endif
6225 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6226 if ok =~ 'a\%[ll]'
6227 let all= 1
6228 endif
6229 endif
6230
6231 if all || ok =~ 'y\%[es]' || ok == ""
6232 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6233 call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
6234 else
6235 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006236 let netrw_rmdir_cmd = s:MakeSshCmd(s:WinPath(g:netrw_rmdir_cmd)).' '.shellescape(s:WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006237" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006238 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006239" call Decho("returned=".ret." errcode=".v:shell_error)
6240
6241 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00006242" call Decho("v:shell_error not 0")
6243 let netrw_rmf_cmd= s:MakeSshCmd(s:WinPath(g:netrw_rmf_cmd)).' '.shellescape(s:WinPath(substitute(rmfile,'[\/]$','','e')))
6244" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
6245 let ret= system(netrw_rmf_cmd)
6246" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006247
6248 if v:shell_error != 0 && !exists("g:netrw_quiet")
6249 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
6250 endif
6251 endif
6252 endif
6253
6254 elseif ok =~ 'q\%[uit]'
6255 break
6256 endif
6257 endif
6258
6259" call Dret("s:NetrwRemoteRmFile ".ok)
6260 return ok
6261endfun
6262
6263" ---------------------------------------------------------------------
6264" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
6265" This function assumes that a long listing will be received. Size, time,
6266" and reverse sorts will be requested of the server but not otherwise
6267" enforced here.
6268fun! s:NetrwRemoteFtpCmd(path,listcmd)
6269" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
6270" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
6271
6272 " because WinXX ftp uses unix style input
6273 let ffkeep= &ff
6274 setlocal ma ff=unix noro
6275" call Decho("setlocal ma ff=unix noro")
6276
6277 " clear off any older non-banner lines
6278 " note that w:netrw_bannercnt indexes the line after the banner
6279" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
6280 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
6281
6282 ".........................................
6283 if w:netrw_method == 2 || w:netrw_method == 5
6284 " ftp + <.netrc>: Method #2
6285 if a:path != ""
6286 put ='cd \"'.a:path.'\"'
6287 endif
6288 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006289 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006290" call Decho("filter input: ".getline('.'))
6291 endif
6292 call setline(line("$")+1,a:listcmd)
6293" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6294 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006295" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6296 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 +00006297 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006298" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6299 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 +00006300 endif
6301
6302 ".........................................
6303 elseif w:netrw_method == 3
6304 " ftp + machine,id,passwd,filename: Method #3
6305 setlocal ff=unix
6306 if exists("g:netrw_port") && g:netrw_port != ""
6307 put ='open '.g:netrw_machine.' '.g:netrw_port
6308 else
6309 put ='open '.g:netrw_machine
6310 endif
6311
6312 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6313 put =g:netrw_uid
6314 put ='\"'.s:netrw_passwd.'\"'
6315 else
6316 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6317 endif
6318
6319 if a:path != ""
6320 put ='cd \"'.a:path.'\"'
6321 endif
6322 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006323 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006324" call Decho("filter input: ".getline('.'))
6325 endif
6326 call setline(line("$")+1,a:listcmd)
6327
6328 " perform ftp:
6329 " -i : turns off interactive prompting from ftp
6330 " -n unix : DON'T use <.netrc>, even though it exists
6331 " -n win32: quit being obnoxious about password
6332" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6333" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
6334 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
6335
6336 ".........................................
6337 else
6338 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
6339 endif
6340
6341 " cleanup for Windows
6342 if has("win32") || has("win95") || has("win64") || has("win16")
6343 silent! keepjumps %s/\r$//e
6344 endif
6345 if a:listcmd == "dir"
6346 " infer directory/link based on the file permission string
6347 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
6348 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
6349 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6350 exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
6351 endif
6352 endif
6353
6354 " ftp's listing doesn't seem to include ./ or ../
6355 if !search('^\.\/$\|\s\.\/$','wn')
6356 exe 'keepjumps '.w:netrw_bannercnt
6357 put ='./'
6358 endif
6359 if !search('^\.\.\/$\|\s\.\.\/$','wn')
6360 exe 'keepjumps '.w:netrw_bannercnt
6361 put ='../'
6362 endif
6363
6364 " restore settings
6365 let &ff= ffkeep
6366" call Dret("NetrwRemoteFtpCmd")
6367endfun
6368
6369" ---------------------------------------------------------------------
6370" s:NetrwRemoteRename: rename a remote file or directory {{{2
6371fun! s:NetrwRemoteRename(usrhost,path) range
6372" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
6373
6374 " preparation for removing multiple files/directories
6375 let svpos = netrw#NetrwSavePosn()
6376 let ctr = a:firstline
6377 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
6378
6379 " rename files given by the markfilelist
6380 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6381 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6382" call Decho("oldname<".oldname.">")
6383 if exists("subfrom")
6384 let newname= substitute(oldname,subfrom,subto,'')
6385" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6386 else
6387 call inputsave()
6388 let newname= input("Moving ".oldname." to : ",oldname)
6389 call inputrestore()
6390 if newname =~ '^s/'
6391 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6392 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6393 let newname = substitute(oldname,subfrom,subto,'')
6394" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6395 endif
6396 endif
6397
6398 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6399 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6400 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006401 let oldname= shellescape(a:path.oldname)
6402 let newname= shellescape(a:path.newname)
6403" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")")
6404 let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006405 endif
6406
6407 endfor
6408 call s:NetrwUnMarkFile(1)
6409
6410 else
6411
6412 " attempt to rename files/directories
6413 while ctr <= a:lastline
6414 exe "keepjumps ".ctr
6415
6416 let oldname= s:NetrwGetWord()
6417" call Decho("oldname<".oldname.">")
6418
6419 call inputsave()
6420 let newname= input("Moving ".oldname." to : ",oldname)
6421 call inputrestore()
6422
6423 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6424 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6425 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006426 let oldname= shellescape(a:path.oldname)
6427 let newname= shellescape(a:path.newname)
6428" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")")
6429 let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006430 endif
6431
6432 let ctr= ctr + 1
6433 endwhile
6434 endif
6435
6436 " refresh the directory
6437 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6438 call netrw#NetrwRestorePosn(svpos)
6439
6440" call Dret("NetrwRemoteRename")
6441endfun
6442
6443" ---------------------------------------------------------------------
6444" Local Directory Browsing Support: {{{1
6445" ==========================================
6446
6447" ---------------------------------------------------------------------
6448" netrw#LocalBrowseCheck: {{{2
6449fun! netrw#LocalBrowseCheck(dirname)
6450 " unfortunate interaction -- split window debugging can't be
6451 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
6452 " event triggers another call to LocalBrowseCheck() when attempts
6453 " to write to the DBG buffer are made.
6454 " The &ft == "netrw" test was installed because the BufEnter event
6455 " would hit when re-entering netrw windows, creating unexpected
6456 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
6457" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname))
6458 if isdirectory(a:dirname)
6459" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
6460 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
6461 silent! call s:NetrwBrowse(1,a:dirname)
6462 elseif &ft == "netrw" && line("$") == 1
6463 silent! call s:NetrwBrowse(1,a:dirname)
6464 endif
6465 endif
6466 " not a directory, ignore it
6467endfun
6468
6469" ---------------------------------------------------------------------
6470" s:LocalListing: does the job of "ls" for local directories {{{2
6471fun! s:LocalListing()
6472" call Dfunc("s:LocalListing()")
6473" call Decho("&ma=".&ma)
6474" call Decho("&mod=".&mod)
6475" call Decho("&ro=".&ro)
6476" call Decho("bufname(%)<".bufname("%").">")
6477
6478" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
6479" 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
6480
6481 " get the list of files contained in the current directory
6482 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6483 let dirnamelen = strlen(b:netrw_curdir)
6484 let filelist = glob(s:ComposePath(dirname,"*"))
6485" call Decho("glob(dirname<".dirname."/*>)=".filelist)
6486 if filelist != ""
6487 let filelist= filelist."\n"
6488 endif
6489 let filelist= filelist.glob(s:ComposePath(dirname,".*"))
6490" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
6491
6492 " Coding choice: either elide ./ if present
6493 " or include ./ if not present
6494 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
6495 " elide /path/. from glob() entries if present
6496" call Decho("elide /path/. from glob entries if present")
6497 let filelist = substitute(filelist,'\n','\t','g')
6498 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
6499 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
6500 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
6501 let filelist = substitute(filelist,'\t','\n','g')
6502 endif
6503" call Decho("filelist<".filelist.">")
6504 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
6505 " include ../ in the glob() entry if its missing
6506" call Decho("forcibly tacking on ..")
6507 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
6508" call Decho("filelist<".filelist.">")
6509 endif
6510 if b:netrw_curdir == '/'
6511 " remove .. from filelist when current directory is root directory
6512" call Decho("remove .. from filelist")
6513 let filelist= substitute(filelist,'/\.\.\n','','')
6514 endif
6515 " remove multiple contiguous newlines
6516 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
6517 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6518 " change all \s to /s
6519" call Decho('change all \s to /s')
6520 let filelist= substitute(filelist,'\','/','g')
6521 else
6522 " escape all \s to \\
6523" call Decho('escape all \s to \\')
6524 let filelist= substitute(filelist,'\','\\','g')
6525 endif
6526
6527" call Decho("(before while) dirname<".dirname.">")
6528" call Decho("(before while) dirnamelen<".dirnamelen.">")
6529" call Decho("(before while) filelist<".filelist.">")
6530
6531 while filelist != ""
6532 if filelist =~ '\n'
6533 let filename = substitute(filelist,'\n.*$','','e')
6534 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
6535 else
6536 let filename = filelist
6537 let filelist = ""
6538 endif
6539" call Decho(" ")
6540" call Decho("(while) filelist<".filelist.">")
6541" call Decho("(while) filename<".filename.">")
6542
6543 if getftype(filename) == "link"
6544 " indicate a symbolic link
6545" call Decho("indicate <".filename."> is a symbolic link with trailing @")
6546 let pfile= filename."@"
6547
6548 elseif getftype(filename) == "socket"
6549 " indicate a socket
6550" call Decho("indicate <".filename."> is a socket with trailing =")
6551 let pfile= filename."="
6552
6553 elseif getftype(filename) == "fifo"
6554 " indicate a fifo
6555" call Decho("indicate <".filename."> is a fifo with trailing |")
6556 let pfile= filename."|"
6557
6558 elseif isdirectory(filename)
6559 " indicate a directory
6560" call Decho("indicate <".filename."> is a directory with trailing /")
6561 let pfile= filename."/"
6562
6563 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
6564 if (has("win32") || has("win95") || has("win64") || has("win16"))
6565 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
6566 " indicate an executable
6567" call Decho("indicate <".filename."> is executable with trailing *")
6568 let pfile= filename."*"
6569 else
6570 " normal file
6571 let pfile= filename
6572 endif
6573 elseif executable(filename)
6574 " indicate an executable
6575" call Decho("indicate <".filename."> is executable with trailing *")
6576 let pfile= filename."*"
6577 else
6578 " normal file
6579 let pfile= filename
6580 endif
6581
6582 else
6583 " normal file
6584 let pfile= filename
6585 endif
6586" call Decho("pfile<".pfile."> (after *@/ appending)")
6587
6588 if pfile =~ '//$'
6589 let pfile= substitute(pfile,'//$','/','e')
6590" call Decho("change // to /: pfile<".pfile.">")
6591 endif
6592 let pfile= strpart(pfile,dirnamelen)
6593 let pfile= substitute(pfile,'^[/\\]','','e')
6594" call Decho("filename<".filename.">")
6595" call Decho("pfile <".pfile.">")
6596
6597 if w:netrw_liststyle == s:LONGLIST
6598 let sz = getfsize(filename)
6599 let fsz = strpart(" ",1,15-s:Strlen(sz)).sz
6600 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
6601" call Decho("sz=".sz." fsz=".fsz)
6602 endif
6603
6604 if g:netrw_sort_by =~ "^t"
6605 " sort by time (handles time up to 1 quintillion seconds, US)
6606" call Decho("getftime(".filename.")=".getftime(filename))
6607 let t = getftime(filename)
6608 let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t
6609" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
6610 let ftpfile= ft.'/'.pfile
6611 keepjumps silent! put=ftpfile
6612
6613 elseif g:netrw_sort_by =~ "^s"
6614 " sort by size (handles file sizes up to 1 quintillion bytes, US)
6615" call Decho("getfsize(".filename.")=".getfsize(filename))
6616 let sz = getfsize(filename)
6617 let fsz = strpart("000000000000000000",1,18-s:Strlen(sz)).sz
6618" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
6619 let fszpfile= fsz.'/'.pfile
6620 keepjumps silent! put =fszpfile
6621
6622 else
6623 " sort by name
6624" call Decho("exe keepjumps put ='".pfile."'")
6625 keepjumps silent! put=pfile
6626 endif
6627 endwhile
6628
6629 " cleanup any windows mess at end-of-line
6630 silent! keepjumps %s/\r$//e
6631 exe "setlocal ts=".g:netrw_maxfilenamelen
6632" call Decho("setlocal ts=".g:netrw_maxfilenamelen)
6633
6634" call Dret("s:LocalListing")
6635endfun
6636
6637" ---------------------------------------------------------------------
6638" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
6639" performed any shell command. The idea is to cause all local-browsing
6640" buffers to be refreshed after a user has executed some shell command,
6641" on the chance that s/he removed/created a file/directory with it.
6642fun! s:LocalBrowseShellCmdRefresh()
6643" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
6644 " determine which buffers currently reside in a tab
6645 if !exists("s:netrw_browselist")
6646" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
6647 return
6648 endif
6649 if !exists("w:netrw_bannercnt")
6650" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo")
6651 return
6652 endif
6653 let itab = 1
6654 let buftablist = []
6655 while itab <= tabpagenr("$")
6656 let buftablist = buftablist + tabpagebuflist()
6657 let itab = itab + 1
6658 tabn
6659 endwhile
6660" call Decho("buftablist".string(buftablist))
6661" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
6662 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
6663 " | refresh any netrw window
6664 " | wipe out any non-displaying netrw buffer
6665 let curwin = winnr()
6666 let ibl = 0
6667 for ibuf in s:netrw_browselist
6668" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
6669 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
6670 " wipe out any non-displaying netrw buffer
6671" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006672 exe "silent! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006673 call remove(s:netrw_browselist,ibl)
6674" call Decho("browselist=".string(s:netrw_browselist))
6675 continue
6676 elseif index(tabpagebuflist(),ibuf) != -1
6677 " refresh any netrw buffer
6678" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
6679 exe bufwinnr(ibuf)."wincmd w"
6680 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6681 endif
6682 let ibl= ibl + 1
6683 endfor
6684 exe curwin."wincmd w"
6685
6686" call Dret("LocalBrowseShellCmdRefresh")
6687endfun
6688
6689" ---------------------------------------------------------------------
6690" s:NetrwLocalRm: {{{2
6691fun! s:NetrwLocalRm(path) range
6692" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
6693" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6694
6695 " preparation for removing multiple files/directories
6696 let ret = 0
6697 let all = 0
6698 let svpos = netrw#NetrwSavePosn()
6699
6700 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6701 " remove all marked files
6702" call Decho("remove all marked files")
6703 for fname in s:netrwmarkfilelist_{bufnr("%")}
6704 let ok= s:NetrwLocalRmFile(a:path,fname,all)
6705 if ok =~ 'q\%[uit]' || ok == "no"
6706 break
6707 elseif ok =~ 'a\%[ll]'
6708 let all= 1
6709 endif
6710 endfor
6711 call s:NetrwUnMarkFile(1)
6712
6713 else
6714 " remove (multiple) files and directories
6715" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
6716
6717 let ctr = a:firstline
6718 while ctr <= a:lastline
6719 exe "keepjumps ".ctr
6720
6721 " sanity checks
6722 if line(".") < w:netrw_bannercnt
6723 let ctr= ctr + 1
6724 continue
6725 endif
6726 let curword= s:NetrwGetWord()
6727 if curword == "./" || curword == "../"
6728 let ctr= ctr + 1
6729 continue
6730 endif
6731 let ok= s:NetrwLocalRmFile(a:path,curword,all)
6732 if ok =~ 'q\%[uit]' || ok == "no"
6733 break
6734 elseif ok =~ 'a\%[ll]'
6735 let all= 1
6736 endif
6737 let ctr= ctr + 1
6738 endwhile
6739 endif
6740
6741 " refresh the directory
6742" call Decho("bufname<".bufname("%").">")
6743 if bufname("%") != "NetrwMessage"
6744 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6745 call netrw#NetrwRestorePosn(svpos)
6746 endif
6747
6748" call Dret("s:NetrwLocalRm")
6749endfun
6750
6751" ---------------------------------------------------------------------
6752" s:NetrwLocalRmFile: remove file fname given the path {{{2
6753" Give confirmation prompt unless all==1
6754fun! s:NetrwLocalRmFile(path,fname,all)
6755" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
6756
6757 let all= a:all
6758 let ok = ""
6759 norm! 0
6760 let rmfile= s:ComposePath(a:path,a:fname)
6761" call Decho("rmfile<".rmfile.">")
6762
6763 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
6764 " attempt to remove file
6765" call Decho("attempt to remove file<".rmfile.">")
6766 if !all
6767 echohl Statement
6768 call inputsave()
6769 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6770 call inputrestore()
6771 echohl NONE
6772 if ok == ""
6773 let ok="no"
6774 endif
6775" call Decho("response: ok<".ok.">")
6776 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6777" call Decho("response: ok<".ok."> (after sub)")
6778 if ok =~ 'a\%[ll]'
6779 let all= 1
6780 endif
6781 endif
6782
6783 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006784 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006785" call Decho("errcode=".v:shell_error." ret=".ret)
6786 endif
6787
6788 else
6789 " attempt to remove directory
6790 if !all
6791 echohl Statement
6792 call inputsave()
6793 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6794 call inputrestore()
6795 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6796 if ok == ""
6797 let ok="no"
6798 endif
6799 if ok =~ 'a\%[ll]'
6800 let all= 1
6801 endif
6802 endif
6803 let rmfile= substitute(rmfile,'[\/]$','','e')
6804
6805 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006806" call Decho("1st attempt: system(s:WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
6807 call system(s:WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006808" call Decho("v:shell_error=".v:shell_error)
6809
6810 if v:shell_error != 0
6811" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006812 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006813" call Decho("errcode=".errcode)
6814
6815 if errcode != 0
6816 if has("unix")
6817" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006818 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006819 if v:shell_error != 0 && !exists("g:netrw_quiet")
6820 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
6821 let ok="no"
6822 endif
6823 elseif !exists("g:netrw_quiet")
6824 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
6825 let ok="no"
6826 endif
6827 endif
6828 endif
6829 endif
6830 endif
6831
6832" call Dret("s:NetrwLocalRmFile ".ok)
6833 return ok
6834endfun
6835
6836" ---------------------------------------------------------------------
6837" s:NetrwLocalRename: rename a remote file or directory {{{2
6838fun! s:NetrwLocalRename(path) range
6839" call Dfunc("NetrwLocalRename(path<".a:path.">)")
6840
6841 " preparation for removing multiple files/directories
6842 let ctr = a:firstline
6843 let svpos= netrw#NetrwSavePosn()
6844
6845 " rename files given by the markfilelist
6846 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6847 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6848" call Decho("oldname<".oldname.">")
6849 if exists("subfrom")
6850 let newname= substitute(oldname,subfrom,subto,'')
6851" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6852 else
6853 call inputsave()
6854 let newname= input("Moving ".oldname." to : ",oldname)
6855 call inputrestore()
6856 if newname =~ '^s/'
6857 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6858 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6859" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6860 let newname = substitute(oldname,subfrom,subto,'')
6861 endif
6862 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006863 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006864 endfor
6865 2match none
6866 unlet s:netrwmarkfilelist_{bufnr("%")}
6867 unlet s:netrwmarkfilemtch_{bufnr("%")}
6868
6869 else
6870
6871 " attempt to rename files/directories
6872 while ctr <= a:lastline
6873 exe "keepjumps ".ctr
6874
6875 " sanity checks
6876 if line(".") < w:netrw_bannercnt
6877 let ctr= ctr + 1
6878 continue
6879 endif
6880 let curword= s:NetrwGetWord()
6881 if curword == "./" || curword == "../"
6882 let ctr= ctr + 1
6883 continue
6884 endif
6885
6886 norm! 0
6887 let oldname= s:ComposePath(a:path,curword)
6888" call Decho("oldname<".oldname.">")
6889
6890 call inputsave()
6891 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
6892 call inputrestore()
6893
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006894 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006895" call Decho("renaming <".oldname."> to <".newname.">")
6896
6897 let ctr= ctr + 1
6898 endwhile
6899 endif
6900
6901 " refresh the directory
6902" call Decho("refresh the directory listing")
6903 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6904 call netrw#NetrwRestorePosn(svpos)
6905
6906" call Dret("NetrwLocalRename")
6907endfun
6908
6909" ---------------------------------------------------------------------
6910" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
6911"
6912" g:netrw_ Directory Is
6913" fastbrowse Local Remote
6914" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
6915" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
6916" fast 2 H H
6917"
6918" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
6919" Hiding a buffer means that it will be re-used when examined, hence "fast".
6920" (re-using a buffer may not be as accurate)
6921fun! s:LocalFastBrowser()
6922" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
6923
6924 " initialize browselist, a list of buffer numbers that the local browser has used
6925 if !exists("s:netrw_browselist")
6926" call Decho("initialize s:netrw_browselist")
6927 let s:netrw_browselist= []
6928 endif
6929
6930 " append current buffer to fastbrowse list
6931 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
6932" call Decho("appendng current buffer to browselist")
6933 call add(s:netrw_browselist,bufnr("%"))
6934" call Decho("browselist=".string(s:netrw_browselist))
6935 endif
6936
6937 " enable autocmd events to handle refreshing/removing local browser buffers
6938 " If local browse buffer is currently showing: refresh it
6939 " If local browse buffer is currently hidden : wipe it
6940 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
6941" call Decho("setting up local-browser shell command refresh")
6942 let s:netrw_browser_shellcmd= 1
6943 augroup AuNetrwShellCmd
6944 au!
6945 if (has("win32") || has("win95") || has("win64") || has("win16"))
6946 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
6947 else
6948 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
6949 endif
6950 augroup END
6951 endif
6952
6953 " user must have changed fastbrowse to its fast setting, so remove
6954 " the associated autocmd events
6955 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
6956" call Decho("remove AuNetrwShellCmd autcmd group")
6957 unlet s:netrw_browser_shellcmd
6958 augroup AuNetrwShellCmd
6959 au!
6960 augroup END
6961 augroup! AuNetrwShellCmd
6962 endif
6963
6964" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
6965endfun
6966
6967" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00006968" Support Functions: {{{1
6969
Bram Moolenaar488c6512005-08-11 20:09:58 +00006970" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00006971" netrw#ErrorMsg: {{{2
6972" 0=note = s:NOTE
6973" 1=warning = s:WARNING
6974" 2=error = s:ERROR
Bram Moolenaarc236c162008-07-13 17:41:49 +00006975" Jul 08, 2008 : max errnum currently is 71
Bram Moolenaar9964e462007-05-05 17:54:07 +00006976fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006977" 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 +00006978
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006979 if a:level == 1
6980 let level= "**warning** (netrw) "
6981 elseif a:level == 2
6982 let level= "**error** (netrw) "
6983 else
6984 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00006985 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006986" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006987
6988 if g:netrw_use_errorwindow
6989 " (default) netrw creates a one-line window to show error/warning
6990 " messages (reliably displayed)
6991
Bram Moolenaar446cb832008-06-24 21:56:24 +00006992 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006993 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006994" call Decho("s:winBeforeErr=".s:winBeforeErr)
6995
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00006996 " getting messages out reliably is just plain difficult!
6997 " This attempt splits the current window, creating a one line window.
6998 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006999" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007000 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007001" call Decho("setlocal ma noro")
7002 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007003 call setline(line("$")+1,level.a:msg)
7004 $
7005 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007006" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007007 bo 1split
7008 enew
7009 setlocal bt=nofile
7010 file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00007011" call Decho("setlocal ma noro")
7012 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007013 call setline(line("$"),level.a:msg)
7014 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007015" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007016 if &fo !~ '[ta]'
7017 syn clear
7018 syn match netrwMesgNote "^\*\*note\*\*"
7019 syn match netrwMesgWarning "^\*\*warning\*\*"
7020 syn match netrwMesgError "^\*\*error\*\*"
7021 hi link netrwMesgWarning WarningMsg
7022 hi link netrwMesgError Error
7023 endif
7024 setlocal noma ro bh=wipe
7025
7026 else
7027 " (optional) netrw will show messages using echomsg. Even if the
7028 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00007029" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007030 if a:level == s:WARNING
7031 echohl WarningMsg
7032 elseif a:level == s:ERROR
7033 echohl Error
7034 endif
7035 echomsg level.a:msg
7036" call Decho("echomsg ***netrw*** ".a:msg)
7037 echohl None
7038 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007039
7040" call Dret("netrw#ErrorMsg")
7041endfun
7042
7043" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007044" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7045fun! netrw#NetrwRestorePosn(...)
7046" 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))
7047 let eikeep= &ei
7048 set ei=all
7049 if expand("%") == "NetrwMessage"
7050 exe s:winBeforeErr."wincmd w"
7051 endif
7052
7053 if a:0 > 0
7054 exe a:1
7055 endif
7056
7057 " restore window
7058 if exists("w:netrw_winnr")
7059" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
7060 exe "silent! ".w:netrw_winnr."wincmd w"
7061 endif
7062 if v:shell_error == 0
7063 " as suggested by Bram M: redraw on no error
7064 " allows protocol error messages to remain visible
7065" redraw!
7066 endif
7067
7068 " restore top-of-screen line
7069 if exists("w:netrw_hline")
7070" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
7071 exe "norm! ".w:netrw_hline."G0z\<CR>"
7072 endif
7073
7074 " restore position
7075 if exists("w:netrw_line") && exists("w:netrw_col")
7076" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
7077 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
7078 endif
7079
7080 let &ei= eikeep
7081" call Dret("netrw#NetrwRestorePosn")
7082endfun
7083
7084" ---------------------------------------------------------------------
7085" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7086fun! netrw#NetrwSavePosn()
7087" call Dfunc("netrw#NetrwSavePosn()")
7088 " Save current line and column
7089 let w:netrw_winnr= winnr()
7090 let w:netrw_line = line(".")
7091 let w:netrw_col = virtcol(".")
7092
7093 " Save top-of-screen line
7094 norm! H0
7095 let w:netrw_hline= line(".")
7096
7097 " set up string holding position parameters
7098 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
7099
7100 call netrw#NetrwRestorePosn()
7101" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7102 return ret
7103endfun
7104
7105" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007106" netrw#RFC2396: converts %xx into characters {{{2
7107fun! netrw#RFC2396(fname)
7108" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7109 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7110" call Dret("netrw#RFC2396 ".fname)
7111 return fname
7112endfun
7113
7114" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007115" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
7116fun! s:ComposePath(base,subdir)
7117" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
7118
7119 if(has("amiga"))
7120" call Decho("amiga")
7121 let ec = a:base[strlen(a:base)-1]
7122 if ec != '/' && ec != ':'
7123 let ret = a:base . "/" . a:subdir
7124 else
7125 let ret = a:base . a:subdir
7126 endif
7127
7128 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7129" call Decho("windows")
7130 let ret= a:subdir
7131
7132 elseif a:base =~ '^\a\+://'
7133" call Decho("remote linux/macos")
7134 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
7135 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
7136 if a:subdir == '../'
7137 if curpath =~ '[^/]/[^/]\+/$'
7138 let curpath= substitute(curpath,'[^/]\+/$','','')
7139 else
7140 let curpath=""
7141 endif
7142 let ret= urlbase.curpath
7143 else
7144 let ret= urlbase.curpath.a:subdir
7145 endif
7146" call Decho("urlbase<".urlbase.">")
7147" call Decho("curpath<".curpath.">")
7148" call Decho("ret<".ret.">")
7149
7150 else
7151" call Decho("local linux/macos")
7152 let ret = substitute(a:base."/".a:subdir,"//","/","g")
7153 if a:base =~ '^//'
7154 " keeping initial '//' for the benefit of network share listing support
7155 let ret= '/'.ret
7156 endif
7157 let ret= simplify(ret)
7158 endif
7159
7160" call Dret("s:ComposePath ".ret)
7161 return ret
7162endfun
7163
7164" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007165" s:FileReadable: o/s independent filereadable {{{2
7166fun! s:FileReadable(fname)
7167" call Dfunc("s:FileReadable(fname<".a:fname.">)")
7168
7169 if g:netrw_cygwin
7170 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
7171 else
7172 let ret= filereadable(a:fname)
7173 endif
7174
7175" call Dret("s:FileReadable ".ret)
7176 return ret
7177endfun
7178
7179" ---------------------------------------------------------------------
7180" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
7181" Places correct suffix on end of temporary filename,
7182" using the suffix provided with fname
7183fun! s:GetTempfile(fname)
7184" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
7185
7186 if !exists("b:netrw_tmpfile")
7187 " get a brand new temporary filename
7188 let tmpfile= tempname()
7189" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007190
Bram Moolenaarc236c162008-07-13 17:41:49 +00007191 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007192" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007193
Bram Moolenaar9964e462007-05-05 17:54:07 +00007194 " sanity check -- does the temporary file's directory exist?
7195 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00007196" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007197 call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
7198" call Dret("s:GetTempfile getcwd<".getcwd().">")
7199 return ""
7200 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007201
Bram Moolenaar9964e462007-05-05 17:54:07 +00007202 " let netrw#NetSource() know about the tmpfile
7203 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource()
7204" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007205
Bram Moolenaar9964e462007-05-05 17:54:07 +00007206 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00007207 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00007208 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
7209 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007210 if !exists("+shellslash") || !&ssl
7211 let tmpfile = substitute(tmpfile,'/','\','g')
7212 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007213 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007214 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00007215 endif
7216 let b:netrw_tmpfile= tmpfile
7217" call Decho("o/s dependent fixed tempname<".tmpfile.">")
7218 else
7219 " re-use temporary filename
7220 let tmpfile= b:netrw_tmpfile
7221" call Decho("tmpfile<".tmpfile."> re-using")
7222 endif
7223
7224 " use fname's suffix for the temporary file
7225 if a:fname != ""
7226 if a:fname =~ '\.[^./]\+$'
7227" call Decho("using fname<".a:fname.">'s suffix")
7228 if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2'
7229 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7230 else
7231 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7232 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007233" call Decho("suffix<".suffix.">")
7234 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
7235" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
7236 let tmpfile .= suffix
7237" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
7238 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
7239 endif
7240 endif
7241
Bram Moolenaarc236c162008-07-13 17:41:49 +00007242" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007243" call Dret("s:GetTempfile <".tmpfile.">")
7244 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007245endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00007246
7247" ---------------------------------------------------------------------
7248" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00007249" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00007250fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007251" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007252 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
7253 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007254 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007255 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007256 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007257 else
7258 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
7259 endif
7260" call Dret("s:MakeSshCmd <".sshcmd.">")
7261 return sshcmd
7262endfun
7263
7264" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007265" s:NetrwBMShow: {{{2
7266fun! s:NetrwBMShow()
7267" call Dfunc("s:NetrwBMShow()")
7268 redir => bmshowraw
7269 menu
7270 redir END
7271 let bmshowlist = split(bmshowraw,'\n')
7272 if bmshowlist != []
7273 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
7274 if bmshowfuncs != []
7275 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
7276 if bmshowfunc =~ '^call.*BMShow()'
7277 exe "silent! ".bmshowfunc
7278 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007279 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007280 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00007281" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
7282endfun
7283
7284" ---------------------------------------------------------------------
7285" s:NetrwDelete: Deletes a file. {{{2
7286" Uses Steve Hall's idea to insure that Windows paths stay
7287" acceptable. No effect on Unix paths.
7288" Examples of use: let result= s:NetrwDelete(path)
7289fun! s:NetrwDelete(path)
7290" call Dfunc("s:NetrwDelete(path<".a:path.">)")
7291
7292 let path = s:WinPath(a:path)
7293 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7294 if exists("+shellslash")
7295 let sskeep= &shellslash
7296 setlocal noshellslash
7297 let result = delete(path)
7298 let &shellslash = sskeep
7299 else
7300" call Decho("exe let result= ".a:cmd."('".path."')")
7301 let result= delete(path)
7302 endif
7303 else
7304" call Decho("let result= delete(".path.")")
7305 let result= delete(path)
7306 endif
7307 if result < 0
7308 call Netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
7309 endif
7310
7311" call Dret("s:NetrwDelete ".result)
7312 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00007313endfun
7314
7315" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007316" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
7317fun! s:NetrwEnew(curdir)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007318" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007319
Bram Moolenaar446cb832008-06-24 21:56:24 +00007320 " grab a function-local-variable copy of buffer variables
Bram Moolenaar9964e462007-05-05 17:54:07 +00007321 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
7322 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
7323 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
7324 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
7325 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7326 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
7327 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
7328 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
7329 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
7330 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7331 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
7332 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
7333 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
7334 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
7335 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
7336 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
7337
Bram Moolenaar446cb832008-06-24 21:56:24 +00007338 call s:NetrwOptionRestore("w:")
7339" call Decho("generate a buffer with keepjumps keepalt enew!")
7340 keepjumps keepalt enew!
7341 call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007342
Bram Moolenaar446cb832008-06-24 21:56:24 +00007343 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar9964e462007-05-05 17:54:07 +00007344 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
7345 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
7346 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
7347 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
7348 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
7349 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
7350 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
7351 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
7352 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
7353 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
7354 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
7355 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
7356 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
7357 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
7358 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
7359 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
7360
7361 let b:netrw_curdir= a:curdir
7362 if b:netrw_curdir =~ '/$'
7363 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
7364 file NetrwTreeListing
Bram Moolenaar446cb832008-06-24 21:56:24 +00007365 nno <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
7366 nno <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00007367 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007368 exe "silent! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007369 endif
7370 endif
7371
Bram Moolenaar446cb832008-06-24 21:56:24 +00007372" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007373endfun
7374
7375" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007376" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
7377" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
7378fun! s:NetrwSaveWordPosn()
7379" call Dfunc("NetrwSaveWordPosn()")
7380 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
7381" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
7382endfun
7383
7384" ---------------------------------------------------------------------
7385" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
7386" changed sorting, etc. Also see s:NetrwSaveWordPosn().
7387fun! s:NetrwRestoreWordPosn()
7388" call Dfunc("NetrwRestoreWordPosn()")
7389 silent! call search(s:netrw_saveword,'w')
7390" call Dret("NetrwRestoreWordPosn")
7391endfun
7392
7393" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007394" s:RestoreBufVars: {{{2
7395fun! s:RestoreBufVars()
7396" call Dfunc("s:RestoreBufVars()")
7397
7398 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
7399 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
7400 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
7401 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
7402 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
7403 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
7404
7405" call Dret("s:RestoreBufVars")
7406endfun
7407
7408" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007409" s:RemotePathAnalysis: {{{2
7410fun! s:RemotePathAnalysis(dirname)
7411" call Dfunc("s:RemotePathAnalysis()")
7412
7413 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
7414 let s:method = substitute(a:dirname,dirpat,'\1','')
7415 let s:user = substitute(a:dirname,dirpat,'\2','')
7416 let s:machine = substitute(a:dirname,dirpat,'\3','')
7417 let s:port = substitute(a:dirname,dirpat,'\4','')
7418 let s:path = substitute(a:dirname,dirpat,'\5','')
7419 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
7420
7421" call Decho("set up s:method <".s:method .">")
7422" call Decho("set up s:user <".s:user .">")
7423" call Decho("set up s:machine<".s:machine.">")
7424" call Decho("set up s:port <".s:port.">")
7425" call Decho("set up s:path <".s:path .">")
7426" call Decho("set up s:fname <".s:fname .">")
7427
7428" call Dret("s:RemotePathAnalysis")
7429endfun
7430
7431" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007432" s:RemoteSystem: runs a command on a remote host using ssh {{{2
7433" Returns status
7434" Runs system() on
7435" [cd REMOTEDIRPATH;] a:cmd
7436" Note that it doesn't do shellescape(a:cmd)!
7437fun! s:RemoteSystem(cmd)
7438" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
7439 if !executable(g:netrw_ssh_cmd)
7440 call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
7441 elseif !exists("b:netrw_curdir")
7442 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
7443 else
7444 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
7445 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7446 if remotedir != ""
7447 let cmd= cmd.' cd '.shellescape(remotedir).";"
7448 else
7449 let cmd= cmd.' '
7450 endif
7451 let cmd= cmd.a:cmd
7452" call Decho("call system(".cmd.")")
7453 let ret= system(cmd)
7454 endif
7455" call Dret("s:RemoteSystem ".ret)
7456 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00007457endfun
7458
7459" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007460" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007461fun! s:RestoreWinVars()
7462" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00007463 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007464 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
7465 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
7466 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
7467 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
7468 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
7469 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
7470 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
7471 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
7472 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
7473 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
7474 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
7475 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00007476 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
7477 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007478 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
7479 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
7480 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
7481" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00007482endfun
7483
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007484" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007485" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
7486"
7487" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
7488" is true) and a command, :Rexplore, which call this function.
7489"
7490" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
7491fun! s:NetrwRexplore(islocal,dirname)
7492" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)")
7493 if a:islocal
7494 call netrw#LocalBrowseCheck(a:dirname)
7495 else
7496 call s:NetrwBrowse(0,a:dirname)
7497 endif
7498 if exists("s:nbcd_curpos_{bufnr('%')}")
7499 call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
7500 unlet s:nbcd_curpos_{bufnr('%')}
7501 endif
7502" call Dret("s:NetrwRexplore")
7503endfun
7504
7505" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007506" s:SaveBufVars: {{{2
7507fun! s:SaveBufVars()
7508" call Dfunc("s:SaveBufVars()")
7509
7510 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
7511 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
7512 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
7513 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
7514 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
7515 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
7516
7517" call Dret("s:SaveBufVars")
7518endfun
7519
7520" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007521" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007522fun! s:SaveWinVars()
7523" call Dfunc("s:SaveWinVars()")
7524 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
7525 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
7526 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
7527 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
7528 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
7529 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
7530 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
7531 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
7532 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
7533 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
7534 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
7535 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
7536 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
7537 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
7538 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
7539 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
7540 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
7541 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
7542" call Dret("s:SaveWinVars")
7543endfun
7544
7545" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007546" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007547" To allow separate windows to have their own activities, such as
7548" Explore **/pattern, several variables have been made window-oriented.
7549" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007550" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007551" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007552fun! s:SetBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007553" call Dfunc("s:SetBufWinVars()")
7554 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
7555 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
7556 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
7557 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
7558 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
7559 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
7560 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
7561 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
7562 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
7563 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
7564" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007565endfun
7566
7567" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007568" s:SetRexDir: set directory for :Rexplore {{{2
7569fun! s:SetRexDir(islocal,dirname)
7570" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
7571 " set up Rex and leftmouse-double-click
7572 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007573 exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007574 if g:netrw_retmap
7575 silent! unmap <2-leftmouse>
7576 if !hasmapto("<Plug>NetrwReturn")
7577 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7578 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007579 let dir = escape(a:dirname, s:netrw_map_escape)
7580 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.dir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007581 endif
7582 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007583 exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007584 if g:netrw_retmap
7585 silent! unmap <2-leftmouse>
7586 if !hasmapto("<Plug>NetrwReturn")
7587 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7588 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007589 let dir = escape(a:dirname, s:netrw_map_escape)
7590 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.dir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007591 endif
7592 endif
7593" call Dret("s:SetRexDir")
7594endfun
7595
7596" ---------------------------------------------------------------------
7597" s:Strlen: this function returns the length of a string, even if its {{{2
7598" using two-byte etc characters.
7599" Currently, its only used if g:Align_xstrlen is set to a
7600" nonzero value. Solution from Nicolai Weibull, vim docs
7601" (:help strlen()), Tony Mechelynck, and my own invention.
7602fun! s:Strlen(x)
7603" call Dfunc("s:Strlen(x<".a:x.">")
7604 if g:netrw_xstrlen == 1
7605 " number of codepoints (Latin a + combining circumflex is two codepoints)
7606 " (comment from TM, solution from NW)
7607 let ret= strlen(substitute(a:x,'.','c','g'))
7608
7609 elseif g:netrw_xstrlen == 2
7610 " number of spacing codepoints (Latin a + combining circumflex is one spacing
7611 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
7612 " (comment from TM, solution from TM)
7613 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
7614
7615 elseif g:netrw_xstrlen == 3
7616 " virtual length (counting, for instance, tabs as anything between 1 and
7617 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
7618 " preceded by lam, one otherwise, etc.)
7619 " (comment from TM, solution from me)
7620 let modkeep= &mod
7621 exe "norm! o\<esc>"
7622 call setline(line("."),a:x)
7623 let ret= virtcol("$") - 1
7624 d
7625 let &mod= modkeep
7626
7627 else
7628 " at least give a decent default
7629 ret= strlen(a:x)
7630 endif
7631" call Dret("s:Strlen ".ret)
7632 return ret
7633endfun
7634
7635" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007636" s:TreeListMove: {{{2
7637fun! s:TreeListMove(dir)
7638" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
7639 let curline = getline('.')
7640 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
7641 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
7642 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
7643 let indentm1 = substitute(curindent,'^| ','','')
7644" call Decho("prvline <".prvline."> #".line(".")-1)
7645" call Decho("curline <".curline."> #".line("."))
7646" call Decho("nxtline <".nxtline."> #".line(".")+1)
7647" call Decho("curindent<".curindent.">")
7648" call Decho("indentm1 <".indentm1.">")
7649
7650 if curline !~ '/$'
7651" call Decho('regfile')
7652 if a:dir == '[' && prvline != ''
7653 norm! 0
7654 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
7655" call Decho("regfile srch back: ".nl)
7656 elseif a:dir == ']' && nxtline != ''
7657 norm! $
7658 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
7659" call Decho("regfile srch fwd: ".nl)
7660 endif
7661
7662 elseif a:dir == '[' && prvline != ''
7663 norm! 0
7664 let curline= line(".")
7665 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
7666" call Decho("dir srch back ind: ".nl)
7667 if nl != 0
7668 if line(".") == curline-1
7669 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
7670" call Decho("dir srch back ind-1: ".nl)
7671 endif
7672 endif
7673
7674 elseif a:dir == ']' && nxtline != ''
7675 norm! $
7676 let curline = line(".")
7677 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
7678" call Decho("dir srch fwd ind: ".nl)
7679 if nl != 0
7680 if line(".") == curline+1
7681 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
7682" call Decho("dir srch fwd ind-1: ".nl)
7683 endif
7684 endif
7685
7686 endif
7687
7688" call Dret("s:TreeListMove")
7689endfun
7690
7691" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007692" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
7693" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
7694" can't be called except via emenu. But due to locale, that menu line may not be called
7695" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
7696fun! s:UpdateBuffersMenu()
7697" call Dfunc("s:UpdateBuffersMenu()")
7698 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
7699 try
7700 silent emenu Buffers.Refresh\ menu
7701 catch /^Vim\%((\a\+)\)\=:E/
7702 let v:errmsg= ""
7703 silent call s:NetrwBMShow()
7704 endtry
7705 endif
7706" call Dret("s:UpdateBuffersMenu")
7707endfun
7708
7709" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007710" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007711" Matching function to BufferWinVars()
7712fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007713" call Dfunc("s:UseBufWinVars()")
7714 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007715 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
7716 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
7717 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
7718 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
7719 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
7720 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7721 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7722 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
7723 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 +00007724" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007725endfun
7726
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007727" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007728" s:WinPath: {{{2
7729fun! s:WinPath(path)
7730" call Dfunc("s:WinPath(path<".a:path.">)")
7731 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7732 " remove trailing slash (Win95)
7733 let path = substitute(a:path, '\(\\\|/\)$', '', 'g')
7734 " remove escaped spaces
7735 let path = substitute(path, '\ ', ' ', 'g')
7736 " convert slashes to backslashes
7737 let path = substitute(path, '/', '\', 'g')
7738 else
7739 let path= a:path
7740 endif
7741" call Dret("s:WinPath <".path.">")
7742 return path
7743endfun
7744
7745" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00007746" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00007747let &cpo= s:keepcpo
7748unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00007749
Bram Moolenaar071d4272004-06-13 20:20:40 +00007750" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00007751" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00007752" vim:ts=8 fdm=marker