blob: 6221294bbd265e094dd4358b9c6547cf54744f65 [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 Moolenaarc236c162008-07-13 17:41:49 +00003" Date: Jul 12, 2008
4" Version: 127
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 Moolenaarc236c162008-07-13 17:41:49 +000030let g:loaded_netrw = "v127"
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 Moolenaar9964e462007-05-05 17:54:07 +000079 if executable("curl")
80 let g:netrw_http_cmd = "curl -o"
81 elseif executable("wget")
Bram Moolenaar1afcace2005-11-25 19:54:28 +000082 let g:netrw_http_cmd = "wget -q -O"
83 elseif executable("fetch")
84 let g:netrw_http_cmd = "fetch -o"
85 else
86 let g:netrw_http_cmd = ""
87 endif
88endif
89if !exists("g:netrw_rcp_cmd")
90 let g:netrw_rcp_cmd = "rcp"
91endif
92if !exists("g:netrw_rsync_cmd")
93 let g:netrw_rsync_cmd = "rsync"
94endif
95if !exists("g:netrw_scp_cmd")
96 let g:netrw_scp_cmd = "scp -q"
97endif
98if !exists("g:netrw_sftp_cmd")
99 let g:netrw_sftp_cmd = "sftp"
100endif
101if !exists("g:netrw_ssh_cmd")
102 let g:netrw_ssh_cmd= "ssh"
103endif
104
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000105if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000106 \ && exists("g:netrw_use_nt_rcp")
107 \ && g:netrw_use_nt_rcp
108 \ && executable( $SystemRoot .'/system32/rcp.exe')
109 let s:netrw_has_nt_rcp = 1
110 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000111else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000112 let s:netrw_has_nt_rcp = 0
113 let s:netrw_rcpmode = ''
114endif
115
116" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000117" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000118" Cygwin Detection ------- {{{3
119if !exists("g:netrw_cygwin")
120 if has("win32") || has("win95") || has("win64") || has("win16")
121 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
122 let g:netrw_cygwin= 1
123 else
124 let g:netrw_cygwin= 0
125 endif
126 else
127 let g:netrw_cygwin= 0
128 endif
129endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000130" Default values - a-c ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000131if !exists("g:netrw_alto")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000132 let g:netrw_alto= &sb
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000133endif
134if !exists("g:netrw_altv")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000135 let g:netrw_altv= &spr
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000137if !exists("g:netrw_browse_split")
138 let g:netrw_browse_split= 0
139endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000140if !exists("g:netrw_chgwin")
141 let g:netrw_chgwin = -1
142endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000143if !exists("g:netrw_compress")
144 let g:netrw_compress= "gzip"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000145endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000146if !exists("g:netrw_ctags")
147 let g:netrw_ctags= "ctags"
148endif
149" Default values - d-g ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000150if !exists("g:NETRW_DIRHIST_CNT")
151 let g:NETRW_DIRHIST_CNT= 0
152endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000153if !exists("g:netrw_decompress")
154 let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
155endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000156if !exists("g:netrw_dirhistmax")
157 let g:netrw_dirhistmax= 10
158endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000159if !exists("g:netrw_fastbrowse")
160 let g:netrw_fastbrowse= 1
161endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000162if !exists("g:netrw_ftp_browse_reject")
163 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 +0000164endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000165if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000166 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
167 let g:netrw_ftp_list_cmd = "ls -lF"
168 let g:netrw_ftp_timelist_cmd = "ls -tlF"
169 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000170 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000171 let g:netrw_ftp_list_cmd = "dir"
172 let g:netrw_ftp_timelist_cmd = "dir"
173 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000174 endif
175endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000176if !exists("g:netrw_ftpmode")
177 let g:netrw_ftpmode= "binary"
Bram Moolenaar61036992005-10-12 20:54:52 +0000178endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000179" Default values - h-lh ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000180if !exists("g:netrw_hide")
181 let g:netrw_hide= 1
Bram Moolenaar61036992005-10-12 20:54:52 +0000182endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000183if !exists("g:netrw_ignorenetrc")
184 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
185 let g:netrw_ignorenetrc= 1
186 else
187 let g:netrw_ignorenetrc= 0
188 endif
189endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000190if !exists("g:netrw_keepdir")
191 let g:netrw_keepdir= 1
192endif
193if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000194 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
195 " provide a 'pscp' listing command
196 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
197 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
198 endif
199 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
200 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000201 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000202 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000203 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000204" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000205 let g:netrw_list_cmd= ""
206 endif
207endif
208if !exists("g:netrw_list_hide")
209 let g:netrw_list_hide= ""
210endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000211" Default values - lh-lz ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000212if !exists("g:netrw_localcopycmd")
213 if has("win32") || has("win95") || has("win64") || has("win16")
214 if g:netrw_cygwin
215 let g:netrw_localcopycmd= "cp"
216 else
217 let g:netrw_localcopycmd= "copy"
218 endif
219 elseif has("unix") || has("macunix")
220 let g:netrw_localcopycmd= "cp"
221 else
222 let g:netrw_localcopycmd= ""
223 endif
224endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000225if !exists("g:netrw_local_mkdir")
226 let g:netrw_local_mkdir= "mkdir"
227endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000228if !exists("g:netrw_localmovecmd")
229 if has("win32") || has("win95") || has("win64") || has("win16")
230 if g:netrw_cygwin
231 let g:netrw_localmovecmd= "mv"
232 else
233 let g:netrw_localmovecmd= "move"
234 endif
235 elseif has("unix") || has("macunix")
236 let g:netrw_localmovecmd= "mv"
237 else
238 let g:netrw_localmovecmd= ""
239 endif
240endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000241if !exists("g:netrw_local_rmdir")
242 let g:netrw_local_rmdir= "rmdir"
243endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000244if !exists("g:netrw_liststyle")
245 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000246endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000247if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000248 " sanity check
Bram Moolenaar9964e462007-05-05 17:54:07 +0000249 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000250endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000251if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000252 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
253endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000254" Default values - m-r ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000255if !exists("g:netrw_markfileesc")
256 let g:netrw_markfileesc= '*./[\~'
257endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000258if !exists("g:netrw_maxfilenamelen")
259 let g:netrw_maxfilenamelen= 32
260endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000261if !exists("g:netrw_menu")
262 let g:netrw_menu= 1
263endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000264if !exists("g:netrw_mkdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000265 let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000266endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000267if !exists("g:netrw_mousemaps")
268 if exists("&mouse") && &mouse =~ '[anh]'
269 let g:netrw_mousemaps= 1
270 else
271 let g:netrw_mousemaps= 0
272 endif
273endif
274if !exists("g:netrw_retmap")
275 let g:netrw_retmap= 0
276endif
277if !exists("g:netrw_preview")
278 let g:netrw_preview= 0
279endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000280if !exists("g:netrw_scpport")
281 let g:netrw_scpport= "-P"
282endif
283if !exists("g:netrw_sshport")
284 let g:netrw_sshport= "-p"
285endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000286if !exists("g:netrw_rename_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000287 let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000288endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000289if !exists("g:netrw_rm_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000290 let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000291endif
292if !exists("g:netrw_rmdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000293 let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000294endif
295if !exists("g:netrw_rmf_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000296 let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000297endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000298" Default values - s ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000299 " set up shell quoting character
Bram Moolenaar843ee412004-06-30 16:16:41 +0000300if exists("g:netrw_silent") && g:netrw_silent != 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000301 let s:netrw_silentxfer= "silent "
Bram Moolenaar843ee412004-06-30 16:16:41 +0000302else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000303 let s:netrw_silentxfer= ""
Bram Moolenaar9964e462007-05-05 17:54:07 +0000304endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000305if !exists("g:netrw_sort_by")
306 " alternatives: date size
307 let g:netrw_sort_by= "name"
308endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000309if !exists("g:netrw_sort_options")
310 let g:netrw_sort_options= ""
311endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000312if !exists("g:netrw_sort_direction")
313 " alternative: reverse (z y x ...)
314 let g:netrw_sort_direction= "normal"
315endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000316if !exists("g:netrw_sort_sequence")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000317 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
318endif
319if !exists("g:netrw_special_syntax")
320 let g:netrw_special_syntax= 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000321endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000322if !exists("g:netrw_ssh_browse_reject")
323 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
324endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000325if !has("patch192")
326 if !exists("g:netrw_use_noswf")
327 let g:netrw_use_noswf= 1
328 endif
329else
330 let g:netrw_use_noswf= 0
331endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000332" Default values - t-w ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000333if !exists("g:netrw_timefmt")
334 let g:netrw_timefmt= "%c"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000335endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000336if !exists("g:netrw_xstrlen")
337 let g:netrw_xstrlen= 1
338endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000339if !exists("g:NetrwTopLvlMenu")
340 let g:NetrwTopLvlMenu= "Netrw."
341endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000342if !exists("g:netrw_use_errorwindow")
343 let g:netrw_use_errorwindow= 1
344endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000345if !exists("g:netrw_win95ftp")
346 let g:netrw_win95ftp= 1
347endif
348if !exists("g:netrw_winsize")
349 let g:netrw_winsize= ""
350endif
351" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000352" Default values for netrw's script variables: {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000353if !exists("g:netrw_fname_escape")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000354 let g:netrw_fname_escape= ' ?&;%'
355endif
356if !exists("g:netrw_glob_escape")
357 let g:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000358endif
359if !exists("g:netrw_tmpfile_escape")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000360 let g:netrw_tmpfile_escape= ' &;'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000361endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000362
363" BufEnter event ignored by decho when following variable is true
364" Has a side effect that doau BufReadPost doesn't work, so
365" files read by network transfer aren't appropriately highlighted.
366"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000368" ==============================
369" Netrw Utility Functions: {{{1
370" ==============================
371
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000373" s:NetrwOptionSave: save options and set to "standard" form {{{2
374" 06/08/07 : removed call to NetrwSafeOptions(), either placed
375" immediately after NetrwOptionSave() calls in NetRead
376" and NetWrite, or after the s:NetrwEnew() call in
377" NetrwBrowse.
378" vt: normally its "w:" or "s:" (a variable type)
379fun! s:NetrwOptionSave(vt)
380" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000381
Bram Moolenaar446cb832008-06-24 21:56:24 +0000382" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
383 if !exists("{a:vt}netrw_optionsave")
384 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000385 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000386" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000387 return
388 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000389" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000390
391 " Save current settings and current directory
392 let s:yykeep = @@
393 if exists("&l:acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000394 let {a:vt}netrw_acdkeep = &l:acd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000395 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000396 let {a:vt}netrw_aikeep = &l:ai
397 let {a:vt}netrw_awkeep = &l:aw
398 let {a:vt}netrw_cikeep = &l:ci
399 let {a:vt}netrw_cinkeep = &l:cin
400 let {a:vt}netrw_cinokeep = &l:cino
401 let {a:vt}netrw_comkeep = &l:com
402 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +0000403 if g:netrw_keepdir
Bram Moolenaar446cb832008-06-24 21:56:24 +0000404 let {a:vt}netrw_dirkeep = getcwd()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000405 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000406 let {a:vt}netrw_fokeep = &l:fo " formatoptions
407 let {a:vt}netrw_gdkeep = &l:gd " gdefault
408 let {a:vt}netrw_hidkeep = &l:hidden
409 let {a:vt}netrw_magickeep = &l:magic
410 let {a:vt}netrw_repkeep = &l:report
411 let {a:vt}netrw_spellkeep = &l:spell
412 let {a:vt}netrw_twkeep = &l:tw " textwidth
413 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar9964e462007-05-05 17:54:07 +0000414 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000415 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000416 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000417 if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif
418 silent! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000419
Bram Moolenaar446cb832008-06-24 21:56:24 +0000420" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000421endfun
422
423" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000424" s:NetrwOptionRestore: restore options {{{2
425fun! s:NetrwOptionRestore(vt)
426" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%"))
427 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000428" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000429" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000430 return
431 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000432 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000433
434 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000435 if exists("{a:vt}netrw_acdkeep")
436" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
437 let curdir = getcwd()
438 let &l:acd = {a:vt}netrw_acdkeep
439 unlet {a:vt}netrw_acdkeep
440 if &l:acd
441" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
442 try
443 if !exists("&l:acd") && !&l:acd
444 exe 'keepjumps lcd '.fnameescape(curdir)
445 endif
446 catch /^Vim\%((\a\+)\)\=:E472/
447 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
448 endtry
449 endif
450 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000451 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000452 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
453 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
454 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
455 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
456 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
457 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
458 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
459 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
460 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
461 if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
462 endif
463 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
464 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
465 if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif
466 if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif
467 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
468 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
469 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
470 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
471 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
472 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000473 if &directory == ""
474 " user hasn't specified a swapfile directory;
475 " netrw will temporarily set the swapfile directory
476 " to the current directory as returned by getcwd().
477 let &l:directory = getcwd()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000478 silent! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000479 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000480 unlet {a:vt}netrw_swfkeep
481 elseif &l:swf != {a:vt}netrw_swfkeep
482 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
483 silent! let &l:swf= {a:vt}netrw_swfkeep
484 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000485 endif
486 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000487 if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
488 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 +0000489
Bram Moolenaar446cb832008-06-24 21:56:24 +0000490" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
491" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaarc236c162008-07-13 17:41:49 +0000492" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000493" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000494endfun
495
496" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000497" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000498fun! s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000499" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
500" call Decho("window's ft=".&ft)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000501 setlocal cino=
502 setlocal com=
503 setlocal cpo-=aA
Bram Moolenaar446cb832008-06-24 21:56:24 +0000504 if exists("&acd") | setlocal noacd | endif
505 setlocal nocin noai noci magic nospell nohid wig= noaw
506 setlocal fo=nroql2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000507 setlocal tw=0
508 setlocal report=10000
509 if g:netrw_use_noswf && has("win32") && !has("win95")
510 setlocal noswf
511 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000512" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000513" call Dret("s:NetrwSafeOptions")
514endfun
515
Bram Moolenaar446cb832008-06-24 21:56:24 +0000516" ---------------------------------------------------------------------
517" netrw#NetrwClean: remove netrw {{{2
518" supports :NetrwClean -- remove netrw from first directory on runtimepath
519" :NetrwClean! -- remove netrw from all directories on runtimepath
520fun! netrw#NetrwClean(sys)
521" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
522
523 if a:sys
524 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
525 else
526 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
527 endif
528" call Decho("choice=".choice)
529 let diddel= 0
530 let diddir= ""
531
532 if choice == 1
533 for dir in split(&rtp,',')
534 if filereadable(dir."/plugin/netrwPlugin.vim")
535" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000536 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
537 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
538 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
539 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
540 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
541 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 +0000542 let diddir= dir
543 let diddel= diddel + 1
544 if !a:sys|break|endif
545 endif
546 endfor
547 endif
548
549 echohl WarningMsg
550 if diddel == 0
551 echomsg "netrw is either not installed or not removable"
552 elseif diddel == 1
553 echomsg "removed one copy of netrw from <".diddir.">"
554 else
555 echomsg "removed ".diddel." copies of netrw"
556 endif
557 echohl None
558
559" call Dret("netrw#NetrwClean")
560endfun
561
Bram Moolenaar9964e462007-05-05 17:54:07 +0000562" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000563" Netrw Transfer Functions: {{{1
564" ===============================
565
Bram Moolenaar071d4272004-06-13 20:20:40 +0000566" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000567" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000568" mode: =0 read remote file and insert before current line
569" =1 read remote file and insert after current line
570" =2 replace with remote file
571" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000572fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000573" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000574
Bram Moolenaar9964e462007-05-05 17:54:07 +0000575 " save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000576 call s:NetrwOptionSave("w:")
577 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000578
Bram Moolenaar9964e462007-05-05 17:54:07 +0000579 " interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000580 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000581 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000582 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000583 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000584 elseif a:mode == 2 " replace with remote file
585 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000586 elseif a:mode == 3 " skip read of file (leave as temporary)
587 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000588 else
589 exe a:mode
590 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000592 let ichoice = (a:0 == 0)? 0 : 1
593" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
594
Bram Moolenaar9964e462007-05-05 17:54:07 +0000595 " Get Temporary Filename {{{3
596 let tmpfile= s:GetTempfile("")
597 if tmpfile == ""
598" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000599 return
600 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000601
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000603
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000604 " attempt to repeat with previous host-file-etc
605 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000606" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000607 let choice = b:netrw_lastfile
608 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000609
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610 else
611 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000612" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000613
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000614 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000615 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000616 echomsg 'NetRead Usage:'
617 echomsg ':Nread machine:path uses rcp'
618 echomsg ':Nread "machine path" uses ftp with <.netrc>'
619 echomsg ':Nread "machine id password path" uses ftp'
620 echomsg ':Nread dav://machine[:port]/path uses cadaver'
621 echomsg ':Nread fetch://machine/path uses fetch'
622 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
623 echomsg ':Nread http://[user@]machine/path uses http wget'
624 echomsg ':Nread rcp://[user@]machine/path uses rcp'
625 echomsg ':Nread rsync://machine[:port]/path uses rsync'
626 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
627 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000628 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000630
Bram Moolenaar9964e462007-05-05 17:54:07 +0000631 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000632 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000633" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000634 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635 " case "..."
636 let choice=strpart(choice,1,strlen(choice)-2)
637 else
638 " case "... ... ..."
639 let choice = strpart(choice,1,strlen(choice)-1)
640 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000641
Bram Moolenaar9964e462007-05-05 17:54:07 +0000642 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000643 let wholechoice = wholechoice . " " . choice
644 let ichoice = ichoice + 1
645 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000646 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000647 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000648 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000649" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650 return
651 endif
652 let choice= a:{ichoice}
653 endwhile
654 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
655 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000656 endif
657 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000658
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000659" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000660 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000661
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000662 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000663 call s:NetrwMethod(choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000664 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000665
Bram Moolenaar446cb832008-06-24 21:56:24 +0000666 " Check if NetrwBrowse() should be handling this request
667" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000668 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000669" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000670 keepjumps call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000671" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000672 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000673 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000674
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000675 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000676 " Perform Protocol-Based Read {{{3
677 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000678 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
679 echo "(netrw) Processing your read request..."
680 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000681
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000682 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000683 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000684 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000685" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000686 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000687 " ER: on Win2K" rcp machine[.user]:file tmpfile
688 " ER: if machine contains '.' adding .user is required (use $USERNAME)
689 " ER: the tmpfile is full path: rcp sees C:\... as host C
690 if s:netrw_has_nt_rcp == 1
691 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
692 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
693 else
694 " Any way needed it machine contains a '.'
695 let uid_machine = g:netrw_machine .'.'. $USERNAME
696 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000697 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
699 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
700 else
701 let uid_machine = g:netrw_machine
702 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000703 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000704" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
705 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 +0000706 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000707 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000708
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000709 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000710 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000711 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000712" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000713 let netrw_fname= b:netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +0000714 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000715 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000717" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000718 if exists("g:netrw_ftpextracmd")
719 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000720" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000721 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000722 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000723" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000724 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000725" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1))
726 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000728" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
729 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730 endif
731 " 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 +0000732 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000733 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000734 setlocal debug=msg
735 call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000736 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000738 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
739 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000740 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000741
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000742 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000743 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000744 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
745 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000746" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000747 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000748 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000749 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000750 if exists("g:netrw_port") && g:netrw_port != ""
751 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000752" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000753 else
754 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000755" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000756 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000757
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000758 if exists("g:netrw_ftp") && g:netrw_ftp == 1
759 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000760" call Decho("filter input: ".getline('.'))
761 put ='\"'.s:netrw_passwd.'\"'
762" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000763 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000764 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
765" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000766 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000767
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000768 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
769 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000770" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000771 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000772 if exists("g:netrw_ftpextracmd")
773 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000774" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000775 endif
776 put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000777" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000778
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000779 " perform ftp:
780 " -i : turns off interactive prompting from ftp
781 " -n unix : DON'T use <.netrc>, even though it exists
782 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000783 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000784" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000785 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000786 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
787 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000788" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000789 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000790 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000791 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000792 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000793 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
794 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000796
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000797 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000798 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000799 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000800" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000801 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000802 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000803 else
804 let useport= ""
805 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000806" call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
807 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 +0000808 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000809 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000810
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000811 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000812 " http: NetRead Method #5 (wget) {{{3
813 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000814" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000815 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000816 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000817 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000818 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000819" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000820 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000821 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000822
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000823 if match(b:netrw_fname,"#") == -1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000824 " using g:netrw_http_cmd (usually wget or curl)
825" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
826" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_fname,1))
827 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000828 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000829
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000830 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000831 " wget/curl plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000832" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000833 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
834 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000835" call Decho("netrw_html<".netrw_html.">")
836" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000837" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
838 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 +0000839 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000840" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000841 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
842 endif
843 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000844 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000845
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000846 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000847 " cadaver: NetRead Method #6 {{{3
848 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000850
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000851 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000852 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000853 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000854 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000855 if exists("g:netrw_port") && g:netrw_port != ""
856 put ='open '.g:netrw_machine.' '.g:netrw_port
857 else
858 put ='open '.g:netrw_machine
859 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000860 put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000861 put ='get '.netrw_fname.' '.tmpfile
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000862 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000863
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000864 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000865 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000866" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000867 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000868 bd!
Bram Moolenaar446cb832008-06-24 21:56:24 +0000869 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000870 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000871
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000872 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000873 " rsync: NetRead Method #7 {{{3
874 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000875" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000876" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
877 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 +0000878 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000879 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000880
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000881 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000882 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000883 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000884 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000885" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000886 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000887 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000888 call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000889 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000890" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000891 endif
892 if exists("g:netrw_option") && g:netrw_option == ":http"
893 let netrw_option= "http"
894 else
895 let netrw_option= "ftp"
896 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000897" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000898
Bram Moolenaar446cb832008-06-24 21:56:24 +0000899 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000900" 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))
901 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 +0000902 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000903" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
904 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 +0000905 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000906
Bram Moolenaar446cb832008-06-24 21:56:24 +0000907 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000908 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000909 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000910
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000911 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000912 " sftp: NetRead Method #9 {{{3
913 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000914" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000915" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
916 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000917 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000918 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000919
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000921 " Complain {{{3
922 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000923 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 endif
925 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000926
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000927 " cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000929" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000930 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000931 unlet b:netrw_fname
932 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000933 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
934" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000935 call s:NetrwDelete(fnameescape(tmpfile))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000936 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000937 call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000938
Bram Moolenaar9964e462007-05-05 17:54:07 +0000939" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000940endfun
941
942" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000943" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000944fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000945" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000946
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000947 " option handling
948 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000949 call s:NetrwOptionSave("w:")
950 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000951
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000952 " Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000953 let tmpfile= s:GetTempfile("")
954 if tmpfile == ""
955" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000956 return
957 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000958
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000959 if a:0 == 0
960 let ichoice = 0
961 else
962 let ichoice = 1
963 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000964
Bram Moolenaar9964e462007-05-05 17:54:07 +0000965 let curbufname= expand("%")
966" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000967 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000968 " For binary writes, always write entire file.
969 " (line numbers don't really make sense for that).
970 " Also supports the writing of tar and zip files.
Bram Moolenaarc236c162008-07-13 17:41:49 +0000971" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
972 silent exe "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000973 elseif g:netrw_cygwin
974 " write (selected portion of) file to temporary
975 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +0000976" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
977 silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000978 else
979 " write (selected portion of) file to temporary
Bram Moolenaarc236c162008-07-13 17:41:49 +0000980" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
981 silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000982 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaar9964e462007-05-05 17:54:07 +0000984 if curbufname == ""
985 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
986 " on the temporary file's name. Deletion of the temporary file during
987 " cleanup then causes an error message.
988 0file!
989 endif
990
991 " While choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000992 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000993
Bram Moolenaar9964e462007-05-05 17:54:07 +0000994 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000995 " attempt to repeat with previous host-file-etc
996 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000997" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000998 let choice = b:netrw_lastfile
999 let ichoice= ichoice + 1
1000 else
1001 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001002
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001003 " Reconstruct Choice if choice starts with '"'
1004 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001005 echomsg 'NetWrite Usage:"'
1006 echomsg ':Nwrite machine:path uses rcp'
1007 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1008 echomsg ':Nwrite "machine id password path" uses ftp'
1009 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1010 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1011 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1012 echomsg ':Nwrite rcp://machine/path uses rcp'
1013 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1014 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1015 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001016 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001018
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001019 elseif match(choice,"^\"") != -1
1020 if match(choice,"\"$") != -1
1021 " case "..."
1022 let choice=strpart(choice,1,strlen(choice)-2)
1023 else
1024 " case "... ... ..."
1025 let choice = strpart(choice,1,strlen(choice)-1)
1026 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001027
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001028 while match(choice,"\"$") == -1
1029 let wholechoice= wholechoice . " " . choice
1030 let ichoice = ichoice + 1
1031 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001032 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001033 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001034 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001035" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001036 return
1037 endif
1038 let choice= a:{ichoice}
1039 endwhile
1040 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1041 endif
1042 endif
1043 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001044 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001045" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001046
Bram Moolenaar9964e462007-05-05 17:54:07 +00001047 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar446cb832008-06-24 21:56:24 +00001048 call s:NetrwMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001049
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001050 " =============
Bram Moolenaar9964e462007-05-05 17:54:07 +00001051 " Perform Protocol-Based Write {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001052 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001053 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1054 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001055" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001056 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001057
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001059 " rcp: NetWrite Method #1 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001060 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001061" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001062 if s:netrw_has_nt_rcp == 1
1063 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1064 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1065 else
1066 let uid_machine = g:netrw_machine .'.'. $USERNAME
1067 endif
1068 else
1069 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1070 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1071 else
1072 let uid_machine = g:netrw_machine
1073 endif
1074 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001075" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1076 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 +00001077 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001078
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001079 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001080 " ftp + <.netrc>: NetWrite Method #2 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001081 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001082" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001083 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001084 new
Bram Moolenaar446cb832008-06-24 21:56:24 +00001085" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001086 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001087 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00001088" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001089 if exists("g:netrw_ftpextracmd")
1090 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00001091" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001092 endif
1093 exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00001094" call Decho("filter input: ".getline('.'))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001095 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001096" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1097 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 +00001098 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001099" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00001100" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1101 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001102 endif
1103 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1104 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001105 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001106 call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001107 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001108 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001109 endif
1110 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001111 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001112
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001113 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001114 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001115 elseif b:netrw_method == 3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001116 " Construct execution string (four lines) which will be passed through filter
1117" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001118 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001119 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001120 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001121 if exists("g:netrw_port") && g:netrw_port != ""
1122 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001123" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124 else
1125 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001126" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 endif
1128 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1129 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001130" call Decho("filter input: ".getline('.'))
1131 put ='\"'.s:netrw_passwd.'\"'
1132" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001134 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1135" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001137 put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001138" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 " save choice/id/password for future use
1140 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001141
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 " perform ftp:
1143 " -i : turns off interactive prompting from ftp
1144 " -n unix : DON'T use <.netrc>, even though it exists
1145 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001146 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001147" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001148 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001149 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1150 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001151 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001152 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001153 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001154 let mod=1
1155 endif
1156 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001157
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001158 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001159 " scp: NetWrite Method #4 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001160 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001161" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001163 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001164 else
1165 let useport= ""
1166 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001167" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1168 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 +00001169 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001170
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001171 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001172 " http: NetWrite Method #5 {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001174" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001175 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001176 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001177 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001178
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001179 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001180 " dav: NetWrite Method #6 (cadaver) {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001181 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001182" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001183
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001184 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001185 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001186 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001187 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001188 if exists("g:netrw_port") && g:netrw_port != ""
1189 put ='open '.g:netrw_machine.' '.g:netrw_port
1190 else
1191 put ='open '.g:netrw_machine
1192 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001193 if exists("g:netrw_uid") && exists("s:netrw_passwd")
1194 put ='user '.g:netrw_uid.' '.s:netrw_passwd
1195 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001196 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001197
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001198 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001199 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001200" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001201 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001202 bd!
1203 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001204
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001205 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001206 " rsync: NetWrite Method #7 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001207 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001208" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001209" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1210 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 +00001211 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001212
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001213 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001214 " sftp: NetWrite Method #9 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001215 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001216" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001217 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001218 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1219 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1220 else
1221 let uid_machine = g:netrw_machine
1222 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001223 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001224 setlocal ff=unix
Bram Moolenaar9964e462007-05-05 17:54:07 +00001225 put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00001226" call Decho("filter input: ".getline('.'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001227 norm! 1Gdd
Bram Moolenaarc236c162008-07-13 17:41:49 +00001228" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1229 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001230 bd!
1231 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001232
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001233 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001234 " Complain {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001235 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001236 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001237 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001238 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001239
Bram Moolenaar9964e462007-05-05 17:54:07 +00001240 " Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001241" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001242 if s:FileReadable(tmpfile)
1243" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001244 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001245 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001246 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001247
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001248 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001249 " restore modifiability; usually equivalent to set nomod
1250 let &mod= mod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001251 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001252
Bram Moolenaar9964e462007-05-05 17:54:07 +00001253" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001254endfun
1255
1256" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001257" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001258" uses NetRead to get a copy of the file into a temporarily file,
1259" then sources that file,
1260" then removes that file.
1261fun! netrw#NetSource(...)
1262" call Dfunc("netrw#NetSource() a:0=".a:0)
1263 if a:0 > 0 && a:1 == '?'
1264 " give help
1265 echomsg 'NetSource Usage:'
1266 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1267 echomsg ':Nsource fetch://machine/path uses fetch'
1268 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1269 echomsg ':Nsource http://[user@]machine/path uses http wget'
1270 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1271 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1272 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1273 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1274 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001275 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001276 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001277 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001278 call netrw#NetRead(3,a:{i})
1279" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
1280 if s:FileReadable(s:netrw_tmpfile)
1281" call Decho("exe so ".s:netrw_tmpfile)
1282 exe "so ".s:netrw_tmpfile
1283 call delete(s:netrw_tmpfile)
1284 unlet s:netrw_tmpfile
1285 else
1286 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1287 endif
1288 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001289 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001290 endif
1291" call Dret("netrw#NetSource")
1292endfun
1293
1294" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001295" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001296" readcmd == %r : replace buffer with newly read file
1297" == 0r : read file at top of buffer
1298" == r : read file after current line
1299" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001300fun! s:NetrwGetFile(readcmd, tfile, method)
1301" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001302
1303 " readcmd=='t': simply do nothing
1304 if a:readcmd == 't'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001305" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001306" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001307 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001308 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001309
Bram Moolenaar9964e462007-05-05 17:54:07 +00001310 " get name of remote filename (ie. url and all)
1311 let rfile= bufname("%")
1312" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001313
Bram Moolenaar9964e462007-05-05 17:54:07 +00001314 if exists("*NetReadFixup")
1315 " for the use of NetReadFixup (not otherwise used internally)
1316 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001317 endif
1318
Bram Moolenaar9964e462007-05-05 17:54:07 +00001319 if a:readcmd[0] == '%'
1320 " get file into buffer
1321" call Decho("get file into buffer")
1322
1323 " rename the current buffer to the temp file (ie. tfile)
1324 if g:netrw_cygwin
1325 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1326 else
1327 let tfile= a:tfile
1328 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001329" call Decho("exe silent! keepalt file ".fnameescape(tfile))
1330 exe "silent! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001331
1332 " edit temporary file (ie. read the temporary file in)
1333 if rfile =~ '\.zip$'
1334" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1335 call zip#Browse(tfile)
1336 elseif rfile =~ '\.tar$'
1337" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1338 call tar#Browse(tfile)
1339 elseif rfile =~ '\.tar\.gz'
1340" call Decho("handling remote gzip-compressed tar file")
1341 call tar#Browse(tfile)
1342 elseif rfile =~ '\.tar\.bz2'
1343" call Decho("handling remote bz2-compressed tar file")
1344 call tar#Browse(tfile)
1345 else
1346" call Decho("edit temporary file")
1347 e!
1348 endif
1349
1350 " rename buffer back to remote filename
Bram Moolenaarc236c162008-07-13 17:41:49 +00001351" call Decho("exe silent! keepalt file ".fnameescape(rfile))
1352 exe "silent! keepalt file ".fnameescape(rfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001353 if a:method == 5
1354 set ft=html
1355 else
1356 filetype detect
1357 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001358" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1359 let line1 = 1
1360 let line2 = line("$")
1361
1362 elseif s:FileReadable(a:tfile)
1363 " read file after current line
1364" call Decho("read file<".a:tfile."> after current line")
1365 let curline = line(".")
1366 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001367" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
1368 exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001369 let line1= curline + 1
1370 let line2= line("$") - lastline + 1
1371
1372 else
1373 " not readable
Bram Moolenaarc236c162008-07-13 17:41:49 +00001374" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001375" call Decho("tfile<".a:tfile."> not readable")
1376 call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001377" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001378 return
1379 endif
1380
1381 " User-provided (ie. optional) fix-it-up command
1382 if exists("*NetReadFixup")
1383" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1384 call NetReadFixup(a:method, line1, line2)
1385" else " Decho
1386" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1387 endif
1388
Bram Moolenaar446cb832008-06-24 21:56:24 +00001389 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
1390 " update the Buffers menu
1391 call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001392 endif
1393
1394" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1395
1396 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001397" redraw!
1398
Bram Moolenaarc236c162008-07-13 17:41:49 +00001399" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001400" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001401endfun
1402
Bram Moolenaar9964e462007-05-05 17:54:07 +00001403" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001404" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001405" method == 1: rcp
1406" 2: ftp + <.netrc>
1407" 3: ftp + machine, id, password, and [path]filename
1408" 4: scp
1409" 5: http (wget)
1410" 6: cadaver
1411" 7: rsync
1412" 8: fetch
1413" 9: sftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001414fun! s:NetrwMethod(choice) " globals: method machine id passwd fname
1415" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001416
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001417 " initialization
1418 let b:netrw_method = 0
1419 let g:netrw_machine = ""
1420 let b:netrw_fname = ""
1421 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001422 let g:netrw_choice = a:choice
1423
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001424 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001425 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001426 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1427 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001428 " rcpurm : rcp://[user@]host/filename Use rcp
1429 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001430 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001431 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar446cb832008-06-24 21:56:24 +00001432 " davurm : dav[s]://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001433 " rsyncurm : rsync://host[:port]/path Use rsync
1434 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1435 " sftpurm : sftp://[user@]host/filename Use scp
1436 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1437 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1438 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001439 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001440 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001441 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001442 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001443 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001444 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1445 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1446 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001447
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001448" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001449 " Determine Method
1450 " rcp://user@hostname/...path-to-file
1451 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001452" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001453 let b:netrw_method = 1
1454 let userid = substitute(a:choice,rcpurm,'\1',"")
1455 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1456 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001457 if userid != ""
1458 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001459 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001460
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001461 " scp://user@hostname/...path-to-file
1462 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001463" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001464 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001465 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1466 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1467 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001468
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001469 " http://user@hostname/...path-to-file
1470 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001471" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001472 let b:netrw_method = 5
1473 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1474 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001475
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001476 " dav://hostname[:port]/..path-to-file..
1477 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001478" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001479 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001480 if a:choice =~ '^s'
1481 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1482 else
1483 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1484 endif
1485 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001486
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001487 " rsync://user@hostname/...path-to-file
1488 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001489" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001490 let b:netrw_method = 7
1491 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1492 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001493
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001494 " ftp://[user@]hostname[[:#]port]/...path-to-file
1495 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001496" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001497 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001498 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1499 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1500 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001501 if userid != ""
1502 let g:netrw_uid= userid
1503 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001504 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001505 let b:netrw_method = 3
1506 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001507 if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001508 let b:netrw_method= 2
1509 else
1510 if !exists("g:netrw_uid") || g:netrw_uid == ""
1511 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001512 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001513 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001514 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001515 endif
1516 let b:netrw_method= 3
1517 endif
1518 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001519
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001520 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001521" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001522 let b:netrw_method = 8
1523 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1524 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1525 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1526 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001527
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001528 " Issue an ftp : "machine id password [path/]filename"
1529 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001530" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001531 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001532 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1533 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001534 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001535 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001536
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001537 " Issue an ftp: "hostname [path/]filename"
1538 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001539" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001540 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001541 let b:netrw_method = 3
1542 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1543 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001544
Bram Moolenaar9964e462007-05-05 17:54:07 +00001545 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001546 let b:netrw_method = 2
1547 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1548 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1549 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001550
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001551 " sftp://user@hostname/...path-to-file
1552 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001553" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001554 let b:netrw_method = 9
1555 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1556 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001557
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001558 " Issue an rcp: hostname:filename" (this one should be last)
1559 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001560" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001561 let b:netrw_method = 1
1562 let userid = substitute(a:choice,rcphf,'\2',"")
1563 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1564 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001565" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1566" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1567" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1568" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001569 if userid != ""
1570 let g:netrw_uid= userid
1571 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001572
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001573 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001574 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001575 call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001576 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001577 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001578 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00001579
1580 " remove any leading [:#] from port number
1581 if g:netrw_port != ""
1582 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1583 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001584
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001585" call Decho("a:choice <".a:choice.">")
1586" call Decho("b:netrw_method <".b:netrw_method.">")
1587" call Decho("g:netrw_machine<".g:netrw_machine.">")
1588" call Decho("g:netrw_port <".g:netrw_port.">")
1589" if exists("g:netrw_uid") "Decho
1590" call Decho("g:netrw_uid <".g:netrw_uid.">")
1591" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001592" if exists("s:netrw_passwd") "Decho
1593" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001594" endif "Decho
1595" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001596" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001597endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001598
1599" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001600" NetReadFixup: this sort of function is typically written by the user {{{2
1601" to handle extra junk that their system's ftp dumps
1602" into the transfer. This function is provided as an
1603" example and as a fix for a Windows 95 problem: in my
1604" experience, win95's ftp always dumped four blank lines
1605" at the end of the transfer.
1606if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1607 fun! NetReadFixup(method, line1, line2)
1608" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
1609 if method == 3 " ftp (no <.netrc>)
1610 let fourblanklines= line2 - 3
1611 silent fourblanklines.",".line2."g/^\s*/d"
1612 endif
1613" call Dret("NetReadFixup")
1614 endfun
1615endif
1616
1617" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001618" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001619" Usage: :call NetUserPass() -- will prompt for userid and password
1620" :call NetUserPass("uid") -- will prompt for password
1621" :call NetUserPass("uid","password") -- sets global userid and password
1622fun! NetUserPass(...)
1623
1624 " get/set userid
1625 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001626" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001627 if !exists("g:netrw_uid") || g:netrw_uid == ""
1628 " via prompt
1629 let g:netrw_uid= input('Enter username: ')
1630 endif
1631 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001632" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001633 let g:netrw_uid= a:1
1634 endif
1635
1636 " get password
1637 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001638" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001639 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001640 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001641" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001642 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001643 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001644
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001645" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001646endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001647
Bram Moolenaar9964e462007-05-05 17:54:07 +00001648" ===========================================
1649" Shared Browsing Support: {{{1
1650" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001651
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001652" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001653" s:BrowserMaps: {{{2
1654fun! s:BrowserMaps(islocal)
1655" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1656 if a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00001657 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1658 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1659 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1660 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1661 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1662 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1663 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1664 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1665 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1666 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1667 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1668 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1669 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1670 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1671 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1672 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1673 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1674 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1675 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1676 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
1677 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1678 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001679 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001680 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1681 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1682 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1683 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1684 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1685 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1686 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1687 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1688 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1689 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>
1690 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001691 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001692 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1693 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr>
1694 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr>
1695 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1696 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001697 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001698 if !hasmapto('<Plug>NetrwHideEdit')
1699 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
1700 endif
1701 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1702 if !hasmapto('<Plug>NetrwRefresh')
1703 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
1704 endif
1705 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001706 if s:didstarstar || !mapcheck("<s-down>","n")
1707 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
1708 endif
1709 if s:didstarstar || !mapcheck("<s-up>","n")
1710 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
1711 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001712 if g:netrw_mousemaps == 1
1713 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1714 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1715 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1716 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1717 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1718 endif
1719 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1720 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1721 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1722 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1723 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1724 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1725 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
1726 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001727
Bram Moolenaar9964e462007-05-05 17:54:07 +00001728 else " remote
1729 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001730 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1731 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1732 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1733 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
1734 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1735 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1736 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1737 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1738 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1739 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1740 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1741 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1742 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1743 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1744 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1745 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1746 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1747 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1748 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1749 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1750 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
1751 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001752 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001753 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
1754 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
1755 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
1756 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1757 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
1758 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1759 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1760 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1761 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>
1762 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001763 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001764 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
1765 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr>
1766 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr>
1767 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
1768 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001769 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001770 if !hasmapto('<Plug>NetrwHideEdit')
1771 nmap <buffer> <c-h> <Plug>NetrwHideEdit
1772 endif
1773 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
1774 if !hasmapto('<Plug>NetrwRefresh')
1775 nmap <buffer> <c-l> <Plug>NetrwRefresh
1776 endif
1777 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1778 if g:netrw_mousemaps == 1
1779 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
1780 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
1781 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1782 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1783 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1784 endif
1785 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1786 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1787 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>'
1788 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1789 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1790 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
1791 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001792 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001793 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001794 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001795" call Dret("s:BrowserMaps")
1796endfun
1797
1798" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001799" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1800fun! s:ExplorePatHls(pattern)
1801" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
1802 let repat= substitute(a:pattern,'^**/\{1,2}','','')
1803" call Decho("repat<".repat.">")
1804 let repat= escape(repat,'][.\')
1805" call Decho("repat<".repat.">")
1806 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
1807" call Dret("s:ExplorePatHls repat<".repat.">")
1808 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00001809endfun
1810
1811" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001812" s:NetrwBookmarkDir: {{{2
1813" 0: (user: <mb>) bookmark current directory
1814" 1: (user: <gb>) change to the bookmarked directory
1815" 2: (user: <qb>) list bookmarks
1816" 3: (browsing) record current directory history
1817" 4: (user: <u>) go up (previous) bookmark
1818" 5: (user: <U>) go down (next) bookmark
1819" 6: (user: <mB>) delete bookmark
1820fun! s:NetrwBookmarkDir(chg,curdir)
1821" 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 +00001822
1823 if a:chg == 0
1824 " bookmark the current directory
1825" call Decho("(user: <b>) bookmark the current directory")
1826 if v:count > 0
1827 " handle bookmark# specified via the count
1828 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1829 if !exists("g:NETRW_BOOKMARKMAX")
1830 let g:NETRW_BOOKMARKMAX= v:count
1831 elseif v:count > g:NETRW_BOOKMARKMAX
1832 let g:NETRW_BOOKMARKMAX= v:count
1833 endif
1834 else
1835 " handle no count specified
1836 let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
1837 let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
1838 endif
1839 echo "bookmarked the current directory"
1840
1841 elseif a:chg == 1
1842 " change to the bookmarked directory
1843" call Decho("(user: <B>) change to the bookmarked directory")
1844 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1845 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
1846 else
1847 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1848 endif
1849
1850 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00001851" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00001852 let didwork= 0
1853 " list user's bookmarks
1854" call Decho("(user: <q>) list user's bookmarks")
1855 if exists("g:NETRW_BOOKMARKMAX")
1856" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1857 let cnt= 0
1858 while cnt <= g:NETRW_BOOKMARKMAX
1859 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1860" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1861 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1862 let didwork= 1
1863 endif
1864 let cnt= cnt + 1
1865 endwhile
1866 endif
1867
1868 " list directory history
1869 let cnt = g:NETRW_DIRHIST_CNT
1870 let first = 1
1871 let histcnt = 0
1872 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1873" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1874 let histcnt= histcnt + 1
1875 if exists("g:NETRW_DIRHIST_{cnt}")
1876" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1877 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
1878 let didwork= 1
1879 endif
1880 let first = 0
1881 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1882 if cnt < 0
1883 let cnt= cnt + g:netrw_dirhistmax
1884 endif
1885 endwhile
1886 if didwork
1887 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
1888 endif
1889
1890 elseif a:chg == 3
1891 " saves most recently visited directories (when they differ)
1892" call Decho("(browsing) record curdir history")
1893 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
1894 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1895" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1896 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
1897" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1898 endif
1899
1900 elseif a:chg == 4
1901 " u: change to the previous directory stored on the history list
1902" call Decho("(user: <u>) chg to prev dir from history")
1903 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1904 if g:NETRW_DIRHIST_CNT < 0
1905 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1906 endif
1907 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1908" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1909 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1910 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001911" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001912 %d
1913 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001914" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001915 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001916" " call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1917 exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001918 else
1919 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1920 echo "Sorry, no predecessor directory exists yet"
1921 endif
1922
1923 elseif a:chg == 5
1924 " U: change to the subsequent directory stored on the history list
1925" call Decho("(user: <U>) chg to next dir from history")
1926 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1927 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1928" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1929 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1930 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001931" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001932 %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00001933" call Decho("removed all lines from buffer (%d)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001934 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001935" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001936 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001937" call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1938 exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
Bram Moolenaar9964e462007-05-05 17:54:07 +00001939 else
1940 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1941 if g:NETRW_DIRHIST_CNT < 0
1942 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1943 endif
1944 echo "Sorry, no successor directory exists yet"
1945 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001946
1947 elseif a:chg == 6
1948 if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
1949 " delete the v:count'th bookmark
1950" call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
1951 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1952 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1953
1954 elseif v:count > 0
1955" call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
1956 let cnt= v:count
1957 while cnt < g:NETRW_BOOKMARKMAX
1958 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1959 let cnt = cnt + 1
1960 endwhile
1961 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1962 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1963
1964 elseif exists("b:netrw_curdir")
1965 " look for current directory amongst the bookmarks and remove that bookmark
1966" call Decho("search for bookmark<".b:netrw_curdir.">")
1967 let cnt= 1
1968 while cnt <= g:NETRW_BOOKMARKMAX
1969" call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
1970 if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
1971 if cnt < g:NETRW_BOOKMARKMAX
1972" call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
1973 while cnt < g:NETRW_BOOKMARMAX
1974 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1975 let cnt = cnt + 1
1976 endwhile
1977 endif
1978 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1979 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1980 endif
1981 let cnt= cnt + 1
1982 endwhile
1983 endif
1984
Bram Moolenaar9964e462007-05-05 17:54:07 +00001985 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001986 call s:NetrwBookmarkMenu()
1987" call Dret("NetrwBookmarkDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001988endfun
1989
1990" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001991" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
1992" list of the contents of a local or remote directory. It is assumed that the
1993" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
1994" with the requested remote hostname first.
1995fun! s:NetrwBrowse(islocal,dirname)
1996 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
1997" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
1998" call Decho("tab#".tabpagenr()." win#".winnr())
1999" call Dredir("ls!")
2000
2001 if exists("s:netrw_skipbrowse")
2002 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002003" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002004" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2005 return
2006 endif
2007 if !exists("*shellescape")
2008 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2009" call Dret("s:NetrwBrowse : missing shellescape()")
2010 return
2011 endif
2012 if !exists("*fnameescape")
2013 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2014" call Dret("s:NetrwBrowse : missing fnameescape()")
2015 return
2016 endif
2017
2018 call s:NetrwOptionSave("w:")
2019 call s:NetrwSafeOptions()
2020
2021 " re-instate any marked files
2022 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2023" call Decho("clearing marked files")
2024 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2025 endif
2026
2027 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2028" call Decho("handle w:netrw_acdkeep:")
2029" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
2030 exe 'keepjumps lcd '.fnameescape(a:dirname)
2031" call Decho("getcwd<".getcwd().">")
2032
2033 elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
2034 " looks like a regular file, attempt transfer
2035" call Decho("attempt transfer as regular file<".a:dirname.">")
2036
2037 " remove any filetype indicator from end of dirname, except for the {{{3
2038 " "this is a directory" indicator (/).
2039 " There shouldn't be one of those here, anyway.
2040 let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
2041" call Decho("new path<".path.">")
2042 call s:RemotePathAnalysis(a:dirname)
2043
2044 " remote-read the requested file into current buffer {{{3
2045 mark '
2046 call s:NetrwEnew(a:dirname)
2047 setlocal ma noro
2048" call Decho("setlocal ma noro")
2049 let b:netrw_curdir= a:dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002050" call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
2051 exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2052 exe "silent keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002053 silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
2054 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
2055 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaarc236c162008-07-13 17:41:49 +00002056 exe "silent keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002057 endif
2058
2059 " save certain window-oriented variables into buffer-oriented variables {{{3
2060 call s:SetBufWinVars()
2061 call s:NetrwOptionRestore("w:")
2062 setlocal ma nomod
2063
Bram Moolenaarc236c162008-07-13 17:41:49 +00002064" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002065" call Dret("s:NetrwBrowse : file<".s:fname.">")
2066 return
2067 endif
2068
2069 " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
2070 call s:UseBufWinVars()
2071
2072 " set up some variables {{{3
2073 let b:netrw_browser_active = 1
2074 let dirname = a:dirname
2075 let s:last_sort_by = g:netrw_sort_by
2076
2077 " set up menu {{{3
2078 call s:NetrwMenu(1)
2079
2080 " set up buffer {{{3
2081 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2082 " maintain markfile highlighting
2083 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2084" call Decho("bufnr(%)=".bufnr('%'))
2085" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2086 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2087 else
2088" call Decho("2match none")
2089 2match none
2090 endif
2091 if reusing
2092 call s:NetrwOptionRestore("w:")
2093 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002094" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002095" call Dret("s:NetrwBrowse : re-using buffer")
2096 return
2097 endif
2098
2099 " set b:netrw_curdir to the new directory name {{{3
2100" call Decho("set b:netrw_curdir to the new directory name:")
2101 let b:netrw_curdir= dirname
2102 if b:netrw_curdir =~ '[/\\]$'
2103 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2104 endif
2105 if b:netrw_curdir == ''
2106 if has("amiga")
2107 " On the Amiga, the empty string connotes the current directory
2108 let b:netrw_curdir= getcwd()
2109 else
2110 " under unix, when the root directory is encountered, the result
2111 " from the preceding substitute is an empty string.
2112 let b:netrw_curdir= '/'
2113 endif
2114 endif
2115 if !a:islocal && b:netrw_curdir !~ '/$'
2116 let b:netrw_curdir= b:netrw_curdir.'/'
2117 endif
2118" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2119
2120 " ------------
2121 " (local only) {{{3
2122 " ------------
2123 if a:islocal
2124" call Decho("local only:")
2125
2126 " Set up ShellCmdPost handling. Append current buffer to browselist
2127 call s:LocalFastBrowser()
2128
2129 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2130 if !g:netrw_keepdir
2131" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2132" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2133 if !exists("&l:acd") || !&l:acd
2134" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2135 try
2136 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
2137 catch /^Vim\%((\a\+)\)\=:E472/
2138 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2139 if exists("w:netrw_prvdir")
2140 let b:netrw_curdir= w:netrw_prvdir
2141 else
2142 call s:NetrwOptionRestore("w:")
2143 setlocal noma nomod nowrap
2144 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002145" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002146" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2147 return
2148 endif
2149 endtry
2150 endif
2151 endif
2152
2153 " --------------------------------
2154 " remote handling: {{{3
2155 " --------------------------------
2156 else
2157" call Decho("remote only:")
2158
2159 " analyze a:dirname and g:netrw_list_cmd {{{4
2160" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
2161 if a:dirname =~ "^NetrwTreeListing\>"
2162 let dirname= b:netrw_curdir
2163" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
2164 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2165 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2166 if dirname !~ '/$'
2167 let dirname= dirname.'/'
2168 endif
2169 let b:netrw_curdir = dirname
2170" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2171 else
2172 let dirname = substitute(a:dirname,'\\','/','g')
2173" call Decho("(normal) dirname<".dirname.">")
2174 endif
2175
2176 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2177 if dirname !~ dirpat
2178 if !exists("g:netrw_quiet")
2179 call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
2180 endif
2181 call s:NetrwOptionRestore("w:")
2182 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002183" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002184" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2185 return
2186 endif
2187 let b:netrw_curdir= dirname
2188" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2189 endif " (additional remote handling)
2190
2191 " -----------------------
2192 " Directory Listing: {{{3
2193 " -----------------------
2194 call s:BrowserMaps(a:islocal)
2195 call s:PerformListing(a:islocal)
2196
Bram Moolenaarc236c162008-07-13 17:41:49 +00002197" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002198" call Dret("s:NetrwBrowse : did PerformListing")
2199 return
2200endfun
2201
2202" ---------------------------------------------------------------------
2203" s:NetrwFileInfo: supports qf (query for file information) {{{2
2204fun! s:NetrwFileInfo(islocal,fname)
2205" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2206 if a:islocal
2207 if (has("unix") || has("macunix")) && executable("/bin/ls")
2208 if exists("b:netrw_curdir")
2209" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2210 if b:netrw_curdir =~ '/$'
2211 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2212 else
2213 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2214 endif
2215 else
2216" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2217 echo system("/bin/ls -lsad ".shellescape(a:fname))
2218 endif
2219 else
2220 " use vim functions to return information about file below cursor
2221" call Decho("using vim functions to query for file info")
2222 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2223 let fname= substitute(a:fname,".$","","")
2224 else
2225 let fname= a:fname
2226 endif
2227 let t = getftime(fname)
2228 let sz = getfsize(fname)
2229 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2230" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2231 endif
2232 else
2233 echo "sorry, \"qf\" not supported yet for remote files"
2234 endif
2235" call Dret("s:NetrwFileInfo")
2236endfun
2237
2238" ---------------------------------------------------------------------
2239" s:NetrwGetBuffer: {{{2
2240" returns 0=cleared buffer
2241" 1=re-used buffer
2242fun! s:NetrwGetBuffer(islocal,dirname)
2243" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2244 let dirname= a:dirname
2245
2246 " re-use buffer if possible {{{3
2247" call Decho("--re-use a buffer if possible--")
2248 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2249 " find NetrwTreeList buffer if there is one
2250 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2251" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2252 let eikeep= &ei
2253 set ei=all
2254 exe "b ".w:netrw_treebufnr
2255 let &ei= eikeep
2256" call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
2257 return
2258 endif
2259 let bufnum= -1
2260" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2261
2262 else
2263 " find buffer number of buffer named precisely the same as dirname {{{3
2264" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2265" call Dredir("ls!")
2266
2267 " get dirname and associated buffer number
2268 let bufnum = bufnr(escape(dirname,'\'))
2269" call Decho(" find buffer<".dirname.">'s number ")
2270" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2271
2272 if bufnum < 0 && dirname !~ '/$'
2273 " trying appending a trailing /
2274" call Decho(" try appending a trailing / to dirname<".dirname.">")
2275 let bufnum= bufnr(escape(dirname.'/','\'))
2276 if bufnum > 0
2277 let dirname= dirname.'/'
2278 endif
2279 endif
2280
2281 if bufnum < 0 && dirname =~ '/$'
2282 " trying removing a trailing /
2283" call Decho(" try removing a trailing / from dirname<".dirname.">")
2284 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2285 if bufnum > 0
2286 let dirname= substitute(dirname,'/$','','')
2287 endif
2288 endif
2289
2290" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2291 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2292 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2293 " handle approximate matches
Bram Moolenaarc236c162008-07-13 17:41:49 +00002294" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx=dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002295 let ibuf = 1
2296 let buflast = bufnr("$")
2297" call Decho(" findbuf2: buflast=".buflast)
2298 while ibuf <= buflast
2299 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002300 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002301" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002302 if bname != '' && dirname =~ '/'.bname.'/\=$' | break | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002303 if bname =~ '^'.dirname.'/\=$' | break | endif
2304 if dirname =~ '^'.bname.'/$' | break | endif
2305 let ibuf= ibuf + 1
2306 endwhile
2307 if ibuf > buflast
2308 let bufnum= -1
2309 else
2310 let bufnum= ibuf
2311 endif
2312" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2313 endif
2314 endif
2315
2316 " get enew buffer and name it -or- re-use buffer {{{3
2317" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")")
2318 mark '
2319 if bufnum < 0 || !bufexists(bufnum)
2320 call s:NetrwEnew(dirname)
2321" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2322 " name the buffer
2323 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2324 " Got enew buffer; transform into a NetrwTreeListing
2325" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2326 if !exists("s:netrw_treelistnum")
2327 let s:netrw_treelistnum= 1
2328 else
2329 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2330 endif
2331 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002332" call Decho(" exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
2333 exe 'silent! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002334 nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
2335 nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
2336 nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr>
2337 nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr>
2338" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2339 else
2340" let v:errmsg= "" " Decho
2341 let escdirname= fnameescape(dirname)
2342" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002343" call Decho(' exe silent! keepalt file '.fnameescape(escdirname))
2344 exe 'silent! keepalt file '.fnameescape(escdirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002345" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2346 endif
2347" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2348
2349 else " Re-use the buffer
2350" call Decho("--re-use buffer#".bufnum.": --")
2351 let eikeep= &ei
2352 set ei=all
2353 if getline(2) =~ '^" Netrw Directory Listing'
2354" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
2355 exe "keepalt b ".bufnum
2356 else
2357" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
2358 exe "b ".bufnum
2359 endif
2360 if bufname("%") == '.'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002361" call Decho("exe silent! keepalt file ".fnameescape(getcwd()))
2362 exe "silent! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002363 endif
2364 let &ei= eikeep
2365 if line("$") <= 1
2366 call s:NetrwListSettings(a:islocal)
2367" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2368 return 0
2369 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2370" call Decho("--re-use tree listing--")
2371" call Decho(" clear buffer<".expand("%")."> with :%d")
2372 silent %d
2373 call s:NetrwListSettings(a:islocal)
2374" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2375 return 0
2376 else
2377" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2378 return 1
2379 endif
2380 endif
2381
2382 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2383 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2384 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2385 " med 1 D H
2386 " fast 2 H H
2387" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--")
2388 let fname= expand("%")
2389 call s:NetrwListSettings(a:islocal)
Bram Moolenaarc236c162008-07-13 17:41:49 +00002390" call Decho("exe keepalt file ".fnameescape(fname))
2391 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002392
2393 " delete all lines from buffer {{{3
2394" call Decho("--delete all lines from buffer--")
2395" call Decho(" clear buffer<".expand("%")."> with :%d")
2396 keepalt silent! %d
2397
2398" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2399 return 0
2400endfun
2401
2402" ---------------------------------------------------------------------
2403" s:NetrwGetcwd: get the current directory. {{{2
2404" Change backslashes to forward slashes, if any.
2405" If doesc is true, escape certain troublesome characters
2406fun! s:NetrwGetcwd(doesc)
2407" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2408 let curdir= substitute(getcwd(),'\\','/','ge')
2409 if curdir !~ '[\/]$'
2410 let curdir= curdir.'/'
2411 endif
2412 if a:doesc
2413 let curdir= fnameescape(curdir)
2414 endif
2415" call Dret("NetrwGetcwd <".curdir.">")
2416 return curdir
2417endfun
2418
2419" ---------------------------------------------------------------------
2420" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2421fun! s:NetrwGetWord()
2422" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2423 call s:UseBufWinVars()
2424
2425 " insure that w:netrw_liststyle is set up
2426 if !exists("w:netrw_liststyle")
2427 if exists("g:netrw_liststyle")
2428 let w:netrw_liststyle= g:netrw_liststyle
2429 else
2430 let w:netrw_liststyle= s:THINLIST
2431 endif
2432" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2433 endif
2434
2435 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2436 " Active Banner support
2437" call Decho("active banner handling")
2438 norm! 0
2439 let dirname= "./"
2440 let curline= getline('.')
2441
2442 if curline =~ '"\s*Sorted by\s'
2443 norm s
2444 let s:netrw_skipbrowse= 1
2445 echo 'Pressing "s" also works'
2446
2447 elseif curline =~ '"\s*Sort sequence:'
2448 let s:netrw_skipbrowse= 1
2449 echo 'Press "S" to edit sorting sequence'
2450
2451 elseif curline =~ '"\s*Quick Help:'
2452 norm ?
2453 let s:netrw_skipbrowse= 1
2454 echo 'Pressing "?" also works'
2455
2456 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
2457 norm a
2458 let s:netrw_skipbrowse= 1
2459 echo 'Pressing "a" also works'
2460
2461 elseif line("$") > w:netrw_bannercnt
2462 exe 'silent keepjumps '.w:netrw_bannercnt
2463 endif
2464
2465 elseif w:netrw_liststyle == s:THINLIST
2466" call Decho("thin column handling")
2467 norm! 0
2468 let dirname= getline('.')
2469
2470 elseif w:netrw_liststyle == s:LONGLIST
2471" call Decho("long column handling")
2472 norm! 0
2473 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2474
2475 elseif w:netrw_liststyle == s:TREELIST
2476" call Decho("treelist handling")
2477 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2478
2479 else
2480" call Decho("obtain word from wide listing")
2481 let dirname= getline('.')
2482
2483 if !exists("b:netrw_cpf")
2484 let b:netrw_cpf= 0
2485 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2486" call Decho("computed cpf=".b:netrw_cpf)
2487 endif
2488
2489" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2490 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2491" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2492" call Decho("1: dirname<".dirname.">")
2493 if filestart == 0
2494 norm! 0ma
2495 else
2496 call cursor(line("."),filestart+1)
2497 norm! ma
2498 endif
2499 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002500 let eofname= filestart + b:netrw_cpf + 1
2501 if eofname <= col("$")
2502 call cursor(line("."),filestart+b:netrw_cpf+1)
2503 norm! "ay`a
2504 else
2505 norm! "ay$
2506 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002507 let dirname = @a
2508 let @a = rega
2509" call Decho("2: dirname<".dirname.">")
2510 let dirname= substitute(dirname,'\s\+$','','e')
2511" call Decho("3: dirname<".dirname.">")
2512 endif
2513
2514 " symlinks are indicated by a trailing "@". Remove it before further processing.
2515 let dirname= substitute(dirname,"@$","","")
2516
2517 " executables are indicated by a trailing "*". Remove it before further processing.
2518 let dirname= substitute(dirname,"\*$","","")
2519
2520" call Dret("s:NetrwGetWord <".dirname.">")
2521 return dirname
2522endfun
2523
2524" ---------------------------------------------------------------------
2525" s:NetrwListSettings: {{{2
2526fun! s:NetrwListSettings(islocal)
2527" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2528 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002529" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002530 setlocal bt=nofile nobl ma nonu nowrap noro
2531" call Decho("exe keepalt file ".fnameescape(fname))
2532 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002533 if g:netrw_use_noswf
2534 setlocal noswf
2535 endif
2536" call Dredir("ls!")
2537" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2538 exe "setlocal ts=".g:netrw_maxfilenamelen
2539 setlocal isk+=.,~,-
2540 if g:netrw_fastbrowse > a:islocal
2541 setlocal bh=hide
2542 else
2543 setlocal bh=delete
2544 endif
2545" call Dret("s:NetrwListSettings")
2546endfun
2547
2548" ---------------------------------------------------------------------
2549" s:NetrwListStyle: {{{2
2550" islocal=0: remote browsing
2551" =1: local browsing
2552fun! s:NetrwListStyle(islocal)
2553" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2554 let fname = s:NetrwGetWord()
2555 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2556 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2557" call Decho("fname<".fname.">")
2558" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2559" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2560
2561 if w:netrw_liststyle == s:THINLIST
2562 " use one column listing
2563" call Decho("use one column list")
2564 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2565
2566 elseif w:netrw_liststyle == s:LONGLIST
2567 " use long list
2568" call Decho("use long list")
2569 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2570
2571 elseif w:netrw_liststyle == s:WIDELIST
2572 " give wide list
2573" call Decho("use wide list")
2574 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2575
2576 elseif w:netrw_liststyle == s:TREELIST
2577" call Decho("use tree list")
2578 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2579
2580 else
2581 call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2582 let g:netrw_liststyle = s:THINLIST
2583 let w:netrw_liststyle = g:netrw_liststyle
2584 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2585 endif
2586 setlocal ma noro
2587" call Decho("setlocal ma noro")
2588
2589 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2590" call Decho("clear buffer<".expand("%")."> with :%d")
2591 %d
2592
2593 " refresh the listing
2594 let svpos= netrw#NetrwSavePosn()
2595 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2596 call netrw#NetrwRestorePosn(svpos)
2597
2598 " keep cursor on the filename
2599 silent keepjumps $
2600 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2601" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2602 if result <= 0 && exists("w:netrw_bannercnt")
2603 exe "keepjumps ".w:netrw_bannercnt
2604 endif
2605
2606" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2607endfun
2608
2609" ---------------------------------------------------------------------
2610" s:NetrwBookmarkMenu: Uses menu priorities {{{2
2611" .2.[cnt] for bookmarks, and
2612" .3.[cnt] for history
2613" (see s:NetrwMenu())
2614fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002615 if !exists("s:netrw_menucnt")
2616 return
2617 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002618" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
2619
2620 " the following test assures that gvim is running, has menus available, and has menus enabled.
2621 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00002622 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002623" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
2624 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002625 endif
2626
2627 " show bookmarked places
Bram Moolenaar446cb832008-06-24 21:56:24 +00002628 let cnt = 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002629 while cnt <= g:NETRW_BOOKMARKMAX
2630 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002631 let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
2632" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.bmdir)
2633 exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002634 endif
2635 let cnt= cnt + 1
2636 endwhile
2637
2638 " show directory browsing history
2639 let cnt = g:NETRW_DIRHIST_CNT
2640 let first = 1
2641 let histcnt = 0
2642 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2643 let histcnt = histcnt + 1
2644 let priority = g:NETRW_DIRHIST_CNT + histcnt
2645 if exists("g:NETRW_DIRHIST_{cnt}")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002646 let bmdir= escape(g:NETRW_DIRHIST_{cnt},'/&? ')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002647" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir)
2648 exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002649 endif
2650 let first = 0
2651 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2652 if cnt < 0
2653 let cnt= cnt + g:netrw_dirhistmax
2654 endif
2655 endwhile
2656 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002657" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002658endfun
2659
2660" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002661" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
2662" directory and a new directory name. Also, if the
2663" "new directory name" is actually a file,
2664" NetrwBrowseChgDir() edits the file.
2665fun! s:NetrwBrowseChgDir(islocal,newdir,...)
2666" 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 +00002667
Bram Moolenaar446cb832008-06-24 21:56:24 +00002668 if !exists("b:netrw_curdir")
2669 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
2670 " and the current window is the NetrwMessage window.
2671" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
2672" call Decho("getcwd<".getcwd().">")
2673" call Dredir("ls!")
2674" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002675 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00002676 endif
2677
Bram Moolenaar446cb832008-06-24 21:56:24 +00002678 call s:NetrwOptionSave("s:")
2679 call s:NetrwSafeOptions()
2680 let nbcd_curpos = netrw#NetrwSavePosn()
2681 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
2682 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
2683 let newdir = a:newdir
2684 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002685
Bram Moolenaar446cb832008-06-24 21:56:24 +00002686 " set up o/s-dependent directory recognition pattern
2687 if has("amiga")
2688 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002689 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002690 let dirpat= '[\/]$'
2691 endif
2692" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
2693
2694 if dirname !~ dirpat
2695 " apparently vim is "recognizing" that it is in a directory and
2696 " is removing the trailing "/". Bad idea, so I put it back.
2697 let dirname= dirname.'/'
2698" call Decho("adjusting dirname<".dirname.">")
2699 endif
2700
2701 if newdir !~ dirpat
2702 " ------------
2703 " edit a file:
2704 " ------------
2705" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2706 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2707 let dirname= s:NetrwTreeDir()
2708 if dirname =~ '/$'
2709 let dirname= dirname.newdir
2710 else
2711 let dirname= s:NetrwTreeDir()."/".newdir
2712 endif
2713" call Decho("tree listing")
2714 elseif newdir =~ '^\(/\|\a:\)'
2715 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00002716 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002717 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002718 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002719" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
2720 " this lets NetrwBrowseX avoid the edit
2721 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002722" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
2723 call s:NetrwOptionRestore("s:")
2724 if !exists("s:didsplit")
2725 if g:netrw_browse_split == 1
2726 new
2727 wincmd _
2728 elseif g:netrw_browse_split == 2
2729 rightb vert new
2730 wincmd |
2731 elseif g:netrw_browse_split == 3
2732 tabnew
2733 elseif g:netrw_browse_split == 4
2734 if s:NetrwPrevWinOpen(2) == 3
2735" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002736 return
2737 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002738 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002739 " handling a file, didn't split, so remove menu
2740" call Decho("handling a file+didn't split, so remove menu")
2741 call s:NetrwMenu(0)
2742 " optional change to window
2743 if g:netrw_chgwin >= 1
2744 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002745 endif
2746 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002747 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002748 " the point where netrw actually edits the (local) file
2749 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
2750 if a:islocal
2751" call Decho("edit local file: exe e! ".fnameescape(dirname))
2752 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002753 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002754" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002755 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002756 let dolockout= 1
2757 endif
2758
2759 elseif newdir =~ '^/'
2760 " ---------------------------------
2761 " just go to the new directory spec
2762 " ---------------------------------
2763" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
2764 let dirname= newdir
2765 call s:SetRexDir(a:islocal,dirname)
2766 call s:NetrwOptionRestore("s:")
2767
2768 elseif newdir == './'
2769 " --------------------------
2770 " refresh the directory list
2771 " --------------------------
2772" call Decho('case "refresh directory listing": newdir == "./"')
2773 call s:SetRexDir(a:islocal,dirname)
2774
2775 elseif newdir == '../'
2776 " -------------------
2777 " go up one directory
2778 " -------------------
2779" call Decho('case "go up one directory": newdir == "../"')
2780
2781 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2782 " force a refresh
2783" call Decho("clear buffer<".expand("%")."> with :%d")
2784 setlocal noro ma
2785" call Decho("setlocal noro ma")
2786 keepjumps %d
2787 endif
2788
2789 if has("amiga")
2790 " amiga
2791" call Decho('case "go up one directory": newdir == "../" and amiga')
2792 if a:islocal
2793 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
2794 let dirname= substitute(dirname,'/$','','')
2795 else
2796 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
2797 endif
2798" call Decho("amiga: dirname<".dirname."> (go up one dir)")
2799
2800 else
2801 " unix or cygwin
2802" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
2803 if a:islocal
2804 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
2805 if dirname == ""
2806 let dirname= '/'
2807 endif
2808 else
2809 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
2810 endif
2811" call Decho("unix: dirname<".dirname."> (go up one dir)")
2812 endif
2813 call s:SetRexDir(a:islocal,dirname)
2814
2815 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2816" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
2817 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
2818 setlocal noro ma
2819" call Decho("setlocal noro ma")
2820 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
2821" call Decho("clear buffer<".expand("%")."> with :%d")
2822 keepjumps %d
2823 endif
2824 let treedir = s:NetrwTreeDir()
2825 let s:treecurpos = nbcd_curpos
2826 let haskey= 0
2827" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
2828
2829 " search treedict for tree dir as-is
2830 if has_key(w:netrw_treedict,treedir)
2831" call Decho('....searched for treedir<'.treedir.'> : found it!')
2832 let haskey= 1
2833 else
2834" call Decho('....searched for treedir<'.treedir.'> : not found')
2835 endif
2836
2837 " search treedict for treedir with a / appended
2838 if !haskey && treedir !~ '/$'
2839 if has_key(w:netrw_treedict,treedir."/")
2840 let treedir= treedir."/"
2841" call Decho('....searched.for treedir<'.treedir.'> found it!')
2842 let haskey = 1
2843 else
2844" call Decho('....searched for treedir<'.treedir.'/> : not found')
2845 endif
2846 endif
2847
2848 " search treedict for treedir with any trailing / elided
2849 if !haskey && treedir =~ '/$'
2850 let treedir= substitute(treedir,'/$','','')
2851 if has_key(w:netrw_treedict,treedir)
2852" call Decho('....searched.for treedir<'.treedir.'> found it!')
2853 let haskey = 1
2854 else
2855" call Decho('....searched for treedir<'.treedir.'> : not found')
2856 endif
2857 endif
2858
2859 if haskey
2860 " close tree listing for selected subdirectory
2861" call Decho("closing selected subdirectory<".dirname.">")
2862 call remove(w:netrw_treedict,treedir)
2863" call Decho("removed entry<".dirname."> from treedict")
2864" call Decho("yielding treedict<".string(w:netrw_treedict).">")
2865 let dirname= w:netrw_treetop
2866 else
2867 " go down one directory
2868 let dirname= substitute(treedir,'/*$','/','')
2869" call Decho("go down one dir: treedir<".treedir.">")
2870 endif
2871 call s:SetRexDir(a:islocal,dirname)
2872
2873 else
2874 " go down one directory
2875 let dirname= s:ComposePath(dirname,newdir)
2876" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2877 call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002878 endif
2879
Bram Moolenaar446cb832008-06-24 21:56:24 +00002880 call s:NetrwOptionRestore("s:")
2881 if dolockout
2882" call Decho("doing modification lockout settings: ma nomod noro")
2883 setlocal ma nomod noro
2884" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002885 endif
2886
Bram Moolenaar446cb832008-06-24 21:56:24 +00002887" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
2888 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00002889endfun
2890
2891" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002892" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2
2893" files given their extension. Passes 0=local, 1=remote
2894fun! netrw#NetrwBrowseX(fname,remote)
2895" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
2896
2897 " set up the filename
2898 " (lower case the extension, make a local copy of a remote file)
2899 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
2900 if has("win32") || has("win95") || has("win64") || has("win16")
2901 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00002902 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002903
2904 " seems kde systems often have gnome-open due to dependencies, even though
2905 " gnome-open's subsidiary display tools are largely absent. Kde systems
2906 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
2907 if !exists("s:haskdeinit")
2908 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002909 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002910 if v:shell_error
2911 let s:haskdeinit = 0
2912 endif
2913 else
2914 let s:haskdeinit= 0
2915 endif
2916" call Decho("setting s:haskdeinit=".s:haskdeinit)
2917 endif
2918
2919 if a:remote == 1
2920 " create a local copy
2921 let fname= fnamemodify(tempname(),":r").".".exten
Bram Moolenaarc236c162008-07-13 17:41:49 +00002922" call Decho("a:remote=".a:remote.": create a local copy of <".fname."> as <".fname.">")
2923 exe "silent keepjumps bot 1new ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002924 setlocal bh=delete
Bram Moolenaarc236c162008-07-13 17:41:49 +00002925" call Decho("read <".fnameescape(fname).">, now writing: exe w! ".fnameescape(fname))
2926 exe "silent! w! ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002927 q
Bram Moolenaarc236c162008-07-13 17:41:49 +00002928 else
2929 let fname= a:fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002930 endif
2931" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
2932
2933 " set up redirection
2934 if &srr =~ "%s"
2935 if (has("win32") || has("win95") || has("win64") || has("win16"))
2936 let redir= substitute(&srr,"%s","nul","")
2937 else
2938 let redir= substitute(&srr,"%s","/dev/null","")
2939 endif
2940 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
2941 let redir= &srr . "nul"
2942 else
2943 let redir= &srr . "/dev/null"
2944 endif
2945" call Decho("redir{".redir."} srr{".&srr."}")
2946
2947 " extract any viewing options. Assumes that they're set apart by quotes.
2948 if exists("g:netrw_browsex_viewer")
2949 if g:netrw_browsex_viewer =~ '\s'
2950 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
2951 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
2952 let oviewer = ''
2953 let cnt = 1
2954 while !executable(viewer) && viewer != oviewer
2955 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
2956 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
2957 let cnt = cnt + 1
2958 let oviewer = viewer
2959" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
2960 endwhile
2961 else
2962 let viewer = g:netrw_browsex_viewer
2963 let viewopt = ""
2964 endif
2965" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
2966 endif
2967
2968 " execute the file handler
2969 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
2970" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2971 let ret= netrwFileHandlers#Invoke(exten,fname)
2972
2973 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
2974" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002975" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir)
2976 exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00002977 let ret= v:shell_error
2978
2979 elseif has("win32") || has("win64")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002980" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
2981 exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002982 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2983 let ret= v:shell_error
2984
2985 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00002986" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir)
2987 exe "silent !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00002988 let ret= v:shell_error
2989
2990 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00002991" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir)
2992 exe "silent !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00002993 let ret= v:shell_error
2994
2995 elseif has("macunix") && executable("open")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002996" call Decho("exe silent !open ".shellescape(fname,1)." ".redir)
2997 exe "silent !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00002998 let ret= v:shell_error
2999
3000 else
3001 " netrwFileHandlers#Invoke() always returns 0
3002 let ret= netrwFileHandlers#Invoke(exten,fname)
3003 endif
3004
3005 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3006 if ret
3007 let ret= netrwFileHandlers#Invoke(exten,fname)
3008 endif
3009
Bram Moolenaarc236c162008-07-13 17:41:49 +00003010 " restoring redraw! after external file handlers
3011 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003012
3013 " cleanup: remove temporary file,
3014 " delete current buffer if success with handler,
3015 " return to prior buffer (directory listing)
3016 " Feb 12, 2008: had to de-activiate removal of
3017 " temporary file because it wasn't getting seen.
3018" if a:remote == 1 && fname != a:fname
3019" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003020" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003021" endif
3022
3023 if a:remote == 1
3024 setlocal bh=delete bt=nofile
3025 if g:netrw_use_noswf
3026 setlocal noswf
3027 endif
3028 exe "norm! \<c-o>"
3029" redraw!
3030 endif
3031
3032" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003033endfun
3034
3035" ---------------------------------------------------------------------
3036" netrw#Explore: launch the local browser in the directory of the current file {{{2
3037" dosplit==0: the window will be split iff the current file has
3038" been modified
3039" dosplit==1: the window will be split before running the local
3040" browser
3041fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003042" 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 +00003043 if !exists("b:netrw_curdir")
3044 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003045" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003046 endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003047 let curfile= b:netrw_curdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003048" call Decho("curfile<".curfile.">")
3049
3050 " save registers
3051 silent! let keepregstar = @*
3052 silent! let keepregplus = @+
3053 silent! let keepregslash= @/
3054
3055 " if dosplit or file has been modified
3056 if a:dosplit || &modified || a:style == 6
3057" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
3058 call s:SaveWinVars()
3059
3060 if a:style == 0 " Explore, Sexplore
3061" call Decho("style=0: Explore or Sexplore")
3062 exe g:netrw_winsize."wincmd s"
3063
3064 elseif a:style == 1 "Explore!, Sexplore!
3065" call Decho("style=1: Explore! or Sexplore!")
3066 exe g:netrw_winsize."wincmd v"
3067
3068 elseif a:style == 2 " Hexplore
3069" call Decho("style=2: Hexplore")
3070 exe "bel ".g:netrw_winsize."wincmd s"
3071
3072 elseif a:style == 3 " Hexplore!
3073" call Decho("style=3: Hexplore!")
3074 exe "abo ".g:netrw_winsize."wincmd s"
3075
3076 elseif a:style == 4 " Vexplore
3077" call Decho("style=4: Vexplore")
3078 exe "lefta ".g:netrw_winsize."wincmd v"
3079
3080 elseif a:style == 5 " Vexplore!
3081" call Decho("style=5: Vexplore!")
3082 exe "rightb ".g:netrw_winsize."wincmd v"
3083
3084 elseif a:style == 6 " Texplore
3085 call s:SaveBufVars()
3086" call Decho("style = 6: Texplore")
3087 tabnew
3088 call s:RestoreBufVars()
3089 endif
3090 call s:RestoreWinVars()
3091 endif
3092 norm! 0
3093
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003094 if a:0 > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003095" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003096 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
3097 let dirname= substitute(a:1,'\~',expand("$HOME"),'')
3098" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3099 elseif a:1 == '.'
3100 let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
3101 if dirname !~ '/$'
3102 let dirname= dirname."/"
3103 endif
3104" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3105 elseif a:1 =~ '\$'
3106 let dirname= expand(a:1)
3107 else
3108 let dirname= a:1
3109" call Decho("using dirname<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003110 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003111 else
3112 " clear explore
3113" call Decho("clearing explore variables")
3114 2match none
3115 if exists("s:explore_match") |unlet s:explore_match |endif
3116 if exists("s:explore_indx") |unlet s:explore_indx |endif
3117 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3118 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3119 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3120 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3121 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3122 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3123" redraw!
3124 echo " "
3125 echo " "
3126" call Dret("netrw#Explore : cleared list")
3127 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003128 endif
3129
Bram Moolenaar446cb832008-06-24 21:56:24 +00003130 if dirname =~ '/\*\*/'
3131 " handle .../**/.../filepat
3132" call Decho("case Explore .../**/.../filepat")
3133 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3134 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3135 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003136 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003137 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003138 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003139 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3140 let starpat= 4;
3141" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3142" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003143
Bram Moolenaar446cb832008-06-24 21:56:24 +00003144 elseif dirname =~ '^\*//'
3145 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3146" call Decho("case Explore *//pattern")
3147 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3148 let starpat= 1
3149" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3150 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3151
3152 elseif dirname =~ '^\*\*//'
3153 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3154" call Decho("case Explore **//pattern")
3155 let pattern= substitute(dirname,'^\*\*//','','')
3156 let starpat= 2
3157" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3158
3159 elseif dirname =~ '^\*/'
3160 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3161 let starpat= 3
3162" call Decho("case Explore */filepat (starpat=".starpat.")")
3163
3164 elseif dirname=~ '^\*\*/'
3165 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3166 let starpat= 4
3167" call Decho("case Explore **/filepat (starpat=".starpat.")")
3168 else
3169 let starpat= 0
3170 endif
3171
3172 if starpat == 0 && a:indx >= 0
3173 " [Explore Hexplore Vexplore Sexplore] [dirname]
3174" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore")
3175 if dirname == ""
3176 let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3177 endif
3178 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3179" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3180 call s:NetrwBrowse(0,dirname)
3181 else
3182 if dirname == ""|let dirname= getcwd()|endif
3183" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3184 call netrw#LocalBrowseCheck(dirname)
3185 endif
3186
3187" call Decho("curfile<".curfile.">")
3188 if has("win32") || has("win95") || has("win64") || has("win16")
3189 call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
3190 else
3191 call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
3192 endif
3193
3194 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3195 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3196 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3197 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3198 elseif a:indx <= 0
3199 " Nexplore, Pexplore, Explore: handle starpat
3200" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003201 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3202" call Decho("set up <s-up> and <s-down> maps")
3203 let s:didstarstar= 1
3204 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3205 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3206 endif
3207
3208 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003209" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003210 if !exists("w:netrw_explore_indx")
3211 let w:netrw_explore_indx= 0
3212 endif
3213 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003214" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003215"
3216 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003217 " Nexplore
3218" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003219 if !exists("w:netrw_explore_list") " sanity check
3220 call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
3221 silent! let @* = keepregstar
3222 silent! let @+ = keepregstar
3223 silent! let @/ = keepregslash
3224" call Dret("netrw#Explore")
3225 return
3226 endif
3227 let indx= w:netrw_explore_indx
3228 if indx < 0 | let indx= 0 | endif
3229 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3230 let curfile= w:netrw_explore_list[indx]
3231" call Decho("indx=".indx." curfile<".curfile.">")
3232 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3233 let indx= indx + 1
3234" call Decho("indx=".indx." (Nexplore while loop)")
3235 endwhile
3236 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3237" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3238
3239 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003240 " Pexplore
3241" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003242 if !exists("w:netrw_explore_list") " sanity check
3243 call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
3244 silent! let @* = keepregstar
3245 silent! let @+ = keepregstar
3246 silent! let @/ = keepregslash
3247" call Dret("netrw#Explore")
3248 return
3249 endif
3250 let indx= w:netrw_explore_indx
3251 if indx < 0 | let indx= 0 | endif
3252 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3253 let curfile= w:netrw_explore_list[indx]
3254" call Decho("indx=".indx." curfile<".curfile.">")
3255 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3256 let indx= indx - 1
3257" call Decho("indx=".indx." (Pexplore while loop)")
3258 endwhile
3259 if indx < 0 | let indx= 0 | endif
3260" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3261
3262 else
3263 " Explore -- initialize
3264 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003265" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003266 let w:netrw_explore_indx= 0
3267 if !exists("b:netrw_curdir")
3268 let b:netrw_curdir= getcwd()
3269 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003270" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003271
Bram Moolenaar446cb832008-06-24 21:56:24 +00003272 " switch on starpat to build the w:netrw_explore_list of files
3273 if starpat == 1
3274 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3275" call Decho("starpat=".starpat.": build *//pattern list")
3276 exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
3277 let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
3278 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3279
3280 elseif starpat == 2
3281 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3282" call Decho("starpat=".starpat.": build **//pattern list")
3283 try
3284 exe "silent vimgrep /".pattern."/gj "."**/*"
3285 catch /^Vim\%((\a\+)\)\=:E480/
3286 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003287 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003288 silent! let @* = keepregstar
3289 silent! let @+ = keepregstar
3290 silent! let @/ = keepregslash
3291" call Dret("netrw#Explore : no files matched pattern")
3292 return
3293 endtry
3294 let s:netrw_curdir = b:netrw_curdir
3295 let w:netrw_explore_list = getqflist()
3296 let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
3297
3298 elseif starpat == 3
3299 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3300" call Decho("starpat=".starpat.": build */filepat list")
3301 let dirname = substitute(dirname,'^\*/','','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003302 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3303 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003304
3305 elseif starpat == 4
3306 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3307" call Decho("starpat=".starpat.": build **/filepat list")
3308 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3309 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3310 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003311
3312 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003313" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3314" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003315
3316 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3317 call netrw#ErrorMsg(s:WARNING,"no files matched",42)
3318 silent! let @* = keepregstar
3319 silent! let @+ = keepregstar
3320 silent! let @/ = keepregslash
3321" call Dret("netrw#Explore : no files matched")
3322 return
3323 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003324 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003325
3326 " NetrwStatusLine support - for exploring support
3327 let w:netrw_explore_indx= indx
3328" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
3329
3330 " wrap the indx around, but issue a note
3331 if indx >= w:netrw_explore_listlen || indx < 0
3332" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3333 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3334 let w:netrw_explore_indx= indx
3335 call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
3336 sleep 1
3337 endif
3338
3339 exe "let dirfile= w:netrw_explore_list[".indx."]"
3340" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3341 let newdir= substitute(dirfile,'/[^/]*$','','e')
3342" call Decho("newdir<".newdir.">")
3343
3344" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3345 call netrw#LocalBrowseCheck(newdir)
3346 if !exists("w:netrw_liststyle")
3347 let w:netrw_liststyle= g:netrw_liststyle
3348 endif
3349 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
3350 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3351 else
3352 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3353 endif
3354 let w:netrw_explore_mtchcnt = indx + 1
3355 let w:netrw_explore_bufnr = bufnr("%")
3356 let w:netrw_explore_line = line(".")
3357 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3358" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3359
3360 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003361" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003362 if !exists("g:netrw_quiet")
3363 call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3364 endif
3365 silent! let @* = keepregstar
3366 silent! let @+ = keepregstar
3367 silent! let @/ = keepregslash
3368" call Dret("netrw#Explore : missing +path_extra")
3369 return
3370 endif
3371
3372 else
3373" call Decho("case Explore newdir<".dirname.">")
3374 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
3375 silent! unlet w:netrw_treedict
3376 silent! unlet w:netrw_treetop
3377 endif
3378 let newdir= dirname
3379 if !exists("b:netrw_curdir")
3380 call netrw#LocalBrowseCheck(getcwd())
3381 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003382 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003383 endif
3384 endif
3385
Bram Moolenaar446cb832008-06-24 21:56:24 +00003386 " visual display of **/ **// */ Exploration files
3387 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
3388 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3389 " only update match list if current directory isn't the same as before
3390 let s:explore_prvdir = b:netrw_curdir
3391 let s:explore_match = ""
3392 let dirlen = strlen(b:netrw_curdir)
3393 if b:netrw_curdir !~ '/$'
3394 let dirlen= dirlen + 1
3395 endif
3396 let prvfname= ""
3397 for fname in w:netrw_explore_list
3398" call Decho("fname<".fname.">")
3399 if fname =~ '^'.b:netrw_curdir
3400 if s:explore_match == ""
3401 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3402 else
3403 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3404 endif
3405 elseif fname !~ '^/' && fname != prvfname
3406 if s:explore_match == ""
3407 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3408 else
3409 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3410 endif
3411 endif
3412 let prvfname= fname
3413 endfor
3414" call Decho("explore_match<".s:explore_match.">")
3415 exe "2match netrwMarkFile /".s:explore_match."/"
3416 endif
3417 echo "<s-up>==Pexplore <s-down>==Nexplore"
3418 else
3419 2match none
3420 if exists("s:explore_match") | unlet s:explore_match | endif
3421 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3422 echo " "
3423" call Decho("cleared explore match list")
3424 endif
3425
Bram Moolenaar9964e462007-05-05 17:54:07 +00003426 silent! let @* = keepregstar
3427 silent! let @+ = keepregstar
3428 silent! let @/ = keepregslash
3429" call Dret("netrw#Explore : @/<".@/.">")
3430endfun
3431
3432" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003433" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
3434" and switches the hiding mode. The actual hiding is done by
3435" s:NetrwListHide().
3436" g:netrw_hide= 0: show all
3437" 1: show not-hidden files
3438" 2: show hidden files only
3439fun! s:NetrwHide(islocal)
3440" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
3441 let svpos= netrw#NetrwSavePosn()
3442
3443 if exists("s:netrwmarkfilelist_{bufnr('%')}")
3444" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
3445" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
3446
3447 " hide the files in the markfile list
3448 for fname in s:netrwmarkfilelist_{bufnr("%")}
3449" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
3450 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
3451 " remove fname from hiding list
3452 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
3453 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
3454 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
3455" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
3456 else
3457 " append fname to hiding list
3458 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
3459 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
3460 else
3461 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
3462 endif
3463" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
3464 endif
3465 endfor
3466 unlet s:netrwmarkfilelist_{bufnr("%")}
3467 unlet s:netrwmarkfilemtch_{bufnr("%")}
3468 2match none
3469 let g:netrw_hide= 1
3470
3471 else
3472
3473 " switch between show-all/show-not-hidden/show-hidden
3474 let g:netrw_hide=(g:netrw_hide+1)%3
3475 exe "norm! 0"
3476 if g:netrw_hide && g:netrw_list_hide == ""
3477 call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
3478" call Dret("NetrwHide")
3479 return
3480 endif
3481 endif
3482
3483 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3484 call netrw#NetrwRestorePosn(svpos)
3485" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003486endfun
3487
3488" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003489" s:NetrwHidden: invoked by "gh" {{{2
3490fun! s:NetrwHidden(islocal)
3491" call Dfunc("s:NetrwHidden()")
3492 " save current position
3493 let svpos= netrw#NetrwSavePosn()
3494
3495 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
3496 " remove pattern from hiding list
3497 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
3498 elseif strlen(g:netrw_list_hide) >= 1
3499 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
3500 else
3501 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
3502 endif
3503
3504 " refresh screen and return to saved position
3505 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3506 call netrw#NetrwRestorePosn(svpos)
3507" call Dret("s:NetrwHidden")
3508endfun
3509
3510" ---------------------------------------------------------------------
3511" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
3512fun! s:NetrwLeftmouse(islocal)
3513" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
3514 if a:islocal
3515 if exists("b:netrw_curdir")
3516 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
3517 endif
3518 else
3519 if exists("b:netrw_curdir")
3520 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
3521 endif
3522 endif
3523" call Dret("s:NetrwLeftmouse")
3524endfun
3525
3526" ---------------------------------------------------------------------
3527" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
3528" separated patterns given in g:netrw_list_hide
3529fun! s:NetrwListHide()
3530" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
3531
3532 " find a character not in the "hide" string to use as a separator for :g and :v commands
3533 " How-it-works: take the hiding command, convert it into a range. Duplicate
3534 " characters don't matter. Remove all such characters from the '/~...90'
3535 " string. Use the first character left as a separator character.
3536 let listhide= g:netrw_list_hide
3537 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
3538" call Decho("sep=".sep)
3539
3540 while listhide != ""
3541 if listhide =~ ','
3542 let hide = substitute(listhide,',.*$','','e')
3543 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
3544 else
3545 let hide = listhide
3546 let listhide = ""
3547 endif
3548
3549 " Prune the list by hiding any files which match
3550 if g:netrw_hide == 1
3551" call Decho("hiding<".hide."> listhide<".listhide.">")
3552 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
3553 elseif g:netrw_hide == 2
3554" call Decho("showing<".hide."> listhide<".listhide.">")
3555 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
3556 endif
3557 endwhile
3558 if g:netrw_hide == 2
3559 exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
3560 exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
3561 endif
3562
3563" call Dret("NetrwListHide")
3564endfun
3565
3566" ---------------------------------------------------------------------
3567" NetrwHideEdit: allows user to edit the file/directory hiding list
3568fun! s:NetrwHideEdit(islocal)
3569" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
3570
3571 " save current cursor position
3572 let svpos= netrw#NetrwSavePosn()
3573
3574 " get new hiding list from user
3575 call inputsave()
3576 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
3577 call inputrestore()
3578 let g:netrw_list_hide= newhide
3579" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
3580
3581 " refresh the listing
3582 silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
3583
3584 " restore cursor position
3585 call netrw#NetrwRestorePosn(svpos)
3586
3587" call Dret("NetrwHideEdit")
3588endfun
3589
3590" ---------------------------------------------------------------------
3591" NetSortSequence: allows user to edit the sorting sequence
3592fun! s:NetSortSequence(islocal)
3593" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
3594
3595 let svpos= netrw#NetrwSavePosn()
3596 call inputsave()
3597 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
3598 call inputrestore()
3599
3600 " refresh the listing
3601 let g:netrw_sort_sequence= newsortseq
3602 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3603 call netrw#NetrwRestorePosn(svpos)
3604
3605" call Dret("NetSortSequence")
3606endfun
3607
3608" ---------------------------------------------------------------------
3609" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
3610fun! s:NetrwMakeDir(usrhost)
3611" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
3612
3613 " get name of new directory from user. A bare <CR> will skip.
3614 " if its currently a directory, also request will be skipped, but with
3615 " a message.
3616 call inputsave()
3617 let newdirname= input("Please give directory name: ")
3618 call inputrestore()
3619" call Decho("newdirname<".newdirname.">")
3620
3621 if newdirname == ""
3622" call Dret("NetrwMakeDir : user aborted with bare <cr>")
3623 return
3624 endif
3625
3626 if a:usrhost == ""
3627" call Decho("local mkdir")
3628
3629 " Local mkdir:
3630 " sanity checks
3631 let fullnewdir= b:netrw_curdir.'/'.newdirname
3632" call Decho("fullnewdir<".fullnewdir.">")
3633 if isdirectory(fullnewdir)
3634 if !exists("g:netrw_quiet")
3635 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
3636 endif
3637" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
3638 return
3639 endif
3640 if s:FileReadable(fullnewdir)
3641 if !exists("g:netrw_quiet")
3642 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
3643 endif
3644" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
3645 return
3646 endif
3647
3648 " requested new local directory is neither a pre-existing file or
3649 " directory, so make it!
3650 if exists("*mkdir")
3651 call mkdir(fullnewdir,"p")
3652 else
3653 let netrw_origdir= s:NetrwGetcwd(1)
3654 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
3655" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003656" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
3657 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003658 if !g:netrw_keepdir
3659 exe 'keepjumps lcd '.fnameescape(netrw_origdir)
3660" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
3661 endif
3662 endif
3663
3664 if v:shell_error == 0
3665 " refresh listing
3666" call Decho("refresh listing")
3667 let svpos= netrw#NetrwSavePosn()
3668 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
3669 call netrw#NetrwRestorePosn(svpos)
3670 elseif !exists("g:netrw_quiet")
3671 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
3672 endif
3673" redraw!
3674
3675 elseif !exists("b:netrw_method") || b:netrw_method == 4
3676 " Remote mkdir:
3677" call Decho("remote mkdir")
3678 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
3679 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00003680" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1))
3681 exe "silent! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003682 if v:shell_error == 0
3683 " refresh listing
3684 let svpos= netrw#NetrwSavePosn()
3685 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
3686 call netrw#NetrwRestorePosn(svpos)
3687 elseif !exists("g:netrw_quiet")
3688 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
3689 endif
3690" redraw!
3691
3692 elseif b:netrw_method == 2
3693 " COMBAK -- future work
3694 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3695 elseif b:netrw_method == 3
3696 " COMBAK -- future work
3697 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3698 endif
3699
3700" call Dret("NetrwMakeDir")
3701endfun
3702
3703" ---------------------------------------------------------------------
3704" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
3705" mark and unmark files. If a markfile list exists,
3706" then the rename and delete functions will use it instead
3707" of whatever may happen to be under the cursor at that
3708" moment. When the mouse and gui are available,
3709" shift-leftmouse may also be used to mark files.
3710fun! s:NetrwMarkFile(islocal,fname)
3711" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
3712 let curbufnr= bufnr("%")
3713 let curdir = b:netrw_curdir
3714 if exists("s:netrwmarkfilelist_{curbufnr}")
3715 " markfile list exists
3716" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3717" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
3718
3719 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
3720 " append filename to local-directory markfilelist
3721" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3722 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3723 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3724
3725 else
3726 " remove filename from local markfilelist
3727" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3728 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
3729 if s:netrwmarkfilelist_{curbufnr} == []
3730 " local markfilelist is empty; remove it entirely
3731" call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
3732 call s:NetrwUnmarkList(curbufnr,curdir)
3733 else
3734 " rebuild match list to display markings correctly
3735" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
3736 let s:netrwmarkfilemtch_{curbufnr}= ""
3737 let first = 1
3738 for fname in s:netrwmarkfilelist_{curbufnr}
3739 if first
3740 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3741 else
3742 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3743 endif
3744 let first= 0
3745 endfor
3746" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3747" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3748 endif
3749 endif
3750
3751 else
3752 " initialize new markfilelist
3753
3754" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
3755 let s:netrwmarkfilelist_{curbufnr}= []
3756 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3757" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3758
3759 " build initial markfile matching pattern
3760 if a:fname =~ '/$'
3761 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
3762 else
3763 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
3764 endif
3765" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3766 endif
3767
3768 " handle global markfilelist
3769 if exists("s:netrwmarkfilelist")
3770 let dname= s:ComposePath(b:netrw_curdir,a:fname)
3771 if index(s:netrwmarkfilelist,dname) == -1
3772 " append new filename to global markfilelist
3773 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3774" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
3775 else
3776 " remove new filename from global markfilelist
3777" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
3778 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
3779" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
3780 if s:netrwmarkfilelist == []
3781 unlet s:netrwmarkfilelist
3782 endif
3783 endif
3784 else
3785 " initialize new global-directory markfilelist
3786 let s:netrwmarkfilelist= []
3787 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3788" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
3789 endif
3790
3791 " set up 2match'ing to netrwmarkfilemtch list
3792 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
3793" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
3794 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
3795 else
3796" call Decho("2match none")
3797 2match none
3798 endif
3799" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
3800endfun
3801
3802" ---------------------------------------------------------------------
3803" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
3804" compress/decompress files using the programs
3805" in g:netrw_compress and g:netrw_uncompress,
3806" using g:netrw_compress_suffix to know which to
3807" do. By default:
3808" g:netrw_compress = "gzip"
3809" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
3810fun! s:NetrwMarkFileCompress(islocal)
3811" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
3812 let svpos = netrw#NetrwSavePosn()
3813 let curdir = b:netrw_curdir
3814 let curbufnr = bufnr("%")
3815
3816 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
3817 for fname in s:netrwmarkfilelist_{curbufnr}
3818 " for every filename in the marked list
3819 for sfx in sort(keys(g:netrw_decompress))
3820 if fname =~ '\'.sfx.'$'
3821 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaarc236c162008-07-13 17:41:49 +00003822 let exe= s:WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00003823" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
3824 if a:islocal
3825 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00003826 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003827 endif
3828 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00003829 let fname= shellescape(b:netrw_curdir.fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003830 endif
3831 if executable(exe)
3832 if a:islocal
3833 call system(exe." ".fname)
3834 else
3835 call s:RemoteSystem(exe." ".fname)
3836 endif
3837 else
3838 call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
3839 endif
3840 break
3841 endif
3842 endfor
3843 if exists("exe")
3844 unlet exe
3845 elseif a:islocal
3846 " fname not a compressed file, so compress it
Bram Moolenaarc236c162008-07-13 17:41:49 +00003847 call system(s:WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003848 else
3849 " fname not a compressed file, so compress it
Bram Moolenaarc236c162008-07-13 17:41:49 +00003850 call s:RemoteSystem(s:WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003851 endif
3852 endfor
3853 call s:NetrwUnmarkList(curbufnr,curdir)
3854 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3855 call netrw#NetrwRestorePosn(svpos)
3856 endif
3857" call Dret("s:NetrwMarkFileCompress")
3858endfun
3859
3860" ---------------------------------------------------------------------
3861" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
3862" If no marked files, then set up directory as the
3863" target. Currently does not support copying entire
3864" directories. Uses the local-buffer marked file list.
3865" Returns 1=success (used by NetrwMarkFileMove())
3866" 0=failure
3867fun! s:NetrwMarkFileCopy(islocal)
3868" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
3869
3870 " sanity checks
3871 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
3872 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
3873" call Dret("s:NetrwMarkFileCopy 0")
3874 return 0
3875 endif
3876" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
3877 if !exists("s:netrwmftgt")
3878 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
3879" call Dret("s:NetrwMarkFileCopy 0")
3880 return 0
3881 endif
3882" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
3883 let curdir = b:netrw_curdir
3884 let curbufnr = bufnr("%")
3885
3886 if a:islocal && s:netrwmftgt_islocal
3887 " Copy marked files, local directory to local directory
3888" call Decho("copy from local to local")
3889 let args= join(map(copy(s:netrwmarkfilelist_{bufnr('%')}),"b:netrw_curdir.\"/\".shellescape(v:val)"))
3890" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003891 call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003892
3893 elseif a:islocal && !s:netrwmftgt_islocal
3894 " Copy marked files, local directory to remote directory
3895" call Decho("copy from local to remote")
3896 call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3897
3898 elseif !a:islocal && s:netrwmftgt_islocal
3899" call Decho("copy from remote to local")
3900 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3901
3902 elseif !a:islocal && !s:netrwmftgt_islocal
3903" call Decho("copy from remote to remote")
3904 let curdir = getcwd()
3905 let tmpdir = s:GetTempfile("")
3906 if tmpdir !~ '/'
3907 let tmpdir= curdir."/".tmpdir
3908 endif
3909 if exists("*mkdir")
3910 call mkdir(tmpdir)
3911 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00003912 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003913 endif
3914 if isdirectory(tmpdir)
3915 exe "keepjumps lcd ".fnameescape(tmpdir)
3916 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
3917 let localfiles= map(copy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
3918 call s:NetrwUpload(localfiles,s:netrwmftgt)
3919 if getcwd() == tmpdir
3920 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaarc236c162008-07-13 17:41:49 +00003921 call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003922 endfor
3923 exe "keepjumps lcd ".fnameescape(curdir)
Bram Moolenaarc236c162008-07-13 17:41:49 +00003924 exe "silent !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003925 else
3926 exe "keepjumps lcd ".fnameescape(curdir)
3927 endif
3928 endif
3929 endif
3930
3931 " -------
3932 " cleanup
3933 " -------
3934" call Decho("cleanup")
3935
3936 " remove markings from local buffer
3937 call s:NetrwUnmarkList(curbufnr,curdir)
3938
3939 " refresh buffers
3940 if !s:netrwmftgt_islocal
3941 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
3942 endif
3943 if a:islocal
3944 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
3945 endif
3946 call s:LocalBrowseShellCmdRefresh()
3947
3948" call Dret("s:NetrwMarkFileCopy 1")
3949 return 1
3950endfun
3951
3952" ---------------------------------------------------------------------
3953" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
3954" invoke vim's diff mode on the marked files.
3955" Either two or three files can be so handled.
3956" Uses the global marked file list.
3957fun! s:NetrwMarkFileDiff(islocal)
3958" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
3959 let curbufnr= bufnr("%")
3960 if exists("s:netrwmarkfilelist_{curbufnr}")
3961
3962 let cnt = 0
3963 let curdir = b:netrw_curdir
3964 for fname in s:netrwmarkfilelist
3965 let cnt= cnt + 1
3966 if !a:islocal
3967 let fname= curdir.fname
3968 endif
3969 if cnt == 1
3970" call Decho("diffthis: ".fname)
3971 exe "e ".fname
3972 diffthis
3973 elseif cnt == 2 || cnt == 3
3974 vsplit
3975 wincmd l
3976" call Decho("diffthis: ".fname)
3977 exe "e ".fname
3978 diffthis
3979 else
3980 break
3981 endif
3982 endfor
3983 call s:NetrwUnmarkList(curbufnr,curdir)
3984 endif
3985" call Dret("s:NetrwMarkFileDiff")
3986endfun
3987
3988" ---------------------------------------------------------------------
3989" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
3990" Uses global markfilelist
3991fun! s:NetrwMarkFileEdit(islocal)
3992" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
3993
3994 let curdir = b:netrw_curdir
3995 let curbufnr = bufnr("%")
3996 if exists("s:netrwmarkfilelist_{curbufnr}")
3997 call s:SetRexDir(a:islocal,curdir)
3998 if a:islocal && g:netrw_keepdir
3999 " use complete paths if its local and keepdir enabled
4000 let flist= ""
4001 for fname in s:netrwmarkfilelist
4002" let flist= flist." ".s:ComposePath(curdir,fname)
4003 let flist= flist." ".fname
4004 endfor
4005 else
4006" let flist= substitute(escape(join(s:netrwmarkfilelist_{curbufnr},"\t"),' '),"\t",' ','g')
4007 let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g')
4008 endif
4009 " unmark markedfile list
4010" call s:NetrwUnmarkList(curbufnr,curdir)
4011 call s:NetrwUnmarkAll()
4012" call Decho("exe silent args ".flist)
4013 exe "silent args ".flist
4014 endif
4015
4016" call Dret("s:NetrwMarkFileEdit")
4017endfun
4018
4019" ---------------------------------------------------------------------
4020" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4021" Uses the local marked-file list.
4022fun! s:NetrwMarkFileExe(islocal)
4023" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4024 let svpos = netrw#NetrwSavePosn()
4025 let curdir = b:netrw_curdir
4026 let curbufnr = bufnr("%")
4027
4028 if exists("s:netrwmarkfilelist_{curbufnr}")
4029 " get the command
4030 call inputsave()
4031 let cmd= input("Enter command: ","","file")
4032 call inputrestore()
4033" call Decho("cmd<".cmd.">")
4034
4035 " apply command to marked files. Substitute: filename -> %
4036 " If no %, then append a space and the filename to the command
4037 for fname in s:netrwmarkfilelist_{curbufnr}
4038 if a:islocal
4039 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004040 let fname= shellescape(s:WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004041 endif
4042 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004043 let fname= shellescape(s:WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004044 endif
4045 if cmd =~ '%'
4046 let xcmd= substitute(cmd,'%',fname,'g')
4047 else
4048 let xcmd= cmd.' '.fname
4049 endif
4050 if a:islocal
4051" call Decho("local: xcmd<".xcmd.">")
4052 let ret= system(xcmd)
4053 else
4054" call Decho("remote: xcmd<".xcmd.">")
4055 let ret= s:RemoteSystem(xcmd)
4056 endif
4057 if v:shell_error < 0
4058 call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
4059 break
4060 else
4061 echo ret
4062 endif
4063 endfor
4064
4065 " unmark marked file list
4066 call s:NetrwUnmarkList(curbufnr,curdir)
4067
4068 " refresh the listing
4069 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4070 call netrw#NetrwRestorePosn(svpos)
4071 else
4072 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4073 endif
4074
4075" call Dret("s:NetrwMarkFileExe")
4076endfun
4077
4078" ---------------------------------------------------------------------
4079" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4080" as the marked file(s) (toggles suffix presence)
4081" Uses the local marked file list.
4082fun! s:NetrwMarkHideSfx(islocal)
4083" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4084 let svpos = netrw#NetrwSavePosn()
4085 let curbufnr = bufnr("%")
4086
4087 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4088 if exists("s:netrwmarkfilelist_{curbufnr}")
4089
4090 for fname in s:netrwmarkfilelist_{curbufnr}
4091" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4092 " construct suffix pattern
4093 if fname =~ '\.'
4094 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4095 else
4096 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4097 endif
4098 " determine if its in the hiding list or not
4099 let inhidelist= 0
4100 if g:netrw_list_hide != ""
4101 let itemnum = 0
4102 let hidelist= split(g:netrw_list_hide,',')
4103 for hidepat in hidelist
4104 if sfxpat == hidepat
4105 let inhidelist= 1
4106 break
4107 endif
4108 let itemnum= itemnum + 1
4109 endfor
4110 endif
4111" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4112 if inhidelist
4113 " remove sfxpat from list
4114 call remove(hidelist,itemnum)
4115 let g:netrw_list_hide= join(hidelist,",")
4116 elseif g:netrw_list_hide != ""
4117 " append sfxpat to non-empty list
4118 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4119 else
4120 " set hiding list to sfxpat
4121 let g:netrw_list_hide= sfxpat
4122 endif
4123 endfor
4124
4125 " refresh the listing
4126 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4127 call netrw#NetrwRestorePosn(svpos)
4128 else
4129 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4130 endif
4131
4132" call Dret("s:NetrwMarkHideSfx")
4133endfun
4134
4135" ---------------------------------------------------------------------
4136" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4137" Uses the global markfilelist
4138fun! s:NetrwMarkFileGrep(islocal)
4139" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4140 let svpos = netrw#NetrwSavePosn()
4141 let curdir = b:netrw_curdir
4142 let curbufnr = bufnr("%")
4143
4144 if exists("s:netrwmarkfilelist")
4145" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4146 let netrwmarkfilelist= ""
4147 for fname in s:netrwmarkfilelist
4148" call Decho("fname<".fname.">")
4149 let fname = escape(substitute(fname,"[\"']","","g")," ")
4150 let netrwmarkfilelist = netrwmarkfilelist." ".fname
4151 endfor
4152 call s:NetrwUnmarkAll()
4153
4154 " ask user for pattern
4155 call inputsave()
4156 let pat= input("Enter pattern: ","")
4157 call inputrestore()
4158 if pat !~ '^\s'
4159 if pat !~ '^/'
4160 let pat= '/'.pat.'/'
4161 endif
4162 let pat= " ".pat
4163 endif
4164
4165 " use vimgrep for both local and remote
4166" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
4167 exe "vimgrep".pat." ".netrwmarkfilelist
4168
4169 2match none
4170 call netrw#NetrwRestorePosn(svpos)
4171 endif
4172
4173" call Dret("s:NetrwMarkFileGrep")
4174endfun
4175
4176" ---------------------------------------------------------------------
4177" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4178" uses the global marked file list
4179" s:netrwmfloc= 0: target directory is remote
4180" = 1: target directory is local
4181fun! s:NetrwMarkFileMove(islocal)
4182" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4183 let curdir = b:netrw_curdir
4184 let curbufnr = bufnr("%")
4185
4186 " sanity check
4187 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4188 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4189" call Dret("s:NetrwMarkFileMove")
4190 return
4191 endif
4192" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4193 if !exists("s:netrwmftgt")
4194 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4195" call Dret("s:NetrwMarkFileCopy 0")
4196 return 0
4197 endif
4198" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4199
4200 if a:islocal && s:netrwmftgt_islocal
4201 " move: local -> local
4202" call Decho("move from local to local")
4203" call Decho("(s:NetrwMarkFileMove) local to local move")
4204 if executable(g:netrw_localmovecmd)
4205 for fname in s:netrwmarkfilelist_{bufnr("%")}
4206" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4207 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4208 if v:shell_error < 0
4209 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4210 break
4211 endif
4212 endfor
4213 else
4214 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4215 endif
4216
4217 elseif a:islocal && !s:netrwmftgt_islocal
4218 " move: local -> remote
4219" call Decho("move from local to remote")
4220" call Decho("copy")
4221 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4222 call s:NetrwMarkFileCopy(a:islocal)
4223" call Decho("remove")
4224 for fname in mflist
4225 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4226 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4227 endfor
4228 unlet mflist
4229
4230 elseif !a:islocal && s:netrwmftgt_islocal
4231 " move: remote -> local
4232" call Decho("move from remote to local")
4233" call Decho("copy")
4234 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4235 call s:NetrwMarkFileCopy(a:islocal)
4236" call Decho("remove")
4237 for fname in mflist
4238 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4239 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4240 endfor
4241 unlet mflist
4242
4243 elseif !a:islocal && !s:netrwmftgt_islocal
4244 " move: remote -> remote
4245" call Decho("move from remote to remote")
4246" call Decho("copy")
4247 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4248 call s:NetrwMarkFileCopy(a:islocal)
4249" call Decho("remove")
4250 for fname in mflist
4251 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4252 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4253 endfor
4254 unlet mflist
4255 endif
4256
4257 " -------
4258 " cleanup
4259 " -------
4260" call Decho("cleanup")
4261
4262 " remove markings from local buffer
4263 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
4264
4265 " refresh buffers
4266 if !s:netrwmftgt_islocal
4267 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4268 endif
4269 if a:islocal
4270 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4271 endif
4272 call s:LocalBrowseShellCmdRefresh()
4273
4274" call Dret("s:NetrwMarkFileMove")
4275endfun
4276
4277" ---------------------------------------------------------------------
4278" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
4279" using the hardcopy command. Local marked-file list only.
4280fun! s:NetrwMarkFilePrint(islocal)
4281" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
4282 let curbufnr= bufnr("%")
4283 if exists("s:netrwmarkfilelist_{curbufnr}")
4284 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4285 let curdir = b:netrw_curdir
4286 call s:NetrwUnmarkList(curbufnr,curdir)
4287 for fname in netrwmarkfilelist
4288 if a:islocal
4289 if g:netrw_keepdir
4290 let fname= s:ComposePath(curdir,fname)
4291 endif
4292 else
4293 let fname= curdir.fname
4294 endif
4295 1split
4296 " the autocmds will handle both local and remote files
4297" call Decho("exe silent e ".escape(fname,' '))
4298 exe "silent e ".escape(fname,' ')
4299" call Decho("hardcopy")
4300 hardcopy
4301 q
4302 endfor
4303 2match none
4304 endif
4305" call Dret("s:NetrwMarkFilePrint")
4306endfun
4307
4308" ---------------------------------------------------------------------
4309" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
4310" files when given a regexp (for which a prompt is
4311" issued).
4312fun! s:NetrwMarkFileRegexp(islocal)
4313" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
4314
4315 " get the regular expression
4316 call inputsave()
4317 let regexp= input("Enter regexp: ","","file")
4318 call inputrestore()
4319
4320 if a:islocal
4321 " get the matching list of files using local glob()
4322" call Decho("handle local regexp")
4323 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
4324 let filelist = glob(s:ComposePath(dirname,regexp))
4325 if filelist != ""
4326 let filelist= filelist."\n"
4327 endif
4328
4329 " mark the list of files
4330 while filelist != ""
4331 if filelist =~ '\n'
4332 let filename = substitute(filelist,'\n.*$','','e')
4333 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
4334 else
4335 let filename = filelist
4336 let filelist = ""
4337 endif
4338" call Decho("filelist<".filelist.">")
4339" call Decho("filename<".filename.">")
4340 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4341 endwhile
4342
4343 else
4344" call Decho("handle remote regexp")
4345
4346 " convert displayed listing into a filelist
4347 let eikeep = &ei
4348 let areg = @a
4349 silent %y a
4350 set ei=all ma
4351" call Decho("set ei=all ma")
4352 1split
4353 enew
4354 silent norm! "ap
4355 2
4356 let bannercnt= search('^" =====','W')
4357 exe "silent 1,".bannercnt."d"
4358 set bt=nofile
4359 if g:netrw_liststyle == s:LONGLIST
4360 silent %s/\s\{2,}\S.*$//e
4361 elseif g:netrw_liststyle == s:WIDELIST
4362 silent %s/\s\{2,}/\r/ge
4363 elseif g:netrw_liststyle == s:TREELIST
4364 silent %s/^| //e
4365 silent! g/^ .*$/d
4366 endif
4367 " convert regexp into the more usual glob-style format
4368 let regexp= substitute(regexp,'\*','.*','g')
4369" call Decho("regexp<".regexp.">")
4370 exe "silent! v/".escape(regexp,'/')."/d"
4371 let filelist= getline(1,line("$"))
4372 q!
4373 for filename in filelist
4374 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4375 endfor
4376 unlet filelist
4377 let @a = areg
4378 let &ei = eikeep
4379 endif
4380
4381" call Dret("s:NetrwMarkFileRegexp")
4382endfun
4383
4384" ---------------------------------------------------------------------
4385" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
4386" Uses the local marked file list.
4387fun! s:NetrwMarkFileSource(islocal)
4388" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
4389 let curbufnr= bufnr("%")
4390 if exists("s:netrwmarkfilelist_{curbufnr}")
4391 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
4392 let curdir = b:netrw_curdir
4393 call s:NetrwUnmarkList(curbufnr,curdir)
4394 for fname in netrwmarkfilelist
4395 if a:islocal
4396 if g:netrw_keepdir
4397 let fname= s:ComposePath(curdir,fname)
4398 endif
4399 else
4400 let fname= curdir.fname
4401 endif
4402 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00004403" call Decho("exe so ".fnameescape(fname))
4404 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004405 endfor
4406 2match none
4407 endif
4408" call Dret("s:NetrwMarkFileSource")
4409endfun
4410
4411" ---------------------------------------------------------------------
4412" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
4413" Uses the global markfilelist
4414fun! s:NetrwMarkFileTag(islocal)
4415" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
4416 let svpos = netrw#NetrwSavePosn()
4417 let curdir = b:netrw_curdir
4418 let curbufnr = bufnr("%")
4419
4420 if exists("s:netrwmarkfilelist")
4421" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4422 if a:islocal && g:netrw_keepdir
4423 let netrwmarkfilelist= ""
4424 for fname in s:netrwmarkfilelist
4425" let netrwmarkfilelist= netrwmarkfilelist." ".s:ComposePath(curdir,fname)
4426 let netrwmarkfilelist= netrwmarkfilelist." ".fname
4427 endfor
4428 else
4429 let netrwmarkfilelist= string(s:netrwmarkfilelist)
4430 let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g')
4431 endif
4432 call s:NetrwUnmarkAll()
4433
4434 if a:islocal
4435 if executable(g:netrw_ctags)
4436 call map(netrwmarkfilelist,"shellescape(v:val)")
4437" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
4438 call system(g:netrw_ctags." ".netrwmarkfilelist)
4439 else
4440 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
4441 endif
4442 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004443 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004444 call netrw#NetrwObtain(a:islocal,"tags")
4445 let curdir= b:netrw_curdir
4446 1split
4447 e tags
4448 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
4449" call Decho("curdir<".curdir."> path<".path.">")
4450 exe '%s/\t\(\S\+\)\t/\t'.escape(path,'/').'\1\t/e'
4451 wq!
4452 endif
4453 2match none
4454 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4455 call netrw#NetrwRestorePosn(svpos)
4456 endif
4457
4458" call Dret("s:NetrwMarkFileTag")
4459endfun
4460
4461" ---------------------------------------------------------------------
4462" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
4463" Sets up two variables,
4464" s:netrwmftgt : holds the target directory
4465" s:netrwmftgt_islocal : 0=target directory is remote
4466" 1=target directory is local
4467fun! s:NetrwMarkFileTgt(islocal)
4468" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
4469 let svpos = netrw#NetrwSavePosn()
4470 let curdir = b:netrw_curdir
4471 let hadtgt = exists("s:netrwmftgt")
4472 if !exists("w:netrw_bannercnt")
4473 let w:netrw_bannercnt= b:netrw_bannercnt
4474 endif
4475
4476 " set up target
4477 if line(".") < w:netrw_bannercnt
4478 " if cursor in banner region, use b:netrw_curdir for the target
4479 let s:netrwmftgt= b:netrw_curdir
4480" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
4481
4482 else
4483 " get word under cursor.
4484 " * If directory, use it for the target.
4485 " * If file, use b:netrw_curdir for the target
4486 let curword= s:NetrwGetWord()
4487 let tgtdir = s:ComposePath(curdir,curword)
4488 if a:islocal && isdirectory(tgtdir)
4489 let s:netrwmftgt = tgtdir
4490" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
4491 elseif !a:islocal && tgtdir =~ '/$'
4492 let s:netrwmftgt = tgtdir
4493" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
4494 else
4495 let s:netrwmftgt = curdir
4496" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
4497 endif
4498 endif
4499 if a:islocal
4500 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
4501 let s:netrwmftgt= simplify(s:netrwmftgt)
4502" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
4503 endif
4504 if g:netrw_cygwin
4505 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
4506 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
4507 endif
4508 let s:netrwmftgt_islocal= a:islocal
4509
4510 if g:netrw_fastbrowse > 0
4511 call s:LocalBrowseShellCmdRefresh()
4512 endif
4513 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4514 call netrw#NetrwRestorePosn(svpos)
4515 if !hadtgt
4516 norm! j
4517 endif
4518
4519" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
4520endfun
4521
4522" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00004523" s:NetrwOpenFile: query user for a filename and open it {{{2
4524fun! s:NetrwOpenFile(islocal)
4525" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
4526 call inputsave()
4527 let fname= input("Enter filename: ")
4528 call inputrestore()
4529 if fname !~ '[/\\]'
4530 if exists("b:netrw_curdir")
4531 if exists("g:netrw_quiet")
4532 let netrw_quiet_keep = g:netrw_quiet
4533 endif
4534 let g:netrw_quiet = 1
4535 if b:netrw_curdir =~ '/$'
4536 exe "e ".fnameescape(b:netrw_curdir.fname)
4537 else
4538 exe "e ".fnameescape(b:netrw_curdir."/".fname)
4539 endif
4540 if exists("netrw_quiet_keep")
4541 let g:netrw_quiet= netrw_quiet_keep
4542 else
4543 unlet g:netrw_quiet
4544 endif
4545 endif
4546 else
4547 exe "e ".fnameescape(fname)
4548 endif
4549" call Dret("s:NetrwOpenFile")
4550endfun
4551
4552" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004553" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
4554fun! s:NetrwUnmarkList(curbufnr,curdir)
4555" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
4556
4557 " remove all files in local marked-file list from global list
4558 if exists("s:netrwmarkfilelist_{a:curbufnr}")
4559 for mfile in s:netrwmarkfilelist_{a:curbufnr}
4560 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
4561 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
4562 call remove(s:netrwmarkfilelist,idx) " remove from global list
4563 endfor
4564 if s:netrwmarkfilelist == []
4565 unlet s:netrwmarkfilelist
4566 endif
4567
4568 " getting rid of the local marked-file lists is easy
4569 unlet s:netrwmarkfilelist_{a:curbufnr}
4570 endif
4571 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
4572 unlet s:netrwmarkfilemtch_{a:curbufnr}
4573 endif
4574 2match none
4575" call Dret("s:NetrwUnmarkList")
4576endfun
4577
4578" ---------------------------------------------------------------------
4579" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
4580fun! s:NetrwUnmarkAll()
4581" call Dfunc("s:NetrwUnmarkAll()")
4582 if exists("s:netrwmarkfilelist")
4583 unlet s:netrwmarkfilelist
4584 endif
4585 silent call s:NetrwUnmarkAll2()
4586 2match none
4587" call Dret("s:NetrwUnmarkAll")
4588endfun
4589
4590" ---------------------------------------------------------------------
4591" s:NetrwUnmarkAll2: {{{2
4592fun! s:NetrwUnmarkAll2()
4593" call Dfunc("s:NetrwUnmarkAll2()")
4594 redir => netrwmarkfilelist_let
4595 let
4596 redir END
4597 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
4598 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
4599 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
4600 for flist in netrwmarkfilelist_list
4601 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
4602 unlet s:netrwmarkfilelist_{curbufnr}
4603 unlet s:netrwmarkfilemtch_{curbufnr}
4604 endfor
4605" call Dret("s:NetrwUnmarkAll2")
4606endfun
4607
4608" ---------------------------------------------------------------------
4609" s:NetrwUnMarkFile: {{{2
4610fun! s:NetrwUnMarkFile(islocal)
4611" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
4612 let svpos = netrw#NetrwSavePosn()
4613 let curbufnr = bufnr("%")
4614
4615 " unmark marked file list (although I expect s:NetrwUpload()
4616 " to do it, I'm just making sure)
4617 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4618" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
4619 unlet s:netrwmarkfilelist
4620 unlet s:netrwmarkfilelist_{curbufnr}
4621 unlet s:netrwmarkfilemtch_{curbufnr}
4622 2match none
4623 endif
4624
4625" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4626 call netrw#NetrwRestorePosn(svpos)
4627" call Dret("s:NetrwUnMarkFile")
4628endfun
4629
4630" ---------------------------------------------------------------------
4631" s:NetrwMenu: generates the menu for gvim and netrw {{{2
4632fun! s:NetrwMenu(domenu)
4633
4634 if !exists("g:NetrwMenuPriority")
4635 let g:NetrwMenuPriority= 80
4636 endif
4637
4638 if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
4639" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
4640
4641 if !exists("s:netrw_menu_enabled") && a:domenu
4642" call Decho("initialize menu")
4643 let s:netrw_menu_enabled= 1
4644 exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
4645 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4
4646 exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
4647 exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
4648 exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
4649 exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
4650 exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB mB'
4651 exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb'
4652 exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
4653 exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
4654 exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
4655 exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit"
4656 exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
4657 exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
4658 exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh"
4659 exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
4660 exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
4661 exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
4662 exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
4663 exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
4664 exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
4665 exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
4666 exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
4667 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
4668 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
4669 exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
4670 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
4671 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
4672 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
4673 exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
4674 exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
4675 exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
4676 exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
4677 exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
4678 exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
4679 exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
4680 exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
4681 exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
4682 exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
4683 exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
4684 exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
4685 exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
4686 exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
4687 exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
4688 exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
4689 exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
4690 exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
4691 exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
4692 exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
4693 exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
4694 exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
4695 exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
4696 let s:netrw_menucnt= 28
4697
4698 elseif !a:domenu
4699 let s:netrwcnt = 0
4700 let curwin = winnr()
4701 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
4702 exe curwin."wincmd w"
4703
4704 if s:netrwcnt <= 1
4705" call Decho("clear menus")
4706 exe 'silent! unmenu '.g:NetrwTopLvlMenu
4707" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
4708 silent! unlet s:netrw_menu_enabled
4709 endif
4710 endif
4711" call Dret("NetrwMenu")
4712 endif
4713
4714endfun
4715
4716" ---------------------------------------------------------------------
4717" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
4718" Used by the O maps (as <SID>NetrwObtain())
4719fun! s:NetrwObtain(islocal)
4720" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
4721
4722 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4723 let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
4724 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
4725 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
4726 else
4727 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
4728 endif
4729
4730" call Dret("NetrwObtain")
4731endfun
4732
4733" ---------------------------------------------------------------------
4734" netrw#NetrwObtain: {{{2
4735" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
4736" islocal=0 obtain from remote source
4737" =1 obtain from local source
4738" fname : a filename or a list of filenames
4739" tgtdir : optional place where files are to go (not present, uses getcwd())
4740fun! netrw#NetrwObtain(islocal,fname,...)
4741" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
4742 " NetrwStatusLine support - for obtaining support
4743
4744 if type(a:fname) == 1
4745 let fnamelist= [ a:fname ]
4746 elseif type(a:fname) == 3
4747 let fnamelist= a:fname
4748 else
4749 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
4750" call Dret("netrw#NetrwObtain")
4751 return
4752 endif
4753" call Decho("fnamelist<".string(fnamelist).">")
4754 if a:0 > 0
4755 let tgtdir= a:1
4756 else
4757 let tgtdir= getcwd()
4758 endif
4759" call Decho("tgtdir<".tgtdir.">")
4760
4761 if a:islocal
4762 " obtain a file from b:netrw_curdir to getcwd()
4763" call Decho("obtain a local file from ".b:netrw_curdir." to ".tgtdir
4764 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
4765 let topath= s:ComposePath(tgtdir,"")
4766 if (has("win32") || has("win95") || has("win64") || has("win16"))
4767 " transfer files one at time
4768 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00004769" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
4770 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004771 endfor
4772 else
4773 " transfer files with one command
4774 let filelist= join(map(copy(fname),"shellescape(v:val)"))
4775" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
4776 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
4777 endif
4778 elseif !exists("b:netrw_curdir")
4779 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
4780 else
4781 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
4782 endif
4783
4784 else
4785" call Decho("obtain a remote file from ".b:netrw_curdir." to ".tgtdir)
4786 if type(a:fname) == 1
4787 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
4788 endif
4789 call s:NetrwMethod(b:netrw_curdir)
4790
4791 if b:netrw_method == 4
4792 " obtain file using scp
4793" call Decho("obtain via scp (method#4)")
4794 if exists("g:netrw_port") && g:netrw_port != ""
4795 let useport= " ".g:netrw_scpport." ".g:netrw_port
4796 else
4797 let useport= ""
4798 endif
4799 if b:netrw_fname =~ '/'
4800 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
4801 else
4802 let path= ""
4803 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00004804 let filelist= join(map(copy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1))'))
4805" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
4806 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004807
4808 elseif b:netrw_method == 2
4809 " obtain file using ftp + .netrc
4810" call Decho("obtain via ftp+.netrc (method #2)")
4811 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4812 let tmpbufnr= bufnr("%")
4813 setlocal ff=unix
4814 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4815 exe "put ='".g:netrw_ftpmode."'"
4816" call Decho("filter input: ".getline('$'))
4817 endif
4818
4819 if exists("b:netrw_fname") && b:netrw_fname != ""
4820 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4821" call Decho("filter input: ".getline('$'))
4822 endif
4823
4824 if exists("g:netrw_ftpextracmd")
4825 exe "put ='".g:netrw_ftpextracmd."'"
4826" call Decho("filter input: ".getline('$'))
4827 endif
4828 for fname in fnamelist
4829 call setline(line("$")+1,'get "'.fname.'"')
4830" call Decho("filter input: ".getline('$'))
4831 endfor
4832 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00004833" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
4834 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 +00004835 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00004836" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
4837 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004838 endif
4839 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4840 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
4841 let debugkeep= &debug
4842 setlocal debug=msg
4843 call netrw#ErrorMsg(s:ERROR,getline(1),4)
4844 let &debug= debugkeep
4845 endif
4846
4847 elseif b:netrw_method == 3
4848 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
4849" call Decho("obtain via ftp+mipf (method #3)")
4850 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4851 let tmpbufnr= bufnr("%")
4852 setlocal ff=unix
4853
4854 if exists("g:netrw_port") && g:netrw_port != ""
4855 put ='open '.g:netrw_machine.' '.g:netrw_port
4856" call Decho("filter input: ".getline('$'))
4857 else
4858 put ='open '.g:netrw_machine
4859" call Decho("filter input: ".getline('$'))
4860 endif
4861
4862 if exists("g:netrw_ftp") && g:netrw_ftp == 1
4863 put =g:netrw_uid
4864" call Decho("filter input: ".getline('$'))
4865 put ='\"'.s:netrw_passwd.'\"'
4866" call Decho("filter input: ".getline('$'))
4867 else
4868 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
4869" call Decho("filter input: ".getline('$'))
4870 endif
4871
4872 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4873 put =g:netrw_ftpmode
4874" call Decho("filter input: ".getline('$'))
4875 endif
4876
4877 if exists("b:netrw_fname") && b:netrw_fname != ""
4878 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4879" call Decho("filter input: ".getline('$'))
4880 endif
4881
4882 if exists("g:netrw_ftpextracmd")
4883 exe "put ='".g:netrw_ftpextracmd."'"
4884" call Decho("filter input: ".getline('$'))
4885 endif
4886
4887 if exists("g:netrw_ftpextracmd")
4888 exe "put ='".g:netrw_ftpextracmd."'"
4889" call Decho("filter input: ".getline('$'))
4890 endif
4891 for fname in fnamelist
4892 call setline(line("$")+1,'get "'.fname.'"')
4893 endfor
4894" call Decho("filter input: ".getline('$'))
4895
4896 " perform ftp:
4897 " -i : turns off interactive prompting from ftp
4898 " -n unix : DON'T use <.netrc>, even though it exists
4899 " -n win32: quit being obnoxious about password
4900 norm! 1Gdd
4901" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
4902 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
4903 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4904 if getline(1) !~ "^$"
4905" call Decho("error<".getline(1).">")
4906 if !exists("g:netrw_quiet")
4907 call netrw#ErrorMsg(s:ERROR,getline(1),5)
4908 endif
4909 endif
4910 endif
4911
4912 endif
4913
4914 " cleanup
4915 if exists("tmpbufnr")
4916 if bufnr("%") != tmpbufnr
4917 exe tmpbufnr."bw!"
4918 else
4919 q!
4920 endif
4921 endif
4922
4923" call Dret("netrw#NetrwObtain")
4924endfun
4925
4926" ---------------------------------------------------------------------
4927" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
4928" If there's only one window, then the window will first be split.
4929" Returns:
4930" choice = 0 : didn't have to choose
4931" choice = 1 : saved modified file in window first
4932" choice = 2 : didn't save modified file, opened window
4933" choice = 3 : cancel open
4934fun! s:NetrwPrevWinOpen(islocal)
4935" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4936
4937 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
4938 let curdir = b:netrw_curdir
4939
4940 " get last window number and the word currently under the cursor
4941 let lastwinnr = winnr("$")
4942 let curword = s:NetrwGetWord()
4943 let choice = 0
4944" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4945
4946 let didsplit = 0
4947 if lastwinnr == 1
4948 " if only one window, open a new one first
4949" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4950 if g:netrw_preview
4951" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4952 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4953 else
4954" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4955 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4956 endif
4957 let didsplit = 1
4958
4959 else
4960 call s:SaveBufVars()
4961" call Decho("wincmd p")
4962 wincmd p
4963 call s:RestoreBufVars()
4964 " if the previous window's buffer has been changed (is modified),
4965 " and it doesn't appear in any other extant window, then ask the
4966 " user if s/he wants to abandon modifications therein.
4967 let bnr = winbufnr(0)
4968 let bnrcnt = 0
4969 if &mod
4970" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4971 let eikeep= &ei
4972 set ei=all
4973 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4974 exe bnr."wincmd p"
4975 let &ei= eikeep
4976" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4977 if bnrcnt == 1
4978 let bufname= bufname(winbufnr(winnr()))
4979 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4980" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4981
4982 if choice == 1
4983 " Yes -- write file & then browse
4984 let v:errmsg= ""
4985 silent w
4986 if v:errmsg != ""
4987 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4988 if didsplit
4989 q
4990 else
4991 wincmd p
4992 endif
4993" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4994 return choice
4995 endif
4996
4997 elseif choice == 2
4998 " No -- don't worry about changed file, just browse anyway
4999 setlocal nomod
5000 call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
5001 wincmd p
5002
5003 else
5004 " Cancel -- don't do this
5005 if didsplit
5006 q
5007 else
5008 wincmd p
5009 endif
5010" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5011 return choice
5012 endif
5013 endif
5014 endif
5015 endif
5016
5017 " restore b:netrw_curdir (window split/enew may have lost it)
5018 let b:netrw_curdir= curdir
5019 if a:islocal < 2
5020 if a:islocal
5021 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5022 else
5023 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5024 endif
5025 endif
5026" call Dret("NetrwPrevWinOpen ".choice)
5027 return choice
5028endfun
5029
5030" ---------------------------------------------------------------------
5031" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5032" Always assumed to be local -> remote
5033" call s:NetrwUpload(filename, target)
5034" call s:NetrwUpload(filename, target, fromdirectory)
5035fun! s:NetrwUpload(fname,tgt,...)
5036" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5037
5038 if a:tgt =~ '^\a\+://'
5039 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5040 else
5041 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5042 endif
5043" call Decho("tgtdir<".tgtdir.">")
5044
5045 if a:0 > 0
5046 let fromdir= a:1
5047 else
5048 let fromdir= getcwd()
5049 endif
5050" call Decho("fromdir<".fromdir.">")
5051
5052 if type(a:fname) == 1
5053 " handle uploading a single file using NetWrite
5054" call Decho("handle uploading a single file via NetWrite")
5055 1split
5056 let efname= escape(a:fname,g:netrw_fname_escape)
5057" call Decho("exe e ".efname)
5058 exe "e ".efname
5059" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5060 if a:tgt =~ '/$'
5061 let wfname= substitute(a:fname,'^.*/','','')
5062 let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
Bram Moolenaarc236c162008-07-13 17:41:49 +00005063" call Decho("exe w! ".fnameescape(wfname))
5064 exe "w! ".fnameescape(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)
5078 let filelist= copy(s:netrwmarkfilelist_{bufnr('%')})
5079 let args = join(map(filelist,"shellescape(v:val)"))
5080 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
5100 exe "put ='".g:netrw_ftpmode."'"
5101" call Decho("filter input: ".getline('$'))
5102
5103 if exists("g:netrw_ftpextracmd")
5104 exe "put ='".g:netrw_ftpextracmd."'"
5105" 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")
5169 exe "put ='".g:netrw_ftpextracmd."'"
5170" 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)
5213 exe (g:netrw_preview? "vert " : "")."pedit ".escape(a:path,g:netrw_fname_escape)
5214 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 Moolenaarc236c162008-07-13 17:41:49 +00006030" call Decho("1: exe silent r! ".listcmd.s:path)
6031 exe "silent r! ".listcmd.s:path
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")
6289 exe "put ='".g:netrw_ftpextracmd."'"
6290" 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")
6323 exe "put ='".g:netrw_ftpextracmd."'"
6324" 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).">")
6672 exe "silent! bd ".ibuf
6673 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
6863 let ret= rename(oldname,newname)
6864 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
6894 let ret= rename(oldname,newname)
6895" 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
7573 exe 'com! Rexplore call s:NetrwRexplore(1,"'.a:dirname.'")'
7574 if g:netrw_retmap
7575 silent! unmap <2-leftmouse>
7576 if !hasmapto("<Plug>NetrwReturn")
7577 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7578 endif
7579 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.a:dirname.'")<cr>'
7580 endif
7581 else
7582 exe 'com! Rexplore call s:NetrwRexplore(0,"'.a:dirname.'")'
7583 if g:netrw_retmap
7584 silent! unmap <2-leftmouse>
7585 if !hasmapto("<Plug>NetrwReturn")
7586 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7587 endif
7588 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.a:dirname.'")<cr>'
7589 endif
7590 endif
7591" call Dret("s:SetRexDir")
7592endfun
7593
7594" ---------------------------------------------------------------------
7595" s:Strlen: this function returns the length of a string, even if its {{{2
7596" using two-byte etc characters.
7597" Currently, its only used if g:Align_xstrlen is set to a
7598" nonzero value. Solution from Nicolai Weibull, vim docs
7599" (:help strlen()), Tony Mechelynck, and my own invention.
7600fun! s:Strlen(x)
7601" call Dfunc("s:Strlen(x<".a:x.">")
7602 if g:netrw_xstrlen == 1
7603 " number of codepoints (Latin a + combining circumflex is two codepoints)
7604 " (comment from TM, solution from NW)
7605 let ret= strlen(substitute(a:x,'.','c','g'))
7606
7607 elseif g:netrw_xstrlen == 2
7608 " number of spacing codepoints (Latin a + combining circumflex is one spacing
7609 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
7610 " (comment from TM, solution from TM)
7611 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
7612
7613 elseif g:netrw_xstrlen == 3
7614 " virtual length (counting, for instance, tabs as anything between 1 and
7615 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
7616 " preceded by lam, one otherwise, etc.)
7617 " (comment from TM, solution from me)
7618 let modkeep= &mod
7619 exe "norm! o\<esc>"
7620 call setline(line("."),a:x)
7621 let ret= virtcol("$") - 1
7622 d
7623 let &mod= modkeep
7624
7625 else
7626 " at least give a decent default
7627 ret= strlen(a:x)
7628 endif
7629" call Dret("s:Strlen ".ret)
7630 return ret
7631endfun
7632
7633" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007634" s:TreeListMove: {{{2
7635fun! s:TreeListMove(dir)
7636" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
7637 let curline = getline('.')
7638 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
7639 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
7640 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
7641 let indentm1 = substitute(curindent,'^| ','','')
7642" call Decho("prvline <".prvline."> #".line(".")-1)
7643" call Decho("curline <".curline."> #".line("."))
7644" call Decho("nxtline <".nxtline."> #".line(".")+1)
7645" call Decho("curindent<".curindent.">")
7646" call Decho("indentm1 <".indentm1.">")
7647
7648 if curline !~ '/$'
7649" call Decho('regfile')
7650 if a:dir == '[' && prvline != ''
7651 norm! 0
7652 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
7653" call Decho("regfile srch back: ".nl)
7654 elseif a:dir == ']' && nxtline != ''
7655 norm! $
7656 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
7657" call Decho("regfile srch fwd: ".nl)
7658 endif
7659
7660 elseif a:dir == '[' && prvline != ''
7661 norm! 0
7662 let curline= line(".")
7663 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
7664" call Decho("dir srch back ind: ".nl)
7665 if nl != 0
7666 if line(".") == curline-1
7667 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
7668" call Decho("dir srch back ind-1: ".nl)
7669 endif
7670 endif
7671
7672 elseif a:dir == ']' && nxtline != ''
7673 norm! $
7674 let curline = line(".")
7675 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
7676" call Decho("dir srch fwd ind: ".nl)
7677 if nl != 0
7678 if line(".") == curline+1
7679 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
7680" call Decho("dir srch fwd ind-1: ".nl)
7681 endif
7682 endif
7683
7684 endif
7685
7686" call Dret("s:TreeListMove")
7687endfun
7688
7689" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007690" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
7691" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
7692" can't be called except via emenu. But due to locale, that menu line may not be called
7693" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
7694fun! s:UpdateBuffersMenu()
7695" call Dfunc("s:UpdateBuffersMenu()")
7696 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
7697 try
7698 silent emenu Buffers.Refresh\ menu
7699 catch /^Vim\%((\a\+)\)\=:E/
7700 let v:errmsg= ""
7701 silent call s:NetrwBMShow()
7702 endtry
7703 endif
7704" call Dret("s:UpdateBuffersMenu")
7705endfun
7706
7707" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007708" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007709" Matching function to BufferWinVars()
7710fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007711" call Dfunc("s:UseBufWinVars()")
7712 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007713 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
7714 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
7715 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
7716 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
7717 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
7718 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7719 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7720 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
7721 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 +00007722" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007723endfun
7724
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007725" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007726" s:WinPath: {{{2
7727fun! s:WinPath(path)
7728" call Dfunc("s:WinPath(path<".a:path.">)")
7729 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7730 " remove trailing slash (Win95)
7731 let path = substitute(a:path, '\(\\\|/\)$', '', 'g')
7732 " remove escaped spaces
7733 let path = substitute(path, '\ ', ' ', 'g')
7734 " convert slashes to backslashes
7735 let path = substitute(path, '/', '\', 'g')
7736 else
7737 let path= a:path
7738 endif
7739" call Dret("s:WinPath <".path.">")
7740 return path
7741endfun
7742
7743" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00007744" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00007745let &cpo= s:keepcpo
7746unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00007747
Bram Moolenaar071d4272004-06-13 20:20:40 +00007748" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00007749" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00007750" vim:ts=8 fdm=marker