blob: 31659334520734de99ee5fe2a49526d03fbc48af [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 Moolenaar5b435d62012-04-05 17:33:26 +02003" Date: Apr 05, 2012
4" Version: 145
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 Moolenaar5ac3b1a2010-07-27 22:50:36 +02007" Copyright: Copyright (C) 1999-2010 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 Moolenaar5b435d62012-04-05 17:33:26 +020025let g:loaded_netrw = "v145"
Bram Moolenaar5c736222010-01-06 20:54:52 +010026if v:version < 702
27 echohl WarningMsg
28 echo "***warning*** this version of netrw needs vim 7.2"
29 echohl Normal
30 finish
31endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000032if !exists("s:NOTE")
33 let s:NOTE = 0
34 let s:WARNING = 1
35 let s:ERROR = 2
36endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000037
38" sanity checks
Bram Moolenaar578b49e2005-09-10 19:22:57 +000039if v:version < 700
Bram Moolenaar9964e462007-05-05 17:54:07 +000040 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 +000041 finish
42endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000043
Bram Moolenaar1afcace2005-11-25 19:54:28 +000044let s:keepcpo= &cpo
Bram Moolenaar5b435d62012-04-05 17:33:26 +020045set cpo&vim
Bram Moolenaar9964e462007-05-05 17:54:07 +000046"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 Moolenaar5b435d62012-04-05 17:33:26 +020054" netrw#ErrorMsg: {{{2
55" 0=note = s:NOTE
56" 1=warning = s:WARNING
57" 2=error = s:ERROR
58" Apr 05, 2012 : max errnum currently is 88
59fun! netrw#ErrorMsg(level,msg,errnum)
60" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
61
62 if a:level < g:netrw_errorlvl
63 call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g;netrw_errorlvl=".g:netrw_errorlvl)
64 return
65 endif
66
67 if a:level == 1
68 let level= "**warning** (netrw) "
69 elseif a:level == 2
70 let level= "**error** (netrw) "
71 else
72 let level= "**note** (netrw) "
73 endif
74" call Decho("level=".level)
75
76 if g:netrw_use_errorwindow
77 " (default) netrw creates a one-line window to show error/warning
78 " messages (reliably displayed)
79
80 " record current window number for NetrwRestorePosn()'s benefit
81 let s:winBeforeErr= winnr()
82" call Decho("s:winBeforeErr=".s:winBeforeErr)
83
84 " getting messages out reliably is just plain difficult!
85 " This attempt splits the current window, creating a one line window.
86 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
87" call Decho("write to NetrwMessage buffer")
88 exe bufwinnr("NetrwMessage")."wincmd w"
89" call Decho("setl ma noro")
90 setl ma noro
91 keepj call setline(line("$")+1,level.a:msg)
92 keepj $
93 else
94" call Decho("create a NetrwMessage buffer window")
95 bo 1split
96 sil! call s:NetrwEnew()
97 sil! keepj call s:NetrwSafeOptions()
98 setl bt=nofile
99 keepj file NetrwMessage
100" call Decho("setlocal ma noro")
101 setl ma noro
102 call setline(line("$"),level.a:msg)
103 endif
104" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
105 if &fo !~ '[ta]'
106 syn clear
107 syn match netrwMesgNote "^\*\*note\*\*"
108 syn match netrwMesgWarning "^\*\*warning\*\*"
109 syn match netrwMesgError "^\*\*error\*\*"
110 hi link netrwMesgWarning WarningMsg
111 hi link netrwMesgError Error
112 endif
113" call Decho("(ErrorMsg) setl noma ro bh=wipe")
114 setl noma ro bh=wipe
115
116 else
117 " (optional) netrw will show messages using echomsg. Even if the
118 " message doesn't appear, at least it'll be recallable via :messages
119" redraw!
120 if a:level == s:WARNING
121 echohl WarningMsg
122 elseif a:level == s:ERROR
123 echohl Error
124 endif
125 echomsg level.a:msg
126" call Decho("echomsg ***netrw*** ".a:msg)
127 echohl None
128 endif
129
130" call Dret("netrw#ErrorMsg")
131endfun
132
133" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +0100134" NetrwInit: initializes variables if they haven't been defined {{{2
135" Loosely, varname = value.
136fun s:NetrwInit(varname,value)
137 if !exists(a:varname)
138 if type(a:value) == 0
139 exe "let ".a:varname."=".a:value
140 elseif type(a:value) == 1
141 exe "let ".a:varname."="."'".a:value."'"
142 else
143 exe "let ".a:varname."=".a:value
144 endif
145 endif
146endfun
147
148" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +0000149" Netrw Constants: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100150call s:NetrwInit("g:netrw_dirhist_cnt",0)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000151if !exists("s:LONGLIST")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100152 call s:NetrwInit("s:THINLIST",0)
153 call s:NetrwInit("s:LONGLIST",1)
154 call s:NetrwInit("s:WIDELIST",2)
155 call s:NetrwInit("s:TREELIST",3)
156 call s:NetrwInit("s:MAXLIST" ,4)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000157endif
158
159" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000160" Default values for netrw's global protocol variables {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +0200161call s:NetrwInit("g:netrw_use_errorwindow",1)
162
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000163if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100164 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000165 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100166 elseif executable("curl")
167 let g:netrw_dav_cmd = "curl"
168 else
169 let g:netrw_dav_cmd = ""
170 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000171endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000172if !exists("g:netrw_fetch_cmd")
173 if executable("fetch")
174 let g:netrw_fetch_cmd = "fetch -o"
175 else
176 let g:netrw_fetch_cmd = ""
177 endif
178endif
179if !exists("g:netrw_ftp_cmd")
180 let g:netrw_ftp_cmd = "ftp"
181endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200182let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200183if !exists("g:netrw_ftp_options")
184 let g:netrw_ftp_options= "-i -n"
185endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000186if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000187 if executable("elinks")
188 let g:netrw_http_cmd = "elinks"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100189 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000190 elseif executable("links")
191 let g:netrw_http_cmd = "links"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100192 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000193 elseif executable("curl")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100194 let g:netrw_http_cmd = "curl"
195 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000196 elseif executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100197 let g:netrw_http_cmd = "wget"
198 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000199 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100200 let g:netrw_http_cmd = "fetch"
201 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000202 else
203 let g:netrw_http_cmd = ""
204 endif
205endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100206call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
207call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
208call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
209call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
210call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000211
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000212if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000213 \ && exists("g:netrw_use_nt_rcp")
214 \ && g:netrw_use_nt_rcp
215 \ && executable( $SystemRoot .'/system32/rcp.exe')
216 let s:netrw_has_nt_rcp = 1
217 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000218else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000219 let s:netrw_has_nt_rcp = 0
220 let s:netrw_rcpmode = ''
221endif
222
223" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000224" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000225" Cygwin Detection ------- {{{3
226if !exists("g:netrw_cygwin")
227 if has("win32") || has("win95") || has("win64") || has("win16")
228 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
229 let g:netrw_cygwin= 1
230 else
231 let g:netrw_cygwin= 0
232 endif
233 else
234 let g:netrw_cygwin= 0
235 endif
236endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000237" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100238call s:NetrwInit("g:netrw_alto" , &sb)
239call s:NetrwInit("g:netrw_altv" , &spr)
240call s:NetrwInit("g:netrw_banner" , 1)
241call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200242call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100243call s:NetrwInit("g:netrw_chgwin" , -1)
244call s:NetrwInit("g:netrw_compress" , "gzip")
245call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200246if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
247 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
248 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000249endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200250call s:NetrwInit("g:netrw_cursor" , 2)
251let s:netrw_usercul = &cursorline
252let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar446cb832008-06-24 21:56:24 +0000253" Default values - d-g ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100254call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200255call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100256call s:NetrwInit("g:netrw_dirhistmax" , 10)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200257call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100258call s:NetrwInit("g:netrw_fastbrowse" , 1)
259call s:NetrwInit("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 Moolenaarc0197e22004-09-13 20:26:32 +0000260if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000261 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
262 let g:netrw_ftp_list_cmd = "ls -lF"
263 let g:netrw_ftp_timelist_cmd = "ls -tlF"
264 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000265 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000266 let g:netrw_ftp_list_cmd = "dir"
267 let g:netrw_ftp_timelist_cmd = "dir"
268 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000269 endif
270endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100271call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000272" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100273call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000274if !exists("g:netrw_ignorenetrc")
275 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
276 let g:netrw_ignorenetrc= 1
277 else
278 let g:netrw_ignorenetrc= 0
279 endif
280endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100281call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000282if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000283 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
284 " provide a 'pscp' listing command
285 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
286 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
287 endif
288 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
289 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000290 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000291 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000292 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000293" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000294 let g:netrw_list_cmd= ""
295 endif
296endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100297call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000298" Default values - lh-lz ---------- {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200299if exists("g:netrw_local_copycmd")
300 let g:netrw_localcopycmd= g:netrw_local_copycmd"
301 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
302endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000303if !exists("g:netrw_localcopycmd")
304 if has("win32") || has("win95") || has("win64") || has("win16")
305 if g:netrw_cygwin
306 let g:netrw_localcopycmd= "cp"
307 else
308 let g:netrw_localcopycmd= "copy"
309 endif
310 elseif has("unix") || has("macunix")
311 let g:netrw_localcopycmd= "cp"
312 else
313 let g:netrw_localcopycmd= ""
314 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200315 if !executable(g:netrw_localcopycmd)
316 call netrw#ErrorMsg(s:NOTE,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
317 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000318endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200319if exists("g:netrw_local_mkdir")
320 let g:netrw_localmkdir= g:netrw_local_mkdir"
321 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
322endif
323call s:NetrwInit("g:netrw_localmkdir","mkdir")
324if !executable(g:netrw_localmkdir)
325 call netrw#ErrorMsg(s:NOTE,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
326endif
327endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200328call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200329if exists("g:netrw_local_movecmd")
330 let g:netrw_localmovecmd= g:netrw_local_movecmd"
331 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
332endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000333if !exists("g:netrw_localmovecmd")
334 if has("win32") || has("win95") || has("win64") || has("win16")
335 if g:netrw_cygwin
336 let g:netrw_localmovecmd= "mv"
337 else
338 let g:netrw_localmovecmd= "move"
339 endif
340 elseif has("unix") || has("macunix")
341 let g:netrw_localmovecmd= "mv"
342 else
343 let g:netrw_localmovecmd= ""
344 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200345 if !executable(g:netrw_localmkdir)
346 call netrw#ErrorMsg(s:NOTE,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",81)
347 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000348endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200349call s:NetrwInit("g:netrw_localrmdir", "rmdir")
350if exists("g:netrw_local_rmdir")
351 let g:netrw_localrmdir= g:netrw_local_rmdir"
352 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
353endif
354if !executable(g:netrw_localrmdir)
355 call netrw#ErrorMsg(s:NOTE,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",82)
356endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100357call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
358" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000359if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000360 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000361endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000362if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000363 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
364endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000365" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100366call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
367call s:NetrwInit("g:netrw_maxfilenamelen", 32)
368call s:NetrwInit("g:netrw_menu" , 1)
369call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
370call s:NetrwInit("g:netrw_mousemaps" , (exists("&mouse") && &mouse =~ '[anh]'))
371call s:NetrwInit("g:netrw_retmap" , 0)
372if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
373 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
374elseif has("win32") || has("win95") || has("win64") || has("win16")
375 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
376else
377 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000378endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100379call s:NetrwInit("g:netrw_preview" , 0)
380call s:NetrwInit("g:netrw_scpport" , "-P")
381call s:NetrwInit("g:netrw_sshport" , "-p")
382call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
383call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
384call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
385call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000386" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100387" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
388call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200389call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100390call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
391call s:NetrwInit("g:netrw_sort_options" , "")
392call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000393if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100394 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200395 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100396 else
397 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000398 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000399endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100400call s:NetrwInit("g:netrw_special_syntax" , 0)
401call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
402call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000403" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100404call s:NetrwInit("g:netrw_timefmt","%c")
405call s:NetrwInit("g:netrw_xstrlen",0)
406call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100407call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200408call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200409if g:netrw_winsize == 0|let g:netrw_winsize= -1|endif
410if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000411" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000412" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100413call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200414if has("win32") || has("win95") || has("win64") || has("win16")
415 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{$')
416else
417 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$\')
418endif
419call s:NetrwInit("g:netrw_menu_escape",'./&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100420call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
421call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000422
423" BufEnter event ignored by decho when following variable is true
424" Has a side effect that doau BufReadPost doesn't work, so
425" files read by network transfer aren't appropriately highlighted.
426"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000427
Bram Moolenaaradc21822011-04-01 18:03:16 +0200428" ======================
429" Netrw Initialization: {{{1
430" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200431if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
432 let s:initbeval = &beval
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200433" let s:initbexpr = &l:bexpr
Bram Moolenaar15146672011-10-20 22:22:38 +0200434 let &l:bexpr = "netrw#NetrwBalloonHelp()"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200435 set beval
Bram Moolenaar15146672011-10-20 22:22:38 +0200436 au BufWinEnter,WinEnter * if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200437endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200438au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200439
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000440" ==============================
441" Netrw Utility Functions: {{{1
442" ==============================
443
Bram Moolenaaradc21822011-04-01 18:03:16 +0200444" ---------------------------------------------------------------------
445" netrw#NetrwBalloonHelp: {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +0200446if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200447 fun! netrw#NetrwBalloonHelp()
Bram Moolenaar15146672011-10-20 22:22:38 +0200448 if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200449 let mesg= ""
450 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
Bram Moolenaar15146672011-10-20 22:22:38 +0200451 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200452 elseif getline(v:beval_lnum) =~ '^"\s*/'
453 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
454 elseif v:beval_text == "Sorted" || v:beval_text == "by"
455 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
456 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
457 let mesg = "S: edit sorting sequence"
458 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
459 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
460 elseif v:beval_text == "Quick" || v:beval_text == "Help"
461 let mesg = "Help: press <F1>"
462 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
463 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
464 else
465 let mesg= ""
466 endif
467 return mesg
468 endfun
469endif
470
Bram Moolenaar071d4272004-06-13 20:20:40 +0000471" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000472" s:NetrwOptionSave: save options and set to "standard" form {{{2
473" 06/08/07 : removed call to NetrwSafeOptions(), either placed
474" immediately after NetrwOptionSave() calls in NetRead
475" and NetWrite, or after the s:NetrwEnew() call in
476" NetrwBrowse.
477" vt: normally its "w:" or "s:" (a variable type)
478fun! s:NetrwOptionSave(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100479" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000480" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200481
Bram Moolenaar446cb832008-06-24 21:56:24 +0000482 if !exists("{a:vt}netrw_optionsave")
483 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000484 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000485" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000486 return
487 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200488" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000489
490 " Save current settings and current directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200491" call Decho("saving current settings and current directory")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000492 let s:yykeep = @@
Bram Moolenaar15146672011-10-20 22:22:38 +0200493 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000494 let {a:vt}netrw_aikeep = &l:ai
495 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar15146672011-10-20 22:22:38 +0200496 let {a:vt}netrw_bhkeep = &l:bh
497 let {a:vt}netrw_blkeep = &l:bl
498 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200499 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaar446cb832008-06-24 21:56:24 +0000500 let {a:vt}netrw_cikeep = &l:ci
501 let {a:vt}netrw_cinkeep = &l:cin
502 let {a:vt}netrw_cinokeep = &l:cino
503 let {a:vt}netrw_comkeep = &l:com
504 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200505 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar15146672011-10-20 22:22:38 +0200506 let {a:vt}netrw_fenkeep = &l:fen
507 let {a:vt}netrw_ffkeep = &l:ff
Bram Moolenaar446cb832008-06-24 21:56:24 +0000508 let {a:vt}netrw_fokeep = &l:fo " formatoptions
509 let {a:vt}netrw_gdkeep = &l:gd " gdefault
510 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200511 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar15146672011-10-20 22:22:38 +0200512 let {a:vt}netrw_iskkeep = &l:isk
513 let {a:vt}netrw_lskeep = &l:ls
514 let {a:vt}netrw_makeep = &l:ma
Bram Moolenaar446cb832008-06-24 21:56:24 +0000515 let {a:vt}netrw_magickeep = &l:magic
Bram Moolenaar15146672011-10-20 22:22:38 +0200516 let {a:vt}netrw_modkeep = &l:mod
517 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar446cb832008-06-24 21:56:24 +0000518 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar15146672011-10-20 22:22:38 +0200519 let {a:vt}netrw_rokeep = &l:ro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200520 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000521 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar15146672011-10-20 22:22:38 +0200522 let {a:vt}netrw_tskeep = &l:ts
Bram Moolenaar446cb832008-06-24 21:56:24 +0000523 let {a:vt}netrw_twkeep = &l:tw " textwidth
524 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar15146672011-10-20 22:22:38 +0200525 let {a:vt}netrw_wrapkeep = &l:wrap
526 let {a:vt}netrw_writekeep = &l:write
527 if g:netrw_use_noswf && has("win32") && !has("win95")
528 let {a:vt}netrw_swfkeep = &l:swf
529 endif
530
531 " save a few selected netrw-related variables
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200532" call Decho("saving a few selected netrw-related variables")
Bram Moolenaar15146672011-10-20 22:22:38 +0200533 if g:netrw_keepdir
534 let {a:vt}netrw_dirkeep = getcwd()
535 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000536 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000537 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000538 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200539 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
540 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000541
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200542" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000543endfun
544
545" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000546" s:NetrwOptionRestore: restore options {{{2
547fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200548" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000549 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar15146672011-10-20 22:22:38 +0200550 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200551" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200552 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200553" call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
554" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
555 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200556 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200557" call Decho("(NetrwOptionRestore) no previous position")
Bram Moolenaar15146672011-10-20 22:22:38 +0200558 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200559" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000560" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000561 return
562 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000563 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000564
565 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000566 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200567" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000568 let curdir = getcwd()
569 let &l:acd = {a:vt}netrw_acdkeep
570 unlet {a:vt}netrw_acdkeep
571 if &l:acd
Bram Moolenaar15146672011-10-20 22:22:38 +0200572" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
Bram Moolenaar446cb832008-06-24 21:56:24 +0000573 try
574 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200575 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000576 endif
577 catch /^Vim\%((\a\+)\)\=:E472/
578 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
579 endtry
580 endif
581 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000582 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000583 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
584 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200585 if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif
586 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
587 if exists("{a:vt}netrw_btkeep") |let &l:bt = {a:vt}netrw_btkeep |unlet {a:vt}netrw_btkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200588 if exists("{a:vt}netrw_bombkeep") |let &l:bomb = {a:vt}netrw_bombkeep |unlet {a:vt}netrw_bombkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000589 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
590 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
591 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
592 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
593 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200594 if exists("{a:vt}netrw_diffkeep") |let &l:diff = {a:vt}netrw_diffkeep |unlet {a:vt}netrw_diffkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200595 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
596 if exists("{a:vt}netrw_ffkeep") |let &l:ff = {a:vt}netrw_ffkeep |unlet {a:vt}netrw_ffkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000597 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
598 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
599 if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200600 if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200601 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
602 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
603 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
604 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
605 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
606 if exists("{a:vt}netrw_nukeep") |let &l:nu = {a:vt}netrw_nukeep |unlet {a:vt}netrw_nukeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000607 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200608 if exists("{a:vt}netrw_rokeep") |let &l:ro = {a:vt}netrw_rokeep |unlet {a:vt}netrw_rokeep |endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200609 if exists("{a:vt}netrw_selkeep") |let &l:sel = {a:vt}netrw_selkeep |unlet {a:vt}netrw_selkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000610 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200611 if exists("{a:vt}netrw_tskeep") |let &l:ts = {a:vt}netrw_tskeep |unlet {a:vt}netrw_tskeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000612 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
613 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200614 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
615 if exists("{a:vt}netrw_writekeep")|let &l:write = {a:vt}netrw_writekeep |unlet {a:vt}netrw_writekeep|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000616 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
617 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000618 if &directory == ""
619 " user hasn't specified a swapfile directory;
620 " netrw will temporarily set the swapfile directory
621 " to the current directory as returned by getcwd().
622 let &l:directory = getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200623 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000624 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000625 unlet {a:vt}netrw_swfkeep
626 elseif &l:swf != {a:vt}netrw_swfkeep
627 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200628 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000629 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000630 endif
631 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200632 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
633 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
634 if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
635 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200636 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
637 if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200638 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200639" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200640 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200641" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
642 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200643 else
644" call Decho("no previous position")
645 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000646
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200647" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
648" call Decho("(NetrwOptionRestore) fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
649" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
650" call Decho("(NetrwOptionRestore) diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"))
651" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000652endfun
653
654" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000655" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000656fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100657" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
658" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaar15146672011-10-20 22:22:38 +0200659 if exists("&acd") | setlocal noacd | endif
660 setlocal noai
661 setlocal noaw
662 setlocal nobomb
663 setlocal noci
664 setlocal nocin
Bram Moolenaar9964e462007-05-05 17:54:07 +0000665 setlocal cino=
666 setlocal com=
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200667 setlocal cpo-=a
668 setlocal cpo-=A
Bram Moolenaar446cb832008-06-24 21:56:24 +0000669 setlocal fo=nroql2
Bram Moolenaar15146672011-10-20 22:22:38 +0200670 setlocal nohid
671 setlocal noim
Bram Moolenaar5c736222010-01-06 20:54:52 +0100672 setlocal isk+=@ isk+=* isk+=/
Bram Moolenaar15146672011-10-20 22:22:38 +0200673 setlocal magic
674 setlocal report=10000
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200675 setlocal sel=inclusive
Bram Moolenaar15146672011-10-20 22:22:38 +0200676 setlocal nospell
677 setlocal tw=0
678 setlocal wig=
Bram Moolenaar9964e462007-05-05 17:54:07 +0000679 if g:netrw_use_noswf && has("win32") && !has("win95")
680 setlocal noswf
681 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200682 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100683
684 " allow the user to override safe options
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200685" call Decho("ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100686 if &ft == "netrw"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200687" call Decho("do any netrw FileType autocmds")
Bram Moolenaar15146672011-10-20 22:22:38 +0200688 sil! keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100689 endif
690
Bram Moolenaar446cb832008-06-24 21:56:24 +0000691" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000692" call Dret("s:NetrwSafeOptions")
693endfun
694
Bram Moolenaar446cb832008-06-24 21:56:24 +0000695" ---------------------------------------------------------------------
696" netrw#NetrwClean: remove netrw {{{2
697" supports :NetrwClean -- remove netrw from first directory on runtimepath
698" :NetrwClean! -- remove netrw from all directories on runtimepath
699fun! netrw#NetrwClean(sys)
700" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
701
702 if a:sys
703 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
704 else
705 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
706 endif
707" call Decho("choice=".choice)
708 let diddel= 0
709 let diddir= ""
710
711 if choice == 1
712 for dir in split(&rtp,',')
713 if filereadable(dir."/plugin/netrwPlugin.vim")
714" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000715 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
716 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
717 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
718 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
719 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
720 if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000721 let diddir= dir
722 let diddel= diddel + 1
723 if !a:sys|break|endif
724 endif
725 endfor
726 endif
727
728 echohl WarningMsg
729 if diddel == 0
730 echomsg "netrw is either not installed or not removable"
731 elseif diddel == 1
732 echomsg "removed one copy of netrw from <".diddir.">"
733 else
734 echomsg "removed ".diddel." copies of netrw"
735 endif
736 echohl None
737
738" call Dret("netrw#NetrwClean")
739endfun
740
Bram Moolenaar5c736222010-01-06 20:54:52 +0100741" ---------------------------------------------------------------------
742" netrw#Nread: {{{2
743fun! netrw#Nread(mode,fname)
744" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
745 call netrw#NetrwSavePosn()
746 call netrw#NetRead(a:mode,a:fname)
747 call netrw#NetrwRestorePosn()
748" call Dret("netrw#Nread")
749endfun
750
Bram Moolenaar9964e462007-05-05 17:54:07 +0000751" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000752" Netrw Transfer Functions: {{{1
753" ===============================
754
Bram Moolenaar071d4272004-06-13 20:20:40 +0000755" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000756" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000757" mode: =0 read remote file and insert before current line
758" =1 read remote file and insert after current line
759" =2 replace with remote file
760" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000761fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000762" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000763
Bram Moolenaar5c736222010-01-06 20:54:52 +0100764 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000765 call s:NetrwOptionSave("w:")
766 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200767 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000768
Bram Moolenaar5c736222010-01-06 20:54:52 +0100769 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000770 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000771 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000772 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000773 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000774 elseif a:mode == 2 " replace with remote file
775 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000776 elseif a:mode == 3 " skip read of file (leave as temporary)
777 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000778 else
779 exe a:mode
780 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000781 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000782 let ichoice = (a:0 == 0)? 0 : 1
783" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
784
Bram Moolenaar5c736222010-01-06 20:54:52 +0100785 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000786 let tmpfile= s:GetTempfile("")
787 if tmpfile == ""
788" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000789 return
790 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000791
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000792 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000793
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000794 " attempt to repeat with previous host-file-etc
795 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000796" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000797 let choice = b:netrw_lastfile
798 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000799
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000800 else
801 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000802" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000803
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000805 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000806 echomsg 'NetRead Usage:'
807 echomsg ':Nread machine:path uses rcp'
808 echomsg ':Nread "machine path" uses ftp with <.netrc>'
809 echomsg ':Nread "machine id password path" uses ftp'
810 echomsg ':Nread dav://machine[:port]/path uses cadaver'
811 echomsg ':Nread fetch://machine/path uses fetch'
812 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
813 echomsg ':Nread http://[user@]machine/path uses http wget'
814 echomsg ':Nread rcp://[user@]machine/path uses rcp'
815 echomsg ':Nread rsync://machine[:port]/path uses rsync'
816 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
817 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000818 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000819 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000820
Bram Moolenaar9964e462007-05-05 17:54:07 +0000821 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000822 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000823" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000824 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +0200826 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000827 else
828 " case "... ... ..."
829 let choice = strpart(choice,1,strlen(choice)-1)
830 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000831
Bram Moolenaar9964e462007-05-05 17:54:07 +0000832 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000833 let wholechoice = wholechoice . " " . choice
834 let ichoice = ichoice + 1
835 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000836 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000837 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000838 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000839" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000840 return
841 endif
842 let choice= a:{ichoice}
843 endwhile
844 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
845 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000846 endif
847 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000848
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000850 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000851
Bram Moolenaar5c736222010-01-06 20:54:52 +0100852 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000853 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100854 if !exists("b:netrw_method") || b:netrw_method < 0
855" call Dfunc("netrw#NetRead : unsupported method")
856 return
857 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000858 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000859
Bram Moolenaar446cb832008-06-24 21:56:24 +0000860 " Check if NetrwBrowse() should be handling this request
861" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +0200862 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000863" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200864 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000865" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000866 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000867 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000868
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +0100870 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000871 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000872 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
873 echo "(netrw) Processing your read request..."
874 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000875
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100877 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000878 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000879" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000880 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000881 " ER: on Win2K" rcp machine[.user]:file tmpfile
882 " ER: if machine contains '.' adding .user is required (use $USERNAME)
883 " ER: the tmpfile is full path: rcp sees C:\... as host C
884 if s:netrw_has_nt_rcp == 1
885 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
886 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
887 else
888 " Any way needed it machine contains a '.'
889 let uid_machine = g:netrw_machine .'.'. $USERNAME
890 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000891 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000892 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
893 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
894 else
895 let uid_machine = g:netrw_machine
896 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000897 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000898" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100899 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000900 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000901 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000902
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000903 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100904 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000906" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000907 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +0200908 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000909 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000910 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200911 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000912" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000913 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200914 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000915" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000916 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000917 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
918" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000919 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +0200920" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
921 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000922 else
Bram Moolenaaradc21822011-04-01 18:03:16 +0200923" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
924 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000925 endif
926 " 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 +0000927 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000928 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000929 setlocal debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +0200930 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000931 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000932 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000933 call s:SaveBufVars()
934 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +0100935 if bufname("%") == "" && getline("$") == "" && line('$') == 1
936 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000937 q!
938 endif
939 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000940 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000941 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000942
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100944 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000945 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
946 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000947" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000948 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200949 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000950 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000951 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000952 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200953 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000954" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000955 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200956 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000957" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000958 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000959
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200960 if exists("g:netrw_uid" && g:netrw_uid != ""
961 if exists("g:netrw_ftp") && g:netrw_ftp == 1
962 keepj put =g:netrw_uid
963" call Decho("filter input: ".getline('.'))
964 if exists("s:netrw_passwd")
965 keepj put ='\"'.s:netrw_passwd.'\"'
966 endif
967" call Decho("filter input: ".getline('.'))
968 elseif exists("s:netrw_passwd")
969 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
970" call Decho("filter input: ".getline('.'))
971 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000972 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000973
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200975 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000976" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000977 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000978 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200979 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000980" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000981 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200982 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000983" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000984
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 " perform ftp:
986 " -i : turns off interactive prompting from ftp
987 " -n unix : DON'T use <.netrc>, even though it exists
988 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +0200989 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200990" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
991 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000992 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
993 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000994" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000995 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000996 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000997 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000998 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000999 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
1000 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001002
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001003 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001004 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001005 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001006" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001007 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00001008 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001009 else
1010 let useport= ""
1011 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001012" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001013 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001014 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001015 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001016
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001018 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001019 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001020" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001021 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001022 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001023 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001024 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001025" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001026 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001027 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001028
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001029 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
1030 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001031" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001032 if exists("g:netrw_http_xcmd")
1033" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1))
1034 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
1035 else
1036" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
1037 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
1038 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001039 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001040
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001041 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001042 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001043" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001044 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
1045 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001046" call Decho("netrw_html<".netrw_html.">")
1047" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001048" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
1049 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001050 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001051" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001052 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001053 endif
1054 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001055" call Decho("(NetRead) setl ro")
1056 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001057
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001059 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001060 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001061" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001062
Bram Moolenaar5c736222010-01-06 20:54:52 +01001063 if !executable(g:netrw_dav_cmd)
1064 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
1065" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
1066 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001067 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001068 if g:netrw_dav_cmd =~ "curl"
1069" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
1070 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
1071 else
1072 " Construct execution string (four lines) which will be passed through filter
1073 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1074 new
1075 setlocal ff=unix
1076 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001077 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01001078 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001079 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01001080 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001081 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
1082 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
1083 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001084 keepj put ='get '.netrw_fname.' '.tmpfile
1085 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001086
Bram Moolenaar5c736222010-01-06 20:54:52 +01001087 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001088 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001089" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001090 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1091 bd!
1092 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001093 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001094 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001095
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001096 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001097 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001098 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001099" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001100" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1101 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001102 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001103 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001104
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001105 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001106 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001107 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001108 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +00001109" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001110 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001111 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001112 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001113 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001114" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001115 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001116 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02001117 if exists("g:netrw_option") && g:netrw_option == ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001118 let netrw_option= "http"
1119 else
1120 let netrw_option= "ftp"
1121 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001122" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001123
Bram Moolenaar446cb832008-06-24 21:56:24 +00001124 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001125" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1))
1126 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00001128" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
1129 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001130 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001131
Bram Moolenaar446cb832008-06-24 21:56:24 +00001132 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001134" call Decho("(NetRead) setl ro")
1135 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001136
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001137 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001138 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001139 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001140" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001141" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1142 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001143 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001145
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001146 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001147 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001148 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001149 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 endif
1151 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001152
Bram Moolenaar5c736222010-01-06 20:54:52 +01001153 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001154 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001155" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001156 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 unlet b:netrw_fname
1158 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001159 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001160" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001161 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001162 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001163 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001164
Bram Moolenaar9964e462007-05-05 17:54:07 +00001165" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166endfun
1167
1168" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001169" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001170fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00001171" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001172
Bram Moolenaar5c736222010-01-06 20:54:52 +01001173 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001174 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001175 call s:NetrwOptionSave("w:")
1176 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001177
Bram Moolenaar5c736222010-01-06 20:54:52 +01001178 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001179 let tmpfile= s:GetTempfile("")
1180 if tmpfile == ""
1181" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001182 return
1183 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001184
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001185 if a:0 == 0
1186 let ichoice = 0
1187 else
1188 let ichoice = 1
1189 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001190
Bram Moolenaar9964e462007-05-05 17:54:07 +00001191 let curbufname= expand("%")
1192" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001193 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00001194 " For binary writes, always write entire file.
1195 " (line numbers don't really make sense for that).
1196 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02001197" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1198 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001199 elseif g:netrw_cygwin
1200 " write (selected portion of) file to temporary
1201 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001202" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001203 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001204 else
1205 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02001206" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001207 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001208 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001209
Bram Moolenaar9964e462007-05-05 17:54:07 +00001210 if curbufname == ""
1211 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1212 " on the temporary file's name. Deletion of the temporary file during
1213 " cleanup then causes an error message.
1214 0file!
1215 endif
1216
Bram Moolenaar5c736222010-01-06 20:54:52 +01001217 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001218 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001219
Bram Moolenaar9964e462007-05-05 17:54:07 +00001220 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001221 " attempt to repeat with previous host-file-etc
1222 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001223" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001224 let choice = b:netrw_lastfile
1225 let ichoice= ichoice + 1
1226 else
1227 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001228
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001229 " Reconstruct Choice if choice starts with '"'
1230 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001231 echomsg 'NetWrite Usage:"'
1232 echomsg ':Nwrite machine:path uses rcp'
1233 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1234 echomsg ':Nwrite "machine id password path" uses ftp'
1235 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1236 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1237 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1238 echomsg ':Nwrite rcp://machine/path uses rcp'
1239 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1240 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1241 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001242 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001243 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001244
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001245 elseif match(choice,"^\"") != -1
1246 if match(choice,"\"$") != -1
1247 " case "..."
1248 let choice=strpart(choice,1,strlen(choice)-2)
1249 else
1250 " case "... ... ..."
1251 let choice = strpart(choice,1,strlen(choice)-1)
1252 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001253
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001254 while match(choice,"\"$") == -1
1255 let wholechoice= wholechoice . " " . choice
1256 let ichoice = ichoice + 1
1257 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001258 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001259 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001260 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001261" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001262 return
1263 endif
1264 let choice= a:{ichoice}
1265 endwhile
1266 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1267 endif
1268 endif
1269 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001270 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001271" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001272
Bram Moolenaar9964e462007-05-05 17:54:07 +00001273 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02001274 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001275 if !exists("b:netrw_method") || b:netrw_method < 0
1276" call Dfunc("netrw#NetWrite : unsupported method")
1277 return
1278 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001279
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001280 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001281 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001282 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001283 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1284 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001285" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001286 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001287
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001288 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001289 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001290 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001291" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001292 if s:netrw_has_nt_rcp == 1
1293 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1294 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1295 else
1296 let uid_machine = g:netrw_machine .'.'. $USERNAME
1297 endif
1298 else
1299 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1300 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1301 else
1302 let uid_machine = g:netrw_machine
1303 endif
1304 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001305" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1306 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001307 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001308
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001309 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001310 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001311 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001312" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001313 let netrw_fname = b:netrw_fname
1314
1315 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1316 let bhkeep = &l:bh
1317 let curbuf = bufnr("%")
1318 setlocal bh=hide
1319 enew
1320
Bram Moolenaar446cb832008-06-24 21:56:24 +00001321" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001322 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001323 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001324" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001325 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001326 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001327" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001328 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001329 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001330" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001331 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001332" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1333 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001334 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001335" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02001336" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1337 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001338 endif
1339 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1340 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001341 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001342 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001343 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001344 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001345 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001346
1347 " remove enew buffer (quietly)
1348 let filtbuf= bufnr("%")
1349 exe curbuf."b!"
1350 let &l:bh = bhkeep
1351 exe filtbuf."bw!"
1352
Bram Moolenaar071d4272004-06-13 20:20:40 +00001353 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001354
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001355 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001356 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001357 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001358 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00001359" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001360 let netrw_fname = b:netrw_fname
1361 let bhkeep = &l:bh
1362
1363 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1364 let curbuf = bufnr("%")
1365 setlocal bh=hide
1366 enew
Bram Moolenaar8299df92004-07-10 09:47:34 +00001367 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001368
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001369 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001370 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001371" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001372 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001373 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001374" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001376 if exists("g:netrw_uid") && g:netrw_uid != ""
1377 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1378 keepj put =g:netrw_uid
1379" call Decho("filter input: ".getline('.'))
1380 if exists("s:netrw_passwd") && s:netrw_passwd != ""
1381 keepj put ='\"'.s:netrw_passwd.'\"'
1382 endif
1383" call Decho("filter input: ".getline('.'))
1384 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
1385 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1386" call Decho("filter input: ".getline('.'))
1387 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001388 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001389 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01001390" call Decho("filter input: ".getline('$'))
1391 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001392 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001393" call Decho("filter input: ".getline("$"))
1394 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001395 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001396" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001397 " save choice/id/password for future use
1398 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001399
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001400 " perform ftp:
1401 " -i : turns off interactive prompting from ftp
1402 " -n unix : DON'T use <.netrc>, even though it exists
1403 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001404 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001405" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1406 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001407 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1408 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001409 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001410 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001411 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001412 let mod=1
1413 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001414
1415 " remove enew buffer (quietly)
1416 let filtbuf= bufnr("%")
1417 exe curbuf."b!"
1418 let &l:bh= bhkeep
1419 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001420
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001421 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001422 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001423 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001424" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001425 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001426 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001427 else
1428 let useport= ""
1429 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001430" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1431 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001432 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001433
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001434 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001435 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001436 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001437" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001438 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001439 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001440 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001441
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001442 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001443 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001444 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001445" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001446
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001447 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01001448 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
1449 let bhkeep = &l:bh
1450
1451 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1452 let curbuf = bufnr("%")
1453 setlocal bh=hide
1454 enew
1455
Bram Moolenaar8299df92004-07-10 09:47:34 +00001456 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001457 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001458 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001459 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001460 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001461 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001462 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001463 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001464 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001465 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001466
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001467 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001468 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001469" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001470 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001471
1472 " remove enew buffer (quietly)
1473 let filtbuf= bufnr("%")
1474 exe curbuf."b!"
1475 let &l:bh = bhkeep
1476 exe filtbuf."bw!"
1477
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001478 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001479
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001480 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001481 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001482 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001483" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001484" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1485 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001486 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001487
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001488 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001489 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001490 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001491" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001492 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001493 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1494 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1495 else
1496 let uid_machine = g:netrw_machine
1497 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001498
1499 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1500 let bhkeep = &l:bh
1501 let curbuf = bufnr("%")
1502 setlocal bh=hide
1503 enew
1504
Bram Moolenaar8299df92004-07-10 09:47:34 +00001505 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001506 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001507" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001508" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1509 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001510 let filtbuf= bufnr("%")
1511 exe curbuf."b!"
1512 let &l:bh = bhkeep
1513 exe filtbuf."bw!"
1514 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001515
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001516 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001517 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001518 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001519 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001520 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001521 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001522 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001523
Bram Moolenaar5c736222010-01-06 20:54:52 +01001524 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001525" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001526 if s:FileReadable(tmpfile)
1527" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001528 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001529 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001530 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001531
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001532 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001533 " restore modifiability; usually equivalent to set nomod
1534 let &mod= mod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001535" call Decho("(NetWrite) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001536 elseif !exists("leavemod")
1537 " indicate that the buffer has not been modified since last written
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001538" call Decho("(NetWrite) set nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001539 set nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001540" call Decho("(NetWrite) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001541 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001542
Bram Moolenaar9964e462007-05-05 17:54:07 +00001543" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001544endfun
1545
1546" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001547" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001548" uses NetRead to get a copy of the file into a temporarily file,
1549" then sources that file,
1550" then removes that file.
1551fun! netrw#NetSource(...)
1552" call Dfunc("netrw#NetSource() a:0=".a:0)
1553 if a:0 > 0 && a:1 == '?'
1554 " give help
1555 echomsg 'NetSource Usage:'
1556 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1557 echomsg ':Nsource fetch://machine/path uses fetch'
1558 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02001559 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001560 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1561 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1562 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1563 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1564 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001565 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001566 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001567 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001568 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001569" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001570 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001571" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1572 exe "so ".fnameescape(s:netrw_tmpfile)
1573" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001574 call delete(s:netrw_tmpfile)
1575 unlet s:netrw_tmpfile
1576 else
1577 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1578 endif
1579 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001580 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001581 endif
1582" call Dret("netrw#NetSource")
1583endfun
1584
1585" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001586" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001587" readcmd == %r : replace buffer with newly read file
1588" == 0r : read file at top of buffer
1589" == r : read file after current line
1590" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001591fun! s:NetrwGetFile(readcmd, tfile, method)
1592" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001593
1594 " readcmd=='t': simply do nothing
1595 if a:readcmd == 't'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001596" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001597" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001598 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001599 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001600
Bram Moolenaar9964e462007-05-05 17:54:07 +00001601 " get name of remote filename (ie. url and all)
1602 let rfile= bufname("%")
1603" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001604
Bram Moolenaar9964e462007-05-05 17:54:07 +00001605 if exists("*NetReadFixup")
1606 " for the use of NetReadFixup (not otherwise used internally)
1607 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001608 endif
1609
Bram Moolenaar9964e462007-05-05 17:54:07 +00001610 if a:readcmd[0] == '%'
1611 " get file into buffer
1612" call Decho("get file into buffer")
1613
1614 " rename the current buffer to the temp file (ie. tfile)
1615 if g:netrw_cygwin
1616 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1617 else
1618 let tfile= a:tfile
1619 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001620" call Decho("exe sil! keepalt file ".fnameescape(tfile))
1621 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001622
1623 " edit temporary file (ie. read the temporary file in)
1624 if rfile =~ '\.zip$'
1625" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1626 call zip#Browse(tfile)
1627 elseif rfile =~ '\.tar$'
1628" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1629 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001630 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001631" call Decho("handling remote gzip-compressed tar file")
1632 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001633 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001634" call Decho("handling remote bz2-compressed tar file")
1635 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001636 elseif rfile =~ '\.tar\.xz$'
1637" call Decho("handling remote xz-compressed tar file")
1638 call tar#Browse(tfile)
1639 elseif rfile =~ '\.txz$'
1640" call Decho("handling remote xz-compressed tar file (.txz)")
1641 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001642 else
1643" call Decho("edit temporary file")
1644 e!
1645 endif
1646
1647 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001648" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02001649 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001650
1651 " detect filetype of local version of remote file
1652 " Note that isk must not include a "/" for scripts.vim
1653 " to process this detection correctly.
1654" call Decho("detect filetype of local version of remote file")
1655 let iskkeep= &isk
1656 set isk-=/
Bram Moolenaar5c736222010-01-06 20:54:52 +01001657 filetype detect
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001658 let &isk= iskkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00001659" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1660 let line1 = 1
1661 let line2 = line("$")
1662
1663 elseif s:FileReadable(a:tfile)
1664 " read file after current line
1665" call Decho("read file<".a:tfile."> after current line")
1666 let curline = line(".")
1667 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001668" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001669 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001670 let line1= curline + 1
1671 let line2= line("$") - lastline + 1
1672
1673 else
1674 " not readable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001675" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001676" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001677 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001678" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001679 return
1680 endif
1681
1682 " User-provided (ie. optional) fix-it-up command
1683 if exists("*NetReadFixup")
1684" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001685 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001686" else " Decho
1687" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1688 endif
1689
Bram Moolenaaradc21822011-04-01 18:03:16 +02001690 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00001691 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02001692 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001693 endif
1694
1695" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1696
1697 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001698" redraw!
1699
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001700" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001701" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001702endfun
1703
Bram Moolenaar9964e462007-05-05 17:54:07 +00001704" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001705" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01001706" Input:
1707" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
1708" Output:
1709" b:netrw_method= 1: rcp
1710" 2: ftp + <.netrc>
1711" 3: ftp + machine, id, password, and [path]filename
1712" 4: scp
Bram Moolenaar15146672011-10-20 22:22:38 +02001713" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001714" 6: dav
1715" 7: rsync
1716" 8: fetch
1717" 9: sftp
1718" g:netrw_machine= hostname
1719" b:netrw_fname = filename
1720" g:netrw_port = optional port number (for ftp)
1721" g:netrw_choice = copy of input url (choice)
1722fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001723" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001724
Bram Moolenaar251e1912011-06-19 05:09:16 +02001725 " sanity check: choice should have at least three slashes in it
1726 if strlen(substitute(a:choice,'[^/]','','g')) < 3
1727 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
1728 let b:netrw_method = -1
1729" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
1730 return
1731 endif
1732
Bram Moolenaar5c736222010-01-06 20:54:52 +01001733 " record current g:netrw_machine, if any
1734 " curmachine used if protocol == ftp and no .netrc
1735 if exists("g:netrw_machine")
1736 let curmachine= g:netrw_machine
1737" call Decho("curmachine<".curmachine.">")
1738 else
1739 let curmachine= "N O T A HOST"
1740 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001741 if exists("g:netrw_port")
1742 let netrw_port= g:netrw_port
1743 endif
1744
1745 " insure that netrw_ftp_cmd starts off every method determination
1746 " with the current g:netrw_ftp_cmd
1747 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001748
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001749 " initialization
1750 let b:netrw_method = 0
1751 let g:netrw_machine = ""
1752 let b:netrw_fname = ""
1753 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001754 let g:netrw_choice = a:choice
1755
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001756 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001757 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001758 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1759 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001760 " rcpurm : rcp://[user@]host/filename Use rcp
1761 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001762 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02001763 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01001764 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001765 " rsyncurm : rsync://host[:port]/path Use rsync
1766 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1767 " sftpurm : sftp://[user@]host/filename Use scp
1768 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1769 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001770" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1771" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1772" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1773 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1774 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001775 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001776 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001777 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001778 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001779 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001780 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001781 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001782
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001783" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001784 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02001785 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001786 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001787" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001788 let b:netrw_method = 1
1789 let userid = substitute(a:choice,rcpurm,'\1',"")
1790 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1791 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001792 if userid != ""
1793 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001794 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001795
Bram Moolenaaradc21822011-04-01 18:03:16 +02001796 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001797 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001798" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001799 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001800 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1801 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1802 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001803
Bram Moolenaar15146672011-10-20 22:22:38 +02001804 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001805 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001806" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001807 let b:netrw_method = 5
1808 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1809 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001810
Bram Moolenaaradc21822011-04-01 18:03:16 +02001811 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001812 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001813" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001814 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02001815 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001816 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1817 else
1818 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1819 endif
1820 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001821
Bram Moolenaaradc21822011-04-01 18:03:16 +02001822 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001823 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001824" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001825 let b:netrw_method = 7
1826 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1827 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001828
Bram Moolenaaradc21822011-04-01 18:03:16 +02001829 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001830 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001831" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001832 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001833 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1834 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1835 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001836" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001837 if userid != ""
1838 let g:netrw_uid= userid
1839 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001840
Bram Moolenaaradc21822011-04-01 18:03:16 +02001841 if curmachine != g:netrw_machine
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001842 if exists("s:netwr_hup[".g:netrw_machine."]")
1843 call NetUserPass("ftp:".g:netrw_machine)
1844 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001845 " if there's a change in hostname, require password re-entry
1846 unlet s:netrw_passwd
1847 endif
1848 if exists("netrw_port")
1849 unlet netrw_port
1850 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001851 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001852
Bram Moolenaar446cb832008-06-24 21:56:24 +00001853 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001854 let b:netrw_method = 3
1855 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001856 let host= substitute(g:netrw_machine,'\..*$','','')
1857 if exists("s:netrw_hup[host]")
1858 call NetUserPass("ftp:".host)
1859
1860 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02001861" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1862" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
1863 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
1864 let machine = substitute(g:netrw_machine,'\([^.]\+\)\.\S*','\1','')
1865 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',machine.".ftp",'')
1866" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1867 endif
1868 let b:netrw_method= 2
1869 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
1870" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001871 let b:netrw_method= 2
1872 else
1873 if !exists("g:netrw_uid") || g:netrw_uid == ""
1874 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001875 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001876 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001877 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001878 endif
1879 let b:netrw_method= 3
1880 endif
1881 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001882
Bram Moolenaaradc21822011-04-01 18:03:16 +02001883 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001884 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001885" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001886 let b:netrw_method = 8
1887 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1888 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1889 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1890 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001891
Bram Moolenaaradc21822011-04-01 18:03:16 +02001892 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001893 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001894" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001895 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001896 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1897 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001898 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001899 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001900 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001901
Bram Moolenaaradc21822011-04-01 18:03:16 +02001902 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001903 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001904" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001905 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001906 let b:netrw_method = 3
1907 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1908 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001909
Bram Moolenaar9964e462007-05-05 17:54:07 +00001910 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001911 let b:netrw_method = 2
1912 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1913 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1914 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001915
Bram Moolenaaradc21822011-04-01 18:03:16 +02001916 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001917 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001918" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001919 let b:netrw_method = 9
1920 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1921 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001922
Bram Moolenaaradc21822011-04-01 18:03:16 +02001923 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001924 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001925" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001926 let b:netrw_method = 1
1927 let userid = substitute(a:choice,rcphf,'\2',"")
1928 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1929 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001930" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1931" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1932" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1933" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001934 if userid != ""
1935 let g:netrw_uid= userid
1936 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001937
Bram Moolenaaradc21822011-04-01 18:03:16 +02001938 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001939 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001940 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001941 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001942 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001943 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001944 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001945 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00001946
Bram Moolenaar81695252004-12-29 20:58:21 +00001947 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001948 " remove any leading [:#] from port number
1949 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1950 elseif exists("netrw_port")
1951 " retain port number as implicit for subsequent ftp operations
1952 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00001953 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001954
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001955" call Decho("a:choice <".a:choice.">")
1956" call Decho("b:netrw_method <".b:netrw_method.">")
1957" call Decho("g:netrw_machine<".g:netrw_machine.">")
1958" call Decho("g:netrw_port <".g:netrw_port.">")
1959" if exists("g:netrw_uid") "Decho
1960" call Decho("g:netrw_uid <".g:netrw_uid.">")
1961" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001962" if exists("s:netrw_passwd") "Decho
1963" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001964" endif "Decho
1965" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001966" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001967endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001968
1969" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001970" NetReadFixup: this sort of function is typically written by the user {{{2
1971" to handle extra junk that their system's ftp dumps
1972" into the transfer. This function is provided as an
1973" example and as a fix for a Windows 95 problem: in my
1974" experience, win95's ftp always dumped four blank lines
1975" at the end of the transfer.
1976if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1977 fun! NetReadFixup(method, line1, line2)
1978" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001979
1980 " sanity checks -- attempt to convert inputs to integers
1981 let method = a:method + 0
1982 let line1 = a:line1 + 0
1983 let line2 = a:line2 + 0
1984 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
1985" call Dret("NetReadFixup")
1986 return
1987 endif
1988
Bram Moolenaar9964e462007-05-05 17:54:07 +00001989 if method == 3 " ftp (no <.netrc>)
1990 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001991 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001992 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01001993 call histdel("/",-1)
1994 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001995 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001996
Bram Moolenaar9964e462007-05-05 17:54:07 +00001997" call Dret("NetReadFixup")
1998 endfun
1999endif
2000
2001" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002002" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002003" Usage: :call NetUserPass() -- will prompt for userid and password
2004" :call NetUserPass("uid") -- will prompt for password
2005" :call NetUserPass("uid","password") -- sets global userid and password
2006" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
2007" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00002008fun! NetUserPass(...)
2009
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002010" call Dfunc("NetUserPass() a:0=".a:0)
2011
2012 if !exists('s:netrw_hup')
2013 let s:netrw_hup= {}
2014 endif
2015
Bram Moolenaar071d4272004-06-13 20:20:40 +00002016 if a:0 == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +00002017 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002018 " get uid via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00002019 let g:netrw_uid= input('Enter username: ')
2020 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002021 " get password via prompt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002022 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002023
2024 " set up hup database
2025 let host = substitute(g:netrw_machine,'\..*$','','')
2026 if !exists('s:netrw_hup[host]')
2027 let s:netrw_hup[host]= {}
2028 endif
2029 let s:netrw_hup[host].uid = g:netrw_uid
2030 let s:netrw_hup[host].passwd = s:netrw_passwd
2031
2032 elseif a:0 == 1
2033
2034 if a:1 =~ '^ftp:'
2035 " access userid and password from hup (host-user-passwd) dictionary
2036 let host = substitute(a:1,'^ftp:','','')
2037 let host = substitute(host,'\..*','','')
2038 if exists("s:netrw_hup[host]")
2039 let g:netrw_uid = s:netrw_hup[host].uid
2040 let s:netrw_passwd = s:netrw_hup[host].passwd
2041" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2042" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2043 else
2044 let g:netrw_uid = input("Enter UserId: ")
2045 let s:netrw_passwd = inputsecret("Enter Password: ")
2046 endif
2047 else
2048 " set userid, prompt for password
2049" call Decho("set g:netrw_uid= <".a:1.">")
2050 if exists("g:netrw_machine")
2051 let host= substitute(g:netrw_machine,'\..*$','','')
2052 endif
2053 let g:netrw_uid = a:1
2054 let s:netrw_passwd = inputsecret("Enter Password: ")
2055 endif
2056
2057" call Decho("host<".host.">")
2058 if exists("host")
2059 if !exists('s:netrw_hup[host]')
2060 let s:netrw_hup[host]= {}
2061 endif
2062 let s:netrw_hup[host].uid = g:netrw_uid
2063 let s:netrw_hup[host].passwd = s:netrw_passwd
2064 endif
2065
2066 elseif a:0 == 2
2067 let g:netrw_uid = a:1
2068 let s:netrw_passwd = a:2
2069
2070 elseif a:0 == 3
2071 " enter hostname, user-id, and password into the hup dictionary
2072 let host = substitute(a:1,'^\a\+:','','')
2073 let host = substitute(host,'\..*$','','')
2074 if !exists('s:netrw_hup[host]')
2075 let s:netrw_hup[host]= {}
2076 endif
2077 let s:netrw_hup[host].uid = a:2
2078 let s:netrw_hup[host].passwd = a:3
2079 let g:netrw_uid = s:netrw_hup[host].uid
2080 let s:netrw_passwd = s:netrw_hup[host].passwd
2081" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2082" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002083 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002084
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002085" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002086endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002087
Bram Moolenaar9964e462007-05-05 17:54:07 +00002088" ===========================================
2089" Shared Browsing Support: {{{1
2090" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00002091
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002092" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002093" s:NetrwMaps: {{{2
2094fun! s:NetrwMaps(islocal)
2095" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002096
2097 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
2098" call Decho("set up Rexplore command")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002099 com! Rexplore if exists("w:netrw_rexlocal")|call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")|else|call netrw#ErrorMsg(s:WARNING,"not a former netrw window",79)|endif
Bram Moolenaar251e1912011-06-19 05:09:16 +02002100 if g:netrw_mousemaps && g:netrw_retmap
2101" call Decho("set up Rexplore 2-leftmouse")
2102 if !hasmapto("<Plug>NetrwReturn")
2103 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
2104" call Decho("making map for 2-leftmouse")
2105 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
2106 elseif maparg("<c-leftmouse>","n") == ""
2107" call Decho("making map for c-leftmouse")
2108 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
2109 endif
2110 endif
2111 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
2112" call Decho("made <Plug>NetrwReturn map")
2113 endif
2114
Bram Moolenaar9964e462007-05-05 17:54:07 +00002115 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002116" call Decho("make local maps")
Bram Moolenaar15146672011-10-20 22:22:38 +02002117 " local normal-mode maps
2118 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
2119 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
2120 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2121 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
2122 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2123 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
2124 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2125 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2126 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
2127 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
2128 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
2129 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2130 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
2131 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
2132 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2133 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2134 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2135 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2136 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2137 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2138 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2139 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2140 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2141 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2142 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2143 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2144 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2145 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2146 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2147 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
2148 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
2149 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
2150 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
2151 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
2152 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2153 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
2154 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2155 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
2156 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>
2157 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
2158 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
2159 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(4)<bar>norm! gT<cr>
2160 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
2161 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2162 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2163 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
2164 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
2165 " local insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002166 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002167 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2168 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2169 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
2170 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2171 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2172 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
2173 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2174 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
2175 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2176 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2177 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002178 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002179 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002180 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2181 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2182 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2183 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2184 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2185 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2186 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2187 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2188 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2189 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2190 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2191 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2192 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2193 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002194 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002195 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002196 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002197 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002198 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2199 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2200 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002201 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
2202 inoremap <buffer> <silent> r <c-o>: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>
2203 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
2204 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002205 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(4)<bar>norm! gT<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002206 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002207 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2208 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2209 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
2210 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002211 if !hasmapto('<Plug>NetrwHideEdit')
2212 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002213 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002214 endif
2215 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
2216 if !hasmapto('<Plug>NetrwRefresh')
2217 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002218 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002219 endif
2220 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002221 if s:didstarstar || !mapcheck("<s-down>","n")
2222 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002223 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002224 endif
2225 if s:didstarstar || !mapcheck("<s-up>","n")
2226 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002227 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002228 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002229 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002230 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002231 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
2232 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
2233 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
2234 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
2235 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2236 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2237 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2238 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2239 imap <buffer> <leftmouse> <Plug>ILeftmouse
2240 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
2241 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2242 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2243 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2244 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002245 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2246 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002247 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002248 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002249 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002250 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002251 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002252 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002253 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2254 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2255 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
2256 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2257 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2258 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
2259 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002260 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002261
Bram Moolenaar9964e462007-05-05 17:54:07 +00002262 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002263" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002264 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar15146672011-10-20 22:22:38 +02002265 " remote normal-mode maps
Bram Moolenaar446cb832008-06-24 21:56:24 +00002266 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2267 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2268 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2269 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002270 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002271 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2272 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2273 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2274 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2275 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2276 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2277 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2278 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2279 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2280 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002281 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002282 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002283 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2284 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002285 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002286 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002287 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002288 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
2289 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002290 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002291 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002292 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002293 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002294 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002295 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
2296 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
2297 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2298 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002299 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2300 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002301 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2302 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>
2303 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002304 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002305 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002306 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2307 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2308 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002309 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
2310 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00002311 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002312 " remote insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002313 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2314 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2315 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2316 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
2317 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2318 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2319 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2320 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2321 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2322 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2323 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2324 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2325 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2326 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2327 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002328 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002329 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002330 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2331 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002332 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002333 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
2334 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
2335 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
2336 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
2337 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2338 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
2339 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2340 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
2341 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
2342 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2343 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2344 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2345 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2346 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2347 inoremap <buffer> <silent> r <c-o>: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>
2348 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
2349 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
2350 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
2351 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2352 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2353 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
2354 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
2355 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
2356 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002357 if !hasmapto('<Plug>NetrwHideEdit')
2358 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002359 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002360 endif
2361 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
2362 if !hasmapto('<Plug>NetrwRefresh')
2363 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002364 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002365 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002366
2367 let mapsafepath = escape(s:path, s:netrw_map_escape)
2368 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
2369
Bram Moolenaar251e1912011-06-19 05:09:16 +02002370 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002371 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002372 nmap <leftmouse> <Plug>NetrwLeftmouse
2373 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
2374 nmap <middlemouse> <Plug>NetrwMiddlemouse
2375 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
2376 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2377 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2378 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2379 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2380 imap <buffer> <leftmouse> <Plug>ILeftmouse
2381 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
2382 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2383 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2384 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2385 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002386 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2387 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002388 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002389 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002390 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002391 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2392 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2393 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002394 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002395 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2396 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2397 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2398 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2399 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2400 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002401 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002402 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002403 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002404
Bram Moolenaaradc21822011-04-01 18:03:16 +02002405 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02002406
Bram Moolenaaradc21822011-04-01 18:03:16 +02002407" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002408endfun
2409
2410" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002411" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
2412fun! s:ExplorePatHls(pattern)
2413" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
2414 let repat= substitute(a:pattern,'^**/\{1,2}','','')
2415" call Decho("repat<".repat.">")
2416 let repat= escape(repat,'][.\')
2417" call Decho("repat<".repat.">")
2418 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
2419" call Dret("s:ExplorePatHls repat<".repat.">")
2420 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00002421endfun
2422
2423" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002424" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002425" 0: (user: <mb>) bookmark current directory
2426" 1: (user: <gb>) change to the bookmarked directory
2427" 2: (user: <qb>) list bookmarks
2428" 3: (browsing) record current directory history
2429" 4: (user: <u>) go up (previous) bookmark
2430" 5: (user: <U>) go down (next) bookmark
2431" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01002432fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002433" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002434
2435 if a:chg == 0
2436 " bookmark the current directory
2437" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002438 if !exists("g:netrw_bookmarklist")
2439 let g:netrw_bookmarklist= []
2440 endif
2441 if index(g:netrw_bookmarklist,a:curdir) == -1
2442 " curdir not currently in g:netrw_bookmarklist, so include it
2443 call add(g:netrw_bookmarklist,a:curdir)
2444 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002445 endif
2446 echo "bookmarked the current directory"
2447
2448 elseif a:chg == 1
2449 " change to the bookmarked directory
Bram Moolenaar5c736222010-01-06 20:54:52 +01002450" call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
2451 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002452 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00002453 else
2454 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2455 endif
2456
2457 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002458" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002459 let didwork= 0
2460 " list user's bookmarks
2461" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002462 if exists("g:netrw_bookmarklist")
2463" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
2464 let cnt= 1
2465 for bmd in g:netrw_bookmarklist
2466" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
2467 echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
2468 let didwork = 1
2469 let cnt = cnt + 1
2470 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00002471 endif
2472
2473 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002474 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002475 let first = 1
2476 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002477 if g:netrw_dirhistmax > 0
2478 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01002479" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002480 let histcnt= histcnt + 1
2481 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002482" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02002483 echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}
2484 let didwork= 1
2485 endif
2486 let first = 0
2487 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2488 if cnt < 0
2489 let cnt= cnt + g:netrw_dirhistmax
2490 endif
2491 endwhile
2492 else
2493 let g:netrw_dirhist_cnt= 0
2494 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002495 if didwork
2496 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2497 endif
2498
2499 elseif a:chg == 3
2500 " saves most recently visited directories (when they differ)
2501" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002502 if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02002503 if g:netrw_dirhistmax > 0
2504 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2505 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
2506 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002507" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002508 endif
2509
2510 elseif a:chg == 4
2511 " u: change to the previous directory stored on the history list
2512" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002513 if g:netrw_dirhistmax > 0
2514 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2515 if g:netrw_dirhist_cnt < 0
2516 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2517 endif
2518 else
2519 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002520 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002521 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2522" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002523 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002524 setl ma noro
2525" call Decho("(NetrwBookHistHandler) setl ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002526 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002527 setl nomod
2528" call Decho("(NetrwBookHistHandler) setl nomod")
2529" call Decho("(NetrwBookHistHandler) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002530 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002531" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002532 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002533 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02002534 if g:netrw_dirhistmax > 0
2535 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2536 else
2537 let g:netrw_dirhist_cnt= 0
2538 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002539 echo "Sorry, no predecessor directory exists yet"
2540 endif
2541
2542 elseif a:chg == 5
2543 " U: change to the subsequent directory stored on the history list
2544" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002545 if g:netrw_dirhistmax > 0
2546 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2547 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002548" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002549 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002550" call Decho("(NetrwBookHistHandler) setl ma noro")
2551 setl ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02002552 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002553" call Decho("removed all lines from buffer (%d)")
2554" call Decho("(NetrwBookHistHandler) setl nomod")
2555 setl nomod
2556" call Decho("(set nomod) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002557 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002558" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002559 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
2560 else
2561 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2562 if g:netrw_dirhist_cnt < 0
2563 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2564 endif
2565 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002566 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002567 else
2568 let g:netrw_dirhist_cnt= 0
2569 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002570 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002571
2572 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01002573 " delete the v:count'th bookmark
2574" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
2575 let savefile= s:NetrwHome()."/.netrwbook"
2576 if filereadable(savefile)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002577 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
2578 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002579 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002580 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002581 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002582 call s:NetrwBookmarkMenu()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002583" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002584endfun
2585
2586" ---------------------------------------------------------------------
2587" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
2588" Sister function: s:NetrwBookHistSave()
2589fun! s:NetrwBookHistRead()
2590" call Dfunc("s:NetrwBookHistRead()")
2591 if !exists("s:netrw_initbookhist")
2592 let home = s:NetrwHome()
2593 let savefile= home."/.netrwbook"
2594 if filereadable(savefile)
2595" call Decho("sourcing .netrwbook")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002596 exe "keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002597 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002598 if g:netrw_dirhistmax > 0
2599 let savefile= home."/.netrwhist"
2600 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002601" call Decho("sourcing .netrwhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002602 exe "keepj so ".savefile
2603 endif
2604 let s:netrw_initbookhist= 1
2605 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002606 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002607 endif
2608" call Dret("s:NetrwBookHistRead")
2609endfun
2610
2611" ---------------------------------------------------------------------
2612" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
2613" Sister function: s:NetrwBookHistRead()
2614" I used to do this via viminfo but that appears to
2615" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01002616fun! s:NetrwBookHistSave()
2617" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002618 if g:netrw_dirhistmax <= 0
2619" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
2620 return
2621 endif
2622
Bram Moolenaar5c736222010-01-06 20:54:52 +01002623 let savefile= s:NetrwHome()."/.netrwhist"
2624 1split
2625 call s:NetrwEnew()
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002626 setlocal cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
Bram Moolenaar5c736222010-01-06 20:54:52 +01002627 setlocal nocin noai noci magic nospell nohid wig= noaw
2628 setlocal ma noro write
2629 if exists("&acd") | setlocal noacd | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02002630 sil! keepj keepalt %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002631
2632 " save .netrwhist -- no attempt to merge
Bram Moolenaaradc21822011-04-01 18:03:16 +02002633 sil! file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01002634 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
2635 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
2636 let lastline = line("$")
2637 let cnt = 1
2638 while cnt <= g:netrw_dirhist_cnt
2639 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
2640 let cnt= cnt + 1
2641 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002642 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002643
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002644 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002645 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2646 " merge and write .netrwbook
2647 let savefile= s:NetrwHome()."/.netrwbook"
2648
2649 if filereadable(savefile)
2650 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002651 exe "sil keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002652 for bdm in booklist
2653 if index(g:netrw_bookmarklist,bdm) == -1
2654 call add(g:netrw_bookmarklist,bdm)
2655 endif
2656 endfor
2657 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002658 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002659 endif
2660
2661 " construct and save .netrwbook
2662 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002663 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002664 endif
2665 let bgone= bufnr("%")
2666 q!
2667 exe bgone."bwipe!"
2668
2669" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002670endfun
2671
2672" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002673" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2674" list of the contents of a local or remote directory. It is assumed that the
2675" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2676" with the requested remote hostname first.
2677fun! s:NetrwBrowse(islocal,dirname)
2678 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002679" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002680" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002681" call Dredir("ls!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002682 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002683 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002684 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002685
2686 " simplify the dirname (especially for ".."s in dirnames)
2687 if a:dirname !~ '^\a\+://'
2688 let dirname= simplify(a:dirname)
2689 else
2690 let dirname= a:dirname
2691 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002692
2693 if exists("s:netrw_skipbrowse")
2694 unlet s:netrw_skipbrowse
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002695" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002696" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2697 return
2698 endif
2699 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002700 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002701" call Dret("s:NetrwBrowse : missing shellescape()")
2702 return
2703 endif
2704 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002705 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002706" call Dret("s:NetrwBrowse : missing fnameescape()")
2707 return
2708 endif
2709
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002710 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002711
2712 " re-instate any marked files
2713 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2714" call Decho("clearing marked files")
2715 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2716 endif
2717
2718 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2719" call Decho("handle w:netrw_acdkeep:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002720" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002721 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002722 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002723" call Decho("getcwd<".getcwd().">")
2724
Bram Moolenaar5c736222010-01-06 20:54:52 +01002725 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002726 " looks like a regular file, attempt transfer
Bram Moolenaar5c736222010-01-06 20:54:52 +01002727" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002728
2729 " remove any filetype indicator from end of dirname, except for the {{{3
2730 " "this is a directory" indicator (/).
2731 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01002732 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002733" call Decho("new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002734 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002735
2736 " remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002737 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01002738 call s:NetrwEnew(dirname)
2739 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002740 setlocal ma noro
2741" call Decho("setlocal ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02002742 let b:netrw_curdir = dirname
2743 let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
2744" call Decho("exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
2745 exe "sil! keepj keepalt file ".fnameescape(url)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002746 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02002747 sil call netrw#NetRead(2,url)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002748 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002749 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02002750 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002751 endif
2752
2753 " save certain window-oriented variables into buffer-oriented variables {{{3
2754 call s:SetBufWinVars()
2755 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002756" call Decho("setl ma nomod")
2757 setl ma nomod
2758" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002759
Bram Moolenaar446cb832008-06-24 21:56:24 +00002760" call Dret("s:NetrwBrowse : file<".s:fname.">")
2761 return
2762 endif
2763
Bram Moolenaaradc21822011-04-01 18:03:16 +02002764 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00002765 call s:UseBufWinVars()
2766
2767 " set up some variables {{{3
2768 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002769 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002770 let s:last_sort_by = g:netrw_sort_by
2771
2772 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02002773 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002774
2775 " set up buffer {{{3
2776 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2777 " maintain markfile highlighting
2778 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2779" call Decho("bufnr(%)=".bufnr('%'))
2780" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2781 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2782 else
2783" call Decho("2match none")
2784 2match none
2785 endif
2786 if reusing
2787 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002788" call Decho("(NetrwBrowse) setl noma nomod nowrap")
2789 setl noma nomod nowrap
2790" call Decho("(set noma nomod nowrap) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002791" call Dret("s:NetrwBrowse : re-using buffer")
2792 return
2793 endif
2794
2795 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002796" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002797 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002798 if b:netrw_curdir =~ '[/\\]$'
2799 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2800 endif
2801 if b:netrw_curdir == ''
2802 if has("amiga")
2803 " On the Amiga, the empty string connotes the current directory
2804 let b:netrw_curdir= getcwd()
2805 else
2806 " under unix, when the root directory is encountered, the result
2807 " from the preceding substitute is an empty string.
2808 let b:netrw_curdir= '/'
2809 endif
2810 endif
2811 if !a:islocal && b:netrw_curdir !~ '/$'
2812 let b:netrw_curdir= b:netrw_curdir.'/'
2813 endif
2814" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2815
2816 " ------------
2817 " (local only) {{{3
2818 " ------------
2819 if a:islocal
2820" call Decho("local only:")
2821
2822 " Set up ShellCmdPost handling. Append current buffer to browselist
2823 call s:LocalFastBrowser()
2824
2825 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2826 if !g:netrw_keepdir
2827" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2828" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2829 if !exists("&l:acd") || !&l:acd
2830" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2831 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002832 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002833 catch /^Vim\%((\a\+)\)\=:E472/
2834 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2835 if exists("w:netrw_prvdir")
2836 let b:netrw_curdir= w:netrw_prvdir
2837 else
2838 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002839" call Decho("(NetrwBrowse) setl noma nomod nowrap")
2840 setl noma nomod nowrap
2841" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002842 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002843" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2844 return
2845 endif
2846 endtry
2847 endif
2848 endif
2849
2850 " --------------------------------
2851 " remote handling: {{{3
2852 " --------------------------------
2853 else
2854" call Decho("remote only:")
2855
Bram Moolenaar5c736222010-01-06 20:54:52 +01002856 " analyze dirname and g:netrw_list_cmd {{{4
2857" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
2858 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00002859 let dirname= b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01002860" call Decho("(dirname was ".dirname.") dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002861 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2862 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2863 if dirname !~ '/$'
2864 let dirname= dirname.'/'
2865 endif
2866 let b:netrw_curdir = dirname
2867" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2868 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002869 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002870" call Decho("(normal) dirname<".dirname.">")
2871 endif
2872
2873 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2874 if dirname !~ dirpat
2875 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002876 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002877 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002878 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002879" call Decho("(NetrwBrowse) setl noma nomod nowrap")
2880 setl noma nomod nowrap
2881" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002882" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2883 return
2884 endif
2885 let b:netrw_curdir= dirname
2886" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2887 endif " (additional remote handling)
2888
2889 " -----------------------
2890 " Directory Listing: {{{3
2891 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002892 keepj call s:NetrwMaps(a:islocal)
2893 keepj call s:PerformListing(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02002894 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002895 let &l:bexpr= "netrw#NetrwBalloonHelp()"
Bram Moolenaar15146672011-10-20 22:22:38 +02002896" call Decho("set up balloon help: l:bexpr=".&l:bexpr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002897 set beval
2898 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02002899 call s:NetrwOptionRestore("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002900
2901 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
2902 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
2903 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
2904 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
2905 " function gets called due to that autocmd; it notices that the following variable is set
2906 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
2907 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002908
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002909" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002910" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002911 return
2912endfun
2913
2914" ---------------------------------------------------------------------
2915" s:NetrwFileInfo: supports qf (query for file information) {{{2
2916fun! s:NetrwFileInfo(islocal,fname)
2917" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2918 if a:islocal
2919 if (has("unix") || has("macunix")) && executable("/bin/ls")
2920 if exists("b:netrw_curdir")
2921" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2922 if b:netrw_curdir =~ '/$'
2923 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2924 else
2925 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2926 endif
2927 else
2928" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2929 echo system("/bin/ls -lsad ".shellescape(a:fname))
2930 endif
2931 else
2932 " use vim functions to return information about file below cursor
2933" call Decho("using vim functions to query for file info")
2934 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2935 let fname= substitute(a:fname,".$","","")
2936 else
2937 let fname= a:fname
2938 endif
2939 let t = getftime(fname)
2940 let sz = getfsize(fname)
2941 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2942" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2943 endif
2944 else
2945 echo "sorry, \"qf\" not supported yet for remote files"
2946 endif
2947" call Dret("s:NetrwFileInfo")
2948endfun
2949
2950" ---------------------------------------------------------------------
2951" s:NetrwGetBuffer: {{{2
2952" returns 0=cleared buffer
2953" 1=re-used buffer
2954fun! s:NetrwGetBuffer(islocal,dirname)
2955" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2956 let dirname= a:dirname
2957
2958 " re-use buffer if possible {{{3
2959" call Decho("--re-use a buffer if possible--")
2960 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2961 " find NetrwTreeList buffer if there is one
Bram Moolenaar5c736222010-01-06 20:54:52 +01002962" call Decho("find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002963 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2964" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2965 let eikeep= &ei
2966 set ei=all
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002967 exe "sil! b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00002968 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01002969" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002970 return
2971 endif
2972 let bufnum= -1
2973" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2974
2975 else
2976 " find buffer number of buffer named precisely the same as dirname {{{3
2977" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2978" call Dredir("ls!")
2979
2980 " get dirname and associated buffer number
2981 let bufnum = bufnr(escape(dirname,'\'))
2982" call Decho(" find buffer<".dirname.">'s number ")
2983" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2984
2985 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002986 " try appending a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002987" call Decho(" try appending a trailing / to dirname<".dirname.">")
2988 let bufnum= bufnr(escape(dirname.'/','\'))
2989 if bufnum > 0
2990 let dirname= dirname.'/'
2991 endif
2992 endif
2993
2994 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002995 " try removing a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002996" call Decho(" try removing a trailing / from dirname<".dirname.">")
2997 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2998 if bufnum > 0
2999 let dirname= substitute(dirname,'/$','','')
3000 endif
3001 endif
3002
3003" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
3004 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
3005 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
3006 " handle approximate matches
Bram Moolenaar5c736222010-01-06 20:54:52 +01003007" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003008 let ibuf = 1
3009 let buflast = bufnr("$")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003010" call Decho(" findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003011 while ibuf <= buflast
3012 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00003013 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003014" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
3015 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
3016 " bname is not empty
3017 " dirname ends with bname,
3018 " dirname doesn't start with /, so its not a absolute path
3019" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003020 break
3021 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003022 if bname =~ '^'.dirname.'/\=$'
3023 " bname begins with dirname
3024" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003025 break
3026 endif
3027 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003028" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
3029 break
3030 endif
3031 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
3032" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003033 break
3034 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003035 let ibuf= ibuf + 1
3036 endwhile
3037 if ibuf > buflast
3038 let bufnum= -1
3039 else
3040 let bufnum= ibuf
3041 endif
3042" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
3043 endif
3044 endif
3045
3046 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003047 sil! keepj mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00003048 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003049" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003050 call s:NetrwEnew(dirname)
3051" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
3052 " name the buffer
3053 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3054 " Got enew buffer; transform into a NetrwTreeListing
3055" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
3056 if !exists("s:netrw_treelistnum")
3057 let s:netrw_treelistnum= 1
3058 else
3059 let s:netrw_treelistnum= s:netrw_treelistnum + 1
3060 endif
3061 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003062" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003063 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
3064 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02003065 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
3066 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
3067 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
3068 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003069" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
3070 else
3071" let v:errmsg= "" " Decho
3072 let escdirname= fnameescape(dirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003073" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003074" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003075" let v:errmsg= "" " Decho
3076 exe 'sil! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003077" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
3078 endif
3079" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
3080
3081 else " Re-use the buffer
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003082" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003083 let eikeep= &ei
3084 set ei=all
3085 if getline(2) =~ '^" Netrw Directory Listing'
3086" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003087 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003088 else
3089" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003090 exe "sil! b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003091 endif
3092 if bufname("%") == '.'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003093" call Decho("exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003094 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00003095 endif
3096 let &ei= eikeep
3097 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02003098 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003099" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
3100 return 0
3101 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3102" call Decho("--re-use tree listing--")
3103" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003104 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02003105 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003106" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
3107 return 0
3108 else
3109" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
3110 return 1
3111 endif
3112 endif
3113
3114 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
3115 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
3116 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
3117 " med 1 D H
3118 " fast 2 H H
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003119" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003120 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003121 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003122" call Decho("exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003123 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003124
3125 " delete all lines from buffer {{{3
3126" call Decho("--delete all lines from buffer--")
3127" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003128 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003129
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003130" call Dret("s:NetrwGetBuffer 0 : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003131 return 0
3132endfun
3133
3134" ---------------------------------------------------------------------
3135" s:NetrwGetcwd: get the current directory. {{{2
3136" Change backslashes to forward slashes, if any.
3137" If doesc is true, escape certain troublesome characters
3138fun! s:NetrwGetcwd(doesc)
3139" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
3140 let curdir= substitute(getcwd(),'\\','/','ge')
3141 if curdir !~ '[\/]$'
3142 let curdir= curdir.'/'
3143 endif
3144 if a:doesc
3145 let curdir= fnameescape(curdir)
3146 endif
3147" call Dret("NetrwGetcwd <".curdir.">")
3148 return curdir
3149endfun
3150
3151" ---------------------------------------------------------------------
3152" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
3153fun! s:NetrwGetWord()
3154" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
3155 call s:UseBufWinVars()
3156
3157 " insure that w:netrw_liststyle is set up
3158 if !exists("w:netrw_liststyle")
3159 if exists("g:netrw_liststyle")
3160 let w:netrw_liststyle= g:netrw_liststyle
3161 else
3162 let w:netrw_liststyle= s:THINLIST
3163 endif
3164" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
3165 endif
3166
3167 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
3168 " Active Banner support
3169" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003170 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003171 let dirname= "./"
3172 let curline= getline('.')
3173
3174 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003175 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00003176 let s:netrw_skipbrowse= 1
3177 echo 'Pressing "s" also works'
3178
3179 elseif curline =~ '"\s*Sort sequence:'
3180 let s:netrw_skipbrowse= 1
3181 echo 'Press "S" to edit sorting sequence'
3182
3183 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003184 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00003185 let s:netrw_skipbrowse= 1
3186 echo 'Pressing "?" also works'
3187
3188 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003189 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00003190 let s:netrw_skipbrowse= 1
3191 echo 'Pressing "a" also works'
3192
3193 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003194 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003195 endif
3196
3197 elseif w:netrw_liststyle == s:THINLIST
3198" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003199 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003200 let dirname= getline('.')
3201
3202 elseif w:netrw_liststyle == s:LONGLIST
3203" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003204 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003205 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
3206
3207 elseif w:netrw_liststyle == s:TREELIST
3208" call Decho("treelist handling")
3209 let dirname= substitute(getline('.'),'^\(| \)*','','e')
3210
3211 else
3212" call Decho("obtain word from wide listing")
3213 let dirname= getline('.')
3214
3215 if !exists("b:netrw_cpf")
3216 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003217 exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003218 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003219" call Decho("computed cpf=".b:netrw_cpf)
3220 endif
3221
3222" call Decho("buf#".bufnr("%")."<".bufname("%").">")
3223 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
3224" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
3225" call Decho("1: dirname<".dirname.">")
3226 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003227 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003228 else
3229 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003230 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003231 endif
3232 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00003233 let eofname= filestart + b:netrw_cpf + 1
3234 if eofname <= col("$")
3235 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003236 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00003237 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003238 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00003239 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003240 let dirname = @a
3241 let @a = rega
3242" call Decho("2: dirname<".dirname.">")
3243 let dirname= substitute(dirname,'\s\+$','','e')
3244" call Decho("3: dirname<".dirname.">")
3245 endif
3246
3247 " symlinks are indicated by a trailing "@". Remove it before further processing.
3248 let dirname= substitute(dirname,"@$","","")
3249
3250 " executables are indicated by a trailing "*". Remove it before further processing.
3251 let dirname= substitute(dirname,"\*$","","")
3252
3253" call Dret("s:NetrwGetWord <".dirname.">")
3254 return dirname
3255endfun
3256
3257" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003258" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003259fun! s:NetrwListSettings(islocal)
3260" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
3261 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003262" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003263 setlocal bt=nofile nobl ma nonu nowrap noro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003264" call Decho("exe sil! keepalt file ".fnameescape(fname))
3265 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003266 if g:netrw_use_noswf
3267 setlocal noswf
3268 endif
3269" call Dredir("ls!")
3270" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
3271 exe "setlocal ts=".g:netrw_maxfilenamelen
3272 setlocal isk+=.,~,-
3273 if g:netrw_fastbrowse > a:islocal
3274 setlocal bh=hide
3275 else
3276 setlocal bh=delete
3277 endif
3278" call Dret("s:NetrwListSettings")
3279endfun
3280
3281" ---------------------------------------------------------------------
3282" s:NetrwListStyle: {{{2
3283" islocal=0: remote browsing
3284" =1: local browsing
3285fun! s:NetrwListStyle(islocal)
3286" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
3287 let fname = s:NetrwGetWord()
3288 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
3289 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
3290" call Decho("fname<".fname.">")
3291" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
3292" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
3293
3294 if w:netrw_liststyle == s:THINLIST
3295 " use one column listing
3296" call Decho("use one column list")
3297 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3298
3299 elseif w:netrw_liststyle == s:LONGLIST
3300 " use long list
3301" call Decho("use long list")
3302 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
3303
3304 elseif w:netrw_liststyle == s:WIDELIST
3305 " give wide list
3306" call Decho("use wide list")
3307 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3308
3309 elseif w:netrw_liststyle == s:TREELIST
3310" call Decho("use tree list")
3311 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3312
3313 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003314 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003315 let g:netrw_liststyle = s:THINLIST
3316 let w:netrw_liststyle = g:netrw_liststyle
3317 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3318 endif
3319 setlocal ma noro
3320" call Decho("setlocal ma noro")
3321
3322 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
3323" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003324 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003325 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003326" call Decho("(NetrwListStyle) setl nomod")
3327 setl nomod
3328" call Decho("(NetrwListStyle) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003329
3330 " refresh the listing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003331" call Decho("(NetrwListStyle) refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003332 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02003333 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3334 keepj call netrw#NetrwRestorePosn(svpos)
3335 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003336
3337 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003338 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00003339 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3340" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3341 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003342 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003343 endif
3344
3345" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
3346endfun
3347
3348" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003349" s:NetrwBannerCtrl: toggles the display of the banner {{{2
3350fun! s:NetrwBannerCtrl(islocal)
3351" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
3352
3353 " toggle the banner (enable/suppress)
3354 let g:netrw_banner= !g:netrw_banner
3355
3356 " refresh the listing
3357 let svpos= netrw#NetrwSavePosn()
3358 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3359
3360 " keep cursor on the filename
3361 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003362 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01003363 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3364" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3365 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003366 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01003367 endif
3368" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
3369endfun
3370
3371" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003372" s:NetrwBookmarkMenu: Uses menu priorities {{{2
3373" .2.[cnt] for bookmarks, and
3374" .3.[cnt] for history
3375" (see s:NetrwMenu())
3376fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003377 if !exists("s:netrw_menucnt")
3378 return
3379 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003380" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003381
3382 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02003383 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00003384 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003385" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003386 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
3387 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003388 endif
3389 if !exists("s:netrw_initbookhist")
3390 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003391 endif
3392
3393 " show bookmarked places
Bram Moolenaar5c736222010-01-06 20:54:52 +01003394 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3395 let cnt= 1
3396 for bmd in g:netrw_bookmarklist
Bram Moolenaaradc21822011-04-01 18:03:16 +02003397" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003398 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003399
3400 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003401 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003402
3403 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003404 exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.' '.cnt."mB"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003405 let cnt= cnt + 1
3406 endfor
3407
3408 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003409
3410 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02003411 if g:netrw_dirhistmax > 0
3412 let cnt = g:netrw_dirhist_cnt
3413 let first = 1
3414 let histcnt = 0
3415 while ( first || cnt != g:netrw_dirhist_cnt )
3416 let histcnt = histcnt + 1
3417 let priority = g:netrw_dirhist_cnt + histcnt
3418 if exists("g:netrw_dirhist_{cnt}")
3419 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
3420" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
3421 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
3422 endif
3423 let first = 0
3424 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3425 if cnt < 0
3426 let cnt= cnt + g:netrw_dirhistmax
3427 endif
3428 endwhile
3429 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003430
Bram Moolenaar9964e462007-05-05 17:54:07 +00003431 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003432" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003433endfun
3434
3435" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003436" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
3437" directory and a new directory name. Also, if the
3438" "new directory name" is actually a file,
3439" NetrwBrowseChgDir() edits the file.
3440fun! s:NetrwBrowseChgDir(islocal,newdir,...)
3441" 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 +00003442
Bram Moolenaar446cb832008-06-24 21:56:24 +00003443 if !exists("b:netrw_curdir")
3444 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
3445 " and the current window is the NetrwMessage window.
3446" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003447" call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003448" call Dredir("ls!")
3449" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003450 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003451 endif
3452
Bram Moolenaaradc21822011-04-01 18:03:16 +02003453 keepj call s:NetrwOptionSave("s:")
3454 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003455 let nbcd_curpos = netrw#NetrwSavePosn()
3456 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003457" call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003458 if (has("win32") || has("win95") || has("win64") || has("win16"))
3459 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
3460 else
3461 let dirname= b:netrw_curdir
3462 endif
3463 let newdir = a:newdir
3464 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003465
Bram Moolenaar446cb832008-06-24 21:56:24 +00003466 " set up o/s-dependent directory recognition pattern
3467 if has("amiga")
3468 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00003469 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003470 let dirpat= '[\/]$'
3471 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003472" call Decho("(NetrwBrowseChgDir) dirname<".dirname."> dirpat<".dirpat.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003473
3474 if dirname !~ dirpat
3475 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02003476 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003477 let dirname= dirname.'/'
3478" call Decho("adjusting dirname<".dirname.">")
3479 endif
3480
3481 if newdir !~ dirpat
3482 " ------------
3483 " edit a file:
3484 " ------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003485" call Decho('(NetrwBrowseChgDir) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
3486
3487 " save position for benefit of Rexplore
3488 let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn()
3489
3490" call Decho("(NetrwBrowseChgDir) setting s:rexposn_".bufnr("%")." to SavePosn")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003491 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
3492 let dirname= s:NetrwTreeDir()
3493 if dirname =~ '/$'
3494 let dirname= dirname.newdir
3495 else
3496 let dirname= s:NetrwTreeDir()."/".newdir
3497 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003498" call Decho("(NetrwBrowseChgDir) dirname<".dirname.">")
3499" call Decho("(NetrwBrowseChgDir) tree listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003500 elseif newdir =~ '^\(/\|\a:\)'
3501 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003502 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003503 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003504 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003505" call Decho("(NetrwBrowseChgDir) handling a file: dirname<".dirname."> (a:0=".a:0.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003506 " this lets NetrwBrowseX avoid the edit
3507 if a:0 < 1
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003508" call Decho("(NetrwBrowseChgDir) set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003509 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003510 if !exists("s:didsplit")
3511 if g:netrw_browse_split == 1
3512 new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003513 if !&ea
3514 wincmd _
3515 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003516 elseif g:netrw_browse_split == 2
3517 rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003518 if !&ea
3519 wincmd |
3520 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003521 elseif g:netrw_browse_split == 3
3522 tabnew
3523 elseif g:netrw_browse_split == 4
3524 if s:NetrwPrevWinOpen(2) == 3
3525" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003526 return
3527 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003528 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003529 " handling a file, didn't split, so remove menu
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003530" call Decho("(NetrwBrowseChgDir) handling a file+didn't split, so remove menu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003531 call s:NetrwMenu(0)
3532 " optional change to window
3533 if g:netrw_chgwin >= 1
3534 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003535 endif
3536 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003537 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003538
Bram Moolenaar446cb832008-06-24 21:56:24 +00003539 " the point where netrw actually edits the (local) file
3540 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
3541 if a:islocal
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003542" call Decho("(NetrwBrowseChgDir) edit local file: exe e! ".fnameescape(dirname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003543 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003544 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003545" call Decho("(NetrwBrowseChgDir) remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003546 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003547 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003548
3549 " handle g:Netrw_funcref -- call external-to-netrw functions
3550 " This code will handle g:Netrw_funcref as an individual function reference
3551 " or as a list of function references. It will ignore anything that's not
3552 " a function reference. See :help Funcref for information about function references.
3553 if exists("g:Netrw_funcref")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003554" call Decho("(NetrwBrowseChgDir) handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003555 if type(g:Netrw_funcref) == 2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003556" call Decho("(NetrwBrowseChgDir) handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003557 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003558 elseif type(g:Netrw_funcref) == 3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003559" call Decho("(NetrwBrowseChgDir) handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003560 for Fncref in g:Netrw_funcref
3561 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02003562 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003563 endif
3564 endfor
3565 endif
3566 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003567 endif
3568
3569 elseif newdir =~ '^/'
3570 " ---------------------------------
3571 " just go to the new directory spec
3572 " ---------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003573" call Decho('(NetrwBrowseChgDir) case "just go to new directory spec": newdir<'.newdir.'>')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003574 let dirname= newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003575 keepj call s:SetRexDir(a:islocal,dirname)
3576 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003577
3578 elseif newdir == './'
3579 " --------------------------
3580 " refresh the directory list
3581 " --------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003582" call Decho('(NetrwBrowseChgDir) case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003583 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003584
3585 elseif newdir == '../'
3586 " -------------------
3587 " go up one directory
3588 " -------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003589" call Decho('(NetrwBrowseChgDir) case "go up one directory": newdir == "../"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003590
3591 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3592 " force a refresh
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003593" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
3594" call Decho("(NetrwBrowseChgDir) setl noro ma")
3595 setl noro ma
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003596 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003597 endif
3598
3599 if has("amiga")
3600 " amiga
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003601" call Decho('(NetrwBrowseChgDir) case "go up one directory": newdir == "../" and amiga')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003602 if a:islocal
3603 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
3604 let dirname= substitute(dirname,'/$','','')
3605 else
3606 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
3607 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003608" call Decho("(NetrwBrowseChgDir) amiga: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003609
3610 else
3611 " unix or cygwin
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003612" call Decho('(NetrwBrowseChgDir) case "go up one directory": newdir == "../" and unix or cygwin')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003613 if a:islocal
3614 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
3615 if dirname == ""
3616 let dirname= '/'
3617 endif
3618 else
3619 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
3620 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003621" call Decho("(NetrwBrowseChgDir) unix: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003622 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003623 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003624
3625 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003626" call Decho('(NetrwBrowseChgDir) case liststyle is TREELIST and w:netrw_treedict exists')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003627 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003628" call Decho("(NetrwBrowseChgDir) setl noro ma")
3629 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003630 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003631" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003632 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003633 endif
3634 let treedir = s:NetrwTreeDir()
3635 let s:treecurpos = nbcd_curpos
3636 let haskey= 0
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003637" call Decho("(NetrwBrowseChgDir) w:netrw_treedict<".string(w:netrw_treedict).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003638
3639 " search treedict for tree dir as-is
3640 if has_key(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003641" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'> : found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003642 let haskey= 1
3643 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003644" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003645 endif
3646
3647 " search treedict for treedir with a / appended
3648 if !haskey && treedir !~ '/$'
3649 if has_key(w:netrw_treedict,treedir."/")
3650 let treedir= treedir."/"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003651" call Decho('(NetrwBrowseChgDir) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003652 let haskey = 1
3653 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003654" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'/> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003655 endif
3656 endif
3657
3658 " search treedict for treedir with any trailing / elided
3659 if !haskey && treedir =~ '/$'
3660 let treedir= substitute(treedir,'/$','','')
3661 if has_key(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003662" call Decho('(NetrwBrowseChgDir) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003663 let haskey = 1
3664 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003665" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003666 endif
3667 endif
3668
3669 if haskey
3670 " close tree listing for selected subdirectory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003671" call Decho("(NetrwBrowseChgDir) closing selected subdirectory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003672 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003673" call Decho("(NetrwBrowseChgDir) removed entry<".treedir."> from treedict")
3674" call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003675 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00003676 else
3677 " go down one directory
3678 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003679" call Decho("(NetrwBrowseChgDir) go down one dir: treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003680 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003681 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003682 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003683
3684 else
3685 " go down one directory
3686 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003687" call Decho("(NetrwBrowseChgDir) go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003688 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003689 endif
3690
Bram Moolenaaradc21822011-04-01 18:03:16 +02003691 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003692 if dolockout
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003693" call Decho("(NetrwBrowseChgDir) filewritable(dirname<".dirname.">)=".filewritable(dirname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003694 if filewritable(dirname)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003695" call Decho("(NetrwBrowseChgDir) doing modification lockout settings: ma nomod noro")
3696" call Decho("(NetrwBrowseChgDir) setl ma nomod noro")
3697 setl ma nomod noro
3698" call Decho("(NetrwBrowseChgDir) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003699 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003700" call Decho("(NetrwBrowseChgDir) doing modification lockout settings: ma nomod ro")
3701" call Decho("(NetrwBrowseChgDir) setl ma nomod noro")
3702 setl ma nomod ro
3703" call Decho("(NetrwBrowseChgDir) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003704 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003705 endif
3706
Bram Moolenaar446cb832008-06-24 21:56:24 +00003707" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
3708 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00003709endfun
3710
3711" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003712" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
3713" given filename; typically this means given their extension.
3714" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00003715fun! netrw#NetrwBrowseX(fname,remote)
3716" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3717
Bram Moolenaar5c736222010-01-06 20:54:52 +01003718 " special core dump handler
3719 if a:fname =~ '/core\(\.\d\+\)\=$'
3720 if exists("g:Netrw_corehandler")
3721 if type(g:Netrw_corehandler) == 2
3722 " g:Netrw_corehandler is a function reference (see :help Funcref)
3723" call Decho("g:Netrw_corehandler is a funcref")
3724 call g:Netrw_corehandler(a:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02003725 elseif type(g:Netrw_corehandler) == 3)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003726 " g:Netrw_corehandler is a List of function references (see :help Funcref)
3727" call Decho("g:Netrw_corehandler is a List")
3728 for Fncref in g:Netrw_corehandler
3729 if type(FncRef) == 2
3730 call FncRef(a:fname)
3731 endif
3732 endfor
3733 endif
3734" call Dret("NetrwBrowseX : coredump handler invoked")
3735 return
3736 endif
3737 endif
3738
Bram Moolenaar446cb832008-06-24 21:56:24 +00003739 " set up the filename
3740 " (lower case the extension, make a local copy of a remote file)
3741 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3742 if has("win32") || has("win95") || has("win64") || has("win16")
3743 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003744 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003745" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003746
3747 " seems kde systems often have gnome-open due to dependencies, even though
3748 " gnome-open's subsidiary display tools are largely absent. Kde systems
3749 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3750 if !exists("s:haskdeinit")
3751 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003752 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003753 if v:shell_error
3754 let s:haskdeinit = 0
3755 endif
3756 else
3757 let s:haskdeinit= 0
3758 endif
3759" call Decho("setting s:haskdeinit=".s:haskdeinit)
3760 endif
3761
3762 if a:remote == 1
3763 " create a local copy
Bram Moolenaar5c736222010-01-06 20:54:52 +01003764" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003765 setlocal bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01003766 call netrw#NetRead(3,a:fname)
3767 " attempt to rename tempfile
3768 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
3769 let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
3770" call Decho("basename<".basename.">")
3771" call Decho("newname <".newname.">")
3772 if rename(s:netrw_tmpfile,newname) == 0
3773 " renaming succeeded
3774 let fname= newname
3775 else
3776 " renaming failed
3777 let fname= s:netrw_tmpfile
3778 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00003779 else
3780 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003781 " special ~ handler for local
3782 if fname =~ '^\~' && expand("$HOME") != ""
3783" call Decho('invoking special ~ handler')
3784 let fname= substitute(fname,'^\~',expand("$HOME"),'')
3785 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003786 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003787" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003788" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3789
3790 " set up redirection
3791 if &srr =~ "%s"
3792 if (has("win32") || has("win95") || has("win64") || has("win16"))
3793 let redir= substitute(&srr,"%s","nul","")
3794 else
3795 let redir= substitute(&srr,"%s","/dev/null","")
3796 endif
3797 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3798 let redir= &srr . "nul"
3799 else
3800 let redir= &srr . "/dev/null"
3801 endif
3802" call Decho("redir{".redir."} srr{".&srr."}")
3803
3804 " extract any viewing options. Assumes that they're set apart by quotes.
3805 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003806" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003807 if g:netrw_browsex_viewer =~ '\s'
3808 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3809 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3810 let oviewer = ''
3811 let cnt = 1
3812 while !executable(viewer) && viewer != oviewer
3813 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3814 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3815 let cnt = cnt + 1
3816 let oviewer = viewer
3817" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3818 endwhile
3819 else
3820 let viewer = g:netrw_browsex_viewer
3821 let viewopt = ""
3822 endif
3823" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3824 endif
3825
3826 " execute the file handler
3827 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3828" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3829 let ret= netrwFileHandlers#Invoke(exten,fname)
3830
3831 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3832" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003833" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
3834 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003835 let ret= v:shell_error
3836
3837 elseif has("win32") || has("win64")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003838 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003839" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3840 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003841 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003842" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3843 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003844 else
3845 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
3846 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003847 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3848 let ret= v:shell_error
3849
3850 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003851" call Decho("exe sil !gnome-open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003852 exe "sil !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003853 let ret= v:shell_error
3854
3855 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003856" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003857 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003858 let ret= v:shell_error
3859
3860 elseif has("macunix") && executable("open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003861" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003862 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003863 let ret= v:shell_error
3864
3865 else
3866 " netrwFileHandlers#Invoke() always returns 0
3867 let ret= netrwFileHandlers#Invoke(exten,fname)
3868 endif
3869
3870 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3871 if ret
3872 let ret= netrwFileHandlers#Invoke(exten,fname)
3873 endif
3874
Bram Moolenaarc236c162008-07-13 17:41:49 +00003875 " restoring redraw! after external file handlers
3876 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003877
3878 " cleanup: remove temporary file,
3879 " delete current buffer if success with handler,
3880 " return to prior buffer (directory listing)
3881 " Feb 12, 2008: had to de-activiate removal of
3882 " temporary file because it wasn't getting seen.
3883" if a:remote == 1 && fname != a:fname
3884" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003885" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003886" endif
3887
3888 if a:remote == 1
3889 setlocal bh=delete bt=nofile
3890 if g:netrw_use_noswf
3891 setlocal noswf
3892 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003893 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003894" redraw!
3895 endif
3896
3897" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003898endfun
3899
3900" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003901" s:NetrwChgPerm: (implements "gp") change file permission {{{2
3902fun! s:NetrwChgPerm(islocal,curdir)
3903" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
3904 call inputsave()
3905 let newperm= input("Enter new permission: ")
3906 call inputrestore()
3907 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
3908 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
3909" call Decho("chgperm<".chgperm.">")
3910 call system(chgperm)
3911 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003912 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003913 endif
3914 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02003915 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003916 endif
3917" call Dret("s:NetrwChgPerm")
3918endfun
3919
3920" ---------------------------------------------------------------------
3921" s:NetrwClearExplore: clear explore variables (if any) {{{2
3922fun! s:NetrwClearExplore()
3923" call Dfunc("s:NetrwClearExplore()")
3924 2match none
3925 if exists("s:explore_match") |unlet s:explore_match |endif
3926 if exists("s:explore_indx") |unlet s:explore_indx |endif
3927 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
3928 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3929 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
3930 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3931 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3932 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3933 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3934" redraw!
3935 echo " "
3936 echo " "
3937" call Dret("s:NetrwClearExplore")
3938endfun
3939
3940" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003941" netrw#Explore: launch the local browser in the directory of the current file {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003942" indx: == -1: Nexplore
3943" == -2: Pexplore
3944" == +: this is overloaded:
3945" * If Nexplore/Pexplore is in use, then this refers to the
3946" indx'th item in the w:netrw_explore_list[] of items which
3947" matched the */pattern **/pattern *//pattern **//pattern
3948" * If Hexplore or Vexplore, then this will override
3949" g:netrw_winsize to specify the qty of rows or columns the
3950" newly split window should have.
3951" dosplit==0: the window will be split iff the current file has been modified
3952" dosplit==1: the window will be split before running the local browser
3953" style == 0: Explore style == 1: Explore!
3954" == 2: Hexplore style == 3: Hexplore!
3955" == 4: Vexplore style == 5: Vexplore!
3956" == 6: Texplore
Bram Moolenaar9964e462007-05-05 17:54:07 +00003957fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003958" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." modifiable=".&modifiable." a:0=".a:0." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003959 if !exists("b:netrw_curdir")
3960 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003961" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003962 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003963 let curdir = simplify(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003964 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3965" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003966
3967 " save registers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003968 sil! let keepregstar = @*
3969 sil! let keepregplus = @+
3970 sil! let keepregslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +00003971
3972 " if dosplit or file has been modified
3973 if a:dosplit || &modified || a:style == 6
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003974" call Decho("case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003975 call s:SaveWinVars()
Bram Moolenaar251e1912011-06-19 05:09:16 +02003976 let winsz= g:netrw_winsize
Bram Moolenaar5c736222010-01-06 20:54:52 +01003977 if a:indx > 0
Bram Moolenaar251e1912011-06-19 05:09:16 +02003978 let winsz= a:indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003979 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003980
3981 if a:style == 0 " Explore, Sexplore
3982" call Decho("style=0: Explore or Sexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003983 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003984 exe winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003985
3986 elseif a:style == 1 "Explore!, Sexplore!
3987" call Decho("style=1: Explore! or Sexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003988 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003989 exe winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003990
3991 elseif a:style == 2 " Hexplore
3992" call Decho("style=2: Hexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003993 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003994 exe "bel ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003995
3996 elseif a:style == 3 " Hexplore!
3997" call Decho("style=3: Hexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003998 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003999 exe "abo ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004000
4001 elseif a:style == 4 " Vexplore
4002" call Decho("style=4: Vexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02004003 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02004004 exe "lefta ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004005
4006 elseif a:style == 5 " Vexplore!
4007" call Decho("style=5: Vexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02004008 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02004009 exe "rightb ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004010
4011 elseif a:style == 6 " Texplore
4012 call s:SaveBufVars()
4013" call Decho("style = 6: Texplore")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004014 exe "tabnew ".fnameescape(curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004015 call s:RestoreBufVars()
4016 endif
4017 call s:RestoreWinVars()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004018" else " Decho
4019" call Decho("case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004020 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004021 keepj norm! 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00004022
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004023 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02004024" call Decho("case [a:0=".a:0."] > 0")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004025 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaar15146672011-10-20 22:22:38 +02004026" call Decho("..case a:1<".a:1.">: starts with ~ and unix or cygwin")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004027 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaar15146672011-10-20 22:22:38 +02004028" call Decho("..using dirname<".dirname."> (case: ~ && unix||cygwin)")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004029 elseif a:1 == '.'
Bram Moolenaar15146672011-10-20 22:22:38 +02004030" call Decho("..case a:1<".a:1.">: matches .")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004031 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004032 if dirname !~ '/$'
4033 let dirname= dirname."/"
4034 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004035" call Decho("..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004036 elseif a:1 =~ '\$'
Bram Moolenaar15146672011-10-20 22:22:38 +02004037" call Decho("..case a:1<".a:1.">: matches ending $")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004038 let dirname= simplify(expand(a:1))
Bram Moolenaar15146672011-10-20 22:22:38 +02004039" call Decho("..using user-specified dirname<".dirname."> with $env-var")
4040 elseif a:1 !~ '^\*\{1,2}/'
4041" call Decho("..case a:1<".a:1.">: other, not pattern or filepattern")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004042 let dirname= simplify(a:1)
Bram Moolenaar15146672011-10-20 22:22:38 +02004043" call Decho("..using user-specified dirname<".dirname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004044 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004045" call Decho("..case a:1: pattern or filepattern")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004046 let dirname= a:1
Bram Moolenaar9964e462007-05-05 17:54:07 +00004047 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004048 else
4049 " clear explore
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004050" call Decho("case a:0=".a:0.": clearing Explore list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004051 call s:NetrwClearExplore()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004052" call Dret("netrw#Explore : cleared list")
4053 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004054 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004055
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004056" call Decho("dirname<".dirname.">")
4057 if dirname =~ '\.\./\=$'
4058 let dirname= simplify(fnamemodify(dirname,':p:h'))
4059 elseif dirname =~ '\.\.' || dirname == '.'
4060 let dirname= simplify(fnamemodify(dirname,':p'))
4061 endif
4062" call Decho("dirname<".dirname."> (after simplify)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004063
Bram Moolenaar15146672011-10-20 22:22:38 +02004064 if dirname =~ '^\*//'
4065 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
4066" call Decho("case Explore *//pattern")
4067 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
4068 let starpat= 1
4069" call Decho("..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
4070 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4071
4072 elseif dirname =~ '^\*\*//'
4073 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
4074" call Decho("case Explore **//pattern")
4075 let pattern= substitute(dirname,'^\*\*//','','')
4076 let starpat= 2
4077" call Decho("..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
4078
4079 elseif dirname =~ '/\*\*/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004080 " handle .../**/.../filepat
4081" call Decho("case Explore .../**/.../filepat")
4082 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
4083 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
4084 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004085 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004086 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004087 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004088 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
4089 let starpat= 4;
Bram Moolenaar15146672011-10-20 22:22:38 +02004090" call Decho("..pwd<".getcwd()."> dirname<".dirname.">")
4091" call Decho("..case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004092
4093 elseif dirname =~ '^\*/'
4094 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
4095 let starpat= 3
4096" call Decho("case Explore */filepat (starpat=".starpat.")")
4097
4098 elseif dirname=~ '^\*\*/'
4099 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
4100 let starpat= 4
4101" call Decho("case Explore **/filepat (starpat=".starpat.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004102
Bram Moolenaar446cb832008-06-24 21:56:24 +00004103 else
4104 let starpat= 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004105" call Decho("default case: starpat=".starpat)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004106 endif
4107
4108 if starpat == 0 && a:indx >= 0
4109 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaar5c736222010-01-06 20:54:52 +01004110" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004111 if dirname == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004112 let dirname= curfiledir
Bram Moolenaar15146672011-10-20 22:22:38 +02004113" call Decho("..empty dirname, using current file's directory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004114 endif
4115 if dirname =~ '^scp:' || dirname =~ '^ftp:'
Bram Moolenaar15146672011-10-20 22:22:38 +02004116" call Decho("..calling NetrwBrowse(0,dirname<".dirname.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004117 call s:NetrwBrowse(0,dirname)
4118 else
4119 if dirname == ""|let dirname= getcwd()|endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004120" call Decho("..calling LocalBrowseCheck(dirname<".dirname.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004121 call netrw#LocalBrowseCheck(dirname)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004122" call Decho("win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004123 endif
4124
Bram Moolenaar5c736222010-01-06 20:54:52 +01004125" call Decho("curdir<".curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004126 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004127 keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004128 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004129 keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004130 endif
4131
4132 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
4133 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
4134 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
4135 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
4136 elseif a:indx <= 0
4137 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaar5c736222010-01-06 20:54:52 +01004138" call Decho("case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004139 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
Bram Moolenaar15146672011-10-20 22:22:38 +02004140" call Decho("..set up <s-up> and <s-down> maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004141 let s:didstarstar= 1
4142 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
4143 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
4144 endif
4145
4146 if has("path_extra")
Bram Moolenaar15146672011-10-20 22:22:38 +02004147" call Decho("..starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004148 if !exists("w:netrw_explore_indx")
4149 let w:netrw_explore_indx= 0
4150 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004151
Bram Moolenaar9964e462007-05-05 17:54:07 +00004152 let indx = a:indx
Bram Moolenaar15146672011-10-20 22:22:38 +02004153" call Decho("..starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004154
Bram Moolenaar9964e462007-05-05 17:54:07 +00004155 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004156 " Nexplore
Bram Moolenaar15146672011-10-20 22:22:38 +02004157" call Decho("..case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004158 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02004159 keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004160 sil! let @* = keepregstar
4161 sil! let @+ = keepregstar
4162 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004163" call Dret("netrw#Explore")
4164 return
4165 endif
4166 let indx= w:netrw_explore_indx
4167 if indx < 0 | let indx= 0 | endif
4168 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4169 let curfile= w:netrw_explore_list[indx]
Bram Moolenaar15146672011-10-20 22:22:38 +02004170" call Decho("....indx=".indx." curfile<".curfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004171 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
4172 let indx= indx + 1
Bram Moolenaar15146672011-10-20 22:22:38 +02004173" call Decho("....indx=".indx." (Nexplore while loop)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004174 endwhile
4175 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004176" call Decho("....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004177
4178 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004179 " Pexplore
4180" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004181 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02004182 keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004183 sil! let @* = keepregstar
4184 sil! let @+ = keepregstar
4185 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004186" call Dret("netrw#Explore")
4187 return
4188 endif
4189 let indx= w:netrw_explore_indx
4190 if indx < 0 | let indx= 0 | endif
4191 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4192 let curfile= w:netrw_explore_list[indx]
Bram Moolenaar15146672011-10-20 22:22:38 +02004193" call Decho("....indx=".indx." curfile<".curfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004194 while indx >= 0 && curfile == w:netrw_explore_list[indx]
4195 let indx= indx - 1
Bram Moolenaar15146672011-10-20 22:22:38 +02004196" call Decho("....indx=".indx." (Pexplore while loop)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004197 endwhile
4198 if indx < 0 | let indx= 0 | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004199" call Decho("....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004200
4201 else
4202 " Explore -- initialize
4203 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar15146672011-10-20 22:22:38 +02004204" call Decho("..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004205 keepj call s:NetrwClearExplore()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004206 let w:netrw_explore_indx= 0
4207 if !exists("b:netrw_curdir")
4208 let b:netrw_curdir= getcwd()
4209 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004210" call Decho("....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004211
Bram Moolenaar446cb832008-06-24 21:56:24 +00004212 " switch on starpat to build the w:netrw_explore_list of files
4213 if starpat == 1
4214 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaar15146672011-10-20 22:22:38 +02004215" call Decho("..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls)
4216" call Decho("....pattern<".pattern.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004217 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004218 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004219 catch /^Vim\%((\a\+)\)\=:E480/
4220 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
4221" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
4222 return
4223 endtry
4224 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004225 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4226
4227 elseif starpat == 2
4228 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaar15146672011-10-20 22:22:38 +02004229" call Decho("..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)")
4230" call Decho("....pattern<".pattern.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004231 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004232 exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004233 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar5c736222010-01-06 20:54:52 +01004234 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004235 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004236 sil! let @* = keepregstar
4237 sil! let @+ = keepregstar
4238 sil! let @/ = keepregslash
Bram Moolenaar446cb832008-06-24 21:56:24 +00004239" call Dret("netrw#Explore : no files matched pattern")
4240 return
4241 endtry
4242 let s:netrw_curdir = b:netrw_curdir
4243 let w:netrw_explore_list = getqflist()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004244 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
Bram Moolenaar15146672011-10-20 22:22:38 +02004245 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004246
4247 elseif starpat == 3
4248 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaar15146672011-10-20 22:22:38 +02004249" call Decho("..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004250 let filepat= substitute(dirname,'^\*/','','')
4251 let filepat= substitute(filepat,'^[%#<]','\\&','')
Bram Moolenaar15146672011-10-20 22:22:38 +02004252" call Decho("....b:netrw_curdir<".b:netrw_curdir.">")
4253" call Decho("....filepat<".filepat.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004254 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
4255 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004256
4257 elseif starpat == 4
4258 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
Bram Moolenaar15146672011-10-20 22:22:38 +02004259" call Decho("..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004260 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004261 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
4262 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00004263
4264 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar15146672011-10-20 22:22:38 +02004265" call Decho("....w:netrw_explore_list<".string(w:netrw_explore_list).">")
4266" call Decho("....w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004267
4268 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004269 keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004270 sil! let @* = keepregstar
4271 sil! let @+ = keepregstar
4272 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004273" call Dret("netrw#Explore : no files matched")
4274 return
4275 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004276 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004277
4278 " NetrwStatusLine support - for exploring support
4279 let w:netrw_explore_indx= indx
Bram Moolenaar15146672011-10-20 22:22:38 +02004280" call Decho("....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004281
4282 " wrap the indx around, but issue a note
4283 if indx >= w:netrw_explore_listlen || indx < 0
Bram Moolenaar15146672011-10-20 22:22:38 +02004284" call Decho("....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004285 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
4286 let w:netrw_explore_indx= indx
Bram Moolenaaradc21822011-04-01 18:03:16 +02004287 keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004288 endif
4289
4290 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar15146672011-10-20 22:22:38 +02004291" call Decho("....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004292 let newdir= substitute(dirfile,'/[^/]*$','','e')
Bram Moolenaar15146672011-10-20 22:22:38 +02004293" call Decho("....newdir<".newdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004294
Bram Moolenaar15146672011-10-20 22:22:38 +02004295" call Decho("....calling LocalBrowseCheck(newdir<".newdir.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004296 call netrw#LocalBrowseCheck(newdir)
4297 if !exists("w:netrw_liststyle")
4298 let w:netrw_liststyle= g:netrw_liststyle
4299 endif
4300 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004301 keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004302 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004303 keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004304 endif
4305 let w:netrw_explore_mtchcnt = indx + 1
4306 let w:netrw_explore_bufnr = bufnr("%")
4307 let w:netrw_explore_line = line(".")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004308 keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar15146672011-10-20 22:22:38 +02004309" call Decho("....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004310
4311 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004312" call Decho("..your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004313 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004314 keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004315 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004316 sil! let @* = keepregstar
4317 sil! let @+ = keepregstar
4318 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004319" call Dret("netrw#Explore : missing +path_extra")
4320 return
4321 endif
4322
4323 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004324" call Decho("..default case: Explore newdir<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004325 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004326 sil! unlet w:netrw_treedict
4327 sil! unlet w:netrw_treetop
Bram Moolenaar9964e462007-05-05 17:54:07 +00004328 endif
4329 let newdir= dirname
4330 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004331 keepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaar9964e462007-05-05 17:54:07 +00004332 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004333 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00004334 endif
4335 endif
4336
Bram Moolenaar446cb832008-06-24 21:56:24 +00004337 " visual display of **/ **// */ Exploration files
Bram Moolenaar5c736222010-01-06 20:54:52 +01004338" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
4339" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004340 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004341" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004342 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
4343 " only update match list if current directory isn't the same as before
Bram Moolenaar5c736222010-01-06 20:54:52 +01004344" call Decho("only update match list if current directory not the same as before")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004345 let s:explore_prvdir = b:netrw_curdir
4346 let s:explore_match = ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004347 let dirlen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004348 if b:netrw_curdir !~ '/$'
4349 let dirlen= dirlen + 1
4350 endif
4351 let prvfname= ""
4352 for fname in w:netrw_explore_list
4353" call Decho("fname<".fname.">")
4354 if fname =~ '^'.b:netrw_curdir
4355 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004356 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004357 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004358 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004359 endif
4360 elseif fname !~ '^/' && fname != prvfname
4361 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004362 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004363 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004364 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004365 endif
4366 endif
4367 let prvfname= fname
4368 endfor
4369" call Decho("explore_match<".s:explore_match.">")
4370 exe "2match netrwMarkFile /".s:explore_match."/"
4371 endif
4372 echo "<s-up>==Pexplore <s-down>==Nexplore"
4373 else
4374 2match none
4375 if exists("s:explore_match") | unlet s:explore_match | endif
4376 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
4377 echo " "
4378" call Decho("cleared explore match list")
4379 endif
4380
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004381 sil! let @* = keepregstar
4382 sil! let @+ = keepregstar
4383 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004384" call Dret("netrw#Explore : @/<".@/.">")
4385endfun
4386
4387" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004388" s:NetrwExploreListUniq: {{{2
4389fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02004390" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004391
4392 " this assumes that the list is already sorted
4393 let newexplist= []
4394 for member in a:explist
4395 if !exists("uniqmember") || member != uniqmember
4396 let uniqmember = member
4397 let newexplist = newexplist + [ member ]
4398 endif
4399 endfor
4400
Bram Moolenaar15146672011-10-20 22:22:38 +02004401" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004402 return newexplist
4403endfun
4404
4405" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004406" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4407fun! s:NetrwForceChgDir(islocal,newdir)
4408" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
4409 if a:newdir !~ '/$'
4410 " ok, looks like force is needed to get directory-style treatment
4411 if a:newdir =~ '@$'
4412 let newdir= substitute(a:newdir,'@$','/','')
4413 elseif a:newdir =~ '[*=|\\]$'
4414 let newdir= substitute(a:newdir,'.$','/','')
4415 else
4416 let newdir= a:newdir.'/'
4417 endif
4418" call Decho("adjusting newdir<".newdir."> due to gd")
4419 else
4420 " should already be getting treatment as a directory
4421 let newdir= a:newdir
4422 endif
4423 call s:NetrwBrowseChgDir(a:islocal,newdir)
4424 call s:NetrwBrowse(a:islocal,newdir)
4425" call Dret("s:NetrwForceChgDir")
4426endfun
4427
4428" ---------------------------------------------------------------------
4429" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4430fun! s:NetrwForceFile(islocal,newfile)
4431" " call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newdir.">)")
4432 if a:newfile =~ '[/@*=|\\]$'
4433 let newfile= substitute(a:newfile,'.$','','')
4434 else
4435 let newfile= a:newfile
4436 endif
4437 call s:NetrwBrowseChgDir(a:islocal,newfile)
4438" call Dret("s:NetrwForceFile")
4439endfun
4440
4441" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004442" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4443" and switches the hiding mode. The actual hiding is done by
4444" s:NetrwListHide().
4445" g:netrw_hide= 0: show all
4446" 1: show not-hidden files
4447" 2: show hidden files only
4448fun! s:NetrwHide(islocal)
4449" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
4450 let svpos= netrw#NetrwSavePosn()
4451
4452 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4453" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4454" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4455
4456 " hide the files in the markfile list
4457 for fname in s:netrwmarkfilelist_{bufnr("%")}
4458" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
4459 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4460 " remove fname from hiding list
4461 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4462 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4463 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4464" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4465 else
4466 " append fname to hiding list
4467 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4468 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4469 else
4470 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4471 endif
4472" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4473 endif
4474 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004475 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004476 let g:netrw_hide= 1
4477
4478 else
4479
4480 " switch between show-all/show-not-hidden/show-hidden
4481 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004482 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004483 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004484 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004485" call Dret("NetrwHide")
4486 return
4487 endif
4488 endif
4489
Bram Moolenaaradc21822011-04-01 18:03:16 +02004490 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4491 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004492" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004493endfun
4494
4495" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004496" s:NetrwHidden: invoked by "gh" {{{2
4497fun! s:NetrwHidden(islocal)
4498" call Dfunc("s:NetrwHidden()")
4499 " save current position
4500 let svpos= netrw#NetrwSavePosn()
4501
4502 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4503 " remove pattern from hiding list
4504 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004505 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004506 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4507 else
4508 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4509 endif
4510
4511 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004512 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4513 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004514" call Dret("s:NetrwHidden")
4515endfun
4516
4517" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004518" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4519fun! s:NetrwHome()
4520 if exists("g:netrw_home")
4521 let home= g:netrw_home
4522 else
4523 " go to vim plugin home
4524 for home in split(&rtp,',') + ['']
4525 if isdirectory(home) && filewritable(home) | break | endif
4526 let basehome= substitute(home,'[/\\]\.vim$','','')
4527 if isdirectory(basehome) && filewritable(basehome)
4528 let home= basehome."/.vim"
4529 break
4530 endif
4531 endfor
4532 if home == ""
4533 " just pick the first directory
4534 let home= substitute(&rtp,',.*$','','')
4535 endif
4536 if (has("win32") || has("win95") || has("win64") || has("win16"))
4537 let home= substitute(home,'/','\\','g')
4538 endif
4539 endif
4540 " insure that the home directory exists
4541 if !isdirectory(home)
4542 if exists("g:netrw_mkdir")
4543 call system(g:netrw_mkdir." ".shellescape(home))
4544 else
4545 call mkdir(home)
4546 endif
4547 endif
4548 let g:netrw_home= home
4549 return home
4550endfun
4551
4552" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004553" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4554fun! s:NetrwLeftmouse(islocal)
4555" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004556
4557 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02004558 while getchar(0) != 0
4559 "clear the input stream
4560 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004561 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004562 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004563 let mouse_lnum = v:mouse_lnum
4564 let wlastline = line('w$')
4565 let lastline = line('$')
4566" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
4567" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
4568 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
4569 " appears to be a status bar leftmouse click
4570" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
4571 return
4572 endif
4573 if v:mouse_col != col('.')
4574" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
4575 return
4576 endif
4577
Bram Moolenaar446cb832008-06-24 21:56:24 +00004578 if a:islocal
4579 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004580 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004581 endif
4582 else
4583 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004584 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004585 endif
4586 endif
4587" call Dret("s:NetrwLeftmouse")
4588endfun
4589
4590" ---------------------------------------------------------------------
4591" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
4592" separated patterns given in g:netrw_list_hide
4593fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004594" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004595
4596 " find a character not in the "hide" string to use as a separator for :g and :v commands
4597 " How-it-works: take the hiding command, convert it into a range. Duplicate
4598 " characters don't matter. Remove all such characters from the '/~...90'
4599 " string. Use the first character left as a separator character.
4600 let listhide= g:netrw_list_hide
4601 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
4602" call Decho("sep=".sep)
4603
4604 while listhide != ""
4605 if listhide =~ ','
4606 let hide = substitute(listhide,',.*$','','e')
4607 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
4608 else
4609 let hide = listhide
4610 let listhide = ""
4611 endif
4612
4613 " Prune the list by hiding any files which match
4614 if g:netrw_hide == 1
4615" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004616 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004617 elseif g:netrw_hide == 2
4618" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004619 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004620 endif
4621 endwhile
4622 if g:netrw_hide == 2
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004623 exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
4624 exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004625 endif
4626
Bram Moolenaaradc21822011-04-01 18:03:16 +02004627 " remove any blank lines that have somehow remained.
4628 " This seems to happen under Windows.
4629 exe 'sil! keepj 1,$g@^\s*$@d'
4630
Bram Moolenaar446cb832008-06-24 21:56:24 +00004631" call Dret("NetrwListHide")
4632endfun
4633
4634" ---------------------------------------------------------------------
4635" NetrwHideEdit: allows user to edit the file/directory hiding list
4636fun! s:NetrwHideEdit(islocal)
4637" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
4638
4639 " save current cursor position
4640 let svpos= netrw#NetrwSavePosn()
4641
4642 " get new hiding list from user
4643 call inputsave()
4644 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
4645 call inputrestore()
4646 let g:netrw_list_hide= newhide
4647" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
4648
4649 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004650 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004651
4652 " restore cursor position
4653 call netrw#NetrwRestorePosn(svpos)
4654
4655" call Dret("NetrwHideEdit")
4656endfun
4657
4658" ---------------------------------------------------------------------
4659" NetSortSequence: allows user to edit the sorting sequence
4660fun! s:NetSortSequence(islocal)
4661" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
4662
4663 let svpos= netrw#NetrwSavePosn()
4664 call inputsave()
4665 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
4666 call inputrestore()
4667
4668 " refresh the listing
4669 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02004670 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4671 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004672
4673" call Dret("NetSortSequence")
4674endfun
4675
4676" ---------------------------------------------------------------------
4677" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4678fun! s:NetrwMakeDir(usrhost)
4679" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4680
4681 " get name of new directory from user. A bare <CR> will skip.
4682 " if its currently a directory, also request will be skipped, but with
4683 " a message.
4684 call inputsave()
4685 let newdirname= input("Please give directory name: ")
4686 call inputrestore()
4687" call Decho("newdirname<".newdirname.">")
4688
4689 if newdirname == ""
4690" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4691 return
4692 endif
4693
4694 if a:usrhost == ""
4695" call Decho("local mkdir")
4696
4697 " Local mkdir:
4698 " sanity checks
4699 let fullnewdir= b:netrw_curdir.'/'.newdirname
4700" call Decho("fullnewdir<".fullnewdir.">")
4701 if isdirectory(fullnewdir)
4702 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004703 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004704 endif
4705" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4706 return
4707 endif
4708 if s:FileReadable(fullnewdir)
4709 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004710 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004711 endif
4712" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4713 return
4714 endif
4715
4716 " requested new local directory is neither a pre-existing file or
4717 " directory, so make it!
4718 if exists("*mkdir")
4719 call mkdir(fullnewdir,"p")
4720 else
4721 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004722 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004723" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004724" call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
4725 exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004726 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004727 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004728" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
4729 endif
4730 endif
4731
4732 if v:shell_error == 0
4733 " refresh listing
4734" call Decho("refresh listing")
4735 let svpos= netrw#NetrwSavePosn()
4736 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4737 call netrw#NetrwRestorePosn(svpos)
4738 elseif !exists("g:netrw_quiet")
4739 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4740 endif
4741" redraw!
4742
4743 elseif !exists("b:netrw_method") || b:netrw_method == 4
4744 " Remote mkdir:
4745" call Decho("remote mkdir")
4746 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4747 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02004748" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004749 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004750 if v:shell_error == 0
4751 " refresh listing
4752 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004753 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4754 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004755 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004756 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004757 endif
4758" redraw!
4759
4760 elseif b:netrw_method == 2
Bram Moolenaar15146672011-10-20 22:22:38 +02004761 let svpos= netrw#NetrwSavePosn()
4762 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
4763 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4764 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004765 elseif b:netrw_method == 3
Bram Moolenaar15146672011-10-20 22:22:38 +02004766 let svpos= netrw#NetrwSavePosn()
4767 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
4768 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4769 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004770 endif
4771
4772" call Dret("NetrwMakeDir")
4773endfun
4774
4775" ---------------------------------------------------------------------
4776" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
4777" mark and unmark files. If a markfile list exists,
4778" then the rename and delete functions will use it instead
4779" of whatever may happen to be under the cursor at that
4780" moment. When the mouse and gui are available,
4781" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004782"
4783" Creates two lists
4784" s:netrwmarkfilelist -- holds complete paths to all marked files
4785" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
4786"
4787" Creates a marked file match string
4788" s:netrwmarfilemtch_# -- used with 2match to display marked files
4789"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004790" Creates a buffer version of islocal
4791" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004792fun! s:NetrwMarkFile(islocal,fname)
4793" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
4794 let curbufnr= bufnr("%")
4795 let curdir = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004796 let trailer = '[@=|\/\*]\=\>'
Bram Moolenaaradc21822011-04-01 18:03:16 +02004797
Bram Moolenaar446cb832008-06-24 21:56:24 +00004798 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004799 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00004800" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4801" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004802 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004803
4804 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004805 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004806" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4807 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004808 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004809
4810 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004811 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004812" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4813 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
4814 if s:netrwmarkfilelist_{curbufnr} == []
4815 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01004816" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004817 call s:NetrwUnmarkList(curbufnr,curdir)
4818 else
4819 " rebuild match list to display markings correctly
4820" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
4821 let s:netrwmarkfilemtch_{curbufnr}= ""
4822 let first = 1
4823 for fname in s:netrwmarkfilelist_{curbufnr}
4824 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01004825 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004826 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004827 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004828 endif
4829 let first= 0
4830 endfor
Bram Moolenaar15146672011-10-20 22:22:38 +02004831" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004832 endif
4833 endif
4834
4835 else
4836 " initialize new markfilelist
4837
4838" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
4839 let s:netrwmarkfilelist_{curbufnr}= []
4840 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
4841" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4842
4843 " build initial markfile matching pattern
4844 if a:fname =~ '/$'
4845 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
4846 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004847 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004848 endif
4849" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4850 endif
4851
4852 " handle global markfilelist
4853 if exists("s:netrwmarkfilelist")
4854 let dname= s:ComposePath(b:netrw_curdir,a:fname)
4855 if index(s:netrwmarkfilelist,dname) == -1
4856 " append new filename to global markfilelist
4857 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4858" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
4859 else
4860 " remove new filename from global markfilelist
4861" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
4862 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
4863" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
4864 if s:netrwmarkfilelist == []
4865 unlet s:netrwmarkfilelist
4866 endif
4867 endif
4868 else
4869 " initialize new global-directory markfilelist
4870 let s:netrwmarkfilelist= []
4871 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4872" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
4873 endif
4874
4875 " set up 2match'ing to netrwmarkfilemtch list
4876 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
4877" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004878 if exists("g:did_drchip_netrwlist_syntax")
4879 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
4880 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004881 else
4882" call Decho("2match none")
4883 2match none
4884 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004885" call Dret("s:NetrwMarkFile : s:netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004886endfun
4887
4888" ---------------------------------------------------------------------
4889" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
4890" compress/decompress files using the programs
4891" in g:netrw_compress and g:netrw_uncompress,
4892" using g:netrw_compress_suffix to know which to
4893" do. By default:
4894" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004895" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00004896fun! s:NetrwMarkFileCompress(islocal)
4897" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
4898 let svpos = netrw#NetrwSavePosn()
4899 let curdir = b:netrw_curdir
4900 let curbufnr = bufnr("%")
4901
4902 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
4903 for fname in s:netrwmarkfilelist_{curbufnr}
4904 " for every filename in the marked list
4905 for sfx in sort(keys(g:netrw_decompress))
4906 if fname =~ '\'.sfx.'$'
4907 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaar5c736222010-01-06 20:54:52 +01004908 let exe= netrw#WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00004909" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
4910 if a:islocal
4911 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004912 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004913 endif
4914 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004915 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004916 endif
4917 if executable(exe)
4918 if a:islocal
4919 call system(exe." ".fname)
4920 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004921 keepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004922 endif
4923 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004924 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004925 endif
4926 break
4927 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004928 unlet sfx
Bram Moolenaar446cb832008-06-24 21:56:24 +00004929 endfor
4930 if exists("exe")
4931 unlet exe
4932 elseif a:islocal
4933 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004934 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004935 else
4936 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02004937 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004938 endif
4939 endfor
4940 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004941 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4942 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004943 endif
4944" call Dret("s:NetrwMarkFileCompress")
4945endfun
4946
4947" ---------------------------------------------------------------------
4948" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
4949" If no marked files, then set up directory as the
4950" target. Currently does not support copying entire
4951" directories. Uses the local-buffer marked file list.
4952" Returns 1=success (used by NetrwMarkFileMove())
4953" 0=failure
4954fun! s:NetrwMarkFileCopy(islocal)
4955" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
4956
4957 " sanity checks
4958 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar251e1912011-06-19 05:09:16 +02004959 keepj call netrw#ErrorMsg(s:ERROR,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004960" call Dret("s:NetrwMarkFileCopy 0")
4961 return 0
4962 endif
4963" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4964 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02004965 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004966" call Dret("s:NetrwMarkFileCopy 0")
4967 return 0
4968 endif
4969" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4970 let curdir = b:netrw_curdir
4971 let curbufnr = bufnr("%")
4972
4973 if a:islocal && s:netrwmftgt_islocal
4974 " Copy marked files, local directory to local directory
4975" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004976 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004977" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004978 call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004979
4980 elseif a:islocal && !s:netrwmftgt_islocal
4981 " Copy marked files, local directory to remote directory
4982" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004983 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004984
4985 elseif !a:islocal && s:netrwmftgt_islocal
4986" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004987 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004988
4989 elseif !a:islocal && !s:netrwmftgt_islocal
4990" call Decho("copy from remote to remote")
4991 let curdir = getcwd()
4992 let tmpdir = s:GetTempfile("")
4993 if tmpdir !~ '/'
4994 let tmpdir= curdir."/".tmpdir
4995 endif
4996 if exists("*mkdir")
4997 call mkdir(tmpdir)
4998 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004999 exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005000 endif
5001 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005002 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005003 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005004 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02005005 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005006 if getcwd() == tmpdir
5007 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005008 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005009 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005010 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005011 exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005012 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005013 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005014 endif
5015 endif
5016 endif
5017
5018 " -------
5019 " cleanup
5020 " -------
5021" call Decho("cleanup")
5022
5023 " remove markings from local buffer
5024 call s:NetrwUnmarkList(curbufnr,curdir)
5025
5026 " refresh buffers
5027 if !s:netrwmftgt_islocal
5028 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
5029 endif
5030 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005031 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005032 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005033 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005034 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005035 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005036
5037" call Dret("s:NetrwMarkFileCopy 1")
5038 return 1
5039endfun
5040
5041" ---------------------------------------------------------------------
5042" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
5043" invoke vim's diff mode on the marked files.
5044" Either two or three files can be so handled.
5045" Uses the global marked file list.
5046fun! s:NetrwMarkFileDiff(islocal)
5047" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
5048 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005049
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005050 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005051 let cnt = 0
5052 let curdir = b:netrw_curdir
5053 for fname in s:netrwmarkfilelist
5054 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005055 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005056" call Decho("diffthis: fname<".fname.">")
5057 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005058 diffthis
5059 elseif cnt == 2 || cnt == 3
5060 vsplit
5061 wincmd l
5062" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005063 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005064 diffthis
5065 else
5066 break
5067 endif
5068 endfor
5069 call s:NetrwUnmarkList(curbufnr,curdir)
5070 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005071
Bram Moolenaar446cb832008-06-24 21:56:24 +00005072" call Dret("s:NetrwMarkFileDiff")
5073endfun
5074
5075" ---------------------------------------------------------------------
5076" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
5077" Uses global markfilelist
5078fun! s:NetrwMarkFileEdit(islocal)
5079" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
5080
5081 let curdir = b:netrw_curdir
5082 let curbufnr = bufnr("%")
5083 if exists("s:netrwmarkfilelist_{curbufnr}")
5084 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005085 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005086 " unmark markedfile list
5087" call s:NetrwUnmarkList(curbufnr,curdir)
5088 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005089" call Decho("exe sil args ".flist)
5090 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005091 endif
5092
5093" call Dret("s:NetrwMarkFileEdit")
5094endfun
5095
5096" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005097" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005098" Uses the local marked-file list.
5099fun! s:NetrwMarkFileExe(islocal)
5100" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
5101 let svpos = netrw#NetrwSavePosn()
5102 let curdir = b:netrw_curdir
5103 let curbufnr = bufnr("%")
5104
5105 if exists("s:netrwmarkfilelist_{curbufnr}")
5106 " get the command
5107 call inputsave()
5108 let cmd= input("Enter command: ","","file")
5109 call inputrestore()
5110" call Decho("cmd<".cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02005111 if cmd == ""
5112" " call Dret("s:NetrwMarkFileExe : early exit, empty command")
5113 return
5114 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005115
5116 " apply command to marked files. Substitute: filename -> %
5117 " If no %, then append a space and the filename to the command
5118 for fname in s:netrwmarkfilelist_{curbufnr}
5119 if a:islocal
5120 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01005121 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005122 endif
5123 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005124 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005125 endif
5126 if cmd =~ '%'
5127 let xcmd= substitute(cmd,'%',fname,'g')
5128 else
5129 let xcmd= cmd.' '.fname
5130 endif
5131 if a:islocal
5132" call Decho("local: xcmd<".xcmd.">")
5133 let ret= system(xcmd)
5134 else
5135" call Decho("remote: xcmd<".xcmd.">")
5136 let ret= s:RemoteSystem(xcmd)
5137 endif
5138 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02005139 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005140 break
5141 else
5142 echo ret
5143 endif
5144 endfor
5145
5146 " unmark marked file list
5147 call s:NetrwUnmarkList(curbufnr,curdir)
5148
5149 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005150 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5151 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005152 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005153 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005154 endif
5155
5156" call Dret("s:NetrwMarkFileExe")
5157endfun
5158
5159" ---------------------------------------------------------------------
5160" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5161" as the marked file(s) (toggles suffix presence)
5162" Uses the local marked file list.
5163fun! s:NetrwMarkHideSfx(islocal)
5164" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5165 let svpos = netrw#NetrwSavePosn()
5166 let curbufnr = bufnr("%")
5167
5168 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5169 if exists("s:netrwmarkfilelist_{curbufnr}")
5170
5171 for fname in s:netrwmarkfilelist_{curbufnr}
5172" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5173 " construct suffix pattern
5174 if fname =~ '\.'
5175 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5176 else
5177 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5178 endif
5179 " determine if its in the hiding list or not
5180 let inhidelist= 0
5181 if g:netrw_list_hide != ""
5182 let itemnum = 0
5183 let hidelist= split(g:netrw_list_hide,',')
5184 for hidepat in hidelist
5185 if sfxpat == hidepat
5186 let inhidelist= 1
5187 break
5188 endif
5189 let itemnum= itemnum + 1
5190 endfor
5191 endif
5192" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5193 if inhidelist
5194 " remove sfxpat from list
5195 call remove(hidelist,itemnum)
5196 let g:netrw_list_hide= join(hidelist,",")
5197 elseif g:netrw_list_hide != ""
5198 " append sfxpat to non-empty list
5199 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5200 else
5201 " set hiding list to sfxpat
5202 let g:netrw_list_hide= sfxpat
5203 endif
5204 endfor
5205
5206 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005207 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5208 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005209 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005210 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005211 endif
5212
5213" call Dret("s:NetrwMarkHideSfx")
5214endfun
5215
5216" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005217" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
5218" Uses the local marked-file list.
5219fun! s:NetrwMarkFileVimCmd(islocal)
5220" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
5221 let svpos = netrw#NetrwSavePosn()
5222 let curdir = b:netrw_curdir
5223 let curbufnr = bufnr("%")
5224
5225 if exists("s:netrwmarkfilelist_{curbufnr}")
5226 " get the command
5227 call inputsave()
5228 let cmd= input("Enter vim command: ","","file")
5229 call inputrestore()
5230" call Decho("cmd<".cmd.">")
5231 if cmd == ""
5232" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
5233 return
5234 endif
5235
5236 " apply command to marked files. Substitute: filename -> %
5237 " If no %, then append a space and the filename to the command
5238 for fname in s:netrwmarkfilelist_{curbufnr}
5239" call Decho("fname<".fname.">")
5240 if a:islocal
5241 1split
5242 exe "sil! keepalt e ".fnameescape(fname)
5243" call Decho("local<".fname.">: exe ".cmd)
5244 exe cmd
5245 exe "sil! keepalt wq!"
5246 else
5247 " COMBAK -- not supported yet
5248" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
5249 echo "sorry, \"mX\" not supported yet for remote files"
5250 endif
5251 endfor
5252
5253 " unmark marked file list
5254 call s:NetrwUnmarkList(curbufnr,curdir)
5255
5256 " refresh the listing
5257 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5258 keepj call netrw#NetrwRestorePosn(svpos)
5259 else
5260 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5261 endif
5262
5263" call Dret("s:NetrwMarkFileVimCmd")
5264endfun
5265
5266" ---------------------------------------------------------------------
5267" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5268" as the marked file(s) (toggles suffix presence)
5269" Uses the local marked file list.
5270fun! s:NetrwMarkHideSfx(islocal)
5271" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5272 let svpos = netrw#NetrwSavePosn()
5273 let curbufnr = bufnr("%")
5274
5275 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5276 if exists("s:netrwmarkfilelist_{curbufnr}")
5277
5278 for fname in s:netrwmarkfilelist_{curbufnr}
5279" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5280 " construct suffix pattern
5281 if fname =~ '\.'
5282 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5283 else
5284 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5285 endif
5286 " determine if its in the hiding list or not
5287 let inhidelist= 0
5288 if g:netrw_list_hide != ""
5289 let itemnum = 0
5290 let hidelist= split(g:netrw_list_hide,',')
5291 for hidepat in hidelist
5292 if sfxpat == hidepat
5293 let inhidelist= 1
5294 break
5295 endif
5296 let itemnum= itemnum + 1
5297 endfor
5298 endif
5299" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5300 if inhidelist
5301 " remove sfxpat from list
5302 call remove(hidelist,itemnum)
5303 let g:netrw_list_hide= join(hidelist,",")
5304 elseif g:netrw_list_hide != ""
5305 " append sfxpat to non-empty list
5306 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5307 else
5308 " set hiding list to sfxpat
5309 let g:netrw_list_hide= sfxpat
5310 endif
5311 endfor
5312
5313 " refresh the listing
5314 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5315 keepj call netrw#NetrwRestorePosn(svpos)
5316 else
5317 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5318 endif
5319
5320" call Dret("s:NetrwMarkHideSfx")
5321endfun
5322
5323" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005324" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
5325" Uses the global markfilelist
5326fun! s:NetrwMarkFileGrep(islocal)
5327" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
5328 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005329 let curbufnr = bufnr("%")
5330
5331 if exists("s:netrwmarkfilelist")
5332" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005333 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005334 call s:NetrwUnmarkAll()
5335
5336 " ask user for pattern
5337 call inputsave()
5338 let pat= input("Enter pattern: ","")
5339 call inputrestore()
5340 if pat !~ '^\s'
5341 if pat !~ '^/'
5342 let pat= '/'.pat.'/'
5343 endif
5344 let pat= " ".pat
5345 endif
5346
5347 " use vimgrep for both local and remote
5348" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005349 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005350 exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist
Bram Moolenaar5c736222010-01-06 20:54:52 +01005351 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaaradc21822011-04-01 18:03:16 +02005352 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005353" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">")
5354 return
5355 endtry
Bram Moolenaar446cb832008-06-24 21:56:24 +00005356
5357 2match none
Bram Moolenaaradc21822011-04-01 18:03:16 +02005358 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005359 endif
5360
5361" call Dret("s:NetrwMarkFileGrep")
5362endfun
5363
5364" ---------------------------------------------------------------------
5365" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
5366" uses the global marked file list
5367" s:netrwmfloc= 0: target directory is remote
5368" = 1: target directory is local
5369fun! s:NetrwMarkFileMove(islocal)
5370" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
5371 let curdir = b:netrw_curdir
5372 let curbufnr = bufnr("%")
5373
5374 " sanity check
5375 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaaradc21822011-04-01 18:03:16 +02005376 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005377" call Dret("s:NetrwMarkFileMove")
5378 return
5379 endif
5380" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
5381 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005382 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005383" call Dret("s:NetrwMarkFileCopy 0")
5384 return 0
5385 endif
5386" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
5387
5388 if a:islocal && s:netrwmftgt_islocal
5389 " move: local -> local
5390" call Decho("move from local to local")
5391" call Decho("(s:NetrwMarkFileMove) local to local move")
5392 if executable(g:netrw_localmovecmd)
5393 for fname in s:netrwmarkfilelist_{bufnr("%")}
5394" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
5395 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
5396 if v:shell_error < 0
5397 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
5398 break
5399 endif
5400 endfor
5401 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005402 keepj call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005403 endif
5404
5405 elseif a:islocal && !s:netrwmftgt_islocal
5406 " move: local -> remote
5407" call Decho("move from local to remote")
5408" call Decho("copy")
5409 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005410 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005411" call Decho("remove")
5412 for fname in mflist
5413 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5414 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
5415 endfor
5416 unlet mflist
5417
5418 elseif !a:islocal && s:netrwmftgt_islocal
5419 " move: remote -> local
5420" call Decho("move from remote to local")
5421" call Decho("copy")
5422 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005423 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005424" call Decho("remove")
5425 for fname in mflist
5426 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5427 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5428 endfor
5429 unlet mflist
5430
5431 elseif !a:islocal && !s:netrwmftgt_islocal
5432 " move: remote -> remote
5433" call Decho("move from remote to remote")
5434" call Decho("copy")
5435 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005436 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005437" call Decho("remove")
5438 for fname in mflist
5439 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5440 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5441 endfor
5442 unlet mflist
5443 endif
5444
5445 " -------
5446 " cleanup
5447 " -------
5448" call Decho("cleanup")
5449
5450 " remove markings from local buffer
5451 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
5452
5453 " refresh buffers
5454 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005455" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
5456 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005457 endif
5458 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005459" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
5460 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005461 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005462 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005463" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
5464 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005465 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005466
5467" call Dret("s:NetrwMarkFileMove")
5468endfun
5469
5470" ---------------------------------------------------------------------
5471" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
5472" using the hardcopy command. Local marked-file list only.
5473fun! s:NetrwMarkFilePrint(islocal)
5474" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
5475 let curbufnr= bufnr("%")
5476 if exists("s:netrwmarkfilelist_{curbufnr}")
5477 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
5478 let curdir = b:netrw_curdir
5479 call s:NetrwUnmarkList(curbufnr,curdir)
5480 for fname in netrwmarkfilelist
5481 if a:islocal
5482 if g:netrw_keepdir
5483 let fname= s:ComposePath(curdir,fname)
5484 endif
5485 else
5486 let fname= curdir.fname
5487 endif
5488 1split
5489 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02005490" call Decho("exe sil e ".escape(fname,' '))
5491 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005492" call Decho("hardcopy")
5493 hardcopy
5494 q
5495 endfor
5496 2match none
5497 endif
5498" call Dret("s:NetrwMarkFilePrint")
5499endfun
5500
5501" ---------------------------------------------------------------------
5502" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
5503" files when given a regexp (for which a prompt is
5504" issued).
5505fun! s:NetrwMarkFileRegexp(islocal)
5506" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
5507
5508 " get the regular expression
5509 call inputsave()
5510 let regexp= input("Enter regexp: ","","file")
5511 call inputrestore()
5512
5513 if a:islocal
5514 " get the matching list of files using local glob()
5515" call Decho("handle local regexp")
5516 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005517 let files = glob(s:ComposePath(dirname,regexp))
5518" call Decho("files<".files.">")
5519 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005520
5521 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01005522 for fname in filelist
5523" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005524 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005525 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00005526
5527 else
5528" call Decho("handle remote regexp")
5529
5530 " convert displayed listing into a filelist
5531 let eikeep = &ei
5532 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005533 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00005534 set ei=all ma
5535" call Decho("set ei=all ma")
5536 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02005537 keepj call s:NetrwEnew()
5538 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005539 sil keepj norm! "ap
5540 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005541 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005542 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005543 set bt=nofile
5544 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005545 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01005546 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005547 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005548 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01005549 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005550 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005551 sil keepj %s/^| //e
5552 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005553 call histdel("/",-1)
5554 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005555 endif
5556 " convert regexp into the more usual glob-style format
5557 let regexp= substitute(regexp,'\*','.*','g')
5558" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005559 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01005560 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005561 let filelist= getline(1,line("$"))
5562 q!
5563 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02005564 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005565 endfor
5566 unlet filelist
5567 let @a = areg
5568 let &ei = eikeep
5569 endif
5570
5571" call Dret("s:NetrwMarkFileRegexp")
5572endfun
5573
5574" ---------------------------------------------------------------------
5575" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
5576" Uses the local marked file list.
5577fun! s:NetrwMarkFileSource(islocal)
5578" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
5579 let curbufnr= bufnr("%")
5580 if exists("s:netrwmarkfilelist_{curbufnr}")
5581 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
5582 let curdir = b:netrw_curdir
5583 call s:NetrwUnmarkList(curbufnr,curdir)
5584 for fname in netrwmarkfilelist
5585 if a:islocal
5586 if g:netrw_keepdir
5587 let fname= s:ComposePath(curdir,fname)
5588 endif
5589 else
5590 let fname= curdir.fname
5591 endif
5592 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00005593" call Decho("exe so ".fnameescape(fname))
5594 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005595 endfor
5596 2match none
5597 endif
5598" call Dret("s:NetrwMarkFileSource")
5599endfun
5600
5601" ---------------------------------------------------------------------
5602" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
5603" Uses the global markfilelist
5604fun! s:NetrwMarkFileTag(islocal)
5605" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
5606 let svpos = netrw#NetrwSavePosn()
5607 let curdir = b:netrw_curdir
5608 let curbufnr = bufnr("%")
5609
5610 if exists("s:netrwmarkfilelist")
5611" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005612 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005613 call s:NetrwUnmarkAll()
5614
5615 if a:islocal
5616 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005617" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
5618 call system(g:netrw_ctags." ".netrwmarkfilelist)
5619 else
5620 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
5621 endif
5622 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005623 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005624 call netrw#NetrwObtain(a:islocal,"tags")
5625 let curdir= b:netrw_curdir
5626 1split
5627 e tags
5628 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
5629" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005630 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005631 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005632 wq!
5633 endif
5634 2match none
5635 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5636 call netrw#NetrwRestorePosn(svpos)
5637 endif
5638
5639" call Dret("s:NetrwMarkFileTag")
5640endfun
5641
5642" ---------------------------------------------------------------------
5643" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
5644" Sets up two variables,
5645" s:netrwmftgt : holds the target directory
5646" s:netrwmftgt_islocal : 0=target directory is remote
5647" 1=target directory is local
5648fun! s:NetrwMarkFileTgt(islocal)
5649" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
5650 let svpos = netrw#NetrwSavePosn()
5651 let curdir = b:netrw_curdir
5652 let hadtgt = exists("s:netrwmftgt")
5653 if !exists("w:netrw_bannercnt")
5654 let w:netrw_bannercnt= b:netrw_bannercnt
5655 endif
5656
5657 " set up target
5658 if line(".") < w:netrw_bannercnt
5659 " if cursor in banner region, use b:netrw_curdir for the target
5660 let s:netrwmftgt= b:netrw_curdir
5661" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
5662
5663 else
5664 " get word under cursor.
5665 " * If directory, use it for the target.
5666 " * If file, use b:netrw_curdir for the target
5667 let curword= s:NetrwGetWord()
5668 let tgtdir = s:ComposePath(curdir,curword)
5669 if a:islocal && isdirectory(tgtdir)
5670 let s:netrwmftgt = tgtdir
5671" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
5672 elseif !a:islocal && tgtdir =~ '/$'
5673 let s:netrwmftgt = tgtdir
5674" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
5675 else
5676 let s:netrwmftgt = curdir
5677" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
5678 endif
5679 endif
5680 if a:islocal
5681 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
5682 let s:netrwmftgt= simplify(s:netrwmftgt)
5683" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
5684 endif
5685 if g:netrw_cygwin
5686 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
5687 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
5688 endif
5689 let s:netrwmftgt_islocal= a:islocal
5690
Bram Moolenaar5c736222010-01-06 20:54:52 +01005691 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005692 call s:LocalBrowseShellCmdRefresh()
5693 endif
5694 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5695 call netrw#NetrwRestorePosn(svpos)
5696 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005697 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00005698 endif
5699
5700" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
5701endfun
5702
5703" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00005704" s:NetrwOpenFile: query user for a filename and open it {{{2
5705fun! s:NetrwOpenFile(islocal)
5706" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
5707 call inputsave()
5708 let fname= input("Enter filename: ")
5709 call inputrestore()
5710 if fname !~ '[/\\]'
5711 if exists("b:netrw_curdir")
5712 if exists("g:netrw_quiet")
5713 let netrw_quiet_keep = g:netrw_quiet
5714 endif
5715 let g:netrw_quiet = 1
5716 if b:netrw_curdir =~ '/$'
5717 exe "e ".fnameescape(b:netrw_curdir.fname)
5718 else
5719 exe "e ".fnameescape(b:netrw_curdir."/".fname)
5720 endif
5721 if exists("netrw_quiet_keep")
5722 let g:netrw_quiet= netrw_quiet_keep
5723 else
5724 unlet g:netrw_quiet
5725 endif
5726 endif
5727 else
5728 exe "e ".fnameescape(fname)
5729 endif
5730" call Dret("s:NetrwOpenFile")
5731endfun
5732
5733" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005734" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
5735fun! s:NetrwUnmarkList(curbufnr,curdir)
5736" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
5737
5738 " remove all files in local marked-file list from global list
5739 if exists("s:netrwmarkfilelist_{a:curbufnr}")
5740 for mfile in s:netrwmarkfilelist_{a:curbufnr}
5741 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
5742 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
5743 call remove(s:netrwmarkfilelist,idx) " remove from global list
5744 endfor
5745 if s:netrwmarkfilelist == []
5746 unlet s:netrwmarkfilelist
5747 endif
5748
5749 " getting rid of the local marked-file lists is easy
5750 unlet s:netrwmarkfilelist_{a:curbufnr}
5751 endif
5752 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
5753 unlet s:netrwmarkfilemtch_{a:curbufnr}
5754 endif
5755 2match none
5756" call Dret("s:NetrwUnmarkList")
5757endfun
5758
5759" ---------------------------------------------------------------------
5760" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
5761fun! s:NetrwUnmarkAll()
5762" call Dfunc("s:NetrwUnmarkAll()")
5763 if exists("s:netrwmarkfilelist")
5764 unlet s:netrwmarkfilelist
5765 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005766 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005767 2match none
5768" call Dret("s:NetrwUnmarkAll")
5769endfun
5770
5771" ---------------------------------------------------------------------
5772" s:NetrwUnmarkAll2: {{{2
5773fun! s:NetrwUnmarkAll2()
5774" call Dfunc("s:NetrwUnmarkAll2()")
5775 redir => netrwmarkfilelist_let
5776 let
5777 redir END
5778 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
5779 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
5780 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
5781 for flist in netrwmarkfilelist_list
5782 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
5783 unlet s:netrwmarkfilelist_{curbufnr}
5784 unlet s:netrwmarkfilemtch_{curbufnr}
5785 endfor
5786" call Dret("s:NetrwUnmarkAll2")
5787endfun
5788
5789" ---------------------------------------------------------------------
5790" s:NetrwUnMarkFile: {{{2
5791fun! s:NetrwUnMarkFile(islocal)
5792" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
5793 let svpos = netrw#NetrwSavePosn()
5794 let curbufnr = bufnr("%")
5795
5796 " unmark marked file list (although I expect s:NetrwUpload()
5797 " to do it, I'm just making sure)
5798 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5799" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
5800 unlet s:netrwmarkfilelist
5801 unlet s:netrwmarkfilelist_{curbufnr}
5802 unlet s:netrwmarkfilemtch_{curbufnr}
5803 2match none
5804 endif
5805
5806" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5807 call netrw#NetrwRestorePosn(svpos)
5808" call Dret("s:NetrwUnMarkFile")
5809endfun
5810
5811" ---------------------------------------------------------------------
5812" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5813fun! s:NetrwMenu(domenu)
5814
5815 if !exists("g:NetrwMenuPriority")
5816 let g:NetrwMenuPriority= 80
5817 endif
5818
Bram Moolenaaradc21822011-04-01 18:03:16 +02005819 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00005820" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5821
5822 if !exists("s:netrw_menu_enabled") && a:domenu
5823" call Decho("initialize menu")
5824 let s:netrw_menu_enabled= 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005825 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5826 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5827 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5828 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5829 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5830 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
5831 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
5832 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
5833 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
5834 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5835 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
5836 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
5837 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5838 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005839 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005840 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5841 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5842 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5843 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5844 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5845 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
5846 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
5847 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
5848 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
5849 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
5850 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
5851 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
5852 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5853 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5854 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5855 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5856 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5857 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5858 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5859 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5860 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5861 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5862 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5863 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5864 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5865 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5866 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5867 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5868 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5869 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5870 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5871 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5872 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5873 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5874 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005875 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
Bram Moolenaar446cb832008-06-24 21:56:24 +00005876 let s:netrw_menucnt= 28
5877
5878 elseif !a:domenu
5879 let s:netrwcnt = 0
5880 let curwin = winnr()
5881 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5882 exe curwin."wincmd w"
5883
5884 if s:netrwcnt <= 1
5885" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005886 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02005887" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005888 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00005889 endif
5890 endif
5891" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005892 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005893 endif
5894
5895endfun
5896
5897" ---------------------------------------------------------------------
5898" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
5899" Used by the O maps (as <SID>NetrwObtain())
5900fun! s:NetrwObtain(islocal)
5901" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
5902
5903 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005904 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
5905 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00005906 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
5907 else
5908 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
5909 endif
5910
5911" call Dret("NetrwObtain")
5912endfun
5913
5914" ---------------------------------------------------------------------
5915" netrw#NetrwObtain: {{{2
5916" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
5917" islocal=0 obtain from remote source
5918" =1 obtain from local source
5919" fname : a filename or a list of filenames
5920" tgtdir : optional place where files are to go (not present, uses getcwd())
5921fun! netrw#NetrwObtain(islocal,fname,...)
5922" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
5923 " NetrwStatusLine support - for obtaining support
5924
5925 if type(a:fname) == 1
5926 let fnamelist= [ a:fname ]
5927 elseif type(a:fname) == 3
5928 let fnamelist= a:fname
5929 else
5930 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
5931" call Dret("netrw#NetrwObtain")
5932 return
5933 endif
5934" call Decho("fnamelist<".string(fnamelist).">")
5935 if a:0 > 0
5936 let tgtdir= a:1
5937 else
5938 let tgtdir= getcwd()
5939 endif
5940" call Decho("tgtdir<".tgtdir.">")
5941
Bram Moolenaar5c736222010-01-06 20:54:52 +01005942 if exists("b:netrw_islocal") && b:netrw_islocal
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005943 " obtain a file from local b:netrw_curdir to (local) tgtdir
5944" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005945 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
5946 let topath= s:ComposePath(tgtdir,"")
5947 if (has("win32") || has("win95") || has("win64") || has("win16"))
5948 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005949" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005950 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00005951" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
5952 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005953 endfor
5954 else
5955 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005956" call Decho("transfer files with one command")
5957 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005958" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
5959 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
5960 endif
5961 elseif !exists("b:netrw_curdir")
5962 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
5963 else
5964 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
5965 endif
5966
5967 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005968 " obtain files from remote b:netrw_curdir to local tgtdir
5969" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005970 if type(a:fname) == 1
5971 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
5972 endif
5973 call s:NetrwMethod(b:netrw_curdir)
5974
5975 if b:netrw_method == 4
5976 " obtain file using scp
5977" call Decho("obtain via scp (method#4)")
5978 if exists("g:netrw_port") && g:netrw_port != ""
5979 let useport= " ".g:netrw_scpport." ".g:netrw_port
5980 else
5981 let useport= ""
5982 endif
5983 if b:netrw_fname =~ '/'
5984 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
5985 else
5986 let path= ""
5987 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005988 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005989" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
5990 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005991
5992 elseif b:netrw_method == 2
5993 " obtain file using ftp + .netrc
5994" call Decho("obtain via ftp+.netrc (method #2)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005995 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005996 let tmpbufnr= bufnr("%")
5997 setlocal ff=unix
5998 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005999 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006000" call Decho("filter input: ".getline('$'))
6001 endif
6002
6003 if exists("b:netrw_fname") && b:netrw_fname != ""
6004 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
6005" call Decho("filter input: ".getline('$'))
6006 endif
6007
6008 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006009 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006010" call Decho("filter input: ".getline('$'))
6011 endif
6012 for fname in fnamelist
6013 call setline(line("$")+1,'get "'.fname.'"')
6014" call Decho("filter input: ".getline('$'))
6015 endfor
6016 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006017" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6018 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006019 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006020" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6021 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006022 endif
6023 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
6024 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6025 let debugkeep= &debug
6026 setlocal debug=msg
6027 call netrw#ErrorMsg(s:ERROR,getline(1),4)
6028 let &debug= debugkeep
6029 endif
6030
6031 elseif b:netrw_method == 3
6032 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
6033" call Decho("obtain via ftp+mipf (method #3)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006034 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006035 let tmpbufnr= bufnr("%")
6036 setlocal ff=unix
6037
6038 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006039 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006040" call Decho("filter input: ".getline('$'))
6041 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006042 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006043" call Decho("filter input: ".getline('$'))
6044 endif
6045
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006046 if exists("g:netrw_uid") && g:netrw_uid != ""
6047 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6048 keepj put =g:netrw_uid
6049" call Decho("filter input: ".getline('$'))
6050 if exists("s:netrw_passwd") && s:netrw_passwd != ""
6051 keepj put ='\"'.s:netrw_passwd.'\"'
6052 endif
6053" call Decho("filter input: ".getline('$'))
6054 elseif exists("s:netrw_passwd")
6055 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6056" call Decho("filter input: ".getline('$'))
6057 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006058 endif
6059
6060 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006061 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006062" call Decho("filter input: ".getline('$'))
6063 endif
6064
6065 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006066 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006067" call Decho("filter input: ".getline('$'))
6068 endif
6069
6070 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006071 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006072" call Decho("filter input: ".getline('$'))
6073 endif
6074
6075 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006076 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006077" call Decho("filter input: ".getline('$'))
6078 endif
6079 for fname in fnamelist
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006080 keepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006081 endfor
6082" call Decho("filter input: ".getline('$'))
6083
6084 " perform ftp:
6085 " -i : turns off interactive prompting from ftp
6086 " -n unix : DON'T use <.netrc>, even though it exists
6087 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006088 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006089" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6090 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006091 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
6092 if getline(1) !~ "^$"
6093" call Decho("error<".getline(1).">")
6094 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006095 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006096 endif
6097 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006098 elseif !exists("b:netrw_method") || b:netrw_method < 0
6099" call Dfunc("netrw#NetrwObtain : unsupported method")
6100 return
6101 endif
6102
6103 " restore status line
6104 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006105 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006106 endif
6107
6108 endif
6109
6110 " cleanup
6111 if exists("tmpbufnr")
6112 if bufnr("%") != tmpbufnr
6113 exe tmpbufnr."bw!"
6114 else
6115 q!
6116 endif
6117 endif
6118
6119" call Dret("netrw#NetrwObtain")
6120endfun
6121
6122" ---------------------------------------------------------------------
6123" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
6124" If there's only one window, then the window will first be split.
6125" Returns:
6126" choice = 0 : didn't have to choose
6127" choice = 1 : saved modified file in window first
6128" choice = 2 : didn't save modified file, opened window
6129" choice = 3 : cancel open
6130fun! s:NetrwPrevWinOpen(islocal)
6131" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
6132
6133 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
6134 let curdir = b:netrw_curdir
6135
6136 " get last window number and the word currently under the cursor
6137 let lastwinnr = winnr("$")
6138 let curword = s:NetrwGetWord()
6139 let choice = 0
6140" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
6141
6142 let didsplit = 0
6143 if lastwinnr == 1
6144 " if only one window, open a new one first
6145" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
6146 if g:netrw_preview
Bram Moolenaar15146672011-10-20 22:22:38 +02006147 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6148" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
6149 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006150 else
Bram Moolenaar15146672011-10-20 22:22:38 +02006151 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6152" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
6153 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006154 endif
6155 let didsplit = 1
6156
6157 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006158 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006159" call Decho("wincmd p")
6160 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02006161 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006162 " if the previous window's buffer has been changed (is modified),
6163 " and it doesn't appear in any other extant window, then ask the
6164 " user if s/he wants to abandon modifications therein.
6165 let bnr = winbufnr(0)
6166 let bnrcnt = 0
6167 if &mod
6168" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
6169 let eikeep= &ei
6170 set ei=all
6171 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
6172 exe bnr."wincmd p"
6173 let &ei= eikeep
6174" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
6175 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006176 let bufname = bufname(winbufnr(winnr()))
6177 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006178" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
6179
6180 if choice == 1
6181 " Yes -- write file & then browse
6182 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006183 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00006184 if v:errmsg != ""
6185 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
6186 if didsplit
6187 q
6188 else
6189 wincmd p
6190 endif
6191" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
6192 return choice
6193 endif
6194
6195 elseif choice == 2
6196 " No -- don't worry about changed file, just browse anyway
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006197" call Decho("(NetrwPrevWinOpen) setl nomod")
6198 setl nomod
6199" call Decho("(NetrwPrevWinOpen) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006200 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006201 wincmd p
6202
6203 else
6204 " Cancel -- don't do this
6205 if didsplit
6206 q
6207 else
6208 wincmd p
6209 endif
6210" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
6211 return choice
6212 endif
6213 endif
6214 endif
6215 endif
6216
6217 " restore b:netrw_curdir (window split/enew may have lost it)
6218 let b:netrw_curdir= curdir
6219 if a:islocal < 2
6220 if a:islocal
6221 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
6222 else
6223 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
6224 endif
6225 endif
6226" call Dret("NetrwPrevWinOpen ".choice)
6227 return choice
6228endfun
6229
6230" ---------------------------------------------------------------------
6231" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
6232" Always assumed to be local -> remote
6233" call s:NetrwUpload(filename, target)
6234" call s:NetrwUpload(filename, target, fromdirectory)
6235fun! s:NetrwUpload(fname,tgt,...)
6236" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6237
6238 if a:tgt =~ '^\a\+://'
6239 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
6240 else
6241 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
6242 endif
6243" call Decho("tgtdir<".tgtdir.">")
6244
6245 if a:0 > 0
6246 let fromdir= a:1
6247 else
6248 let fromdir= getcwd()
6249 endif
6250" call Decho("fromdir<".fromdir.">")
6251
6252 if type(a:fname) == 1
6253 " handle uploading a single file using NetWrite
6254" call Decho("handle uploading a single file via NetWrite")
6255 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006256" call Decho("exe e ".fnameescape(a:fname))
6257 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006258" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
6259 if a:tgt =~ '/$'
6260 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006261" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006262 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006263 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006264" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
6265 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006266" call Decho("done writing local->remote")
6267 endif
6268 q!
6269
6270 elseif type(a:fname) == 3
6271 " handle uploading a list of files via scp
6272" call Decho("handle uploading a list of files via scp")
6273 let curdir= getcwd()
6274 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006275 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006276 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
6277 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006278 if exists("g:netrw_port") && g:netrw_port != ""
6279 let useport= " ".g:netrw_scpport." ".g:netrw_port
6280 else
6281 let useport= ""
6282 endif
6283 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
6284 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006285" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
6286 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006287 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006288
6289 elseif a:tgt =~ '^ftp:'
6290 call s:NetrwMethod(a:tgt)
6291
6292 if b:netrw_method == 2
6293 " handle uploading a list of files via ftp+.netrc
6294 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006295 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00006296" call Decho("filter input window#".winnr())
6297
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006298 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006299" call Decho("filter input: ".getline('$'))
6300
6301 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006302 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006303" call Decho("filter input: ".getline('$'))
6304 endif
6305
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006306 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006307" call Decho("filter input: ".getline('$'))
6308
Bram Moolenaaradc21822011-04-01 18:03:16 +02006309 if tgtdir == ""
6310 let tgtdir= '/'
6311 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006312 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006313" call Decho("filter input: ".getline('$'))
6314
6315 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006316 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006317" call Decho("filter input: ".getline('$'))
6318 endfor
6319
6320 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006321" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6322 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006323 else
6324" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02006325" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6326 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006327 endif
6328 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006329 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006330 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006331 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6332 call netrw#ErrorMsg(s:ERROR,getline(1),14)
6333 else
6334 bw!|q
6335 endif
6336
6337 elseif b:netrw_method == 3
6338 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
6339 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02006340 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006341 let tmpbufnr= bufnr("%")
6342 setlocal ff=unix
6343
6344 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006345 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006346" call Decho("filter input: ".getline('$'))
6347 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006348 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006349" call Decho("filter input: ".getline('$'))
6350 endif
6351
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006352 if exists("g:netrw_uid") && g:netrw_uid != ""
6353 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6354 keepj put =g:netrw_uid
6355" call Decho("filter input: ".getline('$'))
6356 if exists("s:netrw_passwd")
6357 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
6358 endif
6359" call Decho("filter input: ".getline('$'))
6360 elseif exists("s:netrw_passwd")
6361 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6362" call Decho("filter input: ".getline('$'))
6363 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006364 endif
6365
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006366 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006367" call Decho("filter input: ".getline('$'))
6368
6369 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006370 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006371" call Decho("filter input: ".getline('$'))
6372 endif
6373
6374 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006375 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006376" call Decho("filter input: ".getline('$'))
6377 endif
6378
6379 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006380 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006381" call Decho("filter input: ".getline('$'))
6382 endfor
6383
6384 " perform ftp:
6385 " -i : turns off interactive prompting from ftp
6386 " -n unix : DON'T use <.netrc>, even though it exists
6387 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006388 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006389" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6390 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006391 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006392 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006393 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006394 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6395 let debugkeep= &debug
6396 setlocal debug=msg
6397 call netrw#ErrorMsg(s:ERROR,getline(1),15)
6398 let &debug = debugkeep
6399 let mod = 1
6400 else
6401 bw!|q
6402 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006403 elseif !exists("b:netrw_method") || b:netrw_method < 0
6404" call Dfunc("netrw#NetrwUpload : unsupported method")
6405 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006406 endif
6407 else
6408 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
6409 endif
6410 endif
6411
6412" call Dret("s:NetrwUpload")
6413endfun
6414
6415" ---------------------------------------------------------------------
6416" s:NetrwPreview: {{{2
6417fun! s:NetrwPreview(path) range
6418" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006419 keepj call s:NetrwOptionSave("s:")
6420 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006421 if has("quickfix")
6422 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006423 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02006424 let pvhkeep = &pvh
6425 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6426 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006427 endif
6428 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
6429 if exists("pvhkeep")
6430 let &pvh= pvhkeep
6431 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006432 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006433 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006434 endif
6435 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006436 keepj call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006437 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006438 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006439" call Dret("NetrwPreview")
6440endfun
6441
6442" ---------------------------------------------------------------------
6443" s:NetrwRefresh: {{{2
6444fun! s:NetrwRefresh(islocal,dirname)
6445" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
6446 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
6447 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
6448 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
6449 setlocal ma noro
6450" call Decho("setlocal ma noro")
6451" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006452 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006453 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006454 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006455 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006456 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006457 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006458 keepj call netrw#NetrwRestorePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006459
6460 " restore file marks
6461 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
6462" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
6463 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
6464 else
6465" call Decho("2match none")
6466 2match none
6467 endif
6468
6469" redraw!
6470" call Dret("NetrwRefresh")
6471endfun
6472
6473" ---------------------------------------------------------------------
6474" s:NetrwRefreshDir: refreshes a directory by name {{{2
6475" Called by NetrwMarkFileCopy()
6476" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
6477fun! s:NetrwRefreshDir(islocal,dirname)
6478" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
6479 if g:netrw_fastbrowse == 0
6480 " slowest mode (keep buffers refreshed, local or remote)
6481" call Decho("slowest mode: keep buffers refreshed, local or remote")
6482 let tgtwin= bufwinnr(a:dirname)
6483" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
6484
6485 if tgtwin > 0
6486 " tgtwin is being displayed, so refresh it
6487 let curwin= winnr()
6488" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
6489 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006490 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006491 exe curwin."wincmd w"
6492
6493 elseif bufnr(a:dirname) > 0
6494 let bn= bufnr(a:dirname)
6495" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006496 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00006497 endif
6498
6499 elseif g:netrw_fastbrowse <= 1
6500" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006501 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006502 endif
6503" call Dret("s:NetrwRefreshDir")
6504endfun
6505
6506" ---------------------------------------------------------------------
6507" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
6508" What this function does is to compute a priority for the patterns
6509" in the g:netrw_sort_sequence. It applies a substitute to any
6510" "files" that satisfy each pattern, putting the priority / in
6511" front. An "*" pattern handles the default priority.
6512fun! s:NetrwSetSort()
6513" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
6514 if w:netrw_liststyle == s:LONGLIST
6515 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
6516 else
6517 let seqlist = g:netrw_sort_sequence
6518 endif
6519 " sanity check -- insure that * appears somewhere
6520 if seqlist == ""
6521 let seqlist= '*'
6522 elseif seqlist !~ '\*'
6523 let seqlist= seqlist.',*'
6524 endif
6525 let priority = 1
6526 while seqlist != ""
6527 if seqlist =~ ','
6528 let seq = substitute(seqlist,',.*$','','e')
6529 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
6530 else
6531 let seq = seqlist
6532 let seqlist = ""
6533 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006534 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01006535 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006536 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01006537 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006538 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006539 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006540 endif
6541" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6542
6543 " sanity check
6544 if w:netrw_bannercnt > line("$")
6545 " apparently no files were left after a Hiding pattern was used
6546" call Dret("SetSort : no files left after hiding")
6547 return
6548 endif
6549 if seq == '*'
6550 let starpriority= spriority
6551 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006552 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006553 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006554 " sometimes multiple sorting patterns will match the same file or directory.
6555 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006556 exe 'sil keepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006557 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006558 endif
6559 let priority = priority + 1
6560 endwhile
6561 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006562 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006563 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006564 endif
6565
6566 " Following line associated with priority -- items that satisfy a priority
6567 " pattern get prefixed by ###/ which permits easy sorting by priority.
6568 " Sometimes files can satisfy multiple priority patterns -- only the latest
6569 " priority pattern needs to be retained. So, at this point, these excess
6570 " priority prefixes need to be removed, but not directories that happen to
6571 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006572 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006573 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006574
6575" call Dret("SetSort")
6576endfun
6577
6578" =====================================================================
6579" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
6580fun! s:NetrwSortStyle(islocal)
6581" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006582 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006583 let svpos= netrw#NetrwSavePosn()
6584
6585 let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006586 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006587 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6588 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006589
6590" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
6591endfun
6592
6593" ---------------------------------------------------------------------
6594" s:NetrwSplit: mode {{{2
6595" =0 : net and o
6596" =1 : net and t
6597" =2 : net and v
6598" =3 : local and o
6599" =4 : local and t
6600" =5 : local and v
6601fun! s:NetrwSplit(mode)
6602" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
6603
6604 call s:SaveWinVars()
6605
6606 if a:mode == 0
6607 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02006608 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6609" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006610 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006611 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006612 keepj call s:RestoreWinVars()
6613 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006614 unlet s:didsplit
6615
6616 elseif a:mode == 1
6617 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01006618 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006619" call Decho("tabnew")
6620 tabnew
6621 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006622 keepj call s:RestoreWinVars()
6623 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006624 unlet s:didsplit
6625
6626 elseif a:mode == 2
6627 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02006628 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6629" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006630 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006631 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006632 keepj call s:RestoreWinVars()
6633 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006634 unlet s:didsplit
6635
6636 elseif a:mode == 3
6637 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02006638 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6639" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006640 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006641 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006642 keepj call s:RestoreWinVars()
6643 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006644 unlet s:didsplit
6645
6646 elseif a:mode == 4
6647 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00006648 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006649 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006650" call Decho("tabnew")
6651 tabnew
6652 let b:netrw_curdir= netrw_curdir
6653 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006654 keepj call s:RestoreWinVars()
6655 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006656 unlet s:didsplit
6657
6658 elseif a:mode == 5
6659 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02006660 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6661" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006662 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006663 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006664 keepj call s:RestoreWinVars()
6665 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006666 unlet s:didsplit
6667
6668 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006669 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006670 endif
6671
6672" call Dret("s:NetrwSplit")
6673endfun
6674
6675" ---------------------------------------------------------------------
6676" NetrwStatusLine: {{{2
6677fun! NetrwStatusLine()
6678
6679" vvv NetrwStatusLine() debugging vvv
6680" let g:stlmsg=""
6681" if !exists("w:netrw_explore_bufnr")
6682" let g:stlmsg="!X<explore_bufnr>"
6683" elseif w:netrw_explore_bufnr != bufnr("%")
6684" let g:stlmsg="explore_bufnr!=".bufnr("%")
6685" endif
6686" if !exists("w:netrw_explore_line")
6687" let g:stlmsg=" !X<explore_line>"
6688" elseif w:netrw_explore_line != line(".")
6689" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
6690" endif
6691" if !exists("w:netrw_explore_list")
6692" let g:stlmsg=" !X<explore_list>"
6693" endif
6694" ^^^ NetrwStatusLine() debugging ^^^
6695
6696 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")
6697 " restore user's status line
6698 let &stl = s:netrw_users_stl
6699 let &laststatus = s:netrw_users_ls
6700 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
6701 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
6702 return ""
6703 else
6704 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
6705 endif
6706endfun
6707
6708" ---------------------------------------------------------------------
6709" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
6710" (full path directory with trailing slash returned)
6711fun! s:NetrwTreeDir()
6712" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
6713
6714 let treedir= b:netrw_curdir
6715" call Decho("set initial treedir<".treedir.">")
6716 let s:treecurpos= netrw#NetrwSavePosn()
6717
6718 if w:netrw_liststyle == s:TREELIST
6719" call Decho("w:netrrw_liststyle is TREELIST:")
6720" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006721
6722 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006723 if getline('.') =~ '/$'
6724 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
6725 else
6726 let treedir= ""
6727 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006728" call Decho("treedir<".treedir.">")
6729
6730 " detect user attempting to close treeroot
6731 if getline('.') !~ '|' && getline('.') != '..'
6732" call Decho("user attempted to close treeroot")
6733 " now force a refresh
6734" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006735 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006736" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6737 return b:netrw_curdir
6738 endif
6739
6740 " elide all non-depth information
6741 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006742" call Decho("depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006743
6744 " elide first depth
6745 let depth = substitute(depth,'^| ','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006746" call Decho("depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006747
6748 " construct treedir by searching backwards at correct depth
6749" call Decho("constructing treedir<".treedir."> depth<".depth.">")
6750 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
6751 let dirname= substitute(getline('.'),'^\(| \)*','','e')
6752 let treedir= dirname.treedir
6753 let depth = substitute(depth,'^| ','','')
6754" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
6755 endwhile
6756 if w:netrw_treetop =~ '/$'
6757 let treedir= w:netrw_treetop.treedir
6758 else
6759 let treedir= w:netrw_treetop.'/'.treedir
6760 endif
6761" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
6762 endif
6763 let treedir= substitute(treedir,'//$','/','')
6764
Bram Moolenaar446cb832008-06-24 21:56:24 +00006765" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6766 return treedir
6767endfun
6768
6769" ---------------------------------------------------------------------
6770" s:NetrwTreeDisplay: recursive tree display {{{2
6771fun! s:NetrwTreeDisplay(dir,depth)
6772" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
6773
6774 " insure that there are no folds
6775 setlocal nofen
6776
6777 " install ../ and shortdir
6778 if a:depth == ""
6779 call setline(line("$")+1,'../')
6780" call Decho("setline#".line("$")." ../ (depth is zero)")
6781 endif
6782 if a:dir =~ '^\a\+://'
6783 if a:dir == w:netrw_treetop
6784 let shortdir= a:dir
6785 else
6786 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
6787 endif
6788 call setline(line("$")+1,a:depth.shortdir)
6789 else
6790 let shortdir= substitute(a:dir,'^.*/','','e')
6791 call setline(line("$")+1,a:depth.shortdir.'/')
6792 endif
6793" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
6794
6795 " append a / to dir if its missing one
6796 let dir= a:dir
6797 if dir !~ '/$'
6798 let dir= dir.'/'
6799 endif
6800
6801 " display subtrees (if any)
6802 let depth= "| ".a:depth
6803
6804" call Decho("display subtrees with depth<".depth."> and current leaves")
6805 for entry in w:netrw_treedict[a:dir]
6806 let direntry= substitute(dir.entry,'/$','','e')
6807" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
6808 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
6809" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006810 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006811 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
6812" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006813 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006814 else
6815" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006816 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006817 endif
6818 endfor
6819" call Dret("NetrwTreeDisplay")
6820endfun
6821
6822" ---------------------------------------------------------------------
6823" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
6824fun! s:NetrwTreeListing(dirname)
6825 if w:netrw_liststyle == s:TREELIST
6826" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
6827" call Decho("curdir<".a:dirname.">")
6828" 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"))
6829
6830 " update the treetop
6831" call Decho("update the treetop")
6832 if !exists("w:netrw_treetop")
6833 let w:netrw_treetop= a:dirname
6834" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
6835 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
6836 let w:netrw_treetop= a:dirname
6837" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
6838 endif
6839
6840 " insure that we have at least an empty treedict
6841 if !exists("w:netrw_treedict")
6842 let w:netrw_treedict= {}
6843 endif
6844
6845 " update the directory listing for the current directory
6846" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
6847" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006848 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006849 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006850" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006851 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006852
6853 " if past banner, record word
6854 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
6855 let fname= expand("<cword>")
6856 else
6857 let fname= ""
6858 endif
6859" call Decho("fname<".fname.">")
6860
6861 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02006862 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006863
6864" call Dret("NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006865 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006866 endif
6867endfun
6868
6869" ---------------------------------------------------------------------
6870" s:NetrwWideListing: {{{2
6871fun! s:NetrwWideListing()
6872
6873 if w:netrw_liststyle == s:WIDELIST
6874" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
6875 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006876 " cpf: characters per filename
6877 " fpl: filenames per line
6878 " fpc: filenames per column
Bram Moolenaar446cb832008-06-24 21:56:24 +00006879 setlocal ma noro
6880" call Decho("setlocal ma noro")
6881 let b:netrw_cpf= 0
6882 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006883 exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006884 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006885 else
6886" call Dret("NetrwWideListing")
6887 return
6888 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006889 let b:netrw_cpf= b:netrw_cpf + 2
6890" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006891
6892 " determine qty files per line (fpl)
6893 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
6894 if w:netrw_fpl <= 0
6895 let w:netrw_fpl= 1
6896 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006897" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006898
6899 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006900 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006901 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006902 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
6903 let newcolstart = w:netrw_bannercnt + fpc
6904 let newcolend = newcolstart + fpc - 1
6905" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006906 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00006907 while line("$") >= newcolstart
6908 if newcolend > line("$") | let newcolend= line("$") | endif
6909 let newcolqty= newcolend - newcolstart
6910 exe newcolstart
6911 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006912 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006913 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006914 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006915 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006916 exe "sil! keepj ".newcolstart.','.newcolend.'d'
6917 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006918 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02006919 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006920 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006921 keepj call histdel("/",-1)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006922" call Decho("NetrwWideListing) setl noma nomod ro")
6923 setl noma nomod ro
6924" call Decho("(NetrwWideListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006925" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006926 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006927 endif
6928
6929endfun
6930
6931" ---------------------------------------------------------------------
6932" s:PerformListing: {{{2
6933fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006934" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006935
Bram Moolenaar15146672011-10-20 22:22:38 +02006936 " set up syntax highlighting {{{3
6937" call Decho("set up syntax highlighting")
6938 if has("syntax")
6939 if !exists("g:syntax_on") || !g:syntax_on
6940" call Decho("but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
6941 setlocal ft=
6942 elseif &ft != "netrw"
6943 setlocal ft=netrw
6944 endif
6945 endif
6946
Bram Moolenaaradc21822011-04-01 18:03:16 +02006947 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006948 setlocal noro ma
6949" call Decho("setlocal noro ma")
6950
6951" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
6952" call Decho("(netrw) Processing your browsing request...")
6953" endif " Decho
6954
6955" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
6956 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6957 " force a refresh for tree listings
6958" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006959 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006960 endif
6961
6962 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02006963 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006964
6965 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006966 if g:netrw_banner
6967" call Decho("set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006968 keepj call setline(1,'" ============================================================================')
6969 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
6970 keepj call setline(3,'" '.b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006971 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006972 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006973 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006974 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006975 let w:netrw_bannercnt= 1
6976 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006977
6978 let sortby= g:netrw_sort_by
6979 if g:netrw_sort_direction =~ "^r"
6980 let sortby= sortby." reversed"
6981 endif
6982
6983 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006984 if g:netrw_banner
6985" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
6986 if g:netrw_sort_by =~ "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006987" call Decho("directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006988 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006989 keepj put ='\" Sorted by '.sortby
6990 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01006991 let w:netrw_bannercnt= w:netrw_bannercnt + 2
6992 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00006993" call Decho("directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006994 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006995 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01006996 let w:netrw_bannercnt= w:netrw_bannercnt + 1
6997 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006998 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006999 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007000
7001 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01007002 if g:netrw_banner
7003 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
7004" call Decho("show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007005 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01007006 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007007 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007008 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007009 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007010 endif
7011 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007012 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01007013" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007014 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007015 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007016 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007017
7018 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007019 if g:netrw_banner
7020" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
7021 if g:netrw_list_hide != "" && g:netrw_hide
7022 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007023 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007024 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007025 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007026 endif
7027 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007028 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007029 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007030 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
7031 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007032 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00007033 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007034
7035 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01007036 if g:netrw_banner
7037 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007038 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007039" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
7040 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007041
Bram Moolenaar446cb832008-06-24 21:56:24 +00007042 " get list of files
7043" call Decho("Get list of files - islocal=".a:islocal)
7044 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007045 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007046 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02007047 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007048 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007049" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007050
7051 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007052 if !exists("w:netrw_bannercnt")
7053 let w:netrw_bannercnt= 0
7054 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007055 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007056" call Decho("manipulate directory listing (hide)")
7057" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
7058 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007059 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007060 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007061 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007062" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
7063
7064 if g:netrw_sort_by =~ "^n"
7065 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02007066 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007067
Bram Moolenaar5c736222010-01-06 20:54:52 +01007068 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007069" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
7070 if g:netrw_sort_direction =~ 'n'
7071 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007072 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007073 else
7074 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007075 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007076 endif
7077 endif
7078 " remove priority pattern prefix
7079" call Decho("remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007080 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007081 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007082
7083 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01007084 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007085" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
7086 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007087" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007088 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007089 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007090" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007091 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007092 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007093 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007094 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007095 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007096 endif
7097
7098 elseif g:netrw_sort_direction =~ 'r'
7099" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007100 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007101 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007102 call histdel("/",-1)
7103 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007104 endif
7105 endif
7106
7107 " convert to wide/tree listing {{{3
7108" call Decho("modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007109 keepj call s:NetrwWideListing()
7110 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007111
Bram Moolenaar5c736222010-01-06 20:54:52 +01007112 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007113 " place cursor on the top-left corner of the file listing
7114" call Decho("place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007115 exe 'sil! keepj '.w:netrw_bannercnt
7116 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007117 endif
7118
7119 " record previous current directory
7120 let w:netrw_prvdir= b:netrw_curdir
7121" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
7122
7123 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007124 keepj call s:SetBufWinVars()
7125 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007126
7127 " set display to netrw display settings
7128" call Decho("set display to netrw display settings (noma nomod etc)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007129 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00007130 if exists("s:treecurpos")
7131
Bram Moolenaaradc21822011-04-01 18:03:16 +02007132 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007133 unlet s:treecurpos
7134 endif
7135
7136" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
7137endfun
7138
7139" ---------------------------------------------------------------------
7140" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007141fun! s:SetupNetrwStatusLine(statline)
7142" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
7143
7144 if !exists("s:netrw_setup_statline")
7145 let s:netrw_setup_statline= 1
7146" call Decho("do first-time status line setup")
7147
7148 if !exists("s:netrw_users_stl")
7149 let s:netrw_users_stl= &stl
7150 endif
7151 if !exists("s:netrw_users_ls")
7152 let s:netrw_users_ls= &laststatus
7153 endif
7154
7155 " set up User9 highlighting as needed
7156 let keepa= @a
7157 redir @a
7158 try
7159 hi User9
7160 catch /^Vim\%((\a\+)\)\=:E411/
7161 if &bg == "dark"
7162 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
7163 else
7164 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
7165 endif
7166 endtry
7167 redir END
7168 let @a= keepa
7169 endif
7170
7171 " set up status line (may use User9 highlighting)
7172 " insure that windows have a statusline
7173 " make sure statusline is displayed
7174 let &stl=a:statline
7175 setlocal laststatus=2
7176" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007177 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00007178
7179" call Dret("SetupNetrwStatusLine : stl=".&stl)
7180endfun
7181
7182" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007183" Remote Directory Browsing Support: {{{1
7184" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00007185
7186" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007187" s:NetrwRemoteListing: {{{2
7188fun! s:NetrwRemoteListing()
7189" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00007190
Bram Moolenaar446cb832008-06-24 21:56:24 +00007191 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007192
Bram Moolenaar446cb832008-06-24 21:56:24 +00007193 " sanity check:
7194 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
7195" call Decho("b:netrw_method=".b:netrw_method)
7196 if !executable("ftp")
7197 if !exists("g:netrw_quiet")
7198 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
7199 endif
7200 call s:NetrwOptionRestore("w:")
7201" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00007202 return
7203 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007204
7205 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
7206 if !exists("g:netrw_quiet")
7207 if g:netrw_list_cmd == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007208 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007209 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007210 keepj call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007211 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007212 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007213
Bram Moolenaaradc21822011-04-01 18:03:16 +02007214 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007215" call Dret("s:NetrwRemoteListing")
7216 return
7217 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007218
Bram Moolenaar446cb832008-06-24 21:56:24 +00007219 if exists("b:netrw_method")
7220" call Decho("setting w:netrw_method<".b:netrw_method.">")
7221 let w:netrw_method= b:netrw_method
7222 endif
7223
7224 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007225 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007226" call Decho("use ftp to get remote file listing")
7227 let s:method = "ftp"
7228 let listcmd = g:netrw_ftp_list_cmd
7229 if g:netrw_sort_by =~ '^t'
7230 let listcmd= g:netrw_ftp_timelist_cmd
7231 elseif g:netrw_sort_by =~ '^s'
7232 let listcmd= g:netrw_ftp_sizelist_cmd
7233 endif
7234" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
7235 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007236" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007237
7238 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
7239 " shorten the listing
7240" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007241 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007242
7243 " cleanup
7244 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007245 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007246 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007247 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007248 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007249 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007250
7251 " if there's no ../ listed, then put ./ and ../ in
7252 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007253 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007254 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
7255 if line2 == 0
7256" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007257 sil! keepj put='../'
7258 sil! keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007259 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007260 exe "sil! keepj ".line1
7261 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007262
7263" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
7264 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7265" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007266 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007267 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007268 else " normal ftp cleanup
7269" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007270 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
7271 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
7272 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007273 keepj call histdel("/",-1)
7274 keepj call histdel("/",-1)
7275 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007276 endif
7277 endif
7278
7279 else
7280 " use ssh to get remote file listing {{{3
7281" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
7282 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
7283" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
7284 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007285" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007286 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007287 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007288 sil! keepj g/^Listing directory/keepj d
7289 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
7290 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007291 keepj call histdel("/",-1)
7292 keepj call histdel("/",-1)
7293 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007294 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007295 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007296 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007297 endif
7298 else
7299 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007300" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar15146672011-10-20 22:22:38 +02007301 exe "sil! keepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007302 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02007303" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007304 exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007305" call Decho("listcmd<".listcmd."> path<".s:path.">")
7306 endif
7307 endif
7308
7309 " cleanup
7310 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007311" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007312 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007313 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007314 endif
7315 endif
7316
7317 if w:netrw_liststyle == s:LONGLIST
7318 " do a long listing; these substitutions need to be done prior to sorting {{{3
7319" call Decho("fix long listing:")
7320
7321 if s:method == "ftp"
7322 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007323 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007324 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007325 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007326 endwhile
7327 " if there's no ../ listed, then put ./ and ../ in
7328 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007329 sil! keepj 1
7330 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007331 let line2= line(".")
7332 if line2 == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007333 exe 'sil! keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007334 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007335 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007336 endif
7337 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007338 exe "sil! keepj ".line1
7339 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007340 endif
7341
7342 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7343" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007344 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007345 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
7346" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007347 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
7348 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
7349 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02007350 keepj call histdel("/",-1)
7351 keepj call histdel("/",-1)
7352 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007353 endif
7354 endif
7355
7356" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007357" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007358" endif " Decho
7359" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007360endfun
7361
Bram Moolenaar446cb832008-06-24 21:56:24 +00007362" ---------------------------------------------------------------------
7363" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
7364fun! s:NetrwRemoteRm(usrhost,path) range
7365" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
7366" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7367 let svpos= netrw#NetrwSavePosn()
7368
7369 let all= 0
7370 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7371 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01007372" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007373 for fname in s:netrwmarkfilelist_{bufnr("%")}
7374 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
7375 if ok =~ 'q\%[uit]'
7376 break
7377 elseif ok =~ 'a\%[ll]'
7378 let all= 1
7379 endif
7380 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007381 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007382
7383 else
7384 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01007385" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007386
7387 " preparation for removing multiple files/directories
7388 let ctr= a:firstline
7389
7390 " remove multiple files and directories
7391 while ctr <= a:lastline
Bram Moolenaar15146672011-10-20 22:22:38 +02007392 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007393 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
7394 if ok =~ 'q\%[uit]'
7395 break
7396 elseif ok =~ 'a\%[ll]'
7397 let all= 1
7398 endif
7399 let ctr= ctr + 1
7400 endwhile
7401 endif
7402
7403 " refresh the (remote) directory listing
7404" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007405 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7406 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007407
7408" call Dret("s:NetrwRemoteRm")
7409endfun
7410
7411" ---------------------------------------------------------------------
7412" s:NetrwRemoteRmFile: {{{2
7413fun! s:NetrwRemoteRmFile(path,rmfile,all)
7414" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
7415
7416 let all= a:all
7417 let ok = ""
7418
7419 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
7420 " attempt to remove file
7421" call Decho("attempt to remove file (all=".all.")")
7422 if !all
7423 echohl Statement
7424" call Decho("case all=0:")
7425 call inputsave()
7426 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7427 call inputrestore()
7428 echohl NONE
7429 if ok == ""
7430 let ok="no"
7431 endif
7432 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7433 if ok =~ 'a\%[ll]'
7434 let all= 1
7435 endif
7436 endif
7437
7438 if all || ok =~ 'y\%[es]' || ok == ""
7439" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
7440 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7441" call Decho("case ftp:")
7442 let path= a:path
7443 if path =~ '^\a\+://'
7444 let path= substitute(path,'^\a\+://[^/]\+/','','')
7445 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007446 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007447 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
7448 else
7449" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
7450 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
7451" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7452 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007453 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007454 let ok="q"
7455 else
7456 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7457" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7458" call Decho("remotedir<".remotedir.">")
7459" call Decho("rmfile<".a:rmfile.">")
7460 if remotedir != ""
7461 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
7462 else
7463 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
7464 endif
7465" call Decho("call system(".netrw_rm_cmd.")")
7466 let ret= system(netrw_rm_cmd)
7467 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007468 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007469 endif
7470" call Decho("returned=".ret." errcode=".v:shell_error)
7471 endif
7472 endif
7473 elseif ok =~ 'q\%[uit]'
7474" call Decho("ok==".ok)
7475 break
7476 endif
7477
7478 else
7479 " attempt to remove directory
7480" call Decho("attempt to remove directory")
7481 if !all
7482 call inputsave()
7483 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7484 call inputrestore()
7485 if ok == ""
7486 let ok="no"
7487 endif
7488 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7489 if ok =~ 'a\%[ll]'
7490 let all= 1
7491 endif
7492 endif
7493
7494 if all || ok =~ 'y\%[es]' || ok == ""
7495 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007496 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007497 else
7498 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007499 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007500" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007501 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007502" call Decho("returned=".ret." errcode=".v:shell_error)
7503
7504 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007505" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007506 let netrw_rmf_cmd= s:MakeSshCmd(netrw#WinPath(g:netrw_rmf_cmd)).' '.shellescape(netrw#WinPath(substitute(rmfile,'[\/]$','','e')))
Bram Moolenaarc236c162008-07-13 17:41:49 +00007507" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
7508 let ret= system(netrw_rmf_cmd)
7509" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007510
7511 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007512 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007513 endif
7514 endif
7515 endif
7516
7517 elseif ok =~ 'q\%[uit]'
7518 break
7519 endif
7520 endif
7521
7522" call Dret("s:NetrwRemoteRmFile ".ok)
7523 return ok
7524endfun
7525
7526" ---------------------------------------------------------------------
7527" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
7528" This function assumes that a long listing will be received. Size, time,
7529" and reverse sorts will be requested of the server but not otherwise
7530" enforced here.
7531fun! s:NetrwRemoteFtpCmd(path,listcmd)
7532" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
7533" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
7534
7535 " because WinXX ftp uses unix style input
7536 let ffkeep= &ff
7537 setlocal ma ff=unix noro
7538" call Decho("setlocal ma ff=unix noro")
7539
7540 " clear off any older non-banner lines
7541 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02007542" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
7543 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007544
7545 ".........................................
7546 if w:netrw_method == 2 || w:netrw_method == 5
7547 " ftp + <.netrc>: Method #2
7548 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007549 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007550 endif
7551 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007552 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007553" call Decho("filter input: ".getline('.'))
7554 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007555 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007556" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
7557 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007558" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007559 exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007560 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007561" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007562 exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007563 endif
7564
7565 ".........................................
7566 elseif w:netrw_method == 3
7567 " ftp + machine,id,passwd,filename: Method #3
7568 setlocal ff=unix
7569 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007570 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00007571 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007572 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00007573 endif
7574
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007575 " handle userid and password
7576 let host= substitute(g:netrw_machine,'\..*$','','')
7577" call Decho("host<".host.">")
7578 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
7579 call NetUserPass("ftp:".host)
7580 endif
7581 if exists("g:netrw_uid") && g:netrw_uid != ""
7582 if exists("g:netrw_ftp") && g:netrw_ftp == 1
7583 keepj put =g:netrw_uid
7584 if exists("s:netrw_passwd") && s:netrw_passwd != ""
7585 keepj put ='\"'.s:netrw_passwd.'\"'
7586 endif
7587 elseif exists("s:netrw_passwd")
7588 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
7589 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007590 endif
7591
7592 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007593 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007594 endif
7595 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007596 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007597" call Decho("filter input: ".getline('.'))
7598 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007599 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007600
7601 " perform ftp:
7602 " -i : turns off interactive prompting from ftp
7603 " -n unix : DON'T use <.netrc>, even though it exists
7604 " -n win32: quit being obnoxious about password
7605" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007606" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
7607 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007608
7609 ".........................................
7610 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007611 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007612 endif
7613
7614 " cleanup for Windows
7615 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007616 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007617 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007618 endif
7619 if a:listcmd == "dir"
7620 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007621 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
7622 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02007623 keepj call histdel("/",-1)
7624 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007625 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007626 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007627 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007628 endif
7629 endif
7630
7631 " ftp's listing doesn't seem to include ./ or ../
7632 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007633 exe 'keepj '.w:netrw_bannercnt
7634 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007635 endif
7636 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007637 exe 'keepj '.w:netrw_bannercnt
7638 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007639 endif
7640
7641 " restore settings
7642 let &ff= ffkeep
7643" call Dret("NetrwRemoteFtpCmd")
7644endfun
7645
7646" ---------------------------------------------------------------------
7647" s:NetrwRemoteRename: rename a remote file or directory {{{2
7648fun! s:NetrwRemoteRename(usrhost,path) range
7649" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
7650
7651 " preparation for removing multiple files/directories
7652 let svpos = netrw#NetrwSavePosn()
7653 let ctr = a:firstline
7654 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
7655
7656 " rename files given by the markfilelist
7657 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7658 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7659" call Decho("oldname<".oldname.">")
7660 if exists("subfrom")
7661 let newname= substitute(oldname,subfrom,subto,'')
7662" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7663 else
7664 call inputsave()
7665 let newname= input("Moving ".oldname." to : ",oldname)
7666 call inputrestore()
7667 if newname =~ '^s/'
7668 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7669 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7670 let newname = substitute(oldname,subfrom,subto,'')
7671" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7672 endif
7673 endif
7674
7675 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007676 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007677 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007678 let oldname= shellescape(a:path.oldname)
7679 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007680" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7681 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007682 endif
7683
7684 endfor
7685 call s:NetrwUnMarkFile(1)
7686
7687 else
7688
7689 " attempt to rename files/directories
7690 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007691 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007692
7693 let oldname= s:NetrwGetWord()
7694" call Decho("oldname<".oldname.">")
7695
7696 call inputsave()
7697 let newname= input("Moving ".oldname." to : ",oldname)
7698 call inputrestore()
7699
7700 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7701 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7702 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007703 let oldname= shellescape(a:path.oldname)
7704 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007705" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7706 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007707 endif
7708
7709 let ctr= ctr + 1
7710 endwhile
7711 endif
7712
7713 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007714 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7715 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007716
7717" call Dret("NetrwRemoteRename")
7718endfun
7719
7720" ---------------------------------------------------------------------
7721" Local Directory Browsing Support: {{{1
7722" ==========================================
7723
7724" ---------------------------------------------------------------------
7725" netrw#LocalBrowseCheck: {{{2
7726fun! netrw#LocalBrowseCheck(dirname)
7727 " unfortunate interaction -- split window debugging can't be
7728 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
7729 " event triggers another call to LocalBrowseCheck() when attempts
7730 " to write to the DBG buffer are made.
7731 " The &ft == "netrw" test was installed because the BufEnter event
7732 " would hit when re-entering netrw windows, creating unexpected
7733 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007734" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007735" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007736 if isdirectory(a:dirname)
7737" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
7738 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007739 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007740 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007741 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007742 elseif exists("s:treeforceredraw")
7743 unlet s:treeforceredraw
Bram Moolenaaradc21822011-04-01 18:03:16 +02007744 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007745 endif
7746 endif
7747 " not a directory, ignore it
7748endfun
7749
7750" ---------------------------------------------------------------------
7751" s:LocalListing: does the job of "ls" for local directories {{{2
7752fun! s:LocalListing()
7753" call Dfunc("s:LocalListing()")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007754" call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
7755" call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007756
7757" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
7758" 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
7759
7760 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007761 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01007762 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02007763 let filelist = glob(s:ComposePath(fnameescape(dirname),"*"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007764" call Decho("(LocalListing) glob(dirname<".dirname."/*>)=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007765 if filelist != ""
7766 let filelist= filelist."\n"
7767 endif
Bram Moolenaar251e1912011-06-19 05:09:16 +02007768 let filelist= filelist.glob(s:ComposePath(fnameescape(dirname),".*"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007769" call Decho("(LocalListing) glob(dirname<".dirname."/.*>)=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007770
7771 " Coding choice: either elide ./ if present
7772 " or include ./ if not present
7773 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
7774 " elide /path/. from glob() entries if present
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007775" call Decho("(LocalListing) elide /path/. from glob entries if present")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007776 let filelist = substitute(filelist,'\n','\t','g')
7777 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
7778 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
7779 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
7780 let filelist = substitute(filelist,'\t','\n','g')
7781 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007782" call Decho("(LocalListing) filelist<".filelist.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007783 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
7784 " include ../ in the glob() entry if its missing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007785" call Decho("(LocalListing) forcibly tacking on ..")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007786 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007787" call Decho("(LocalListing) filelist<".filelist.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007788 endif
7789 if b:netrw_curdir == '/'
7790 " remove .. from filelist when current directory is root directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007791" call Decho("(LocalListing) remove .. from filelist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007792 let filelist= substitute(filelist,'/\.\.\n','','')
7793 endif
7794 " remove multiple contiguous newlines
7795 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
7796 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7797 " change all \s to /s
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007798" call Decho('(LocalListing) change all \s to /s')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007799 let filelist= substitute(filelist,'\','/','g')
7800 else
7801 " escape all \s to \\
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007802" call Decho('(LocalListing) escape all \s to \\')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007803 let filelist= substitute(filelist,'\','\\','g')
7804 endif
7805
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007806" call Decho("(LocalListing) (before while) dirname<".dirname.">")
7807" call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">")
7808" call Decho("(LocalListing) (before while) filelist<".filelist.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007809
7810 while filelist != ""
7811 if filelist =~ '\n'
7812 let filename = substitute(filelist,'\n.*$','','e')
7813 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
7814 else
7815 let filename = filelist
7816 let filelist = ""
7817 endif
7818" call Decho(" ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007819" call Decho("(LocalListing) (while) filelist<".filelist.">")
7820" call Decho("(LocalListing) (while) filename<".filename.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007821
7822 if getftype(filename) == "link"
7823 " indicate a symbolic link
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007824" call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007825 let pfile= filename."@"
7826
7827 elseif getftype(filename) == "socket"
7828 " indicate a socket
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007829" call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007830 let pfile= filename."="
7831
7832 elseif getftype(filename) == "fifo"
7833 " indicate a fifo
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007834" call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007835 let pfile= filename."|"
7836
7837 elseif isdirectory(filename)
7838 " indicate a directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007839" call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007840 let pfile= filename."/"
7841
7842 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
7843 if (has("win32") || has("win95") || has("win64") || has("win16"))
7844 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
7845 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007846" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007847 let pfile= filename."*"
7848 else
7849 " normal file
7850 let pfile= filename
7851 endif
7852 elseif executable(filename)
7853 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007854" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007855 let pfile= filename."*"
7856 else
7857 " normal file
7858 let pfile= filename
7859 endif
7860
7861 else
7862 " normal file
7863 let pfile= filename
7864 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007865" call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007866
7867 if pfile =~ '//$'
7868 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007869" call Decho("(LocalListing) change // to /: pfile<".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007870 endif
7871 let pfile= strpart(pfile,dirnamelen)
7872 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007873" call Decho("(LocalListing) filename<".filename.">")
7874" call Decho("(LocalListing) pfile <".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007875
7876 if w:netrw_liststyle == s:LONGLIST
7877 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007878 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007879 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007880" call Decho("(LocalListing) sz=".sz." fsz=".fsz)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007881 endif
7882
7883 if g:netrw_sort_by =~ "^t"
7884 " sort by time (handles time up to 1 quintillion seconds, US)
7885" call Decho("getftime(".filename.")=".getftime(filename))
7886 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007887 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007888" call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007889 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007890 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007891
7892 elseif g:netrw_sort_by =~ "^s"
7893 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007894" call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007895 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007896 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007897" call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007898 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007899 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007900
7901 else
7902 " sort by name
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007903" call Decho("(LocalListing) exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007904 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007905 endif
7906 endwhile
7907
7908 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007909 sil! keepj g/^$/d
7910 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007911 call histdel("/",-1)
Bram Moolenaar15146672011-10-20 22:22:38 +02007912 exe "setl ts=".g:netrw_maxfilenamelen
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007913" call Decho("(LocalListing) setl ts=".g:netrw_maxfilenamelen)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007914
7915" call Dret("s:LocalListing")
7916endfun
7917
7918" ---------------------------------------------------------------------
7919" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
7920" performed any shell command. The idea is to cause all local-browsing
7921" buffers to be refreshed after a user has executed some shell command,
7922" on the chance that s/he removed/created a file/directory with it.
7923fun! s:LocalBrowseShellCmdRefresh()
7924" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
7925 " determine which buffers currently reside in a tab
7926 if !exists("s:netrw_browselist")
7927" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
7928 return
7929 endif
7930 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007931" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007932 return
7933 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007934 if exists("s:locbrowseshellcmd")
7935 if s:locbrowseshellcmd
7936 let s:locbrowseshellcmd= 0
7937" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
7938 return
7939 endif
7940 let s:locbrowseshellcmd= 0
7941 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007942 let itab = 1
7943 let buftablist = []
7944 while itab <= tabpagenr("$")
7945 let buftablist = buftablist + tabpagebuflist()
7946 let itab = itab + 1
7947 tabn
7948 endwhile
7949" call Decho("buftablist".string(buftablist))
7950" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
7951 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
7952 " | refresh any netrw window
7953 " | wipe out any non-displaying netrw buffer
7954 let curwin = winnr()
7955 let ibl = 0
7956 for ibuf in s:netrw_browselist
7957" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
7958 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
7959 " wipe out any non-displaying netrw buffer
7960" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007961 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007962 call remove(s:netrw_browselist,ibl)
7963" call Decho("browselist=".string(s:netrw_browselist))
7964 continue
7965 elseif index(tabpagebuflist(),ibuf) != -1
7966 " refresh any netrw buffer
7967" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
7968 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007969 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007970 endif
7971 let ibl= ibl + 1
7972 endfor
7973 exe curwin."wincmd w"
7974
7975" call Dret("LocalBrowseShellCmdRefresh")
7976endfun
7977
7978" ---------------------------------------------------------------------
7979" s:NetrwLocalRm: {{{2
7980fun! s:NetrwLocalRm(path) range
7981" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
7982" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7983
7984 " preparation for removing multiple files/directories
7985 let ret = 0
7986 let all = 0
7987 let svpos = netrw#NetrwSavePosn()
7988
7989 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7990 " remove all marked files
7991" call Decho("remove all marked files")
7992 for fname in s:netrwmarkfilelist_{bufnr("%")}
7993 let ok= s:NetrwLocalRmFile(a:path,fname,all)
7994 if ok =~ 'q\%[uit]' || ok == "no"
7995 break
7996 elseif ok =~ 'a\%[ll]'
7997 let all= 1
7998 endif
7999 endfor
8000 call s:NetrwUnMarkFile(1)
8001
8002 else
8003 " remove (multiple) files and directories
8004" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
8005
8006 let ctr = a:firstline
8007 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008008 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008009
8010 " sanity checks
8011 if line(".") < w:netrw_bannercnt
8012 let ctr= ctr + 1
8013 continue
8014 endif
8015 let curword= s:NetrwGetWord()
8016 if curword == "./" || curword == "../"
8017 let ctr= ctr + 1
8018 continue
8019 endif
8020 let ok= s:NetrwLocalRmFile(a:path,curword,all)
8021 if ok =~ 'q\%[uit]' || ok == "no"
8022 break
8023 elseif ok =~ 'a\%[ll]'
8024 let all= 1
8025 endif
8026 let ctr= ctr + 1
8027 endwhile
8028 endif
8029
8030 " refresh the directory
8031" call Decho("bufname<".bufname("%").">")
8032 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008033 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8034 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008035 endif
8036
8037" call Dret("s:NetrwLocalRm")
8038endfun
8039
8040" ---------------------------------------------------------------------
8041" s:NetrwLocalRmFile: remove file fname given the path {{{2
8042" Give confirmation prompt unless all==1
8043fun! s:NetrwLocalRmFile(path,fname,all)
8044" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
8045
8046 let all= a:all
8047 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008048 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008049 let rmfile= s:ComposePath(a:path,a:fname)
8050" call Decho("rmfile<".rmfile.">")
8051
8052 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
8053 " attempt to remove file
8054" call Decho("attempt to remove file<".rmfile.">")
8055 if !all
8056 echohl Statement
8057 call inputsave()
8058 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8059 call inputrestore()
8060 echohl NONE
8061 if ok == ""
8062 let ok="no"
8063 endif
8064" call Decho("response: ok<".ok.">")
8065 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8066" call Decho("response: ok<".ok."> (after sub)")
8067 if ok =~ 'a\%[ll]'
8068 let all= 1
8069 endif
8070 endif
8071
8072 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00008073 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008074" call Decho("errcode=".v:shell_error." ret=".ret)
8075 endif
8076
8077 else
8078 " attempt to remove directory
8079 if !all
8080 echohl Statement
8081 call inputsave()
8082 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8083 call inputrestore()
8084 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8085 if ok == ""
8086 let ok="no"
8087 endif
8088 if ok =~ 'a\%[ll]'
8089 let all= 1
8090 endif
8091 endif
8092 let rmfile= substitute(rmfile,'[\/]$','','e')
8093
8094 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008095" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')')
8096 call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008097" call Decho("v:shell_error=".v:shell_error)
8098
8099 if v:shell_error != 0
8100" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008101 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008102" call Decho("errcode=".errcode)
8103
8104 if errcode != 0
8105 if has("unix")
8106" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008107 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008108 if v:shell_error != 0 && !exists("g:netrw_quiet")
8109 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
8110 let ok="no"
8111 endif
8112 elseif !exists("g:netrw_quiet")
8113 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
8114 let ok="no"
8115 endif
8116 endif
8117 endif
8118 endif
8119 endif
8120
8121" call Dret("s:NetrwLocalRmFile ".ok)
8122 return ok
8123endfun
8124
8125" ---------------------------------------------------------------------
8126" s:NetrwLocalRename: rename a remote file or directory {{{2
8127fun! s:NetrwLocalRename(path) range
8128" call Dfunc("NetrwLocalRename(path<".a:path.">)")
8129
8130 " preparation for removing multiple files/directories
8131 let ctr = a:firstline
8132 let svpos= netrw#NetrwSavePosn()
8133
8134 " rename files given by the markfilelist
8135 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8136 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8137" call Decho("oldname<".oldname.">")
8138 if exists("subfrom")
8139 let newname= substitute(oldname,subfrom,subto,'')
8140" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8141 else
8142 call inputsave()
8143 let newname= input("Moving ".oldname." to : ",oldname)
8144 call inputrestore()
8145 if newname =~ '^s/'
8146 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8147 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8148" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8149 let newname = substitute(oldname,subfrom,subto,'')
8150 endif
8151 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008152 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008153 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01008154 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008155
8156 else
8157
8158 " attempt to rename files/directories
8159 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008160 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008161
8162 " sanity checks
8163 if line(".") < w:netrw_bannercnt
8164 let ctr= ctr + 1
8165 continue
8166 endif
8167 let curword= s:NetrwGetWord()
8168 if curword == "./" || curword == "../"
8169 let ctr= ctr + 1
8170 continue
8171 endif
8172
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008173 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008174 let oldname= s:ComposePath(a:path,curword)
8175" call Decho("oldname<".oldname.">")
8176
8177 call inputsave()
8178 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
8179 call inputrestore()
8180
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008181 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008182" call Decho("renaming <".oldname."> to <".newname.">")
8183
8184 let ctr= ctr + 1
8185 endwhile
8186 endif
8187
8188 " refresh the directory
8189" call Decho("refresh the directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008190 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8191 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008192
8193" call Dret("NetrwLocalRename")
8194endfun
8195
8196" ---------------------------------------------------------------------
8197" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
8198"
8199" g:netrw_ Directory Is
8200" fastbrowse Local Remote
8201" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
8202" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
8203" fast 2 H H
8204"
8205" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
8206" Hiding a buffer means that it will be re-used when examined, hence "fast".
8207" (re-using a buffer may not be as accurate)
8208fun! s:LocalFastBrowser()
8209" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
8210
8211 " initialize browselist, a list of buffer numbers that the local browser has used
8212 if !exists("s:netrw_browselist")
8213" call Decho("initialize s:netrw_browselist")
8214 let s:netrw_browselist= []
8215 endif
8216
8217 " append current buffer to fastbrowse list
8218 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
8219" call Decho("appendng current buffer to browselist")
8220 call add(s:netrw_browselist,bufnr("%"))
8221" call Decho("browselist=".string(s:netrw_browselist))
8222 endif
8223
8224 " enable autocmd events to handle refreshing/removing local browser buffers
8225 " If local browse buffer is currently showing: refresh it
8226 " If local browse buffer is currently hidden : wipe it
8227 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
8228" call Decho("setting up local-browser shell command refresh")
8229 let s:netrw_browser_shellcmd= 1
8230 augroup AuNetrwShellCmd
8231 au!
8232 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008233" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008234 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
8235 else
8236 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008237" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008238 endif
8239 augroup END
8240 endif
8241
8242 " user must have changed fastbrowse to its fast setting, so remove
8243 " the associated autocmd events
8244 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
8245" call Decho("remove AuNetrwShellCmd autcmd group")
8246 unlet s:netrw_browser_shellcmd
8247 augroup AuNetrwShellCmd
8248 au!
8249 augroup END
8250 augroup! AuNetrwShellCmd
8251 endif
8252
8253" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
8254endfun
8255
8256" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02008257" netrw#FileUrlRead: handles reading file://* files {{{2
8258" Should accept: file://localhost/etc/fstab
8259" file:///etc/fstab
8260" file:///c:/WINDOWS/clock.avi
8261" file:///c|/WINDOWS/clock.avi
8262" file://localhost/c:/WINDOWS/clock.avi
8263" file://localhost/c|/WINDOWS/clock.avi
8264" file://c:/foo.txt
8265" file:///c:/foo.txt
8266" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
Bram Moolenaaradc21822011-04-01 18:03:16 +02008267fun! netrw#FileUrlRead(fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02008268" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8269 let fname = a:fname
8270 if fname =~ '^file://localhost/'
8271" call Decho('converting file://localhost/ -to- file:///')
8272 let fname= substitute(fname,'^file://localhost/','file:///','')
8273" call Decho("fname<".fname.">")
8274 endif
8275 if (has("win32") || has("win95") || has("win64") || has("win16"))
8276 if fname =~ '^file:///\=\a[|:]/'
8277" call Decho('converting file:///\a|/ -to- file://\a:/')
8278 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8279" call Decho("fname<".fname.">")
8280 endif
8281 endif
8282 let fname2396 = netrw#RFC2396(fname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008283 let fname2396e= fnameescape(fname2396)
8284 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
Bram Moolenaar15146672011-10-20 22:22:38 +02008285 if (has("win32") || has("win95") || has("win64") || has("win16"))
8286" call Decho("windows exception for plainfname")
8287 if plainfname =~ '^/\+\a:'
8288" call Decho('removing leading "/"s')
8289 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8290 endif
8291 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008292" call Decho("fname2396<".fname2396.">")
8293" call Decho("plainfname<".plainfname.">")
8294 exe "sil doau BufReadPre ".fname2396e
Bram Moolenaar15146672011-10-20 22:22:38 +02008295 exe 'keepj r '.plainfname
Bram Moolenaaradc21822011-04-01 18:03:16 +02008296 exe 'file! '.plainfname
Bram Moolenaar15146672011-10-20 22:22:38 +02008297 keepj 1d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008298" call Decho("(FileUrlRead) setl nomod")
Bram Moolenaar15146672011-10-20 22:22:38 +02008299 setl nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008300" call Decho("(FileUrlRead) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008301" call Dret("netrw#FileUrlRead")
8302 exe "sil doau BufReadPost ".fname2396e
8303endfun
8304
8305" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008306" Support Functions: {{{1
8307
Bram Moolenaar488c6512005-08-11 20:09:58 +00008308" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008309" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
8310fun! netrw#NetrwRestorePosn(...)
8311" 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))
8312 let eikeep= &ei
8313 set ei=all
8314 if expand("%") == "NetrwMessage"
8315 exe s:winBeforeErr."wincmd w"
8316 endif
8317
8318 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02008319 exe "keepj ".a:1
Bram Moolenaarc236c162008-07-13 17:41:49 +00008320 endif
8321
8322 " restore window
8323 if exists("w:netrw_winnr")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008324" call Decho("restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008325 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008326 endif
8327 if v:shell_error == 0
8328 " as suggested by Bram M: redraw on no error
8329 " allows protocol error messages to remain visible
8330" redraw!
8331 endif
8332
8333 " restore top-of-screen line
8334 if exists("w:netrw_hline")
Bram Moolenaar15146672011-10-20 22:22:38 +02008335" call Decho("restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008336 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008337 endif
8338
8339 " restore position
8340 if exists("w:netrw_line") && exists("w:netrw_col")
Bram Moolenaar15146672011-10-20 22:22:38 +02008341" call Decho("restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008342 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008343 endif
8344
8345 let &ei= eikeep
8346" call Dret("netrw#NetrwRestorePosn")
8347endfun
8348
8349" ---------------------------------------------------------------------
8350" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
8351fun! netrw#NetrwSavePosn()
8352" call Dfunc("netrw#NetrwSavePosn()")
8353 " Save current line and column
8354 let w:netrw_winnr= winnr()
8355 let w:netrw_line = line(".")
8356 let w:netrw_col = virtcol(".")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008357" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008358
8359 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008360 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008361 let w:netrw_hline= line(".")
8362
8363 " set up string holding position parameters
8364 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
8365
Bram Moolenaaradc21822011-04-01 18:03:16 +02008366 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008367" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
8368 return ret
8369endfun
8370
8371" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008372" netrw#RFC2396: converts %xx into characters {{{2
8373fun! netrw#RFC2396(fname)
8374" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
8375 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
8376" call Dret("netrw#RFC2396 ".fname)
8377 return fname
8378endfun
8379
8380" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008381" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
8382fun! s:ComposePath(base,subdir)
8383" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
8384
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008385 if has("amiga")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008386" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008387 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00008388 if ec != '/' && ec != ':'
8389 let ret = a:base . "/" . a:subdir
8390 else
8391 let ret = a:base . a:subdir
8392 endif
8393
8394 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8395" call Decho("windows")
8396 let ret= a:subdir
8397
Bram Moolenaar5c736222010-01-06 20:54:52 +01008398 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8399" call Decho("windows")
8400 if a:base =~ '[/\\]$'
8401 let ret= a:base.a:subdir
8402 else
8403 let ret= a:base."/".a:subdir
8404 endif
8405
Bram Moolenaarc236c162008-07-13 17:41:49 +00008406 elseif a:base =~ '^\a\+://'
8407" call Decho("remote linux/macos")
8408 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
8409 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
8410 if a:subdir == '../'
8411 if curpath =~ '[^/]/[^/]\+/$'
8412 let curpath= substitute(curpath,'[^/]\+/$','','')
8413 else
8414 let curpath=""
8415 endif
8416 let ret= urlbase.curpath
8417 else
8418 let ret= urlbase.curpath.a:subdir
8419 endif
8420" call Decho("urlbase<".urlbase.">")
8421" call Decho("curpath<".curpath.">")
8422" call Decho("ret<".ret.">")
8423
8424 else
8425" call Decho("local linux/macos")
8426 let ret = substitute(a:base."/".a:subdir,"//","/","g")
8427 if a:base =~ '^//'
8428 " keeping initial '//' for the benefit of network share listing support
8429 let ret= '/'.ret
8430 endif
8431 let ret= simplify(ret)
8432 endif
8433
8434" call Dret("s:ComposePath ".ret)
8435 return ret
8436endfun
8437
8438" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008439" s:FileReadable: o/s independent filereadable {{{2
8440fun! s:FileReadable(fname)
8441" call Dfunc("s:FileReadable(fname<".a:fname.">)")
8442
8443 if g:netrw_cygwin
8444 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
8445 else
8446 let ret= filereadable(a:fname)
8447 endif
8448
8449" call Dret("s:FileReadable ".ret)
8450 return ret
8451endfun
8452
8453" ---------------------------------------------------------------------
8454" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
8455" Places correct suffix on end of temporary filename,
8456" using the suffix provided with fname
8457fun! s:GetTempfile(fname)
8458" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
8459
8460 if !exists("b:netrw_tmpfile")
8461 " get a brand new temporary filename
8462 let tmpfile= tempname()
8463" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008464
Bram Moolenaarc236c162008-07-13 17:41:49 +00008465 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008466" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008467
Bram Moolenaar9964e462007-05-05 17:54:07 +00008468 " sanity check -- does the temporary file's directory exist?
8469 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008470" call Decho("(GetTempfile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008471 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008472" call Dret("s:GetTempfile getcwd<".getcwd().">")
8473 return ""
8474 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008475
Bram Moolenaar9964e462007-05-05 17:54:07 +00008476 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01008477 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008478" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008479
Bram Moolenaar9964e462007-05-05 17:54:07 +00008480 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00008481 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00008482 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
8483 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008484 if !exists("+shellslash") || !&ssl
8485 let tmpfile = substitute(tmpfile,'/','\','g')
8486 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008487 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00008488 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00008489 endif
8490 let b:netrw_tmpfile= tmpfile
8491" call Decho("o/s dependent fixed tempname<".tmpfile.">")
8492 else
8493 " re-use temporary filename
8494 let tmpfile= b:netrw_tmpfile
8495" call Decho("tmpfile<".tmpfile."> re-using")
8496 endif
8497
8498 " use fname's suffix for the temporary file
8499 if a:fname != ""
8500 if a:fname =~ '\.[^./]\+$'
8501" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008502 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00008503 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008504 elseif a:fname =~ '.txz$'
8505 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008506 else
8507 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
8508 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008509" call Decho("suffix<".suffix.">")
8510 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
8511" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
8512 let tmpfile .= suffix
8513" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
8514 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
8515 endif
8516 endif
8517
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008518" call Decho("(GetTempFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008519" call Dret("s:GetTempfile <".tmpfile.">")
8520 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008521endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00008522
8523" ---------------------------------------------------------------------
8524" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00008525" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00008526fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008527" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008528 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
8529 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008530 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008531 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008532 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008533 else
8534 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
8535 endif
8536" call Dret("s:MakeSshCmd <".sshcmd.">")
8537 return sshcmd
8538endfun
8539
8540" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008541" s:NetrwBMShow: {{{2
8542fun! s:NetrwBMShow()
8543" call Dfunc("s:NetrwBMShow()")
8544 redir => bmshowraw
8545 menu
8546 redir END
8547 let bmshowlist = split(bmshowraw,'\n')
8548 if bmshowlist != []
8549 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
8550 if bmshowfuncs != []
8551 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
8552 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008553 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00008554 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008555 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008556 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00008557" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
8558endfun
8559
8560" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02008561" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
8562fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008563 if !exists("w:netrw_liststyle")
8564 let w:netrw_liststyle= g:netrw_liststyle
8565 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008566" call Dfunc("s:NetrwCursor() ft<".&ft."> liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008567
8568 if &ft != "netrw"
8569 " if the current window isn't a netrw directory listing window, then use user cursorline/column
8570 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaar15146672011-10-20 22:22:38 +02008571" call Decho("case ft!=netrw: use user cul,cuc")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008572 let &l:cursorline = s:netrw_usercul
8573 let &l:cursorcolumn = s:netrw_usercuc
8574
8575 elseif g:netrw_cursor == 4
8576 " all styles: cursorline, cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008577" call Decho("case g:netrw_cursor==4: setl cul cuc")
8578 setl cursorline
8579 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02008580
8581 elseif g:netrw_cursor == 3
8582 " thin-long-tree: cursorline, user's cursorcolumn
8583 " wide : cursorline, cursorcolumn
8584 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar15146672011-10-20 22:22:38 +02008585" call Decho("case g:netrw_cursor==3 and wide: setlocal cul cuc")
8586 setl cursorline
8587 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02008588 else
Bram Moolenaar15146672011-10-20 22:22:38 +02008589" call Decho("case g:netrw_cursor==3 and not wide: setlocal cul (use user's cuc)")
8590 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008591 let &l:cursorcolumn = s:netrw_usercuc
8592 endif
8593
8594 elseif g:netrw_cursor == 2
8595 " thin-long-tree: cursorline, user's cursorcolumn
8596 " wide : cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008597" call Decho("case g:netrw_cursor==2: setlocal cuc (use user's cul)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008598 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +02008599 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008600
8601 elseif g:netrw_cursor == 1
8602 " thin-long-tree: user's cursorline, user's cursorcolumn
8603 " wide : cursorline, user's cursorcolumn
8604 let &l:cursorcolumn = s:netrw_usercuc
8605 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar15146672011-10-20 22:22:38 +02008606" call Decho("case g:netrw_cursor==2 and wide: setlocal cul (use user's cuc)")
8607 set cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008608 else
Bram Moolenaar15146672011-10-20 22:22:38 +02008609" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008610 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008611 endif
8612
8613 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008614 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008615" call Decho("default: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008616 let &l:cursorline = s:netrw_usercul
8617 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008618 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008619
8620" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008621endfun
8622
8623" ---------------------------------------------------------------------
8624" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
8625fun! s:RestoreCursorline()
8626" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008627 if exists("s:netrw_usercul")
8628 let &l:cursorline = s:netrw_usercul
8629 endif
8630 if exists("s:netrw_usercuc")
8631 let &l:cursorcolumn = s:netrw_usercuc
8632 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008633" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
8634endfun
8635
8636" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008637" s:NetrwDelete: Deletes a file. {{{2
8638" Uses Steve Hall's idea to insure that Windows paths stay
8639" acceptable. No effect on Unix paths.
8640" Examples of use: let result= s:NetrwDelete(path)
8641fun! s:NetrwDelete(path)
8642" call Dfunc("s:NetrwDelete(path<".a:path.">)")
8643
Bram Moolenaar5c736222010-01-06 20:54:52 +01008644 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008645 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
8646 if exists("+shellslash")
8647 let sskeep= &shellslash
8648 setlocal noshellslash
8649 let result = delete(path)
8650 let &shellslash = sskeep
8651 else
8652" call Decho("exe let result= ".a:cmd."('".path."')")
8653 let result= delete(path)
8654 endif
8655 else
8656" call Decho("let result= delete(".path.")")
8657 let result= delete(path)
8658 endif
8659 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008660 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008661 endif
8662
8663" call Dret("s:NetrwDelete ".result)
8664 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00008665endfun
8666
8667" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008668" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01008669fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008670" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008671" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008672
Bram Moolenaar446cb832008-06-24 21:56:24 +00008673 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008674" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008675 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
8676 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
8677 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
8678 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
8679 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8680 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
8681 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
8682 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
8683 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
8684 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8685 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
8686 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
8687 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
8688 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
8689 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
8690 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
8691
Bram Moolenaaradc21822011-04-01 18:03:16 +02008692 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008693" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008694 let netrw_keepdiff= &l:diff
Bram Moolenaaradc21822011-04-01 18:03:16 +02008695 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem goes away (beeps result, but who knows)
8696" call Dredir("Benzinger 1:","ls!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008697 keepj keepalt enew!
Bram Moolenaaradc21822011-04-01 18:03:16 +02008698" call Dredir("Benzinger 2:","ls!")
8699 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem remains.
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008700 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008701" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008702 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008703
Bram Moolenaar446cb832008-06-24 21:56:24 +00008704 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008705" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008706 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
8707 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
8708 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
8709 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
8710 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
8711 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
8712 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
8713 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
8714 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
8715 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
8716 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
8717 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
8718 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
8719 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
8720 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
8721 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
8722
Bram Moolenaar5c736222010-01-06 20:54:52 +01008723 if a:0 > 0
8724 let b:netrw_curdir= a:1
8725 if b:netrw_curdir =~ '/$'
8726 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
8727 file NetrwTreeListing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008728 set bt=nowrite noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02008729 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
8730 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01008731 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008732 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008733 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008734 endif
8735 endif
8736
Bram Moolenaar446cb832008-06-24 21:56:24 +00008737" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008738endfun
8739
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008740" ---------------------------------------------------------------------
8741" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
8742fun! s:NetrwInsureWinVars()
8743" call Dfunc("s:NetrwInsureWinVars()")
8744 if !exists("w:netrw_liststyle")
8745 let curbuf = bufnr("%")
8746 let curwin = winnr()
8747 let iwin = 1
8748 while iwin <= winnr("$")
8749 exe iwin."wincmd w"
8750 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
8751 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
8752 let winvars= w:
8753 break
8754 endif
8755 let iwin= iwin + 1
8756 endwhile
8757 exe curbuf."wincmd w"
8758 if exists("winvars")
8759" call Decho("copying w#".iwin." window variables to w#".curwin)
8760 for k in keys(winvars)
8761 let w:{k}= winvars[k]
8762 endfor
8763 endif
8764 endif
8765" call Dret("s:NetrwInsureWinVars")
8766endfun
8767
Bram Moolenaar9964e462007-05-05 17:54:07 +00008768" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008769" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
8770" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
8771fun! s:NetrwSaveWordPosn()
8772" call Dfunc("NetrwSaveWordPosn()")
8773 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
8774" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
8775endfun
8776
8777" ---------------------------------------------------------------------
8778" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
8779" changed sorting, etc. Also see s:NetrwSaveWordPosn().
8780fun! s:NetrwRestoreWordPosn()
8781" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008782 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008783" call Dret("NetrwRestoreWordPosn")
8784endfun
8785
8786" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008787" s:RestoreBufVars: {{{2
8788fun! s:RestoreBufVars()
8789" call Dfunc("s:RestoreBufVars()")
8790
8791 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
8792 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
8793 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
8794 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
8795 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
8796 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
8797
8798" call Dret("s:RestoreBufVars")
8799endfun
8800
8801" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008802" s:RemotePathAnalysis: {{{2
8803fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02008804" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008805
8806 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
8807 let s:method = substitute(a:dirname,dirpat,'\1','')
8808 let s:user = substitute(a:dirname,dirpat,'\2','')
8809 let s:machine = substitute(a:dirname,dirpat,'\3','')
8810 let s:port = substitute(a:dirname,dirpat,'\4','')
8811 let s:path = substitute(a:dirname,dirpat,'\5','')
8812 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
8813
8814" call Decho("set up s:method <".s:method .">")
8815" call Decho("set up s:user <".s:user .">")
8816" call Decho("set up s:machine<".s:machine.">")
8817" call Decho("set up s:port <".s:port.">")
8818" call Decho("set up s:path <".s:path .">")
8819" call Decho("set up s:fname <".s:fname .">")
8820
8821" call Dret("s:RemotePathAnalysis")
8822endfun
8823
8824" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008825" s:RemoteSystem: runs a command on a remote host using ssh {{{2
8826" Returns status
8827" Runs system() on
8828" [cd REMOTEDIRPATH;] a:cmd
8829" Note that it doesn't do shellescape(a:cmd)!
8830fun! s:RemoteSystem(cmd)
8831" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
8832 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008833 keepj call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008834 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008835 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008836 else
8837 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
8838 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8839 if remotedir != ""
8840 let cmd= cmd.' cd '.shellescape(remotedir).";"
8841 else
8842 let cmd= cmd.' '
8843 endif
8844 let cmd= cmd.a:cmd
8845" call Decho("call system(".cmd.")")
8846 let ret= system(cmd)
8847 endif
8848" call Dret("s:RemoteSystem ".ret)
8849 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00008850endfun
8851
8852" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008853" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008854fun! s:RestoreWinVars()
8855" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008856 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008857 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
8858 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
8859 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
8860 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
8861 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
8862 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
8863 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
8864 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
8865 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
8866 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
8867 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
8868 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00008869 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
8870 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008871 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
8872 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
8873 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
8874" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008875endfun
8876
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008877" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008878" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
8879"
8880" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
8881" is true) and a command, :Rexplore, which call this function.
8882"
8883" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
8884fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008885" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02008886 if !exists("w:netrw_rexlocal")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008887" " call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
Bram Moolenaar15146672011-10-20 22:22:38 +02008888 return
8889 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008890 if w:netrw_rexlocal
8891 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008892 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008893 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008894 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008895 if exists("s:initbeval")
8896 set beval
8897 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008898 if exists("s:rexposn_".bufnr("%"))
8899" call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%'))
8900 keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')})
8901 unlet s:rexposn_{bufnr('%')}
8902 else
8903" call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008904 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008905 if exists("s:explore_match")
8906 exe "2match netrwMarkFile /".s:explore_match."/"
8907 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008908" call Dret("s:NetrwRexplore")
8909endfun
8910
8911" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008912" s:SaveBufVars: {{{2
8913fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008914" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00008915
8916 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
8917 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
8918 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
8919 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
8920 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
8921 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
8922
8923" call Dret("s:SaveBufVars")
8924endfun
8925
8926" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008927" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008928fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008929" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008930 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
8931 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
8932 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
8933 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
8934 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
8935 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
8936 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
8937 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
8938 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
8939 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
8940 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
8941 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
8942 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
8943 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
8944 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
8945 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
8946 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
8947 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
8948" call Dret("s:SaveWinVars")
8949endfun
8950
8951" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008952" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008953" To allow separate windows to have their own activities, such as
8954" Explore **/pattern, several variables have been made window-oriented.
8955" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008956" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008957" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008958fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008959" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008960 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
8961 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
8962 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
8963 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
8964 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
8965 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
8966 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
8967 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
8968 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
8969 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
8970" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008971endfun
8972
8973" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008974" s:SetRexDir: set directory for :Rexplore {{{2
8975fun! s:SetRexDir(islocal,dirname)
8976" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008977 let w:netrw_rexdir = a:dirname
8978 let w:netrw_rexlocal = a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00008979" call Dret("s:SetRexDir")
8980endfun
8981
8982" ---------------------------------------------------------------------
8983" s:Strlen: this function returns the length of a string, even if its {{{2
8984" using two-byte etc characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01008985" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
8986" and a bit from me.
8987" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008988fun! s:Strlen(x)
8989" call Dfunc("s:Strlen(x<".a:x.">")
8990 if g:netrw_xstrlen == 1
8991 " number of codepoints (Latin a + combining circumflex is two codepoints)
8992 " (comment from TM, solution from NW)
8993 let ret= strlen(substitute(a:x,'.','c','g'))
8994
8995 elseif g:netrw_xstrlen == 2
8996 " number of spacing codepoints (Latin a + combining circumflex is one spacing
8997 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
8998 " (comment from TM, solution from TM)
8999 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
9000
9001 elseif g:netrw_xstrlen == 3
9002 " virtual length (counting, for instance, tabs as anything between 1 and
9003 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
9004 " preceded by lam, one otherwise, etc.)
9005 " (comment from TM, solution from me)
9006 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009007 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009008 call setline(line("."),a:x)
9009 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009010 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00009011 let &mod= modkeep
9012
9013 else
9014 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01009015 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009016 endif
9017" call Dret("s:Strlen ".ret)
9018 return ret
9019endfun
9020
9021" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009022" s:TreeListMove: {{{2
9023fun! s:TreeListMove(dir)
9024" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
9025 let curline = getline('.')
9026 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
9027 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
9028 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
9029 let indentm1 = substitute(curindent,'^| ','','')
9030" call Decho("prvline <".prvline."> #".line(".")-1)
9031" call Decho("curline <".curline."> #".line("."))
9032" call Decho("nxtline <".nxtline."> #".line(".")+1)
9033" call Decho("curindent<".curindent.">")
9034" call Decho("indentm1 <".indentm1.">")
9035
9036 if curline !~ '/$'
9037" call Decho('regfile')
9038 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009039 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009040 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
9041" call Decho("regfile srch back: ".nl)
9042 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009043 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009044 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
9045" call Decho("regfile srch fwd: ".nl)
9046 endif
9047
9048 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009049 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009050 let curline= line(".")
9051 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
9052" call Decho("dir srch back ind: ".nl)
9053 if nl != 0
9054 if line(".") == curline-1
9055 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
9056" call Decho("dir srch back ind-1: ".nl)
9057 endif
9058 endif
9059
9060 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009061 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009062 let curline = line(".")
9063 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
9064" call Decho("dir srch fwd ind: ".nl)
9065 if nl != 0
9066 if line(".") == curline+1
9067 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
9068" call Decho("dir srch fwd ind-1: ".nl)
9069 endif
9070 endif
9071
9072 endif
9073
9074" call Dret("s:TreeListMove")
9075endfun
9076
9077" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009078" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
9079" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
9080" can't be called except via emenu. But due to locale, that menu line may not be called
9081" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
9082fun! s:UpdateBuffersMenu()
9083" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009084 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009085 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02009086 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009087 catch /^Vim\%((\a\+)\)\=:E/
9088 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02009089 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00009090 endtry
9091 endif
9092" call Dret("s:UpdateBuffersMenu")
9093endfun
9094
9095" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009096" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02009097" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009098fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009099" call Dfunc("s:UseBufWinVars()")
9100 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009101 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
9102 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
9103 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
9104 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
9105 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
9106 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9107 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9108 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
9109 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 +00009110" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009111endfun
9112
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009113" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01009114" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
9115fun! netrw#WinPath(path)
9116" call Dfunc("netrw#WinPath(path<".a:path.">)")
9117 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
9118 " remove cygdrive prefix, if present
9119 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00009120 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009121 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00009122 " remove escaped spaces
9123 let path = substitute(path, '\ ', ' ', 'g')
9124 " convert slashes to backslashes
9125 let path = substitute(path, '/', '\', 'g')
9126 else
9127 let path= a:path
9128 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009129" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009130 return path
9131endfun
9132
9133" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00009134" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00009135let &cpo= s:keepcpo
9136unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00009137
Bram Moolenaar071d4272004-06-13 20:20:40 +00009138" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00009139" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00009140" vim:ts=8 fdm=marker