blob: 2700a8c825fd17ba456daeab2e1b6b089fc860c4 [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
Bram Moolenaar15146672011-10-20 22:22:38 +0200327call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200328if exists("g:netrw_local_movecmd")
329 let g:netrw_localmovecmd= g:netrw_local_movecmd"
330 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
331endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000332if !exists("g:netrw_localmovecmd")
333 if has("win32") || has("win95") || has("win64") || has("win16")
334 if g:netrw_cygwin
335 let g:netrw_localmovecmd= "mv"
336 else
337 let g:netrw_localmovecmd= "move"
338 endif
339 elseif has("unix") || has("macunix")
340 let g:netrw_localmovecmd= "mv"
341 else
342 let g:netrw_localmovecmd= ""
343 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200344 if !executable(g:netrw_localmkdir)
345 call netrw#ErrorMsg(s:NOTE,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",81)
346 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000347endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200348call s:NetrwInit("g:netrw_localrmdir", "rmdir")
349if exists("g:netrw_local_rmdir")
350 let g:netrw_localrmdir= g:netrw_local_rmdir"
351 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
352endif
353if !executable(g:netrw_localrmdir)
354 call netrw#ErrorMsg(s:NOTE,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",82)
355endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100356call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
357" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000358if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000359 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000360endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000361if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000362 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
363endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000364" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100365call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
366call s:NetrwInit("g:netrw_maxfilenamelen", 32)
367call s:NetrwInit("g:netrw_menu" , 1)
368call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
369call s:NetrwInit("g:netrw_mousemaps" , (exists("&mouse") && &mouse =~ '[anh]'))
370call s:NetrwInit("g:netrw_retmap" , 0)
371if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
372 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
373elseif has("win32") || has("win95") || has("win64") || has("win16")
374 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
375else
376 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000377endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100378call s:NetrwInit("g:netrw_preview" , 0)
379call s:NetrwInit("g:netrw_scpport" , "-P")
380call s:NetrwInit("g:netrw_sshport" , "-p")
381call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
382call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
383call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
384call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000385" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100386" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
387call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200388call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100389call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
390call s:NetrwInit("g:netrw_sort_options" , "")
391call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000392if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100393 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200394 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100395 else
396 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000397 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000398endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100399call s:NetrwInit("g:netrw_special_syntax" , 0)
400call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
401call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000402" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100403call s:NetrwInit("g:netrw_timefmt","%c")
404call s:NetrwInit("g:netrw_xstrlen",0)
405call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100406call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200407call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200408if g:netrw_winsize == 0|let g:netrw_winsize= -1|endif
409if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000410" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000411" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100412call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200413if has("win32") || has("win95") || has("win64") || has("win16")
414 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{$')
415else
416 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$\')
417endif
418call s:NetrwInit("g:netrw_menu_escape",'./&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100419call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
420call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000421
422" BufEnter event ignored by decho when following variable is true
423" Has a side effect that doau BufReadPost doesn't work, so
424" files read by network transfer aren't appropriately highlighted.
425"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426
Bram Moolenaaradc21822011-04-01 18:03:16 +0200427" ======================
428" Netrw Initialization: {{{1
429" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200430if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
431 let s:initbeval = &beval
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200432" let s:initbexpr = &l:bexpr
Bram Moolenaar15146672011-10-20 22:22:38 +0200433 let &l:bexpr = "netrw#NetrwBalloonHelp()"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200434 set beval
Bram Moolenaar15146672011-10-20 22:22:38 +0200435 au BufWinEnter,WinEnter * if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200436endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200437au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200438
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000439" ==============================
440" Netrw Utility Functions: {{{1
441" ==============================
442
Bram Moolenaaradc21822011-04-01 18:03:16 +0200443" ---------------------------------------------------------------------
444" netrw#NetrwBalloonHelp: {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +0200445if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200446 fun! netrw#NetrwBalloonHelp()
Bram Moolenaar15146672011-10-20 22:22:38 +0200447 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 +0200448 let mesg= ""
449 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
Bram Moolenaar15146672011-10-20 22:22:38 +0200450 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 +0200451 elseif getline(v:beval_lnum) =~ '^"\s*/'
452 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
453 elseif v:beval_text == "Sorted" || v:beval_text == "by"
454 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
455 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
456 let mesg = "S: edit sorting sequence"
457 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
458 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
459 elseif v:beval_text == "Quick" || v:beval_text == "Help"
460 let mesg = "Help: press <F1>"
461 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
462 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
463 else
464 let mesg= ""
465 endif
466 return mesg
467 endfun
468endif
469
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000471" s:NetrwOptionSave: save options and set to "standard" form {{{2
472" 06/08/07 : removed call to NetrwSafeOptions(), either placed
473" immediately after NetrwOptionSave() calls in NetRead
474" and NetWrite, or after the s:NetrwEnew() call in
475" NetrwBrowse.
476" vt: normally its "w:" or "s:" (a variable type)
477fun! s:NetrwOptionSave(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100478" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000479" 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 +0200480
Bram Moolenaar446cb832008-06-24 21:56:24 +0000481 if !exists("{a:vt}netrw_optionsave")
482 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000483 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000484" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000485 return
486 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200487" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000488
489 " Save current settings and current directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200490" call Decho("saving current settings and current directory")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000491 let s:yykeep = @@
Bram Moolenaar15146672011-10-20 22:22:38 +0200492 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000493 let {a:vt}netrw_aikeep = &l:ai
494 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar15146672011-10-20 22:22:38 +0200495 let {a:vt}netrw_bhkeep = &l:bh
496 let {a:vt}netrw_blkeep = &l:bl
497 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200498 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaar446cb832008-06-24 21:56:24 +0000499 let {a:vt}netrw_cikeep = &l:ci
500 let {a:vt}netrw_cinkeep = &l:cin
501 let {a:vt}netrw_cinokeep = &l:cino
502 let {a:vt}netrw_comkeep = &l:com
503 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200504 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar15146672011-10-20 22:22:38 +0200505 let {a:vt}netrw_fenkeep = &l:fen
506 let {a:vt}netrw_ffkeep = &l:ff
Bram Moolenaar446cb832008-06-24 21:56:24 +0000507 let {a:vt}netrw_fokeep = &l:fo " formatoptions
508 let {a:vt}netrw_gdkeep = &l:gd " gdefault
509 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200510 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar15146672011-10-20 22:22:38 +0200511 let {a:vt}netrw_iskkeep = &l:isk
512 let {a:vt}netrw_lskeep = &l:ls
513 let {a:vt}netrw_makeep = &l:ma
Bram Moolenaar446cb832008-06-24 21:56:24 +0000514 let {a:vt}netrw_magickeep = &l:magic
Bram Moolenaar15146672011-10-20 22:22:38 +0200515 let {a:vt}netrw_modkeep = &l:mod
516 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar446cb832008-06-24 21:56:24 +0000517 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar15146672011-10-20 22:22:38 +0200518 let {a:vt}netrw_rokeep = &l:ro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200519 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000520 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar15146672011-10-20 22:22:38 +0200521 let {a:vt}netrw_tskeep = &l:ts
Bram Moolenaar446cb832008-06-24 21:56:24 +0000522 let {a:vt}netrw_twkeep = &l:tw " textwidth
523 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar15146672011-10-20 22:22:38 +0200524 let {a:vt}netrw_wrapkeep = &l:wrap
525 let {a:vt}netrw_writekeep = &l:write
526 if g:netrw_use_noswf && has("win32") && !has("win95")
527 let {a:vt}netrw_swfkeep = &l:swf
528 endif
529
530 " save a few selected netrw-related variables
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200531" call Decho("saving a few selected netrw-related variables")
Bram Moolenaar15146672011-10-20 22:22:38 +0200532 if g:netrw_keepdir
533 let {a:vt}netrw_dirkeep = getcwd()
534 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000535 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000536 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000537 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200538 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
539 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000540
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200541" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000542endfun
543
544" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000545" s:NetrwOptionRestore: restore options {{{2
546fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200547" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000548 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar15146672011-10-20 22:22:38 +0200549 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200550" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200551 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200552" call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
553" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
554 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200555 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200556" call Decho("(NetrwOptionRestore) no previous position")
Bram Moolenaar15146672011-10-20 22:22:38 +0200557 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200558" 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 +0000559" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000560 return
561 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000562 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000563
564 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000565 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200566" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000567 let curdir = getcwd()
568 let &l:acd = {a:vt}netrw_acdkeep
569 unlet {a:vt}netrw_acdkeep
570 if &l:acd
Bram Moolenaar15146672011-10-20 22:22:38 +0200571" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
Bram Moolenaar446cb832008-06-24 21:56:24 +0000572 try
573 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200574 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000575 endif
576 catch /^Vim\%((\a\+)\)\=:E472/
577 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
578 endtry
579 endif
580 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000581 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000582 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
583 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 +0200584 if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif
585 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
586 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 +0200587 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 +0000588 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
589 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
590 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
591 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
592 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 +0200593 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 +0200594 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
595 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 +0000596 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
597 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
598 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 +0200599 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 +0200600 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
601 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
602 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
603 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
604 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
605 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 +0000606 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 +0200607 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 +0200608 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 +0000609 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 +0200610 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 +0000611 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
612 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 +0200613 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
614 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 +0000615 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
616 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000617 if &directory == ""
618 " user hasn't specified a swapfile directory;
619 " netrw will temporarily set the swapfile directory
620 " to the current directory as returned by getcwd().
621 let &l:directory = getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200622 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000623 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000624 unlet {a:vt}netrw_swfkeep
625 elseif &l:swf != {a:vt}netrw_swfkeep
626 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200627 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000628 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000629 endif
630 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200631 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
632 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
633 if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
634 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200635 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
636 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 +0200637 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200638" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200639 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200640" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
641 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200642 else
643" call Decho("no previous position")
644 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000645
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200646" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
647" call Decho("(NetrwOptionRestore) fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
648" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
649" call Decho("(NetrwOptionRestore) diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"))
650" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000651endfun
652
653" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000654" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000655fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100656" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
657" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaar15146672011-10-20 22:22:38 +0200658 if exists("&acd") | setlocal noacd | endif
659 setlocal noai
660 setlocal noaw
661 setlocal nobomb
662 setlocal noci
663 setlocal nocin
Bram Moolenaar9964e462007-05-05 17:54:07 +0000664 setlocal cino=
665 setlocal com=
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200666 setlocal cpo-=a
667 setlocal cpo-=A
Bram Moolenaar446cb832008-06-24 21:56:24 +0000668 setlocal fo=nroql2
Bram Moolenaar15146672011-10-20 22:22:38 +0200669 setlocal nohid
670 setlocal noim
Bram Moolenaar5c736222010-01-06 20:54:52 +0100671 setlocal isk+=@ isk+=* isk+=/
Bram Moolenaar15146672011-10-20 22:22:38 +0200672 setlocal magic
673 setlocal report=10000
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200674 setlocal sel=inclusive
Bram Moolenaar15146672011-10-20 22:22:38 +0200675 setlocal nospell
676 setlocal tw=0
677 setlocal wig=
Bram Moolenaar9964e462007-05-05 17:54:07 +0000678 if g:netrw_use_noswf && has("win32") && !has("win95")
679 setlocal noswf
680 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200681 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100682
683 " allow the user to override safe options
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200684" call Decho("ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100685 if &ft == "netrw"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200686" call Decho("do any netrw FileType autocmds")
Bram Moolenaar15146672011-10-20 22:22:38 +0200687 sil! keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100688 endif
689
Bram Moolenaar446cb832008-06-24 21:56:24 +0000690" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000691" call Dret("s:NetrwSafeOptions")
692endfun
693
Bram Moolenaar446cb832008-06-24 21:56:24 +0000694" ---------------------------------------------------------------------
695" netrw#NetrwClean: remove netrw {{{2
696" supports :NetrwClean -- remove netrw from first directory on runtimepath
697" :NetrwClean! -- remove netrw from all directories on runtimepath
698fun! netrw#NetrwClean(sys)
699" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
700
701 if a:sys
702 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
703 else
704 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
705 endif
706" call Decho("choice=".choice)
707 let diddel= 0
708 let diddir= ""
709
710 if choice == 1
711 for dir in split(&rtp,',')
712 if filereadable(dir."/plugin/netrwPlugin.vim")
713" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000714 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
715 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
716 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
717 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
718 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
719 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 +0000720 let diddir= dir
721 let diddel= diddel + 1
722 if !a:sys|break|endif
723 endif
724 endfor
725 endif
726
727 echohl WarningMsg
728 if diddel == 0
729 echomsg "netrw is either not installed or not removable"
730 elseif diddel == 1
731 echomsg "removed one copy of netrw from <".diddir.">"
732 else
733 echomsg "removed ".diddel." copies of netrw"
734 endif
735 echohl None
736
737" call Dret("netrw#NetrwClean")
738endfun
739
Bram Moolenaar5c736222010-01-06 20:54:52 +0100740" ---------------------------------------------------------------------
741" netrw#Nread: {{{2
742fun! netrw#Nread(mode,fname)
743" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
744 call netrw#NetrwSavePosn()
745 call netrw#NetRead(a:mode,a:fname)
746 call netrw#NetrwRestorePosn()
747" call Dret("netrw#Nread")
748endfun
749
Bram Moolenaar9964e462007-05-05 17:54:07 +0000750" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000751" Netrw Transfer Functions: {{{1
752" ===============================
753
Bram Moolenaar071d4272004-06-13 20:20:40 +0000754" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000755" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000756" mode: =0 read remote file and insert before current line
757" =1 read remote file and insert after current line
758" =2 replace with remote file
759" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000760fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000761" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000762
Bram Moolenaar5c736222010-01-06 20:54:52 +0100763 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000764 call s:NetrwOptionSave("w:")
765 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200766 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000767
Bram Moolenaar5c736222010-01-06 20:54:52 +0100768 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000769 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000770 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000771 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000772 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000773 elseif a:mode == 2 " replace with remote file
774 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000775 elseif a:mode == 3 " skip read of file (leave as temporary)
776 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000777 else
778 exe a:mode
779 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000781 let ichoice = (a:0 == 0)? 0 : 1
782" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
783
Bram Moolenaar5c736222010-01-06 20:54:52 +0100784 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000785 let tmpfile= s:GetTempfile("")
786 if tmpfile == ""
787" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000788 return
789 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000790
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000791 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000792
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000793 " attempt to repeat with previous host-file-etc
794 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000795" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000796 let choice = b:netrw_lastfile
797 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000798
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000799 else
800 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000801" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000802
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000803 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000804 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000805 echomsg 'NetRead Usage:'
806 echomsg ':Nread machine:path uses rcp'
807 echomsg ':Nread "machine path" uses ftp with <.netrc>'
808 echomsg ':Nread "machine id password path" uses ftp'
809 echomsg ':Nread dav://machine[:port]/path uses cadaver'
810 echomsg ':Nread fetch://machine/path uses fetch'
811 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
812 echomsg ':Nread http://[user@]machine/path uses http wget'
813 echomsg ':Nread rcp://[user@]machine/path uses rcp'
814 echomsg ':Nread rsync://machine[:port]/path uses rsync'
815 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
816 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000817 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000819
Bram Moolenaar9964e462007-05-05 17:54:07 +0000820 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000821 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000822" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000823 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000824 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +0200825 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000826 else
827 " case "... ... ..."
828 let choice = strpart(choice,1,strlen(choice)-1)
829 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000830
Bram Moolenaar9964e462007-05-05 17:54:07 +0000831 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000832 let wholechoice = wholechoice . " " . choice
833 let ichoice = ichoice + 1
834 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000835 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000836 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000837 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000838" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000839 return
840 endif
841 let choice= a:{ichoice}
842 endwhile
843 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
844 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000845 endif
846 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000847
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000848" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000849 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000850
Bram Moolenaar5c736222010-01-06 20:54:52 +0100851 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000852 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100853 if !exists("b:netrw_method") || b:netrw_method < 0
854" call Dfunc("netrw#NetRead : unsupported method")
855 return
856 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000857 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000858
Bram Moolenaar446cb832008-06-24 21:56:24 +0000859 " Check if NetrwBrowse() should be handling this request
860" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +0200861 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000862" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200863 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000864" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000866 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000867
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000868 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +0100869 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000870 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000871 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
872 echo "(netrw) Processing your read request..."
873 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000874
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000875 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100876 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000877 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000878" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000879 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000880 " ER: on Win2K" rcp machine[.user]:file tmpfile
881 " ER: if machine contains '.' adding .user is required (use $USERNAME)
882 " ER: the tmpfile is full path: rcp sees C:\... as host C
883 if s:netrw_has_nt_rcp == 1
884 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
885 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
886 else
887 " Any way needed it machine contains a '.'
888 let uid_machine = g:netrw_machine .'.'. $USERNAME
889 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000890 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000891 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
892 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
893 else
894 let uid_machine = g:netrw_machine
895 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000896 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000897" 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 +0100898 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 +0000899 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000901
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000902 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100903 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000904 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000905" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000906 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +0200907 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000908 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000909 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200910 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000911" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000912 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200913 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000914" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000915 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000916 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
917" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000918 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +0200919" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
920 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 +0000921 else
Bram Moolenaaradc21822011-04-01 18:03:16 +0200922" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
923 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 endif
925 " 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 +0000926 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000927 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000928 setlocal debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +0200929 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000930 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000931 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000932 call s:SaveBufVars()
933 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +0100934 if bufname("%") == "" && getline("$") == "" && line('$') == 1
935 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000936 q!
937 endif
938 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000939 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000940 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000941
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000942 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100943 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000944 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
945 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000946" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000947 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200948 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000949 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000950 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000951 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200952 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000953" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200955 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000956" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000958
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200959 if exists("g:netrw_uid" && g:netrw_uid != ""
960 if exists("g:netrw_ftp") && g:netrw_ftp == 1
961 keepj put =g:netrw_uid
962" call Decho("filter input: ".getline('.'))
963 if exists("s:netrw_passwd")
964 keepj put ='\"'.s:netrw_passwd.'\"'
965 endif
966" call Decho("filter input: ".getline('.'))
967 elseif exists("s:netrw_passwd")
968 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
969" call Decho("filter input: ".getline('.'))
970 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000971 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000972
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000973 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200974 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000975" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000977 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200978 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000979" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000980 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200981 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000982" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000984 " perform ftp:
985 " -i : turns off interactive prompting from ftp
986 " -n unix : DON'T use <.netrc>, even though it exists
987 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +0200988 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200989" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
990 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
992 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000993" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000994 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000995 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000996 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000997 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000998 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
999 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001000 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001001
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001002 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001003 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001005" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00001007 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001008 else
1009 let useport= ""
1010 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001011" 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 +00001012 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 +00001013 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001015
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001016 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001017 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001018 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001019" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001020 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001021 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001022 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001023 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001024" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001025 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001026 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001027
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001028 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
1029 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001030" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001031 if exists("g:netrw_http_xcmd")
1032" 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))
1033 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 else
1035" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
1036 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
1037 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001038 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001039
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001040 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001041 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001042" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001043 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
1044 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001045" call Decho("netrw_html<".netrw_html.">")
1046" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001047" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
1048 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 +00001049 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001050" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001051 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001052 endif
1053 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001054" call Decho("(NetRead) setl ro")
1055 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001056
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001057 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001058 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001059 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001060" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001061
Bram Moolenaar5c736222010-01-06 20:54:52 +01001062 if !executable(g:netrw_dav_cmd)
1063 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
1064" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
1065 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001066 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001067 if g:netrw_dav_cmd =~ "curl"
1068" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
1069 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
1070 else
1071 " Construct execution string (four lines) which will be passed through filter
1072 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1073 new
1074 setlocal ff=unix
1075 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001076 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01001077 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001078 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01001079 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001080 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
1081 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
1082 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001083 keepj put ='get '.netrw_fname.' '.tmpfile
1084 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001085
Bram Moolenaar5c736222010-01-06 20:54:52 +01001086 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001087 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001088" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001089 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1090 bd!
1091 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001092 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001093 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001094
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001095 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001096 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001097 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001098" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001099" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1100 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 +00001101 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001102 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001103
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001104 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001105 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001106 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001107 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +00001108" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001109 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001110 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001111 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001112 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001113" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001114 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001115 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02001116 if exists("g:netrw_option") && g:netrw_option == ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001117 let netrw_option= "http"
1118 else
1119 let netrw_option= "ftp"
1120 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001121" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001122
Bram Moolenaar446cb832008-06-24 21:56:24 +00001123 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001124" 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))
1125 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 +00001126 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00001127" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
1128 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 +00001129 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001130
Bram Moolenaar446cb832008-06-24 21:56:24 +00001131 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001132 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001133" call Decho("(NetRead) setl ro")
1134 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001135
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001137 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001138 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001139" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001140" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1141 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001142 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001143 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001144
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001145 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001146 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001147 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001148 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001149 endif
1150 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001151
Bram Moolenaar5c736222010-01-06 20:54:52 +01001152 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001153 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001154" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001155 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001156 unlet b:netrw_fname
1157 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001158 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 +00001159" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001160 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001161 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001162 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001163
Bram Moolenaar9964e462007-05-05 17:54:07 +00001164" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001165endfun
1166
1167" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001168" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001169fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00001170" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001171
Bram Moolenaar5c736222010-01-06 20:54:52 +01001172 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001174 call s:NetrwOptionSave("w:")
1175 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001176
Bram Moolenaar5c736222010-01-06 20:54:52 +01001177 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001178 let tmpfile= s:GetTempfile("")
1179 if tmpfile == ""
1180" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001181 return
1182 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001183
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001184 if a:0 == 0
1185 let ichoice = 0
1186 else
1187 let ichoice = 1
1188 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001189
Bram Moolenaar9964e462007-05-05 17:54:07 +00001190 let curbufname= expand("%")
1191" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001192 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00001193 " For binary writes, always write entire file.
1194 " (line numbers don't really make sense for that).
1195 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02001196" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1197 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001198 elseif g:netrw_cygwin
1199 " write (selected portion of) file to temporary
1200 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001201" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001202 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001203 else
1204 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02001205" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001206 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001207 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001208
Bram Moolenaar9964e462007-05-05 17:54:07 +00001209 if curbufname == ""
1210 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1211 " on the temporary file's name. Deletion of the temporary file during
1212 " cleanup then causes an error message.
1213 0file!
1214 endif
1215
Bram Moolenaar5c736222010-01-06 20:54:52 +01001216 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001217 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001218
Bram Moolenaar9964e462007-05-05 17:54:07 +00001219 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001220 " attempt to repeat with previous host-file-etc
1221 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001222" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001223 let choice = b:netrw_lastfile
1224 let ichoice= ichoice + 1
1225 else
1226 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001227
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001228 " Reconstruct Choice if choice starts with '"'
1229 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001230 echomsg 'NetWrite Usage:"'
1231 echomsg ':Nwrite machine:path uses rcp'
1232 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1233 echomsg ':Nwrite "machine id password path" uses ftp'
1234 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1235 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1236 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1237 echomsg ':Nwrite rcp://machine/path uses rcp'
1238 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1239 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1240 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001241 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001242 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001243
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001244 elseif match(choice,"^\"") != -1
1245 if match(choice,"\"$") != -1
1246 " case "..."
1247 let choice=strpart(choice,1,strlen(choice)-2)
1248 else
1249 " case "... ... ..."
1250 let choice = strpart(choice,1,strlen(choice)-1)
1251 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001252
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001253 while match(choice,"\"$") == -1
1254 let wholechoice= wholechoice . " " . choice
1255 let ichoice = ichoice + 1
1256 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001257 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001258 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001259 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001260" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001261 return
1262 endif
1263 let choice= a:{ichoice}
1264 endwhile
1265 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1266 endif
1267 endif
1268 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001269 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001270" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001271
Bram Moolenaar9964e462007-05-05 17:54:07 +00001272 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02001273 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001274 if !exists("b:netrw_method") || b:netrw_method < 0
1275" call Dfunc("netrw#NetWrite : unsupported method")
1276 return
1277 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001278
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001279 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001280 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001281 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001282 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1283 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001284" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001285 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001286
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001287 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001288 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001289 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001290" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001291 if s:netrw_has_nt_rcp == 1
1292 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1293 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1294 else
1295 let uid_machine = g:netrw_machine .'.'. $USERNAME
1296 endif
1297 else
1298 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1299 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1300 else
1301 let uid_machine = g:netrw_machine
1302 endif
1303 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001304" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1305 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 +00001306 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001307
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001308 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001309 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001310 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001311" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001312 let netrw_fname = b:netrw_fname
1313
1314 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1315 let bhkeep = &l:bh
1316 let curbuf = bufnr("%")
1317 setlocal bh=hide
1318 enew
1319
Bram Moolenaar446cb832008-06-24 21:56:24 +00001320" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001321 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001322 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001323" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001324 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001325 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001326" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001327 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001328 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001329" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001330 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001331" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1332 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 +00001333 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001334" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02001335" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1336 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001337 endif
1338 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1339 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001340 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001341 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001342 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001343 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001344 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001345
1346 " remove enew buffer (quietly)
1347 let filtbuf= bufnr("%")
1348 exe curbuf."b!"
1349 let &l:bh = bhkeep
1350 exe filtbuf."bw!"
1351
Bram Moolenaar071d4272004-06-13 20:20:40 +00001352 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001353
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001354 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001355 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001356 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001357 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00001358" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001359 let netrw_fname = b:netrw_fname
1360 let bhkeep = &l:bh
1361
1362 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1363 let curbuf = bufnr("%")
1364 setlocal bh=hide
1365 enew
Bram Moolenaar8299df92004-07-10 09:47:34 +00001366 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001367
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001368 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001369 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001370" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001371 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001372 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001373" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001374 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001375 if exists("g:netrw_uid") && g:netrw_uid != ""
1376 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1377 keepj put =g:netrw_uid
1378" call Decho("filter input: ".getline('.'))
1379 if exists("s:netrw_passwd") && s:netrw_passwd != ""
1380 keepj put ='\"'.s:netrw_passwd.'\"'
1381 endif
1382" call Decho("filter input: ".getline('.'))
1383 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
1384 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1385" call Decho("filter input: ".getline('.'))
1386 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001388 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01001389" call Decho("filter input: ".getline('$'))
1390 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001391 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001392" call Decho("filter input: ".getline("$"))
1393 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001394 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001395" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001396 " save choice/id/password for future use
1397 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001399 " perform ftp:
1400 " -i : turns off interactive prompting from ftp
1401 " -n unix : DON'T use <.netrc>, even though it exists
1402 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001403 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001404" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1405 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001406 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1407 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001408 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001409 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001410 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001411 let mod=1
1412 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001413
1414 " remove enew buffer (quietly)
1415 let filtbuf= bufnr("%")
1416 exe curbuf."b!"
1417 let &l:bh= bhkeep
1418 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001419
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001420 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001421 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001422 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001423" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001424 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001425 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001426 else
1427 let useport= ""
1428 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001429" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1430 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 +00001431 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001432
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001433 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001434 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001435 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001436" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001437 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001438 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001439 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001440
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001441 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001442 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001443 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001444" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001445
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001446 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01001447 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
1448 let bhkeep = &l:bh
1449
1450 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1451 let curbuf = bufnr("%")
1452 setlocal bh=hide
1453 enew
1454
Bram Moolenaar8299df92004-07-10 09:47:34 +00001455 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001456 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001457 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001458 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001459 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001460 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001461 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001462 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001463 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001464 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001465
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001466 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001467 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001468" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001469 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001470
1471 " remove enew buffer (quietly)
1472 let filtbuf= bufnr("%")
1473 exe curbuf."b!"
1474 let &l:bh = bhkeep
1475 exe filtbuf."bw!"
1476
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001477 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001478
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001479 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001480 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001481 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001482" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001483" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1484 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 +00001485 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001486
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001487 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001488 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001489 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001490" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001491 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001492 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1493 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1494 else
1495 let uid_machine = g:netrw_machine
1496 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001497
1498 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1499 let bhkeep = &l:bh
1500 let curbuf = bufnr("%")
1501 setlocal bh=hide
1502 enew
1503
Bram Moolenaar8299df92004-07-10 09:47:34 +00001504 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001505 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001506" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001507" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1508 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001509 let filtbuf= bufnr("%")
1510 exe curbuf."b!"
1511 let &l:bh = bhkeep
1512 exe filtbuf."bw!"
1513 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001514
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001515 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001516 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001517 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001518 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001519 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001520 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001521 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001522
Bram Moolenaar5c736222010-01-06 20:54:52 +01001523 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001524" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001525 if s:FileReadable(tmpfile)
1526" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001527 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001528 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001529 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001530
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001531 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001532 " restore modifiability; usually equivalent to set nomod
1533 let &mod= mod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001534" 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 +02001535 elseif !exists("leavemod")
1536 " indicate that the buffer has not been modified since last written
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001537" call Decho("(NetWrite) set nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001538 set nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001539" 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 +00001540 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001541
Bram Moolenaar9964e462007-05-05 17:54:07 +00001542" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001543endfun
1544
1545" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001546" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001547" uses NetRead to get a copy of the file into a temporarily file,
1548" then sources that file,
1549" then removes that file.
1550fun! netrw#NetSource(...)
1551" call Dfunc("netrw#NetSource() a:0=".a:0)
1552 if a:0 > 0 && a:1 == '?'
1553 " give help
1554 echomsg 'NetSource Usage:'
1555 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1556 echomsg ':Nsource fetch://machine/path uses fetch'
1557 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02001558 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001559 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1560 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1561 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1562 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1563 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001564 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001565 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001566 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001567 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001568" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001569 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001570" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1571 exe "so ".fnameescape(s:netrw_tmpfile)
1572" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001573 call delete(s:netrw_tmpfile)
1574 unlet s:netrw_tmpfile
1575 else
1576 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1577 endif
1578 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001579 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001580 endif
1581" call Dret("netrw#NetSource")
1582endfun
1583
1584" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001585" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001586" readcmd == %r : replace buffer with newly read file
1587" == 0r : read file at top of buffer
1588" == r : read file after current line
1589" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001590fun! s:NetrwGetFile(readcmd, tfile, method)
1591" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001592
1593 " readcmd=='t': simply do nothing
1594 if a:readcmd == 't'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001595" 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 +00001596" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001597 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001598 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001599
Bram Moolenaar9964e462007-05-05 17:54:07 +00001600 " get name of remote filename (ie. url and all)
1601 let rfile= bufname("%")
1602" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001603
Bram Moolenaar9964e462007-05-05 17:54:07 +00001604 if exists("*NetReadFixup")
1605 " for the use of NetReadFixup (not otherwise used internally)
1606 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001607 endif
1608
Bram Moolenaar9964e462007-05-05 17:54:07 +00001609 if a:readcmd[0] == '%'
1610 " get file into buffer
1611" call Decho("get file into buffer")
1612
1613 " rename the current buffer to the temp file (ie. tfile)
1614 if g:netrw_cygwin
1615 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1616 else
1617 let tfile= a:tfile
1618 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001619" call Decho("exe sil! keepalt file ".fnameescape(tfile))
1620 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001621
1622 " edit temporary file (ie. read the temporary file in)
1623 if rfile =~ '\.zip$'
1624" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1625 call zip#Browse(tfile)
1626 elseif rfile =~ '\.tar$'
1627" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1628 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001629 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001630" call Decho("handling remote gzip-compressed tar file")
1631 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001632 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001633" call Decho("handling remote bz2-compressed tar file")
1634 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001635 elseif rfile =~ '\.tar\.xz$'
1636" call Decho("handling remote xz-compressed tar file")
1637 call tar#Browse(tfile)
1638 elseif rfile =~ '\.txz$'
1639" call Decho("handling remote xz-compressed tar file (.txz)")
1640 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001641 else
1642" call Decho("edit temporary file")
1643 e!
1644 endif
1645
1646 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001647" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02001648 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001649
1650 " detect filetype of local version of remote file
1651 " Note that isk must not include a "/" for scripts.vim
1652 " to process this detection correctly.
1653" call Decho("detect filetype of local version of remote file")
1654 let iskkeep= &isk
1655 set isk-=/
Bram Moolenaar5c736222010-01-06 20:54:52 +01001656 filetype detect
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001657 let &isk= iskkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00001658" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1659 let line1 = 1
1660 let line2 = line("$")
1661
1662 elseif s:FileReadable(a:tfile)
1663 " read file after current line
1664" call Decho("read file<".a:tfile."> after current line")
1665 let curline = line(".")
1666 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001667" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001668 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001669 let line1= curline + 1
1670 let line2= line("$") - lastline + 1
1671
1672 else
1673 " not readable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001674" 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 +00001675" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001676 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001677" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001678 return
1679 endif
1680
1681 " User-provided (ie. optional) fix-it-up command
1682 if exists("*NetReadFixup")
1683" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001684 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001685" else " Decho
1686" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1687 endif
1688
Bram Moolenaaradc21822011-04-01 18:03:16 +02001689 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00001690 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02001691 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001692 endif
1693
1694" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1695
1696 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001697" redraw!
1698
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001699" 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 +00001700" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001701endfun
1702
Bram Moolenaar9964e462007-05-05 17:54:07 +00001703" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001704" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01001705" Input:
1706" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
1707" Output:
1708" b:netrw_method= 1: rcp
1709" 2: ftp + <.netrc>
1710" 3: ftp + machine, id, password, and [path]filename
1711" 4: scp
Bram Moolenaar15146672011-10-20 22:22:38 +02001712" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001713" 6: dav
1714" 7: rsync
1715" 8: fetch
1716" 9: sftp
1717" g:netrw_machine= hostname
1718" b:netrw_fname = filename
1719" g:netrw_port = optional port number (for ftp)
1720" g:netrw_choice = copy of input url (choice)
1721fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001722" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001723
Bram Moolenaar251e1912011-06-19 05:09:16 +02001724 " sanity check: choice should have at least three slashes in it
1725 if strlen(substitute(a:choice,'[^/]','','g')) < 3
1726 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
1727 let b:netrw_method = -1
1728" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
1729 return
1730 endif
1731
Bram Moolenaar5c736222010-01-06 20:54:52 +01001732 " record current g:netrw_machine, if any
1733 " curmachine used if protocol == ftp and no .netrc
1734 if exists("g:netrw_machine")
1735 let curmachine= g:netrw_machine
1736" call Decho("curmachine<".curmachine.">")
1737 else
1738 let curmachine= "N O T A HOST"
1739 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001740 if exists("g:netrw_port")
1741 let netrw_port= g:netrw_port
1742 endif
1743
1744 " insure that netrw_ftp_cmd starts off every method determination
1745 " with the current g:netrw_ftp_cmd
1746 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001747
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001748 " initialization
1749 let b:netrw_method = 0
1750 let g:netrw_machine = ""
1751 let b:netrw_fname = ""
1752 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001753 let g:netrw_choice = a:choice
1754
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001755 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001756 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001757 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1758 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001759 " rcpurm : rcp://[user@]host/filename Use rcp
1760 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001761 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02001762 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01001763 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001764 " rsyncurm : rsync://host[:port]/path Use rsync
1765 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1766 " sftpurm : sftp://[user@]host/filename Use scp
1767 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1768 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001769" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1770" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1771" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1772 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1773 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001774 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001775 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001776 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001777 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001778 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001779 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001780 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001781
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001782" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001783 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02001784 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001785 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001786" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001787 let b:netrw_method = 1
1788 let userid = substitute(a:choice,rcpurm,'\1',"")
1789 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1790 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001791 if userid != ""
1792 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001793 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001794
Bram Moolenaaradc21822011-04-01 18:03:16 +02001795 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001796 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001797" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001798 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001799 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1800 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1801 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001802
Bram Moolenaar15146672011-10-20 22:22:38 +02001803 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001804 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001805" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001806 let b:netrw_method = 5
1807 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1808 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001809
Bram Moolenaaradc21822011-04-01 18:03:16 +02001810 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001811 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001812" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001813 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02001814 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001815 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1816 else
1817 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1818 endif
1819 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001820
Bram Moolenaaradc21822011-04-01 18:03:16 +02001821 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001822 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001823" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001824 let b:netrw_method = 7
1825 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1826 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001827
Bram Moolenaaradc21822011-04-01 18:03:16 +02001828 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001829 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001830" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001831 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001832 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1833 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1834 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001835" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001836 if userid != ""
1837 let g:netrw_uid= userid
1838 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001839
Bram Moolenaaradc21822011-04-01 18:03:16 +02001840 if curmachine != g:netrw_machine
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001841 if exists("s:netwr_hup[".g:netrw_machine."]")
1842 call NetUserPass("ftp:".g:netrw_machine)
1843 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001844 " if there's a change in hostname, require password re-entry
1845 unlet s:netrw_passwd
1846 endif
1847 if exists("netrw_port")
1848 unlet netrw_port
1849 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001850 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001851
Bram Moolenaar446cb832008-06-24 21:56:24 +00001852 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001853 let b:netrw_method = 3
1854 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001855 let host= substitute(g:netrw_machine,'\..*$','','')
1856 if exists("s:netrw_hup[host]")
1857 call NetUserPass("ftp:".host)
1858
1859 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02001860" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1861" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
1862 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
1863 let machine = substitute(g:netrw_machine,'\([^.]\+\)\.\S*','\1','')
1864 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',machine.".ftp",'')
1865" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1866 endif
1867 let b:netrw_method= 2
1868 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
1869" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001870 let b:netrw_method= 2
1871 else
1872 if !exists("g:netrw_uid") || g:netrw_uid == ""
1873 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001874 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001875 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001876 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001877 endif
1878 let b:netrw_method= 3
1879 endif
1880 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001881
Bram Moolenaaradc21822011-04-01 18:03:16 +02001882 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001883 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001884" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001885 let b:netrw_method = 8
1886 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1887 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1888 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1889 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001890
Bram Moolenaaradc21822011-04-01 18:03:16 +02001891 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001892 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001893" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001894 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001895 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1896 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001897 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001898 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001899 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001900
Bram Moolenaaradc21822011-04-01 18:03:16 +02001901 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001902 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001903" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001904 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001905 let b:netrw_method = 3
1906 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1907 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001908
Bram Moolenaar9964e462007-05-05 17:54:07 +00001909 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001910 let b:netrw_method = 2
1911 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1912 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1913 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001914
Bram Moolenaaradc21822011-04-01 18:03:16 +02001915 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001916 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001917" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001918 let b:netrw_method = 9
1919 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1920 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001921
Bram Moolenaaradc21822011-04-01 18:03:16 +02001922 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001923 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001924" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001925 let b:netrw_method = 1
1926 let userid = substitute(a:choice,rcphf,'\2',"")
1927 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1928 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001929" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1930" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1931" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1932" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001933 if userid != ""
1934 let g:netrw_uid= userid
1935 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001936
Bram Moolenaaradc21822011-04-01 18:03:16 +02001937 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001938 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001939 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001940 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001941 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001942 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001943 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001944 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00001945
Bram Moolenaar81695252004-12-29 20:58:21 +00001946 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001947 " remove any leading [:#] from port number
1948 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1949 elseif exists("netrw_port")
1950 " retain port number as implicit for subsequent ftp operations
1951 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00001952 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001953
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001954" call Decho("a:choice <".a:choice.">")
1955" call Decho("b:netrw_method <".b:netrw_method.">")
1956" call Decho("g:netrw_machine<".g:netrw_machine.">")
1957" call Decho("g:netrw_port <".g:netrw_port.">")
1958" if exists("g:netrw_uid") "Decho
1959" call Decho("g:netrw_uid <".g:netrw_uid.">")
1960" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001961" if exists("s:netrw_passwd") "Decho
1962" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001963" endif "Decho
1964" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001965" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001966endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001967
1968" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001969" NetReadFixup: this sort of function is typically written by the user {{{2
1970" to handle extra junk that their system's ftp dumps
1971" into the transfer. This function is provided as an
1972" example and as a fix for a Windows 95 problem: in my
1973" experience, win95's ftp always dumped four blank lines
1974" at the end of the transfer.
1975if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1976 fun! NetReadFixup(method, line1, line2)
1977" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001978
1979 " sanity checks -- attempt to convert inputs to integers
1980 let method = a:method + 0
1981 let line1 = a:line1 + 0
1982 let line2 = a:line2 + 0
1983 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
1984" call Dret("NetReadFixup")
1985 return
1986 endif
1987
Bram Moolenaar9964e462007-05-05 17:54:07 +00001988 if method == 3 " ftp (no <.netrc>)
1989 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001990 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001991 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01001992 call histdel("/",-1)
1993 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001994 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001995
Bram Moolenaar9964e462007-05-05 17:54:07 +00001996" call Dret("NetReadFixup")
1997 endfun
1998endif
1999
2000" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002001" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002002" Usage: :call NetUserPass() -- will prompt for userid and password
2003" :call NetUserPass("uid") -- will prompt for password
2004" :call NetUserPass("uid","password") -- sets global userid and password
2005" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
2006" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00002007fun! NetUserPass(...)
2008
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002009" call Dfunc("NetUserPass() a:0=".a:0)
2010
2011 if !exists('s:netrw_hup')
2012 let s:netrw_hup= {}
2013 endif
2014
Bram Moolenaar071d4272004-06-13 20:20:40 +00002015 if a:0 == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +00002016 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002017 " get uid via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00002018 let g:netrw_uid= input('Enter username: ')
2019 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002020 " get password via prompt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002021 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002022
2023 " set up hup database
2024 let host = substitute(g:netrw_machine,'\..*$','','')
2025 if !exists('s:netrw_hup[host]')
2026 let s:netrw_hup[host]= {}
2027 endif
2028 let s:netrw_hup[host].uid = g:netrw_uid
2029 let s:netrw_hup[host].passwd = s:netrw_passwd
2030
2031 elseif a:0 == 1
2032
2033 if a:1 =~ '^ftp:'
2034 " access userid and password from hup (host-user-passwd) dictionary
2035 let host = substitute(a:1,'^ftp:','','')
2036 let host = substitute(host,'\..*','','')
2037 if exists("s:netrw_hup[host]")
2038 let g:netrw_uid = s:netrw_hup[host].uid
2039 let s:netrw_passwd = s:netrw_hup[host].passwd
2040" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2041" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2042 else
2043 let g:netrw_uid = input("Enter UserId: ")
2044 let s:netrw_passwd = inputsecret("Enter Password: ")
2045 endif
2046 else
2047 " set userid, prompt for password
2048" call Decho("set g:netrw_uid= <".a:1.">")
2049 if exists("g:netrw_machine")
2050 let host= substitute(g:netrw_machine,'\..*$','','')
2051 endif
2052 let g:netrw_uid = a:1
2053 let s:netrw_passwd = inputsecret("Enter Password: ")
2054 endif
2055
2056" call Decho("host<".host.">")
2057 if exists("host")
2058 if !exists('s:netrw_hup[host]')
2059 let s:netrw_hup[host]= {}
2060 endif
2061 let s:netrw_hup[host].uid = g:netrw_uid
2062 let s:netrw_hup[host].passwd = s:netrw_passwd
2063 endif
2064
2065 elseif a:0 == 2
2066 let g:netrw_uid = a:1
2067 let s:netrw_passwd = a:2
2068
2069 elseif a:0 == 3
2070 " enter hostname, user-id, and password into the hup dictionary
2071 let host = substitute(a:1,'^\a\+:','','')
2072 let host = substitute(host,'\..*$','','')
2073 if !exists('s:netrw_hup[host]')
2074 let s:netrw_hup[host]= {}
2075 endif
2076 let s:netrw_hup[host].uid = a:2
2077 let s:netrw_hup[host].passwd = a:3
2078 let g:netrw_uid = s:netrw_hup[host].uid
2079 let s:netrw_passwd = s:netrw_hup[host].passwd
2080" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2081" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002082 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002083
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002084" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002085endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002086
Bram Moolenaar9964e462007-05-05 17:54:07 +00002087" ===========================================
2088" Shared Browsing Support: {{{1
2089" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00002090
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002091" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002092" s:NetrwMaps: {{{2
2093fun! s:NetrwMaps(islocal)
2094" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002095
2096 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
2097" call Decho("set up Rexplore command")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002098 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 +02002099 if g:netrw_mousemaps && g:netrw_retmap
2100" call Decho("set up Rexplore 2-leftmouse")
2101 if !hasmapto("<Plug>NetrwReturn")
2102 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
2103" call Decho("making map for 2-leftmouse")
2104 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
2105 elseif maparg("<c-leftmouse>","n") == ""
2106" call Decho("making map for c-leftmouse")
2107 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
2108 endif
2109 endif
2110 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
2111" call Decho("made <Plug>NetrwReturn map")
2112 endif
2113
Bram Moolenaar9964e462007-05-05 17:54:07 +00002114 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002115" call Decho("make local maps")
Bram Moolenaar15146672011-10-20 22:22:38 +02002116 " local normal-mode maps
2117 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
2118 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
2119 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2120 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
2121 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2122 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
2123 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2124 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2125 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
2126 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
2127 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
2128 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2129 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
2130 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
2131 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2132 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2133 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2134 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2135 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2136 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2137 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2138 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2139 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2140 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2141 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2142 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2143 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2144 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2145 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2146 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
2147 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
2148 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
2149 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
2150 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
2151 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2152 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
2153 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2154 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
2155 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>
2156 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
2157 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
2158 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(4)<bar>norm! gT<cr>
2159 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
2160 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2161 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2162 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
2163 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
2164 " local insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002165 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002166 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2167 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2168 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
2169 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2170 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2171 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
2172 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2173 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
2174 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2175 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2176 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002177 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002178 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002179 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2180 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2181 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2182 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2183 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2184 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2185 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2186 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2187 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2188 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2189 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2190 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2191 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2192 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002193 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002194 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002195 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002196 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002197 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2198 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2199 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002200 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
2201 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>
2202 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
2203 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002204 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(4)<bar>norm! gT<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002205 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002206 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2207 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2208 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
2209 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002210 if !hasmapto('<Plug>NetrwHideEdit')
2211 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002212 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002213 endif
2214 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
2215 if !hasmapto('<Plug>NetrwRefresh')
2216 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002217 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002218 endif
2219 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002220 if s:didstarstar || !mapcheck("<s-down>","n")
2221 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002222 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002223 endif
2224 if s:didstarstar || !mapcheck("<s-up>","n")
2225 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002226 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002227 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002228 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002229 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002230 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
2231 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
2232 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
2233 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
2234 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2235 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2236 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2237 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2238 imap <buffer> <leftmouse> <Plug>ILeftmouse
2239 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
2240 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2241 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2242 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2243 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002244 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2245 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002246 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002247 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002248 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002249 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002250 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002251 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002252 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2253 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2254 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
2255 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2256 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2257 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
2258 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002259 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002260
Bram Moolenaar9964e462007-05-05 17:54:07 +00002261 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002262" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002263 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar15146672011-10-20 22:22:38 +02002264 " remote normal-mode maps
Bram Moolenaar446cb832008-06-24 21:56:24 +00002265 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2266 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2267 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2268 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002269 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002270 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2271 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2272 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2273 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2274 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2275 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2276 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2277 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2278 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2279 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002280 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002281 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002282 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2283 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002284 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002285 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002286 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002287 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
2288 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002289 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002290 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002291 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002292 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002293 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002294 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
2295 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
2296 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2297 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002298 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2299 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002300 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2301 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>
2302 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002303 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002304 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002305 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2306 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2307 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002308 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
2309 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00002310 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002311 " remote insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002312 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2313 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2314 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2315 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
2316 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2317 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2318 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2319 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2320 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2321 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2322 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2323 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2324 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2325 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2326 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002327 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002328 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002329 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2330 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002331 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002332 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
2333 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
2334 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
2335 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
2336 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2337 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
2338 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2339 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
2340 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
2341 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2342 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2343 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2344 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2345 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2346 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>
2347 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
2348 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
2349 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
2350 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2351 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2352 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
2353 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
2354 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
2355 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002356 if !hasmapto('<Plug>NetrwHideEdit')
2357 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002358 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002359 endif
2360 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
2361 if !hasmapto('<Plug>NetrwRefresh')
2362 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002363 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002364 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002365
2366 let mapsafepath = escape(s:path, s:netrw_map_escape)
2367 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
2368
Bram Moolenaar251e1912011-06-19 05:09:16 +02002369 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002370 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002371 nmap <leftmouse> <Plug>NetrwLeftmouse
2372 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
2373 nmap <middlemouse> <Plug>NetrwMiddlemouse
2374 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
2375 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2376 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2377 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2378 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2379 imap <buffer> <leftmouse> <Plug>ILeftmouse
2380 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
2381 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2382 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2383 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2384 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002385 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2386 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002387 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002388 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002389 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002390 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2391 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2392 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002393 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002394 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2395 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2396 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2397 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2398 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2399 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002400 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002401 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002402 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002403
Bram Moolenaaradc21822011-04-01 18:03:16 +02002404 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02002405
Bram Moolenaaradc21822011-04-01 18:03:16 +02002406" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002407endfun
2408
2409" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002410" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
2411fun! s:ExplorePatHls(pattern)
2412" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
2413 let repat= substitute(a:pattern,'^**/\{1,2}','','')
2414" call Decho("repat<".repat.">")
2415 let repat= escape(repat,'][.\')
2416" call Decho("repat<".repat.">")
2417 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
2418" call Dret("s:ExplorePatHls repat<".repat.">")
2419 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00002420endfun
2421
2422" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002423" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002424" 0: (user: <mb>) bookmark current directory
2425" 1: (user: <gb>) change to the bookmarked directory
2426" 2: (user: <qb>) list bookmarks
2427" 3: (browsing) record current directory history
2428" 4: (user: <u>) go up (previous) bookmark
2429" 5: (user: <U>) go down (next) bookmark
2430" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01002431fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002432" 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 +00002433
2434 if a:chg == 0
2435 " bookmark the current directory
2436" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002437 if !exists("g:netrw_bookmarklist")
2438 let g:netrw_bookmarklist= []
2439 endif
2440 if index(g:netrw_bookmarklist,a:curdir) == -1
2441 " curdir not currently in g:netrw_bookmarklist, so include it
2442 call add(g:netrw_bookmarklist,a:curdir)
2443 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002444 endif
2445 echo "bookmarked the current directory"
2446
2447 elseif a:chg == 1
2448 " change to the bookmarked directory
Bram Moolenaar5c736222010-01-06 20:54:52 +01002449" call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
2450 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002451 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00002452 else
2453 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2454 endif
2455
2456 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002457" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002458 let didwork= 0
2459 " list user's bookmarks
2460" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002461 if exists("g:netrw_bookmarklist")
2462" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
2463 let cnt= 1
2464 for bmd in g:netrw_bookmarklist
2465" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
2466 echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
2467 let didwork = 1
2468 let cnt = cnt + 1
2469 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00002470 endif
2471
2472 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002473 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002474 let first = 1
2475 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002476 if g:netrw_dirhistmax > 0
2477 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01002478" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002479 let histcnt= histcnt + 1
2480 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002481" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02002482 echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}
2483 let didwork= 1
2484 endif
2485 let first = 0
2486 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2487 if cnt < 0
2488 let cnt= cnt + g:netrw_dirhistmax
2489 endif
2490 endwhile
2491 else
2492 let g:netrw_dirhist_cnt= 0
2493 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002494 if didwork
2495 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2496 endif
2497
2498 elseif a:chg == 3
2499 " saves most recently visited directories (when they differ)
2500" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002501 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 +02002502 if g:netrw_dirhistmax > 0
2503 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2504 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
2505 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002506" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002507 endif
2508
2509 elseif a:chg == 4
2510 " u: change to the previous directory stored on the history list
2511" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002512 if g:netrw_dirhistmax > 0
2513 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2514 if g:netrw_dirhist_cnt < 0
2515 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2516 endif
2517 else
2518 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002519 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002520 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2521" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002522 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002523 setl ma noro
2524" call Decho("(NetrwBookHistHandler) setl ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002525 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002526 setl nomod
2527" call Decho("(NetrwBookHistHandler) setl nomod")
2528" 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 +00002529 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002530" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002531 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002532 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02002533 if g:netrw_dirhistmax > 0
2534 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2535 else
2536 let g:netrw_dirhist_cnt= 0
2537 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002538 echo "Sorry, no predecessor directory exists yet"
2539 endif
2540
2541 elseif a:chg == 5
2542 " U: change to the subsequent directory stored on the history list
2543" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002544 if g:netrw_dirhistmax > 0
2545 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2546 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002547" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002548 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002549" call Decho("(NetrwBookHistHandler) setl ma noro")
2550 setl ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02002551 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002552" call Decho("removed all lines from buffer (%d)")
2553" call Decho("(NetrwBookHistHandler) setl nomod")
2554 setl nomod
2555" 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 +02002556 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002557" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002558 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
2559 else
2560 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2561 if g:netrw_dirhist_cnt < 0
2562 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2563 endif
2564 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002565 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002566 else
2567 let g:netrw_dirhist_cnt= 0
2568 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002569 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002570
2571 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01002572 " delete the v:count'th bookmark
2573" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
2574 let savefile= s:NetrwHome()."/.netrwbook"
2575 if filereadable(savefile)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002576 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
2577 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002578 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002579 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002580 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002581 call s:NetrwBookmarkMenu()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002582" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002583endfun
2584
2585" ---------------------------------------------------------------------
2586" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
2587" Sister function: s:NetrwBookHistSave()
2588fun! s:NetrwBookHistRead()
2589" call Dfunc("s:NetrwBookHistRead()")
2590 if !exists("s:netrw_initbookhist")
2591 let home = s:NetrwHome()
2592 let savefile= home."/.netrwbook"
2593 if filereadable(savefile)
2594" call Decho("sourcing .netrwbook")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002595 exe "keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002596 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002597 if g:netrw_dirhistmax > 0
2598 let savefile= home."/.netrwhist"
2599 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002600" call Decho("sourcing .netrwhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002601 exe "keepj so ".savefile
2602 endif
2603 let s:netrw_initbookhist= 1
2604 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002605 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002606 endif
2607" call Dret("s:NetrwBookHistRead")
2608endfun
2609
2610" ---------------------------------------------------------------------
2611" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
2612" Sister function: s:NetrwBookHistRead()
2613" I used to do this via viminfo but that appears to
2614" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01002615fun! s:NetrwBookHistSave()
2616" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002617 if g:netrw_dirhistmax <= 0
2618" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
2619 return
2620 endif
2621
Bram Moolenaar5c736222010-01-06 20:54:52 +01002622 let savefile= s:NetrwHome()."/.netrwhist"
2623 1split
2624 call s:NetrwEnew()
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002625 setlocal cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
Bram Moolenaar5c736222010-01-06 20:54:52 +01002626 setlocal nocin noai noci magic nospell nohid wig= noaw
2627 setlocal ma noro write
2628 if exists("&acd") | setlocal noacd | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02002629 sil! keepj keepalt %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002630
2631 " save .netrwhist -- no attempt to merge
Bram Moolenaaradc21822011-04-01 18:03:16 +02002632 sil! file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01002633 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
2634 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
2635 let lastline = line("$")
2636 let cnt = 1
2637 while cnt <= g:netrw_dirhist_cnt
2638 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
2639 let cnt= cnt + 1
2640 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002641 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002642
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002643 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002644 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2645 " merge and write .netrwbook
2646 let savefile= s:NetrwHome()."/.netrwbook"
2647
2648 if filereadable(savefile)
2649 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002650 exe "sil keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002651 for bdm in booklist
2652 if index(g:netrw_bookmarklist,bdm) == -1
2653 call add(g:netrw_bookmarklist,bdm)
2654 endif
2655 endfor
2656 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002657 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002658 endif
2659
2660 " construct and save .netrwbook
2661 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002662 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002663 endif
2664 let bgone= bufnr("%")
2665 q!
2666 exe bgone."bwipe!"
2667
2668" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002669endfun
2670
2671" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002672" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2673" list of the contents of a local or remote directory. It is assumed that the
2674" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2675" with the requested remote hostname first.
2676fun! s:NetrwBrowse(islocal,dirname)
2677 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002678" 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 +02002679" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002680" call Dredir("ls!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002681 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002682 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002683 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002684
2685 " simplify the dirname (especially for ".."s in dirnames)
2686 if a:dirname !~ '^\a\+://'
2687 let dirname= simplify(a:dirname)
2688 else
2689 let dirname= a:dirname
2690 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002691
2692 if exists("s:netrw_skipbrowse")
2693 unlet s:netrw_skipbrowse
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002694" 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 +00002695" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2696 return
2697 endif
2698 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002699 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002700" call Dret("s:NetrwBrowse : missing shellescape()")
2701 return
2702 endif
2703 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002704 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002705" call Dret("s:NetrwBrowse : missing fnameescape()")
2706 return
2707 endif
2708
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002709 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002710
2711 " re-instate any marked files
2712 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2713" call Decho("clearing marked files")
2714 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2715 endif
2716
2717 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2718" call Decho("handle w:netrw_acdkeep:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002719" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002720 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002721 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002722" call Decho("getcwd<".getcwd().">")
2723
Bram Moolenaar5c736222010-01-06 20:54:52 +01002724 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002725 " looks like a regular file, attempt transfer
Bram Moolenaar5c736222010-01-06 20:54:52 +01002726" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002727
2728 " remove any filetype indicator from end of dirname, except for the {{{3
2729 " "this is a directory" indicator (/).
2730 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01002731 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002732" call Decho("new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002733 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002734
2735 " remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002736 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01002737 call s:NetrwEnew(dirname)
2738 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002739 setlocal ma noro
2740" call Decho("setlocal ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02002741 let b:netrw_curdir = dirname
2742 let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
2743" call Decho("exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
2744 exe "sil! keepj keepalt file ".fnameescape(url)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002745 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02002746 sil call netrw#NetRead(2,url)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002747 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002748 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02002749 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002750 endif
2751
2752 " save certain window-oriented variables into buffer-oriented variables {{{3
2753 call s:SetBufWinVars()
2754 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002755" call Decho("setl ma nomod")
2756 setl ma nomod
2757" 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 +00002758
Bram Moolenaar446cb832008-06-24 21:56:24 +00002759" call Dret("s:NetrwBrowse : file<".s:fname.">")
2760 return
2761 endif
2762
Bram Moolenaaradc21822011-04-01 18:03:16 +02002763 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00002764 call s:UseBufWinVars()
2765
2766 " set up some variables {{{3
2767 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002768 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002769 let s:last_sort_by = g:netrw_sort_by
2770
2771 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02002772 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002773
2774 " set up buffer {{{3
2775 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2776 " maintain markfile highlighting
2777 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2778" call Decho("bufnr(%)=".bufnr('%'))
2779" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2780 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2781 else
2782" call Decho("2match none")
2783 2match none
2784 endif
2785 if reusing
2786 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002787" call Decho("(NetrwBrowse) setl noma nomod nowrap")
2788 setl noma nomod nowrap
2789" 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 +00002790" call Dret("s:NetrwBrowse : re-using buffer")
2791 return
2792 endif
2793
2794 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002795" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002796 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002797 if b:netrw_curdir =~ '[/\\]$'
2798 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2799 endif
2800 if b:netrw_curdir == ''
2801 if has("amiga")
2802 " On the Amiga, the empty string connotes the current directory
2803 let b:netrw_curdir= getcwd()
2804 else
2805 " under unix, when the root directory is encountered, the result
2806 " from the preceding substitute is an empty string.
2807 let b:netrw_curdir= '/'
2808 endif
2809 endif
2810 if !a:islocal && b:netrw_curdir !~ '/$'
2811 let b:netrw_curdir= b:netrw_curdir.'/'
2812 endif
2813" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2814
2815 " ------------
2816 " (local only) {{{3
2817 " ------------
2818 if a:islocal
2819" call Decho("local only:")
2820
2821 " Set up ShellCmdPost handling. Append current buffer to browselist
2822 call s:LocalFastBrowser()
2823
2824 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2825 if !g:netrw_keepdir
2826" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2827" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2828 if !exists("&l:acd") || !&l:acd
2829" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2830 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002831 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002832 catch /^Vim\%((\a\+)\)\=:E472/
2833 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2834 if exists("w:netrw_prvdir")
2835 let b:netrw_curdir= w:netrw_prvdir
2836 else
2837 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002838" call Decho("(NetrwBrowse) setl noma nomod nowrap")
2839 setl noma nomod nowrap
2840" 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 +00002841 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002842" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2843 return
2844 endif
2845 endtry
2846 endif
2847 endif
2848
2849 " --------------------------------
2850 " remote handling: {{{3
2851 " --------------------------------
2852 else
2853" call Decho("remote only:")
2854
Bram Moolenaar5c736222010-01-06 20:54:52 +01002855 " analyze dirname and g:netrw_list_cmd {{{4
2856" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
2857 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00002858 let dirname= b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01002859" call Decho("(dirname was ".dirname.") dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002860 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2861 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2862 if dirname !~ '/$'
2863 let dirname= dirname.'/'
2864 endif
2865 let b:netrw_curdir = dirname
2866" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2867 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002868 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002869" call Decho("(normal) dirname<".dirname.">")
2870 endif
2871
2872 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2873 if dirname !~ dirpat
2874 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002875 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002876 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002877 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002878" call Decho("(NetrwBrowse) setl noma nomod nowrap")
2879 setl noma nomod nowrap
2880" 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 +00002881" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2882 return
2883 endif
2884 let b:netrw_curdir= dirname
2885" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2886 endif " (additional remote handling)
2887
2888 " -----------------------
2889 " Directory Listing: {{{3
2890 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002891 keepj call s:NetrwMaps(a:islocal)
2892 keepj call s:PerformListing(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02002893 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002894 let &l:bexpr= "netrw#NetrwBalloonHelp()"
Bram Moolenaar15146672011-10-20 22:22:38 +02002895" call Decho("set up balloon help: l:bexpr=".&l:bexpr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002896 set beval
2897 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02002898 call s:NetrwOptionRestore("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002899
2900 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
2901 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
2902 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
2903 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
2904 " function gets called due to that autocmd; it notices that the following variable is set
2905 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
2906 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002907
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002908" 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 +02002909" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002910 return
2911endfun
2912
2913" ---------------------------------------------------------------------
2914" s:NetrwFileInfo: supports qf (query for file information) {{{2
2915fun! s:NetrwFileInfo(islocal,fname)
2916" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2917 if a:islocal
2918 if (has("unix") || has("macunix")) && executable("/bin/ls")
2919 if exists("b:netrw_curdir")
2920" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2921 if b:netrw_curdir =~ '/$'
2922 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2923 else
2924 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2925 endif
2926 else
2927" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2928 echo system("/bin/ls -lsad ".shellescape(a:fname))
2929 endif
2930 else
2931 " use vim functions to return information about file below cursor
2932" call Decho("using vim functions to query for file info")
2933 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2934 let fname= substitute(a:fname,".$","","")
2935 else
2936 let fname= a:fname
2937 endif
2938 let t = getftime(fname)
2939 let sz = getfsize(fname)
2940 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2941" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2942 endif
2943 else
2944 echo "sorry, \"qf\" not supported yet for remote files"
2945 endif
2946" call Dret("s:NetrwFileInfo")
2947endfun
2948
2949" ---------------------------------------------------------------------
2950" s:NetrwGetBuffer: {{{2
2951" returns 0=cleared buffer
2952" 1=re-used buffer
2953fun! s:NetrwGetBuffer(islocal,dirname)
2954" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2955 let dirname= a:dirname
2956
2957 " re-use buffer if possible {{{3
2958" call Decho("--re-use a buffer if possible--")
2959 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2960 " find NetrwTreeList buffer if there is one
Bram Moolenaar5c736222010-01-06 20:54:52 +01002961" call Decho("find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002962 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2963" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2964 let eikeep= &ei
2965 set ei=all
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002966 exe "sil! b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00002967 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01002968" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002969 return
2970 endif
2971 let bufnum= -1
2972" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2973
2974 else
2975 " find buffer number of buffer named precisely the same as dirname {{{3
2976" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2977" call Dredir("ls!")
2978
2979 " get dirname and associated buffer number
2980 let bufnum = bufnr(escape(dirname,'\'))
2981" call Decho(" find buffer<".dirname.">'s number ")
2982" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2983
2984 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002985 " try appending a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002986" call Decho(" try appending a trailing / to dirname<".dirname.">")
2987 let bufnum= bufnr(escape(dirname.'/','\'))
2988 if bufnum > 0
2989 let dirname= dirname.'/'
2990 endif
2991 endif
2992
2993 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002994 " try removing a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002995" call Decho(" try removing a trailing / from dirname<".dirname.">")
2996 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2997 if bufnum > 0
2998 let dirname= substitute(dirname,'/$','','')
2999 endif
3000 endif
3001
3002" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
3003 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
3004 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
3005 " handle approximate matches
Bram Moolenaar5c736222010-01-06 20:54:52 +01003006" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003007 let ibuf = 1
3008 let buflast = bufnr("$")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003009" call Decho(" findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003010 while ibuf <= buflast
3011 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00003012 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003013" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
3014 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
3015 " bname is not empty
3016 " dirname ends with bname,
3017 " dirname doesn't start with /, so its not a absolute path
3018" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003019 break
3020 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003021 if bname =~ '^'.dirname.'/\=$'
3022 " bname begins with dirname
3023" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003024 break
3025 endif
3026 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003027" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
3028 break
3029 endif
3030 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
3031" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003032 break
3033 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003034 let ibuf= ibuf + 1
3035 endwhile
3036 if ibuf > buflast
3037 let bufnum= -1
3038 else
3039 let bufnum= ibuf
3040 endif
3041" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
3042 endif
3043 endif
3044
3045 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003046 sil! keepj mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00003047 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003048" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003049 call s:NetrwEnew(dirname)
3050" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
3051 " name the buffer
3052 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3053 " Got enew buffer; transform into a NetrwTreeListing
3054" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
3055 if !exists("s:netrw_treelistnum")
3056 let s:netrw_treelistnum= 1
3057 else
3058 let s:netrw_treelistnum= s:netrw_treelistnum + 1
3059 endif
3060 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003061" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003062 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
3063 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02003064 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
3065 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>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003068" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
3069 else
3070" let v:errmsg= "" " Decho
3071 let escdirname= fnameescape(dirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003072" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003073" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003074" let v:errmsg= "" " Decho
3075 exe 'sil! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003076" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
3077 endif
3078" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
3079
3080 else " Re-use the buffer
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003081" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003082 let eikeep= &ei
3083 set ei=all
3084 if getline(2) =~ '^" Netrw Directory Listing'
3085" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003086 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003087 else
3088" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003089 exe "sil! b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003090 endif
3091 if bufname("%") == '.'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003092" call Decho("exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003093 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00003094 endif
3095 let &ei= eikeep
3096 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02003097 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003098" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
3099 return 0
3100 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3101" call Decho("--re-use tree listing--")
3102" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003103 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02003104 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003105" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
3106 return 0
3107 else
3108" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
3109 return 1
3110 endif
3111 endif
3112
3113 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
3114 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
3115 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
3116 " med 1 D H
3117 " fast 2 H H
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003118" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003119 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003120 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003121" call Decho("exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003122 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003123
3124 " delete all lines from buffer {{{3
3125" call Decho("--delete all lines from buffer--")
3126" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003127 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003128
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003129" 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 +00003130 return 0
3131endfun
3132
3133" ---------------------------------------------------------------------
3134" s:NetrwGetcwd: get the current directory. {{{2
3135" Change backslashes to forward slashes, if any.
3136" If doesc is true, escape certain troublesome characters
3137fun! s:NetrwGetcwd(doesc)
3138" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
3139 let curdir= substitute(getcwd(),'\\','/','ge')
3140 if curdir !~ '[\/]$'
3141 let curdir= curdir.'/'
3142 endif
3143 if a:doesc
3144 let curdir= fnameescape(curdir)
3145 endif
3146" call Dret("NetrwGetcwd <".curdir.">")
3147 return curdir
3148endfun
3149
3150" ---------------------------------------------------------------------
3151" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
3152fun! s:NetrwGetWord()
3153" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
3154 call s:UseBufWinVars()
3155
3156 " insure that w:netrw_liststyle is set up
3157 if !exists("w:netrw_liststyle")
3158 if exists("g:netrw_liststyle")
3159 let w:netrw_liststyle= g:netrw_liststyle
3160 else
3161 let w:netrw_liststyle= s:THINLIST
3162 endif
3163" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
3164 endif
3165
3166 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
3167 " Active Banner support
3168" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003169 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003170 let dirname= "./"
3171 let curline= getline('.')
3172
3173 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003174 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00003175 let s:netrw_skipbrowse= 1
3176 echo 'Pressing "s" also works'
3177
3178 elseif curline =~ '"\s*Sort sequence:'
3179 let s:netrw_skipbrowse= 1
3180 echo 'Press "S" to edit sorting sequence'
3181
3182 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003183 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00003184 let s:netrw_skipbrowse= 1
3185 echo 'Pressing "?" also works'
3186
3187 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003188 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00003189 let s:netrw_skipbrowse= 1
3190 echo 'Pressing "a" also works'
3191
3192 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003193 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003194 endif
3195
3196 elseif w:netrw_liststyle == s:THINLIST
3197" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003198 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003199 let dirname= getline('.')
3200
3201 elseif w:netrw_liststyle == s:LONGLIST
3202" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003203 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003204 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
3205
3206 elseif w:netrw_liststyle == s:TREELIST
3207" call Decho("treelist handling")
3208 let dirname= substitute(getline('.'),'^\(| \)*','','e')
3209
3210 else
3211" call Decho("obtain word from wide listing")
3212 let dirname= getline('.')
3213
3214 if !exists("b:netrw_cpf")
3215 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003216 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 +01003217 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003218" call Decho("computed cpf=".b:netrw_cpf)
3219 endif
3220
3221" call Decho("buf#".bufnr("%")."<".bufname("%").">")
3222 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
3223" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
3224" call Decho("1: dirname<".dirname.">")
3225 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003226 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003227 else
3228 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003229 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003230 endif
3231 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00003232 let eofname= filestart + b:netrw_cpf + 1
3233 if eofname <= col("$")
3234 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003235 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00003236 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003237 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00003238 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003239 let dirname = @a
3240 let @a = rega
3241" call Decho("2: dirname<".dirname.">")
3242 let dirname= substitute(dirname,'\s\+$','','e')
3243" call Decho("3: dirname<".dirname.">")
3244 endif
3245
3246 " symlinks are indicated by a trailing "@". Remove it before further processing.
3247 let dirname= substitute(dirname,"@$","","")
3248
3249 " executables are indicated by a trailing "*". Remove it before further processing.
3250 let dirname= substitute(dirname,"\*$","","")
3251
3252" call Dret("s:NetrwGetWord <".dirname.">")
3253 return dirname
3254endfun
3255
3256" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003257" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003258fun! s:NetrwListSettings(islocal)
3259" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
3260 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003261" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003262 setlocal bt=nofile nobl ma nonu nowrap noro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003263" call Decho("exe sil! keepalt file ".fnameescape(fname))
3264 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003265 if g:netrw_use_noswf
3266 setlocal noswf
3267 endif
3268" call Dredir("ls!")
3269" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
3270 exe "setlocal ts=".g:netrw_maxfilenamelen
3271 setlocal isk+=.,~,-
3272 if g:netrw_fastbrowse > a:islocal
3273 setlocal bh=hide
3274 else
3275 setlocal bh=delete
3276 endif
3277" call Dret("s:NetrwListSettings")
3278endfun
3279
3280" ---------------------------------------------------------------------
3281" s:NetrwListStyle: {{{2
3282" islocal=0: remote browsing
3283" =1: local browsing
3284fun! s:NetrwListStyle(islocal)
3285" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
3286 let fname = s:NetrwGetWord()
3287 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
3288 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
3289" call Decho("fname<".fname.">")
3290" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
3291" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
3292
3293 if w:netrw_liststyle == s:THINLIST
3294 " use one column listing
3295" call Decho("use one column list")
3296 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3297
3298 elseif w:netrw_liststyle == s:LONGLIST
3299 " use long list
3300" call Decho("use long list")
3301 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
3302
3303 elseif w:netrw_liststyle == s:WIDELIST
3304 " give wide list
3305" call Decho("use wide list")
3306 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3307
3308 elseif w:netrw_liststyle == s:TREELIST
3309" call Decho("use tree list")
3310 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3311
3312 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003313 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003314 let g:netrw_liststyle = s:THINLIST
3315 let w:netrw_liststyle = g:netrw_liststyle
3316 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3317 endif
3318 setlocal ma noro
3319" call Decho("setlocal ma noro")
3320
3321 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
3322" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003323 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003324 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003325" call Decho("(NetrwListStyle) setl nomod")
3326 setl nomod
3327" 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 +00003328
3329 " refresh the listing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003330" call Decho("(NetrwListStyle) refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003331 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02003332 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3333 keepj call netrw#NetrwRestorePosn(svpos)
3334 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003335
3336 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003337 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00003338 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3339" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3340 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003341 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003342 endif
3343
3344" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
3345endfun
3346
3347" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003348" s:NetrwBannerCtrl: toggles the display of the banner {{{2
3349fun! s:NetrwBannerCtrl(islocal)
3350" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
3351
3352 " toggle the banner (enable/suppress)
3353 let g:netrw_banner= !g:netrw_banner
3354
3355 " refresh the listing
3356 let svpos= netrw#NetrwSavePosn()
3357 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3358
3359 " keep cursor on the filename
3360 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003361 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01003362 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3363" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3364 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003365 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01003366 endif
3367" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
3368endfun
3369
3370" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003371" s:NetrwBookmarkMenu: Uses menu priorities {{{2
3372" .2.[cnt] for bookmarks, and
3373" .3.[cnt] for history
3374" (see s:NetrwMenu())
3375fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003376 if !exists("s:netrw_menucnt")
3377 return
3378 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003379" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003380
3381 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02003382 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00003383 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003384" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003385 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
3386 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003387 endif
3388 if !exists("s:netrw_initbookhist")
3389 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003390 endif
3391
3392 " show bookmarked places
Bram Moolenaar5c736222010-01-06 20:54:52 +01003393 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3394 let cnt= 1
3395 for bmd in g:netrw_bookmarklist
Bram Moolenaaradc21822011-04-01 18:03:16 +02003396" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003397 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003398
3399 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003400 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003401
3402 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003403 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 +01003404 let cnt= cnt + 1
3405 endfor
3406
3407 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003408
3409 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02003410 if g:netrw_dirhistmax > 0
3411 let cnt = g:netrw_dirhist_cnt
3412 let first = 1
3413 let histcnt = 0
3414 while ( first || cnt != g:netrw_dirhist_cnt )
3415 let histcnt = histcnt + 1
3416 let priority = g:netrw_dirhist_cnt + histcnt
3417 if exists("g:netrw_dirhist_{cnt}")
3418 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
3419" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
3420 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
3421 endif
3422 let first = 0
3423 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3424 if cnt < 0
3425 let cnt= cnt + g:netrw_dirhistmax
3426 endif
3427 endwhile
3428 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003429
Bram Moolenaar9964e462007-05-05 17:54:07 +00003430 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003431" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003432endfun
3433
3434" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003435" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
3436" directory and a new directory name. Also, if the
3437" "new directory name" is actually a file,
3438" NetrwBrowseChgDir() edits the file.
3439fun! s:NetrwBrowseChgDir(islocal,newdir,...)
3440" 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 +00003441
Bram Moolenaar446cb832008-06-24 21:56:24 +00003442 if !exists("b:netrw_curdir")
3443 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
3444 " and the current window is the NetrwMessage window.
3445" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003446" call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003447" call Dredir("ls!")
3448" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003449 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003450 endif
3451
Bram Moolenaaradc21822011-04-01 18:03:16 +02003452 keepj call s:NetrwOptionSave("s:")
3453 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003454 let nbcd_curpos = netrw#NetrwSavePosn()
3455 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003456" call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003457 if (has("win32") || has("win95") || has("win64") || has("win16"))
3458 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
3459 else
3460 let dirname= b:netrw_curdir
3461 endif
3462 let newdir = a:newdir
3463 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003464
Bram Moolenaar446cb832008-06-24 21:56:24 +00003465 " set up o/s-dependent directory recognition pattern
3466 if has("amiga")
3467 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00003468 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003469 let dirpat= '[\/]$'
3470 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003471" call Decho("(NetrwBrowseChgDir) dirname<".dirname."> dirpat<".dirpat.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003472
3473 if dirname !~ dirpat
3474 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02003475 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003476 let dirname= dirname.'/'
3477" call Decho("adjusting dirname<".dirname.">")
3478 endif
3479
3480 if newdir !~ dirpat
3481 " ------------
3482 " edit a file:
3483 " ------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003484" call Decho('(NetrwBrowseChgDir) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
3485
3486 " save position for benefit of Rexplore
3487 let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn()
3488
3489" call Decho("(NetrwBrowseChgDir) setting s:rexposn_".bufnr("%")." to SavePosn")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003490 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
3491 let dirname= s:NetrwTreeDir()
3492 if dirname =~ '/$'
3493 let dirname= dirname.newdir
3494 else
3495 let dirname= s:NetrwTreeDir()."/".newdir
3496 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003497" call Decho("(NetrwBrowseChgDir) dirname<".dirname.">")
3498" call Decho("(NetrwBrowseChgDir) tree listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003499 elseif newdir =~ '^\(/\|\a:\)'
3500 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003501 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003502 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003503 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003504" call Decho("(NetrwBrowseChgDir) handling a file: dirname<".dirname."> (a:0=".a:0.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003505 " this lets NetrwBrowseX avoid the edit
3506 if a:0 < 1
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003507" 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 +02003508 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003509 if !exists("s:didsplit")
3510 if g:netrw_browse_split == 1
3511 new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003512 if !&ea
3513 wincmd _
3514 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003515 elseif g:netrw_browse_split == 2
3516 rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003517 if !&ea
3518 wincmd |
3519 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003520 elseif g:netrw_browse_split == 3
3521 tabnew
3522 elseif g:netrw_browse_split == 4
3523 if s:NetrwPrevWinOpen(2) == 3
3524" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003525 return
3526 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003527 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003528 " handling a file, didn't split, so remove menu
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003529" call Decho("(NetrwBrowseChgDir) handling a file+didn't split, so remove menu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003530 call s:NetrwMenu(0)
3531 " optional change to window
3532 if g:netrw_chgwin >= 1
3533 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003534 endif
3535 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003536 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003537
Bram Moolenaar446cb832008-06-24 21:56:24 +00003538 " the point where netrw actually edits the (local) file
3539 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
3540 if a:islocal
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003541" call Decho("(NetrwBrowseChgDir) edit local file: exe e! ".fnameescape(dirname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003542 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003543 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003544" call Decho("(NetrwBrowseChgDir) remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003545 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003546 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003547
3548 " handle g:Netrw_funcref -- call external-to-netrw functions
3549 " This code will handle g:Netrw_funcref as an individual function reference
3550 " or as a list of function references. It will ignore anything that's not
3551 " a function reference. See :help Funcref for information about function references.
3552 if exists("g:Netrw_funcref")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003553" call Decho("(NetrwBrowseChgDir) handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003554 if type(g:Netrw_funcref) == 2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003555" call Decho("(NetrwBrowseChgDir) handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003556 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003557 elseif type(g:Netrw_funcref) == 3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003558" call Decho("(NetrwBrowseChgDir) handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003559 for Fncref in g:Netrw_funcref
3560 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02003561 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003562 endif
3563 endfor
3564 endif
3565 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003566 endif
3567
3568 elseif newdir =~ '^/'
3569 " ---------------------------------
3570 " just go to the new directory spec
3571 " ---------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003572" call Decho('(NetrwBrowseChgDir) case "just go to new directory spec": newdir<'.newdir.'>')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003573 let dirname= newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003574 keepj call s:SetRexDir(a:islocal,dirname)
3575 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003576
3577 elseif newdir == './'
3578 " --------------------------
3579 " refresh the directory list
3580 " --------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003581" call Decho('(NetrwBrowseChgDir) case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003582 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003583
3584 elseif newdir == '../'
3585 " -------------------
3586 " go up one directory
3587 " -------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003588" call Decho('(NetrwBrowseChgDir) case "go up one directory": newdir == "../"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003589
3590 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3591 " force a refresh
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003592" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
3593" call Decho("(NetrwBrowseChgDir) setl noro ma")
3594 setl noro ma
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003595 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003596 endif
3597
3598 if has("amiga")
3599 " amiga
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003600" call Decho('(NetrwBrowseChgDir) case "go up one directory": newdir == "../" and amiga')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003601 if a:islocal
3602 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
3603 let dirname= substitute(dirname,'/$','','')
3604 else
3605 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
3606 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003607" call Decho("(NetrwBrowseChgDir) amiga: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003608
3609 else
3610 " unix or cygwin
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003611" call Decho('(NetrwBrowseChgDir) case "go up one directory": newdir == "../" and unix or cygwin')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003612 if a:islocal
3613 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
3614 if dirname == ""
3615 let dirname= '/'
3616 endif
3617 else
3618 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
3619 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003620" call Decho("(NetrwBrowseChgDir) unix: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003621 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003622 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003623
3624 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003625" call Decho('(NetrwBrowseChgDir) case liststyle is TREELIST and w:netrw_treedict exists')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003626 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003627" call Decho("(NetrwBrowseChgDir) setl noro ma")
3628 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003629 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003630" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003631 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003632 endif
3633 let treedir = s:NetrwTreeDir()
3634 let s:treecurpos = nbcd_curpos
3635 let haskey= 0
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003636" call Decho("(NetrwBrowseChgDir) w:netrw_treedict<".string(w:netrw_treedict).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003637
3638 " search treedict for tree dir as-is
3639 if has_key(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003640" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'> : found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003641 let haskey= 1
3642 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003643" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003644 endif
3645
3646 " search treedict for treedir with a / appended
3647 if !haskey && treedir !~ '/$'
3648 if has_key(w:netrw_treedict,treedir."/")
3649 let treedir= treedir."/"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003650" call Decho('(NetrwBrowseChgDir) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003651 let haskey = 1
3652 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003653" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'/> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003654 endif
3655 endif
3656
3657 " search treedict for treedir with any trailing / elided
3658 if !haskey && treedir =~ '/$'
3659 let treedir= substitute(treedir,'/$','','')
3660 if has_key(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003661" call Decho('(NetrwBrowseChgDir) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003662 let haskey = 1
3663 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003664" call Decho('(NetrwBrowseChgDir) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003665 endif
3666 endif
3667
3668 if haskey
3669 " close tree listing for selected subdirectory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003670" call Decho("(NetrwBrowseChgDir) closing selected subdirectory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003671 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003672" call Decho("(NetrwBrowseChgDir) removed entry<".treedir."> from treedict")
3673" call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003674 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00003675 else
3676 " go down one directory
3677 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003678" call Decho("(NetrwBrowseChgDir) go down one dir: treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003679 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003680 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003681 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003682
3683 else
3684 " go down one directory
3685 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003686" call Decho("(NetrwBrowseChgDir) go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003687 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003688 endif
3689
Bram Moolenaaradc21822011-04-01 18:03:16 +02003690 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003691 if dolockout
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003692" call Decho("(NetrwBrowseChgDir) filewritable(dirname<".dirname.">)=".filewritable(dirname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003693 if filewritable(dirname)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003694" call Decho("(NetrwBrowseChgDir) doing modification lockout settings: ma nomod noro")
3695" call Decho("(NetrwBrowseChgDir) setl ma nomod noro")
3696 setl ma nomod noro
3697" 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 +02003698 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003699" call Decho("(NetrwBrowseChgDir) doing modification lockout settings: ma nomod ro")
3700" call Decho("(NetrwBrowseChgDir) setl ma nomod noro")
3701 setl ma nomod ro
3702" 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 +02003703 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003704 endif
3705
Bram Moolenaar446cb832008-06-24 21:56:24 +00003706" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
3707 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00003708endfun
3709
3710" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003711" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
3712" given filename; typically this means given their extension.
3713" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00003714fun! netrw#NetrwBrowseX(fname,remote)
3715" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3716
Bram Moolenaar5c736222010-01-06 20:54:52 +01003717 " special core dump handler
3718 if a:fname =~ '/core\(\.\d\+\)\=$'
3719 if exists("g:Netrw_corehandler")
3720 if type(g:Netrw_corehandler) == 2
3721 " g:Netrw_corehandler is a function reference (see :help Funcref)
3722" call Decho("g:Netrw_corehandler is a funcref")
3723 call g:Netrw_corehandler(a:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02003724 elseif type(g:Netrw_corehandler) == 3)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003725 " g:Netrw_corehandler is a List of function references (see :help Funcref)
3726" call Decho("g:Netrw_corehandler is a List")
3727 for Fncref in g:Netrw_corehandler
3728 if type(FncRef) == 2
3729 call FncRef(a:fname)
3730 endif
3731 endfor
3732 endif
3733" call Dret("NetrwBrowseX : coredump handler invoked")
3734 return
3735 endif
3736 endif
3737
Bram Moolenaar446cb832008-06-24 21:56:24 +00003738 " set up the filename
3739 " (lower case the extension, make a local copy of a remote file)
3740 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3741 if has("win32") || has("win95") || has("win64") || has("win16")
3742 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003743 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003744" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003745
3746 " seems kde systems often have gnome-open due to dependencies, even though
3747 " gnome-open's subsidiary display tools are largely absent. Kde systems
3748 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3749 if !exists("s:haskdeinit")
3750 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003751 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003752 if v:shell_error
3753 let s:haskdeinit = 0
3754 endif
3755 else
3756 let s:haskdeinit= 0
3757 endif
3758" call Decho("setting s:haskdeinit=".s:haskdeinit)
3759 endif
3760
3761 if a:remote == 1
3762 " create a local copy
Bram Moolenaar5c736222010-01-06 20:54:52 +01003763" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003764 setlocal bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01003765 call netrw#NetRead(3,a:fname)
3766 " attempt to rename tempfile
3767 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
3768 let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
3769" call Decho("basename<".basename.">")
3770" call Decho("newname <".newname.">")
3771 if rename(s:netrw_tmpfile,newname) == 0
3772 " renaming succeeded
3773 let fname= newname
3774 else
3775 " renaming failed
3776 let fname= s:netrw_tmpfile
3777 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00003778 else
3779 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003780 " special ~ handler for local
3781 if fname =~ '^\~' && expand("$HOME") != ""
3782" call Decho('invoking special ~ handler')
3783 let fname= substitute(fname,'^\~',expand("$HOME"),'')
3784 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003785 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003786" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003787" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3788
3789 " set up redirection
3790 if &srr =~ "%s"
3791 if (has("win32") || has("win95") || has("win64") || has("win16"))
3792 let redir= substitute(&srr,"%s","nul","")
3793 else
3794 let redir= substitute(&srr,"%s","/dev/null","")
3795 endif
3796 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3797 let redir= &srr . "nul"
3798 else
3799 let redir= &srr . "/dev/null"
3800 endif
3801" call Decho("redir{".redir."} srr{".&srr."}")
3802
3803 " extract any viewing options. Assumes that they're set apart by quotes.
3804 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003805" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003806 if g:netrw_browsex_viewer =~ '\s'
3807 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3808 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3809 let oviewer = ''
3810 let cnt = 1
3811 while !executable(viewer) && viewer != oviewer
3812 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3813 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3814 let cnt = cnt + 1
3815 let oviewer = viewer
3816" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3817 endwhile
3818 else
3819 let viewer = g:netrw_browsex_viewer
3820 let viewopt = ""
3821 endif
3822" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3823 endif
3824
3825 " execute the file handler
3826 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3827" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3828 let ret= netrwFileHandlers#Invoke(exten,fname)
3829
3830 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3831" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003832" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
3833 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003834 let ret= v:shell_error
3835
3836 elseif has("win32") || has("win64")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003837 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003838" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3839 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003840 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003841" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3842 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003843 else
3844 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
3845 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003846 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3847 let ret= v:shell_error
3848
3849 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003850" call Decho("exe sil !gnome-open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003851 exe "sil !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003852 let ret= v:shell_error
3853
3854 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003855" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003856 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003857 let ret= v:shell_error
3858
3859 elseif has("macunix") && executable("open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003860" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003861 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003862 let ret= v:shell_error
3863
3864 else
3865 " netrwFileHandlers#Invoke() always returns 0
3866 let ret= netrwFileHandlers#Invoke(exten,fname)
3867 endif
3868
3869 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3870 if ret
3871 let ret= netrwFileHandlers#Invoke(exten,fname)
3872 endif
3873
Bram Moolenaarc236c162008-07-13 17:41:49 +00003874 " restoring redraw! after external file handlers
3875 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003876
3877 " cleanup: remove temporary file,
3878 " delete current buffer if success with handler,
3879 " return to prior buffer (directory listing)
3880 " Feb 12, 2008: had to de-activiate removal of
3881 " temporary file because it wasn't getting seen.
3882" if a:remote == 1 && fname != a:fname
3883" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003884" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003885" endif
3886
3887 if a:remote == 1
3888 setlocal bh=delete bt=nofile
3889 if g:netrw_use_noswf
3890 setlocal noswf
3891 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003892 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003893" redraw!
3894 endif
3895
3896" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003897endfun
3898
3899" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003900" s:NetrwChgPerm: (implements "gp") change file permission {{{2
3901fun! s:NetrwChgPerm(islocal,curdir)
3902" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
3903 call inputsave()
3904 let newperm= input("Enter new permission: ")
3905 call inputrestore()
3906 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
3907 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
3908" call Decho("chgperm<".chgperm.">")
3909 call system(chgperm)
3910 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003911 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003912 endif
3913 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02003914 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003915 endif
3916" call Dret("s:NetrwChgPerm")
3917endfun
3918
3919" ---------------------------------------------------------------------
3920" s:NetrwClearExplore: clear explore variables (if any) {{{2
3921fun! s:NetrwClearExplore()
3922" call Dfunc("s:NetrwClearExplore()")
3923 2match none
3924 if exists("s:explore_match") |unlet s:explore_match |endif
3925 if exists("s:explore_indx") |unlet s:explore_indx |endif
3926 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
3927 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3928 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
3929 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3930 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3931 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3932 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3933" redraw!
3934 echo " "
3935 echo " "
3936" call Dret("s:NetrwClearExplore")
3937endfun
3938
3939" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003940" netrw#Explore: launch the local browser in the directory of the current file {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003941" indx: == -1: Nexplore
3942" == -2: Pexplore
3943" == +: this is overloaded:
3944" * If Nexplore/Pexplore is in use, then this refers to the
3945" indx'th item in the w:netrw_explore_list[] of items which
3946" matched the */pattern **/pattern *//pattern **//pattern
3947" * If Hexplore or Vexplore, then this will override
3948" g:netrw_winsize to specify the qty of rows or columns the
3949" newly split window should have.
3950" dosplit==0: the window will be split iff the current file has been modified
3951" dosplit==1: the window will be split before running the local browser
3952" style == 0: Explore style == 1: Explore!
3953" == 2: Hexplore style == 3: Hexplore!
3954" == 4: Vexplore style == 5: Vexplore!
3955" == 6: Texplore
Bram Moolenaar9964e462007-05-05 17:54:07 +00003956fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003957" 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 +00003958 if !exists("b:netrw_curdir")
3959 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003960" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003961 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003962 let curdir = simplify(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003963 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3964" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003965
3966 " save registers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003967 sil! let keepregstar = @*
3968 sil! let keepregplus = @+
3969 sil! let keepregslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +00003970
3971 " if dosplit or file has been modified
3972 if a:dosplit || &modified || a:style == 6
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003973" 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 +00003974 call s:SaveWinVars()
Bram Moolenaar251e1912011-06-19 05:09:16 +02003975 let winsz= g:netrw_winsize
Bram Moolenaar5c736222010-01-06 20:54:52 +01003976 if a:indx > 0
Bram Moolenaar251e1912011-06-19 05:09:16 +02003977 let winsz= a:indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003978 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003979
3980 if a:style == 0 " Explore, Sexplore
3981" call Decho("style=0: Explore or Sexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003982 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003983 exe winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003984
3985 elseif a:style == 1 "Explore!, Sexplore!
3986" call Decho("style=1: Explore! or Sexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003987 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003988 exe winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003989
3990 elseif a:style == 2 " Hexplore
3991" call Decho("style=2: Hexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003992 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003993 exe "bel ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003994
3995 elseif a:style == 3 " Hexplore!
3996" call Decho("style=3: Hexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003997 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003998 exe "abo ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003999
4000 elseif a:style == 4 " Vexplore
4001" call Decho("style=4: Vexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02004002 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02004003 exe "lefta ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004004
4005 elseif a:style == 5 " Vexplore!
4006" call Decho("style=5: Vexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02004007 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02004008 exe "rightb ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004009
4010 elseif a:style == 6 " Texplore
4011 call s:SaveBufVars()
4012" call Decho("style = 6: Texplore")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004013 exe "tabnew ".fnameescape(curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004014 call s:RestoreBufVars()
4015 endif
4016 call s:RestoreWinVars()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004017" else " Decho
4018" 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 +00004019 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004020 keepj norm! 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00004021
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004022 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02004023" call Decho("case [a:0=".a:0."] > 0")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004024 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaar15146672011-10-20 22:22:38 +02004025" call Decho("..case a:1<".a:1.">: starts with ~ and unix or cygwin")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004026 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaar15146672011-10-20 22:22:38 +02004027" call Decho("..using dirname<".dirname."> (case: ~ && unix||cygwin)")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004028 elseif a:1 == '.'
Bram Moolenaar15146672011-10-20 22:22:38 +02004029" call Decho("..case a:1<".a:1.">: matches .")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004030 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004031 if dirname !~ '/$'
4032 let dirname= dirname."/"
4033 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004034" call Decho("..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00004035 elseif a:1 =~ '\$'
Bram Moolenaar15146672011-10-20 22:22:38 +02004036" call Decho("..case a:1<".a:1.">: matches ending $")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004037 let dirname= simplify(expand(a:1))
Bram Moolenaar15146672011-10-20 22:22:38 +02004038" call Decho("..using user-specified dirname<".dirname."> with $env-var")
4039 elseif a:1 !~ '^\*\{1,2}/'
4040" call Decho("..case a:1<".a:1.">: other, not pattern or filepattern")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004041 let dirname= simplify(a:1)
Bram Moolenaar15146672011-10-20 22:22:38 +02004042" call Decho("..using user-specified dirname<".dirname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004043 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004044" call Decho("..case a:1: pattern or filepattern")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004045 let dirname= a:1
Bram Moolenaar9964e462007-05-05 17:54:07 +00004046 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004047 else
4048 " clear explore
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004049" call Decho("case a:0=".a:0.": clearing Explore list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004050 call s:NetrwClearExplore()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004051" call Dret("netrw#Explore : cleared list")
4052 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004053 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004054
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004055" call Decho("dirname<".dirname.">")
4056 if dirname =~ '\.\./\=$'
4057 let dirname= simplify(fnamemodify(dirname,':p:h'))
4058 elseif dirname =~ '\.\.' || dirname == '.'
4059 let dirname= simplify(fnamemodify(dirname,':p'))
4060 endif
4061" call Decho("dirname<".dirname."> (after simplify)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004062
Bram Moolenaar15146672011-10-20 22:22:38 +02004063 if dirname =~ '^\*//'
4064 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
4065" call Decho("case Explore *//pattern")
4066 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
4067 let starpat= 1
4068" call Decho("..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
4069 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4070
4071 elseif dirname =~ '^\*\*//'
4072 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
4073" call Decho("case Explore **//pattern")
4074 let pattern= substitute(dirname,'^\*\*//','','')
4075 let starpat= 2
4076" call Decho("..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
4077
4078 elseif dirname =~ '/\*\*/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004079 " handle .../**/.../filepat
4080" call Decho("case Explore .../**/.../filepat")
4081 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
4082 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
4083 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004084 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004085 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004086 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004087 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
4088 let starpat= 4;
Bram Moolenaar15146672011-10-20 22:22:38 +02004089" call Decho("..pwd<".getcwd()."> dirname<".dirname.">")
4090" call Decho("..case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004091
4092 elseif dirname =~ '^\*/'
4093 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
4094 let starpat= 3
4095" call Decho("case Explore */filepat (starpat=".starpat.")")
4096
4097 elseif dirname=~ '^\*\*/'
4098 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
4099 let starpat= 4
4100" call Decho("case Explore **/filepat (starpat=".starpat.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004101
Bram Moolenaar446cb832008-06-24 21:56:24 +00004102 else
4103 let starpat= 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004104" call Decho("default case: starpat=".starpat)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004105 endif
4106
4107 if starpat == 0 && a:indx >= 0
4108 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaar5c736222010-01-06 20:54:52 +01004109" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004110 if dirname == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004111 let dirname= curfiledir
Bram Moolenaar15146672011-10-20 22:22:38 +02004112" call Decho("..empty dirname, using current file's directory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004113 endif
4114 if dirname =~ '^scp:' || dirname =~ '^ftp:'
Bram Moolenaar15146672011-10-20 22:22:38 +02004115" call Decho("..calling NetrwBrowse(0,dirname<".dirname.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004116 call s:NetrwBrowse(0,dirname)
4117 else
4118 if dirname == ""|let dirname= getcwd()|endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004119" call Decho("..calling LocalBrowseCheck(dirname<".dirname.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004120 call netrw#LocalBrowseCheck(dirname)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004121" call Decho("win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004122 endif
4123
Bram Moolenaar5c736222010-01-06 20:54:52 +01004124" call Decho("curdir<".curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004125 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004126 keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004127 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004128 keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004129 endif
4130
4131 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
4132 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
4133 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
4134 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
4135 elseif a:indx <= 0
4136 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaar5c736222010-01-06 20:54:52 +01004137" 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 +00004138 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
Bram Moolenaar15146672011-10-20 22:22:38 +02004139" call Decho("..set up <s-up> and <s-down> maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004140 let s:didstarstar= 1
4141 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
4142 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
4143 endif
4144
4145 if has("path_extra")
Bram Moolenaar15146672011-10-20 22:22:38 +02004146" call Decho("..starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004147 if !exists("w:netrw_explore_indx")
4148 let w:netrw_explore_indx= 0
4149 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004150
Bram Moolenaar9964e462007-05-05 17:54:07 +00004151 let indx = a:indx
Bram Moolenaar15146672011-10-20 22:22:38 +02004152" call Decho("..starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004153
Bram Moolenaar9964e462007-05-05 17:54:07 +00004154 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004155 " Nexplore
Bram Moolenaar15146672011-10-20 22:22:38 +02004156" call Decho("..case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004157 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02004158 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 +02004159 sil! let @* = keepregstar
4160 sil! let @+ = keepregstar
4161 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004162" call Dret("netrw#Explore")
4163 return
4164 endif
4165 let indx= w:netrw_explore_indx
4166 if indx < 0 | let indx= 0 | endif
4167 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4168 let curfile= w:netrw_explore_list[indx]
Bram Moolenaar15146672011-10-20 22:22:38 +02004169" call Decho("....indx=".indx." curfile<".curfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004170 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
4171 let indx= indx + 1
Bram Moolenaar15146672011-10-20 22:22:38 +02004172" call Decho("....indx=".indx." (Nexplore while loop)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004173 endwhile
4174 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004175" call Decho("....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004176
4177 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004178 " Pexplore
4179" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004180 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02004181 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 +02004182 sil! let @* = keepregstar
4183 sil! let @+ = keepregstar
4184 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004185" call Dret("netrw#Explore")
4186 return
4187 endif
4188 let indx= w:netrw_explore_indx
4189 if indx < 0 | let indx= 0 | endif
4190 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4191 let curfile= w:netrw_explore_list[indx]
Bram Moolenaar15146672011-10-20 22:22:38 +02004192" call Decho("....indx=".indx." curfile<".curfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004193 while indx >= 0 && curfile == w:netrw_explore_list[indx]
4194 let indx= indx - 1
Bram Moolenaar15146672011-10-20 22:22:38 +02004195" call Decho("....indx=".indx." (Pexplore while loop)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004196 endwhile
4197 if indx < 0 | let indx= 0 | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004198" call Decho("....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004199
4200 else
4201 " Explore -- initialize
4202 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar15146672011-10-20 22:22:38 +02004203" call Decho("..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004204 keepj call s:NetrwClearExplore()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004205 let w:netrw_explore_indx= 0
4206 if !exists("b:netrw_curdir")
4207 let b:netrw_curdir= getcwd()
4208 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004209" call Decho("....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004210
Bram Moolenaar446cb832008-06-24 21:56:24 +00004211 " switch on starpat to build the w:netrw_explore_list of files
4212 if starpat == 1
4213 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaar15146672011-10-20 22:22:38 +02004214" call Decho("..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls)
4215" call Decho("....pattern<".pattern.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004216 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004217 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004218 catch /^Vim\%((\a\+)\)\=:E480/
4219 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
4220" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
4221 return
4222 endtry
4223 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004224 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4225
4226 elseif starpat == 2
4227 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaar15146672011-10-20 22:22:38 +02004228" call Decho("..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)")
4229" call Decho("....pattern<".pattern.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004230 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004231 exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004232 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar5c736222010-01-06 20:54:52 +01004233 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004234 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004235 sil! let @* = keepregstar
4236 sil! let @+ = keepregstar
4237 sil! let @/ = keepregslash
Bram Moolenaar446cb832008-06-24 21:56:24 +00004238" call Dret("netrw#Explore : no files matched pattern")
4239 return
4240 endtry
4241 let s:netrw_curdir = b:netrw_curdir
4242 let w:netrw_explore_list = getqflist()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004243 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 +02004244 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004245
4246 elseif starpat == 3
4247 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaar15146672011-10-20 22:22:38 +02004248" call Decho("..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004249 let filepat= substitute(dirname,'^\*/','','')
4250 let filepat= substitute(filepat,'^[%#<]','\\&','')
Bram Moolenaar15146672011-10-20 22:22:38 +02004251" call Decho("....b:netrw_curdir<".b:netrw_curdir.">")
4252" call Decho("....filepat<".filepat.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004253 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
4254 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004255
4256 elseif starpat == 4
4257 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
Bram Moolenaar15146672011-10-20 22:22:38 +02004258" call Decho("..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004259 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004260 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
4261 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00004262
4263 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar15146672011-10-20 22:22:38 +02004264" call Decho("....w:netrw_explore_list<".string(w:netrw_explore_list).">")
4265" call Decho("....w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004266
4267 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004268 keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004269 sil! let @* = keepregstar
4270 sil! let @+ = keepregstar
4271 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004272" call Dret("netrw#Explore : no files matched")
4273 return
4274 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004275 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004276
4277 " NetrwStatusLine support - for exploring support
4278 let w:netrw_explore_indx= indx
Bram Moolenaar15146672011-10-20 22:22:38 +02004279" call Decho("....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004280
4281 " wrap the indx around, but issue a note
4282 if indx >= w:netrw_explore_listlen || indx < 0
Bram Moolenaar15146672011-10-20 22:22:38 +02004283" call Decho("....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004284 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
4285 let w:netrw_explore_indx= indx
Bram Moolenaaradc21822011-04-01 18:03:16 +02004286 keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004287 endif
4288
4289 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar15146672011-10-20 22:22:38 +02004290" call Decho("....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004291 let newdir= substitute(dirfile,'/[^/]*$','','e')
Bram Moolenaar15146672011-10-20 22:22:38 +02004292" call Decho("....newdir<".newdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004293
Bram Moolenaar15146672011-10-20 22:22:38 +02004294" call Decho("....calling LocalBrowseCheck(newdir<".newdir.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004295 call netrw#LocalBrowseCheck(newdir)
4296 if !exists("w:netrw_liststyle")
4297 let w:netrw_liststyle= g:netrw_liststyle
4298 endif
4299 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004300 keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004301 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004302 keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004303 endif
4304 let w:netrw_explore_mtchcnt = indx + 1
4305 let w:netrw_explore_bufnr = bufnr("%")
4306 let w:netrw_explore_line = line(".")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004307 keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar15146672011-10-20 22:22:38 +02004308" 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 +00004309
4310 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004311" call Decho("..your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004312 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004313 keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004314 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004315 sil! let @* = keepregstar
4316 sil! let @+ = keepregstar
4317 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004318" call Dret("netrw#Explore : missing +path_extra")
4319 return
4320 endif
4321
4322 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004323" call Decho("..default case: Explore newdir<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004324 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004325 sil! unlet w:netrw_treedict
4326 sil! unlet w:netrw_treetop
Bram Moolenaar9964e462007-05-05 17:54:07 +00004327 endif
4328 let newdir= dirname
4329 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004330 keepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaar9964e462007-05-05 17:54:07 +00004331 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004332 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00004333 endif
4334 endif
4335
Bram Moolenaar446cb832008-06-24 21:56:24 +00004336 " visual display of **/ **// */ Exploration files
Bram Moolenaar5c736222010-01-06 20:54:52 +01004337" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
4338" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004339 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004340" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004341 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
4342 " only update match list if current directory isn't the same as before
Bram Moolenaar5c736222010-01-06 20:54:52 +01004343" call Decho("only update match list if current directory not the same as before")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004344 let s:explore_prvdir = b:netrw_curdir
4345 let s:explore_match = ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004346 let dirlen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004347 if b:netrw_curdir !~ '/$'
4348 let dirlen= dirlen + 1
4349 endif
4350 let prvfname= ""
4351 for fname in w:netrw_explore_list
4352" call Decho("fname<".fname.">")
4353 if fname =~ '^'.b:netrw_curdir
4354 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004355 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004356 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004357 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004358 endif
4359 elseif fname !~ '^/' && fname != prvfname
4360 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004361 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004362 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004363 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004364 endif
4365 endif
4366 let prvfname= fname
4367 endfor
4368" call Decho("explore_match<".s:explore_match.">")
4369 exe "2match netrwMarkFile /".s:explore_match."/"
4370 endif
4371 echo "<s-up>==Pexplore <s-down>==Nexplore"
4372 else
4373 2match none
4374 if exists("s:explore_match") | unlet s:explore_match | endif
4375 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
4376 echo " "
4377" call Decho("cleared explore match list")
4378 endif
4379
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004380 sil! let @* = keepregstar
4381 sil! let @+ = keepregstar
4382 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004383" call Dret("netrw#Explore : @/<".@/.">")
4384endfun
4385
4386" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004387" s:NetrwExploreListUniq: {{{2
4388fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02004389" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004390
4391 " this assumes that the list is already sorted
4392 let newexplist= []
4393 for member in a:explist
4394 if !exists("uniqmember") || member != uniqmember
4395 let uniqmember = member
4396 let newexplist = newexplist + [ member ]
4397 endif
4398 endfor
4399
Bram Moolenaar15146672011-10-20 22:22:38 +02004400" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004401 return newexplist
4402endfun
4403
4404" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004405" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4406fun! s:NetrwForceChgDir(islocal,newdir)
4407" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
4408 if a:newdir !~ '/$'
4409 " ok, looks like force is needed to get directory-style treatment
4410 if a:newdir =~ '@$'
4411 let newdir= substitute(a:newdir,'@$','/','')
4412 elseif a:newdir =~ '[*=|\\]$'
4413 let newdir= substitute(a:newdir,'.$','/','')
4414 else
4415 let newdir= a:newdir.'/'
4416 endif
4417" call Decho("adjusting newdir<".newdir."> due to gd")
4418 else
4419 " should already be getting treatment as a directory
4420 let newdir= a:newdir
4421 endif
4422 call s:NetrwBrowseChgDir(a:islocal,newdir)
4423 call s:NetrwBrowse(a:islocal,newdir)
4424" call Dret("s:NetrwForceChgDir")
4425endfun
4426
4427" ---------------------------------------------------------------------
4428" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4429fun! s:NetrwForceFile(islocal,newfile)
4430" " call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newdir.">)")
4431 if a:newfile =~ '[/@*=|\\]$'
4432 let newfile= substitute(a:newfile,'.$','','')
4433 else
4434 let newfile= a:newfile
4435 endif
4436 call s:NetrwBrowseChgDir(a:islocal,newfile)
4437" call Dret("s:NetrwForceFile")
4438endfun
4439
4440" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004441" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4442" and switches the hiding mode. The actual hiding is done by
4443" s:NetrwListHide().
4444" g:netrw_hide= 0: show all
4445" 1: show not-hidden files
4446" 2: show hidden files only
4447fun! s:NetrwHide(islocal)
4448" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
4449 let svpos= netrw#NetrwSavePosn()
4450
4451 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4452" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4453" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4454
4455 " hide the files in the markfile list
4456 for fname in s:netrwmarkfilelist_{bufnr("%")}
4457" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
4458 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4459 " remove fname from hiding list
4460 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4461 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4462 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4463" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4464 else
4465 " append fname to hiding list
4466 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4467 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4468 else
4469 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4470 endif
4471" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4472 endif
4473 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004474 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004475 let g:netrw_hide= 1
4476
4477 else
4478
4479 " switch between show-all/show-not-hidden/show-hidden
4480 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004481 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004482 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004483 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004484" call Dret("NetrwHide")
4485 return
4486 endif
4487 endif
4488
Bram Moolenaaradc21822011-04-01 18:03:16 +02004489 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4490 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004491" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004492endfun
4493
4494" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004495" s:NetrwHidden: invoked by "gh" {{{2
4496fun! s:NetrwHidden(islocal)
4497" call Dfunc("s:NetrwHidden()")
4498 " save current position
4499 let svpos= netrw#NetrwSavePosn()
4500
4501 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4502 " remove pattern from hiding list
4503 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004504 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004505 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4506 else
4507 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4508 endif
4509
4510 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004511 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4512 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004513" call Dret("s:NetrwHidden")
4514endfun
4515
4516" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004517" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4518fun! s:NetrwHome()
4519 if exists("g:netrw_home")
4520 let home= g:netrw_home
4521 else
4522 " go to vim plugin home
4523 for home in split(&rtp,',') + ['']
4524 if isdirectory(home) && filewritable(home) | break | endif
4525 let basehome= substitute(home,'[/\\]\.vim$','','')
4526 if isdirectory(basehome) && filewritable(basehome)
4527 let home= basehome."/.vim"
4528 break
4529 endif
4530 endfor
4531 if home == ""
4532 " just pick the first directory
4533 let home= substitute(&rtp,',.*$','','')
4534 endif
4535 if (has("win32") || has("win95") || has("win64") || has("win16"))
4536 let home= substitute(home,'/','\\','g')
4537 endif
4538 endif
4539 " insure that the home directory exists
4540 if !isdirectory(home)
4541 if exists("g:netrw_mkdir")
4542 call system(g:netrw_mkdir." ".shellescape(home))
4543 else
4544 call mkdir(home)
4545 endif
4546 endif
4547 let g:netrw_home= home
4548 return home
4549endfun
4550
4551" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004552" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4553fun! s:NetrwLeftmouse(islocal)
4554" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004555
4556 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02004557 while getchar(0) != 0
4558 "clear the input stream
4559 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004560 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004561 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004562 let mouse_lnum = v:mouse_lnum
4563 let wlastline = line('w$')
4564 let lastline = line('$')
4565" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
4566" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
4567 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
4568 " appears to be a status bar leftmouse click
4569" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
4570 return
4571 endif
4572 if v:mouse_col != col('.')
4573" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
4574 return
4575 endif
4576
Bram Moolenaar446cb832008-06-24 21:56:24 +00004577 if a:islocal
4578 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004579 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004580 endif
4581 else
4582 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004583 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004584 endif
4585 endif
4586" call Dret("s:NetrwLeftmouse")
4587endfun
4588
4589" ---------------------------------------------------------------------
4590" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
4591" separated patterns given in g:netrw_list_hide
4592fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004593" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004594
4595 " find a character not in the "hide" string to use as a separator for :g and :v commands
4596 " How-it-works: take the hiding command, convert it into a range. Duplicate
4597 " characters don't matter. Remove all such characters from the '/~...90'
4598 " string. Use the first character left as a separator character.
4599 let listhide= g:netrw_list_hide
4600 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
4601" call Decho("sep=".sep)
4602
4603 while listhide != ""
4604 if listhide =~ ','
4605 let hide = substitute(listhide,',.*$','','e')
4606 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
4607 else
4608 let hide = listhide
4609 let listhide = ""
4610 endif
4611
4612 " Prune the list by hiding any files which match
4613 if g:netrw_hide == 1
4614" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004615 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004616 elseif g:netrw_hide == 2
4617" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004618 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004619 endif
4620 endwhile
4621 if g:netrw_hide == 2
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004622 exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
4623 exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004624 endif
4625
Bram Moolenaaradc21822011-04-01 18:03:16 +02004626 " remove any blank lines that have somehow remained.
4627 " This seems to happen under Windows.
4628 exe 'sil! keepj 1,$g@^\s*$@d'
4629
Bram Moolenaar446cb832008-06-24 21:56:24 +00004630" call Dret("NetrwListHide")
4631endfun
4632
4633" ---------------------------------------------------------------------
4634" NetrwHideEdit: allows user to edit the file/directory hiding list
4635fun! s:NetrwHideEdit(islocal)
4636" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
4637
4638 " save current cursor position
4639 let svpos= netrw#NetrwSavePosn()
4640
4641 " get new hiding list from user
4642 call inputsave()
4643 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
4644 call inputrestore()
4645 let g:netrw_list_hide= newhide
4646" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
4647
4648 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004649 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004650
4651 " restore cursor position
4652 call netrw#NetrwRestorePosn(svpos)
4653
4654" call Dret("NetrwHideEdit")
4655endfun
4656
4657" ---------------------------------------------------------------------
4658" NetSortSequence: allows user to edit the sorting sequence
4659fun! s:NetSortSequence(islocal)
4660" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
4661
4662 let svpos= netrw#NetrwSavePosn()
4663 call inputsave()
4664 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
4665 call inputrestore()
4666
4667 " refresh the listing
4668 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02004669 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4670 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004671
4672" call Dret("NetSortSequence")
4673endfun
4674
4675" ---------------------------------------------------------------------
4676" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4677fun! s:NetrwMakeDir(usrhost)
4678" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4679
4680 " get name of new directory from user. A bare <CR> will skip.
4681 " if its currently a directory, also request will be skipped, but with
4682 " a message.
4683 call inputsave()
4684 let newdirname= input("Please give directory name: ")
4685 call inputrestore()
4686" call Decho("newdirname<".newdirname.">")
4687
4688 if newdirname == ""
4689" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4690 return
4691 endif
4692
4693 if a:usrhost == ""
4694" call Decho("local mkdir")
4695
4696 " Local mkdir:
4697 " sanity checks
4698 let fullnewdir= b:netrw_curdir.'/'.newdirname
4699" call Decho("fullnewdir<".fullnewdir.">")
4700 if isdirectory(fullnewdir)
4701 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004702 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004703 endif
4704" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4705 return
4706 endif
4707 if s:FileReadable(fullnewdir)
4708 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004709 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004710 endif
4711" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4712 return
4713 endif
4714
4715 " requested new local directory is neither a pre-existing file or
4716 " directory, so make it!
4717 if exists("*mkdir")
4718 call mkdir(fullnewdir,"p")
4719 else
4720 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004721 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004722" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004723" call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
4724 exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004725 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004726 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004727" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
4728 endif
4729 endif
4730
4731 if v:shell_error == 0
4732 " refresh listing
4733" call Decho("refresh listing")
4734 let svpos= netrw#NetrwSavePosn()
4735 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4736 call netrw#NetrwRestorePosn(svpos)
4737 elseif !exists("g:netrw_quiet")
4738 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4739 endif
4740" redraw!
4741
4742 elseif !exists("b:netrw_method") || b:netrw_method == 4
4743 " Remote mkdir:
4744" call Decho("remote mkdir")
4745 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4746 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02004747" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004748 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004749 if v:shell_error == 0
4750 " refresh listing
4751 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004752 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4753 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004754 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004755 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004756 endif
4757" redraw!
4758
4759 elseif b:netrw_method == 2
Bram Moolenaar15146672011-10-20 22:22:38 +02004760 let svpos= netrw#NetrwSavePosn()
4761 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
4762 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4763 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004764 elseif b:netrw_method == 3
Bram Moolenaar15146672011-10-20 22:22:38 +02004765 let svpos= netrw#NetrwSavePosn()
4766 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
4767 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4768 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004769 endif
4770
4771" call Dret("NetrwMakeDir")
4772endfun
4773
4774" ---------------------------------------------------------------------
4775" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
4776" mark and unmark files. If a markfile list exists,
4777" then the rename and delete functions will use it instead
4778" of whatever may happen to be under the cursor at that
4779" moment. When the mouse and gui are available,
4780" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004781"
4782" Creates two lists
4783" s:netrwmarkfilelist -- holds complete paths to all marked files
4784" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
4785"
4786" Creates a marked file match string
4787" s:netrwmarfilemtch_# -- used with 2match to display marked files
4788"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004789" Creates a buffer version of islocal
4790" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004791fun! s:NetrwMarkFile(islocal,fname)
4792" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
4793 let curbufnr= bufnr("%")
4794 let curdir = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004795 let trailer = '[@=|\/\*]\=\>'
Bram Moolenaaradc21822011-04-01 18:03:16 +02004796
Bram Moolenaar446cb832008-06-24 21:56:24 +00004797 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004798 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00004799" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4800" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004801 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004802
4803 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004804 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004805" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4806 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004807 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004808
4809 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004810 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004811" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4812 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
4813 if s:netrwmarkfilelist_{curbufnr} == []
4814 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01004815" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004816 call s:NetrwUnmarkList(curbufnr,curdir)
4817 else
4818 " rebuild match list to display markings correctly
4819" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
4820 let s:netrwmarkfilemtch_{curbufnr}= ""
4821 let first = 1
4822 for fname in s:netrwmarkfilelist_{curbufnr}
4823 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01004824 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004825 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004826 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004827 endif
4828 let first= 0
4829 endfor
Bram Moolenaar15146672011-10-20 22:22:38 +02004830" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004831 endif
4832 endif
4833
4834 else
4835 " initialize new markfilelist
4836
4837" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
4838 let s:netrwmarkfilelist_{curbufnr}= []
4839 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
4840" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4841
4842 " build initial markfile matching pattern
4843 if a:fname =~ '/$'
4844 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
4845 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004846 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004847 endif
4848" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4849 endif
4850
4851 " handle global markfilelist
4852 if exists("s:netrwmarkfilelist")
4853 let dname= s:ComposePath(b:netrw_curdir,a:fname)
4854 if index(s:netrwmarkfilelist,dname) == -1
4855 " append new filename to global markfilelist
4856 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4857" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
4858 else
4859 " remove new filename from global markfilelist
4860" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
4861 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
4862" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
4863 if s:netrwmarkfilelist == []
4864 unlet s:netrwmarkfilelist
4865 endif
4866 endif
4867 else
4868 " initialize new global-directory markfilelist
4869 let s:netrwmarkfilelist= []
4870 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4871" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
4872 endif
4873
4874 " set up 2match'ing to netrwmarkfilemtch list
4875 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
4876" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004877 if exists("g:did_drchip_netrwlist_syntax")
4878 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
4879 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004880 else
4881" call Decho("2match none")
4882 2match none
4883 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004884" 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 +00004885endfun
4886
4887" ---------------------------------------------------------------------
4888" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
4889" compress/decompress files using the programs
4890" in g:netrw_compress and g:netrw_uncompress,
4891" using g:netrw_compress_suffix to know which to
4892" do. By default:
4893" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004894" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00004895fun! s:NetrwMarkFileCompress(islocal)
4896" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
4897 let svpos = netrw#NetrwSavePosn()
4898 let curdir = b:netrw_curdir
4899 let curbufnr = bufnr("%")
4900
4901 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
4902 for fname in s:netrwmarkfilelist_{curbufnr}
4903 " for every filename in the marked list
4904 for sfx in sort(keys(g:netrw_decompress))
4905 if fname =~ '\'.sfx.'$'
4906 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaar5c736222010-01-06 20:54:52 +01004907 let exe= netrw#WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00004908" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
4909 if a:islocal
4910 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004911 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004912 endif
4913 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004914 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004915 endif
4916 if executable(exe)
4917 if a:islocal
4918 call system(exe." ".fname)
4919 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004920 keepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004921 endif
4922 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004923 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004924 endif
4925 break
4926 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004927 unlet sfx
Bram Moolenaar446cb832008-06-24 21:56:24 +00004928 endfor
4929 if exists("exe")
4930 unlet exe
4931 elseif a:islocal
4932 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004933 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004934 else
4935 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02004936 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004937 endif
4938 endfor
4939 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004940 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4941 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004942 endif
4943" call Dret("s:NetrwMarkFileCompress")
4944endfun
4945
4946" ---------------------------------------------------------------------
4947" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
4948" If no marked files, then set up directory as the
4949" target. Currently does not support copying entire
4950" directories. Uses the local-buffer marked file list.
4951" Returns 1=success (used by NetrwMarkFileMove())
4952" 0=failure
4953fun! s:NetrwMarkFileCopy(islocal)
4954" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
4955
4956 " sanity checks
4957 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar251e1912011-06-19 05:09:16 +02004958 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 +00004959" call Dret("s:NetrwMarkFileCopy 0")
4960 return 0
4961 endif
4962" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4963 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02004964 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004965" call Dret("s:NetrwMarkFileCopy 0")
4966 return 0
4967 endif
4968" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4969 let curdir = b:netrw_curdir
4970 let curbufnr = bufnr("%")
4971
4972 if a:islocal && s:netrwmftgt_islocal
4973 " Copy marked files, local directory to local directory
4974" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004975 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004976" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004977 call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004978
4979 elseif a:islocal && !s:netrwmftgt_islocal
4980 " Copy marked files, local directory to remote directory
4981" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004982 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004983
4984 elseif !a:islocal && s:netrwmftgt_islocal
4985" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004986 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004987
4988 elseif !a:islocal && !s:netrwmftgt_islocal
4989" call Decho("copy from remote to remote")
4990 let curdir = getcwd()
4991 let tmpdir = s:GetTempfile("")
4992 if tmpdir !~ '/'
4993 let tmpdir= curdir."/".tmpdir
4994 endif
4995 if exists("*mkdir")
4996 call mkdir(tmpdir)
4997 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004998 exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004999 endif
5000 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005001 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005002 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005003 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02005004 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005005 if getcwd() == tmpdir
5006 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005007 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005008 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005009 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005010 exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005011 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005012 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005013 endif
5014 endif
5015 endif
5016
5017 " -------
5018 " cleanup
5019 " -------
5020" call Decho("cleanup")
5021
5022 " remove markings from local buffer
5023 call s:NetrwUnmarkList(curbufnr,curdir)
5024
5025 " refresh buffers
5026 if !s:netrwmftgt_islocal
5027 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
5028 endif
5029 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005030 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005031 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005032 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005033 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005034 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005035
5036" call Dret("s:NetrwMarkFileCopy 1")
5037 return 1
5038endfun
5039
5040" ---------------------------------------------------------------------
5041" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
5042" invoke vim's diff mode on the marked files.
5043" Either two or three files can be so handled.
5044" Uses the global marked file list.
5045fun! s:NetrwMarkFileDiff(islocal)
5046" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
5047 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005048
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005049 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005050 let cnt = 0
5051 let curdir = b:netrw_curdir
5052 for fname in s:netrwmarkfilelist
5053 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005054 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005055" call Decho("diffthis: fname<".fname.">")
5056 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005057 diffthis
5058 elseif cnt == 2 || cnt == 3
5059 vsplit
5060 wincmd l
5061" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005062 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005063 diffthis
5064 else
5065 break
5066 endif
5067 endfor
5068 call s:NetrwUnmarkList(curbufnr,curdir)
5069 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005070
Bram Moolenaar446cb832008-06-24 21:56:24 +00005071" call Dret("s:NetrwMarkFileDiff")
5072endfun
5073
5074" ---------------------------------------------------------------------
5075" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
5076" Uses global markfilelist
5077fun! s:NetrwMarkFileEdit(islocal)
5078" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
5079
5080 let curdir = b:netrw_curdir
5081 let curbufnr = bufnr("%")
5082 if exists("s:netrwmarkfilelist_{curbufnr}")
5083 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005084 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005085 " unmark markedfile list
5086" call s:NetrwUnmarkList(curbufnr,curdir)
5087 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005088" call Decho("exe sil args ".flist)
5089 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005090 endif
5091
5092" call Dret("s:NetrwMarkFileEdit")
5093endfun
5094
5095" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005096" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005097" Uses the local marked-file list.
5098fun! s:NetrwMarkFileExe(islocal)
5099" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
5100 let svpos = netrw#NetrwSavePosn()
5101 let curdir = b:netrw_curdir
5102 let curbufnr = bufnr("%")
5103
5104 if exists("s:netrwmarkfilelist_{curbufnr}")
5105 " get the command
5106 call inputsave()
5107 let cmd= input("Enter command: ","","file")
5108 call inputrestore()
5109" call Decho("cmd<".cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02005110 if cmd == ""
5111" " call Dret("s:NetrwMarkFileExe : early exit, empty command")
5112 return
5113 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005114
5115 " apply command to marked files. Substitute: filename -> %
5116 " If no %, then append a space and the filename to the command
5117 for fname in s:netrwmarkfilelist_{curbufnr}
5118 if a:islocal
5119 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01005120 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005121 endif
5122 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005123 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005124 endif
5125 if cmd =~ '%'
5126 let xcmd= substitute(cmd,'%',fname,'g')
5127 else
5128 let xcmd= cmd.' '.fname
5129 endif
5130 if a:islocal
5131" call Decho("local: xcmd<".xcmd.">")
5132 let ret= system(xcmd)
5133 else
5134" call Decho("remote: xcmd<".xcmd.">")
5135 let ret= s:RemoteSystem(xcmd)
5136 endif
5137 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02005138 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005139 break
5140 else
5141 echo ret
5142 endif
5143 endfor
5144
5145 " unmark marked file list
5146 call s:NetrwUnmarkList(curbufnr,curdir)
5147
5148 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005149 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5150 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005151 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005152 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005153 endif
5154
5155" call Dret("s:NetrwMarkFileExe")
5156endfun
5157
5158" ---------------------------------------------------------------------
5159" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5160" as the marked file(s) (toggles suffix presence)
5161" Uses the local marked file list.
5162fun! s:NetrwMarkHideSfx(islocal)
5163" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5164 let svpos = netrw#NetrwSavePosn()
5165 let curbufnr = bufnr("%")
5166
5167 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5168 if exists("s:netrwmarkfilelist_{curbufnr}")
5169
5170 for fname in s:netrwmarkfilelist_{curbufnr}
5171" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5172 " construct suffix pattern
5173 if fname =~ '\.'
5174 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5175 else
5176 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5177 endif
5178 " determine if its in the hiding list or not
5179 let inhidelist= 0
5180 if g:netrw_list_hide != ""
5181 let itemnum = 0
5182 let hidelist= split(g:netrw_list_hide,',')
5183 for hidepat in hidelist
5184 if sfxpat == hidepat
5185 let inhidelist= 1
5186 break
5187 endif
5188 let itemnum= itemnum + 1
5189 endfor
5190 endif
5191" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5192 if inhidelist
5193 " remove sfxpat from list
5194 call remove(hidelist,itemnum)
5195 let g:netrw_list_hide= join(hidelist,",")
5196 elseif g:netrw_list_hide != ""
5197 " append sfxpat to non-empty list
5198 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5199 else
5200 " set hiding list to sfxpat
5201 let g:netrw_list_hide= sfxpat
5202 endif
5203 endfor
5204
5205 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005206 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5207 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005208 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005209 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005210 endif
5211
5212" call Dret("s:NetrwMarkHideSfx")
5213endfun
5214
5215" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005216" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
5217" Uses the local marked-file list.
5218fun! s:NetrwMarkFileVimCmd(islocal)
5219" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
5220 let svpos = netrw#NetrwSavePosn()
5221 let curdir = b:netrw_curdir
5222 let curbufnr = bufnr("%")
5223
5224 if exists("s:netrwmarkfilelist_{curbufnr}")
5225 " get the command
5226 call inputsave()
5227 let cmd= input("Enter vim command: ","","file")
5228 call inputrestore()
5229" call Decho("cmd<".cmd.">")
5230 if cmd == ""
5231" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
5232 return
5233 endif
5234
5235 " apply command to marked files. Substitute: filename -> %
5236 " If no %, then append a space and the filename to the command
5237 for fname in s:netrwmarkfilelist_{curbufnr}
5238" call Decho("fname<".fname.">")
5239 if a:islocal
5240 1split
5241 exe "sil! keepalt e ".fnameescape(fname)
5242" call Decho("local<".fname.">: exe ".cmd)
5243 exe cmd
5244 exe "sil! keepalt wq!"
5245 else
5246 " COMBAK -- not supported yet
5247" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
5248 echo "sorry, \"mX\" not supported yet for remote files"
5249 endif
5250 endfor
5251
5252 " unmark marked file list
5253 call s:NetrwUnmarkList(curbufnr,curdir)
5254
5255 " refresh the listing
5256 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5257 keepj call netrw#NetrwRestorePosn(svpos)
5258 else
5259 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5260 endif
5261
5262" call Dret("s:NetrwMarkFileVimCmd")
5263endfun
5264
5265" ---------------------------------------------------------------------
5266" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5267" as the marked file(s) (toggles suffix presence)
5268" Uses the local marked file list.
5269fun! s:NetrwMarkHideSfx(islocal)
5270" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5271 let svpos = netrw#NetrwSavePosn()
5272 let curbufnr = bufnr("%")
5273
5274 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5275 if exists("s:netrwmarkfilelist_{curbufnr}")
5276
5277 for fname in s:netrwmarkfilelist_{curbufnr}
5278" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5279 " construct suffix pattern
5280 if fname =~ '\.'
5281 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5282 else
5283 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5284 endif
5285 " determine if its in the hiding list or not
5286 let inhidelist= 0
5287 if g:netrw_list_hide != ""
5288 let itemnum = 0
5289 let hidelist= split(g:netrw_list_hide,',')
5290 for hidepat in hidelist
5291 if sfxpat == hidepat
5292 let inhidelist= 1
5293 break
5294 endif
5295 let itemnum= itemnum + 1
5296 endfor
5297 endif
5298" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5299 if inhidelist
5300 " remove sfxpat from list
5301 call remove(hidelist,itemnum)
5302 let g:netrw_list_hide= join(hidelist,",")
5303 elseif g:netrw_list_hide != ""
5304 " append sfxpat to non-empty list
5305 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5306 else
5307 " set hiding list to sfxpat
5308 let g:netrw_list_hide= sfxpat
5309 endif
5310 endfor
5311
5312 " refresh the listing
5313 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5314 keepj call netrw#NetrwRestorePosn(svpos)
5315 else
5316 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5317 endif
5318
5319" call Dret("s:NetrwMarkHideSfx")
5320endfun
5321
5322" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005323" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
5324" Uses the global markfilelist
5325fun! s:NetrwMarkFileGrep(islocal)
5326" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
5327 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005328 let curbufnr = bufnr("%")
5329
5330 if exists("s:netrwmarkfilelist")
5331" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005332 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005333 call s:NetrwUnmarkAll()
5334
5335 " ask user for pattern
5336 call inputsave()
5337 let pat= input("Enter pattern: ","")
5338 call inputrestore()
5339 if pat !~ '^\s'
5340 if pat !~ '^/'
5341 let pat= '/'.pat.'/'
5342 endif
5343 let pat= " ".pat
5344 endif
5345
5346 " use vimgrep for both local and remote
5347" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005348 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005349 exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist
Bram Moolenaar5c736222010-01-06 20:54:52 +01005350 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaaradc21822011-04-01 18:03:16 +02005351 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005352" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">")
5353 return
5354 endtry
Bram Moolenaar446cb832008-06-24 21:56:24 +00005355
5356 2match none
Bram Moolenaaradc21822011-04-01 18:03:16 +02005357 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005358 endif
5359
5360" call Dret("s:NetrwMarkFileGrep")
5361endfun
5362
5363" ---------------------------------------------------------------------
5364" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
5365" uses the global marked file list
5366" s:netrwmfloc= 0: target directory is remote
5367" = 1: target directory is local
5368fun! s:NetrwMarkFileMove(islocal)
5369" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
5370 let curdir = b:netrw_curdir
5371 let curbufnr = bufnr("%")
5372
5373 " sanity check
5374 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaaradc21822011-04-01 18:03:16 +02005375 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005376" call Dret("s:NetrwMarkFileMove")
5377 return
5378 endif
5379" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
5380 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005381 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005382" call Dret("s:NetrwMarkFileCopy 0")
5383 return 0
5384 endif
5385" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
5386
5387 if a:islocal && s:netrwmftgt_islocal
5388 " move: local -> local
5389" call Decho("move from local to local")
5390" call Decho("(s:NetrwMarkFileMove) local to local move")
5391 if executable(g:netrw_localmovecmd)
5392 for fname in s:netrwmarkfilelist_{bufnr("%")}
5393" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
5394 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
5395 if v:shell_error < 0
5396 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
5397 break
5398 endif
5399 endfor
5400 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005401 keepj call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005402 endif
5403
5404 elseif a:islocal && !s:netrwmftgt_islocal
5405 " move: local -> remote
5406" call Decho("move from local to remote")
5407" call Decho("copy")
5408 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005409 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005410" call Decho("remove")
5411 for fname in mflist
5412 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5413 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
5414 endfor
5415 unlet mflist
5416
5417 elseif !a:islocal && s:netrwmftgt_islocal
5418 " move: remote -> local
5419" call Decho("move from remote to local")
5420" call Decho("copy")
5421 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005422 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005423" call Decho("remove")
5424 for fname in mflist
5425 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5426 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5427 endfor
5428 unlet mflist
5429
5430 elseif !a:islocal && !s:netrwmftgt_islocal
5431 " move: remote -> remote
5432" call Decho("move from remote to remote")
5433" call Decho("copy")
5434 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005435 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005436" call Decho("remove")
5437 for fname in mflist
5438 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5439 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5440 endfor
5441 unlet mflist
5442 endif
5443
5444 " -------
5445 " cleanup
5446 " -------
5447" call Decho("cleanup")
5448
5449 " remove markings from local buffer
5450 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
5451
5452 " refresh buffers
5453 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005454" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
5455 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005456 endif
5457 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005458" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
5459 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005460 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005461 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005462" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
5463 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005464 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005465
5466" call Dret("s:NetrwMarkFileMove")
5467endfun
5468
5469" ---------------------------------------------------------------------
5470" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
5471" using the hardcopy command. Local marked-file list only.
5472fun! s:NetrwMarkFilePrint(islocal)
5473" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
5474 let curbufnr= bufnr("%")
5475 if exists("s:netrwmarkfilelist_{curbufnr}")
5476 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
5477 let curdir = b:netrw_curdir
5478 call s:NetrwUnmarkList(curbufnr,curdir)
5479 for fname in netrwmarkfilelist
5480 if a:islocal
5481 if g:netrw_keepdir
5482 let fname= s:ComposePath(curdir,fname)
5483 endif
5484 else
5485 let fname= curdir.fname
5486 endif
5487 1split
5488 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02005489" call Decho("exe sil e ".escape(fname,' '))
5490 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005491" call Decho("hardcopy")
5492 hardcopy
5493 q
5494 endfor
5495 2match none
5496 endif
5497" call Dret("s:NetrwMarkFilePrint")
5498endfun
5499
5500" ---------------------------------------------------------------------
5501" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
5502" files when given a regexp (for which a prompt is
5503" issued).
5504fun! s:NetrwMarkFileRegexp(islocal)
5505" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
5506
5507 " get the regular expression
5508 call inputsave()
5509 let regexp= input("Enter regexp: ","","file")
5510 call inputrestore()
5511
5512 if a:islocal
5513 " get the matching list of files using local glob()
5514" call Decho("handle local regexp")
5515 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005516 let files = glob(s:ComposePath(dirname,regexp))
5517" call Decho("files<".files.">")
5518 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005519
5520 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01005521 for fname in filelist
5522" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005523 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005524 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00005525
5526 else
5527" call Decho("handle remote regexp")
5528
5529 " convert displayed listing into a filelist
5530 let eikeep = &ei
5531 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005532 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00005533 set ei=all ma
5534" call Decho("set ei=all ma")
5535 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02005536 keepj call s:NetrwEnew()
5537 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005538 sil keepj norm! "ap
5539 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005540 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005541 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005542 set bt=nofile
5543 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005544 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01005545 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005546 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005547 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01005548 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005549 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005550 sil keepj %s/^| //e
5551 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005552 call histdel("/",-1)
5553 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005554 endif
5555 " convert regexp into the more usual glob-style format
5556 let regexp= substitute(regexp,'\*','.*','g')
5557" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005558 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01005559 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005560 let filelist= getline(1,line("$"))
5561 q!
5562 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02005563 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005564 endfor
5565 unlet filelist
5566 let @a = areg
5567 let &ei = eikeep
5568 endif
5569
5570" call Dret("s:NetrwMarkFileRegexp")
5571endfun
5572
5573" ---------------------------------------------------------------------
5574" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
5575" Uses the local marked file list.
5576fun! s:NetrwMarkFileSource(islocal)
5577" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
5578 let curbufnr= bufnr("%")
5579 if exists("s:netrwmarkfilelist_{curbufnr}")
5580 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
5581 let curdir = b:netrw_curdir
5582 call s:NetrwUnmarkList(curbufnr,curdir)
5583 for fname in netrwmarkfilelist
5584 if a:islocal
5585 if g:netrw_keepdir
5586 let fname= s:ComposePath(curdir,fname)
5587 endif
5588 else
5589 let fname= curdir.fname
5590 endif
5591 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00005592" call Decho("exe so ".fnameescape(fname))
5593 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005594 endfor
5595 2match none
5596 endif
5597" call Dret("s:NetrwMarkFileSource")
5598endfun
5599
5600" ---------------------------------------------------------------------
5601" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
5602" Uses the global markfilelist
5603fun! s:NetrwMarkFileTag(islocal)
5604" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
5605 let svpos = netrw#NetrwSavePosn()
5606 let curdir = b:netrw_curdir
5607 let curbufnr = bufnr("%")
5608
5609 if exists("s:netrwmarkfilelist")
5610" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005611 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005612 call s:NetrwUnmarkAll()
5613
5614 if a:islocal
5615 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005616" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
5617 call system(g:netrw_ctags." ".netrwmarkfilelist)
5618 else
5619 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
5620 endif
5621 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005622 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005623 call netrw#NetrwObtain(a:islocal,"tags")
5624 let curdir= b:netrw_curdir
5625 1split
5626 e tags
5627 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
5628" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005629 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005630 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005631 wq!
5632 endif
5633 2match none
5634 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5635 call netrw#NetrwRestorePosn(svpos)
5636 endif
5637
5638" call Dret("s:NetrwMarkFileTag")
5639endfun
5640
5641" ---------------------------------------------------------------------
5642" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
5643" Sets up two variables,
5644" s:netrwmftgt : holds the target directory
5645" s:netrwmftgt_islocal : 0=target directory is remote
5646" 1=target directory is local
5647fun! s:NetrwMarkFileTgt(islocal)
5648" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
5649 let svpos = netrw#NetrwSavePosn()
5650 let curdir = b:netrw_curdir
5651 let hadtgt = exists("s:netrwmftgt")
5652 if !exists("w:netrw_bannercnt")
5653 let w:netrw_bannercnt= b:netrw_bannercnt
5654 endif
5655
5656 " set up target
5657 if line(".") < w:netrw_bannercnt
5658 " if cursor in banner region, use b:netrw_curdir for the target
5659 let s:netrwmftgt= b:netrw_curdir
5660" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
5661
5662 else
5663 " get word under cursor.
5664 " * If directory, use it for the target.
5665 " * If file, use b:netrw_curdir for the target
5666 let curword= s:NetrwGetWord()
5667 let tgtdir = s:ComposePath(curdir,curword)
5668 if a:islocal && isdirectory(tgtdir)
5669 let s:netrwmftgt = tgtdir
5670" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
5671 elseif !a:islocal && tgtdir =~ '/$'
5672 let s:netrwmftgt = tgtdir
5673" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
5674 else
5675 let s:netrwmftgt = curdir
5676" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
5677 endif
5678 endif
5679 if a:islocal
5680 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
5681 let s:netrwmftgt= simplify(s:netrwmftgt)
5682" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
5683 endif
5684 if g:netrw_cygwin
5685 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
5686 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
5687 endif
5688 let s:netrwmftgt_islocal= a:islocal
5689
Bram Moolenaar5c736222010-01-06 20:54:52 +01005690 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005691 call s:LocalBrowseShellCmdRefresh()
5692 endif
5693 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5694 call netrw#NetrwRestorePosn(svpos)
5695 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005696 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00005697 endif
5698
5699" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
5700endfun
5701
5702" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00005703" s:NetrwOpenFile: query user for a filename and open it {{{2
5704fun! s:NetrwOpenFile(islocal)
5705" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
5706 call inputsave()
5707 let fname= input("Enter filename: ")
5708 call inputrestore()
5709 if fname !~ '[/\\]'
5710 if exists("b:netrw_curdir")
5711 if exists("g:netrw_quiet")
5712 let netrw_quiet_keep = g:netrw_quiet
5713 endif
5714 let g:netrw_quiet = 1
5715 if b:netrw_curdir =~ '/$'
5716 exe "e ".fnameescape(b:netrw_curdir.fname)
5717 else
5718 exe "e ".fnameescape(b:netrw_curdir."/".fname)
5719 endif
5720 if exists("netrw_quiet_keep")
5721 let g:netrw_quiet= netrw_quiet_keep
5722 else
5723 unlet g:netrw_quiet
5724 endif
5725 endif
5726 else
5727 exe "e ".fnameescape(fname)
5728 endif
5729" call Dret("s:NetrwOpenFile")
5730endfun
5731
5732" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005733" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
5734fun! s:NetrwUnmarkList(curbufnr,curdir)
5735" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
5736
5737 " remove all files in local marked-file list from global list
5738 if exists("s:netrwmarkfilelist_{a:curbufnr}")
5739 for mfile in s:netrwmarkfilelist_{a:curbufnr}
5740 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
5741 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
5742 call remove(s:netrwmarkfilelist,idx) " remove from global list
5743 endfor
5744 if s:netrwmarkfilelist == []
5745 unlet s:netrwmarkfilelist
5746 endif
5747
5748 " getting rid of the local marked-file lists is easy
5749 unlet s:netrwmarkfilelist_{a:curbufnr}
5750 endif
5751 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
5752 unlet s:netrwmarkfilemtch_{a:curbufnr}
5753 endif
5754 2match none
5755" call Dret("s:NetrwUnmarkList")
5756endfun
5757
5758" ---------------------------------------------------------------------
5759" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
5760fun! s:NetrwUnmarkAll()
5761" call Dfunc("s:NetrwUnmarkAll()")
5762 if exists("s:netrwmarkfilelist")
5763 unlet s:netrwmarkfilelist
5764 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005765 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005766 2match none
5767" call Dret("s:NetrwUnmarkAll")
5768endfun
5769
5770" ---------------------------------------------------------------------
5771" s:NetrwUnmarkAll2: {{{2
5772fun! s:NetrwUnmarkAll2()
5773" call Dfunc("s:NetrwUnmarkAll2()")
5774 redir => netrwmarkfilelist_let
5775 let
5776 redir END
5777 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
5778 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
5779 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
5780 for flist in netrwmarkfilelist_list
5781 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
5782 unlet s:netrwmarkfilelist_{curbufnr}
5783 unlet s:netrwmarkfilemtch_{curbufnr}
5784 endfor
5785" call Dret("s:NetrwUnmarkAll2")
5786endfun
5787
5788" ---------------------------------------------------------------------
5789" s:NetrwUnMarkFile: {{{2
5790fun! s:NetrwUnMarkFile(islocal)
5791" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
5792 let svpos = netrw#NetrwSavePosn()
5793 let curbufnr = bufnr("%")
5794
5795 " unmark marked file list (although I expect s:NetrwUpload()
5796 " to do it, I'm just making sure)
5797 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5798" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
5799 unlet s:netrwmarkfilelist
5800 unlet s:netrwmarkfilelist_{curbufnr}
5801 unlet s:netrwmarkfilemtch_{curbufnr}
5802 2match none
5803 endif
5804
5805" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5806 call netrw#NetrwRestorePosn(svpos)
5807" call Dret("s:NetrwUnMarkFile")
5808endfun
5809
5810" ---------------------------------------------------------------------
5811" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5812fun! s:NetrwMenu(domenu)
5813
5814 if !exists("g:NetrwMenuPriority")
5815 let g:NetrwMenuPriority= 80
5816 endif
5817
Bram Moolenaaradc21822011-04-01 18:03:16 +02005818 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00005819" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5820
5821 if !exists("s:netrw_menu_enabled") && a:domenu
5822" call Decho("initialize menu")
5823 let s:netrw_menu_enabled= 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005824 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5825 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5826 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5827 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5828 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5829 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
5830 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
5831 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
5832 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
5833 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5834 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
5835 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
5836 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5837 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005838 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005839 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5840 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5841 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5842 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5843 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5844 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
5845 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
5846 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
5847 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
5848 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
5849 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
5850 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
5851 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5852 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5853 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5854 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5855 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5856 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5857 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5858 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5859 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5860 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5861 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5862 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5863 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5864 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5865 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5866 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5867 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5868 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5869 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5870 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5871 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5872 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5873 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005874 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
Bram Moolenaar446cb832008-06-24 21:56:24 +00005875 let s:netrw_menucnt= 28
5876
5877 elseif !a:domenu
5878 let s:netrwcnt = 0
5879 let curwin = winnr()
5880 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5881 exe curwin."wincmd w"
5882
5883 if s:netrwcnt <= 1
5884" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005885 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02005886" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005887 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00005888 endif
5889 endif
5890" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005891 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005892 endif
5893
5894endfun
5895
5896" ---------------------------------------------------------------------
5897" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
5898" Used by the O maps (as <SID>NetrwObtain())
5899fun! s:NetrwObtain(islocal)
5900" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
5901
5902 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005903 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
5904 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00005905 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
5906 else
5907 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
5908 endif
5909
5910" call Dret("NetrwObtain")
5911endfun
5912
5913" ---------------------------------------------------------------------
5914" netrw#NetrwObtain: {{{2
5915" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
5916" islocal=0 obtain from remote source
5917" =1 obtain from local source
5918" fname : a filename or a list of filenames
5919" tgtdir : optional place where files are to go (not present, uses getcwd())
5920fun! netrw#NetrwObtain(islocal,fname,...)
5921" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
5922 " NetrwStatusLine support - for obtaining support
5923
5924 if type(a:fname) == 1
5925 let fnamelist= [ a:fname ]
5926 elseif type(a:fname) == 3
5927 let fnamelist= a:fname
5928 else
5929 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
5930" call Dret("netrw#NetrwObtain")
5931 return
5932 endif
5933" call Decho("fnamelist<".string(fnamelist).">")
5934 if a:0 > 0
5935 let tgtdir= a:1
5936 else
5937 let tgtdir= getcwd()
5938 endif
5939" call Decho("tgtdir<".tgtdir.">")
5940
Bram Moolenaar5c736222010-01-06 20:54:52 +01005941 if exists("b:netrw_islocal") && b:netrw_islocal
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005942 " obtain a file from local b:netrw_curdir to (local) tgtdir
5943" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005944 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
5945 let topath= s:ComposePath(tgtdir,"")
5946 if (has("win32") || has("win95") || has("win64") || has("win16"))
5947 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005948" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005949 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00005950" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
5951 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005952 endfor
5953 else
5954 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005955" call Decho("transfer files with one command")
5956 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005957" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
5958 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
5959 endif
5960 elseif !exists("b:netrw_curdir")
5961 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
5962 else
5963 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
5964 endif
5965
5966 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005967 " obtain files from remote b:netrw_curdir to local tgtdir
5968" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005969 if type(a:fname) == 1
5970 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
5971 endif
5972 call s:NetrwMethod(b:netrw_curdir)
5973
5974 if b:netrw_method == 4
5975 " obtain file using scp
5976" call Decho("obtain via scp (method#4)")
5977 if exists("g:netrw_port") && g:netrw_port != ""
5978 let useport= " ".g:netrw_scpport." ".g:netrw_port
5979 else
5980 let useport= ""
5981 endif
5982 if b:netrw_fname =~ '/'
5983 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
5984 else
5985 let path= ""
5986 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005987 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005988" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
5989 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005990
5991 elseif b:netrw_method == 2
5992 " obtain file using ftp + .netrc
5993" call Decho("obtain via ftp+.netrc (method #2)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005994 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005995 let tmpbufnr= bufnr("%")
5996 setlocal ff=unix
5997 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005998 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005999" call Decho("filter input: ".getline('$'))
6000 endif
6001
6002 if exists("b:netrw_fname") && b:netrw_fname != ""
6003 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
6004" call Decho("filter input: ".getline('$'))
6005 endif
6006
6007 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006008 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006009" call Decho("filter input: ".getline('$'))
6010 endif
6011 for fname in fnamelist
6012 call setline(line("$")+1,'get "'.fname.'"')
6013" call Decho("filter input: ".getline('$'))
6014 endfor
6015 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006016" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6017 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 +00006018 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006019" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6020 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006021 endif
6022 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
6023 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6024 let debugkeep= &debug
6025 setlocal debug=msg
6026 call netrw#ErrorMsg(s:ERROR,getline(1),4)
6027 let &debug= debugkeep
6028 endif
6029
6030 elseif b:netrw_method == 3
6031 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
6032" call Decho("obtain via ftp+mipf (method #3)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006033 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006034 let tmpbufnr= bufnr("%")
6035 setlocal ff=unix
6036
6037 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006038 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006039" call Decho("filter input: ".getline('$'))
6040 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006041 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006042" call Decho("filter input: ".getline('$'))
6043 endif
6044
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006045 if exists("g:netrw_uid") && g:netrw_uid != ""
6046 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6047 keepj put =g:netrw_uid
6048" call Decho("filter input: ".getline('$'))
6049 if exists("s:netrw_passwd") && s:netrw_passwd != ""
6050 keepj put ='\"'.s:netrw_passwd.'\"'
6051 endif
6052" call Decho("filter input: ".getline('$'))
6053 elseif exists("s:netrw_passwd")
6054 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6055" call Decho("filter input: ".getline('$'))
6056 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006057 endif
6058
6059 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006060 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006061" call Decho("filter input: ".getline('$'))
6062 endif
6063
6064 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006065 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006066" call Decho("filter input: ".getline('$'))
6067 endif
6068
6069 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006070 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006071" call Decho("filter input: ".getline('$'))
6072 endif
6073
6074 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006075 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006076" call Decho("filter input: ".getline('$'))
6077 endif
6078 for fname in fnamelist
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006079 keepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006080 endfor
6081" call Decho("filter input: ".getline('$'))
6082
6083 " perform ftp:
6084 " -i : turns off interactive prompting from ftp
6085 " -n unix : DON'T use <.netrc>, even though it exists
6086 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006087 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006088" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6089 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006090 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
6091 if getline(1) !~ "^$"
6092" call Decho("error<".getline(1).">")
6093 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006094 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006095 endif
6096 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006097 elseif !exists("b:netrw_method") || b:netrw_method < 0
6098" call Dfunc("netrw#NetrwObtain : unsupported method")
6099 return
6100 endif
6101
6102 " restore status line
6103 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006104 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006105 endif
6106
6107 endif
6108
6109 " cleanup
6110 if exists("tmpbufnr")
6111 if bufnr("%") != tmpbufnr
6112 exe tmpbufnr."bw!"
6113 else
6114 q!
6115 endif
6116 endif
6117
6118" call Dret("netrw#NetrwObtain")
6119endfun
6120
6121" ---------------------------------------------------------------------
6122" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
6123" If there's only one window, then the window will first be split.
6124" Returns:
6125" choice = 0 : didn't have to choose
6126" choice = 1 : saved modified file in window first
6127" choice = 2 : didn't save modified file, opened window
6128" choice = 3 : cancel open
6129fun! s:NetrwPrevWinOpen(islocal)
6130" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
6131
6132 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
6133 let curdir = b:netrw_curdir
6134
6135 " get last window number and the word currently under the cursor
6136 let lastwinnr = winnr("$")
6137 let curword = s:NetrwGetWord()
6138 let choice = 0
6139" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
6140
6141 let didsplit = 0
6142 if lastwinnr == 1
6143 " if only one window, open a new one first
6144" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
6145 if g:netrw_preview
Bram Moolenaar15146672011-10-20 22:22:38 +02006146 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6147" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
6148 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006149 else
Bram Moolenaar15146672011-10-20 22:22:38 +02006150 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6151" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
6152 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006153 endif
6154 let didsplit = 1
6155
6156 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006157 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006158" call Decho("wincmd p")
6159 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02006160 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006161 " if the previous window's buffer has been changed (is modified),
6162 " and it doesn't appear in any other extant window, then ask the
6163 " user if s/he wants to abandon modifications therein.
6164 let bnr = winbufnr(0)
6165 let bnrcnt = 0
6166 if &mod
6167" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
6168 let eikeep= &ei
6169 set ei=all
6170 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
6171 exe bnr."wincmd p"
6172 let &ei= eikeep
6173" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
6174 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006175 let bufname = bufname(winbufnr(winnr()))
6176 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006177" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
6178
6179 if choice == 1
6180 " Yes -- write file & then browse
6181 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006182 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00006183 if v:errmsg != ""
6184 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
6185 if didsplit
6186 q
6187 else
6188 wincmd p
6189 endif
6190" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
6191 return choice
6192 endif
6193
6194 elseif choice == 2
6195 " No -- don't worry about changed file, just browse anyway
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006196" call Decho("(NetrwPrevWinOpen) setl nomod")
6197 setl nomod
6198" 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 +02006199 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006200 wincmd p
6201
6202 else
6203 " Cancel -- don't do this
6204 if didsplit
6205 q
6206 else
6207 wincmd p
6208 endif
6209" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
6210 return choice
6211 endif
6212 endif
6213 endif
6214 endif
6215
6216 " restore b:netrw_curdir (window split/enew may have lost it)
6217 let b:netrw_curdir= curdir
6218 if a:islocal < 2
6219 if a:islocal
6220 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
6221 else
6222 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
6223 endif
6224 endif
6225" call Dret("NetrwPrevWinOpen ".choice)
6226 return choice
6227endfun
6228
6229" ---------------------------------------------------------------------
6230" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
6231" Always assumed to be local -> remote
6232" call s:NetrwUpload(filename, target)
6233" call s:NetrwUpload(filename, target, fromdirectory)
6234fun! s:NetrwUpload(fname,tgt,...)
6235" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6236
6237 if a:tgt =~ '^\a\+://'
6238 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
6239 else
6240 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
6241 endif
6242" call Decho("tgtdir<".tgtdir.">")
6243
6244 if a:0 > 0
6245 let fromdir= a:1
6246 else
6247 let fromdir= getcwd()
6248 endif
6249" call Decho("fromdir<".fromdir.">")
6250
6251 if type(a:fname) == 1
6252 " handle uploading a single file using NetWrite
6253" call Decho("handle uploading a single file via NetWrite")
6254 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006255" call Decho("exe e ".fnameescape(a:fname))
6256 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006257" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
6258 if a:tgt =~ '/$'
6259 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006260" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006261 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006262 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006263" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
6264 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006265" call Decho("done writing local->remote")
6266 endif
6267 q!
6268
6269 elseif type(a:fname) == 3
6270 " handle uploading a list of files via scp
6271" call Decho("handle uploading a list of files via scp")
6272 let curdir= getcwd()
6273 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006274 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006275 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
6276 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006277 if exists("g:netrw_port") && g:netrw_port != ""
6278 let useport= " ".g:netrw_scpport." ".g:netrw_port
6279 else
6280 let useport= ""
6281 endif
6282 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
6283 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006284" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
6285 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006286 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006287
6288 elseif a:tgt =~ '^ftp:'
6289 call s:NetrwMethod(a:tgt)
6290
6291 if b:netrw_method == 2
6292 " handle uploading a list of files via ftp+.netrc
6293 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006294 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00006295" call Decho("filter input window#".winnr())
6296
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006297 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006298" call Decho("filter input: ".getline('$'))
6299
6300 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006301 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006302" call Decho("filter input: ".getline('$'))
6303 endif
6304
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006305 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006306" call Decho("filter input: ".getline('$'))
6307
Bram Moolenaaradc21822011-04-01 18:03:16 +02006308 if tgtdir == ""
6309 let tgtdir= '/'
6310 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006311 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006312" call Decho("filter input: ".getline('$'))
6313
6314 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006315 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006316" call Decho("filter input: ".getline('$'))
6317 endfor
6318
6319 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006320" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6321 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 +00006322 else
6323" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02006324" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6325 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006326 endif
6327 " 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 +02006328 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006329 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006330 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6331 call netrw#ErrorMsg(s:ERROR,getline(1),14)
6332 else
6333 bw!|q
6334 endif
6335
6336 elseif b:netrw_method == 3
6337 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
6338 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02006339 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006340 let tmpbufnr= bufnr("%")
6341 setlocal ff=unix
6342
6343 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006344 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006345" call Decho("filter input: ".getline('$'))
6346 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006347 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006348" call Decho("filter input: ".getline('$'))
6349 endif
6350
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006351 if exists("g:netrw_uid") && g:netrw_uid != ""
6352 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6353 keepj put =g:netrw_uid
6354" call Decho("filter input: ".getline('$'))
6355 if exists("s:netrw_passwd")
6356 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
6357 endif
6358" call Decho("filter input: ".getline('$'))
6359 elseif exists("s:netrw_passwd")
6360 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6361" call Decho("filter input: ".getline('$'))
6362 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006363 endif
6364
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006365 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006366" call Decho("filter input: ".getline('$'))
6367
6368 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006369 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006370" call Decho("filter input: ".getline('$'))
6371 endif
6372
6373 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006374 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006375" call Decho("filter input: ".getline('$'))
6376 endif
6377
6378 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006379 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006380" call Decho("filter input: ".getline('$'))
6381 endfor
6382
6383 " perform ftp:
6384 " -i : turns off interactive prompting from ftp
6385 " -n unix : DON'T use <.netrc>, even though it exists
6386 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006387 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006388" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6389 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006390 " 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 +02006391 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006392 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006393 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6394 let debugkeep= &debug
6395 setlocal debug=msg
6396 call netrw#ErrorMsg(s:ERROR,getline(1),15)
6397 let &debug = debugkeep
6398 let mod = 1
6399 else
6400 bw!|q
6401 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006402 elseif !exists("b:netrw_method") || b:netrw_method < 0
6403" call Dfunc("netrw#NetrwUpload : unsupported method")
6404 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006405 endif
6406 else
6407 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
6408 endif
6409 endif
6410
6411" call Dret("s:NetrwUpload")
6412endfun
6413
6414" ---------------------------------------------------------------------
6415" s:NetrwPreview: {{{2
6416fun! s:NetrwPreview(path) range
6417" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006418 keepj call s:NetrwOptionSave("s:")
6419 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006420 if has("quickfix")
6421 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006422 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02006423 let pvhkeep = &pvh
6424 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6425 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006426 endif
6427 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
6428 if exists("pvhkeep")
6429 let &pvh= pvhkeep
6430 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006431 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006432 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006433 endif
6434 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006435 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 +00006436 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006437 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006438" call Dret("NetrwPreview")
6439endfun
6440
6441" ---------------------------------------------------------------------
6442" s:NetrwRefresh: {{{2
6443fun! s:NetrwRefresh(islocal,dirname)
6444" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
6445 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
6446 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
6447 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
6448 setlocal ma noro
6449" call Decho("setlocal ma noro")
6450" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006451 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006452 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006453 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006454 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006455 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006456 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006457 keepj call netrw#NetrwRestorePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006458
6459 " restore file marks
6460 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
6461" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
6462 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
6463 else
6464" call Decho("2match none")
6465 2match none
6466 endif
6467
6468" redraw!
6469" call Dret("NetrwRefresh")
6470endfun
6471
6472" ---------------------------------------------------------------------
6473" s:NetrwRefreshDir: refreshes a directory by name {{{2
6474" Called by NetrwMarkFileCopy()
6475" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
6476fun! s:NetrwRefreshDir(islocal,dirname)
6477" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
6478 if g:netrw_fastbrowse == 0
6479 " slowest mode (keep buffers refreshed, local or remote)
6480" call Decho("slowest mode: keep buffers refreshed, local or remote")
6481 let tgtwin= bufwinnr(a:dirname)
6482" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
6483
6484 if tgtwin > 0
6485 " tgtwin is being displayed, so refresh it
6486 let curwin= winnr()
6487" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
6488 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006489 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006490 exe curwin."wincmd w"
6491
6492 elseif bufnr(a:dirname) > 0
6493 let bn= bufnr(a:dirname)
6494" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006495 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00006496 endif
6497
6498 elseif g:netrw_fastbrowse <= 1
6499" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006500 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006501 endif
6502" call Dret("s:NetrwRefreshDir")
6503endfun
6504
6505" ---------------------------------------------------------------------
6506" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
6507" What this function does is to compute a priority for the patterns
6508" in the g:netrw_sort_sequence. It applies a substitute to any
6509" "files" that satisfy each pattern, putting the priority / in
6510" front. An "*" pattern handles the default priority.
6511fun! s:NetrwSetSort()
6512" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
6513 if w:netrw_liststyle == s:LONGLIST
6514 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
6515 else
6516 let seqlist = g:netrw_sort_sequence
6517 endif
6518 " sanity check -- insure that * appears somewhere
6519 if seqlist == ""
6520 let seqlist= '*'
6521 elseif seqlist !~ '\*'
6522 let seqlist= seqlist.',*'
6523 endif
6524 let priority = 1
6525 while seqlist != ""
6526 if seqlist =~ ','
6527 let seq = substitute(seqlist,',.*$','','e')
6528 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
6529 else
6530 let seq = seqlist
6531 let seqlist = ""
6532 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006533 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01006534 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006535 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01006536 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006537 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006538 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006539 endif
6540" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6541
6542 " sanity check
6543 if w:netrw_bannercnt > line("$")
6544 " apparently no files were left after a Hiding pattern was used
6545" call Dret("SetSort : no files left after hiding")
6546 return
6547 endif
6548 if seq == '*'
6549 let starpriority= spriority
6550 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006551 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006552 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006553 " sometimes multiple sorting patterns will match the same file or directory.
6554 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006555 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 +02006556 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006557 endif
6558 let priority = priority + 1
6559 endwhile
6560 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006561 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006562 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006563 endif
6564
6565 " Following line associated with priority -- items that satisfy a priority
6566 " pattern get prefixed by ###/ which permits easy sorting by priority.
6567 " Sometimes files can satisfy multiple priority patterns -- only the latest
6568 " priority pattern needs to be retained. So, at this point, these excess
6569 " priority prefixes need to be removed, but not directories that happen to
6570 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006571 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 +02006572 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006573
6574" call Dret("SetSort")
6575endfun
6576
6577" =====================================================================
6578" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
6579fun! s:NetrwSortStyle(islocal)
6580" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006581 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006582 let svpos= netrw#NetrwSavePosn()
6583
6584 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 +02006585 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006586 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6587 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006588
6589" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
6590endfun
6591
6592" ---------------------------------------------------------------------
6593" s:NetrwSplit: mode {{{2
6594" =0 : net and o
6595" =1 : net and t
6596" =2 : net and v
6597" =3 : local and o
6598" =4 : local and t
6599" =5 : local and v
6600fun! s:NetrwSplit(mode)
6601" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
6602
6603 call s:SaveWinVars()
6604
6605 if a:mode == 0
6606 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02006607 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6608" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006609 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006610 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006611 keepj call s:RestoreWinVars()
6612 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006613 unlet s:didsplit
6614
6615 elseif a:mode == 1
6616 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01006617 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006618" call Decho("tabnew")
6619 tabnew
6620 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006621 keepj call s:RestoreWinVars()
6622 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006623 unlet s:didsplit
6624
6625 elseif a:mode == 2
6626 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02006627 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6628" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006629 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006630 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006631 keepj call s:RestoreWinVars()
6632 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006633 unlet s:didsplit
6634
6635 elseif a:mode == 3
6636 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02006637 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6638" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006639 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006640 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006641 keepj call s:RestoreWinVars()
6642 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006643 unlet s:didsplit
6644
6645 elseif a:mode == 4
6646 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00006647 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006648 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006649" call Decho("tabnew")
6650 tabnew
6651 let b:netrw_curdir= netrw_curdir
6652 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006653 keepj call s:RestoreWinVars()
6654 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006655 unlet s:didsplit
6656
6657 elseif a:mode == 5
6658 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02006659 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6660" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006661 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006662 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006663 keepj call s:RestoreWinVars()
6664 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006665 unlet s:didsplit
6666
6667 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006668 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006669 endif
6670
6671" call Dret("s:NetrwSplit")
6672endfun
6673
6674" ---------------------------------------------------------------------
6675" NetrwStatusLine: {{{2
6676fun! NetrwStatusLine()
6677
6678" vvv NetrwStatusLine() debugging vvv
6679" let g:stlmsg=""
6680" if !exists("w:netrw_explore_bufnr")
6681" let g:stlmsg="!X<explore_bufnr>"
6682" elseif w:netrw_explore_bufnr != bufnr("%")
6683" let g:stlmsg="explore_bufnr!=".bufnr("%")
6684" endif
6685" if !exists("w:netrw_explore_line")
6686" let g:stlmsg=" !X<explore_line>"
6687" elseif w:netrw_explore_line != line(".")
6688" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
6689" endif
6690" if !exists("w:netrw_explore_list")
6691" let g:stlmsg=" !X<explore_list>"
6692" endif
6693" ^^^ NetrwStatusLine() debugging ^^^
6694
6695 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")
6696 " restore user's status line
6697 let &stl = s:netrw_users_stl
6698 let &laststatus = s:netrw_users_ls
6699 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
6700 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
6701 return ""
6702 else
6703 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
6704 endif
6705endfun
6706
6707" ---------------------------------------------------------------------
6708" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
6709" (full path directory with trailing slash returned)
6710fun! s:NetrwTreeDir()
6711" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
6712
6713 let treedir= b:netrw_curdir
6714" call Decho("set initial treedir<".treedir.">")
6715 let s:treecurpos= netrw#NetrwSavePosn()
6716
6717 if w:netrw_liststyle == s:TREELIST
6718" call Decho("w:netrrw_liststyle is TREELIST:")
6719" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006720
6721 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006722 if getline('.') =~ '/$'
6723 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
6724 else
6725 let treedir= ""
6726 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006727" call Decho("treedir<".treedir.">")
6728
6729 " detect user attempting to close treeroot
6730 if getline('.') !~ '|' && getline('.') != '..'
6731" call Decho("user attempted to close treeroot")
6732 " now force a refresh
6733" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006734 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006735" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6736 return b:netrw_curdir
6737 endif
6738
6739 " elide all non-depth information
6740 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006741" call Decho("depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006742
6743 " elide first depth
6744 let depth = substitute(depth,'^| ','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006745" call Decho("depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006746
6747 " construct treedir by searching backwards at correct depth
6748" call Decho("constructing treedir<".treedir."> depth<".depth.">")
6749 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
6750 let dirname= substitute(getline('.'),'^\(| \)*','','e')
6751 let treedir= dirname.treedir
6752 let depth = substitute(depth,'^| ','','')
6753" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
6754 endwhile
6755 if w:netrw_treetop =~ '/$'
6756 let treedir= w:netrw_treetop.treedir
6757 else
6758 let treedir= w:netrw_treetop.'/'.treedir
6759 endif
6760" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
6761 endif
6762 let treedir= substitute(treedir,'//$','/','')
6763
Bram Moolenaar446cb832008-06-24 21:56:24 +00006764" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6765 return treedir
6766endfun
6767
6768" ---------------------------------------------------------------------
6769" s:NetrwTreeDisplay: recursive tree display {{{2
6770fun! s:NetrwTreeDisplay(dir,depth)
6771" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
6772
6773 " insure that there are no folds
6774 setlocal nofen
6775
6776 " install ../ and shortdir
6777 if a:depth == ""
6778 call setline(line("$")+1,'../')
6779" call Decho("setline#".line("$")." ../ (depth is zero)")
6780 endif
6781 if a:dir =~ '^\a\+://'
6782 if a:dir == w:netrw_treetop
6783 let shortdir= a:dir
6784 else
6785 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
6786 endif
6787 call setline(line("$")+1,a:depth.shortdir)
6788 else
6789 let shortdir= substitute(a:dir,'^.*/','','e')
6790 call setline(line("$")+1,a:depth.shortdir.'/')
6791 endif
6792" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
6793
6794 " append a / to dir if its missing one
6795 let dir= a:dir
6796 if dir !~ '/$'
6797 let dir= dir.'/'
6798 endif
6799
6800 " display subtrees (if any)
6801 let depth= "| ".a:depth
6802
6803" call Decho("display subtrees with depth<".depth."> and current leaves")
6804 for entry in w:netrw_treedict[a:dir]
6805 let direntry= substitute(dir.entry,'/$','','e')
6806" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
6807 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
6808" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006809 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006810 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
6811" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006812 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006813 else
6814" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006815 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006816 endif
6817 endfor
6818" call Dret("NetrwTreeDisplay")
6819endfun
6820
6821" ---------------------------------------------------------------------
6822" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
6823fun! s:NetrwTreeListing(dirname)
6824 if w:netrw_liststyle == s:TREELIST
6825" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
6826" call Decho("curdir<".a:dirname.">")
6827" 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"))
6828
6829 " update the treetop
6830" call Decho("update the treetop")
6831 if !exists("w:netrw_treetop")
6832 let w:netrw_treetop= a:dirname
6833" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
6834 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
6835 let w:netrw_treetop= a:dirname
6836" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
6837 endif
6838
6839 " insure that we have at least an empty treedict
6840 if !exists("w:netrw_treedict")
6841 let w:netrw_treedict= {}
6842 endif
6843
6844 " update the directory listing for the current directory
6845" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
6846" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006847 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006848 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006849" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006850 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006851
6852 " if past banner, record word
6853 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
6854 let fname= expand("<cword>")
6855 else
6856 let fname= ""
6857 endif
6858" call Decho("fname<".fname.">")
6859
6860 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02006861 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006862
6863" call Dret("NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006864 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006865 endif
6866endfun
6867
6868" ---------------------------------------------------------------------
6869" s:NetrwWideListing: {{{2
6870fun! s:NetrwWideListing()
6871
6872 if w:netrw_liststyle == s:WIDELIST
6873" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
6874 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006875 " cpf: characters per filename
6876 " fpl: filenames per line
6877 " fpc: filenames per column
Bram Moolenaar446cb832008-06-24 21:56:24 +00006878 setlocal ma noro
6879" call Decho("setlocal ma noro")
6880 let b:netrw_cpf= 0
6881 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006882 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 +02006883 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006884 else
6885" call Dret("NetrwWideListing")
6886 return
6887 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006888 let b:netrw_cpf= b:netrw_cpf + 2
6889" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006890
6891 " determine qty files per line (fpl)
6892 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
6893 if w:netrw_fpl <= 0
6894 let w:netrw_fpl= 1
6895 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006896" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006897
6898 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006899 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006900 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006901 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
6902 let newcolstart = w:netrw_bannercnt + fpc
6903 let newcolend = newcolstart + fpc - 1
6904" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006905 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00006906 while line("$") >= newcolstart
6907 if newcolend > line("$") | let newcolend= line("$") | endif
6908 let newcolqty= newcolend - newcolstart
6909 exe newcolstart
6910 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006911 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006912 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006913 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006914 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006915 exe "sil! keepj ".newcolstart.','.newcolend.'d'
6916 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006917 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02006918 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006919 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006920 keepj call histdel("/",-1)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006921" call Decho("NetrwWideListing) setl noma nomod ro")
6922 setl noma nomod ro
6923" 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 +00006924" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006925 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006926 endif
6927
6928endfun
6929
6930" ---------------------------------------------------------------------
6931" s:PerformListing: {{{2
6932fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006933" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006934
Bram Moolenaar15146672011-10-20 22:22:38 +02006935 " set up syntax highlighting {{{3
6936" call Decho("set up syntax highlighting")
6937 if has("syntax")
6938 if !exists("g:syntax_on") || !g:syntax_on
6939" call Decho("but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
6940 setlocal ft=
6941 elseif &ft != "netrw"
6942 setlocal ft=netrw
6943 endif
6944 endif
6945
Bram Moolenaaradc21822011-04-01 18:03:16 +02006946 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006947 setlocal noro ma
6948" call Decho("setlocal noro ma")
6949
6950" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
6951" call Decho("(netrw) Processing your browsing request...")
6952" endif " Decho
6953
6954" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
6955 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6956 " force a refresh for tree listings
6957" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006958 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006959 endif
6960
6961 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02006962 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006963
6964 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006965 if g:netrw_banner
6966" call Decho("set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006967 keepj call setline(1,'" ============================================================================')
6968 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
6969 keepj call setline(3,'" '.b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006970 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006971 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006972 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006973 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006974 let w:netrw_bannercnt= 1
6975 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006976
6977 let sortby= g:netrw_sort_by
6978 if g:netrw_sort_direction =~ "^r"
6979 let sortby= sortby." reversed"
6980 endif
6981
6982 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006983 if g:netrw_banner
6984" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
6985 if g:netrw_sort_by =~ "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006986" call Decho("directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006987 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006988 keepj put ='\" Sorted by '.sortby
6989 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01006990 let w:netrw_bannercnt= w:netrw_bannercnt + 2
6991 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00006992" call Decho("directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006993 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006994 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01006995 let w:netrw_bannercnt= w:netrw_bannercnt + 1
6996 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006997 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006998 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006999
7000 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01007001 if g:netrw_banner
7002 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
7003" call Decho("show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007004 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01007005 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007006 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007007 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007008 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007009 endif
7010 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007011 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01007012" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007013 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007014 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007015 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007016
7017 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007018 if g:netrw_banner
7019" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
7020 if g:netrw_list_hide != "" && g:netrw_hide
7021 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007022 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007023 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007024 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007025 endif
7026 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007027 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007028 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007029 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
7030 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007031 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00007032 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007033
7034 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01007035 if g:netrw_banner
7036 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007037 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007038" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
7039 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007040
Bram Moolenaar446cb832008-06-24 21:56:24 +00007041 " get list of files
7042" call Decho("Get list of files - islocal=".a:islocal)
7043 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007044 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007045 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02007046 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007047 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007048" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007049
7050 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007051 if !exists("w:netrw_bannercnt")
7052 let w:netrw_bannercnt= 0
7053 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007054 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007055" call Decho("manipulate directory listing (hide)")
7056" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
7057 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007058 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007059 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007060 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007061" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
7062
7063 if g:netrw_sort_by =~ "^n"
7064 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02007065 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007066
Bram Moolenaar5c736222010-01-06 20:54:52 +01007067 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007068" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
7069 if g:netrw_sort_direction =~ 'n'
7070 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007071 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007072 else
7073 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007074 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007075 endif
7076 endif
7077 " remove priority pattern prefix
7078" call Decho("remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007079 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007080 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007081
7082 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01007083 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007084" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
7085 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007086" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007087 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007088 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007089" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007090 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007091 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007092 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007093 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007094 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007095 endif
7096
7097 elseif g:netrw_sort_direction =~ 'r'
7098" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007099 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007100 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007101 call histdel("/",-1)
7102 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007103 endif
7104 endif
7105
7106 " convert to wide/tree listing {{{3
7107" call Decho("modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007108 keepj call s:NetrwWideListing()
7109 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007110
Bram Moolenaar5c736222010-01-06 20:54:52 +01007111 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007112 " place cursor on the top-left corner of the file listing
7113" call Decho("place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007114 exe 'sil! keepj '.w:netrw_bannercnt
7115 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007116 endif
7117
7118 " record previous current directory
7119 let w:netrw_prvdir= b:netrw_curdir
7120" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
7121
7122 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007123 keepj call s:SetBufWinVars()
7124 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007125
7126 " set display to netrw display settings
7127" call Decho("set display to netrw display settings (noma nomod etc)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007128 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00007129 if exists("s:treecurpos")
7130
Bram Moolenaaradc21822011-04-01 18:03:16 +02007131 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007132 unlet s:treecurpos
7133 endif
7134
7135" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
7136endfun
7137
7138" ---------------------------------------------------------------------
7139" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007140fun! s:SetupNetrwStatusLine(statline)
7141" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
7142
7143 if !exists("s:netrw_setup_statline")
7144 let s:netrw_setup_statline= 1
7145" call Decho("do first-time status line setup")
7146
7147 if !exists("s:netrw_users_stl")
7148 let s:netrw_users_stl= &stl
7149 endif
7150 if !exists("s:netrw_users_ls")
7151 let s:netrw_users_ls= &laststatus
7152 endif
7153
7154 " set up User9 highlighting as needed
7155 let keepa= @a
7156 redir @a
7157 try
7158 hi User9
7159 catch /^Vim\%((\a\+)\)\=:E411/
7160 if &bg == "dark"
7161 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
7162 else
7163 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
7164 endif
7165 endtry
7166 redir END
7167 let @a= keepa
7168 endif
7169
7170 " set up status line (may use User9 highlighting)
7171 " insure that windows have a statusline
7172 " make sure statusline is displayed
7173 let &stl=a:statline
7174 setlocal laststatus=2
7175" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007176 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00007177
7178" call Dret("SetupNetrwStatusLine : stl=".&stl)
7179endfun
7180
7181" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007182" Remote Directory Browsing Support: {{{1
7183" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00007184
7185" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007186" s:NetrwRemoteListing: {{{2
7187fun! s:NetrwRemoteListing()
7188" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00007189
Bram Moolenaar446cb832008-06-24 21:56:24 +00007190 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007191
Bram Moolenaar446cb832008-06-24 21:56:24 +00007192 " sanity check:
7193 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
7194" call Decho("b:netrw_method=".b:netrw_method)
7195 if !executable("ftp")
7196 if !exists("g:netrw_quiet")
7197 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
7198 endif
7199 call s:NetrwOptionRestore("w:")
7200" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00007201 return
7202 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007203
7204 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
7205 if !exists("g:netrw_quiet")
7206 if g:netrw_list_cmd == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007207 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007208 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007209 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 +00007210 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007211 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007212
Bram Moolenaaradc21822011-04-01 18:03:16 +02007213 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007214" call Dret("s:NetrwRemoteListing")
7215 return
7216 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007217
Bram Moolenaar446cb832008-06-24 21:56:24 +00007218 if exists("b:netrw_method")
7219" call Decho("setting w:netrw_method<".b:netrw_method.">")
7220 let w:netrw_method= b:netrw_method
7221 endif
7222
7223 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007224 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007225" call Decho("use ftp to get remote file listing")
7226 let s:method = "ftp"
7227 let listcmd = g:netrw_ftp_list_cmd
7228 if g:netrw_sort_by =~ '^t'
7229 let listcmd= g:netrw_ftp_timelist_cmd
7230 elseif g:netrw_sort_by =~ '^s'
7231 let listcmd= g:netrw_ftp_sizelist_cmd
7232 endif
7233" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
7234 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007235" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007236
7237 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
7238 " shorten the listing
7239" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007240 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007241
7242 " cleanup
7243 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007244 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007245 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007246 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007247 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007248 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007249
7250 " if there's no ../ listed, then put ./ and ../ in
7251 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007252 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007253 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
7254 if line2 == 0
7255" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007256 sil! keepj put='../'
7257 sil! keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007258 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007259 exe "sil! keepj ".line1
7260 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007261
7262" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
7263 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7264" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007265 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 +02007266 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007267 else " normal ftp cleanup
7268" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007269 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
7270 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
7271 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007272 keepj call histdel("/",-1)
7273 keepj call histdel("/",-1)
7274 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007275 endif
7276 endif
7277
7278 else
7279 " use ssh to get remote file listing {{{3
7280" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
7281 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
7282" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
7283 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007284" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007285 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007286 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007287 sil! keepj g/^Listing directory/keepj d
7288 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
7289 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007290 keepj call histdel("/",-1)
7291 keepj call histdel("/",-1)
7292 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007293 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007294 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007295 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007296 endif
7297 else
7298 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007299" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar15146672011-10-20 22:22:38 +02007300 exe "sil! keepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007301 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02007302" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007303 exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007304" call Decho("listcmd<".listcmd."> path<".s:path.">")
7305 endif
7306 endif
7307
7308 " cleanup
7309 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007310" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007311 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007312 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007313 endif
7314 endif
7315
7316 if w:netrw_liststyle == s:LONGLIST
7317 " do a long listing; these substitutions need to be done prior to sorting {{{3
7318" call Decho("fix long listing:")
7319
7320 if s:method == "ftp"
7321 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007322 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007323 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007324 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007325 endwhile
7326 " if there's no ../ listed, then put ./ and ../ in
7327 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007328 sil! keepj 1
7329 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007330 let line2= line(".")
7331 if line2 == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007332 exe 'sil! keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007333 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007334 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007335 endif
7336 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007337 exe "sil! keepj ".line1
7338 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007339 endif
7340
7341 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7342" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007343 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 +00007344 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
7345" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007346 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
7347 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
7348 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02007349 keepj call histdel("/",-1)
7350 keepj call histdel("/",-1)
7351 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007352 endif
7353 endif
7354
7355" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007356" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007357" endif " Decho
7358" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007359endfun
7360
Bram Moolenaar446cb832008-06-24 21:56:24 +00007361" ---------------------------------------------------------------------
7362" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
7363fun! s:NetrwRemoteRm(usrhost,path) range
7364" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
7365" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7366 let svpos= netrw#NetrwSavePosn()
7367
7368 let all= 0
7369 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7370 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01007371" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007372 for fname in s:netrwmarkfilelist_{bufnr("%")}
7373 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
7374 if ok =~ 'q\%[uit]'
7375 break
7376 elseif ok =~ 'a\%[ll]'
7377 let all= 1
7378 endif
7379 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007380 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007381
7382 else
7383 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01007384" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007385
7386 " preparation for removing multiple files/directories
7387 let ctr= a:firstline
7388
7389 " remove multiple files and directories
7390 while ctr <= a:lastline
Bram Moolenaar15146672011-10-20 22:22:38 +02007391 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007392 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
7393 if ok =~ 'q\%[uit]'
7394 break
7395 elseif ok =~ 'a\%[ll]'
7396 let all= 1
7397 endif
7398 let ctr= ctr + 1
7399 endwhile
7400 endif
7401
7402 " refresh the (remote) directory listing
7403" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007404 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7405 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007406
7407" call Dret("s:NetrwRemoteRm")
7408endfun
7409
7410" ---------------------------------------------------------------------
7411" s:NetrwRemoteRmFile: {{{2
7412fun! s:NetrwRemoteRmFile(path,rmfile,all)
7413" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
7414
7415 let all= a:all
7416 let ok = ""
7417
7418 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
7419 " attempt to remove file
7420" call Decho("attempt to remove file (all=".all.")")
7421 if !all
7422 echohl Statement
7423" call Decho("case all=0:")
7424 call inputsave()
7425 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7426 call inputrestore()
7427 echohl NONE
7428 if ok == ""
7429 let ok="no"
7430 endif
7431 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7432 if ok =~ 'a\%[ll]'
7433 let all= 1
7434 endif
7435 endif
7436
7437 if all || ok =~ 'y\%[es]' || ok == ""
7438" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
7439 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7440" call Decho("case ftp:")
7441 let path= a:path
7442 if path =~ '^\a\+://'
7443 let path= substitute(path,'^\a\+://[^/]\+/','','')
7444 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007445 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007446 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
7447 else
7448" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
7449 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
7450" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7451 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007452 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007453 let ok="q"
7454 else
7455 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7456" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7457" call Decho("remotedir<".remotedir.">")
7458" call Decho("rmfile<".a:rmfile.">")
7459 if remotedir != ""
7460 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
7461 else
7462 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
7463 endif
7464" call Decho("call system(".netrw_rm_cmd.")")
7465 let ret= system(netrw_rm_cmd)
7466 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007467 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007468 endif
7469" call Decho("returned=".ret." errcode=".v:shell_error)
7470 endif
7471 endif
7472 elseif ok =~ 'q\%[uit]'
7473" call Decho("ok==".ok)
7474 break
7475 endif
7476
7477 else
7478 " attempt to remove directory
7479" call Decho("attempt to remove directory")
7480 if !all
7481 call inputsave()
7482 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7483 call inputrestore()
7484 if ok == ""
7485 let ok="no"
7486 endif
7487 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7488 if ok =~ 'a\%[ll]'
7489 let all= 1
7490 endif
7491 endif
7492
7493 if all || ok =~ 'y\%[es]' || ok == ""
7494 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007495 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007496 else
7497 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007498 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007499" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007500 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007501" call Decho("returned=".ret." errcode=".v:shell_error)
7502
7503 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007504" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007505 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 +00007506" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
7507 let ret= system(netrw_rmf_cmd)
7508" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007509
7510 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007511 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007512 endif
7513 endif
7514 endif
7515
7516 elseif ok =~ 'q\%[uit]'
7517 break
7518 endif
7519 endif
7520
7521" call Dret("s:NetrwRemoteRmFile ".ok)
7522 return ok
7523endfun
7524
7525" ---------------------------------------------------------------------
7526" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
7527" This function assumes that a long listing will be received. Size, time,
7528" and reverse sorts will be requested of the server but not otherwise
7529" enforced here.
7530fun! s:NetrwRemoteFtpCmd(path,listcmd)
7531" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
7532" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
7533
7534 " because WinXX ftp uses unix style input
7535 let ffkeep= &ff
7536 setlocal ma ff=unix noro
7537" call Decho("setlocal ma ff=unix noro")
7538
7539 " clear off any older non-banner lines
7540 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02007541" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
7542 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007543
7544 ".........................................
7545 if w:netrw_method == 2 || w:netrw_method == 5
7546 " ftp + <.netrc>: Method #2
7547 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007548 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007549 endif
7550 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007551 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007552" call Decho("filter input: ".getline('.'))
7553 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007554 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007555" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
7556 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007557" 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 +02007558 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 +00007559 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007560" 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 +02007561 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 +00007562 endif
7563
7564 ".........................................
7565 elseif w:netrw_method == 3
7566 " ftp + machine,id,passwd,filename: Method #3
7567 setlocal ff=unix
7568 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007569 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00007570 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007571 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00007572 endif
7573
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007574 " handle userid and password
7575 let host= substitute(g:netrw_machine,'\..*$','','')
7576" call Decho("host<".host.">")
7577 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
7578 call NetUserPass("ftp:".host)
7579 endif
7580 if exists("g:netrw_uid") && g:netrw_uid != ""
7581 if exists("g:netrw_ftp") && g:netrw_ftp == 1
7582 keepj put =g:netrw_uid
7583 if exists("s:netrw_passwd") && s:netrw_passwd != ""
7584 keepj put ='\"'.s:netrw_passwd.'\"'
7585 endif
7586 elseif exists("s:netrw_passwd")
7587 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
7588 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007589 endif
7590
7591 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007592 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007593 endif
7594 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007595 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007596" call Decho("filter input: ".getline('.'))
7597 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007598 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007599
7600 " perform ftp:
7601 " -i : turns off interactive prompting from ftp
7602 " -n unix : DON'T use <.netrc>, even though it exists
7603 " -n win32: quit being obnoxious about password
7604" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007605" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
7606 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007607
7608 ".........................................
7609 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007610 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007611 endif
7612
7613 " cleanup for Windows
7614 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007615 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007616 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007617 endif
7618 if a:listcmd == "dir"
7619 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007620 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
7621 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02007622 keepj call histdel("/",-1)
7623 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007624 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007625 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007626 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007627 endif
7628 endif
7629
7630 " ftp's listing doesn't seem to include ./ or ../
7631 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007632 exe 'keepj '.w:netrw_bannercnt
7633 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007634 endif
7635 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007636 exe 'keepj '.w:netrw_bannercnt
7637 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007638 endif
7639
7640 " restore settings
7641 let &ff= ffkeep
7642" call Dret("NetrwRemoteFtpCmd")
7643endfun
7644
7645" ---------------------------------------------------------------------
7646" s:NetrwRemoteRename: rename a remote file or directory {{{2
7647fun! s:NetrwRemoteRename(usrhost,path) range
7648" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
7649
7650 " preparation for removing multiple files/directories
7651 let svpos = netrw#NetrwSavePosn()
7652 let ctr = a:firstline
7653 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
7654
7655 " rename files given by the markfilelist
7656 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7657 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7658" call Decho("oldname<".oldname.">")
7659 if exists("subfrom")
7660 let newname= substitute(oldname,subfrom,subto,'')
7661" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7662 else
7663 call inputsave()
7664 let newname= input("Moving ".oldname." to : ",oldname)
7665 call inputrestore()
7666 if newname =~ '^s/'
7667 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7668 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7669 let newname = substitute(oldname,subfrom,subto,'')
7670" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7671 endif
7672 endif
7673
7674 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007675 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007676 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007677 let oldname= shellescape(a:path.oldname)
7678 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007679" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7680 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007681 endif
7682
7683 endfor
7684 call s:NetrwUnMarkFile(1)
7685
7686 else
7687
7688 " attempt to rename files/directories
7689 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007690 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007691
7692 let oldname= s:NetrwGetWord()
7693" call Decho("oldname<".oldname.">")
7694
7695 call inputsave()
7696 let newname= input("Moving ".oldname." to : ",oldname)
7697 call inputrestore()
7698
7699 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7700 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7701 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007702 let oldname= shellescape(a:path.oldname)
7703 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007704" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7705 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007706 endif
7707
7708 let ctr= ctr + 1
7709 endwhile
7710 endif
7711
7712 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007713 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7714 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007715
7716" call Dret("NetrwRemoteRename")
7717endfun
7718
7719" ---------------------------------------------------------------------
7720" Local Directory Browsing Support: {{{1
7721" ==========================================
7722
7723" ---------------------------------------------------------------------
7724" netrw#LocalBrowseCheck: {{{2
7725fun! netrw#LocalBrowseCheck(dirname)
7726 " unfortunate interaction -- split window debugging can't be
7727 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
7728 " event triggers another call to LocalBrowseCheck() when attempts
7729 " to write to the DBG buffer are made.
7730 " The &ft == "netrw" test was installed because the BufEnter event
7731 " would hit when re-entering netrw windows, creating unexpected
7732 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007733" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007734" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007735 if isdirectory(a:dirname)
7736" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
7737 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007738 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007739 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007740 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007741 elseif exists("s:treeforceredraw")
7742 unlet s:treeforceredraw
Bram Moolenaaradc21822011-04-01 18:03:16 +02007743 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007744 endif
7745 endif
7746 " not a directory, ignore it
7747endfun
7748
7749" ---------------------------------------------------------------------
7750" s:LocalListing: does the job of "ls" for local directories {{{2
7751fun! s:LocalListing()
7752" call Dfunc("s:LocalListing()")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007753" call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
7754" call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007755
7756" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
7757" 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
7758
7759 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007760 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01007761 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02007762 let filelist = glob(s:ComposePath(fnameescape(dirname),"*"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007763" call Decho("(LocalListing) glob(dirname<".dirname."/*>)=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007764 if filelist != ""
7765 let filelist= filelist."\n"
7766 endif
Bram Moolenaar251e1912011-06-19 05:09:16 +02007767 let filelist= filelist.glob(s:ComposePath(fnameescape(dirname),".*"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007768" call Decho("(LocalListing) glob(dirname<".dirname."/.*>)=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007769
7770 " Coding choice: either elide ./ if present
7771 " or include ./ if not present
7772 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
7773 " elide /path/. from glob() entries if present
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007774" call Decho("(LocalListing) elide /path/. from glob entries if present")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007775 let filelist = substitute(filelist,'\n','\t','g')
7776 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
7777 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
7778 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
7779 let filelist = substitute(filelist,'\t','\n','g')
7780 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007781" call Decho("(LocalListing) filelist<".filelist.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007782 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
7783 " include ../ in the glob() entry if its missing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007784" call Decho("(LocalListing) forcibly tacking on ..")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007785 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007786" call Decho("(LocalListing) filelist<".filelist.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007787 endif
7788 if b:netrw_curdir == '/'
7789 " remove .. from filelist when current directory is root directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007790" call Decho("(LocalListing) remove .. from filelist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007791 let filelist= substitute(filelist,'/\.\.\n','','')
7792 endif
7793 " remove multiple contiguous newlines
7794 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
7795 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7796 " change all \s to /s
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007797" call Decho('(LocalListing) change all \s to /s')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007798 let filelist= substitute(filelist,'\','/','g')
7799 else
7800 " escape all \s to \\
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007801" call Decho('(LocalListing) escape all \s to \\')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007802 let filelist= substitute(filelist,'\','\\','g')
7803 endif
7804
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007805" call Decho("(LocalListing) (before while) dirname<".dirname.">")
7806" call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">")
7807" call Decho("(LocalListing) (before while) filelist<".filelist.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007808
7809 while filelist != ""
7810 if filelist =~ '\n'
7811 let filename = substitute(filelist,'\n.*$','','e')
7812 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
7813 else
7814 let filename = filelist
7815 let filelist = ""
7816 endif
7817" call Decho(" ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007818" call Decho("(LocalListing) (while) filelist<".filelist.">")
7819" call Decho("(LocalListing) (while) filename<".filename.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007820
7821 if getftype(filename) == "link"
7822 " indicate a symbolic link
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007823" call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007824 let pfile= filename."@"
7825
7826 elseif getftype(filename) == "socket"
7827 " indicate a socket
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007828" call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007829 let pfile= filename."="
7830
7831 elseif getftype(filename) == "fifo"
7832 " indicate a fifo
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007833" call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007834 let pfile= filename."|"
7835
7836 elseif isdirectory(filename)
7837 " indicate a directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007838" call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007839 let pfile= filename."/"
7840
7841 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
7842 if (has("win32") || has("win95") || has("win64") || has("win16"))
7843 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
7844 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007845" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007846 let pfile= filename."*"
7847 else
7848 " normal file
7849 let pfile= filename
7850 endif
7851 elseif executable(filename)
7852 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007853" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007854 let pfile= filename."*"
7855 else
7856 " normal file
7857 let pfile= filename
7858 endif
7859
7860 else
7861 " normal file
7862 let pfile= filename
7863 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007864" call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007865
7866 if pfile =~ '//$'
7867 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007868" call Decho("(LocalListing) change // to /: pfile<".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007869 endif
7870 let pfile= strpart(pfile,dirnamelen)
7871 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007872" call Decho("(LocalListing) filename<".filename.">")
7873" call Decho("(LocalListing) pfile <".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007874
7875 if w:netrw_liststyle == s:LONGLIST
7876 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007877 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007878 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007879" call Decho("(LocalListing) sz=".sz." fsz=".fsz)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007880 endif
7881
7882 if g:netrw_sort_by =~ "^t"
7883 " sort by time (handles time up to 1 quintillion seconds, US)
7884" call Decho("getftime(".filename.")=".getftime(filename))
7885 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007886 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007887" call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007888 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007889 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007890
7891 elseif g:netrw_sort_by =~ "^s"
7892 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007893" call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007894 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007895 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007896" call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007897 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007898 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007899
7900 else
7901 " sort by name
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007902" call Decho("(LocalListing) exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007903 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007904 endif
7905 endwhile
7906
7907 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007908 sil! keepj g/^$/d
7909 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007910 call histdel("/",-1)
Bram Moolenaar15146672011-10-20 22:22:38 +02007911 exe "setl ts=".g:netrw_maxfilenamelen
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007912" call Decho("(LocalListing) setl ts=".g:netrw_maxfilenamelen)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007913
7914" call Dret("s:LocalListing")
7915endfun
7916
7917" ---------------------------------------------------------------------
7918" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
7919" performed any shell command. The idea is to cause all local-browsing
7920" buffers to be refreshed after a user has executed some shell command,
7921" on the chance that s/he removed/created a file/directory with it.
7922fun! s:LocalBrowseShellCmdRefresh()
7923" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
7924 " determine which buffers currently reside in a tab
7925 if !exists("s:netrw_browselist")
7926" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
7927 return
7928 endif
7929 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007930" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007931 return
7932 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007933 if exists("s:locbrowseshellcmd")
7934 if s:locbrowseshellcmd
7935 let s:locbrowseshellcmd= 0
7936" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
7937 return
7938 endif
7939 let s:locbrowseshellcmd= 0
7940 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007941 let itab = 1
7942 let buftablist = []
7943 while itab <= tabpagenr("$")
7944 let buftablist = buftablist + tabpagebuflist()
7945 let itab = itab + 1
7946 tabn
7947 endwhile
7948" call Decho("buftablist".string(buftablist))
7949" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
7950 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
7951 " | refresh any netrw window
7952 " | wipe out any non-displaying netrw buffer
7953 let curwin = winnr()
7954 let ibl = 0
7955 for ibuf in s:netrw_browselist
7956" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
7957 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
7958 " wipe out any non-displaying netrw buffer
7959" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007960 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007961 call remove(s:netrw_browselist,ibl)
7962" call Decho("browselist=".string(s:netrw_browselist))
7963 continue
7964 elseif index(tabpagebuflist(),ibuf) != -1
7965 " refresh any netrw buffer
7966" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
7967 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007968 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007969 endif
7970 let ibl= ibl + 1
7971 endfor
7972 exe curwin."wincmd w"
7973
7974" call Dret("LocalBrowseShellCmdRefresh")
7975endfun
7976
7977" ---------------------------------------------------------------------
7978" s:NetrwLocalRm: {{{2
7979fun! s:NetrwLocalRm(path) range
7980" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
7981" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7982
7983 " preparation for removing multiple files/directories
7984 let ret = 0
7985 let all = 0
7986 let svpos = netrw#NetrwSavePosn()
7987
7988 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7989 " remove all marked files
7990" call Decho("remove all marked files")
7991 for fname in s:netrwmarkfilelist_{bufnr("%")}
7992 let ok= s:NetrwLocalRmFile(a:path,fname,all)
7993 if ok =~ 'q\%[uit]' || ok == "no"
7994 break
7995 elseif ok =~ 'a\%[ll]'
7996 let all= 1
7997 endif
7998 endfor
7999 call s:NetrwUnMarkFile(1)
8000
8001 else
8002 " remove (multiple) files and directories
8003" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
8004
8005 let ctr = a:firstline
8006 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008007 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008008
8009 " sanity checks
8010 if line(".") < w:netrw_bannercnt
8011 let ctr= ctr + 1
8012 continue
8013 endif
8014 let curword= s:NetrwGetWord()
8015 if curword == "./" || curword == "../"
8016 let ctr= ctr + 1
8017 continue
8018 endif
8019 let ok= s:NetrwLocalRmFile(a:path,curword,all)
8020 if ok =~ 'q\%[uit]' || ok == "no"
8021 break
8022 elseif ok =~ 'a\%[ll]'
8023 let all= 1
8024 endif
8025 let ctr= ctr + 1
8026 endwhile
8027 endif
8028
8029 " refresh the directory
8030" call Decho("bufname<".bufname("%").">")
8031 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008032 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8033 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008034 endif
8035
8036" call Dret("s:NetrwLocalRm")
8037endfun
8038
8039" ---------------------------------------------------------------------
8040" s:NetrwLocalRmFile: remove file fname given the path {{{2
8041" Give confirmation prompt unless all==1
8042fun! s:NetrwLocalRmFile(path,fname,all)
8043" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
8044
8045 let all= a:all
8046 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008047 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008048 let rmfile= s:ComposePath(a:path,a:fname)
8049" call Decho("rmfile<".rmfile.">")
8050
8051 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
8052 " attempt to remove file
8053" call Decho("attempt to remove file<".rmfile.">")
8054 if !all
8055 echohl Statement
8056 call inputsave()
8057 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8058 call inputrestore()
8059 echohl NONE
8060 if ok == ""
8061 let ok="no"
8062 endif
8063" call Decho("response: ok<".ok.">")
8064 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8065" call Decho("response: ok<".ok."> (after sub)")
8066 if ok =~ 'a\%[ll]'
8067 let all= 1
8068 endif
8069 endif
8070
8071 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00008072 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008073" call Decho("errcode=".v:shell_error." ret=".ret)
8074 endif
8075
8076 else
8077 " attempt to remove directory
8078 if !all
8079 echohl Statement
8080 call inputsave()
8081 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8082 call inputrestore()
8083 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8084 if ok == ""
8085 let ok="no"
8086 endif
8087 if ok =~ 'a\%[ll]'
8088 let all= 1
8089 endif
8090 endif
8091 let rmfile= substitute(rmfile,'[\/]$','','e')
8092
8093 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008094" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')')
8095 call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008096" call Decho("v:shell_error=".v:shell_error)
8097
8098 if v:shell_error != 0
8099" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008100 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008101" call Decho("errcode=".errcode)
8102
8103 if errcode != 0
8104 if has("unix")
8105" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008106 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008107 if v:shell_error != 0 && !exists("g:netrw_quiet")
8108 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
8109 let ok="no"
8110 endif
8111 elseif !exists("g:netrw_quiet")
8112 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
8113 let ok="no"
8114 endif
8115 endif
8116 endif
8117 endif
8118 endif
8119
8120" call Dret("s:NetrwLocalRmFile ".ok)
8121 return ok
8122endfun
8123
8124" ---------------------------------------------------------------------
8125" s:NetrwLocalRename: rename a remote file or directory {{{2
8126fun! s:NetrwLocalRename(path) range
8127" call Dfunc("NetrwLocalRename(path<".a:path.">)")
8128
8129 " preparation for removing multiple files/directories
8130 let ctr = a:firstline
8131 let svpos= netrw#NetrwSavePosn()
8132
8133 " rename files given by the markfilelist
8134 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8135 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8136" call Decho("oldname<".oldname.">")
8137 if exists("subfrom")
8138 let newname= substitute(oldname,subfrom,subto,'')
8139" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8140 else
8141 call inputsave()
8142 let newname= input("Moving ".oldname." to : ",oldname)
8143 call inputrestore()
8144 if newname =~ '^s/'
8145 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8146 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8147" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8148 let newname = substitute(oldname,subfrom,subto,'')
8149 endif
8150 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008151 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008152 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01008153 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008154
8155 else
8156
8157 " attempt to rename files/directories
8158 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008159 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008160
8161 " sanity checks
8162 if line(".") < w:netrw_bannercnt
8163 let ctr= ctr + 1
8164 continue
8165 endif
8166 let curword= s:NetrwGetWord()
8167 if curword == "./" || curword == "../"
8168 let ctr= ctr + 1
8169 continue
8170 endif
8171
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008172 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008173 let oldname= s:ComposePath(a:path,curword)
8174" call Decho("oldname<".oldname.">")
8175
8176 call inputsave()
8177 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
8178 call inputrestore()
8179
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008180 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008181" call Decho("renaming <".oldname."> to <".newname.">")
8182
8183 let ctr= ctr + 1
8184 endwhile
8185 endif
8186
8187 " refresh the directory
8188" call Decho("refresh the directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008189 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8190 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008191
8192" call Dret("NetrwLocalRename")
8193endfun
8194
8195" ---------------------------------------------------------------------
8196" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
8197"
8198" g:netrw_ Directory Is
8199" fastbrowse Local Remote
8200" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
8201" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
8202" fast 2 H H
8203"
8204" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
8205" Hiding a buffer means that it will be re-used when examined, hence "fast".
8206" (re-using a buffer may not be as accurate)
8207fun! s:LocalFastBrowser()
8208" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
8209
8210 " initialize browselist, a list of buffer numbers that the local browser has used
8211 if !exists("s:netrw_browselist")
8212" call Decho("initialize s:netrw_browselist")
8213 let s:netrw_browselist= []
8214 endif
8215
8216 " append current buffer to fastbrowse list
8217 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
8218" call Decho("appendng current buffer to browselist")
8219 call add(s:netrw_browselist,bufnr("%"))
8220" call Decho("browselist=".string(s:netrw_browselist))
8221 endif
8222
8223 " enable autocmd events to handle refreshing/removing local browser buffers
8224 " If local browse buffer is currently showing: refresh it
8225 " If local browse buffer is currently hidden : wipe it
8226 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
8227" call Decho("setting up local-browser shell command refresh")
8228 let s:netrw_browser_shellcmd= 1
8229 augroup AuNetrwShellCmd
8230 au!
8231 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008232" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008233 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
8234 else
8235 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008236" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008237 endif
8238 augroup END
8239 endif
8240
8241 " user must have changed fastbrowse to its fast setting, so remove
8242 " the associated autocmd events
8243 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
8244" call Decho("remove AuNetrwShellCmd autcmd group")
8245 unlet s:netrw_browser_shellcmd
8246 augroup AuNetrwShellCmd
8247 au!
8248 augroup END
8249 augroup! AuNetrwShellCmd
8250 endif
8251
8252" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
8253endfun
8254
8255" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02008256" netrw#FileUrlRead: handles reading file://* files {{{2
8257" Should accept: file://localhost/etc/fstab
8258" file:///etc/fstab
8259" file:///c:/WINDOWS/clock.avi
8260" file:///c|/WINDOWS/clock.avi
8261" file://localhost/c:/WINDOWS/clock.avi
8262" file://localhost/c|/WINDOWS/clock.avi
8263" file://c:/foo.txt
8264" file:///c:/foo.txt
8265" 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 +02008266fun! netrw#FileUrlRead(fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02008267" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8268 let fname = a:fname
8269 if fname =~ '^file://localhost/'
8270" call Decho('converting file://localhost/ -to- file:///')
8271 let fname= substitute(fname,'^file://localhost/','file:///','')
8272" call Decho("fname<".fname.">")
8273 endif
8274 if (has("win32") || has("win95") || has("win64") || has("win16"))
8275 if fname =~ '^file:///\=\a[|:]/'
8276" call Decho('converting file:///\a|/ -to- file://\a:/')
8277 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8278" call Decho("fname<".fname.">")
8279 endif
8280 endif
8281 let fname2396 = netrw#RFC2396(fname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008282 let fname2396e= fnameescape(fname2396)
8283 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
Bram Moolenaar15146672011-10-20 22:22:38 +02008284 if (has("win32") || has("win95") || has("win64") || has("win16"))
8285" call Decho("windows exception for plainfname")
8286 if plainfname =~ '^/\+\a:'
8287" call Decho('removing leading "/"s')
8288 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8289 endif
8290 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008291" call Decho("fname2396<".fname2396.">")
8292" call Decho("plainfname<".plainfname.">")
8293 exe "sil doau BufReadPre ".fname2396e
Bram Moolenaar15146672011-10-20 22:22:38 +02008294 exe 'keepj r '.plainfname
Bram Moolenaaradc21822011-04-01 18:03:16 +02008295 exe 'file! '.plainfname
Bram Moolenaar15146672011-10-20 22:22:38 +02008296 keepj 1d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008297" call Decho("(FileUrlRead) setl nomod")
Bram Moolenaar15146672011-10-20 22:22:38 +02008298 setl nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008299" 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 +02008300" call Dret("netrw#FileUrlRead")
8301 exe "sil doau BufReadPost ".fname2396e
8302endfun
8303
8304" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008305" Support Functions: {{{1
8306
Bram Moolenaar488c6512005-08-11 20:09:58 +00008307" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008308" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
8309fun! netrw#NetrwRestorePosn(...)
8310" 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))
8311 let eikeep= &ei
8312 set ei=all
8313 if expand("%") == "NetrwMessage"
8314 exe s:winBeforeErr."wincmd w"
8315 endif
8316
8317 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02008318 exe "keepj ".a:1
Bram Moolenaarc236c162008-07-13 17:41:49 +00008319 endif
8320
8321 " restore window
8322 if exists("w:netrw_winnr")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008323" call Decho("restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008324 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008325 endif
8326 if v:shell_error == 0
8327 " as suggested by Bram M: redraw on no error
8328 " allows protocol error messages to remain visible
8329" redraw!
8330 endif
8331
8332 " restore top-of-screen line
8333 if exists("w:netrw_hline")
Bram Moolenaar15146672011-10-20 22:22:38 +02008334" call Decho("restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008335 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008336 endif
8337
8338 " restore position
8339 if exists("w:netrw_line") && exists("w:netrw_col")
Bram Moolenaar15146672011-10-20 22:22:38 +02008340" call Decho("restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008341 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008342 endif
8343
8344 let &ei= eikeep
8345" call Dret("netrw#NetrwRestorePosn")
8346endfun
8347
8348" ---------------------------------------------------------------------
8349" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
8350fun! netrw#NetrwSavePosn()
8351" call Dfunc("netrw#NetrwSavePosn()")
8352 " Save current line and column
8353 let w:netrw_winnr= winnr()
8354 let w:netrw_line = line(".")
8355 let w:netrw_col = virtcol(".")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008356" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008357
8358 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008359 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008360 let w:netrw_hline= line(".")
8361
8362 " set up string holding position parameters
8363 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
8364
Bram Moolenaaradc21822011-04-01 18:03:16 +02008365 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008366" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
8367 return ret
8368endfun
8369
8370" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008371" netrw#RFC2396: converts %xx into characters {{{2
8372fun! netrw#RFC2396(fname)
8373" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
8374 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
8375" call Dret("netrw#RFC2396 ".fname)
8376 return fname
8377endfun
8378
8379" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008380" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
8381fun! s:ComposePath(base,subdir)
8382" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
8383
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008384 if has("amiga")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008385" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008386 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00008387 if ec != '/' && ec != ':'
8388 let ret = a:base . "/" . a:subdir
8389 else
8390 let ret = a:base . a:subdir
8391 endif
8392
8393 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8394" call Decho("windows")
8395 let ret= a:subdir
8396
Bram Moolenaar5c736222010-01-06 20:54:52 +01008397 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8398" call Decho("windows")
8399 if a:base =~ '[/\\]$'
8400 let ret= a:base.a:subdir
8401 else
8402 let ret= a:base."/".a:subdir
8403 endif
8404
Bram Moolenaarc236c162008-07-13 17:41:49 +00008405 elseif a:base =~ '^\a\+://'
8406" call Decho("remote linux/macos")
8407 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
8408 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
8409 if a:subdir == '../'
8410 if curpath =~ '[^/]/[^/]\+/$'
8411 let curpath= substitute(curpath,'[^/]\+/$','','')
8412 else
8413 let curpath=""
8414 endif
8415 let ret= urlbase.curpath
8416 else
8417 let ret= urlbase.curpath.a:subdir
8418 endif
8419" call Decho("urlbase<".urlbase.">")
8420" call Decho("curpath<".curpath.">")
8421" call Decho("ret<".ret.">")
8422
8423 else
8424" call Decho("local linux/macos")
8425 let ret = substitute(a:base."/".a:subdir,"//","/","g")
8426 if a:base =~ '^//'
8427 " keeping initial '//' for the benefit of network share listing support
8428 let ret= '/'.ret
8429 endif
8430 let ret= simplify(ret)
8431 endif
8432
8433" call Dret("s:ComposePath ".ret)
8434 return ret
8435endfun
8436
8437" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008438" s:FileReadable: o/s independent filereadable {{{2
8439fun! s:FileReadable(fname)
8440" call Dfunc("s:FileReadable(fname<".a:fname.">)")
8441
8442 if g:netrw_cygwin
8443 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
8444 else
8445 let ret= filereadable(a:fname)
8446 endif
8447
8448" call Dret("s:FileReadable ".ret)
8449 return ret
8450endfun
8451
8452" ---------------------------------------------------------------------
8453" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
8454" Places correct suffix on end of temporary filename,
8455" using the suffix provided with fname
8456fun! s:GetTempfile(fname)
8457" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
8458
8459 if !exists("b:netrw_tmpfile")
8460 " get a brand new temporary filename
8461 let tmpfile= tempname()
8462" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008463
Bram Moolenaarc236c162008-07-13 17:41:49 +00008464 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008465" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008466
Bram Moolenaar9964e462007-05-05 17:54:07 +00008467 " sanity check -- does the temporary file's directory exist?
8468 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008469" 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 +02008470 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008471" call Dret("s:GetTempfile getcwd<".getcwd().">")
8472 return ""
8473 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008474
Bram Moolenaar9964e462007-05-05 17:54:07 +00008475 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01008476 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008477" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008478
Bram Moolenaar9964e462007-05-05 17:54:07 +00008479 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00008480 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00008481 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
8482 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008483 if !exists("+shellslash") || !&ssl
8484 let tmpfile = substitute(tmpfile,'/','\','g')
8485 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008486 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00008487 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00008488 endif
8489 let b:netrw_tmpfile= tmpfile
8490" call Decho("o/s dependent fixed tempname<".tmpfile.">")
8491 else
8492 " re-use temporary filename
8493 let tmpfile= b:netrw_tmpfile
8494" call Decho("tmpfile<".tmpfile."> re-using")
8495 endif
8496
8497 " use fname's suffix for the temporary file
8498 if a:fname != ""
8499 if a:fname =~ '\.[^./]\+$'
8500" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008501 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00008502 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008503 elseif a:fname =~ '.txz$'
8504 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008505 else
8506 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
8507 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008508" call Decho("suffix<".suffix.">")
8509 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
8510" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
8511 let tmpfile .= suffix
8512" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
8513 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
8514 endif
8515 endif
8516
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008517" 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 +00008518" call Dret("s:GetTempfile <".tmpfile.">")
8519 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008520endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00008521
8522" ---------------------------------------------------------------------
8523" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00008524" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00008525fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008526" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008527 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
8528 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008529 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008530 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008531 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008532 else
8533 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
8534 endif
8535" call Dret("s:MakeSshCmd <".sshcmd.">")
8536 return sshcmd
8537endfun
8538
8539" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008540" s:NetrwBMShow: {{{2
8541fun! s:NetrwBMShow()
8542" call Dfunc("s:NetrwBMShow()")
8543 redir => bmshowraw
8544 menu
8545 redir END
8546 let bmshowlist = split(bmshowraw,'\n')
8547 if bmshowlist != []
8548 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
8549 if bmshowfuncs != []
8550 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
8551 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008552 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00008553 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008554 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008555 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00008556" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
8557endfun
8558
8559" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02008560" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
8561fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008562 if !exists("w:netrw_liststyle")
8563 let w:netrw_liststyle= g:netrw_liststyle
8564 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008565" 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 +02008566
8567 if &ft != "netrw"
8568 " if the current window isn't a netrw directory listing window, then use user cursorline/column
8569 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaar15146672011-10-20 22:22:38 +02008570" call Decho("case ft!=netrw: use user cul,cuc")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008571 let &l:cursorline = s:netrw_usercul
8572 let &l:cursorcolumn = s:netrw_usercuc
8573
8574 elseif g:netrw_cursor == 4
8575 " all styles: cursorline, cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008576" call Decho("case g:netrw_cursor==4: setl cul cuc")
8577 setl cursorline
8578 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02008579
8580 elseif g:netrw_cursor == 3
8581 " thin-long-tree: cursorline, user's cursorcolumn
8582 " wide : cursorline, cursorcolumn
8583 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar15146672011-10-20 22:22:38 +02008584" call Decho("case g:netrw_cursor==3 and wide: setlocal cul cuc")
8585 setl cursorline
8586 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02008587 else
Bram Moolenaar15146672011-10-20 22:22:38 +02008588" call Decho("case g:netrw_cursor==3 and not wide: setlocal cul (use user's cuc)")
8589 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008590 let &l:cursorcolumn = s:netrw_usercuc
8591 endif
8592
8593 elseif g:netrw_cursor == 2
8594 " thin-long-tree: cursorline, user's cursorcolumn
8595 " wide : cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008596" call Decho("case g:netrw_cursor==2: setlocal cuc (use user's cul)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008597 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +02008598 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008599
8600 elseif g:netrw_cursor == 1
8601 " thin-long-tree: user's cursorline, user's cursorcolumn
8602 " wide : cursorline, user's cursorcolumn
8603 let &l:cursorcolumn = s:netrw_usercuc
8604 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar15146672011-10-20 22:22:38 +02008605" call Decho("case g:netrw_cursor==2 and wide: setlocal cul (use user's cuc)")
8606 set cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008607 else
Bram Moolenaar15146672011-10-20 22:22:38 +02008608" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008609 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008610 endif
8611
8612 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008613 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008614" call Decho("default: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008615 let &l:cursorline = s:netrw_usercul
8616 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008617 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008618
8619" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008620endfun
8621
8622" ---------------------------------------------------------------------
8623" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
8624fun! s:RestoreCursorline()
8625" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008626 if exists("s:netrw_usercul")
8627 let &l:cursorline = s:netrw_usercul
8628 endif
8629 if exists("s:netrw_usercuc")
8630 let &l:cursorcolumn = s:netrw_usercuc
8631 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008632" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
8633endfun
8634
8635" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008636" s:NetrwDelete: Deletes a file. {{{2
8637" Uses Steve Hall's idea to insure that Windows paths stay
8638" acceptable. No effect on Unix paths.
8639" Examples of use: let result= s:NetrwDelete(path)
8640fun! s:NetrwDelete(path)
8641" call Dfunc("s:NetrwDelete(path<".a:path.">)")
8642
Bram Moolenaar5c736222010-01-06 20:54:52 +01008643 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008644 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
8645 if exists("+shellslash")
8646 let sskeep= &shellslash
8647 setlocal noshellslash
8648 let result = delete(path)
8649 let &shellslash = sskeep
8650 else
8651" call Decho("exe let result= ".a:cmd."('".path."')")
8652 let result= delete(path)
8653 endif
8654 else
8655" call Decho("let result= delete(".path.")")
8656 let result= delete(path)
8657 endif
8658 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008659 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008660 endif
8661
8662" call Dret("s:NetrwDelete ".result)
8663 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00008664endfun
8665
8666" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008667" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01008668fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008669" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008670" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008671
Bram Moolenaar446cb832008-06-24 21:56:24 +00008672 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008673" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008674 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
8675 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
8676 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
8677 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
8678 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8679 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
8680 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
8681 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
8682 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
8683 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8684 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
8685 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
8686 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
8687 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
8688 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
8689 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
8690
Bram Moolenaaradc21822011-04-01 18:03:16 +02008691 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008692" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008693 let netrw_keepdiff= &l:diff
Bram Moolenaaradc21822011-04-01 18:03:16 +02008694 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem goes away (beeps result, but who knows)
8695" call Dredir("Benzinger 1:","ls!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008696 keepj keepalt enew!
Bram Moolenaaradc21822011-04-01 18:03:16 +02008697" call Dredir("Benzinger 2:","ls!")
8698 " 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 +02008699 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008700" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008701 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008702
Bram Moolenaar446cb832008-06-24 21:56:24 +00008703 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008704" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008705 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
8706 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
8707 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
8708 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
8709 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
8710 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
8711 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
8712 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
8713 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
8714 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
8715 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
8716 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
8717 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
8718 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
8719 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
8720 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
8721
Bram Moolenaar5c736222010-01-06 20:54:52 +01008722 if a:0 > 0
8723 let b:netrw_curdir= a:1
8724 if b:netrw_curdir =~ '/$'
8725 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
8726 file NetrwTreeListing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008727 set bt=nowrite noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02008728 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
8729 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01008730 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008731 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008732 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008733 endif
8734 endif
8735
Bram Moolenaar446cb832008-06-24 21:56:24 +00008736" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008737endfun
8738
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008739" ---------------------------------------------------------------------
8740" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
8741fun! s:NetrwInsureWinVars()
8742" call Dfunc("s:NetrwInsureWinVars()")
8743 if !exists("w:netrw_liststyle")
8744 let curbuf = bufnr("%")
8745 let curwin = winnr()
8746 let iwin = 1
8747 while iwin <= winnr("$")
8748 exe iwin."wincmd w"
8749 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
8750 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
8751 let winvars= w:
8752 break
8753 endif
8754 let iwin= iwin + 1
8755 endwhile
8756 exe curbuf."wincmd w"
8757 if exists("winvars")
8758" call Decho("copying w#".iwin." window variables to w#".curwin)
8759 for k in keys(winvars)
8760 let w:{k}= winvars[k]
8761 endfor
8762 endif
8763 endif
8764" call Dret("s:NetrwInsureWinVars")
8765endfun
8766
Bram Moolenaar9964e462007-05-05 17:54:07 +00008767" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008768" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
8769" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
8770fun! s:NetrwSaveWordPosn()
8771" call Dfunc("NetrwSaveWordPosn()")
8772 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
8773" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
8774endfun
8775
8776" ---------------------------------------------------------------------
8777" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
8778" changed sorting, etc. Also see s:NetrwSaveWordPosn().
8779fun! s:NetrwRestoreWordPosn()
8780" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008781 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008782" call Dret("NetrwRestoreWordPosn")
8783endfun
8784
8785" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008786" s:RestoreBufVars: {{{2
8787fun! s:RestoreBufVars()
8788" call Dfunc("s:RestoreBufVars()")
8789
8790 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
8791 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
8792 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
8793 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
8794 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
8795 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
8796
8797" call Dret("s:RestoreBufVars")
8798endfun
8799
8800" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008801" s:RemotePathAnalysis: {{{2
8802fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02008803" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008804
8805 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
8806 let s:method = substitute(a:dirname,dirpat,'\1','')
8807 let s:user = substitute(a:dirname,dirpat,'\2','')
8808 let s:machine = substitute(a:dirname,dirpat,'\3','')
8809 let s:port = substitute(a:dirname,dirpat,'\4','')
8810 let s:path = substitute(a:dirname,dirpat,'\5','')
8811 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
8812
8813" call Decho("set up s:method <".s:method .">")
8814" call Decho("set up s:user <".s:user .">")
8815" call Decho("set up s:machine<".s:machine.">")
8816" call Decho("set up s:port <".s:port.">")
8817" call Decho("set up s:path <".s:path .">")
8818" call Decho("set up s:fname <".s:fname .">")
8819
8820" call Dret("s:RemotePathAnalysis")
8821endfun
8822
8823" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008824" s:RemoteSystem: runs a command on a remote host using ssh {{{2
8825" Returns status
8826" Runs system() on
8827" [cd REMOTEDIRPATH;] a:cmd
8828" Note that it doesn't do shellescape(a:cmd)!
8829fun! s:RemoteSystem(cmd)
8830" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
8831 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008832 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 +00008833 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008834 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008835 else
8836 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
8837 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8838 if remotedir != ""
8839 let cmd= cmd.' cd '.shellescape(remotedir).";"
8840 else
8841 let cmd= cmd.' '
8842 endif
8843 let cmd= cmd.a:cmd
8844" call Decho("call system(".cmd.")")
8845 let ret= system(cmd)
8846 endif
8847" call Dret("s:RemoteSystem ".ret)
8848 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00008849endfun
8850
8851" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008852" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008853fun! s:RestoreWinVars()
8854" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008855 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008856 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
8857 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
8858 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
8859 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
8860 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
8861 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
8862 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
8863 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
8864 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
8865 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
8866 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
8867 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00008868 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
8869 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008870 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
8871 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
8872 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
8873" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008874endfun
8875
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008876" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008877" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
8878"
8879" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
8880" is true) and a command, :Rexplore, which call this function.
8881"
8882" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
8883fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008884" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02008885 if !exists("w:netrw_rexlocal")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008886" " call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
Bram Moolenaar15146672011-10-20 22:22:38 +02008887 return
8888 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008889 if w:netrw_rexlocal
8890 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008891 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008892 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008893 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008894 if exists("s:initbeval")
8895 set beval
8896 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008897 if exists("s:rexposn_".bufnr("%"))
8898" call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%'))
8899 keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')})
8900 unlet s:rexposn_{bufnr('%')}
8901 else
8902" call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008903 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008904 if exists("s:explore_match")
8905 exe "2match netrwMarkFile /".s:explore_match."/"
8906 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008907" call Dret("s:NetrwRexplore")
8908endfun
8909
8910" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008911" s:SaveBufVars: {{{2
8912fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008913" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00008914
8915 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
8916 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
8917 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
8918 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
8919 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
8920 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
8921
8922" call Dret("s:SaveBufVars")
8923endfun
8924
8925" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008926" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008927fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008928" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008929 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
8930 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
8931 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
8932 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
8933 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
8934 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
8935 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
8936 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
8937 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
8938 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
8939 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
8940 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
8941 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
8942 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
8943 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
8944 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
8945 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
8946 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
8947" call Dret("s:SaveWinVars")
8948endfun
8949
8950" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008951" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008952" To allow separate windows to have their own activities, such as
8953" Explore **/pattern, several variables have been made window-oriented.
8954" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008955" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008956" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008957fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008958" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008959 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
8960 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
8961 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
8962 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
8963 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
8964 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
8965 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
8966 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
8967 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
8968 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
8969" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008970endfun
8971
8972" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008973" s:SetRexDir: set directory for :Rexplore {{{2
8974fun! s:SetRexDir(islocal,dirname)
8975" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008976 let w:netrw_rexdir = a:dirname
8977 let w:netrw_rexlocal = a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00008978" call Dret("s:SetRexDir")
8979endfun
8980
8981" ---------------------------------------------------------------------
8982" s:Strlen: this function returns the length of a string, even if its {{{2
8983" using two-byte etc characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01008984" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
8985" and a bit from me.
8986" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008987fun! s:Strlen(x)
8988" call Dfunc("s:Strlen(x<".a:x.">")
8989 if g:netrw_xstrlen == 1
8990 " number of codepoints (Latin a + combining circumflex is two codepoints)
8991 " (comment from TM, solution from NW)
8992 let ret= strlen(substitute(a:x,'.','c','g'))
8993
8994 elseif g:netrw_xstrlen == 2
8995 " number of spacing codepoints (Latin a + combining circumflex is one spacing
8996 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
8997 " (comment from TM, solution from TM)
8998 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
8999
9000 elseif g:netrw_xstrlen == 3
9001 " virtual length (counting, for instance, tabs as anything between 1 and
9002 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
9003 " preceded by lam, one otherwise, etc.)
9004 " (comment from TM, solution from me)
9005 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009006 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009007 call setline(line("."),a:x)
9008 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009009 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00009010 let &mod= modkeep
9011
9012 else
9013 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01009014 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009015 endif
9016" call Dret("s:Strlen ".ret)
9017 return ret
9018endfun
9019
9020" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009021" s:TreeListMove: {{{2
9022fun! s:TreeListMove(dir)
9023" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
9024 let curline = getline('.')
9025 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
9026 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
9027 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
9028 let indentm1 = substitute(curindent,'^| ','','')
9029" call Decho("prvline <".prvline."> #".line(".")-1)
9030" call Decho("curline <".curline."> #".line("."))
9031" call Decho("nxtline <".nxtline."> #".line(".")+1)
9032" call Decho("curindent<".curindent.">")
9033" call Decho("indentm1 <".indentm1.">")
9034
9035 if curline !~ '/$'
9036" call Decho('regfile')
9037 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009038 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009039 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
9040" call Decho("regfile srch back: ".nl)
9041 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009042 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009043 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
9044" call Decho("regfile srch fwd: ".nl)
9045 endif
9046
9047 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009048 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009049 let curline= line(".")
9050 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
9051" call Decho("dir srch back ind: ".nl)
9052 if nl != 0
9053 if line(".") == curline-1
9054 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
9055" call Decho("dir srch back ind-1: ".nl)
9056 endif
9057 endif
9058
9059 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009060 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009061 let curline = line(".")
9062 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
9063" call Decho("dir srch fwd ind: ".nl)
9064 if nl != 0
9065 if line(".") == curline+1
9066 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
9067" call Decho("dir srch fwd ind-1: ".nl)
9068 endif
9069 endif
9070
9071 endif
9072
9073" call Dret("s:TreeListMove")
9074endfun
9075
9076" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009077" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
9078" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
9079" can't be called except via emenu. But due to locale, that menu line may not be called
9080" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
9081fun! s:UpdateBuffersMenu()
9082" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009083 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009084 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02009085 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009086 catch /^Vim\%((\a\+)\)\=:E/
9087 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02009088 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00009089 endtry
9090 endif
9091" call Dret("s:UpdateBuffersMenu")
9092endfun
9093
9094" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009095" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02009096" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009097fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009098" call Dfunc("s:UseBufWinVars()")
9099 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009100 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
9101 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
9102 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
9103 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
9104 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
9105 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9106 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9107 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
9108 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 +00009109" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009110endfun
9111
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009112" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01009113" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
9114fun! netrw#WinPath(path)
9115" call Dfunc("netrw#WinPath(path<".a:path.">)")
9116 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
9117 " remove cygdrive prefix, if present
9118 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00009119 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009120 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00009121 " remove escaped spaces
9122 let path = substitute(path, '\ ', ' ', 'g')
9123 " convert slashes to backslashes
9124 let path = substitute(path, '/', '\', 'g')
9125 else
9126 let path= a:path
9127 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009128" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009129 return path
9130endfun
9131
9132" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00009133" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00009134let &cpo= s:keepcpo
9135unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00009136
Bram Moolenaar071d4272004-06-13 20:20:40 +00009137" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00009138" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00009139" vim:ts=8 fdm=marker