blob: 6064a6570dcb0fcb5993408bdc1218580dbc6d2e [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 Moolenaar446cb832008-06-24 21:56:24 +00003" Date: Jun 12, 2008
4" Version: 125
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 Moolenaar446cb832008-06-24 21:56:24 +000030let g:loaded_netrw = "v125"
31
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 +000037if !exists("*shellescape")
38 call netrw#ErrorMsg(s:ERROR,"you need to upgade your vim so that it has shellescape()",64)
39endif
40if !exists("*fnameescape")
41 call netrw#ErrorMsg(s:ERROR,"you need to upgade your vim so that it has fnameescape()",65)
42endif
43
Bram Moolenaar1afcace2005-11-25 19:54:28 +000044let s:keepcpo= &cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +000045setlocal cpo&vim
46"DechoTabOn
47"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
Bram Moolenaar071d4272004-06-13 20:20:40 +000048
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000049" ======================
50" Netrw Variables: {{{1
51" ======================
52
Bram Moolenaar071d4272004-06-13 20:20:40 +000053" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000054" Netrw Constants: {{{2
55if !exists("g:NETRW_BOOKMARKMAX")
56 let g:NETRW_BOOKMARKMAX= 0
57endif
58if !exists("g:NETRW_DIRHIST_CNT")
59 let g:NETRW_DIRHIST_CNT= 0
60endif
61if !exists("s:LONGLIST")
62 let s:THINLIST = 0
63 let s:LONGLIST = 1
64 let s:WIDELIST = 2
65 let s:TREELIST = 3
66 let s:MAXLIST = 4
67endif
68
69" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000070" Default values for netrw's global protocol variables {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +000071if !exists("g:netrw_dav_cmd")
72 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar071d4272004-06-13 20:20:40 +000073endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000074if !exists("g:netrw_fetch_cmd")
75 if executable("fetch")
76 let g:netrw_fetch_cmd = "fetch -o"
77 else
78 let g:netrw_fetch_cmd = ""
79 endif
80endif
81if !exists("g:netrw_ftp_cmd")
82 let g:netrw_ftp_cmd = "ftp"
83endif
84if !exists("g:netrw_http_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +000085 if executable("curl")
86 let g:netrw_http_cmd = "curl -o"
87 elseif executable("wget")
Bram Moolenaar1afcace2005-11-25 19:54:28 +000088 let g:netrw_http_cmd = "wget -q -O"
89 elseif executable("fetch")
90 let g:netrw_http_cmd = "fetch -o"
91 else
92 let g:netrw_http_cmd = ""
93 endif
94endif
95if !exists("g:netrw_rcp_cmd")
96 let g:netrw_rcp_cmd = "rcp"
97endif
98if !exists("g:netrw_rsync_cmd")
99 let g:netrw_rsync_cmd = "rsync"
100endif
101if !exists("g:netrw_scp_cmd")
102 let g:netrw_scp_cmd = "scp -q"
103endif
104if !exists("g:netrw_sftp_cmd")
105 let g:netrw_sftp_cmd = "sftp"
106endif
107if !exists("g:netrw_ssh_cmd")
108 let g:netrw_ssh_cmd= "ssh"
109endif
110
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000111if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000112 \ && exists("g:netrw_use_nt_rcp")
113 \ && g:netrw_use_nt_rcp
114 \ && executable( $SystemRoot .'/system32/rcp.exe')
115 let s:netrw_has_nt_rcp = 1
116 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000117else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000118 let s:netrw_has_nt_rcp = 0
119 let s:netrw_rcpmode = ''
120endif
121
122" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000123" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000124" Cygwin Detection ------- {{{3
125if !exists("g:netrw_cygwin")
126 if has("win32") || has("win95") || has("win64") || has("win16")
127 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
128 let g:netrw_cygwin= 1
129 else
130 let g:netrw_cygwin= 0
131 endif
132 else
133 let g:netrw_cygwin= 0
134 endif
135endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000136" Default values - a-c ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000137if !exists("g:netrw_alto")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000138 let g:netrw_alto= &sb
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000139endif
140if !exists("g:netrw_altv")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000141 let g:netrw_altv= &spr
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000143if !exists("g:netrw_browse_split")
144 let g:netrw_browse_split= 0
145endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000146if !exists("g:netrw_chgwin")
147 let g:netrw_chgwin = -1
148endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000149if !exists("g:netrw_compress")
150 let g:netrw_compress= "gzip"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000152if !exists("g:netrw_ctags")
153 let g:netrw_ctags= "ctags"
154endif
155" Default values - d-g ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000156if !exists("g:NETRW_DIRHIST_CNT")
157 let g:NETRW_DIRHIST_CNT= 0
158endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000159if !exists("g:netrw_decompress")
160 let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
161endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000162if !exists("g:netrw_dirhistmax")
163 let g:netrw_dirhistmax= 10
164endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000165if !exists("g:netrw_fastbrowse")
166 let g:netrw_fastbrowse= 1
167endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000168if !exists("g:netrw_ftp_browse_reject")
169 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$'
Bram Moolenaar843ee412004-06-30 16:16:41 +0000170endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000171if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000172 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
173 let g:netrw_ftp_list_cmd = "ls -lF"
174 let g:netrw_ftp_timelist_cmd = "ls -tlF"
175 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000176 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000177 let g:netrw_ftp_list_cmd = "dir"
178 let g:netrw_ftp_timelist_cmd = "dir"
179 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000180 endif
181endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000182if !exists("g:netrw_ftpmode")
183 let g:netrw_ftpmode= "binary"
Bram Moolenaar61036992005-10-12 20:54:52 +0000184endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000185" Default values - h-lh ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000186if !exists("g:netrw_hide")
187 let g:netrw_hide= 1
Bram Moolenaar61036992005-10-12 20:54:52 +0000188endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000189if !exists("g:netrw_ignorenetrc")
190 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
191 let g:netrw_ignorenetrc= 1
192 else
193 let g:netrw_ignorenetrc= 0
194 endif
195endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000196if !exists("g:netrw_keepdir")
197 let g:netrw_keepdir= 1
198endif
199if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000200 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
201 " provide a 'pscp' listing command
202 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
203 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
204 endif
205 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
206 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000207 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000208 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000209 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000210" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000211 let g:netrw_list_cmd= ""
212 endif
213endif
214if !exists("g:netrw_list_hide")
215 let g:netrw_list_hide= ""
216endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000217" Default values - lh-lz ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000218if !exists("g:netrw_localcopycmd")
219 if has("win32") || has("win95") || has("win64") || has("win16")
220 if g:netrw_cygwin
221 let g:netrw_localcopycmd= "cp"
222 else
223 let g:netrw_localcopycmd= "copy"
224 endif
225 elseif has("unix") || has("macunix")
226 let g:netrw_localcopycmd= "cp"
227 else
228 let g:netrw_localcopycmd= ""
229 endif
230endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000231if !exists("g:netrw_local_mkdir")
232 let g:netrw_local_mkdir= "mkdir"
233endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000234if !exists("g:netrw_localmovecmd")
235 if has("win32") || has("win95") || has("win64") || has("win16")
236 if g:netrw_cygwin
237 let g:netrw_localmovecmd= "mv"
238 else
239 let g:netrw_localmovecmd= "move"
240 endif
241 elseif has("unix") || has("macunix")
242 let g:netrw_localmovecmd= "mv"
243 else
244 let g:netrw_localmovecmd= ""
245 endif
246endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000247if !exists("g:netrw_local_rmdir")
248 let g:netrw_local_rmdir= "rmdir"
249endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000250if !exists("g:netrw_liststyle")
251 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000252endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000253if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000254 " sanity check
Bram Moolenaar9964e462007-05-05 17:54:07 +0000255 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000256endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000257if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000258 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
259endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000260" Default values - m-r ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000261if !exists("g:netrw_markfileesc")
262 let g:netrw_markfileesc= '*./[\~'
263endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000264if !exists("g:netrw_maxfilenamelen")
265 let g:netrw_maxfilenamelen= 32
266endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000267if !exists("g:netrw_menu")
268 let g:netrw_menu= 1
269endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000270if !exists("g:netrw_mkdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000271 let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000272endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000273if !exists("g:netrw_mousemaps")
274 if exists("&mouse") && &mouse =~ '[anh]'
275 let g:netrw_mousemaps= 1
276 else
277 let g:netrw_mousemaps= 0
278 endif
279endif
280if !exists("g:netrw_retmap")
281 let g:netrw_retmap= 0
282endif
283if !exists("g:netrw_preview")
284 let g:netrw_preview= 0
285endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000286if !exists("g:netrw_scpport")
287 let g:netrw_scpport= "-P"
288endif
289if !exists("g:netrw_sshport")
290 let g:netrw_sshport= "-p"
291endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000292if !exists("g:netrw_rename_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000293 let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000294endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000295if !exists("g:netrw_rm_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000296 let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000297endif
298if !exists("g:netrw_rmdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000299 let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000300endif
301if !exists("g:netrw_rmf_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000302 let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000303endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000304" Default values - s ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000305 " set up shell quoting character
Bram Moolenaar843ee412004-06-30 16:16:41 +0000306if exists("g:netrw_silent") && g:netrw_silent != 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000307 let s:netrw_silentxfer= "silent "
Bram Moolenaar843ee412004-06-30 16:16:41 +0000308else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000309 let s:netrw_silentxfer= ""
Bram Moolenaar9964e462007-05-05 17:54:07 +0000310endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000311if !exists("g:netrw_sort_by")
312 " alternatives: date size
313 let g:netrw_sort_by= "name"
314endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000315if !exists("g:netrw_sort_direction")
316 " alternative: reverse (z y x ...)
317 let g:netrw_sort_direction= "normal"
318endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000319if !exists("g:netrw_sort_sequence")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000320 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
321endif
322if !exists("g:netrw_special_syntax")
323 let g:netrw_special_syntax= 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000324endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000325if !exists("g:netrw_ssh_browse_reject")
326 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
327endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000328if !has("patch192")
329 if !exists("g:netrw_use_noswf")
330 let g:netrw_use_noswf= 1
331 endif
332else
333 let g:netrw_use_noswf= 0
334endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000335" Default values - t-w ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000336if !exists("g:netrw_timefmt")
337 let g:netrw_timefmt= "%c"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000338endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000339if !exists("g:netrw_xstrlen")
340 let g:netrw_xstrlen= 1
341endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000342if !exists("g:NetrwTopLvlMenu")
343 let g:NetrwTopLvlMenu= "Netrw."
344endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000345if !exists("g:netrw_use_errorwindow")
346 let g:netrw_use_errorwindow= 1
347endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000348if !exists("g:netrw_win95ftp")
349 let g:netrw_win95ftp= 1
350endif
351if !exists("g:netrw_winsize")
352 let g:netrw_winsize= ""
353endif
354" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000355" Default values for netrw's script variables: {{{2
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000356if !exists("g:netrw_fname_escape")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000357 let g:netrw_fname_escape= ' ?&;%'
358endif
359if !exists("g:netrw_glob_escape")
360 let g:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000361endif
362if !exists("g:netrw_tmpfile_escape")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000363 let g:netrw_tmpfile_escape= ' &;'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000364endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000365
366" BufEnter event ignored by decho when following variable is true
367" Has a side effect that doau BufReadPost doesn't work, so
368" files read by network transfer aren't appropriately highlighted.
369"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000371" ==============================
372" Netrw Utility Functions: {{{1
373" ==============================
374
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000376" s:NetrwOptionSave: save options and set to "standard" form {{{2
377" 06/08/07 : removed call to NetrwSafeOptions(), either placed
378" immediately after NetrwOptionSave() calls in NetRead
379" and NetWrite, or after the s:NetrwEnew() call in
380" NetrwBrowse.
381" vt: normally its "w:" or "s:" (a variable type)
382fun! s:NetrwOptionSave(vt)
383" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384
Bram Moolenaar446cb832008-06-24 21:56:24 +0000385" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
386 if !exists("{a:vt}netrw_optionsave")
387 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000388 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000389" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000390 return
391 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000392" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000393
394 " Save current settings and current directory
395 let s:yykeep = @@
396 if exists("&l:acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000397 let {a:vt}netrw_acdkeep = &l:acd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000398 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000399 let {a:vt}netrw_aikeep = &l:ai
400 let {a:vt}netrw_awkeep = &l:aw
401 let {a:vt}netrw_cikeep = &l:ci
402 let {a:vt}netrw_cinkeep = &l:cin
403 let {a:vt}netrw_cinokeep = &l:cino
404 let {a:vt}netrw_comkeep = &l:com
405 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +0000406 if g:netrw_keepdir
Bram Moolenaar446cb832008-06-24 21:56:24 +0000407 let {a:vt}netrw_dirkeep = getcwd()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000408 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000409 let {a:vt}netrw_fokeep = &l:fo " formatoptions
410 let {a:vt}netrw_gdkeep = &l:gd " gdefault
411 let {a:vt}netrw_hidkeep = &l:hidden
412 let {a:vt}netrw_magickeep = &l:magic
413 let {a:vt}netrw_repkeep = &l:report
414 let {a:vt}netrw_spellkeep = &l:spell
415 let {a:vt}netrw_twkeep = &l:tw " textwidth
416 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar9964e462007-05-05 17:54:07 +0000417 if has("win32") && !has("win95")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000418 let {a:vt}netrw_swfkeep= &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000419 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000420 if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif
421 silent! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000422
Bram Moolenaar446cb832008-06-24 21:56:24 +0000423" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000424endfun
425
426" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000427" s:NetrwOptionRestore: restore options {{{2
428fun! s:NetrwOptionRestore(vt)
429" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%"))
430 if !exists("{a:vt}netrw_optionsave")
431" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
432" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000433 return
434 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000435 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000436
437 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000438 if exists("{a:vt}netrw_acdkeep")
439" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
440 let curdir = getcwd()
441 let &l:acd = {a:vt}netrw_acdkeep
442 unlet {a:vt}netrw_acdkeep
443 if &l:acd
444" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
445 try
446 if !exists("&l:acd") && !&l:acd
447 exe 'keepjumps lcd '.fnameescape(curdir)
448 endif
449 catch /^Vim\%((\a\+)\)\=:E472/
450 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
451 endtry
452 endif
453 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000454 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000455 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
456 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
457 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
458 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
459 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
460 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
461 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
462 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
463 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
464 if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
465 endif
466 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
467 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
468 if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif
469 if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif
470 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
471 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
472 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
473 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
474 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
475 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000476 if &directory == ""
477 " user hasn't specified a swapfile directory;
478 " netrw will temporarily set the swapfile directory
479 " to the current directory as returned by getcwd().
480 let &l:directory = getcwd()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000481 silent! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000482 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000483 unlet {a:vt}netrw_swfkeep
484 elseif &l:swf != {a:vt}netrw_swfkeep
485 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
486 silent! let &l:swf= {a:vt}netrw_swfkeep
487 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000488 endif
489 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000490 if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
491 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 +0000492
Bram Moolenaar446cb832008-06-24 21:56:24 +0000493" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
494" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
495" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
496" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000497endfun
498
499" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000500" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000501fun! s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000502" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
503" call Decho("window's ft=".&ft)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000504 setlocal cino=
505 setlocal com=
506 setlocal cpo-=aA
Bram Moolenaar446cb832008-06-24 21:56:24 +0000507 if exists("&acd") | setlocal noacd | endif
508 setlocal nocin noai noci magic nospell nohid wig= noaw
509 setlocal fo=nroql2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000510 setlocal tw=0
511 setlocal report=10000
512 if g:netrw_use_noswf && has("win32") && !has("win95")
513 setlocal noswf
514 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000515" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000516" call Dret("s:NetrwSafeOptions")
517endfun
518
Bram Moolenaar446cb832008-06-24 21:56:24 +0000519" ---------------------------------------------------------------------
520" netrw#NetrwClean: remove netrw {{{2
521" supports :NetrwClean -- remove netrw from first directory on runtimepath
522" :NetrwClean! -- remove netrw from all directories on runtimepath
523fun! netrw#NetrwClean(sys)
524" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
525
526 if a:sys
527 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
528 else
529 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
530 endif
531" call Decho("choice=".choice)
532 let diddel= 0
533 let diddir= ""
534
535 if choice == 1
536 for dir in split(&rtp,',')
537 if filereadable(dir."/plugin/netrwPlugin.vim")
538" call Decho("removing netrw-related files from ".dir)
539 if s:System("delete",dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
540 if s:System("delete",dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
541 if s:System("delete",dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
542 if s:System("delete",dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
543 if s:System("delete",dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
544 if s:System("delete",dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif
545 let diddir= dir
546 let diddel= diddel + 1
547 if !a:sys|break|endif
548 endif
549 endfor
550 endif
551
552 echohl WarningMsg
553 if diddel == 0
554 echomsg "netrw is either not installed or not removable"
555 elseif diddel == 1
556 echomsg "removed one copy of netrw from <".diddir.">"
557 else
558 echomsg "removed ".diddel." copies of netrw"
559 endif
560 echohl None
561
562" call Dret("netrw#NetrwClean")
563endfun
564
Bram Moolenaar9964e462007-05-05 17:54:07 +0000565" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000566" Netrw Transfer Functions: {{{1
567" ===============================
568
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000570" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000571" mode: =0 read remote file and insert before current line
572" =1 read remote file and insert after current line
573" =2 replace with remote file
574" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000575fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000576" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000577
Bram Moolenaar9964e462007-05-05 17:54:07 +0000578 " save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000579 call s:NetrwOptionSave("w:")
580 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000581
Bram Moolenaar9964e462007-05-05 17:54:07 +0000582 " interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000583 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000584 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000585 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000586 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000587 elseif a:mode == 2 " replace with remote file
588 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000589 elseif a:mode == 3 " skip read of file (leave as temporary)
590 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000591 else
592 exe a:mode
593 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000594 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000595 let ichoice = (a:0 == 0)? 0 : 1
596" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
597
Bram Moolenaar9964e462007-05-05 17:54:07 +0000598 " Get Temporary Filename {{{3
599 let tmpfile= s:GetTempfile("")
600 if tmpfile == ""
601" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000602 return
603 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000604
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000605 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000606
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000607 " attempt to repeat with previous host-file-etc
608 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000609" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610 let choice = b:netrw_lastfile
611 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000612
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000613 else
614 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000615" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000616
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000617 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000618 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000619 echomsg 'NetRead Usage:'
620 echomsg ':Nread machine:path uses rcp'
621 echomsg ':Nread "machine path" uses ftp with <.netrc>'
622 echomsg ':Nread "machine id password path" uses ftp'
623 echomsg ':Nread dav://machine[:port]/path uses cadaver'
624 echomsg ':Nread fetch://machine/path uses fetch'
625 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
626 echomsg ':Nread http://[user@]machine/path uses http wget'
627 echomsg ':Nread rcp://[user@]machine/path uses rcp'
628 echomsg ':Nread rsync://machine[:port]/path uses rsync'
629 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
630 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000631 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000632 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000633
Bram Moolenaar9964e462007-05-05 17:54:07 +0000634 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000635 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000636" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000637 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000638 " case "..."
639 let choice=strpart(choice,1,strlen(choice)-2)
640 else
641 " case "... ... ..."
642 let choice = strpart(choice,1,strlen(choice)-1)
643 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000644
Bram Moolenaar9964e462007-05-05 17:54:07 +0000645 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000646 let wholechoice = wholechoice . " " . choice
647 let ichoice = ichoice + 1
648 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000649 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000650 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000651 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000652" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000653 return
654 endif
655 let choice= a:{ichoice}
656 endwhile
657 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
658 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000659 endif
660 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000661
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000662" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000663 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000664
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000665 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000666 call s:NetrwMethod(choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000667 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000668
Bram Moolenaar446cb832008-06-24 21:56:24 +0000669 " Check if NetrwBrowse() should be handling this request
670" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000671 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000672" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000673 keepjumps call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000674" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000675 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000676 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000677
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000678 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000679 " Perform Protocol-Based Read {{{3
680 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000681 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
682 echo "(netrw) Processing your read request..."
683 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000684
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000685 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000686 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000687 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000688" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000689 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 " ER: on Win2K" rcp machine[.user]:file tmpfile
691 " ER: if machine contains '.' adding .user is required (use $USERNAME)
692 " ER: the tmpfile is full path: rcp sees C:\... as host C
693 if s:netrw_has_nt_rcp == 1
694 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
695 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
696 else
697 " Any way needed it machine contains a '.'
698 let uid_machine = g:netrw_machine .'.'. $USERNAME
699 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000700 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000701 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
702 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
703 else
704 let uid_machine = g:netrw_machine
705 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000706 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000707" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
708 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
709 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000710 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000711
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000712 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000713 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000714 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000715" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000716 let netrw_fname= b:netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +0000717 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000718 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000719 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000720" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000721 if exists("g:netrw_ftpextracmd")
722 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000723" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000724 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000725 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000726" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000728" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000729 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000731" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000732 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000733 endif
734 " 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 +0000735 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000736 let debugkeep= &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000737 setlocal debug=msg
738 call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000739 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000740 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000741 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
742 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000744
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000745 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000746 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000747 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
748 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000749" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000750 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000751 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000752 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000753 if exists("g:netrw_port") && g:netrw_port != ""
754 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000755" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000756 else
757 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000758" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000759 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000760
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000761 if exists("g:netrw_ftp") && g:netrw_ftp == 1
762 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000763" call Decho("filter input: ".getline('.'))
764 put ='\"'.s:netrw_passwd.'\"'
765" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000766 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000767 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
768" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000769 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000770
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000771 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
772 put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000773" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000774 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000775 if exists("g:netrw_ftpextracmd")
776 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000777" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000778 endif
779 put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000780" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000781
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 " perform ftp:
783 " -i : turns off interactive prompting from ftp
784 " -n unix : DON'T use <.netrc>, even though it exists
785 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000786 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000787" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000788 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000789 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
790 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000791" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000792 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000793 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000794 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000796 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
797 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000798 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000799
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000800 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000801 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000802 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000803" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000805 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000806 else
807 let useport= ""
808 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000809" call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape))." ".tmpfile)
810 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape))." ".tmpfile
811 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000812 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000813
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000814 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000815 " http: NetRead Method #5 (wget) {{{3
816 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000817" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000819 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000820 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000821 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000822" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000823 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000824 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000825
Bram Moolenaar446cb832008-06-24 21:56:24 +0000826 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000827 if match(b:netrw_fname,"#") == -1
828 " simple wget
Bram Moolenaar446cb832008-06-24 21:56:24 +0000829" call Decho('using simple wget (# not in b:netrw_fname<'.b:netrw_fname.">)")
830" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_fname))
831 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_fname)
832 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000833
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 else
835 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000836" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000837 let netrw_html= substitute(netrw_fname,"#.*$","","")
838 let netrw_tag = substitute(netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000839" call Decho("netrw_html<".netrw_html.">")
840" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000841" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_html))
842 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_html)
843 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000844" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000845 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
846 endif
847 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000848 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000849
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000850 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000851 " cadaver: NetRead Method #6 {{{3
852 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000853" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000854
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000855 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000856 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000857 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000858 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000859 if exists("g:netrw_port") && g:netrw_port != ""
860 put ='open '.g:netrw_machine.' '.g:netrw_port
861 else
862 put ='open '.g:netrw_machine
863 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000864 put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000865 put ='get '.netrw_fname.' '.tmpfile
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000866 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000867
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000868 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000869 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000870" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000871 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000872 bd!
Bram Moolenaar446cb832008-06-24 21:56:24 +0000873 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000874 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000875
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000877 " rsync: NetRead Method #7 {{{3
878 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000879" call Decho("read via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000880 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000881" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile)
882 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile
883 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000884 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000885
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000886 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000887 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000888 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000889 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000890" call Decho("read via fetch (method #8)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000891 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000892 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000893 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000894 call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000895 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000896" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000897 endif
898 if exists("g:netrw_option") && g:netrw_option == ":http"
899 let netrw_option= "http"
900 else
901 let netrw_option= "ftp"
902 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000903" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000904
Bram Moolenaar446cb832008-06-24 21:56:24 +0000905 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
906" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname))
907 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000908 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000909" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_machine."/".netrw_fname))
910 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_machine."/".netrw_fname)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000911 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000912
Bram Moolenaar446cb832008-06-24 21:56:24 +0000913 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000914 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000915 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000916
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000917 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000918 " sftp: NetRead Method #9 {{{3
919 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000920" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000921 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000922" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile)
923 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile
924 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000925 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000926
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000928 " Complain {{{3
929 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000930 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000931 endif
932 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000933
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000934 " cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000935 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000936" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000937 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938 unlet b:netrw_fname
939 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000940 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
941" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000942 call s:System("delete",fnameescape(tmpfile))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000943 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000944 call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000945
Bram Moolenaar9964e462007-05-05 17:54:07 +0000946" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000947endfun
948
949" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000950" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000951fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000952" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000953
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954 " option handling
955 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000956 call s:NetrwOptionSave("w:")
957 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000958
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000959 " Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000960 let tmpfile= s:GetTempfile("")
961 if tmpfile == ""
962" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000963 return
964 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000965
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966 if a:0 == 0
967 let ichoice = 0
968 else
969 let ichoice = 1
970 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000971
Bram Moolenaar9964e462007-05-05 17:54:07 +0000972 let curbufname= expand("%")
973" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000974 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000975 " For binary writes, always write entire file.
976 " (line numbers don't really make sense for that).
977 " Also supports the writing of tar and zip files.
978" call Decho("(write entire file) silent exe w! ".v:cmdarg." ".tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000979 silent exe "w! ".v:cmdarg." ".tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000980 elseif g:netrw_cygwin
981 " write (selected portion of) file to temporary
982 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
983" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".cygtmpfile)
984 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".cygtmpfile
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000985 else
986 " write (selected portion of) file to temporary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000987" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000988 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
989 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000990
Bram Moolenaar9964e462007-05-05 17:54:07 +0000991 if curbufname == ""
992 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
993 " on the temporary file's name. Deletion of the temporary file during
994 " cleanup then causes an error message.
995 0file!
996 endif
997
998 " While choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000999 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001000
Bram Moolenaar9964e462007-05-05 17:54:07 +00001001 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001002 " attempt to repeat with previous host-file-etc
1003 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001004" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001005 let choice = b:netrw_lastfile
1006 let ichoice= ichoice + 1
1007 else
1008 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001009
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001010 " Reconstruct Choice if choice starts with '"'
1011 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001012 echomsg 'NetWrite Usage:"'
1013 echomsg ':Nwrite machine:path uses rcp'
1014 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1015 echomsg ':Nwrite "machine id password path" uses ftp'
1016 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1017 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1018 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1019 echomsg ':Nwrite rcp://machine/path uses rcp'
1020 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1021 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1022 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001023 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001024 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001025
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001026 elseif match(choice,"^\"") != -1
1027 if match(choice,"\"$") != -1
1028 " case "..."
1029 let choice=strpart(choice,1,strlen(choice)-2)
1030 else
1031 " case "... ... ..."
1032 let choice = strpart(choice,1,strlen(choice)-1)
1033 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001034
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001035 while match(choice,"\"$") == -1
1036 let wholechoice= wholechoice . " " . choice
1037 let ichoice = ichoice + 1
1038 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001039 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001040 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001041 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001042" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001043 return
1044 endif
1045 let choice= a:{ichoice}
1046 endwhile
1047 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1048 endif
1049 endif
1050 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001051 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001052" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001053
Bram Moolenaar9964e462007-05-05 17:54:07 +00001054 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar446cb832008-06-24 21:56:24 +00001055 call s:NetrwMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001056
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001057 " =============
Bram Moolenaar9964e462007-05-05 17:54:07 +00001058 " Perform Protocol-Based Write {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001059 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001060 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1061 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001062" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001063 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001064
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001065 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001066 " rcp: NetWrite Method #1 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001067 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001068" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001069 if s:netrw_has_nt_rcp == 1
1070 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1071 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1072 else
1073 let uid_machine = g:netrw_machine .'.'. $USERNAME
1074 endif
1075 else
1076 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1077 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1078 else
1079 let uid_machine = g:netrw_machine
1080 endif
1081 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001082 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001083" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile)." ".shellescape(uid_machine.":".netrw_fname))
1084 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile)." ".shellescape(uid_machine.":".netrw_fname)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001085 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001086
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001087 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001088 " ftp + <.netrc>: NetWrite Method #2 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001089 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001090" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001091 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001092 new
Bram Moolenaar446cb832008-06-24 21:56:24 +00001093" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001094 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001095 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00001096" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001097 if exists("g:netrw_ftpextracmd")
1098 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00001099" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001100 endif
1101 exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00001102" call Decho("filter input: ".getline('.'))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001103 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001104" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001105 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +00001106 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001107" call Decho("filter input window#".winnr())
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001108" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001109 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +00001110 endif
1111 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1112 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001113 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001114 call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001115 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001116 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001117 endif
1118 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001119 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001120
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001121 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001122 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001123 elseif b:netrw_method == 3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001124 " Construct execution string (four lines) which will be passed through filter
1125" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001126 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001128 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001129 if exists("g:netrw_port") && g:netrw_port != ""
1130 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001131" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001132 else
1133 put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001134" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001135 endif
1136 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1137 put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001138" call Decho("filter input: ".getline('.'))
1139 put ='\"'.s:netrw_passwd.'\"'
1140" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001141 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001142 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1143" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001145 put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001146" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001147 " save choice/id/password for future use
1148 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001149
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 " perform ftp:
1151 " -i : turns off interactive prompting from ftp
1152 " -n unix : DON'T use <.netrc>, even though it exists
1153 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001154 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001155" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001156 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1158 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001159 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001160 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001161 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 let mod=1
1163 endif
1164 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001165
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001167 " scp: NetWrite Method #4 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001168 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001169" call Decho("write via scp (method #4)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001170 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001171 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00001172 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 else
1174 let useport= ""
1175 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001176" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile)." ".shellescape(g:netrw_machine.":".netrw_fname))
1177 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile)." ".shellescape(g:netrw_machine.":".netrw_fname)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001178 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001179
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001180 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001181 " http: NetWrite Method #5 {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001182 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001183" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001184 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001185 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001186 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001187
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001188 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001189 " dav: NetWrite Method #6 (cadaver) {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001190 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001191" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001192
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001193 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001194 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001195 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001196 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001197 if exists("g:netrw_port") && g:netrw_port != ""
1198 put ='open '.g:netrw_machine.' '.g:netrw_port
1199 else
1200 put ='open '.g:netrw_machine
1201 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001202 if exists("g:netrw_uid") && exists("s:netrw_passwd")
1203 put ='user '.g:netrw_uid.' '.s:netrw_passwd
1204 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001205 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001206
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001207 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001208 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001209" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001210 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001211 bd!
1212 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001213
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001214 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001215 " rsync: NetWrite Method #7 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001216 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001217" call Decho("write via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001218 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001219" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001220 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001221 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001222
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001223 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001224 " sftp: NetWrite Method #9 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001225 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001226" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001227 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001228 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1229 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1230 else
1231 let uid_machine = g:netrw_machine
1232 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001233 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001234 setlocal ff=unix
Bram Moolenaar9964e462007-05-05 17:54:07 +00001235 put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +00001236" call Decho("filter input: ".getline('.'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001237 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001238" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001239 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001240 bd!
1241 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001242
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001243 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001244 " Complain {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001245 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001246 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001247 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001248 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001249
Bram Moolenaar9964e462007-05-05 17:54:07 +00001250 " Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001251" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001252 if s:FileReadable(tmpfile)
1253" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
1254 call s:System("delete",tmpfile)
1255 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001256 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001257
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001258 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001259 " restore modifiability; usually equivalent to set nomod
1260 let &mod= mod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001261 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001262
Bram Moolenaar9964e462007-05-05 17:54:07 +00001263" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001264endfun
1265
1266" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001267" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001268" uses NetRead to get a copy of the file into a temporarily file,
1269" then sources that file,
1270" then removes that file.
1271fun! netrw#NetSource(...)
1272" call Dfunc("netrw#NetSource() a:0=".a:0)
1273 if a:0 > 0 && a:1 == '?'
1274 " give help
1275 echomsg 'NetSource Usage:'
1276 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1277 echomsg ':Nsource fetch://machine/path uses fetch'
1278 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1279 echomsg ':Nsource http://[user@]machine/path uses http wget'
1280 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1281 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1282 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1283 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1284 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001285 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001286 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001287 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001288 call netrw#NetRead(3,a:{i})
1289" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
1290 if s:FileReadable(s:netrw_tmpfile)
1291" call Decho("exe so ".s:netrw_tmpfile)
1292 exe "so ".s:netrw_tmpfile
1293 call delete(s:netrw_tmpfile)
1294 unlet s:netrw_tmpfile
1295 else
1296 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1297 endif
1298 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001299 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001300 endif
1301" call Dret("netrw#NetSource")
1302endfun
1303
1304" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001305" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001306" readcmd == %r : replace buffer with newly read file
1307" == 0r : read file at top of buffer
1308" == r : read file after current line
1309" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001310fun! s:NetrwGetFile(readcmd, tfile, method)
1311" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001312
1313 " readcmd=='t': simply do nothing
1314 if a:readcmd == 't'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001315" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
1316" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001317 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001318 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001319
Bram Moolenaar9964e462007-05-05 17:54:07 +00001320 " get name of remote filename (ie. url and all)
1321 let rfile= bufname("%")
1322" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001323
Bram Moolenaar9964e462007-05-05 17:54:07 +00001324 if exists("*NetReadFixup")
1325 " for the use of NetReadFixup (not otherwise used internally)
1326 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001327 endif
1328
Bram Moolenaar9964e462007-05-05 17:54:07 +00001329 if a:readcmd[0] == '%'
1330 " get file into buffer
1331" call Decho("get file into buffer")
1332
1333 " rename the current buffer to the temp file (ie. tfile)
1334 if g:netrw_cygwin
1335 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1336 else
1337 let tfile= a:tfile
1338 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001339" " call Decho("exe silent! keepalt file ".tfile)
1340 exe "silent! keepalt file ".tfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001341
1342 " edit temporary file (ie. read the temporary file in)
1343 if rfile =~ '\.zip$'
1344" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1345 call zip#Browse(tfile)
1346 elseif rfile =~ '\.tar$'
1347" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1348 call tar#Browse(tfile)
1349 elseif rfile =~ '\.tar\.gz'
1350" call Decho("handling remote gzip-compressed tar file")
1351 call tar#Browse(tfile)
1352 elseif rfile =~ '\.tar\.bz2'
1353" call Decho("handling remote bz2-compressed tar file")
1354 call tar#Browse(tfile)
1355 else
1356" call Decho("edit temporary file")
1357 e!
1358 endif
1359
1360 " rename buffer back to remote filename
Bram Moolenaar446cb832008-06-24 21:56:24 +00001361" call Decho("exe silent! keepalt file ".escape(rfile,' '))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001362 exe "silent! keepalt file ".escape(rfile,' ')
Bram Moolenaar446cb832008-06-24 21:56:24 +00001363 if a:method == 5
1364 set ft=html
1365 else
1366 filetype detect
1367 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001368" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1369 let line1 = 1
1370 let line2 = line("$")
1371
1372 elseif s:FileReadable(a:tfile)
1373 " read file after current line
1374" call Decho("read file<".a:tfile."> after current line")
1375 let curline = line(".")
1376 let lastline= line("$")
1377" call Decho("exe<".a:readcmd." ".v:cmdarg." ".a:tfile."> line#".curline)
1378 exe a:readcmd." ".v:cmdarg." ".a:tfile
1379 let line1= curline + 1
1380 let line2= line("$") - lastline + 1
1381
1382 else
1383 " not readable
Bram Moolenaar446cb832008-06-24 21:56:24 +00001384" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001385" call Decho("tfile<".a:tfile."> not readable")
1386 call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001387" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001388 return
1389 endif
1390
1391 " User-provided (ie. optional) fix-it-up command
1392 if exists("*NetReadFixup")
1393" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1394 call NetReadFixup(a:method, line1, line2)
1395" else " Decho
1396" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1397 endif
1398
Bram Moolenaar446cb832008-06-24 21:56:24 +00001399 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
1400 " update the Buffers menu
1401 call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001402 endif
1403
1404" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1405
1406 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001407" redraw!
1408
1409" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
1410" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001411endfun
1412
Bram Moolenaar9964e462007-05-05 17:54:07 +00001413" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001414" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001415" method == 1: rcp
1416" 2: ftp + <.netrc>
1417" 3: ftp + machine, id, password, and [path]filename
1418" 4: scp
1419" 5: http (wget)
1420" 6: cadaver
1421" 7: rsync
1422" 8: fetch
1423" 9: sftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001424fun! s:NetrwMethod(choice) " globals: method machine id passwd fname
1425" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001426
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001427 " initialization
1428 let b:netrw_method = 0
1429 let g:netrw_machine = ""
1430 let b:netrw_fname = ""
1431 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001432 let g:netrw_choice = a:choice
1433
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001434 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001435 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001436 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1437 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001438 " rcpurm : rcp://[user@]host/filename Use rcp
1439 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001440 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001441 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar446cb832008-06-24 21:56:24 +00001442 " davurm : dav[s]://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001443 " rsyncurm : rsync://host[:port]/path Use rsync
1444 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1445 " sftpurm : sftp://[user@]host/filename Use scp
1446 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1447 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1448 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001449 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001450 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001451 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001452 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001453 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001454 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1455 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1456 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001457
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001458" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001459 " Determine Method
1460 " rcp://user@hostname/...path-to-file
1461 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001462" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001463 let b:netrw_method = 1
1464 let userid = substitute(a:choice,rcpurm,'\1',"")
1465 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1466 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001467 if userid != ""
1468 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001469 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001470
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001471 " scp://user@hostname/...path-to-file
1472 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001473" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001474 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001475 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1476 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1477 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001478
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001479 " http://user@hostname/...path-to-file
1480 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001481" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001482 let b:netrw_method = 5
1483 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1484 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001485
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001486 " dav://hostname[:port]/..path-to-file..
1487 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001488" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001489 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001490 if a:choice =~ '^s'
1491 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1492 else
1493 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1494 endif
1495 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001496
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001497 " rsync://user@hostname/...path-to-file
1498 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001499" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001500 let b:netrw_method = 7
1501 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1502 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001503
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001504 " ftp://[user@]hostname[[:#]port]/...path-to-file
1505 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001506" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001507 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001508 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1509 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1510 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001511 if userid != ""
1512 let g:netrw_uid= userid
1513 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001514 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001515 let b:netrw_method = 3
1516 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001517 if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001518 let b:netrw_method= 2
1519 else
1520 if !exists("g:netrw_uid") || g:netrw_uid == ""
1521 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001522 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001523 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001524 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001525 endif
1526 let b:netrw_method= 3
1527 endif
1528 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001529
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001530 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001531" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001532 let b:netrw_method = 8
1533 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1534 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1535 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1536 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001537
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001538 " Issue an ftp : "machine id password [path/]filename"
1539 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001540" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001541 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001542 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1543 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001544 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001545 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001546
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001547 " Issue an ftp: "hostname [path/]filename"
1548 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001549" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001550 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001551 let b:netrw_method = 3
1552 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1553 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001554
Bram Moolenaar9964e462007-05-05 17:54:07 +00001555 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001556 let b:netrw_method = 2
1557 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1558 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1559 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001560
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001561 " sftp://user@hostname/...path-to-file
1562 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001563" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001564 let b:netrw_method = 9
1565 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1566 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001567
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001568 " Issue an rcp: hostname:filename" (this one should be last)
1569 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001570" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001571 let b:netrw_method = 1
1572 let userid = substitute(a:choice,rcphf,'\2',"")
1573 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1574 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001575" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1576" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1577" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1578" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001579 if userid != ""
1580 let g:netrw_uid= userid
1581 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001582
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001583 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001584 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001585 call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001586 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001587 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001588 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00001589
1590 " remove any leading [:#] from port number
1591 if g:netrw_port != ""
1592 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1593 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001594
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001595" call Decho("a:choice <".a:choice.">")
1596" call Decho("b:netrw_method <".b:netrw_method.">")
1597" call Decho("g:netrw_machine<".g:netrw_machine.">")
1598" call Decho("g:netrw_port <".g:netrw_port.">")
1599" if exists("g:netrw_uid") "Decho
1600" call Decho("g:netrw_uid <".g:netrw_uid.">")
1601" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001602" if exists("s:netrw_passwd") "Decho
1603" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001604" endif "Decho
1605" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001606" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001607endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001608
1609" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001610" NetReadFixup: this sort of function is typically written by the user {{{2
1611" to handle extra junk that their system's ftp dumps
1612" into the transfer. This function is provided as an
1613" example and as a fix for a Windows 95 problem: in my
1614" experience, win95's ftp always dumped four blank lines
1615" at the end of the transfer.
1616if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1617 fun! NetReadFixup(method, line1, line2)
1618" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
1619 if method == 3 " ftp (no <.netrc>)
1620 let fourblanklines= line2 - 3
1621 silent fourblanklines.",".line2."g/^\s*/d"
1622 endif
1623" call Dret("NetReadFixup")
1624 endfun
1625endif
1626
1627" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001628" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001629" Usage: :call NetUserPass() -- will prompt for userid and password
1630" :call NetUserPass("uid") -- will prompt for password
1631" :call NetUserPass("uid","password") -- sets global userid and password
1632fun! NetUserPass(...)
1633
1634 " get/set userid
1635 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001636" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001637 if !exists("g:netrw_uid") || g:netrw_uid == ""
1638 " via prompt
1639 let g:netrw_uid= input('Enter username: ')
1640 endif
1641 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001642" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001643 let g:netrw_uid= a:1
1644 endif
1645
1646 " get password
1647 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001648" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001649 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001650 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001651" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001652 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001653 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001654
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001655" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001656endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001657
Bram Moolenaar9964e462007-05-05 17:54:07 +00001658" ===========================================
1659" Shared Browsing Support: {{{1
1660" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001661
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001662" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001663" s:BrowserMaps: {{{2
1664fun! s:BrowserMaps(islocal)
1665" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1666 if a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00001667 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1668 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1669 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1670 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1671 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1672 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1673 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1674 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1675 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1676 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1677 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1678 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1679 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1680 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1681 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1682 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1683 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1684 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1685 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1686 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
1687 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1688 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001689 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001690 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1691 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1692 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1693 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1694 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1695 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1696 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1697 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1698 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1699 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>
1700 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001701 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001702 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1703 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr>
1704 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr>
1705 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1706 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
1707 if !hasmapto('<Plug>NetrwHideEdit')
1708 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
1709 endif
1710 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1711 if !hasmapto('<Plug>NetrwRefresh')
1712 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
1713 endif
1714 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001715 if s:didstarstar || !mapcheck("<s-down>","n")
1716 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
1717 endif
1718 if s:didstarstar || !mapcheck("<s-up>","n")
1719 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
1720 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001721 if g:netrw_mousemaps == 1
1722 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1723 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1724 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1725 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1726 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1727 endif
1728 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1729 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1730 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1731 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1732 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1733 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1734 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
1735 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001736
Bram Moolenaar9964e462007-05-05 17:54:07 +00001737 else " remote
1738 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001739 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1740 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1741 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1742 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
1743 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1744 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1745 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1746 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1747 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1748 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1749 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1750 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1751 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1752 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1753 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1754 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1755 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1756 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1757 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1758 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1759 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
1760 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001761 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001762 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
1763 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
1764 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
1765 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1766 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
1767 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1768 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1769 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1770 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>
1771 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001772 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001773 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
1774 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr>
1775 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr>
1776 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
1777 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
1778 if !hasmapto('<Plug>NetrwHideEdit')
1779 nmap <buffer> <c-h> <Plug>NetrwHideEdit
1780 endif
1781 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
1782 if !hasmapto('<Plug>NetrwRefresh')
1783 nmap <buffer> <c-l> <Plug>NetrwRefresh
1784 endif
1785 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1786 if g:netrw_mousemaps == 1
1787 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
1788 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
1789 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1790 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1791 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1792 endif
1793 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1794 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1795 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>'
1796 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1797 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1798 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
1799 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001800 nnoremap <buffer> <F1> :he netrw-browse-cmds<cr>
1801 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001802 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001803" call Dret("s:BrowserMaps")
1804endfun
1805
1806" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001807" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1808fun! s:ExplorePatHls(pattern)
1809" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
1810 let repat= substitute(a:pattern,'^**/\{1,2}','','')
1811" call Decho("repat<".repat.">")
1812 let repat= escape(repat,'][.\')
1813" call Decho("repat<".repat.">")
1814 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
1815" call Dret("s:ExplorePatHls repat<".repat.">")
1816 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00001817endfun
1818
1819" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001820" s:NetrwBookmarkDir: {{{2
1821" 0: (user: <mb>) bookmark current directory
1822" 1: (user: <gb>) change to the bookmarked directory
1823" 2: (user: <qb>) list bookmarks
1824" 3: (browsing) record current directory history
1825" 4: (user: <u>) go up (previous) bookmark
1826" 5: (user: <U>) go down (next) bookmark
1827" 6: (user: <mB>) delete bookmark
1828fun! s:NetrwBookmarkDir(chg,curdir)
1829" 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 +00001830
1831 if a:chg == 0
1832 " bookmark the current directory
1833" call Decho("(user: <b>) bookmark the current directory")
1834 if v:count > 0
1835 " handle bookmark# specified via the count
1836 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1837 if !exists("g:NETRW_BOOKMARKMAX")
1838 let g:NETRW_BOOKMARKMAX= v:count
1839 elseif v:count > g:NETRW_BOOKMARKMAX
1840 let g:NETRW_BOOKMARKMAX= v:count
1841 endif
1842 else
1843 " handle no count specified
1844 let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
1845 let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
1846 endif
1847 echo "bookmarked the current directory"
1848
1849 elseif a:chg == 1
1850 " change to the bookmarked directory
1851" call Decho("(user: <B>) change to the bookmarked directory")
1852 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1853 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
1854 else
1855 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1856 endif
1857
1858 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00001859" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00001860 let didwork= 0
1861 " list user's bookmarks
1862" call Decho("(user: <q>) list user's bookmarks")
1863 if exists("g:NETRW_BOOKMARKMAX")
1864" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1865 let cnt= 0
1866 while cnt <= g:NETRW_BOOKMARKMAX
1867 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1868" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1869 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1870 let didwork= 1
1871 endif
1872 let cnt= cnt + 1
1873 endwhile
1874 endif
1875
1876 " list directory history
1877 let cnt = g:NETRW_DIRHIST_CNT
1878 let first = 1
1879 let histcnt = 0
1880 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1881" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1882 let histcnt= histcnt + 1
1883 if exists("g:NETRW_DIRHIST_{cnt}")
1884" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1885 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
1886 let didwork= 1
1887 endif
1888 let first = 0
1889 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1890 if cnt < 0
1891 let cnt= cnt + g:netrw_dirhistmax
1892 endif
1893 endwhile
1894 if didwork
1895 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
1896 endif
1897
1898 elseif a:chg == 3
1899 " saves most recently visited directories (when they differ)
1900" call Decho("(browsing) record curdir history")
1901 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
1902 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1903" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1904 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
1905" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1906 endif
1907
1908 elseif a:chg == 4
1909 " u: change to the previous directory stored on the history list
1910" call Decho("(user: <u>) chg to prev dir from history")
1911 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1912 if g:NETRW_DIRHIST_CNT < 0
1913 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1914 endif
1915 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1916" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1917 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1918 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001919" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001920 %d
1921 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001922" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001923 endif
1924" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
1925 exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1926 else
1927 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1928 echo "Sorry, no predecessor directory exists yet"
1929 endif
1930
1931 elseif a:chg == 5
1932 " U: change to the subsequent directory stored on the history list
1933" call Decho("(user: <U>) chg to next dir from history")
1934 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1935 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1936" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1937 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1938 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00001939" call Decho("setlocal ma noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001940 %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00001941" call Decho("removed all lines from buffer (%d)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001942 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00001943" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001944 endif
1945" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
1946 exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1947 else
1948 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1949 if g:NETRW_DIRHIST_CNT < 0
1950 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1951 endif
1952 echo "Sorry, no successor directory exists yet"
1953 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001954
1955 elseif a:chg == 6
1956 if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
1957 " delete the v:count'th bookmark
1958" call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
1959 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1960 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1961
1962 elseif v:count > 0
1963" call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
1964 let cnt= v:count
1965 while cnt < g:NETRW_BOOKMARKMAX
1966 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1967 let cnt = cnt + 1
1968 endwhile
1969 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1970 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1971
1972 elseif exists("b:netrw_curdir")
1973 " look for current directory amongst the bookmarks and remove that bookmark
1974" call Decho("search for bookmark<".b:netrw_curdir.">")
1975 let cnt= 1
1976 while cnt <= g:NETRW_BOOKMARKMAX
1977" call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
1978 if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
1979 if cnt < g:NETRW_BOOKMARKMAX
1980" call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
1981 while cnt < g:NETRW_BOOKMARMAX
1982 let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1983 let cnt = cnt + 1
1984 endwhile
1985 endif
1986 unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1987 let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1988 endif
1989 let cnt= cnt + 1
1990 endwhile
1991 endif
1992
Bram Moolenaar9964e462007-05-05 17:54:07 +00001993 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001994 call s:NetrwBookmarkMenu()
1995" call Dret("NetrwBookmarkDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001996endfun
1997
1998" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001999" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2000" list of the contents of a local or remote directory. It is assumed that the
2001" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2002" with the requested remote hostname first.
2003fun! s:NetrwBrowse(islocal,dirname)
2004 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2005" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
2006" call Decho("tab#".tabpagenr()." win#".winnr())
2007" call Dredir("ls!")
2008
2009 if exists("s:netrw_skipbrowse")
2010 unlet s:netrw_skipbrowse
2011" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2012" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2013 return
2014 endif
2015 if !exists("*shellescape")
2016 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2017" call Dret("s:NetrwBrowse : missing shellescape()")
2018 return
2019 endif
2020 if !exists("*fnameescape")
2021 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2022" call Dret("s:NetrwBrowse : missing fnameescape()")
2023 return
2024 endif
2025
2026 call s:NetrwOptionSave("w:")
2027 call s:NetrwSafeOptions()
2028
2029 " re-instate any marked files
2030 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2031" call Decho("clearing marked files")
2032 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2033 endif
2034
2035 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2036" call Decho("handle w:netrw_acdkeep:")
2037" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
2038 exe 'keepjumps lcd '.fnameescape(a:dirname)
2039" call Decho("getcwd<".getcwd().">")
2040
2041 elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
2042 " looks like a regular file, attempt transfer
2043" call Decho("attempt transfer as regular file<".a:dirname.">")
2044
2045 " remove any filetype indicator from end of dirname, except for the {{{3
2046 " "this is a directory" indicator (/).
2047 " There shouldn't be one of those here, anyway.
2048 let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
2049" call Decho("new path<".path.">")
2050 call s:RemotePathAnalysis(a:dirname)
2051
2052 " remote-read the requested file into current buffer {{{3
2053 mark '
2054 call s:NetrwEnew(a:dirname)
2055 setlocal ma noro
2056" call Decho("setlocal ma noro")
2057 let b:netrw_curdir= a:dirname
2058" call Decho("exe silent! keepalt file ".s:method."://".s:user.s:machine."/".fnameescape(s:path)." (bt=".&bt.")")
2059 exe "silent! keepalt file ".s:method."://".s:user.s:machine."/".fnameescape(s:path)
2060 exe "silent keepalt doau BufReadPre ".s:fname
2061 silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
2062 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
2063 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
2064 exe "silent keepalt doau BufReadPost ".s:fname
2065 endif
2066
2067 " save certain window-oriented variables into buffer-oriented variables {{{3
2068 call s:SetBufWinVars()
2069 call s:NetrwOptionRestore("w:")
2070 setlocal ma nomod
2071
2072" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2073" call Dret("s:NetrwBrowse : file<".s:fname.">")
2074 return
2075 endif
2076
2077 " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
2078 call s:UseBufWinVars()
2079
2080 " set up some variables {{{3
2081 let b:netrw_browser_active = 1
2082 let dirname = a:dirname
2083 let s:last_sort_by = g:netrw_sort_by
2084
2085 " set up menu {{{3
2086 call s:NetrwMenu(1)
2087
2088 " set up buffer {{{3
2089 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2090 " maintain markfile highlighting
2091 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2092" call Decho("bufnr(%)=".bufnr('%'))
2093" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2094 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2095 else
2096" call Decho("2match none")
2097 2match none
2098 endif
2099 if reusing
2100 call s:NetrwOptionRestore("w:")
2101 setlocal noma nomod nowrap
2102" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2103" call Dret("s:NetrwBrowse : re-using buffer")
2104 return
2105 endif
2106
2107 " set b:netrw_curdir to the new directory name {{{3
2108" call Decho("set b:netrw_curdir to the new directory name:")
2109 let b:netrw_curdir= dirname
2110 if b:netrw_curdir =~ '[/\\]$'
2111 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2112 endif
2113 if b:netrw_curdir == ''
2114 if has("amiga")
2115 " On the Amiga, the empty string connotes the current directory
2116 let b:netrw_curdir= getcwd()
2117 else
2118 " under unix, when the root directory is encountered, the result
2119 " from the preceding substitute is an empty string.
2120 let b:netrw_curdir= '/'
2121 endif
2122 endif
2123 if !a:islocal && b:netrw_curdir !~ '/$'
2124 let b:netrw_curdir= b:netrw_curdir.'/'
2125 endif
2126" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2127
2128 " ------------
2129 " (local only) {{{3
2130 " ------------
2131 if a:islocal
2132" call Decho("local only:")
2133
2134 " Set up ShellCmdPost handling. Append current buffer to browselist
2135 call s:LocalFastBrowser()
2136
2137 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2138 if !g:netrw_keepdir
2139" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2140" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2141 if !exists("&l:acd") || !&l:acd
2142" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2143 try
2144 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
2145 catch /^Vim\%((\a\+)\)\=:E472/
2146 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2147 if exists("w:netrw_prvdir")
2148 let b:netrw_curdir= w:netrw_prvdir
2149 else
2150 call s:NetrwOptionRestore("w:")
2151 setlocal noma nomod nowrap
2152 let b:netrw_curdir= dirname
2153" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2154" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2155 return
2156 endif
2157 endtry
2158 endif
2159 endif
2160
2161 " --------------------------------
2162 " remote handling: {{{3
2163 " --------------------------------
2164 else
2165" call Decho("remote only:")
2166
2167 " analyze a:dirname and g:netrw_list_cmd {{{4
2168" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
2169 if a:dirname =~ "^NetrwTreeListing\>"
2170 let dirname= b:netrw_curdir
2171" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
2172 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2173 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2174 if dirname !~ '/$'
2175 let dirname= dirname.'/'
2176 endif
2177 let b:netrw_curdir = dirname
2178" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2179 else
2180 let dirname = substitute(a:dirname,'\\','/','g')
2181" call Decho("(normal) dirname<".dirname.">")
2182 endif
2183
2184 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2185 if dirname !~ dirpat
2186 if !exists("g:netrw_quiet")
2187 call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
2188 endif
2189 call s:NetrwOptionRestore("w:")
2190 setlocal noma nomod nowrap
2191" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2192" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2193 return
2194 endif
2195 let b:netrw_curdir= dirname
2196" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2197 endif " (additional remote handling)
2198
2199 " -----------------------
2200 " Directory Listing: {{{3
2201 " -----------------------
2202 call s:BrowserMaps(a:islocal)
2203 call s:PerformListing(a:islocal)
2204
2205" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2206" call Dret("s:NetrwBrowse : did PerformListing")
2207 return
2208endfun
2209
2210" ---------------------------------------------------------------------
2211" s:NetrwFileInfo: supports qf (query for file information) {{{2
2212fun! s:NetrwFileInfo(islocal,fname)
2213" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2214 if a:islocal
2215 if (has("unix") || has("macunix")) && executable("/bin/ls")
2216 if exists("b:netrw_curdir")
2217" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2218 if b:netrw_curdir =~ '/$'
2219 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2220 else
2221 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2222 endif
2223 else
2224" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2225 echo system("/bin/ls -lsad ".shellescape(a:fname))
2226 endif
2227 else
2228 " use vim functions to return information about file below cursor
2229" call Decho("using vim functions to query for file info")
2230 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2231 let fname= substitute(a:fname,".$","","")
2232 else
2233 let fname= a:fname
2234 endif
2235 let t = getftime(fname)
2236 let sz = getfsize(fname)
2237 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2238" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2239 endif
2240 else
2241 echo "sorry, \"qf\" not supported yet for remote files"
2242 endif
2243" call Dret("s:NetrwFileInfo")
2244endfun
2245
2246" ---------------------------------------------------------------------
2247" s:NetrwGetBuffer: {{{2
2248" returns 0=cleared buffer
2249" 1=re-used buffer
2250fun! s:NetrwGetBuffer(islocal,dirname)
2251" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2252 let dirname= a:dirname
2253
2254 " re-use buffer if possible {{{3
2255" call Decho("--re-use a buffer if possible--")
2256 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2257 " find NetrwTreeList buffer if there is one
2258 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2259" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2260 let eikeep= &ei
2261 set ei=all
2262 exe "b ".w:netrw_treebufnr
2263 let &ei= eikeep
2264" call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
2265 return
2266 endif
2267 let bufnum= -1
2268" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2269
2270 else
2271 " find buffer number of buffer named precisely the same as dirname {{{3
2272" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2273" call Dredir("ls!")
2274
2275 " get dirname and associated buffer number
2276 let bufnum = bufnr(escape(dirname,'\'))
2277" call Decho(" find buffer<".dirname.">'s number ")
2278" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2279
2280 if bufnum < 0 && dirname !~ '/$'
2281 " trying appending a trailing /
2282" call Decho(" try appending a trailing / to dirname<".dirname.">")
2283 let bufnum= bufnr(escape(dirname.'/','\'))
2284 if bufnum > 0
2285 let dirname= dirname.'/'
2286 endif
2287 endif
2288
2289 if bufnum < 0 && dirname =~ '/$'
2290 " trying removing a trailing /
2291" call Decho(" try removing a trailing / from dirname<".dirname.">")
2292 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2293 if bufnum > 0
2294 let dirname= substitute(dirname,'/$','','')
2295 endif
2296 endif
2297
2298" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2299 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2300 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2301 " handle approximate matches
2302" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx= dirname<".dirname.">")
2303 let ibuf = 1
2304 let buflast = bufnr("$")
2305" call Decho(" findbuf2: buflast=".buflast)
2306 while ibuf <= buflast
2307 let bname= substitute(bufname(ibuf),'\\','/','g')
2308" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
2309 if bname != '' && bname !~ '/' && dirname =~ '/'.bname.'/\=$' | break | endif
2310 if bname =~ '^'.dirname.'/\=$' | break | endif
2311 if dirname =~ '^'.bname.'/$' | break | endif
2312 let ibuf= ibuf + 1
2313 endwhile
2314 if ibuf > buflast
2315 let bufnum= -1
2316 else
2317 let bufnum= ibuf
2318 endif
2319" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2320 endif
2321 endif
2322
2323 " get enew buffer and name it -or- re-use buffer {{{3
2324" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")")
2325 mark '
2326 if bufnum < 0 || !bufexists(bufnum)
2327 call s:NetrwEnew(dirname)
2328" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2329 " name the buffer
2330 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2331 " Got enew buffer; transform into a NetrwTreeListing
2332" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2333 if !exists("s:netrw_treelistnum")
2334 let s:netrw_treelistnum= 1
2335 else
2336 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2337 endif
2338 let w:netrw_treebufnr= bufnr("%")
2339" call Decho(" exe silent! keepalt file NetrwTreeListing ".s:netrw_treelistnum)
2340 exe 'silent! keepalt file NetrwTreeListing\ '.s:netrw_treelistnum
2341 nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
2342 nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
2343 nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr>
2344 nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr>
2345" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2346 else
2347" let v:errmsg= "" " Decho
2348 let escdirname= fnameescape(dirname)
2349" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2350" call Decho(' exe silent! keepalt file '.escdirname)
2351 exe 'silent! keepalt file '.escdirname
2352" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2353 endif
2354" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2355
2356 else " Re-use the buffer
2357" call Decho("--re-use buffer#".bufnum.": --")
2358 let eikeep= &ei
2359 set ei=all
2360 if getline(2) =~ '^" Netrw Directory Listing'
2361" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
2362 exe "keepalt b ".bufnum
2363 else
2364" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
2365 exe "b ".bufnum
2366 endif
2367 if bufname("%") == '.'
2368 exe "silent! keepalt file ".escape(getcwd(),' ')
2369 endif
2370 let &ei= eikeep
2371 if line("$") <= 1
2372 call s:NetrwListSettings(a:islocal)
2373" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2374 return 0
2375 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2376" call Decho("--re-use tree listing--")
2377" call Decho(" clear buffer<".expand("%")."> with :%d")
2378 silent %d
2379 call s:NetrwListSettings(a:islocal)
2380" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2381 return 0
2382 else
2383" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2384 return 1
2385 endif
2386 endif
2387
2388 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2389 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2390 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2391 " med 1 D H
2392 " fast 2 H H
2393" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--")
2394 let fname= expand("%")
2395 call s:NetrwListSettings(a:islocal)
2396 exe "keepalt file ".escape(fname,' ')
2397
2398 " delete all lines from buffer {{{3
2399" call Decho("--delete all lines from buffer--")
2400" call Decho(" clear buffer<".expand("%")."> with :%d")
2401 keepalt silent! %d
2402
2403" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2404 return 0
2405endfun
2406
2407" ---------------------------------------------------------------------
2408" s:NetrwGetcwd: get the current directory. {{{2
2409" Change backslashes to forward slashes, if any.
2410" If doesc is true, escape certain troublesome characters
2411fun! s:NetrwGetcwd(doesc)
2412" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2413 let curdir= substitute(getcwd(),'\\','/','ge')
2414 if curdir !~ '[\/]$'
2415 let curdir= curdir.'/'
2416 endif
2417 if a:doesc
2418 let curdir= fnameescape(curdir)
2419 endif
2420" call Dret("NetrwGetcwd <".curdir.">")
2421 return curdir
2422endfun
2423
2424" ---------------------------------------------------------------------
2425" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2426fun! s:NetrwGetWord()
2427" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2428 call s:UseBufWinVars()
2429
2430 " insure that w:netrw_liststyle is set up
2431 if !exists("w:netrw_liststyle")
2432 if exists("g:netrw_liststyle")
2433 let w:netrw_liststyle= g:netrw_liststyle
2434 else
2435 let w:netrw_liststyle= s:THINLIST
2436 endif
2437" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2438 endif
2439
2440 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2441 " Active Banner support
2442" call Decho("active banner handling")
2443 norm! 0
2444 let dirname= "./"
2445 let curline= getline('.')
2446
2447 if curline =~ '"\s*Sorted by\s'
2448 norm s
2449 let s:netrw_skipbrowse= 1
2450 echo 'Pressing "s" also works'
2451
2452 elseif curline =~ '"\s*Sort sequence:'
2453 let s:netrw_skipbrowse= 1
2454 echo 'Press "S" to edit sorting sequence'
2455
2456 elseif curline =~ '"\s*Quick Help:'
2457 norm ?
2458 let s:netrw_skipbrowse= 1
2459 echo 'Pressing "?" also works'
2460
2461 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
2462 norm a
2463 let s:netrw_skipbrowse= 1
2464 echo 'Pressing "a" also works'
2465
2466 elseif line("$") > w:netrw_bannercnt
2467 exe 'silent keepjumps '.w:netrw_bannercnt
2468 endif
2469
2470 elseif w:netrw_liststyle == s:THINLIST
2471" call Decho("thin column handling")
2472 norm! 0
2473 let dirname= getline('.')
2474
2475 elseif w:netrw_liststyle == s:LONGLIST
2476" call Decho("long column handling")
2477 norm! 0
2478 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2479
2480 elseif w:netrw_liststyle == s:TREELIST
2481" call Decho("treelist handling")
2482 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2483
2484 else
2485" call Decho("obtain word from wide listing")
2486 let dirname= getline('.')
2487
2488 if !exists("b:netrw_cpf")
2489 let b:netrw_cpf= 0
2490 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2491" call Decho("computed cpf=".b:netrw_cpf)
2492 endif
2493
2494" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2495 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2496" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2497" call Decho("1: dirname<".dirname.">")
2498 if filestart == 0
2499 norm! 0ma
2500 else
2501 call cursor(line("."),filestart+1)
2502 norm! ma
2503 endif
2504 let rega= @a
2505 call cursor(line("."),filestart+b:netrw_cpf+1)
2506 norm! "ay`a
2507 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("%")
2529 setlocal bt=nofile nobl ma nonu nowrap noro
2530" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
2531 exe "keepalt file ".escape(fname,' ')
2532 if g:netrw_use_noswf
2533 setlocal noswf
2534 endif
2535" call Dredir("ls!")
2536" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2537 exe "setlocal ts=".g:netrw_maxfilenamelen
2538 setlocal isk+=.,~,-
2539 if g:netrw_fastbrowse > a:islocal
2540 setlocal bh=hide
2541 else
2542 setlocal bh=delete
2543 endif
2544" call Dret("s:NetrwListSettings")
2545endfun
2546
2547" ---------------------------------------------------------------------
2548" s:NetrwListStyle: {{{2
2549" islocal=0: remote browsing
2550" =1: local browsing
2551fun! s:NetrwListStyle(islocal)
2552" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2553 let fname = s:NetrwGetWord()
2554 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2555 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2556" call Decho("fname<".fname.">")
2557" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2558" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2559
2560 if w:netrw_liststyle == s:THINLIST
2561 " use one column listing
2562" call Decho("use one column list")
2563 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2564
2565 elseif w:netrw_liststyle == s:LONGLIST
2566 " use long list
2567" call Decho("use long list")
2568 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2569
2570 elseif w:netrw_liststyle == s:WIDELIST
2571 " give wide list
2572" call Decho("use wide list")
2573 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2574
2575 elseif w:netrw_liststyle == s:TREELIST
2576" call Decho("use tree list")
2577 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2578
2579 else
2580 call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2581 let g:netrw_liststyle = s:THINLIST
2582 let w:netrw_liststyle = g:netrw_liststyle
2583 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2584 endif
2585 setlocal ma noro
2586" call Decho("setlocal ma noro")
2587
2588 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2589" call Decho("clear buffer<".expand("%")."> with :%d")
2590 %d
2591
2592 " refresh the listing
2593 let svpos= netrw#NetrwSavePosn()
2594 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2595 call netrw#NetrwRestorePosn(svpos)
2596
2597 " keep cursor on the filename
2598 silent keepjumps $
2599 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2600" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2601 if result <= 0 && exists("w:netrw_bannercnt")
2602 exe "keepjumps ".w:netrw_bannercnt
2603 endif
2604
2605" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2606endfun
2607
2608" ---------------------------------------------------------------------
2609" s:NetrwBookmarkMenu: Uses menu priorities {{{2
2610" .2.[cnt] for bookmarks, and
2611" .3.[cnt] for history
2612" (see s:NetrwMenu())
2613fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002614 if !exists("s:netrw_menucnt")
2615 return
2616 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002617" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
2618
2619 " the following test assures that gvim is running, has menus available, and has menus enabled.
2620 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00002621 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002622" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
2623 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002624 endif
2625
2626 " show bookmarked places
Bram Moolenaar446cb832008-06-24 21:56:24 +00002627 let cnt = 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002628 while cnt <= g:NETRW_BOOKMARKMAX
2629 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002630 let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
2631" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.bmdir)
2632 exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002633 endif
2634 let cnt= cnt + 1
2635 endwhile
2636
2637 " show directory browsing history
2638 let cnt = g:NETRW_DIRHIST_CNT
2639 let first = 1
2640 let histcnt = 0
2641 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2642 let histcnt = histcnt + 1
2643 let priority = g:NETRW_DIRHIST_CNT + histcnt
2644 if exists("g:NETRW_DIRHIST_{cnt}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002645 let bmdir= escape(g:NETRW_DIRHIST_{cnt},'. ')
2646" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir)
2647 exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002648 endif
2649 let first = 0
2650 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2651 if cnt < 0
2652 let cnt= cnt + g:netrw_dirhistmax
2653 endif
2654 endwhile
2655 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002656" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002657endfun
2658
2659" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002660" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
2661" directory and a new directory name. Also, if the
2662" "new directory name" is actually a file,
2663" NetrwBrowseChgDir() edits the file.
2664fun! s:NetrwBrowseChgDir(islocal,newdir,...)
2665" 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 +00002666
Bram Moolenaar446cb832008-06-24 21:56:24 +00002667 if !exists("b:netrw_curdir")
2668 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
2669 " and the current window is the NetrwMessage window.
2670" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
2671" call Decho("getcwd<".getcwd().">")
2672" call Dredir("ls!")
2673" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002674 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00002675 endif
2676
Bram Moolenaar446cb832008-06-24 21:56:24 +00002677 call s:NetrwOptionSave("s:")
2678 call s:NetrwSafeOptions()
2679 let nbcd_curpos = netrw#NetrwSavePosn()
2680 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
2681 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
2682 let newdir = a:newdir
2683 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002684
Bram Moolenaar446cb832008-06-24 21:56:24 +00002685 " set up o/s-dependent directory recognition pattern
2686 if has("amiga")
2687 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002688 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002689 let dirpat= '[\/]$'
2690 endif
2691" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
2692
2693 if dirname !~ dirpat
2694 " apparently vim is "recognizing" that it is in a directory and
2695 " is removing the trailing "/". Bad idea, so I put it back.
2696 let dirname= dirname.'/'
2697" call Decho("adjusting dirname<".dirname.">")
2698 endif
2699
2700 if newdir !~ dirpat
2701 " ------------
2702 " edit a file:
2703 " ------------
2704" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2705 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2706 let dirname= s:NetrwTreeDir()
2707 if dirname =~ '/$'
2708 let dirname= dirname.newdir
2709 else
2710 let dirname= s:NetrwTreeDir()."/".newdir
2711 endif
2712" call Decho("tree listing")
2713 elseif newdir =~ '^\(/\|\a:\)'
2714 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00002715 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002716 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002717 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002718" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
2719 " this lets NetrwBrowseX avoid the edit
2720 if a:0 < 1
2721" call Decho("dirname<".dirname."> netrw_cd_escape<".g:netrw_cd_escape."> browse_split=".g:netrw_browse_split)
2722" 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 let fname= escape(a:fname,"%#")
2904" call Decho("fname<".fname."> after escape()")
2905
2906 " seems kde systems often have gnome-open due to dependencies, even though
2907 " gnome-open's subsidiary display tools are largely absent. Kde systems
2908 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
2909 if !exists("s:haskdeinit")
2910 if has("unix")
2911 let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit'
2912 if v:shell_error
2913 let s:haskdeinit = 0
2914 endif
2915 else
2916 let s:haskdeinit= 0
2917 endif
2918" call Decho("setting s:haskdeinit=".s:haskdeinit)
2919 endif
2920
2921 if a:remote == 1
2922 " create a local copy
2923 let fname= fnamemodify(tempname(),":r").".".exten
2924" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname."> as <".fname.">")
2925 exe "silent keepjumps bot 1new ".a:fname
2926 setlocal bh=delete
2927" call Decho("read <".fname.">, now writing: exe w! ".fname)
2928 exe "silent! w! ".fname
2929 q
2930 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.">")
2975" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname).redir)
2976 exe "silent !".viewer." ".viewopt.shellescape(fname).redir
2977 let ret= v:shell_error
2978
2979 elseif has("win32") || has("win64")
2980" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname))
2981 exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname)
2982 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
2986" call Decho("exe silent !gnome-open ".shellescape(fname)." ".redir)
2987 exe "silent !gnome-open ".shellescape(fname).redir
2988 let ret= v:shell_error
2989
2990 elseif has("unix") && executable("kfmclient") && s:haskdeinit
2991" call Decho("exe silent !kfmclient exec ".shellescape(fname)." ".redir)
2992 exe "silent !kfmclient exec ".shellescape(fname)." ".redir
2993 let ret= v:shell_error
2994
2995 elseif has("macunix") && executable("open")
2996" call Decho("exe silent !open ".shellescape(fname)." ".redir)
2997 exe "silent !open ".shellescape(fname)." ".redir
2998 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
3010" redraw!
3011
3012 " cleanup: remove temporary file,
3013 " delete current buffer if success with handler,
3014 " return to prior buffer (directory listing)
3015 " Feb 12, 2008: had to de-activiate removal of
3016 " temporary file because it wasn't getting seen.
3017" if a:remote == 1 && fname != a:fname
3018" call Decho("deleting temporary file<".fname.">")
3019" call s:System("delete",fname)
3020" endif
3021
3022 if a:remote == 1
3023 setlocal bh=delete bt=nofile
3024 if g:netrw_use_noswf
3025 setlocal noswf
3026 endif
3027 exe "norm! \<c-o>"
3028" redraw!
3029 endif
3030
3031" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003032endfun
3033
3034" ---------------------------------------------------------------------
3035" netrw#Explore: launch the local browser in the directory of the current file {{{2
3036" dosplit==0: the window will be split iff the current file has
3037" been modified
3038" dosplit==1: the window will be split before running the local
3039" browser
3040fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003041" 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 +00003042 if !exists("b:netrw_curdir")
3043 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003044" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003045 endif
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003046 let curfile= b:netrw_curdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003047" call Decho("curfile<".curfile.">")
3048
3049 " save registers
3050 silent! let keepregstar = @*
3051 silent! let keepregplus = @+
3052 silent! let keepregslash= @/
3053
3054 " if dosplit or file has been modified
3055 if a:dosplit || &modified || a:style == 6
3056" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
3057 call s:SaveWinVars()
3058
3059 if a:style == 0 " Explore, Sexplore
3060" call Decho("style=0: Explore or Sexplore")
3061 exe g:netrw_winsize."wincmd s"
3062
3063 elseif a:style == 1 "Explore!, Sexplore!
3064" call Decho("style=1: Explore! or Sexplore!")
3065 exe g:netrw_winsize."wincmd v"
3066
3067 elseif a:style == 2 " Hexplore
3068" call Decho("style=2: Hexplore")
3069 exe "bel ".g:netrw_winsize."wincmd s"
3070
3071 elseif a:style == 3 " Hexplore!
3072" call Decho("style=3: Hexplore!")
3073 exe "abo ".g:netrw_winsize."wincmd s"
3074
3075 elseif a:style == 4 " Vexplore
3076" call Decho("style=4: Vexplore")
3077 exe "lefta ".g:netrw_winsize."wincmd v"
3078
3079 elseif a:style == 5 " Vexplore!
3080" call Decho("style=5: Vexplore!")
3081 exe "rightb ".g:netrw_winsize."wincmd v"
3082
3083 elseif a:style == 6 " Texplore
3084 call s:SaveBufVars()
3085" call Decho("style = 6: Texplore")
3086 tabnew
3087 call s:RestoreBufVars()
3088 endif
3089 call s:RestoreWinVars()
3090 endif
3091 norm! 0
3092
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003093 if a:0 > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003094" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003095 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
3096 let dirname= substitute(a:1,'\~',expand("$HOME"),'')
3097" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3098 elseif a:1 == '.'
3099 let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
3100 if dirname !~ '/$'
3101 let dirname= dirname."/"
3102 endif
3103" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3104 elseif a:1 =~ '\$'
3105 let dirname= expand(a:1)
3106 else
3107 let dirname= a:1
3108" call Decho("using dirname<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003109 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003110 else
3111 " clear explore
3112" call Decho("clearing explore variables")
3113 2match none
3114 if exists("s:explore_match") |unlet s:explore_match |endif
3115 if exists("s:explore_indx") |unlet s:explore_indx |endif
3116 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3117 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3118 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3119 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3120 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3121 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3122" redraw!
3123 echo " "
3124 echo " "
3125" call Dret("netrw#Explore : cleared list")
3126 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003127 endif
3128
Bram Moolenaar446cb832008-06-24 21:56:24 +00003129 if dirname =~ '/\*\*/'
3130 " handle .../**/.../filepat
3131" call Decho("case Explore .../**/.../filepat")
3132 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3133 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3134 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003135 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003136 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003137 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003138 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3139 let starpat= 4;
3140" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3141" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003142
Bram Moolenaar446cb832008-06-24 21:56:24 +00003143 elseif dirname =~ '^\*//'
3144 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3145" call Decho("case Explore *//pattern")
3146 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3147 let starpat= 1
3148" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3149 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3150
3151 elseif dirname =~ '^\*\*//'
3152 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3153" call Decho("case Explore **//pattern")
3154 let pattern= substitute(dirname,'^\*\*//','','')
3155 let starpat= 2
3156" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3157
3158 elseif dirname =~ '^\*/'
3159 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3160 let starpat= 3
3161" call Decho("case Explore */filepat (starpat=".starpat.")")
3162
3163 elseif dirname=~ '^\*\*/'
3164 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3165 let starpat= 4
3166" call Decho("case Explore **/filepat (starpat=".starpat.")")
3167 else
3168 let starpat= 0
3169 endif
3170
3171 if starpat == 0 && a:indx >= 0
3172 " [Explore Hexplore Vexplore Sexplore] [dirname]
3173" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore")
3174 if dirname == ""
3175 let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3176 endif
3177 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3178" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3179 call s:NetrwBrowse(0,dirname)
3180 else
3181 if dirname == ""|let dirname= getcwd()|endif
3182" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3183 call netrw#LocalBrowseCheck(dirname)
3184 endif
3185
3186" call Decho("curfile<".curfile.">")
3187 if has("win32") || has("win95") || has("win64") || has("win16")
3188 call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
3189 else
3190 call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
3191 endif
3192
3193 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3194 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3195 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3196 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3197 elseif a:indx <= 0
3198 " Nexplore, Pexplore, Explore: handle starpat
3199" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003200 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3201" call Decho("set up <s-up> and <s-down> maps")
3202 let s:didstarstar= 1
3203 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3204 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3205 endif
3206
3207 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003208" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003209 if !exists("w:netrw_explore_indx")
3210 let w:netrw_explore_indx= 0
3211 endif
3212 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003213" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003214"
3215 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003216 " Nexplore
3217" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003218 if !exists("w:netrw_explore_list") " sanity check
3219 call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
3220 silent! let @* = keepregstar
3221 silent! let @+ = keepregstar
3222 silent! let @/ = keepregslash
3223" call Dret("netrw#Explore")
3224 return
3225 endif
3226 let indx= w:netrw_explore_indx
3227 if indx < 0 | let indx= 0 | endif
3228 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3229 let curfile= w:netrw_explore_list[indx]
3230" call Decho("indx=".indx." curfile<".curfile.">")
3231 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3232 let indx= indx + 1
3233" call Decho("indx=".indx." (Nexplore while loop)")
3234 endwhile
3235 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3236" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3237
3238 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003239 " Pexplore
3240" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003241 if !exists("w:netrw_explore_list") " sanity check
3242 call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
3243 silent! let @* = keepregstar
3244 silent! let @+ = keepregstar
3245 silent! let @/ = keepregslash
3246" call Dret("netrw#Explore")
3247 return
3248 endif
3249 let indx= w:netrw_explore_indx
3250 if indx < 0 | let indx= 0 | endif
3251 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3252 let curfile= w:netrw_explore_list[indx]
3253" call Decho("indx=".indx." curfile<".curfile.">")
3254 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3255 let indx= indx - 1
3256" call Decho("indx=".indx." (Pexplore while loop)")
3257 endwhile
3258 if indx < 0 | let indx= 0 | endif
3259" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3260
3261 else
3262 " Explore -- initialize
3263 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003264" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003265 let w:netrw_explore_indx= 0
3266 if !exists("b:netrw_curdir")
3267 let b:netrw_curdir= getcwd()
3268 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003269" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003270
Bram Moolenaar446cb832008-06-24 21:56:24 +00003271 " switch on starpat to build the w:netrw_explore_list of files
3272 if starpat == 1
3273 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3274" call Decho("starpat=".starpat.": build *//pattern list")
3275 exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
3276 let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
3277 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3278
3279 elseif starpat == 2
3280 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3281" call Decho("starpat=".starpat.": build **//pattern list")
3282 try
3283 exe "silent vimgrep /".pattern."/gj "."**/*"
3284 catch /^Vim\%((\a\+)\)\=:E480/
3285 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003286 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003287 silent! let @* = keepregstar
3288 silent! let @+ = keepregstar
3289 silent! let @/ = keepregslash
3290" call Dret("netrw#Explore : no files matched pattern")
3291 return
3292 endtry
3293 let s:netrw_curdir = b:netrw_curdir
3294 let w:netrw_explore_list = getqflist()
3295 let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
3296
3297 elseif starpat == 3
3298 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3299" call Decho("starpat=".starpat.": build */filepat list")
3300 let dirname = substitute(dirname,'^\*/','','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003301 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3302 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003303
3304 elseif starpat == 4
3305 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3306" call Decho("starpat=".starpat.": build **/filepat list")
3307 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3308 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3309 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003310
3311 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003312" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3313" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003314
3315 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3316 call netrw#ErrorMsg(s:WARNING,"no files matched",42)
3317 silent! let @* = keepregstar
3318 silent! let @+ = keepregstar
3319 silent! let @/ = keepregslash
3320" call Dret("netrw#Explore : no files matched")
3321 return
3322 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003323 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003324
3325 " NetrwStatusLine support - for exploring support
3326 let w:netrw_explore_indx= indx
3327" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
3328
3329 " wrap the indx around, but issue a note
3330 if indx >= w:netrw_explore_listlen || indx < 0
3331" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3332 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3333 let w:netrw_explore_indx= indx
3334 call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
3335 sleep 1
3336 endif
3337
3338 exe "let dirfile= w:netrw_explore_list[".indx."]"
3339" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3340 let newdir= substitute(dirfile,'/[^/]*$','','e')
3341" call Decho("newdir<".newdir.">")
3342
3343" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3344 call netrw#LocalBrowseCheck(newdir)
3345 if !exists("w:netrw_liststyle")
3346 let w:netrw_liststyle= g:netrw_liststyle
3347 endif
3348 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
3349 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3350 else
3351 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3352 endif
3353 let w:netrw_explore_mtchcnt = indx + 1
3354 let w:netrw_explore_bufnr = bufnr("%")
3355 let w:netrw_explore_line = line(".")
3356 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3357" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3358
3359 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003360" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003361 if !exists("g:netrw_quiet")
3362 call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3363 endif
3364 silent! let @* = keepregstar
3365 silent! let @+ = keepregstar
3366 silent! let @/ = keepregslash
3367" call Dret("netrw#Explore : missing +path_extra")
3368 return
3369 endif
3370
3371 else
3372" call Decho("case Explore newdir<".dirname.">")
3373 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
3374 silent! unlet w:netrw_treedict
3375 silent! unlet w:netrw_treetop
3376 endif
3377 let newdir= dirname
3378 if !exists("b:netrw_curdir")
3379 call netrw#LocalBrowseCheck(getcwd())
3380 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003381 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003382 endif
3383 endif
3384
Bram Moolenaar446cb832008-06-24 21:56:24 +00003385 " visual display of **/ **// */ Exploration files
3386 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
3387 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3388 " only update match list if current directory isn't the same as before
3389 let s:explore_prvdir = b:netrw_curdir
3390 let s:explore_match = ""
3391 let dirlen = strlen(b:netrw_curdir)
3392 if b:netrw_curdir !~ '/$'
3393 let dirlen= dirlen + 1
3394 endif
3395 let prvfname= ""
3396 for fname in w:netrw_explore_list
3397" call Decho("fname<".fname.">")
3398 if fname =~ '^'.b:netrw_curdir
3399 if s:explore_match == ""
3400 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3401 else
3402 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3403 endif
3404 elseif fname !~ '^/' && fname != prvfname
3405 if s:explore_match == ""
3406 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3407 else
3408 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3409 endif
3410 endif
3411 let prvfname= fname
3412 endfor
3413" call Decho("explore_match<".s:explore_match.">")
3414 exe "2match netrwMarkFile /".s:explore_match."/"
3415 endif
3416 echo "<s-up>==Pexplore <s-down>==Nexplore"
3417 else
3418 2match none
3419 if exists("s:explore_match") | unlet s:explore_match | endif
3420 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3421 echo " "
3422" call Decho("cleared explore match list")
3423 endif
3424
Bram Moolenaar9964e462007-05-05 17:54:07 +00003425 silent! let @* = keepregstar
3426 silent! let @+ = keepregstar
3427 silent! let @/ = keepregslash
3428" call Dret("netrw#Explore : @/<".@/.">")
3429endfun
3430
3431" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003432" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
3433" and switches the hiding mode. The actual hiding is done by
3434" s:NetrwListHide().
3435" g:netrw_hide= 0: show all
3436" 1: show not-hidden files
3437" 2: show hidden files only
3438fun! s:NetrwHide(islocal)
3439" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
3440 let svpos= netrw#NetrwSavePosn()
3441
3442 if exists("s:netrwmarkfilelist_{bufnr('%')}")
3443" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
3444" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
3445
3446 " hide the files in the markfile list
3447 for fname in s:netrwmarkfilelist_{bufnr("%")}
3448" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
3449 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
3450 " remove fname from hiding list
3451 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
3452 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
3453 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
3454" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
3455 else
3456 " append fname to hiding list
3457 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
3458 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
3459 else
3460 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
3461 endif
3462" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
3463 endif
3464 endfor
3465 unlet s:netrwmarkfilelist_{bufnr("%")}
3466 unlet s:netrwmarkfilemtch_{bufnr("%")}
3467 2match none
3468 let g:netrw_hide= 1
3469
3470 else
3471
3472 " switch between show-all/show-not-hidden/show-hidden
3473 let g:netrw_hide=(g:netrw_hide+1)%3
3474 exe "norm! 0"
3475 if g:netrw_hide && g:netrw_list_hide == ""
3476 call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
3477" call Dret("NetrwHide")
3478 return
3479 endif
3480 endif
3481
3482 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3483 call netrw#NetrwRestorePosn(svpos)
3484" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003485endfun
3486
3487" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003488" s:NetrwHidden: invoked by "gh" {{{2
3489fun! s:NetrwHidden(islocal)
3490" call Dfunc("s:NetrwHidden()")
3491 " save current position
3492 let svpos= netrw#NetrwSavePosn()
3493
3494 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
3495 " remove pattern from hiding list
3496 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
3497 elseif strlen(g:netrw_list_hide) >= 1
3498 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
3499 else
3500 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
3501 endif
3502
3503 " refresh screen and return to saved position
3504 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3505 call netrw#NetrwRestorePosn(svpos)
3506" call Dret("s:NetrwHidden")
3507endfun
3508
3509" ---------------------------------------------------------------------
3510" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
3511fun! s:NetrwLeftmouse(islocal)
3512" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
3513 if a:islocal
3514 if exists("b:netrw_curdir")
3515 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
3516 endif
3517 else
3518 if exists("b:netrw_curdir")
3519 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
3520 endif
3521 endif
3522" call Dret("s:NetrwLeftmouse")
3523endfun
3524
3525" ---------------------------------------------------------------------
3526" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
3527" separated patterns given in g:netrw_list_hide
3528fun! s:NetrwListHide()
3529" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
3530
3531 " find a character not in the "hide" string to use as a separator for :g and :v commands
3532 " How-it-works: take the hiding command, convert it into a range. Duplicate
3533 " characters don't matter. Remove all such characters from the '/~...90'
3534 " string. Use the first character left as a separator character.
3535 let listhide= g:netrw_list_hide
3536 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
3537" call Decho("sep=".sep)
3538
3539 while listhide != ""
3540 if listhide =~ ','
3541 let hide = substitute(listhide,',.*$','','e')
3542 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
3543 else
3544 let hide = listhide
3545 let listhide = ""
3546 endif
3547
3548 " Prune the list by hiding any files which match
3549 if g:netrw_hide == 1
3550" call Decho("hiding<".hide."> listhide<".listhide.">")
3551 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
3552 elseif g:netrw_hide == 2
3553" call Decho("showing<".hide."> listhide<".listhide.">")
3554 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
3555 endif
3556 endwhile
3557 if g:netrw_hide == 2
3558 exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
3559 exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
3560 endif
3561
3562" call Dret("NetrwListHide")
3563endfun
3564
3565" ---------------------------------------------------------------------
3566" NetrwHideEdit: allows user to edit the file/directory hiding list
3567fun! s:NetrwHideEdit(islocal)
3568" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
3569
3570 " save current cursor position
3571 let svpos= netrw#NetrwSavePosn()
3572
3573 " get new hiding list from user
3574 call inputsave()
3575 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
3576 call inputrestore()
3577 let g:netrw_list_hide= newhide
3578" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
3579
3580 " refresh the listing
3581 silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
3582
3583 " restore cursor position
3584 call netrw#NetrwRestorePosn(svpos)
3585
3586" call Dret("NetrwHideEdit")
3587endfun
3588
3589" ---------------------------------------------------------------------
3590" NetSortSequence: allows user to edit the sorting sequence
3591fun! s:NetSortSequence(islocal)
3592" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
3593
3594 let svpos= netrw#NetrwSavePosn()
3595 call inputsave()
3596 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
3597 call inputrestore()
3598
3599 " refresh the listing
3600 let g:netrw_sort_sequence= newsortseq
3601 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3602 call netrw#NetrwRestorePosn(svpos)
3603
3604" call Dret("NetSortSequence")
3605endfun
3606
3607" ---------------------------------------------------------------------
3608" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
3609fun! s:NetrwMakeDir(usrhost)
3610" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
3611
3612 " get name of new directory from user. A bare <CR> will skip.
3613 " if its currently a directory, also request will be skipped, but with
3614 " a message.
3615 call inputsave()
3616 let newdirname= input("Please give directory name: ")
3617 call inputrestore()
3618" call Decho("newdirname<".newdirname.">")
3619
3620 if newdirname == ""
3621" call Dret("NetrwMakeDir : user aborted with bare <cr>")
3622 return
3623 endif
3624
3625 if a:usrhost == ""
3626" call Decho("local mkdir")
3627
3628 " Local mkdir:
3629 " sanity checks
3630 let fullnewdir= b:netrw_curdir.'/'.newdirname
3631" call Decho("fullnewdir<".fullnewdir.">")
3632 if isdirectory(fullnewdir)
3633 if !exists("g:netrw_quiet")
3634 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
3635 endif
3636" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
3637 return
3638 endif
3639 if s:FileReadable(fullnewdir)
3640 if !exists("g:netrw_quiet")
3641 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
3642 endif
3643" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
3644 return
3645 endif
3646
3647 " requested new local directory is neither a pre-existing file or
3648 " directory, so make it!
3649 if exists("*mkdir")
3650 call mkdir(fullnewdir,"p")
3651 else
3652 let netrw_origdir= s:NetrwGetcwd(1)
3653 exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
3654" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
3655" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname))
3656 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname)
3657 if !g:netrw_keepdir
3658 exe 'keepjumps lcd '.fnameescape(netrw_origdir)
3659" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
3660 endif
3661 endif
3662
3663 if v:shell_error == 0
3664 " refresh listing
3665" call Decho("refresh listing")
3666 let svpos= netrw#NetrwSavePosn()
3667 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
3668 call netrw#NetrwRestorePosn(svpos)
3669 elseif !exists("g:netrw_quiet")
3670 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
3671 endif
3672" redraw!
3673
3674 elseif !exists("b:netrw_method") || b:netrw_method == 4
3675 " Remote mkdir:
3676" call Decho("remote mkdir")
3677 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
3678 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
3679" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname))
3680 exe "silent! !".mkdircmd." ".shellescape(newdirname)
3681 if v:shell_error == 0
3682 " refresh listing
3683 let svpos= netrw#NetrwSavePosn()
3684 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
3685 call netrw#NetrwRestorePosn(svpos)
3686 elseif !exists("g:netrw_quiet")
3687 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
3688 endif
3689" redraw!
3690
3691 elseif b:netrw_method == 2
3692 " COMBAK -- future work
3693 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3694 elseif b:netrw_method == 3
3695 " COMBAK -- future work
3696 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3697 endif
3698
3699" call Dret("NetrwMakeDir")
3700endfun
3701
3702" ---------------------------------------------------------------------
3703" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
3704" mark and unmark files. If a markfile list exists,
3705" then the rename and delete functions will use it instead
3706" of whatever may happen to be under the cursor at that
3707" moment. When the mouse and gui are available,
3708" shift-leftmouse may also be used to mark files.
3709fun! s:NetrwMarkFile(islocal,fname)
3710" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
3711 let curbufnr= bufnr("%")
3712 let curdir = b:netrw_curdir
3713 if exists("s:netrwmarkfilelist_{curbufnr}")
3714 " markfile list exists
3715" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3716" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
3717
3718 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
3719 " append filename to local-directory markfilelist
3720" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3721 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3722 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3723
3724 else
3725 " remove filename from local markfilelist
3726" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3727 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
3728 if s:netrwmarkfilelist_{curbufnr} == []
3729 " local markfilelist is empty; remove it entirely
3730" call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
3731 call s:NetrwUnmarkList(curbufnr,curdir)
3732 else
3733 " rebuild match list to display markings correctly
3734" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
3735 let s:netrwmarkfilemtch_{curbufnr}= ""
3736 let first = 1
3737 for fname in s:netrwmarkfilelist_{curbufnr}
3738 if first
3739 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3740 else
3741 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3742 endif
3743 let first= 0
3744 endfor
3745" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3746" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3747 endif
3748 endif
3749
3750 else
3751 " initialize new markfilelist
3752
3753" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
3754 let s:netrwmarkfilelist_{curbufnr}= []
3755 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3756" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3757
3758 " build initial markfile matching pattern
3759 if a:fname =~ '/$'
3760 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
3761 else
3762 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
3763 endif
3764" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3765 endif
3766
3767 " handle global markfilelist
3768 if exists("s:netrwmarkfilelist")
3769 let dname= s:ComposePath(b:netrw_curdir,a:fname)
3770 if index(s:netrwmarkfilelist,dname) == -1
3771 " append new filename to global markfilelist
3772 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3773" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
3774 else
3775 " remove new filename from global markfilelist
3776" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
3777 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
3778" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
3779 if s:netrwmarkfilelist == []
3780 unlet s:netrwmarkfilelist
3781 endif
3782 endif
3783 else
3784 " initialize new global-directory markfilelist
3785 let s:netrwmarkfilelist= []
3786 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3787" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
3788 endif
3789
3790 " set up 2match'ing to netrwmarkfilemtch list
3791 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
3792" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
3793 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
3794 else
3795" call Decho("2match none")
3796 2match none
3797 endif
3798" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
3799endfun
3800
3801" ---------------------------------------------------------------------
3802" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
3803" compress/decompress files using the programs
3804" in g:netrw_compress and g:netrw_uncompress,
3805" using g:netrw_compress_suffix to know which to
3806" do. By default:
3807" g:netrw_compress = "gzip"
3808" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
3809fun! s:NetrwMarkFileCompress(islocal)
3810" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
3811 let svpos = netrw#NetrwSavePosn()
3812 let curdir = b:netrw_curdir
3813 let curbufnr = bufnr("%")
3814
3815 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
3816 for fname in s:netrwmarkfilelist_{curbufnr}
3817 " for every filename in the marked list
3818 for sfx in sort(keys(g:netrw_decompress))
3819 if fname =~ '\'.sfx.'$'
3820 " fname has a suffix indicating that its compressed; apply associated decompression routine
3821 let exe= g:netrw_decompress[sfx]
3822" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
3823 if a:islocal
3824 if g:netrw_keepdir
3825 let fname= s:ComposePath(curdir,fname)
3826 endif
3827 else
3828 let fname= b:netrw_curdir.fname
3829 endif
3830 if executable(exe)
3831 if a:islocal
3832 call system(exe." ".fname)
3833 else
3834 call s:RemoteSystem(exe." ".fname)
3835 endif
3836 else
3837 call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
3838 endif
3839 break
3840 endif
3841 endfor
3842 if exists("exe")
3843 unlet exe
3844 elseif a:islocal
3845 " fname not a compressed file, so compress it
3846 call system(g:netrw_compress." ".s:ComposePath(b:netrw_curdir,fname))
3847 else
3848 " fname not a compressed file, so compress it
3849 call s:RemoteSystem(g:netrw_compress." ".fname)
3850 endif
3851 endfor
3852 call s:NetrwUnmarkList(curbufnr,curdir)
3853 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3854 call netrw#NetrwRestorePosn(svpos)
3855 endif
3856" call Dret("s:NetrwMarkFileCompress")
3857endfun
3858
3859" ---------------------------------------------------------------------
3860" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
3861" If no marked files, then set up directory as the
3862" target. Currently does not support copying entire
3863" directories. Uses the local-buffer marked file list.
3864" Returns 1=success (used by NetrwMarkFileMove())
3865" 0=failure
3866fun! s:NetrwMarkFileCopy(islocal)
3867" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
3868
3869 " sanity checks
3870 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
3871 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
3872" call Dret("s:NetrwMarkFileCopy 0")
3873 return 0
3874 endif
3875" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
3876 if !exists("s:netrwmftgt")
3877 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
3878" call Dret("s:NetrwMarkFileCopy 0")
3879 return 0
3880 endif
3881" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
3882 let curdir = b:netrw_curdir
3883 let curbufnr = bufnr("%")
3884
3885 if a:islocal && s:netrwmftgt_islocal
3886 " Copy marked files, local directory to local directory
3887" call Decho("copy from local to local")
3888 let args= join(map(copy(s:netrwmarkfilelist_{bufnr('%')}),"b:netrw_curdir.\"/\".shellescape(v:val)"))
3889" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
3890 call system(g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt))
3891
3892 elseif a:islocal && !s:netrwmftgt_islocal
3893 " Copy marked files, local directory to remote directory
3894" call Decho("copy from local to remote")
3895 call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3896
3897 elseif !a:islocal && s:netrwmftgt_islocal
3898" call Decho("copy from remote to local")
3899 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3900
3901 elseif !a:islocal && !s:netrwmftgt_islocal
3902" call Decho("copy from remote to remote")
3903 let curdir = getcwd()
3904 let tmpdir = s:GetTempfile("")
3905 if tmpdir !~ '/'
3906 let tmpdir= curdir."/".tmpdir
3907 endif
3908 if exists("*mkdir")
3909 call mkdir(tmpdir)
3910 else
3911 exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir)
3912 endif
3913 if isdirectory(tmpdir)
3914 exe "keepjumps lcd ".fnameescape(tmpdir)
3915 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
3916 let localfiles= map(copy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
3917 call s:NetrwUpload(localfiles,s:netrwmftgt)
3918 if getcwd() == tmpdir
3919 for fname in s:netrwmarkfilelist_{bufnr('%')}
3920 call s:System("delete",fname)
3921 endfor
3922 exe "keepjumps lcd ".fnameescape(curdir)
3923 exe "silent !".g:netrw_local_rmdir." ".fnameescape(tmpdir)
3924 else
3925 exe "keepjumps lcd ".fnameescape(curdir)
3926 endif
3927 endif
3928 endif
3929
3930 " -------
3931 " cleanup
3932 " -------
3933" call Decho("cleanup")
3934
3935 " remove markings from local buffer
3936 call s:NetrwUnmarkList(curbufnr,curdir)
3937
3938 " refresh buffers
3939 if !s:netrwmftgt_islocal
3940 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
3941 endif
3942 if a:islocal
3943 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
3944 endif
3945 call s:LocalBrowseShellCmdRefresh()
3946
3947" call Dret("s:NetrwMarkFileCopy 1")
3948 return 1
3949endfun
3950
3951" ---------------------------------------------------------------------
3952" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
3953" invoke vim's diff mode on the marked files.
3954" Either two or three files can be so handled.
3955" Uses the global marked file list.
3956fun! s:NetrwMarkFileDiff(islocal)
3957" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
3958 let curbufnr= bufnr("%")
3959 if exists("s:netrwmarkfilelist_{curbufnr}")
3960
3961 let cnt = 0
3962 let curdir = b:netrw_curdir
3963 for fname in s:netrwmarkfilelist
3964 let cnt= cnt + 1
3965 if !a:islocal
3966 let fname= curdir.fname
3967 endif
3968 if cnt == 1
3969" call Decho("diffthis: ".fname)
3970 exe "e ".fname
3971 diffthis
3972 elseif cnt == 2 || cnt == 3
3973 vsplit
3974 wincmd l
3975" call Decho("diffthis: ".fname)
3976 exe "e ".fname
3977 diffthis
3978 else
3979 break
3980 endif
3981 endfor
3982 call s:NetrwUnmarkList(curbufnr,curdir)
3983 endif
3984" call Dret("s:NetrwMarkFileDiff")
3985endfun
3986
3987" ---------------------------------------------------------------------
3988" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
3989" Uses global markfilelist
3990fun! s:NetrwMarkFileEdit(islocal)
3991" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
3992
3993 let curdir = b:netrw_curdir
3994 let curbufnr = bufnr("%")
3995 if exists("s:netrwmarkfilelist_{curbufnr}")
3996 call s:SetRexDir(a:islocal,curdir)
3997 if a:islocal && g:netrw_keepdir
3998 " use complete paths if its local and keepdir enabled
3999 let flist= ""
4000 for fname in s:netrwmarkfilelist
4001" let flist= flist." ".s:ComposePath(curdir,fname)
4002 let flist= flist." ".fname
4003 endfor
4004 else
4005" let flist= substitute(escape(join(s:netrwmarkfilelist_{curbufnr},"\t"),' '),"\t",' ','g')
4006 let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g')
4007 endif
4008 " unmark markedfile list
4009" call s:NetrwUnmarkList(curbufnr,curdir)
4010 call s:NetrwUnmarkAll()
4011" call Decho("exe silent args ".flist)
4012 exe "silent args ".flist
4013 endif
4014
4015" call Dret("s:NetrwMarkFileEdit")
4016endfun
4017
4018" ---------------------------------------------------------------------
4019" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4020" Uses the local marked-file list.
4021fun! s:NetrwMarkFileExe(islocal)
4022" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4023 let svpos = netrw#NetrwSavePosn()
4024 let curdir = b:netrw_curdir
4025 let curbufnr = bufnr("%")
4026
4027 if exists("s:netrwmarkfilelist_{curbufnr}")
4028 " get the command
4029 call inputsave()
4030 let cmd= input("Enter command: ","","file")
4031 call inputrestore()
4032" call Decho("cmd<".cmd.">")
4033
4034 " apply command to marked files. Substitute: filename -> %
4035 " If no %, then append a space and the filename to the command
4036 for fname in s:netrwmarkfilelist_{curbufnr}
4037 if a:islocal
4038 if g:netrw_keepdir
4039 let fname= s:ComposePath(curdir,fname)
4040 endif
4041 else
4042 let fname= b:netrw_curdir.fname
4043 endif
4044 if cmd =~ '%'
4045 let xcmd= substitute(cmd,'%',fname,'g')
4046 else
4047 let xcmd= cmd.' '.fname
4048 endif
4049 if a:islocal
4050" call Decho("local: xcmd<".xcmd.">")
4051 let ret= system(xcmd)
4052 else
4053" call Decho("remote: xcmd<".xcmd.">")
4054 let ret= s:RemoteSystem(xcmd)
4055 endif
4056 if v:shell_error < 0
4057 call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
4058 break
4059 else
4060 echo ret
4061 endif
4062 endfor
4063
4064 " unmark marked file list
4065 call s:NetrwUnmarkList(curbufnr,curdir)
4066
4067 " refresh the listing
4068 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4069 call netrw#NetrwRestorePosn(svpos)
4070 else
4071 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4072 endif
4073
4074" call Dret("s:NetrwMarkFileExe")
4075endfun
4076
4077" ---------------------------------------------------------------------
4078" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4079" as the marked file(s) (toggles suffix presence)
4080" Uses the local marked file list.
4081fun! s:NetrwMarkHideSfx(islocal)
4082" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4083 let svpos = netrw#NetrwSavePosn()
4084 let curbufnr = bufnr("%")
4085
4086 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4087 if exists("s:netrwmarkfilelist_{curbufnr}")
4088
4089 for fname in s:netrwmarkfilelist_{curbufnr}
4090" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4091 " construct suffix pattern
4092 if fname =~ '\.'
4093 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4094 else
4095 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4096 endif
4097 " determine if its in the hiding list or not
4098 let inhidelist= 0
4099 if g:netrw_list_hide != ""
4100 let itemnum = 0
4101 let hidelist= split(g:netrw_list_hide,',')
4102 for hidepat in hidelist
4103 if sfxpat == hidepat
4104 let inhidelist= 1
4105 break
4106 endif
4107 let itemnum= itemnum + 1
4108 endfor
4109 endif
4110" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4111 if inhidelist
4112 " remove sfxpat from list
4113 call remove(hidelist,itemnum)
4114 let g:netrw_list_hide= join(hidelist,",")
4115 elseif g:netrw_list_hide != ""
4116 " append sfxpat to non-empty list
4117 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4118 else
4119 " set hiding list to sfxpat
4120 let g:netrw_list_hide= sfxpat
4121 endif
4122 endfor
4123
4124 " refresh the listing
4125 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4126 call netrw#NetrwRestorePosn(svpos)
4127 else
4128 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4129 endif
4130
4131" call Dret("s:NetrwMarkHideSfx")
4132endfun
4133
4134" ---------------------------------------------------------------------
4135" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4136" Uses the global markfilelist
4137fun! s:NetrwMarkFileGrep(islocal)
4138" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4139 let svpos = netrw#NetrwSavePosn()
4140 let curdir = b:netrw_curdir
4141 let curbufnr = bufnr("%")
4142
4143 if exists("s:netrwmarkfilelist")
4144" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4145 let netrwmarkfilelist= ""
4146 for fname in s:netrwmarkfilelist
4147" call Decho("fname<".fname.">")
4148 let fname = escape(substitute(fname,"[\"']","","g")," ")
4149 let netrwmarkfilelist = netrwmarkfilelist." ".fname
4150 endfor
4151 call s:NetrwUnmarkAll()
4152
4153 " ask user for pattern
4154 call inputsave()
4155 let pat= input("Enter pattern: ","")
4156 call inputrestore()
4157 if pat !~ '^\s'
4158 if pat !~ '^/'
4159 let pat= '/'.pat.'/'
4160 endif
4161 let pat= " ".pat
4162 endif
4163
4164 " use vimgrep for both local and remote
4165" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
4166 exe "vimgrep".pat." ".netrwmarkfilelist
4167
4168 2match none
4169 call netrw#NetrwRestorePosn(svpos)
4170 endif
4171
4172" call Dret("s:NetrwMarkFileGrep")
4173endfun
4174
4175" ---------------------------------------------------------------------
4176" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4177" uses the global marked file list
4178" s:netrwmfloc= 0: target directory is remote
4179" = 1: target directory is local
4180fun! s:NetrwMarkFileMove(islocal)
4181" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4182 let curdir = b:netrw_curdir
4183 let curbufnr = bufnr("%")
4184
4185 " sanity check
4186 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4187 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4188" call Dret("s:NetrwMarkFileMove")
4189 return
4190 endif
4191" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4192 if !exists("s:netrwmftgt")
4193 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4194" call Dret("s:NetrwMarkFileCopy 0")
4195 return 0
4196 endif
4197" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4198
4199 if a:islocal && s:netrwmftgt_islocal
4200 " move: local -> local
4201" call Decho("move from local to local")
4202" call Decho("(s:NetrwMarkFileMove) local to local move")
4203 if executable(g:netrw_localmovecmd)
4204 for fname in s:netrwmarkfilelist_{bufnr("%")}
4205" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4206 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4207 if v:shell_error < 0
4208 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4209 break
4210 endif
4211 endfor
4212 else
4213 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4214 endif
4215
4216 elseif a:islocal && !s:netrwmftgt_islocal
4217 " move: local -> remote
4218" call Decho("move from local to remote")
4219" call Decho("copy")
4220 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4221 call s:NetrwMarkFileCopy(a:islocal)
4222" call Decho("remove")
4223 for fname in mflist
4224 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4225 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4226 endfor
4227 unlet mflist
4228
4229 elseif !a:islocal && s:netrwmftgt_islocal
4230 " move: remote -> local
4231" call Decho("move from remote to local")
4232" call Decho("copy")
4233 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4234 call s:NetrwMarkFileCopy(a:islocal)
4235" call Decho("remove")
4236 for fname in mflist
4237 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4238 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4239 endfor
4240 unlet mflist
4241
4242 elseif !a:islocal && !s:netrwmftgt_islocal
4243 " move: remote -> remote
4244" call Decho("move from remote to remote")
4245" call Decho("copy")
4246 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4247 call s:NetrwMarkFileCopy(a:islocal)
4248" call Decho("remove")
4249 for fname in mflist
4250 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4251 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4252 endfor
4253 unlet mflist
4254 endif
4255
4256 " -------
4257 " cleanup
4258 " -------
4259" call Decho("cleanup")
4260
4261 " remove markings from local buffer
4262 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
4263
4264 " refresh buffers
4265 if !s:netrwmftgt_islocal
4266 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4267 endif
4268 if a:islocal
4269 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4270 endif
4271 call s:LocalBrowseShellCmdRefresh()
4272
4273" call Dret("s:NetrwMarkFileMove")
4274endfun
4275
4276" ---------------------------------------------------------------------
4277" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
4278" using the hardcopy command. Local marked-file list only.
4279fun! s:NetrwMarkFilePrint(islocal)
4280" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
4281 let curbufnr= bufnr("%")
4282 if exists("s:netrwmarkfilelist_{curbufnr}")
4283 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4284 let curdir = b:netrw_curdir
4285 call s:NetrwUnmarkList(curbufnr,curdir)
4286 for fname in netrwmarkfilelist
4287 if a:islocal
4288 if g:netrw_keepdir
4289 let fname= s:ComposePath(curdir,fname)
4290 endif
4291 else
4292 let fname= curdir.fname
4293 endif
4294 1split
4295 " the autocmds will handle both local and remote files
4296" call Decho("exe silent e ".escape(fname,' '))
4297 exe "silent e ".escape(fname,' ')
4298" call Decho("hardcopy")
4299 hardcopy
4300 q
4301 endfor
4302 2match none
4303 endif
4304" call Dret("s:NetrwMarkFilePrint")
4305endfun
4306
4307" ---------------------------------------------------------------------
4308" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
4309" files when given a regexp (for which a prompt is
4310" issued).
4311fun! s:NetrwMarkFileRegexp(islocal)
4312" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
4313
4314 " get the regular expression
4315 call inputsave()
4316 let regexp= input("Enter regexp: ","","file")
4317 call inputrestore()
4318
4319 if a:islocal
4320 " get the matching list of files using local glob()
4321" call Decho("handle local regexp")
4322 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
4323 let filelist = glob(s:ComposePath(dirname,regexp))
4324 if filelist != ""
4325 let filelist= filelist."\n"
4326 endif
4327
4328 " mark the list of files
4329 while filelist != ""
4330 if filelist =~ '\n'
4331 let filename = substitute(filelist,'\n.*$','','e')
4332 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
4333 else
4334 let filename = filelist
4335 let filelist = ""
4336 endif
4337" call Decho("filelist<".filelist.">")
4338" call Decho("filename<".filename.">")
4339 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4340 endwhile
4341
4342 else
4343" call Decho("handle remote regexp")
4344
4345 " convert displayed listing into a filelist
4346 let eikeep = &ei
4347 let areg = @a
4348 silent %y a
4349 set ei=all ma
4350" call Decho("set ei=all ma")
4351 1split
4352 enew
4353 silent norm! "ap
4354 2
4355 let bannercnt= search('^" =====','W')
4356 exe "silent 1,".bannercnt."d"
4357 set bt=nofile
4358 if g:netrw_liststyle == s:LONGLIST
4359 silent %s/\s\{2,}\S.*$//e
4360 elseif g:netrw_liststyle == s:WIDELIST
4361 silent %s/\s\{2,}/\r/ge
4362 elseif g:netrw_liststyle == s:TREELIST
4363 silent %s/^| //e
4364 silent! g/^ .*$/d
4365 endif
4366 " convert regexp into the more usual glob-style format
4367 let regexp= substitute(regexp,'\*','.*','g')
4368" call Decho("regexp<".regexp.">")
4369 exe "silent! v/".escape(regexp,'/')."/d"
4370 let filelist= getline(1,line("$"))
4371 q!
4372 for filename in filelist
4373 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4374 endfor
4375 unlet filelist
4376 let @a = areg
4377 let &ei = eikeep
4378 endif
4379
4380" call Dret("s:NetrwMarkFileRegexp")
4381endfun
4382
4383" ---------------------------------------------------------------------
4384" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
4385" Uses the local marked file list.
4386fun! s:NetrwMarkFileSource(islocal)
4387" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
4388 let curbufnr= bufnr("%")
4389 if exists("s:netrwmarkfilelist_{curbufnr}")
4390 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
4391 let curdir = b:netrw_curdir
4392 call s:NetrwUnmarkList(curbufnr,curdir)
4393 for fname in netrwmarkfilelist
4394 if a:islocal
4395 if g:netrw_keepdir
4396 let fname= s:ComposePath(curdir,fname)
4397 endif
4398 else
4399 let fname= curdir.fname
4400 endif
4401 " the autocmds will handle sourcing both local and remote files
4402" call Decho("exe so ".escape(fname,' '))
4403 exe "so ".escape(fname,' ')
4404 endfor
4405 2match none
4406 endif
4407" call Dret("s:NetrwMarkFileSource")
4408endfun
4409
4410" ---------------------------------------------------------------------
4411" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
4412" Uses the global markfilelist
4413fun! s:NetrwMarkFileTag(islocal)
4414" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
4415 let svpos = netrw#NetrwSavePosn()
4416 let curdir = b:netrw_curdir
4417 let curbufnr = bufnr("%")
4418
4419 if exists("s:netrwmarkfilelist")
4420" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4421 if a:islocal && g:netrw_keepdir
4422 let netrwmarkfilelist= ""
4423 for fname in s:netrwmarkfilelist
4424" let netrwmarkfilelist= netrwmarkfilelist." ".s:ComposePath(curdir,fname)
4425 let netrwmarkfilelist= netrwmarkfilelist." ".fname
4426 endfor
4427 else
4428 let netrwmarkfilelist= string(s:netrwmarkfilelist)
4429 let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g')
4430 endif
4431 call s:NetrwUnmarkAll()
4432
4433 if a:islocal
4434 if executable(g:netrw_ctags)
4435 call map(netrwmarkfilelist,"shellescape(v:val)")
4436" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
4437 call system(g:netrw_ctags." ".netrwmarkfilelist)
4438 else
4439 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
4440 endif
4441 else
4442 let cmd= s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
4443 call netrw#NetrwObtain(a:islocal,"tags")
4444 let curdir= b:netrw_curdir
4445 1split
4446 e tags
4447 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
4448" call Decho("curdir<".curdir."> path<".path.">")
4449 exe '%s/\t\(\S\+\)\t/\t'.escape(path,'/').'\1\t/e'
4450 wq!
4451 endif
4452 2match none
4453 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4454 call netrw#NetrwRestorePosn(svpos)
4455 endif
4456
4457" call Dret("s:NetrwMarkFileTag")
4458endfun
4459
4460" ---------------------------------------------------------------------
4461" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
4462" Sets up two variables,
4463" s:netrwmftgt : holds the target directory
4464" s:netrwmftgt_islocal : 0=target directory is remote
4465" 1=target directory is local
4466fun! s:NetrwMarkFileTgt(islocal)
4467" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
4468 let svpos = netrw#NetrwSavePosn()
4469 let curdir = b:netrw_curdir
4470 let hadtgt = exists("s:netrwmftgt")
4471 if !exists("w:netrw_bannercnt")
4472 let w:netrw_bannercnt= b:netrw_bannercnt
4473 endif
4474
4475 " set up target
4476 if line(".") < w:netrw_bannercnt
4477 " if cursor in banner region, use b:netrw_curdir for the target
4478 let s:netrwmftgt= b:netrw_curdir
4479" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
4480
4481 else
4482 " get word under cursor.
4483 " * If directory, use it for the target.
4484 " * If file, use b:netrw_curdir for the target
4485 let curword= s:NetrwGetWord()
4486 let tgtdir = s:ComposePath(curdir,curword)
4487 if a:islocal && isdirectory(tgtdir)
4488 let s:netrwmftgt = tgtdir
4489" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
4490 elseif !a:islocal && tgtdir =~ '/$'
4491 let s:netrwmftgt = tgtdir
4492" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
4493 else
4494 let s:netrwmftgt = curdir
4495" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
4496 endif
4497 endif
4498 if a:islocal
4499 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
4500 let s:netrwmftgt= simplify(s:netrwmftgt)
4501" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
4502 endif
4503 if g:netrw_cygwin
4504 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
4505 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
4506 endif
4507 let s:netrwmftgt_islocal= a:islocal
4508
4509 if g:netrw_fastbrowse > 0
4510 call s:LocalBrowseShellCmdRefresh()
4511 endif
4512 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4513 call netrw#NetrwRestorePosn(svpos)
4514 if !hadtgt
4515 norm! j
4516 endif
4517
4518" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
4519endfun
4520
4521" ---------------------------------------------------------------------
4522" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
4523fun! s:NetrwUnmarkList(curbufnr,curdir)
4524" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
4525
4526 " remove all files in local marked-file list from global list
4527 if exists("s:netrwmarkfilelist_{a:curbufnr}")
4528 for mfile in s:netrwmarkfilelist_{a:curbufnr}
4529 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
4530 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
4531 call remove(s:netrwmarkfilelist,idx) " remove from global list
4532 endfor
4533 if s:netrwmarkfilelist == []
4534 unlet s:netrwmarkfilelist
4535 endif
4536
4537 " getting rid of the local marked-file lists is easy
4538 unlet s:netrwmarkfilelist_{a:curbufnr}
4539 endif
4540 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
4541 unlet s:netrwmarkfilemtch_{a:curbufnr}
4542 endif
4543 2match none
4544" call Dret("s:NetrwUnmarkList")
4545endfun
4546
4547" ---------------------------------------------------------------------
4548" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
4549fun! s:NetrwUnmarkAll()
4550" call Dfunc("s:NetrwUnmarkAll()")
4551 if exists("s:netrwmarkfilelist")
4552 unlet s:netrwmarkfilelist
4553 endif
4554 silent call s:NetrwUnmarkAll2()
4555 2match none
4556" call Dret("s:NetrwUnmarkAll")
4557endfun
4558
4559" ---------------------------------------------------------------------
4560" s:NetrwUnmarkAll2: {{{2
4561fun! s:NetrwUnmarkAll2()
4562" call Dfunc("s:NetrwUnmarkAll2()")
4563 redir => netrwmarkfilelist_let
4564 let
4565 redir END
4566 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
4567 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
4568 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
4569 for flist in netrwmarkfilelist_list
4570 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
4571 unlet s:netrwmarkfilelist_{curbufnr}
4572 unlet s:netrwmarkfilemtch_{curbufnr}
4573 endfor
4574" call Dret("s:NetrwUnmarkAll2")
4575endfun
4576
4577" ---------------------------------------------------------------------
4578" s:NetrwUnMarkFile: {{{2
4579fun! s:NetrwUnMarkFile(islocal)
4580" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
4581 let svpos = netrw#NetrwSavePosn()
4582 let curbufnr = bufnr("%")
4583
4584 " unmark marked file list (although I expect s:NetrwUpload()
4585 " to do it, I'm just making sure)
4586 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4587" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
4588 unlet s:netrwmarkfilelist
4589 unlet s:netrwmarkfilelist_{curbufnr}
4590 unlet s:netrwmarkfilemtch_{curbufnr}
4591 2match none
4592 endif
4593
4594" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4595 call netrw#NetrwRestorePosn(svpos)
4596" call Dret("s:NetrwUnMarkFile")
4597endfun
4598
4599" ---------------------------------------------------------------------
4600" s:NetrwMenu: generates the menu for gvim and netrw {{{2
4601fun! s:NetrwMenu(domenu)
4602
4603 if !exists("g:NetrwMenuPriority")
4604 let g:NetrwMenuPriority= 80
4605 endif
4606
4607 if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
4608" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
4609
4610 if !exists("s:netrw_menu_enabled") && a:domenu
4611" call Decho("initialize menu")
4612 let s:netrw_menu_enabled= 1
4613 exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
4614 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4
4615 exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
4616 exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
4617 exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
4618 exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
4619 exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB mB'
4620 exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb'
4621 exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
4622 exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
4623 exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
4624 exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit"
4625 exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
4626 exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
4627 exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh"
4628 exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
4629 exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
4630 exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
4631 exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
4632 exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
4633 exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
4634 exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
4635 exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
4636 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
4637 exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
4638 exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
4639 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
4640 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
4641 exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
4642 exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
4643 exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
4644 exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
4645 exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
4646 exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
4647 exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
4648 exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
4649 exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
4650 exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
4651 exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
4652 exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
4653 exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
4654 exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
4655 exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
4656 exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
4657 exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
4658 exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
4659 exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
4660 exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
4661 exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
4662 exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
4663 exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
4664 exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
4665 let s:netrw_menucnt= 28
4666
4667 elseif !a:domenu
4668 let s:netrwcnt = 0
4669 let curwin = winnr()
4670 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
4671 exe curwin."wincmd w"
4672
4673 if s:netrwcnt <= 1
4674" call Decho("clear menus")
4675 exe 'silent! unmenu '.g:NetrwTopLvlMenu
4676" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
4677 silent! unlet s:netrw_menu_enabled
4678 endif
4679 endif
4680" call Dret("NetrwMenu")
4681 endif
4682
4683endfun
4684
4685" ---------------------------------------------------------------------
4686" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
4687" Used by the O maps (as <SID>NetrwObtain())
4688fun! s:NetrwObtain(islocal)
4689" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
4690
4691 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4692 let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
4693 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
4694 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
4695 else
4696 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
4697 endif
4698
4699" call Dret("NetrwObtain")
4700endfun
4701
4702" ---------------------------------------------------------------------
4703" netrw#NetrwObtain: {{{2
4704" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
4705" islocal=0 obtain from remote source
4706" =1 obtain from local source
4707" fname : a filename or a list of filenames
4708" tgtdir : optional place where files are to go (not present, uses getcwd())
4709fun! netrw#NetrwObtain(islocal,fname,...)
4710" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
4711 " NetrwStatusLine support - for obtaining support
4712
4713 if type(a:fname) == 1
4714 let fnamelist= [ a:fname ]
4715 elseif type(a:fname) == 3
4716 let fnamelist= a:fname
4717 else
4718 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
4719" call Dret("netrw#NetrwObtain")
4720 return
4721 endif
4722" call Decho("fnamelist<".string(fnamelist).">")
4723 if a:0 > 0
4724 let tgtdir= a:1
4725 else
4726 let tgtdir= getcwd()
4727 endif
4728" call Decho("tgtdir<".tgtdir.">")
4729
4730 if a:islocal
4731 " obtain a file from b:netrw_curdir to getcwd()
4732" call Decho("obtain a local file from ".b:netrw_curdir." to ".tgtdir
4733 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
4734 let topath= s:ComposePath(tgtdir,"")
4735 if (has("win32") || has("win95") || has("win64") || has("win16"))
4736 " transfer files one at time
4737 for fname in fnamelist
4738" call Decho("system(".g:netrw_localcopycmd." ".fname." ".shellescape(topath).")")
4739 call system(g:netrw_localcopycmd." ".fname." ".shellescape(topath))
4740 endfor
4741 else
4742 " transfer files with one command
4743 let filelist= join(map(copy(fname),"shellescape(v:val)"))
4744" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
4745 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
4746 endif
4747 elseif !exists("b:netrw_curdir")
4748 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
4749 else
4750 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
4751 endif
4752
4753 else
4754" call Decho("obtain a remote file from ".b:netrw_curdir." to ".tgtdir)
4755 if type(a:fname) == 1
4756 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
4757 endif
4758 call s:NetrwMethod(b:netrw_curdir)
4759
4760 if b:netrw_method == 4
4761 " obtain file using scp
4762" call Decho("obtain via scp (method#4)")
4763 if exists("g:netrw_port") && g:netrw_port != ""
4764 let useport= " ".g:netrw_scpport." ".g:netrw_port
4765 else
4766 let useport= ""
4767 endif
4768 if b:netrw_fname =~ '/'
4769 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
4770 else
4771 let path= ""
4772 endif
4773 let filelist= join(map(copy(fnamelist),'shellescape(g:netrw_machine.":".escape(path.v:val,g:netrw_fname_escape))'))
4774" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".filelist." ".shellescape(tgtdir))
4775 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".filelist." ".shellescape(tgtdir)
4776
4777 elseif b:netrw_method == 2
4778 " obtain file using ftp + .netrc
4779" call Decho("obtain via ftp+.netrc (method #2)")
4780 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4781 let tmpbufnr= bufnr("%")
4782 setlocal ff=unix
4783 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4784 exe "put ='".g:netrw_ftpmode."'"
4785" call Decho("filter input: ".getline('$'))
4786 endif
4787
4788 if exists("b:netrw_fname") && b:netrw_fname != ""
4789 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4790" call Decho("filter input: ".getline('$'))
4791 endif
4792
4793 if exists("g:netrw_ftpextracmd")
4794 exe "put ='".g:netrw_ftpextracmd."'"
4795" call Decho("filter input: ".getline('$'))
4796 endif
4797 for fname in fnamelist
4798 call setline(line("$")+1,'get "'.fname.'"')
4799" call Decho("filter input: ".getline('$'))
4800 endfor
4801 if exists("g:netrw_port") && g:netrw_port != ""
4802" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
4803 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
4804 else
4805" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
4806 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
4807 endif
4808 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4809 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
4810 let debugkeep= &debug
4811 setlocal debug=msg
4812 call netrw#ErrorMsg(s:ERROR,getline(1),4)
4813 let &debug= debugkeep
4814 endif
4815
4816 elseif b:netrw_method == 3
4817 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
4818" call Decho("obtain via ftp+mipf (method #3)")
4819 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4820 let tmpbufnr= bufnr("%")
4821 setlocal ff=unix
4822
4823 if exists("g:netrw_port") && g:netrw_port != ""
4824 put ='open '.g:netrw_machine.' '.g:netrw_port
4825" call Decho("filter input: ".getline('$'))
4826 else
4827 put ='open '.g:netrw_machine
4828" call Decho("filter input: ".getline('$'))
4829 endif
4830
4831 if exists("g:netrw_ftp") && g:netrw_ftp == 1
4832 put =g:netrw_uid
4833" call Decho("filter input: ".getline('$'))
4834 put ='\"'.s:netrw_passwd.'\"'
4835" call Decho("filter input: ".getline('$'))
4836 else
4837 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
4838" call Decho("filter input: ".getline('$'))
4839 endif
4840
4841 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4842 put =g:netrw_ftpmode
4843" call Decho("filter input: ".getline('$'))
4844 endif
4845
4846 if exists("b:netrw_fname") && b:netrw_fname != ""
4847 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4848" call Decho("filter input: ".getline('$'))
4849 endif
4850
4851 if exists("g:netrw_ftpextracmd")
4852 exe "put ='".g:netrw_ftpextracmd."'"
4853" call Decho("filter input: ".getline('$'))
4854 endif
4855
4856 if exists("g:netrw_ftpextracmd")
4857 exe "put ='".g:netrw_ftpextracmd."'"
4858" call Decho("filter input: ".getline('$'))
4859 endif
4860 for fname in fnamelist
4861 call setline(line("$")+1,'get "'.fname.'"')
4862 endfor
4863" call Decho("filter input: ".getline('$'))
4864
4865 " perform ftp:
4866 " -i : turns off interactive prompting from ftp
4867 " -n unix : DON'T use <.netrc>, even though it exists
4868 " -n win32: quit being obnoxious about password
4869 norm! 1Gdd
4870" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
4871 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
4872 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4873 if getline(1) !~ "^$"
4874" call Decho("error<".getline(1).">")
4875 if !exists("g:netrw_quiet")
4876 call netrw#ErrorMsg(s:ERROR,getline(1),5)
4877 endif
4878 endif
4879 endif
4880
4881 endif
4882
4883 " cleanup
4884 if exists("tmpbufnr")
4885 if bufnr("%") != tmpbufnr
4886 exe tmpbufnr."bw!"
4887 else
4888 q!
4889 endif
4890 endif
4891
4892" call Dret("netrw#NetrwObtain")
4893endfun
4894
4895" ---------------------------------------------------------------------
4896" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
4897" If there's only one window, then the window will first be split.
4898" Returns:
4899" choice = 0 : didn't have to choose
4900" choice = 1 : saved modified file in window first
4901" choice = 2 : didn't save modified file, opened window
4902" choice = 3 : cancel open
4903fun! s:NetrwPrevWinOpen(islocal)
4904" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4905
4906 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
4907 let curdir = b:netrw_curdir
4908
4909 " get last window number and the word currently under the cursor
4910 let lastwinnr = winnr("$")
4911 let curword = s:NetrwGetWord()
4912 let choice = 0
4913" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4914
4915 let didsplit = 0
4916 if lastwinnr == 1
4917 " if only one window, open a new one first
4918" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4919 if g:netrw_preview
4920" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4921 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4922 else
4923" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4924 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4925 endif
4926 let didsplit = 1
4927
4928 else
4929 call s:SaveBufVars()
4930" call Decho("wincmd p")
4931 wincmd p
4932 call s:RestoreBufVars()
4933 " if the previous window's buffer has been changed (is modified),
4934 " and it doesn't appear in any other extant window, then ask the
4935 " user if s/he wants to abandon modifications therein.
4936 let bnr = winbufnr(0)
4937 let bnrcnt = 0
4938 if &mod
4939" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4940 let eikeep= &ei
4941 set ei=all
4942 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4943 exe bnr."wincmd p"
4944 let &ei= eikeep
4945" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4946 if bnrcnt == 1
4947 let bufname= bufname(winbufnr(winnr()))
4948 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4949" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4950
4951 if choice == 1
4952 " Yes -- write file & then browse
4953 let v:errmsg= ""
4954 silent w
4955 if v:errmsg != ""
4956 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4957 if didsplit
4958 q
4959 else
4960 wincmd p
4961 endif
4962" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4963 return choice
4964 endif
4965
4966 elseif choice == 2
4967 " No -- don't worry about changed file, just browse anyway
4968 setlocal nomod
4969 call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
4970 wincmd p
4971
4972 else
4973 " Cancel -- don't do this
4974 if didsplit
4975 q
4976 else
4977 wincmd p
4978 endif
4979" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
4980 return choice
4981 endif
4982 endif
4983 endif
4984 endif
4985
4986 " restore b:netrw_curdir (window split/enew may have lost it)
4987 let b:netrw_curdir= curdir
4988 if a:islocal < 2
4989 if a:islocal
4990 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
4991 else
4992 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
4993 endif
4994 endif
4995" call Dret("NetrwPrevWinOpen ".choice)
4996 return choice
4997endfun
4998
4999" ---------------------------------------------------------------------
5000" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5001" Always assumed to be local -> remote
5002" call s:NetrwUpload(filename, target)
5003" call s:NetrwUpload(filename, target, fromdirectory)
5004fun! s:NetrwUpload(fname,tgt,...)
5005" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5006
5007 if a:tgt =~ '^\a\+://'
5008 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5009 else
5010 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5011 endif
5012" call Decho("tgtdir<".tgtdir.">")
5013
5014 if a:0 > 0
5015 let fromdir= a:1
5016 else
5017 let fromdir= getcwd()
5018 endif
5019" call Decho("fromdir<".fromdir.">")
5020
5021 if type(a:fname) == 1
5022 " handle uploading a single file using NetWrite
5023" call Decho("handle uploading a single file via NetWrite")
5024 1split
5025 let efname= escape(a:fname,g:netrw_fname_escape)
5026" call Decho("exe e ".efname)
5027 exe "e ".efname
5028" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5029 if a:tgt =~ '/$'
5030 let wfname= substitute(a:fname,'^.*/','','')
5031 let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
5032" call Decho("exe w! ".wfname)
5033 exe "w! ".wfname
5034 else
5035 let wfname= escape(a:tgt,g:netrw_fname_escape)
5036" call Decho("writing local->remote: exe w ".wfname)
5037 exe "w ".wfname
5038" call Decho("done writing local->remote")
5039 endif
5040 q!
5041
5042 elseif type(a:fname) == 3
5043 " handle uploading a list of files via scp
5044" call Decho("handle uploading a list of files via scp")
5045 let curdir= getcwd()
5046 if a:tgt =~ '^scp:'
5047 exe "keepjumps silent lcd ".fnameescape(fromdir)
5048 let filelist= copy(s:netrwmarkfilelist_{bufnr('%')})
5049 let args = join(map(filelist,"shellescape(v:val)"))
5050 if exists("g:netrw_port") && g:netrw_port != ""
5051 let useport= " ".g:netrw_scpport." ".g:netrw_port
5052 else
5053 let useport= ""
5054 endif
5055 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5056 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
5057" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".args." ".shellescape(machine.":".escape(tgt,g:netrw_fname_escape)))
5058 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".args." ".shellescape(machine.":".escape(tgt,g:netrw_fname_escape))
5059 exe "keepjumps silent lcd ".fnameescape(curdir)
5060
5061 elseif a:tgt =~ '^ftp:'
5062 call s:NetrwMethod(a:tgt)
5063
5064 if b:netrw_method == 2
5065 " handle uploading a list of files via ftp+.netrc
5066 let netrw_fname = b:netrw_fname
5067 silent keepjumps new
5068" call Decho("filter input window#".winnr())
5069
5070 exe "put ='".g:netrw_ftpmode."'"
5071" call Decho("filter input: ".getline('$'))
5072
5073 if exists("g:netrw_ftpextracmd")
5074 exe "put ='".g:netrw_ftpextracmd."'"
5075" call Decho("filter input: ".getline('$'))
5076 endif
5077
5078 call setline(line("$")+1,'lcd "'.fromdir.'"')
5079" call Decho("filter input: ".getline('$'))
5080
5081 call setline(line("$")+1,'cd "'.tgtdir.'"')
5082" call Decho("filter input: ".getline('$'))
5083
5084 for fname in a:fname
5085 call setline(line("$")+1,'put "'.fname.'"')
5086" call Decho("filter input: ".getline('$'))
5087 endfor
5088
5089 if exists("g:netrw_port") && g:netrw_port != ""
5090" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
5091 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
5092 else
5093" call Decho("filter input window#".winnr())
5094" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
5095 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
5096 endif
5097 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5098 silent g/Local directory now/d
5099 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5100 call netrw#ErrorMsg(s:ERROR,getline(1),14)
5101 else
5102 bw!|q
5103 endif
5104
5105 elseif b:netrw_method == 3
5106 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5107 let netrw_fname= b:netrw_fname
5108 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5109 let tmpbufnr= bufnr("%")
5110 setlocal ff=unix
5111
5112 if exists("g:netrw_port") && g:netrw_port != ""
5113 put ='open '.g:netrw_machine.' '.g:netrw_port
5114" call Decho("filter input: ".getline('$'))
5115 else
5116 put ='open '.g:netrw_machine
5117" call Decho("filter input: ".getline('$'))
5118 endif
5119
5120 if exists("g:netrw_ftp") && g:netrw_ftp == 1
5121 put =g:netrw_uid
5122" call Decho("filter input: ".getline('$'))
5123 call setline(line("$")+1,'"'.s:netrw_passwd.'"')
5124" call Decho("filter input: ".getline('$'))
5125 else
5126 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
5127" call Decho("filter input: ".getline('$'))
5128 endif
5129
5130 call setline(line("$")+1,'lcd "'.fromdir.'"')
5131" call Decho("filter input: ".getline('$'))
5132
5133 if exists("b:netrw_fname") && b:netrw_fname != ""
5134 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5135" call Decho("filter input: ".getline('$'))
5136 endif
5137
5138 if exists("g:netrw_ftpextracmd")
5139 exe "put ='".g:netrw_ftpextracmd."'"
5140" call Decho("filter input: ".getline('$'))
5141 endif
5142
5143 for fname in a:fname
5144 call setline(line("$")+1,'put "'.fname.'"')
5145" call Decho("filter input: ".getline('$'))
5146 endfor
5147
5148 " perform ftp:
5149 " -i : turns off interactive prompting from ftp
5150 " -n unix : DON'T use <.netrc>, even though it exists
5151 " -n win32: quit being obnoxious about password
5152 norm! 1Gdd
5153" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n")
5154 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5155 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5156 silent g/Local directory now/d
5157 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5158 let debugkeep= &debug
5159 setlocal debug=msg
5160 call netrw#ErrorMsg(s:ERROR,getline(1),15)
5161 let &debug = debugkeep
5162 let mod = 1
5163 else
5164 bw!|q
5165 endif
5166 endif
5167 else
5168 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5169 endif
5170 endif
5171
5172" call Dret("s:NetrwUpload")
5173endfun
5174
5175" ---------------------------------------------------------------------
5176" s:NetrwPreview: {{{2
5177fun! s:NetrwPreview(path) range
5178" call Dfunc("NetrwPreview(path<".a:path.">)")
5179 call s:NetrwOptionSave("s:")
5180 call s:NetrwSafeOptions()
5181 if has("quickfix")
5182 if !isdirectory(a:path)
5183 exe (g:netrw_preview? "vert " : "")."pedit ".escape(a:path,g:netrw_fname_escape)
5184 elseif !exists("g:netrw_quiet")
5185 call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
5186 endif
5187 elseif !exists("g:netrw_quiet")
5188 call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
5189 endif
5190 call s:NetrwOptionRestore("s:")
5191" call Dret("NetrwPreview")
5192endfun
5193
5194" ---------------------------------------------------------------------
5195" s:NetrwRefresh: {{{2
5196fun! s:NetrwRefresh(islocal,dirname)
5197" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
5198 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
5199 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
5200 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
5201 setlocal ma noro
5202" call Decho("setlocal ma noro")
5203" call Decho("clear buffer<".expand("%")."> with :%d")
5204 %d
5205 if a:islocal
5206 call netrw#LocalBrowseCheck(a:dirname)
5207 else
5208 call s:NetrwBrowse(a:islocal,a:dirname)
5209 endif
5210 call netrw#NetrwRestorePosn()
5211
5212 " restore file marks
5213 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
5214" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
5215 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
5216 else
5217" call Decho("2match none")
5218 2match none
5219 endif
5220
5221" redraw!
5222" call Dret("NetrwRefresh")
5223endfun
5224
5225" ---------------------------------------------------------------------
5226" s:NetrwRefreshDir: refreshes a directory by name {{{2
5227" Called by NetrwMarkFileCopy()
5228" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
5229fun! s:NetrwRefreshDir(islocal,dirname)
5230" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
5231 if g:netrw_fastbrowse == 0
5232 " slowest mode (keep buffers refreshed, local or remote)
5233" call Decho("slowest mode: keep buffers refreshed, local or remote")
5234 let tgtwin= bufwinnr(a:dirname)
5235" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
5236
5237 if tgtwin > 0
5238 " tgtwin is being displayed, so refresh it
5239 let curwin= winnr()
5240" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
5241 exe tgtwin."wincmd w"
5242 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5243 exe curwin."wincmd w"
5244
5245 elseif bufnr(a:dirname) > 0
5246 let bn= bufnr(a:dirname)
5247" call Decho("bd bufnr(".a:dirname.")=".bn)
5248 exe "silent bd ".bn
5249 endif
5250
5251 elseif g:netrw_fastbrowse <= 1
5252" call Decho("medium-speed mode: refresh local buffers only")
5253 call s:LocalBrowseShellCmdRefresh()
5254 endif
5255" call Dret("s:NetrwRefreshDir")
5256endfun
5257
5258" ---------------------------------------------------------------------
5259" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
5260" What this function does is to compute a priority for the patterns
5261" in the g:netrw_sort_sequence. It applies a substitute to any
5262" "files" that satisfy each pattern, putting the priority / in
5263" front. An "*" pattern handles the default priority.
5264fun! s:NetrwSetSort()
5265" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
5266 if w:netrw_liststyle == s:LONGLIST
5267 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
5268 else
5269 let seqlist = g:netrw_sort_sequence
5270 endif
5271 " sanity check -- insure that * appears somewhere
5272 if seqlist == ""
5273 let seqlist= '*'
5274 elseif seqlist !~ '\*'
5275 let seqlist= seqlist.',*'
5276 endif
5277 let priority = 1
5278 while seqlist != ""
5279 if seqlist =~ ','
5280 let seq = substitute(seqlist,',.*$','','e')
5281 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5282 else
5283 let seq = seqlist
5284 let seqlist = ""
5285 endif
5286 let sepchr= "\<Char-0xff>"
5287 if priority < 10
5288 let spriority= "00".priority.sepchr
5289 elseif priority < 100
5290 let spriority= "0".priority.sepchr
5291 else
5292 let spriority= priority.sepchr
5293 endif
5294" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
5295
5296 " sanity check
5297 if w:netrw_bannercnt > line("$")
5298 " apparently no files were left after a Hiding pattern was used
5299" call Dret("SetSort : no files left after hiding")
5300 return
5301 endif
5302 if seq == '*'
5303 let starpriority= spriority
5304 else
5305 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
5306 " sometimes multiple sorting patterns will match the same file or directory.
5307 " The following substitute is intended to remove the excess matches.
5308 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e'
5309 endif
5310 let priority = priority + 1
5311 endwhile
5312 if exists("starpriority")
5313 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/'
5314 endif
5315
5316 " Following line associated with priority -- items that satisfy a priority
5317 " pattern get prefixed by ###/ which permits easy sorting by priority.
5318 " Sometimes files can satisfy multiple priority patterns -- only the latest
5319 " priority pattern needs to be retained. So, at this point, these excess
5320 " priority prefixes need to be removed, but not directories that happen to
5321 " be just digits themselves.
5322 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e'
5323
5324" call Dret("SetSort")
5325endfun
5326
5327" =====================================================================
5328" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
5329fun! s:NetrwSortStyle(islocal)
5330" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
5331 call s:NetrwSaveWordPosn()
5332 let svpos= netrw#NetrwSavePosn()
5333
5334 let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
5335 norm! 0
5336 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5337 call netrw#NetrwRestorePosn(svpos)
5338
5339" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
5340endfun
5341
5342" ---------------------------------------------------------------------
5343" s:NetrwSplit: mode {{{2
5344" =0 : net and o
5345" =1 : net and t
5346" =2 : net and v
5347" =3 : local and o
5348" =4 : local and t
5349" =5 : local and v
5350fun! s:NetrwSplit(mode)
5351" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
5352
5353 call s:SaveWinVars()
5354
5355 if a:mode == 0
5356 " remote and o
5357" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5358 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5359 let s:didsplit= 1
5360 call s:RestoreWinVars()
5361 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5362 unlet s:didsplit
5363
5364 elseif a:mode == 1
5365 " remote and t
5366 let cursorword = s:NetrwGetWord()
5367" call Decho("tabnew")
5368 tabnew
5369 let s:didsplit= 1
5370 call s:RestoreWinVars()
5371 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword))
5372 unlet s:didsplit
5373
5374 elseif a:mode == 2
5375 " remote and v
5376" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5377 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5378 let s:didsplit= 1
5379 call s:RestoreWinVars()
5380 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5381 unlet s:didsplit
5382
5383 elseif a:mode == 3
5384 " local and o
5385" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5386 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5387 let s:didsplit= 1
5388 call s:RestoreWinVars()
5389 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5390 unlet s:didsplit
5391
5392 elseif a:mode == 4
5393 " local and t
5394 let netrw_curdir= b:netrw_curdir
5395 let cursorword = s:NetrwGetWord()
5396" call Decho("tabnew")
5397 tabnew
5398 let b:netrw_curdir= netrw_curdir
5399 let s:didsplit= 1
5400 call s:RestoreWinVars()
5401 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
5402 unlet s:didsplit
5403
5404 elseif a:mode == 5
5405 " local 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 netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5411 unlet s:didsplit
5412
5413 else
5414 call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
5415 endif
5416
5417" call Dret("s:NetrwSplit")
5418endfun
5419
5420" ---------------------------------------------------------------------
5421" NetrwStatusLine: {{{2
5422fun! NetrwStatusLine()
5423
5424" vvv NetrwStatusLine() debugging vvv
5425" let g:stlmsg=""
5426" if !exists("w:netrw_explore_bufnr")
5427" let g:stlmsg="!X<explore_bufnr>"
5428" elseif w:netrw_explore_bufnr != bufnr("%")
5429" let g:stlmsg="explore_bufnr!=".bufnr("%")
5430" endif
5431" if !exists("w:netrw_explore_line")
5432" let g:stlmsg=" !X<explore_line>"
5433" elseif w:netrw_explore_line != line(".")
5434" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
5435" endif
5436" if !exists("w:netrw_explore_list")
5437" let g:stlmsg=" !X<explore_list>"
5438" endif
5439" ^^^ NetrwStatusLine() debugging ^^^
5440
5441 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")
5442 " restore user's status line
5443 let &stl = s:netrw_users_stl
5444 let &laststatus = s:netrw_users_ls
5445 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
5446 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
5447 return ""
5448 else
5449 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5450 endif
5451endfun
5452
5453" ---------------------------------------------------------------------
5454" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
5455" (full path directory with trailing slash returned)
5456fun! s:NetrwTreeDir()
5457" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
5458
5459 let treedir= b:netrw_curdir
5460" call Decho("set initial treedir<".treedir.">")
5461 let s:treecurpos= netrw#NetrwSavePosn()
5462
5463 if w:netrw_liststyle == s:TREELIST
5464" call Decho("w:netrrw_liststyle is TREELIST:")
5465" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
5466 if getline('.') =~ '/$'
5467 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
5468 else
5469 let treedir= ""
5470 endif
5471
5472" call Decho("treedir<".treedir.">")
5473
5474 " detect user attempting to close treeroot
5475 if getline('.') !~ '|' && getline('.') != '..'
5476" call Decho("user attempted to close treeroot")
5477 " now force a refresh
5478" call Decho("clear buffer<".expand("%")."> with :%d")
5479 keepjumps %d
5480" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5481 return b:netrw_curdir
5482 endif
5483
5484 " elide all non-depth information
5485 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
5486" call Decho("depth<".depth."> 1st subst")
5487
5488 " elide first depth
5489 let depth = substitute(depth,'^| ','','')
5490" call Decho("depth<".depth."> 2nd subst")
5491
5492 " construct treedir by searching backwards at correct depth
5493" call Decho("constructing treedir<".treedir."> depth<".depth.">")
5494 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
5495 let dirname= substitute(getline('.'),'^\(| \)*','','e')
5496 let treedir= dirname.treedir
5497 let depth = substitute(depth,'^| ','','')
5498" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
5499 endwhile
5500 if w:netrw_treetop =~ '/$'
5501 let treedir= w:netrw_treetop.treedir
5502 else
5503 let treedir= w:netrw_treetop.'/'.treedir
5504 endif
5505" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
5506 endif
5507 let treedir= substitute(treedir,'//$','/','')
5508
5509" " now force a refresh
5510"" call DECHO("clear buffer<".expand("%")."> with :%d")
5511" setlocal ma noro
5512" keepjumps %d
5513
5514" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5515 return treedir
5516endfun
5517
5518" ---------------------------------------------------------------------
5519" s:NetrwTreeDisplay: recursive tree display {{{2
5520fun! s:NetrwTreeDisplay(dir,depth)
5521" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
5522
5523 " insure that there are no folds
5524 setlocal nofen
5525
5526 " install ../ and shortdir
5527 if a:depth == ""
5528 call setline(line("$")+1,'../')
5529" call Decho("setline#".line("$")." ../ (depth is zero)")
5530 endif
5531 if a:dir =~ '^\a\+://'
5532 if a:dir == w:netrw_treetop
5533 let shortdir= a:dir
5534 else
5535 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
5536 endif
5537 call setline(line("$")+1,a:depth.shortdir)
5538 else
5539 let shortdir= substitute(a:dir,'^.*/','','e')
5540 call setline(line("$")+1,a:depth.shortdir.'/')
5541 endif
5542" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
5543
5544 " append a / to dir if its missing one
5545 let dir= a:dir
5546 if dir !~ '/$'
5547 let dir= dir.'/'
5548 endif
5549
5550 " display subtrees (if any)
5551 let depth= "| ".a:depth
5552
5553" call Decho("display subtrees with depth<".depth."> and current leaves")
5554 for entry in w:netrw_treedict[a:dir]
5555 let direntry= substitute(dir.entry,'/$','','e')
5556" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
5557 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
5558" call Decho("<".direntry."> is a key in treedict - display subtree for it")
5559 call s:NetrwTreeDisplay(direntry,depth)
5560 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
5561" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
5562 call s:NetrwTreeDisplay(direntry.'/',depth)
5563 else
5564" call Decho("<".entry."> is not a key in treedict (no subtree)")
5565 call setline(line("$")+1,depth.entry)
5566 endif
5567 endfor
5568" call Dret("NetrwTreeDisplay")
5569endfun
5570
5571" ---------------------------------------------------------------------
5572" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
5573fun! s:NetrwTreeListing(dirname)
5574 if w:netrw_liststyle == s:TREELIST
5575" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
5576" call Decho("curdir<".a:dirname.">")
5577" 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"))
5578
5579 " update the treetop
5580" call Decho("update the treetop")
5581 if !exists("w:netrw_treetop")
5582 let w:netrw_treetop= a:dirname
5583" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
5584 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
5585 let w:netrw_treetop= a:dirname
5586" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
5587 endif
5588
5589 " insure that we have at least an empty treedict
5590 if !exists("w:netrw_treedict")
5591 let w:netrw_treedict= {}
5592 endif
5593
5594 " update the directory listing for the current directory
5595" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
5596" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
5597 exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
5598 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
5599" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname])
5600 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
5601
5602 " if past banner, record word
5603 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
5604 let fname= expand("<cword>")
5605 else
5606 let fname= ""
5607 endif
5608" call Decho("fname<".fname.">")
5609
5610 " display from treetop on down
5611 call s:NetrwTreeDisplay(w:netrw_treetop,"")
5612
5613" call Dret("NetrwTreeListing : bufname<".expand("%").">")
5614 endif
5615endfun
5616
5617" ---------------------------------------------------------------------
5618" s:NetrwWideListing: {{{2
5619fun! s:NetrwWideListing()
5620
5621 if w:netrw_liststyle == s:WIDELIST
5622" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
5623 " look for longest filename (cpf=characters per filename)
5624 " cpf: characters per file
5625 " fpl: files per line
5626 " fpc: files per column
5627 setlocal ma noro
5628" call Decho("setlocal ma noro")
5629 let b:netrw_cpf= 0
5630 if line("$") >= w:netrw_bannercnt
5631 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
5632 else
5633" call Dret("NetrwWideListing")
5634 return
5635 endif
5636" call Decho("max file strlen+1=".b:netrw_cpf)
5637 let b:netrw_cpf= b:netrw_cpf + 1
5638
5639 " determine qty files per line (fpl)
5640 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
5641 if w:netrw_fpl <= 0
5642 let w:netrw_fpl= 1
5643 endif
5644" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
5645
5646 " make wide display
5647 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
5648 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
5649 let newcolstart = w:netrw_bannercnt + fpc
5650 let newcolend = newcolstart + fpc - 1
5651" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
5652 silent! let keepregstar = @*
5653 while line("$") >= newcolstart
5654 if newcolend > line("$") | let newcolend= line("$") | endif
5655 let newcolqty= newcolend - newcolstart
5656 exe newcolstart
5657 if newcolqty == 0
5658 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
5659 else
5660 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
5661 endif
5662 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
5663 exe 'silent keepjumps '.w:netrw_bannercnt
5664 endwhile
5665 silent! let @*= keepregstar
5666 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
5667 setlocal noma nomod ro
5668" call Dret("NetrwWideListing")
5669 endif
5670
5671endfun
5672
5673" ---------------------------------------------------------------------
5674" s:PerformListing: {{{2
5675fun! s:PerformListing(islocal)
5676" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
5677
5678 call s:NetrwSafeOptions()
5679 setlocal noro ma
5680" call Decho("setlocal noro ma")
5681
5682" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
5683" call Decho("(netrw) Processing your browsing request...")
5684" endif " Decho
5685
5686" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
5687 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5688 " force a refresh for tree listings
5689" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
5690 keepjumps %d
5691 endif
5692
5693 " save current directory on directory history list
5694 call s:NetrwBookmarkDir(3,b:netrw_curdir)
5695
5696 " Set up the banner {{{3
5697" call Decho("set up banner")
5698 keepjumps put ='\" ============================================================================'
5699 keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
5700 keepjumps put ='\" '.b:netrw_curdir
5701 keepjumps 1d
5702 let w:netrw_bannercnt= 3
5703 exe "keepjumps ".w:netrw_bannercnt
5704
5705 let sortby= g:netrw_sort_by
5706 if g:netrw_sort_direction =~ "^r"
5707 let sortby= sortby." reversed"
5708 endif
5709
5710 " Sorted by... {{{3
5711" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
5712 if g:netrw_sort_by =~ "^n"
5713" call Decho("directories will be sorted by name")
5714 " sorted by name
5715 keepjumps put ='\" Sorted by '.sortby
5716 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
5717 let w:netrw_bannercnt= w:netrw_bannercnt + 2
5718 else
5719" call Decho("directories will be sorted by size or time")
5720 " sorted by size or date
5721 keepjumps put ='\" Sorted by '.sortby
5722 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5723 endif
5724 exe "keepjumps ".w:netrw_bannercnt
5725
5726 " show copy/move target, if any
5727 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
5728" call Decho("show copy/move target<".s:netrwmftgt.">")
5729 keepjumps put =''
5730 if s:netrwmftgt_islocal
5731 call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
5732 else
5733 call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
5734 endif
5735 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5736 else
5737" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
5738 endif
5739 exe "keepjumps ".w:netrw_bannercnt
5740
5741 " Hiding... -or- Showing... {{{3
5742" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
5743 if g:netrw_list_hide != "" && g:netrw_hide
5744 if g:netrw_hide == 1
5745 keepjumps put ='\" Hiding: '.g:netrw_list_hide
5746 else
5747 keepjumps put ='\" Showing: '.g:netrw_list_hide
5748 endif
5749 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5750 endif
5751 exe "keepjumps ".w:netrw_bannercnt
5752 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
5753 keepjumps put ='\" ============================================================================'
5754 let w:netrw_bannercnt= w:netrw_bannercnt + 2
5755
5756 " bannercnt should index the line just after the banner
5757 let w:netrw_bannercnt= w:netrw_bannercnt + 1
5758 exe "keepjumps ".w:netrw_bannercnt
5759" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
5760
5761 " set up syntax highlighting {{{3
5762" call Decho("set up syntax highlighting")
5763 if has("syntax")
5764 setlocal ft=netrw
5765 if !exists("g:syntax_on") || !g:syntax_on
5766 setlocal ft=
5767 endif
5768 endif
5769
5770 " get list of files
5771" call Decho("Get list of files - islocal=".a:islocal)
5772 if a:islocal
5773 call s:LocalListing()
5774 else " remote
5775 call s:NetrwRemoteListing()
5776 endif
5777" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
5778
5779 " manipulate the directory listing (hide, sort) {{{3
5780 if line("$") >= w:netrw_bannercnt
5781" call Decho("manipulate directory listing (hide)")
5782" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
5783 if g:netrw_hide && g:netrw_list_hide != ""
5784 call s:NetrwListHide()
5785 endif
5786 if line("$") >= w:netrw_bannercnt
5787" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
5788
5789 if g:netrw_sort_by =~ "^n"
5790 " sort by name
5791 call s:NetrwSetSort()
5792
5793 if w:netrw_bannercnt < line("$")
5794" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
5795 if g:netrw_sort_direction =~ 'n'
5796 " normal direction sorting
5797 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
5798 else
5799 " reverse direction sorting
5800 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
5801 endif
5802 endif
5803 " remove priority pattern prefix
5804" call Decho("remove priority pattern prefix")
5805 let sepchr= "\<Char-0xff>"
5806 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e'
5807
5808 elseif a:islocal
5809 if w:netrw_bannercnt < line("$")
5810" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
5811 if g:netrw_sort_direction =~ 'n'
5812" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
5813 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
5814 else
5815" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
5816 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
5817 endif
5818 endif
5819 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
5820 endif
5821
5822 elseif g:netrw_sort_direction =~ 'r'
5823" call Decho('reverse the sorted listing')
5824 exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
5825 endif
5826 endif
5827
5828 " convert to wide/tree listing {{{3
5829" call Decho("modify display if wide/tree listing style")
5830 call s:NetrwWideListing()
5831 call s:NetrwTreeListing(b:netrw_curdir)
5832
5833 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
5834 " place cursor on the top-left corner of the file listing
5835" call Decho("place cursor on top-left corner of file listing")
5836 exe 'silent keepjumps '.w:netrw_bannercnt
5837 norm! 0
5838 endif
5839
5840 " record previous current directory
5841 let w:netrw_prvdir= b:netrw_curdir
5842" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
5843
5844 " save certain window-oriented variables into buffer-oriented variables {{{3
5845 call s:SetBufWinVars()
5846 call s:NetrwOptionRestore("w:")
5847
5848 " set display to netrw display settings
5849" call Decho("set display to netrw display settings (noma nomod etc)")
5850 setlocal noma nomod nonu nobl nowrap ro
5851 if exists("s:treecurpos")
5852
5853 call netrw#NetrwRestorePosn(s:treecurpos)
5854 unlet s:treecurpos
5855 endif
5856
5857" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
5858endfun
5859
5860" ---------------------------------------------------------------------
5861" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00005862fun! s:SetupNetrwStatusLine(statline)
5863" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5864
5865 if !exists("s:netrw_setup_statline")
5866 let s:netrw_setup_statline= 1
5867" call Decho("do first-time status line setup")
5868
5869 if !exists("s:netrw_users_stl")
5870 let s:netrw_users_stl= &stl
5871 endif
5872 if !exists("s:netrw_users_ls")
5873 let s:netrw_users_ls= &laststatus
5874 endif
5875
5876 " set up User9 highlighting as needed
5877 let keepa= @a
5878 redir @a
5879 try
5880 hi User9
5881 catch /^Vim\%((\a\+)\)\=:E411/
5882 if &bg == "dark"
5883 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5884 else
5885 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5886 endif
5887 endtry
5888 redir END
5889 let @a= keepa
5890 endif
5891
5892 " set up status line (may use User9 highlighting)
5893 " insure that windows have a statusline
5894 " make sure statusline is displayed
5895 let &stl=a:statline
5896 setlocal laststatus=2
5897" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005898 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00005899
5900" call Dret("SetupNetrwStatusLine : stl=".&stl)
5901endfun
5902
5903" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005904" Remote Directory Browsing Support: {{{1
5905" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00005906
5907" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005908" s:NetrwRemoteListing: {{{2
5909fun! s:NetrwRemoteListing()
5910" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00005911
Bram Moolenaar446cb832008-06-24 21:56:24 +00005912 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005913
Bram Moolenaar446cb832008-06-24 21:56:24 +00005914 " sanity check:
5915 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
5916" call Decho("b:netrw_method=".b:netrw_method)
5917 if !executable("ftp")
5918 if !exists("g:netrw_quiet")
5919 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
5920 endif
5921 call s:NetrwOptionRestore("w:")
5922" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005923 return
5924 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005925
5926 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
5927 if !exists("g:netrw_quiet")
5928 if g:netrw_list_cmd == ""
5929 call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
5930 else
5931 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
5932 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005933 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005934
Bram Moolenaar446cb832008-06-24 21:56:24 +00005935 call s:NetrwOptionRestore("w:")
5936" call Dret("s:NetrwRemoteListing")
5937 return
5938 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00005939
Bram Moolenaar446cb832008-06-24 21:56:24 +00005940 if exists("b:netrw_method")
5941" call Decho("setting w:netrw_method<".b:netrw_method.">")
5942 let w:netrw_method= b:netrw_method
5943 endif
5944
5945 if s:method == "ftp"
5946 " use ftp to get remote file listing
5947" call Decho("use ftp to get remote file listing")
5948 let s:method = "ftp"
5949 let listcmd = g:netrw_ftp_list_cmd
5950 if g:netrw_sort_by =~ '^t'
5951 let listcmd= g:netrw_ftp_timelist_cmd
5952 elseif g:netrw_sort_by =~ '^s'
5953 let listcmd= g:netrw_ftp_sizelist_cmd
5954 endif
5955" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
5956 call s:NetrwRemoteFtpCmd(s:path,listcmd)
5957" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
5958
5959 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
5960 " shorten the listing
5961" call Decho("generate short listing")
5962 exe "keepjumps ".w:netrw_bannercnt
5963
5964 " cleanup
5965 if g:netrw_ftp_browse_reject != ""
5966 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
5967 endif
5968 silent! keepjumps %s/\r$//e
5969
5970 " if there's no ../ listed, then put ./ and ../ in
5971 let line1= line(".")
5972 exe "keepjumps ".w:netrw_bannercnt
5973 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
5974 if line2 == 0
5975" call Decho("netrw is putting ./ and ../ into listing")
5976 keepjumps put='../'
5977 keepjumps put='./'
5978 endif
5979 exe "keepjumps ".line1
5980 keepjumps norm! 0
5981
5982" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
5983 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
5984" call Decho("M$ ftp cleanup")
5985 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
5986 else " normal ftp cleanup
5987" call Decho("normal ftp cleanup")
5988 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
5989 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
5990 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
5991 endif
5992 endif
5993
5994 else
5995 " use ssh to get remote file listing {{{3
5996" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
5997 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
5998" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
5999 if g:netrw_scp_cmd =~ '^pscp'
6000" call Decho("1: exe silent r! ".listcmd.shellescape(s:path))
6001 exe "silent r! ".listcmd.shellescape(s:path)
6002 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
6003 g/^Listing directory/d
6004 g/^d[-rwx][-rwx][-rwx]/s+$+/+e
6005 silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e
6006 if g:netrw_liststyle != s:LONGLIST
6007 g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e
6008 endif
6009 else
6010 if s:path == ""
6011" call Decho("2: exe silent r! ".listcmd)
6012 exe "silent r! ".listcmd
6013 else
6014" call Decho("3: exe silent r! ".listcmd.' "'.shellescape(s:path).'"')
6015 exe "silent r! ".listcmd.' "'.shellescape(s:path).'"'
6016" call Decho("listcmd<".listcmd."> path<".s:path.">")
6017 endif
6018 endif
6019
6020 " cleanup
6021 if g:netrw_ftp_browse_reject != ""
6022" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
6023 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
6024 endif
6025 endif
6026
6027 if w:netrw_liststyle == s:LONGLIST
6028 " do a long listing; these substitutions need to be done prior to sorting {{{3
6029" call Decho("fix long listing:")
6030
6031 if s:method == "ftp"
6032 " cleanup
6033 exe "keepjumps ".w:netrw_bannercnt
6034 while getline('.') =~ g:netrw_ftp_browse_reject
6035 keepjumps d
6036 endwhile
6037 " if there's no ../ listed, then put ./ and ../ in
6038 let line1= line(".")
6039 keepjumps 1
6040 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
6041 let line2= line(".")
6042 if line2 == 0
6043 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
6044 if b:netrw_curdir != '/'
6045 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
6046 endif
6047 endif
6048 exe "keepjumps ".line1
6049 keepjumps norm! 0
6050 endif
6051
6052 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6053" call Decho("M$ ftp site listing cleanup")
6054 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/'
6055 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6056" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
6057 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
6058 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6059 exe 'silent keepjumps '.w:netrw_bannercnt
6060 endif
6061 endif
6062
6063" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
6064" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
6065" endif " Decho
6066" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006067endfun
6068
Bram Moolenaar446cb832008-06-24 21:56:24 +00006069" ---------------------------------------------------------------------
6070" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6071fun! s:NetrwRemoteRm(usrhost,path) range
6072" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6073" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6074 let svpos= netrw#NetrwSavePosn()
6075
6076 let all= 0
6077 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6078 " remove all marked files
6079 for fname in s:netrwmarkfilelist_{bufnr("%")}
6080 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6081 if ok =~ 'q\%[uit]'
6082 break
6083 elseif ok =~ 'a\%[ll]'
6084 let all= 1
6085 endif
6086 endfor
6087 unlet s:netrwmarkfilelist_{bufnr("%")}
6088 unlet s:netrwmarkfilemtch_{bufnr("%")}
6089 2match none
6090
6091 else
6092 " remove files specified by range
6093
6094 " preparation for removing multiple files/directories
6095 let ctr= a:firstline
6096
6097 " remove multiple files and directories
6098 while ctr <= a:lastline
6099 exe ctr
6100 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6101 if ok =~ 'q\%[uit]'
6102 break
6103 elseif ok =~ 'a\%[ll]'
6104 let all= 1
6105 endif
6106 let ctr= ctr + 1
6107 endwhile
6108 endif
6109
6110 " refresh the (remote) directory listing
6111" call Decho("refresh remote directory listing")
6112 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6113 call netrw#NetrwRestorePosn(svpos)
6114
6115" call Dret("s:NetrwRemoteRm")
6116endfun
6117
6118" ---------------------------------------------------------------------
6119" s:NetrwRemoteRmFile: {{{2
6120fun! s:NetrwRemoteRmFile(path,rmfile,all)
6121" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6122
6123 let all= a:all
6124 let ok = ""
6125
6126 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6127 " attempt to remove file
6128" call Decho("attempt to remove file (all=".all.")")
6129 if !all
6130 echohl Statement
6131" call Decho("case all=0:")
6132 call inputsave()
6133 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6134 call inputrestore()
6135 echohl NONE
6136 if ok == ""
6137 let ok="no"
6138 endif
6139 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6140 if ok =~ 'a\%[ll]'
6141 let all= 1
6142 endif
6143 endif
6144
6145 if all || ok =~ 'y\%[es]' || ok == ""
6146" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
6147 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6148" call Decho("case ftp:")
6149 let path= a:path
6150 if path =~ '^\a\+://'
6151 let path= substitute(path,'^\a\+://[^/]\+/','','')
6152 endif
6153 silent! keepjumps .,$d
6154 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
6155 else
6156" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
6157 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
6158" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6159 if !exists("b:netrw_curdir")
6160 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
6161 let ok="q"
6162 else
6163 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6164" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6165" call Decho("remotedir<".remotedir.">")
6166" call Decho("rmfile<".a:rmfile.">")
6167 if remotedir != ""
6168 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
6169 else
6170 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
6171 endif
6172" call Decho("call system(".netrw_rm_cmd.")")
6173 let ret= system(netrw_rm_cmd)
6174 if ret != 0
6175 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
6176 endif
6177" call Decho("returned=".ret." errcode=".v:shell_error)
6178 endif
6179 endif
6180 elseif ok =~ 'q\%[uit]'
6181" call Decho("ok==".ok)
6182 break
6183 endif
6184
6185 else
6186 " attempt to remove directory
6187" call Decho("attempt to remove directory")
6188 if !all
6189 call inputsave()
6190 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6191 call inputrestore()
6192 if ok == ""
6193 let ok="no"
6194 endif
6195 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6196 if ok =~ 'a\%[ll]'
6197 let all= 1
6198 endif
6199 endif
6200
6201 if all || ok =~ 'y\%[es]' || ok == ""
6202 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6203 call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
6204 else
6205 let rmfile = substitute(a:path.a:rmfile,'/$','','')
6206 let netrw_rmdir_cmd = s:MakeSshCmd(g:netrw_rmdir_cmd).' '.rmfile
6207" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
6208 let ret= s:System("system",netrw_rmdir_cmd)
6209" call Decho("returned=".ret." errcode=".v:shell_error)
6210
6211 if v:shell_error != 0
6212" call Decho("v:shell_error not 0")
6213 let netrw_rmf_cmd= s:MakeSshCmd(g:netrw_rmf_cmd).' '.substitute(rmfile,'[\/]$','','e')
6214" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
6215 let ret= s:System("system",netrw_rmf_cmd)
6216" call Decho("returned=".ret." errcode=".v:shell_error)
6217
6218 if v:shell_error != 0 && !exists("g:netrw_quiet")
6219 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
6220 endif
6221 endif
6222 endif
6223
6224 elseif ok =~ 'q\%[uit]'
6225 break
6226 endif
6227 endif
6228
6229" call Dret("s:NetrwRemoteRmFile ".ok)
6230 return ok
6231endfun
6232
6233" ---------------------------------------------------------------------
6234" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
6235" This function assumes that a long listing will be received. Size, time,
6236" and reverse sorts will be requested of the server but not otherwise
6237" enforced here.
6238fun! s:NetrwRemoteFtpCmd(path,listcmd)
6239" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
6240" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
6241
6242 " because WinXX ftp uses unix style input
6243 let ffkeep= &ff
6244 setlocal ma ff=unix noro
6245" call Decho("setlocal ma ff=unix noro")
6246
6247 " clear off any older non-banner lines
6248 " note that w:netrw_bannercnt indexes the line after the banner
6249" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
6250 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
6251
6252 ".........................................
6253 if w:netrw_method == 2 || w:netrw_method == 5
6254 " ftp + <.netrc>: Method #2
6255 if a:path != ""
6256 put ='cd \"'.a:path.'\"'
6257 endif
6258 if exists("g:netrw_ftpextracmd")
6259 exe "put ='".g:netrw_ftpextracmd."'"
6260" call Decho("filter input: ".getline('.'))
6261 endif
6262 call setline(line("$")+1,a:listcmd)
6263" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6264 if exists("g:netrw_port") && g:netrw_port != ""
6265" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
6266 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
6267 else
6268" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
6269 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
6270 endif
6271
6272 ".........................................
6273 elseif w:netrw_method == 3
6274 " ftp + machine,id,passwd,filename: Method #3
6275 setlocal ff=unix
6276 if exists("g:netrw_port") && g:netrw_port != ""
6277 put ='open '.g:netrw_machine.' '.g:netrw_port
6278 else
6279 put ='open '.g:netrw_machine
6280 endif
6281
6282 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6283 put =g:netrw_uid
6284 put ='\"'.s:netrw_passwd.'\"'
6285 else
6286 put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6287 endif
6288
6289 if a:path != ""
6290 put ='cd \"'.a:path.'\"'
6291 endif
6292 if exists("g:netrw_ftpextracmd")
6293 exe "put ='".g:netrw_ftpextracmd."'"
6294" call Decho("filter input: ".getline('.'))
6295 endif
6296 call setline(line("$")+1,a:listcmd)
6297
6298 " perform ftp:
6299 " -i : turns off interactive prompting from ftp
6300 " -n unix : DON'T use <.netrc>, even though it exists
6301 " -n win32: quit being obnoxious about password
6302" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6303" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
6304 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
6305
6306 ".........................................
6307 else
6308 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
6309 endif
6310
6311 " cleanup for Windows
6312 if has("win32") || has("win95") || has("win64") || has("win16")
6313 silent! keepjumps %s/\r$//e
6314 endif
6315 if a:listcmd == "dir"
6316 " infer directory/link based on the file permission string
6317 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
6318 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
6319 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6320 exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
6321 endif
6322 endif
6323
6324 " ftp's listing doesn't seem to include ./ or ../
6325 if !search('^\.\/$\|\s\.\/$','wn')
6326 exe 'keepjumps '.w:netrw_bannercnt
6327 put ='./'
6328 endif
6329 if !search('^\.\.\/$\|\s\.\.\/$','wn')
6330 exe 'keepjumps '.w:netrw_bannercnt
6331 put ='../'
6332 endif
6333
6334 " restore settings
6335 let &ff= ffkeep
6336" call Dret("NetrwRemoteFtpCmd")
6337endfun
6338
6339" ---------------------------------------------------------------------
6340" s:NetrwRemoteRename: rename a remote file or directory {{{2
6341fun! s:NetrwRemoteRename(usrhost,path) range
6342" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
6343
6344 " preparation for removing multiple files/directories
6345 let svpos = netrw#NetrwSavePosn()
6346 let ctr = a:firstline
6347 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
6348
6349 " rename files given by the markfilelist
6350 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6351 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6352" call Decho("oldname<".oldname.">")
6353 if exists("subfrom")
6354 let newname= substitute(oldname,subfrom,subto,'')
6355" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6356 else
6357 call inputsave()
6358 let newname= input("Moving ".oldname." to : ",oldname)
6359 call inputrestore()
6360 if newname =~ '^s/'
6361 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6362 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6363 let newname = substitute(oldname,subfrom,subto,'')
6364" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6365 endif
6366 endif
6367
6368 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6369 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6370 else
6371 let oldname= a:path.oldname
6372 let newname= a:path.newname
6373" call Decho("system(rename_cmd".' "'.fnameescape(oldname," ").'" "'.escape(newname).'"')
6374 let ret= s:System("system",rename_cmd.' "'.fnameescape(oldname).'" "'.fnameescape(newname).'"')
6375 endif
6376
6377 endfor
6378 call s:NetrwUnMarkFile(1)
6379
6380 else
6381
6382 " attempt to rename files/directories
6383 while ctr <= a:lastline
6384 exe "keepjumps ".ctr
6385
6386 let oldname= s:NetrwGetWord()
6387" call Decho("oldname<".oldname.">")
6388
6389 call inputsave()
6390 let newname= input("Moving ".oldname." to : ",oldname)
6391 call inputrestore()
6392
6393 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6394 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6395 else
6396 let oldname= a:path.oldname
6397 let newname= a:path.newname
6398" call Decho("system(rename_cmd".' "'.fnameescape(oldname," ").'" "'.escape(newname).'"')
6399 let ret= s:System("system",rename_cmd.' "'.fnameescape(oldname).'" "'.fnameescape(newname).'"')
6400 endif
6401
6402 let ctr= ctr + 1
6403 endwhile
6404 endif
6405
6406 " refresh the directory
6407 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6408 call netrw#NetrwRestorePosn(svpos)
6409
6410" call Dret("NetrwRemoteRename")
6411endfun
6412
6413" ---------------------------------------------------------------------
6414" Local Directory Browsing Support: {{{1
6415" ==========================================
6416
6417" ---------------------------------------------------------------------
6418" netrw#LocalBrowseCheck: {{{2
6419fun! netrw#LocalBrowseCheck(dirname)
6420 " unfortunate interaction -- split window debugging can't be
6421 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
6422 " event triggers another call to LocalBrowseCheck() when attempts
6423 " to write to the DBG buffer are made.
6424 " The &ft == "netrw" test was installed because the BufEnter event
6425 " would hit when re-entering netrw windows, creating unexpected
6426 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
6427" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname))
6428 if isdirectory(a:dirname)
6429" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
6430 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
6431 silent! call s:NetrwBrowse(1,a:dirname)
6432 elseif &ft == "netrw" && line("$") == 1
6433 silent! call s:NetrwBrowse(1,a:dirname)
6434 endif
6435 endif
6436 " not a directory, ignore it
6437endfun
6438
6439" ---------------------------------------------------------------------
6440" s:LocalListing: does the job of "ls" for local directories {{{2
6441fun! s:LocalListing()
6442" call Dfunc("s:LocalListing()")
6443" call Decho("&ma=".&ma)
6444" call Decho("&mod=".&mod)
6445" call Decho("&ro=".&ro)
6446" call Decho("bufname(%)<".bufname("%").">")
6447
6448" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
6449" 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
6450
6451 " get the list of files contained in the current directory
6452 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6453 let dirnamelen = strlen(b:netrw_curdir)
6454 let filelist = glob(s:ComposePath(dirname,"*"))
6455" call Decho("glob(dirname<".dirname."/*>)=".filelist)
6456 if filelist != ""
6457 let filelist= filelist."\n"
6458 endif
6459 let filelist= filelist.glob(s:ComposePath(dirname,".*"))
6460" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
6461
6462 " Coding choice: either elide ./ if present
6463 " or include ./ if not present
6464 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
6465 " elide /path/. from glob() entries if present
6466" call Decho("elide /path/. from glob entries if present")
6467 let filelist = substitute(filelist,'\n','\t','g')
6468 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
6469 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
6470 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
6471 let filelist = substitute(filelist,'\t','\n','g')
6472 endif
6473" call Decho("filelist<".filelist.">")
6474 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
6475 " include ../ in the glob() entry if its missing
6476" call Decho("forcibly tacking on ..")
6477 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
6478" call Decho("filelist<".filelist.">")
6479 endif
6480 if b:netrw_curdir == '/'
6481 " remove .. from filelist when current directory is root directory
6482" call Decho("remove .. from filelist")
6483 let filelist= substitute(filelist,'/\.\.\n','','')
6484 endif
6485 " remove multiple contiguous newlines
6486 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
6487 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6488 " change all \s to /s
6489" call Decho('change all \s to /s')
6490 let filelist= substitute(filelist,'\','/','g')
6491 else
6492 " escape all \s to \\
6493" call Decho('escape all \s to \\')
6494 let filelist= substitute(filelist,'\','\\','g')
6495 endif
6496
6497" call Decho("(before while) dirname<".dirname.">")
6498" call Decho("(before while) dirnamelen<".dirnamelen.">")
6499" call Decho("(before while) filelist<".filelist.">")
6500
6501 while filelist != ""
6502 if filelist =~ '\n'
6503 let filename = substitute(filelist,'\n.*$','','e')
6504 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
6505 else
6506 let filename = filelist
6507 let filelist = ""
6508 endif
6509" call Decho(" ")
6510" call Decho("(while) filelist<".filelist.">")
6511" call Decho("(while) filename<".filename.">")
6512
6513 if getftype(filename) == "link"
6514 " indicate a symbolic link
6515" call Decho("indicate <".filename."> is a symbolic link with trailing @")
6516 let pfile= filename."@"
6517
6518 elseif getftype(filename) == "socket"
6519 " indicate a socket
6520" call Decho("indicate <".filename."> is a socket with trailing =")
6521 let pfile= filename."="
6522
6523 elseif getftype(filename) == "fifo"
6524 " indicate a fifo
6525" call Decho("indicate <".filename."> is a fifo with trailing |")
6526 let pfile= filename."|"
6527
6528 elseif isdirectory(filename)
6529 " indicate a directory
6530" call Decho("indicate <".filename."> is a directory with trailing /")
6531 let pfile= filename."/"
6532
6533 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
6534 if (has("win32") || has("win95") || has("win64") || has("win16"))
6535 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
6536 " indicate an executable
6537" call Decho("indicate <".filename."> is executable with trailing *")
6538 let pfile= filename."*"
6539 else
6540 " normal file
6541 let pfile= filename
6542 endif
6543 elseif executable(filename)
6544 " indicate an executable
6545" call Decho("indicate <".filename."> is executable with trailing *")
6546 let pfile= filename."*"
6547 else
6548 " normal file
6549 let pfile= filename
6550 endif
6551
6552 else
6553 " normal file
6554 let pfile= filename
6555 endif
6556" call Decho("pfile<".pfile."> (after *@/ appending)")
6557
6558 if pfile =~ '//$'
6559 let pfile= substitute(pfile,'//$','/','e')
6560" call Decho("change // to /: pfile<".pfile.">")
6561 endif
6562 let pfile= strpart(pfile,dirnamelen)
6563 let pfile= substitute(pfile,'^[/\\]','','e')
6564" call Decho("filename<".filename.">")
6565" call Decho("pfile <".pfile.">")
6566
6567 if w:netrw_liststyle == s:LONGLIST
6568 let sz = getfsize(filename)
6569 let fsz = strpart(" ",1,15-s:Strlen(sz)).sz
6570 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
6571" call Decho("sz=".sz." fsz=".fsz)
6572 endif
6573
6574 if g:netrw_sort_by =~ "^t"
6575 " sort by time (handles time up to 1 quintillion seconds, US)
6576" call Decho("getftime(".filename.")=".getftime(filename))
6577 let t = getftime(filename)
6578 let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t
6579" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
6580 let ftpfile= ft.'/'.pfile
6581 keepjumps silent! put=ftpfile
6582
6583 elseif g:netrw_sort_by =~ "^s"
6584 " sort by size (handles file sizes up to 1 quintillion bytes, US)
6585" call Decho("getfsize(".filename.")=".getfsize(filename))
6586 let sz = getfsize(filename)
6587 let fsz = strpart("000000000000000000",1,18-s:Strlen(sz)).sz
6588" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
6589 let fszpfile= fsz.'/'.pfile
6590 keepjumps silent! put =fszpfile
6591
6592 else
6593 " sort by name
6594" call Decho("exe keepjumps put ='".pfile."'")
6595 keepjumps silent! put=pfile
6596 endif
6597 endwhile
6598
6599 " cleanup any windows mess at end-of-line
6600 silent! keepjumps %s/\r$//e
6601 exe "setlocal ts=".g:netrw_maxfilenamelen
6602" call Decho("setlocal ts=".g:netrw_maxfilenamelen)
6603
6604" call Dret("s:LocalListing")
6605endfun
6606
6607" ---------------------------------------------------------------------
6608" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
6609" performed any shell command. The idea is to cause all local-browsing
6610" buffers to be refreshed after a user has executed some shell command,
6611" on the chance that s/he removed/created a file/directory with it.
6612fun! s:LocalBrowseShellCmdRefresh()
6613" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
6614 " determine which buffers currently reside in a tab
6615 if !exists("s:netrw_browselist")
6616" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
6617 return
6618 endif
6619 if !exists("w:netrw_bannercnt")
6620" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo")
6621 return
6622 endif
6623 let itab = 1
6624 let buftablist = []
6625 while itab <= tabpagenr("$")
6626 let buftablist = buftablist + tabpagebuflist()
6627 let itab = itab + 1
6628 tabn
6629 endwhile
6630" call Decho("buftablist".string(buftablist))
6631" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
6632 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
6633 " | refresh any netrw window
6634 " | wipe out any non-displaying netrw buffer
6635 let curwin = winnr()
6636 let ibl = 0
6637 for ibuf in s:netrw_browselist
6638" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
6639 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
6640 " wipe out any non-displaying netrw buffer
6641" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
6642 exe "silent! bd ".ibuf
6643 call remove(s:netrw_browselist,ibl)
6644" call Decho("browselist=".string(s:netrw_browselist))
6645 continue
6646 elseif index(tabpagebuflist(),ibuf) != -1
6647 " refresh any netrw buffer
6648" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
6649 exe bufwinnr(ibuf)."wincmd w"
6650 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6651 endif
6652 let ibl= ibl + 1
6653 endfor
6654 exe curwin."wincmd w"
6655
6656" call Dret("LocalBrowseShellCmdRefresh")
6657endfun
6658
6659" ---------------------------------------------------------------------
6660" s:NetrwLocalRm: {{{2
6661fun! s:NetrwLocalRm(path) range
6662" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
6663" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6664
6665 " preparation for removing multiple files/directories
6666 let ret = 0
6667 let all = 0
6668 let svpos = netrw#NetrwSavePosn()
6669
6670 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6671 " remove all marked files
6672" call Decho("remove all marked files")
6673 for fname in s:netrwmarkfilelist_{bufnr("%")}
6674 let ok= s:NetrwLocalRmFile(a:path,fname,all)
6675 if ok =~ 'q\%[uit]' || ok == "no"
6676 break
6677 elseif ok =~ 'a\%[ll]'
6678 let all= 1
6679 endif
6680 endfor
6681 call s:NetrwUnMarkFile(1)
6682
6683 else
6684 " remove (multiple) files and directories
6685" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
6686
6687 let ctr = a:firstline
6688 while ctr <= a:lastline
6689 exe "keepjumps ".ctr
6690
6691 " sanity checks
6692 if line(".") < w:netrw_bannercnt
6693 let ctr= ctr + 1
6694 continue
6695 endif
6696 let curword= s:NetrwGetWord()
6697 if curword == "./" || curword == "../"
6698 let ctr= ctr + 1
6699 continue
6700 endif
6701 let ok= s:NetrwLocalRmFile(a:path,curword,all)
6702 if ok =~ 'q\%[uit]' || ok == "no"
6703 break
6704 elseif ok =~ 'a\%[ll]'
6705 let all= 1
6706 endif
6707 let ctr= ctr + 1
6708 endwhile
6709 endif
6710
6711 " refresh the directory
6712" call Decho("bufname<".bufname("%").">")
6713 if bufname("%") != "NetrwMessage"
6714 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6715 call netrw#NetrwRestorePosn(svpos)
6716 endif
6717
6718" call Dret("s:NetrwLocalRm")
6719endfun
6720
6721" ---------------------------------------------------------------------
6722" s:NetrwLocalRmFile: remove file fname given the path {{{2
6723" Give confirmation prompt unless all==1
6724fun! s:NetrwLocalRmFile(path,fname,all)
6725" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
6726
6727 let all= a:all
6728 let ok = ""
6729 norm! 0
6730 let rmfile= s:ComposePath(a:path,a:fname)
6731" call Decho("rmfile<".rmfile.">")
6732
6733 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
6734 " attempt to remove file
6735" call Decho("attempt to remove file<".rmfile.">")
6736 if !all
6737 echohl Statement
6738 call inputsave()
6739 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6740 call inputrestore()
6741 echohl NONE
6742 if ok == ""
6743 let ok="no"
6744 endif
6745" call Decho("response: ok<".ok.">")
6746 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6747" call Decho("response: ok<".ok."> (after sub)")
6748 if ok =~ 'a\%[ll]'
6749 let all= 1
6750 endif
6751 endif
6752
6753 if all || ok =~ 'y\%[es]' || ok == ""
6754 let ret= s:System("delete",rmfile)
6755" call Decho("errcode=".v:shell_error." ret=".ret)
6756 endif
6757
6758 else
6759 " attempt to remove directory
6760 if !all
6761 echohl Statement
6762 call inputsave()
6763 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6764 call inputrestore()
6765 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6766 if ok == ""
6767 let ok="no"
6768 endif
6769 if ok =~ 'a\%[ll]'
6770 let all= 1
6771 endif
6772 endif
6773 let rmfile= substitute(rmfile,'[\/]$','','e')
6774
6775 if all || ok =~ 'y\%[es]' || ok == ""
6776" call Decho("1st attempt: system(".g:netrw_local_rmdir.' '.shellescape(rmfile).')')
6777 call s:System("system",g:netrw_local_rmdir.' '.shellescape(rmfile))
6778" call Decho("v:shell_error=".v:shell_error)
6779
6780 if v:shell_error != 0
6781" call Decho("2nd attempt to remove directory<".rmfile.">")
6782 let errcode= s:System("delete",rmfile)
6783" call Decho("errcode=".errcode)
6784
6785 if errcode != 0
6786 if has("unix")
6787" call Decho("3rd attempt to remove directory<".rmfile.">")
6788 call s:System("system","rm ".shellescape(rmfile))
6789 if v:shell_error != 0 && !exists("g:netrw_quiet")
6790 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
6791 let ok="no"
6792 endif
6793 elseif !exists("g:netrw_quiet")
6794 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
6795 let ok="no"
6796 endif
6797 endif
6798 endif
6799 endif
6800 endif
6801
6802" call Dret("s:NetrwLocalRmFile ".ok)
6803 return ok
6804endfun
6805
6806" ---------------------------------------------------------------------
6807" s:NetrwLocalRename: rename a remote file or directory {{{2
6808fun! s:NetrwLocalRename(path) range
6809" call Dfunc("NetrwLocalRename(path<".a:path.">)")
6810
6811 " preparation for removing multiple files/directories
6812 let ctr = a:firstline
6813 let svpos= netrw#NetrwSavePosn()
6814
6815 " rename files given by the markfilelist
6816 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6817 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6818" call Decho("oldname<".oldname.">")
6819 if exists("subfrom")
6820 let newname= substitute(oldname,subfrom,subto,'')
6821" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6822 else
6823 call inputsave()
6824 let newname= input("Moving ".oldname." to : ",oldname)
6825 call inputrestore()
6826 if newname =~ '^s/'
6827 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6828 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6829" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6830 let newname = substitute(oldname,subfrom,subto,'')
6831 endif
6832 endif
6833 let ret= rename(oldname,newname)
6834 endfor
6835 2match none
6836 unlet s:netrwmarkfilelist_{bufnr("%")}
6837 unlet s:netrwmarkfilemtch_{bufnr("%")}
6838
6839 else
6840
6841 " attempt to rename files/directories
6842 while ctr <= a:lastline
6843 exe "keepjumps ".ctr
6844
6845 " sanity checks
6846 if line(".") < w:netrw_bannercnt
6847 let ctr= ctr + 1
6848 continue
6849 endif
6850 let curword= s:NetrwGetWord()
6851 if curword == "./" || curword == "../"
6852 let ctr= ctr + 1
6853 continue
6854 endif
6855
6856 norm! 0
6857 let oldname= s:ComposePath(a:path,curword)
6858" call Decho("oldname<".oldname.">")
6859
6860 call inputsave()
6861 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
6862 call inputrestore()
6863
6864 let ret= rename(oldname,newname)
6865" call Decho("renaming <".oldname."> to <".newname.">")
6866
6867 let ctr= ctr + 1
6868 endwhile
6869 endif
6870
6871 " refresh the directory
6872" call Decho("refresh the directory listing")
6873 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6874 call netrw#NetrwRestorePosn(svpos)
6875
6876" call Dret("NetrwLocalRename")
6877endfun
6878
6879" ---------------------------------------------------------------------
6880" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
6881"
6882" g:netrw_ Directory Is
6883" fastbrowse Local Remote
6884" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
6885" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
6886" fast 2 H H
6887"
6888" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
6889" Hiding a buffer means that it will be re-used when examined, hence "fast".
6890" (re-using a buffer may not be as accurate)
6891fun! s:LocalFastBrowser()
6892" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
6893
6894 " initialize browselist, a list of buffer numbers that the local browser has used
6895 if !exists("s:netrw_browselist")
6896" call Decho("initialize s:netrw_browselist")
6897 let s:netrw_browselist= []
6898 endif
6899
6900 " append current buffer to fastbrowse list
6901 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
6902" call Decho("appendng current buffer to browselist")
6903 call add(s:netrw_browselist,bufnr("%"))
6904" call Decho("browselist=".string(s:netrw_browselist))
6905 endif
6906
6907 " enable autocmd events to handle refreshing/removing local browser buffers
6908 " If local browse buffer is currently showing: refresh it
6909 " If local browse buffer is currently hidden : wipe it
6910 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
6911" call Decho("setting up local-browser shell command refresh")
6912 let s:netrw_browser_shellcmd= 1
6913 augroup AuNetrwShellCmd
6914 au!
6915 if (has("win32") || has("win95") || has("win64") || has("win16"))
6916 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
6917 else
6918 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
6919 endif
6920 augroup END
6921 endif
6922
6923 " user must have changed fastbrowse to its fast setting, so remove
6924 " the associated autocmd events
6925 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
6926" call Decho("remove AuNetrwShellCmd autcmd group")
6927 unlet s:netrw_browser_shellcmd
6928 augroup AuNetrwShellCmd
6929 au!
6930 augroup END
6931 augroup! AuNetrwShellCmd
6932 endif
6933
6934" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
6935endfun
6936
6937" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00006938" Support Functions: {{{1
6939
Bram Moolenaar488c6512005-08-11 20:09:58 +00006940" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006941" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
6942" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
6943" can't be called except via emenu. But due to locale, that menu line may not be called
6944" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
6945fun! s:UpdateBuffersMenu()
6946" call Dfunc("s:UpdateBuffersMenu()")
6947 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
6948 try
6949 silent emenu Buffers.Refresh\ menu
6950 catch /^Vim\%((\a\+)\)\=:E/
6951 let v:errmsg= ""
6952 silent call s:NetrwBMShow()
6953 endtry
6954 endif
6955" call Dret("s:UpdateBuffersMenu")
6956endfun
6957
6958" ---------------------------------------------------------------------
6959" s:NetrwBMShow: {{{2
6960fun! s:NetrwBMShow()
6961" call Dfunc("s:NetrwBMShow()")
6962 redir => bmshowraw
6963 menu
6964 redir END
6965 let bmshowlist = split(bmshowraw,'\n')
6966 if bmshowlist != []
6967 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
6968 if bmshowfuncs != []
6969 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
6970 if bmshowfunc =~ '^call.*BMShow()'
6971 exe "silent! ".bmshowfunc
6972 endif
6973 endif
6974 endif
6975" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
6976endfun
6977
6978" ---------------------------------------------------------------------
6979" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00006980fun! s:ComposePath(base,subdir)
6981" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006982
Bram Moolenaar9964e462007-05-05 17:54:07 +00006983 if(has("amiga"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006984" call Decho("amiga")
Bram Moolenaar9964e462007-05-05 17:54:07 +00006985 let ec = a:base[strlen(a:base)-1]
6986 if ec != '/' && ec != ':'
6987 let ret = a:base . "/" . a:subdir
6988 else
6989 let ret = a:base . a:subdir
6990 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006991
6992 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
6993" call Decho("windows")
6994 let ret= a:subdir
6995
Bram Moolenaar9964e462007-05-05 17:54:07 +00006996 elseif a:base =~ '^\a\+://'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006997" call Decho("remote linux/macos")
Bram Moolenaar9964e462007-05-05 17:54:07 +00006998 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
6999 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007000 if a:subdir == '../'
7001 if curpath =~ '[^/]/[^/]\+/$'
7002 let curpath= substitute(curpath,'[^/]\+/$','','')
7003 else
7004 let curpath=""
7005 endif
7006 let ret= urlbase.curpath
7007 else
7008 let ret= urlbase.curpath.a:subdir
7009 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007010" call Decho("urlbase<".urlbase.">")
7011" call Decho("curpath<".curpath.">")
7012" call Decho("ret<".ret.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007013
Bram Moolenaar9964e462007-05-05 17:54:07 +00007014 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007015" call Decho("local linux/macos")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007016 let ret = substitute(a:base."/".a:subdir,"//","/","g")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007017 if a:base =~ '^//'
7018 " keeping initial '//' for the benefit of network share listing support
7019 let ret= '/'.ret
7020 endif
7021 let ret= simplify(ret)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007022 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007023
Bram Moolenaar9964e462007-05-05 17:54:07 +00007024" call Dret("s:ComposePath ".ret)
7025 return ret
Bram Moolenaar488c6512005-08-11 20:09:58 +00007026endfun
7027
7028" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007029" netrw#ErrorMsg: {{{2
7030" 0=note = s:NOTE
7031" 1=warning = s:WARNING
7032" 2=error = s:ERROR
Bram Moolenaar446cb832008-06-24 21:56:24 +00007033" Jun 11, 2008 : max errnum currently is 70
Bram Moolenaar9964e462007-05-05 17:54:07 +00007034fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007035" 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 +00007036
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007037 if a:level == 1
7038 let level= "**warning** (netrw) "
7039 elseif a:level == 2
7040 let level= "**error** (netrw) "
7041 else
7042 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00007043 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007044" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007045
7046 if g:netrw_use_errorwindow
7047 " (default) netrw creates a one-line window to show error/warning
7048 " messages (reliably displayed)
7049
Bram Moolenaar446cb832008-06-24 21:56:24 +00007050 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007051 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007052" call Decho("s:winBeforeErr=".s:winBeforeErr)
7053
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007054 " getting messages out reliably is just plain difficult!
7055 " This attempt splits the current window, creating a one line window.
7056 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007057" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007058 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007059" call Decho("setlocal ma noro")
7060 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007061 call setline(line("$")+1,level.a:msg)
7062 $
7063 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007064" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007065 bo 1split
7066 enew
7067 setlocal bt=nofile
7068 file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00007069" call Decho("setlocal ma noro")
7070 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007071 call setline(line("$"),level.a:msg)
7072 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007073" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007074 if &fo !~ '[ta]'
7075 syn clear
7076 syn match netrwMesgNote "^\*\*note\*\*"
7077 syn match netrwMesgWarning "^\*\*warning\*\*"
7078 syn match netrwMesgError "^\*\*error\*\*"
7079 hi link netrwMesgWarning WarningMsg
7080 hi link netrwMesgError Error
7081 endif
7082 setlocal noma ro bh=wipe
7083
7084 else
7085 " (optional) netrw will show messages using echomsg. Even if the
7086 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00007087" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007088 if a:level == s:WARNING
7089 echohl WarningMsg
7090 elseif a:level == s:ERROR
7091 echohl Error
7092 endif
7093 echomsg level.a:msg
7094" call Decho("echomsg ***netrw*** ".a:msg)
7095 echohl None
7096 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007097
7098" call Dret("netrw#ErrorMsg")
7099endfun
7100
7101" ---------------------------------------------------------------------
7102" netrw#RFC2396: converts %xx into characters {{{2
7103fun! netrw#RFC2396(fname)
7104" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7105 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7106" call Dret("netrw#RFC2396 ".fname)
7107 return fname
7108endfun
7109
7110" ---------------------------------------------------------------------
7111" s:FileReadable: o/s independent filereadable {{{2
7112fun! s:FileReadable(fname)
7113" call Dfunc("s:FileReadable(fname<".a:fname.">)")
7114
7115 if g:netrw_cygwin
7116 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
7117 else
7118 let ret= filereadable(a:fname)
7119 endif
7120
7121" call Dret("s:FileReadable ".ret)
7122 return ret
7123endfun
7124
7125" ---------------------------------------------------------------------
7126" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
7127" Places correct suffix on end of temporary filename,
7128" using the suffix provided with fname
7129fun! s:GetTempfile(fname)
7130" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
7131
7132 if !exists("b:netrw_tmpfile")
7133 " get a brand new temporary filename
7134 let tmpfile= tempname()
7135" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007136
Bram Moolenaar9964e462007-05-05 17:54:07 +00007137 let tmpfile= escape(substitute(tmpfile,'\','/','ge'),g:netrw_tmpfile_escape)
7138" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007139
Bram Moolenaar9964e462007-05-05 17:54:07 +00007140 " sanity check -- does the temporary file's directory exist?
7141 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007142" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007143 call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
7144" call Dret("s:GetTempfile getcwd<".getcwd().">")
7145 return ""
7146 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007147
Bram Moolenaar9964e462007-05-05 17:54:07 +00007148 " let netrw#NetSource() know about the tmpfile
7149 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource()
7150" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007151
Bram Moolenaar9964e462007-05-05 17:54:07 +00007152 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00007153 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00007154 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
7155 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007156 if !exists("+shellslash") || !&ssl
7157 let tmpfile = substitute(tmpfile,'/','\','g')
7158 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007159 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007160 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00007161 endif
7162 let b:netrw_tmpfile= tmpfile
7163" call Decho("o/s dependent fixed tempname<".tmpfile.">")
7164 else
7165 " re-use temporary filename
7166 let tmpfile= b:netrw_tmpfile
7167" call Decho("tmpfile<".tmpfile."> re-using")
7168 endif
7169
7170 " use fname's suffix for the temporary file
7171 if a:fname != ""
7172 if a:fname =~ '\.[^./]\+$'
7173" call Decho("using fname<".a:fname.">'s suffix")
7174 if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2'
7175 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7176 else
7177 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7178 endif
7179 let suffix = escape(suffix,g:netrw_tmpfile_escape)
7180" call Decho("suffix<".suffix.">")
7181 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
7182" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
7183 let tmpfile .= suffix
7184" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
7185 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
7186 endif
7187 endif
7188
Bram Moolenaar446cb832008-06-24 21:56:24 +00007189" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007190" call Dret("s:GetTempfile <".tmpfile.">")
7191 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007192endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00007193
7194" ---------------------------------------------------------------------
7195" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
7196" a correct command
7197fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007198" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007199 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
7200 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007201 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007202 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007203 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007204 else
7205 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
7206 endif
7207" call Dret("s:MakeSshCmd <".sshcmd.">")
7208 return sshcmd
7209endfun
7210
7211" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007212" s:RemoteSystem: runs a command on a remote host using ssh {{{2
7213" Returns status
7214fun! s:RemoteSystem(cmd)
7215" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
7216 if !executable(g:netrw_ssh_cmd)
7217 call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
7218 elseif !exists("b:netrw_curdir")
7219 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
7220 else
7221 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
7222 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7223 if remotedir != ""
7224 let cmd= cmd.' "cd '.shellescape(remotedir).";"
7225 else
7226 let cmd= cmd.' "'
7227 endif
7228 let cmd= cmd.a:cmd.'"'
7229" call Decho("call system(".cmd.")")
7230 let ret= system(cmd)
7231 endif
7232" call Dret("s:RemoteSystem ".ret)
7233 return ret
7234endfun
7235
7236" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007237" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
7238fun! s:NetrwEnew(curdir)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007239" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007240
Bram Moolenaar446cb832008-06-24 21:56:24 +00007241 " grab a function-local-variable copy of buffer variables
Bram Moolenaar9964e462007-05-05 17:54:07 +00007242 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
7243 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
7244 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
7245 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
7246 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7247 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
7248 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
7249 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
7250 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
7251 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7252 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
7253 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
7254 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
7255 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
7256 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
7257 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
7258
Bram Moolenaar446cb832008-06-24 21:56:24 +00007259 call s:NetrwOptionRestore("w:")
7260" call Decho("generate a buffer with keepjumps keepalt enew!")
7261 keepjumps keepalt enew!
7262 call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007263
Bram Moolenaar446cb832008-06-24 21:56:24 +00007264 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar9964e462007-05-05 17:54:07 +00007265 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
7266 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
7267 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
7268 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
7269 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
7270 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
7271 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
7272 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
7273 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
7274 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
7275 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
7276 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
7277 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
7278 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
7279 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
7280 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
7281
7282 let b:netrw_curdir= a:curdir
7283 if b:netrw_curdir =~ '/$'
7284 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
7285 file NetrwTreeListing
Bram Moolenaar446cb832008-06-24 21:56:24 +00007286 nno <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
7287 nno <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00007288 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007289 exe "silent! keepalt file ".b:netrw_curdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00007290 endif
7291 endif
7292
Bram Moolenaar446cb832008-06-24 21:56:24 +00007293" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007294endfun
7295
7296" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007297" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7298fun! netrw#NetrwSavePosn()
7299" call Dfunc("netrw#NetrwSavePosn()")
7300 " Save current line and column
7301 let w:netrw_winnr= winnr()
7302 let w:netrw_line = line(".")
7303 let w:netrw_col = virtcol(".")
7304
7305 " Save top-of-screen line
7306 norm! H0
7307 let w:netrw_hline= line(".")
7308
7309 " set up string holding position parameters
7310 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
7311
7312 call netrw#NetrwRestorePosn()
7313" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7314 return ret
7315endfun
7316
7317" ------------------------------------------------------------------------
7318" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7319fun! netrw#NetrwRestorePosn(...)
7320" 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))
7321 let eikeep= &ei
7322 set ei=all
7323 if expand("%") == "NetrwMessage"
7324 exe s:winBeforeErr."wincmd w"
7325 endif
7326
7327 if a:0 > 0
7328 exe a:1
7329 endif
7330
7331 " restore window
7332 if exists("w:netrw_winnr")
7333" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
7334 exe "silent! ".w:netrw_winnr."wincmd w"
7335 endif
7336 if v:shell_error == 0
7337 " as suggested by Bram M: redraw on no error
7338 " allows protocol error messages to remain visible
7339" redraw!
7340 endif
7341
7342 " restore top-of-screen line
7343 if exists("w:netrw_hline")
7344" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
7345 exe "norm! ".w:netrw_hline."G0z\<CR>"
7346 endif
7347
7348 " restore position
7349 if exists("w:netrw_line") && exists("w:netrw_col")
7350" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
7351 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
7352 endif
7353
7354 let &ei= eikeep
7355" call Dret("netrw#NetrwRestorePosn")
7356endfun
7357
7358" ---------------------------------------------------------------------
7359" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
7360" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
7361fun! s:NetrwSaveWordPosn()
7362" call Dfunc("NetrwSaveWordPosn()")
7363 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
7364" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
7365endfun
7366
7367" ---------------------------------------------------------------------
7368" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
7369" changed sorting, etc. Also see s:NetrwSaveWordPosn().
7370fun! s:NetrwRestoreWordPosn()
7371" call Dfunc("NetrwRestoreWordPosn()")
7372 silent! call search(s:netrw_saveword,'w')
7373" call Dret("NetrwRestoreWordPosn")
7374endfun
7375
7376" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007377" s:RemotePathAnalysis: {{{2
7378fun! s:RemotePathAnalysis(dirname)
7379" call Dfunc("s:RemotePathAnalysis()")
7380
7381 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
7382 let s:method = substitute(a:dirname,dirpat,'\1','')
7383 let s:user = substitute(a:dirname,dirpat,'\2','')
7384 let s:machine = substitute(a:dirname,dirpat,'\3','')
7385 let s:port = substitute(a:dirname,dirpat,'\4','')
7386 let s:path = substitute(a:dirname,dirpat,'\5','')
7387 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
7388
7389" call Decho("set up s:method <".s:method .">")
7390" call Decho("set up s:user <".s:user .">")
7391" call Decho("set up s:machine<".s:machine.">")
7392" call Decho("set up s:port <".s:port.">")
7393" call Decho("set up s:path <".s:path .">")
7394" call Decho("set up s:fname <".s:fname .">")
7395
7396" call Dret("s:RemotePathAnalysis")
7397endfun
7398
7399" ---------------------------------------------------------------------
7400" s:RestoreBufVars: {{{2
7401fun! s:RestoreBufVars()
7402" call Dfunc("s:RestoreBufVars()")
7403
7404 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
7405 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
7406 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
7407 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
7408 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
7409 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
7410
7411" call Dret("s:RestoreBufVars")
7412endfun
7413
7414" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007415" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007416fun! s:RestoreWinVars()
7417" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00007418 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007419 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
7420 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
7421 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
7422 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
7423 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
7424 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
7425 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
7426 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
7427 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
7428 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
7429 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
7430 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00007431 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
7432 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007433 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
7434 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
7435 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
7436" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00007437endfun
7438
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007439" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007440" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
7441"
7442" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
7443" is true) and a command, :Rexplore, which call this function.
7444"
7445" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
7446fun! s:NetrwRexplore(islocal,dirname)
7447" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)")
7448 if a:islocal
7449 call netrw#LocalBrowseCheck(a:dirname)
7450 else
7451 call s:NetrwBrowse(0,a:dirname)
7452 endif
7453 if exists("s:nbcd_curpos_{bufnr('%')}")
7454 call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
7455 unlet s:nbcd_curpos_{bufnr('%')}
7456 endif
7457" call Dret("s:NetrwRexplore")
7458endfun
7459
7460" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007461" s:SaveBufVars: {{{2
7462fun! s:SaveBufVars()
7463" call Dfunc("s:SaveBufVars()")
7464
7465 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
7466 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
7467 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
7468 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
7469 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
7470 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
7471
7472" call Dret("s:SaveBufVars")
7473endfun
7474
7475" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007476" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007477fun! s:SaveWinVars()
7478" call Dfunc("s:SaveWinVars()")
7479 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
7480 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
7481 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
7482 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
7483 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
7484 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
7485 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
7486 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
7487 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
7488 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
7489 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
7490 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
7491 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
7492 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
7493 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
7494 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
7495 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
7496 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
7497" call Dret("s:SaveWinVars")
7498endfun
7499
7500" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007501" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007502" To allow separate windows to have their own activities, such as
7503" Explore **/pattern, several variables have been made window-oriented.
7504" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007505" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007506" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007507fun! s:SetBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007508" call Dfunc("s:SetBufWinVars()")
7509 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
7510 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
7511 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
7512 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
7513 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
7514 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
7515 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
7516 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
7517 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
7518 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
7519" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007520endfun
7521
7522" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007523" s:SetRexDir: set directory for :Rexplore {{{2
7524fun! s:SetRexDir(islocal,dirname)
7525" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
7526 " set up Rex and leftmouse-double-click
7527 if a:islocal
7528 exe 'com! Rexplore call s:NetrwRexplore(1,"'.a:dirname.'")'
7529 if g:netrw_retmap
7530 silent! unmap <2-leftmouse>
7531 if !hasmapto("<Plug>NetrwReturn")
7532 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7533 endif
7534 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.a:dirname.'")<cr>'
7535 endif
7536 else
7537 exe 'com! Rexplore call s:NetrwRexplore(0,"'.a:dirname.'")'
7538 if g:netrw_retmap
7539 silent! unmap <2-leftmouse>
7540 if !hasmapto("<Plug>NetrwReturn")
7541 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
7542 endif
7543 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.a:dirname.'")<cr>'
7544 endif
7545 endif
7546" call Dret("s:SetRexDir")
7547endfun
7548
7549" ---------------------------------------------------------------------
7550" s:Strlen: this function returns the length of a string, even if its {{{2
7551" using two-byte etc characters.
7552" Currently, its only used if g:Align_xstrlen is set to a
7553" nonzero value. Solution from Nicolai Weibull, vim docs
7554" (:help strlen()), Tony Mechelynck, and my own invention.
7555fun! s:Strlen(x)
7556" call Dfunc("s:Strlen(x<".a:x.">")
7557 if g:netrw_xstrlen == 1
7558 " number of codepoints (Latin a + combining circumflex is two codepoints)
7559 " (comment from TM, solution from NW)
7560 let ret= strlen(substitute(a:x,'.','c','g'))
7561
7562 elseif g:netrw_xstrlen == 2
7563 " number of spacing codepoints (Latin a + combining circumflex is one spacing
7564 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
7565 " (comment from TM, solution from TM)
7566 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
7567
7568 elseif g:netrw_xstrlen == 3
7569 " virtual length (counting, for instance, tabs as anything between 1 and
7570 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
7571 " preceded by lam, one otherwise, etc.)
7572 " (comment from TM, solution from me)
7573 let modkeep= &mod
7574 exe "norm! o\<esc>"
7575 call setline(line("."),a:x)
7576 let ret= virtcol("$") - 1
7577 d
7578 let &mod= modkeep
7579
7580 else
7581 " at least give a decent default
7582 ret= strlen(a:x)
7583 endif
7584" call Dret("s:Strlen ".ret)
7585 return ret
7586endfun
7587
7588" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007589" s:System: using Steve Hall's idea to insure that Windows paths stay {{{2
7590" acceptable. No effect on Unix paths.
Bram Moolenaar446cb832008-06-24 21:56:24 +00007591" Examples of use: let result= s:System("rm",path)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007592" let result= s:System("delete",path)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007593fun! netrw#System(cmd,path)
7594 echomsg s:System(a:cmd,a:path)
7595endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00007596fun! s:System(cmd,path)
7597" call Dfunc("s:System(cmd<".a:cmd."> path<".a:path.">)")
7598
7599 let path = a:path
Bram Moolenaar446cb832008-06-24 21:56:24 +00007600 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00007601 " system call prep
7602 " remove trailing slash (Win95)
7603 let path = substitute(path, '\(\\\|/\)$', '', 'g')
7604 " remove escaped spaces
7605 let path = substitute(path, '\ ', ' ', 'g')
7606 " convert slashes to backslashes
7607 let path = substitute(path, '/', '\', 'g')
7608 if exists("+shellslash")
7609 let sskeep= &shellslash
7610 setlocal noshellslash
7611 exe "let result= ".a:cmd."('".path."')"
7612 let &shellslash = sskeep
7613 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007614" call Decho("exe let result= ".a:cmd."('".path."')")
7615 exe "let result= ".a:cmd."('".path."')"
Bram Moolenaar9964e462007-05-05 17:54:07 +00007616 endif
7617 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007618" call Decho("exe let result= ".a:cmd."('".path."')")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007619 exe "let result= ".a:cmd."('".path."')"
7620 endif
7621
Bram Moolenaar446cb832008-06-24 21:56:24 +00007622" call Dret("s:System result<".result.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007623 return result
7624endfun
7625
7626" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007627" s:TreeListMove: {{{2
7628fun! s:TreeListMove(dir)
7629" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
7630 let curline = getline('.')
7631 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
7632 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
7633 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
7634 let indentm1 = substitute(curindent,'^| ','','')
7635" call Decho("prvline <".prvline."> #".line(".")-1)
7636" call Decho("curline <".curline."> #".line("."))
7637" call Decho("nxtline <".nxtline."> #".line(".")+1)
7638" call Decho("curindent<".curindent.">")
7639" call Decho("indentm1 <".indentm1.">")
7640
7641 if curline !~ '/$'
7642" call Decho('regfile')
7643 if a:dir == '[' && prvline != ''
7644 norm! 0
7645 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
7646" call Decho("regfile srch back: ".nl)
7647 elseif a:dir == ']' && nxtline != ''
7648 norm! $
7649 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
7650" call Decho("regfile srch fwd: ".nl)
7651 endif
7652
7653 elseif a:dir == '[' && prvline != ''
7654 norm! 0
7655 let curline= line(".")
7656 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
7657" call Decho("dir srch back ind: ".nl)
7658 if nl != 0
7659 if line(".") == curline-1
7660 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
7661" call Decho("dir srch back ind-1: ".nl)
7662 endif
7663 endif
7664
7665 elseif a:dir == ']' && nxtline != ''
7666 norm! $
7667 let curline = line(".")
7668 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
7669" call Decho("dir srch fwd ind: ".nl)
7670 if nl != 0
7671 if line(".") == curline+1
7672 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
7673" call Decho("dir srch fwd ind-1: ".nl)
7674 endif
7675 endif
7676
7677 endif
7678
7679" call Dret("s:TreeListMove")
7680endfun
7681
7682" ---------------------------------------------------------------------
7683" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007684" Matching function to BufferWinVars()
7685fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007686" call Dfunc("s:UseBufWinVars()")
7687 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007688 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
7689 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
7690 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
7691 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
7692 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
7693 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7694 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
7695 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
7696 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 +00007697" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00007698endfun
7699
Bram Moolenaar1afcace2005-11-25 19:54:28 +00007700" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00007701" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00007702let &cpo= s:keepcpo
7703unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00007704
Bram Moolenaar071d4272004-06-13 20:20:40 +00007705" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00007706" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00007707" vim:ts=8 fdm=marker