blob: e3ac12ffb5d84afaa248543ee1b21614d7e54945 [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 Moolenaarb7398fe2023-05-14 18:50:25 +01003" Date: May 03, 2023
4" Version: 173
Bram Moolenaar29634562020-01-09 21:46:04 +01005" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007" Copyright: Copyright (C) 2016 Charles E. Campbell {{{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 Moolenaar91359012019-11-30 17:57:03 +010016"
17" Note: the code here was started in 1999 under a much earlier version of vim. The directory browsing
18" code was written using vim v6, which did not have Lists (Lists were first offered with vim-v7).
19"
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020020"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar071d4272004-06-13 20:20:40 +000021"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000022" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000023" (James 1:22 RSV)
24" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar9964e462007-05-05 17:54:07 +000025" Load Once: {{{1
Bram Moolenaar1afcace2005-11-25 19:54:28 +000026if &cp || exists("g:loaded_netrw")
27 finish
28endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020029
30" Check that vim has patches that netrw requires.
31" Patches needed for v7.4: 1557, and 213.
32" (netrw will benefit from vim's having patch#656, too)
33let s:needspatches=[1557,213]
34if exists("s:needspatches")
35 for ptch in s:needspatches
36 if v:version < 704 || (v:version == 704 && !has("patch".ptch))
37 if !exists("s:needpatch{ptch}")
38 unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch#".ptch
39 endif
40 let s:needpatch{ptch}= 1
41 finish
42 endif
43 endfor
Bram Moolenaar13600302014-05-22 18:26:40 +020044endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020045
Bram Moolenaarb7398fe2023-05-14 18:50:25 +010046let g:loaded_netrw = "v173"
Bram Moolenaar9964e462007-05-05 17:54:07 +000047if !exists("s:NOTE")
48 let s:NOTE = 0
49 let s:WARNING = 1
50 let s:ERROR = 2
51endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000052
Bram Moolenaar1afcace2005-11-25 19:54:28 +000053let s:keepcpo= &cpo
Bram Moolenaara6878372014-03-22 21:02:50 +010054setl cpo&vim
Bram Moolenaar85850f32019-07-19 22:05:51 +020055"DechoFuncName 1
Bram Moolenaar8d043172014-01-23 14:24:41 +010056"DechoRemOn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010057"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw,'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +000058
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000059" ======================
60" Netrw Variables: {{{1
61" ======================
62
Bram Moolenaar071d4272004-06-13 20:20:40 +000063" ---------------------------------------------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +020064" netrw#ErrorMsg: {{{2
65" 0=note = s:NOTE
66" 1=warning = s:WARNING
67" 2=error = s:ERROR
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010068" Usage: netrw#ErrorMsg(s:NOTE | s:WARNING | s:ERROR,"some message",error-number)
69" netrw#ErrorMsg(s:NOTE | s:WARNING | s:ERROR,["message1","message2",...],error-number)
70" (this function can optionally take a list of messages)
Bram Moolenaar29634562020-01-09 21:46:04 +010071" Dec 2, 2019 : max errnum currently is 106
Bram Moolenaar5b435d62012-04-05 17:33:26 +020072fun! netrw#ErrorMsg(level,msg,errnum)
73" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
74
75 if a:level < g:netrw_errorlvl
Bram Moolenaare6ae6222013-05-21 21:01:10 +020076" call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl)
Bram Moolenaar5b435d62012-04-05 17:33:26 +020077 return
78 endif
79
80 if a:level == 1
81 let level= "**warning** (netrw) "
82 elseif a:level == 2
83 let level= "**error** (netrw) "
84 else
85 let level= "**note** (netrw) "
86 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010087" call Decho("level=".level,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020088
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020089 if g:netrw_use_errorwindow == 2 && (v:version > 802 || (v:version == 802 && has("patch486")))
90 " use popup window
91 if type(a:msg) == 3
92 let msg = [level]+a:msg
93 else
94 let msg= level.a:msg
95 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +020096 let s:popuperr_id = popup_atcursor(msg,{})
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020097 let s:popuperr_text= ""
98 elseif g:netrw_use_errorwindow
Bram Moolenaar5b435d62012-04-05 17:33:26 +020099 " (default) netrw creates a one-line window to show error/warning
100 " messages (reliably displayed)
101
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100102 " record current window number
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200103 let s:winBeforeErr= winnr()
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100104" call Decho("s:winBeforeErr=".s:winBeforeErr,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200105
106 " getting messages out reliably is just plain difficult!
107 " This attempt splits the current window, creating a one line window.
108 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100109" call Decho("write to NetrwMessage buffer",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200110 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100111" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200112 setl ma noro
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100113 if type(a:msg) == 3
114 for msg in a:msg
115 NetrwKeepj call setline(line("$")+1,level.msg)
116 endfor
117 else
118 NetrwKeepj call setline(line("$")+1,level.a:msg)
119 endif
120 NetrwKeepj $
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200121 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100122" call Decho("create a NetrwMessage buffer window",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200123 bo 1split
124 sil! call s:NetrwEnew()
Bram Moolenaar85850f32019-07-19 22:05:51 +0200125 sil! NetrwKeepj call s:NetrwOptionsSafe(1)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200126 setl bt=nofile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100127 NetrwKeepj file NetrwMessage
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100128" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200129 setl ma noro
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100130 if type(a:msg) == 3
131 for msg in a:msg
132 NetrwKeepj call setline(line("$")+1,level.msg)
133 endfor
134 else
135 NetrwKeepj call setline(line("$"),level.a:msg)
136 endif
137 NetrwKeepj $
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200138 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100139" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200140 if &fo !~ '[ta]'
141 syn clear
142 syn match netrwMesgNote "^\*\*note\*\*"
143 syn match netrwMesgWarning "^\*\*warning\*\*"
144 syn match netrwMesgError "^\*\*error\*\*"
145 hi link netrwMesgWarning WarningMsg
146 hi link netrwMesgError Error
147 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100148" call Decho("setl noma ro bh=wipe",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +0200149 setl ro nomod noma bh=wipe
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200150
151 else
152 " (optional) netrw will show messages using echomsg. Even if the
153 " message doesn't appear, at least it'll be recallable via :messages
154" redraw!
155 if a:level == s:WARNING
156 echohl WarningMsg
157 elseif a:level == s:ERROR
158 echohl Error
159 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100160
161 if type(a:msg) == 3
162 for msg in a:msg
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100163 unsilent echomsg level.msg
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100164 endfor
165 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100166 unsilent echomsg level.a:msg
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100167 endif
168
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100169" call Decho("echomsg ***netrw*** ".a:msg,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200170 echohl None
171 endif
172
173" call Dret("netrw#ErrorMsg")
174endfun
175
176" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100177" s:NetrwInit: initializes variables if they haven't been defined {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100178" Loosely, varname = value.
179fun s:NetrwInit(varname,value)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100180" call Decho("varname<".a:varname."> value=".a:value,'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100181 if !exists(a:varname)
182 if type(a:value) == 0
183 exe "let ".a:varname."=".a:value
Bram Moolenaarff034192013-04-24 18:51:19 +0200184 elseif type(a:value) == 1 && a:value =~ '^[{[]'
185 exe "let ".a:varname."=".a:value
Bram Moolenaar5c736222010-01-06 20:54:52 +0100186 elseif type(a:value) == 1
187 exe "let ".a:varname."="."'".a:value."'"
188 else
189 exe "let ".a:varname."=".a:value
190 endif
191 endif
192endfun
193
194" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +0000195" Netrw Constants: {{{2
Bram Moolenaar85850f32019-07-19 22:05:51 +0200196call s:NetrwInit("g:netrw_dirhistcnt",0)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000197if !exists("s:LONGLIST")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100198 call s:NetrwInit("s:THINLIST",0)
199 call s:NetrwInit("s:LONGLIST",1)
200 call s:NetrwInit("s:WIDELIST",2)
201 call s:NetrwInit("s:TREELIST",3)
202 call s:NetrwInit("s:MAXLIST" ,4)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000203endif
204
205" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +0200206" Default option values: {{{2
207let g:netrw_localcopycmdopt = ""
208let g:netrw_localcopydircmdopt = ""
209let g:netrw_localmkdiropt = ""
210let g:netrw_localmovecmdopt = ""
Bram Moolenaar85850f32019-07-19 22:05:51 +0200211
212" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000213" Default values for netrw's global protocol variables {{{2
Bram Moolenaar1d59aa12020-09-19 18:50:13 +0200214if (v:version > 802 || (v:version == 802 && has("patch486"))) && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on") && has("mouse")
215 call s:NetrwInit("g:netrw_use_errorwindow",2)
216else
217 call s:NetrwInit("g:netrw_use_errorwindow",1)
218endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200219
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000220if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100221 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000222 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100223 elseif executable("curl")
224 let g:netrw_dav_cmd = "curl"
225 else
226 let g:netrw_dav_cmd = ""
227 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000229if !exists("g:netrw_fetch_cmd")
230 if executable("fetch")
231 let g:netrw_fetch_cmd = "fetch -o"
232 else
233 let g:netrw_fetch_cmd = ""
234 endif
235endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100236if !exists("g:netrw_file_cmd")
237 if executable("elinks")
238 call s:NetrwInit("g:netrw_file_cmd","elinks")
239 elseif executable("links")
240 call s:NetrwInit("g:netrw_file_cmd","links")
241 endif
242endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000243if !exists("g:netrw_ftp_cmd")
244 let g:netrw_ftp_cmd = "ftp"
245endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200246let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200247if !exists("g:netrw_ftp_options")
248 let g:netrw_ftp_options= "-i -n"
249endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000250if !exists("g:netrw_http_cmd")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100251 if executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100252 let g:netrw_http_cmd = "wget"
253 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100254 elseif executable("curl")
255 let g:netrw_http_cmd = "curl"
256 call s:NetrwInit("g:netrw_http_xcmd","-L -o")
Bram Moolenaar85850f32019-07-19 22:05:51 +0200257 elseif executable("elinks")
258 let g:netrw_http_cmd = "elinks"
259 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000260 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100261 let g:netrw_http_cmd = "fetch"
262 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar85850f32019-07-19 22:05:51 +0200263 elseif executable("links")
264 let g:netrw_http_cmd = "links"
265 call s:NetrwInit("g:netrw_http_xcmd","-http.extra-header ".shellescape("Accept-Encoding: identity", 1)." -source >")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000266 else
267 let g:netrw_http_cmd = ""
268 endif
269endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100270call s:NetrwInit("g:netrw_http_put_cmd","curl -T")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100271call s:NetrwInit("g:netrw_keepj","keepj")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100272call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
273call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
Bram Moolenaar85850f32019-07-19 22:05:51 +0200274call s:NetrwInit("g:netrw_rsync_sep", "/")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200275if !exists("g:netrw_scp_cmd")
276 if executable("scp")
277 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
278 elseif executable("pscp")
279 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk')
280 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk')
281 else
282 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q')
283 endif
284 else
285 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
286 endif
287endif
288
Bram Moolenaar5c736222010-01-06 20:54:52 +0100289call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
290call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000291
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000292if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000293 \ && exists("g:netrw_use_nt_rcp")
294 \ && g:netrw_use_nt_rcp
295 \ && executable( $SystemRoot .'/system32/rcp.exe')
296 let s:netrw_has_nt_rcp = 1
297 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000298else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000299 let s:netrw_has_nt_rcp = 0
300 let s:netrw_rcpmode = ''
301endif
302
303" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000304" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000305" Cygwin Detection ------- {{{3
306if !exists("g:netrw_cygwin")
307 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100308 if has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000309 let g:netrw_cygwin= 1
310 else
311 let g:netrw_cygwin= 0
312 endif
313 else
314 let g:netrw_cygwin= 0
315 endif
316endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000317" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100318call s:NetrwInit("g:netrw_alto" , &sb)
319call s:NetrwInit("g:netrw_altv" , &spr)
320call s:NetrwInit("g:netrw_banner" , 1)
321call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar13600302014-05-22 18:26:40 +0200322call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro nornu")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100323call s:NetrwInit("g:netrw_chgwin" , -1)
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200324call s:NetrwInit("g:netrw_clipboard" , 1)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100325call s:NetrwInit("g:netrw_compress" , "gzip")
326call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200327if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
328 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
329 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000330endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200331call s:NetrwInit("g:netrw_cursor" , 2)
332let s:netrw_usercul = &cursorline
333let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200334"call Decho("(netrw) COMBAK: cuc=".&l:cuc." cul=".&l:cul." initialization of s:netrw_cu[cl]")
Bram Moolenaar8d043172014-01-23 14:24:41 +0100335call s:NetrwInit("g:netrw_cygdrive","/cygdrive")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000336" Default values - d-g ---------- {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +0200337call s:NetrwInit("s:didstarstar",0)
Bram Moolenaar85850f32019-07-19 22:05:51 +0200338call s:NetrwInit("g:netrw_dirhistcnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200339call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100340call s:NetrwInit("g:netrw_dirhistmax" , 10)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200341call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100342call s:NetrwInit("g:netrw_fastbrowse" , 1)
343call 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 +0000344if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000345 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
346 let g:netrw_ftp_list_cmd = "ls -lF"
347 let g:netrw_ftp_timelist_cmd = "ls -tlF"
348 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000349 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000350 let g:netrw_ftp_list_cmd = "dir"
351 let g:netrw_ftp_timelist_cmd = "dir"
352 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000353 endif
354endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100355call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000356" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100357call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000358if !exists("g:netrw_ignorenetrc")
359 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
360 let g:netrw_ignorenetrc= 1
361 else
362 let g:netrw_ignorenetrc= 0
363 endif
364endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100365call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000366if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000367 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000368 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200369 " provide a pscp-based listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000370 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
371 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100372 if exists("g:netrw_list_cmd_options")
373 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME: ".g:netrw_list_cmd_options
374 else
375 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
376 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000377 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200378 " provide a scp-based default listing command
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100379 if exists("g:netrw_list_cmd_options")
380 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa ".g:netrw_list_cmd_options
381 else
382 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
383 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000384 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100385" call Decho(g:netrw_ssh_cmd." is not executable",'~'.expand("<slnum>"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000386 let g:netrw_list_cmd= ""
387 endif
388endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100389call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000390" Default values - lh-lz ---------- {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200391if exists("g:netrw_local_copycmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200392 let g:netrw_localcopycmd= g:netrw_local_copycmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200393 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
394endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100395if !exists("g:netrw_localcmdshell")
396 let g:netrw_localcmdshell= ""
397endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000398if !exists("g:netrw_localcopycmd")
399 if has("win32") || has("win95") || has("win64") || has("win16")
400 if g:netrw_cygwin
401 let g:netrw_localcopycmd= "cp"
402 else
Bram Moolenaar85850f32019-07-19 22:05:51 +0200403 let g:netrw_localcopycmd = expand("$COMSPEC")
404 let g:netrw_localcopycmdopt= " /c copy"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000405 endif
406 elseif has("unix") || has("macunix")
407 let g:netrw_localcopycmd= "cp"
408 else
409 let g:netrw_localcopycmd= ""
410 endif
411endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100412if !exists("g:netrw_localcopydircmd")
413 if has("win32") || has("win95") || has("win64") || has("win16")
414 if g:netrw_cygwin
Bram Moolenaar85850f32019-07-19 22:05:51 +0200415 let g:netrw_localcopydircmd = "cp"
416 let g:netrw_localcopydircmdopt= " -R"
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100417 else
Bram Moolenaar85850f32019-07-19 22:05:51 +0200418 let g:netrw_localcopydircmd = expand("$COMSPEC")
419 let g:netrw_localcopydircmdopt= " /c xcopy /e /c /h /i /k"
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100420 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +0200421 elseif has("unix")
422 let g:netrw_localcopydircmd = "cp"
423 let g:netrw_localcopydircmdopt= " -R"
424 elseif has("macunix")
425 let g:netrw_localcopydircmd = "cp"
426 let g:netrw_localcopydircmdopt= " -R"
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100427 else
Bram Moolenaar85850f32019-07-19 22:05:51 +0200428 let g:netrw_localcopydircmd= ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100429 endif
430endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200431if exists("g:netrw_local_mkdir")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100432 let g:netrw_localmkdir= g:netrw_local_mkdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200433 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
434endif
Bram Moolenaar13600302014-05-22 18:26:40 +0200435if has("win32") || has("win95") || has("win64") || has("win16")
436 if g:netrw_cygwin
437 call s:NetrwInit("g:netrw_localmkdir","mkdir")
438 else
Bram Moolenaar85850f32019-07-19 22:05:51 +0200439 let g:netrw_localmkdir = expand("$COMSPEC")
440 let g:netrw_localmkdiropt= " /c mkdir"
Bram Moolenaar13600302014-05-22 18:26:40 +0200441 endif
442else
443 call s:NetrwInit("g:netrw_localmkdir","mkdir")
444endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200445call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200446if exists("g:netrw_local_movecmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200447 let g:netrw_localmovecmd= g:netrw_local_movecmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200448 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
449endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000450if !exists("g:netrw_localmovecmd")
451 if has("win32") || has("win95") || has("win64") || has("win16")
452 if g:netrw_cygwin
453 let g:netrw_localmovecmd= "mv"
454 else
Bram Moolenaar85850f32019-07-19 22:05:51 +0200455 let g:netrw_localmovecmd = expand("$COMSPEC")
456 let g:netrw_localmovecmdopt= " /c move"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000457 endif
458 elseif has("unix") || has("macunix")
459 let g:netrw_localmovecmd= "mv"
460 else
461 let g:netrw_localmovecmd= ""
462 endif
463endif
Bram Moolenaar29634562020-01-09 21:46:04 +0100464" following serves as an example for how to insert a version&patch specific test
465"if v:version < 704 || (v:version == 704 && !has("patch1107"))
466"endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100467call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
468" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000469if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000470 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000471endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000472if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000473 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
474endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000475" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100476call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
477call s:NetrwInit("g:netrw_maxfilenamelen", 32)
478call s:NetrwInit("g:netrw_menu" , 1)
479call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +0200480call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~# '[anh]'))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100481call s:NetrwInit("g:netrw_retmap" , 0)
482if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
483 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
484elseif has("win32") || has("win95") || has("win64") || has("win16")
485 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
486else
487 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000488endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100489call s:NetrwInit("g:netrw_preview" , 0)
490call s:NetrwInit("g:netrw_scpport" , "-P")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100491call s:NetrwInit("g:netrw_servername" , "NETRWSERVER")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100492call s:NetrwInit("g:netrw_sshport" , "-p")
493call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
494call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
495call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
Bram Moolenaara6878372014-03-22 21:02:50 +0100496call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f ")
497" Default values - q-s ---------- {{{3
498call s:NetrwInit("g:netrw_quickhelp",0)
499let s:QuickHelp= ["-:go up dir D:delete R:rename s:sort-by x:special",
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100500 \ "(create new) %:file d:directory",
501 \ "(windows split&open) o:horz v:vert p:preview",
502 \ "i:style qf:file info O:obtain r:reverse",
503 \ "(marks) mf:mark file mt:set target mm:move mc:copy",
504 \ "(bookmarks) mb:make mB:delete qb:list gb:go to",
505 \ "(history) qb:list u:go up U:go down",
506 \ "(targets) mt:target Tb:use bookmark Th:use history"]
Bram Moolenaar5c736222010-01-06 20:54:52 +0100507" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
508call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100509if !exists("g:netrw_keepj") || g:netrw_keepj == "keepj"
510 call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
511else
512 call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil " : " ")
513endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100514call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
515call s:NetrwInit("g:netrw_sort_options" , "")
516call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000517if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100518 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200519 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100520 else
521 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000522 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000523endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100524call s:NetrwInit("g:netrw_special_syntax" , 0)
525call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +0200526call s:NetrwInit("g:netrw_suppress_gx_mesg", 1)
Bram Moolenaara6878372014-03-22 21:02:50 +0100527call s:NetrwInit("g:netrw_use_noswf" , 1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100528call s:NetrwInit("g:netrw_sizestyle" ,"b")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000529" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100530call s:NetrwInit("g:netrw_timefmt","%c")
Bram Moolenaarff034192013-04-24 18:51:19 +0200531if !exists("g:netrw_xstrlen")
532 if exists("g:Align_xstrlen")
533 let g:netrw_xstrlen= g:Align_xstrlen
534 elseif exists("g:drawit_xstrlen")
535 let g:netrw_xstrlen= g:drawit_xstrlen
536 elseif &enc == "latin1" || !has("multi_byte")
537 let g:netrw_xstrlen= 0
538 else
539 let g:netrw_xstrlen= 1
540 endif
541endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100542call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100543call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200544call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100545call s:NetrwInit("g:netrw_wiw",1)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200546if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000547" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000548" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100549call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200550if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarff034192013-04-24 18:51:19 +0200551 call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200552else
Bram Moolenaarff034192013-04-24 18:51:19 +0200553 call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200554endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200555call s:NetrwInit("g:netrw_menu_escape",'.&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100556call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
557call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaara6878372014-03-22 21:02:50 +0100558if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4')
Bram Moolenaar8d043172014-01-23 14:24:41 +0100559 let s:treedepthstring= "│ "
560else
561 let s:treedepthstring= "| "
562endif
Bram Moolenaar85850f32019-07-19 22:05:51 +0200563call s:NetrwInit("s:netrw_posn",'{}')
Bram Moolenaar8299df92004-07-10 09:47:34 +0000564
565" BufEnter event ignored by decho when following variable is true
566" Has a side effect that doau BufReadPost doesn't work, so
567" files read by network transfer aren't appropriately highlighted.
568"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569
Bram Moolenaaradc21822011-04-01 18:03:16 +0200570" ======================
571" Netrw Initialization: {{{1
572" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200573if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100574" call Decho("installed beval events",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100575 let &l:bexpr = "netrw#BalloonHelp()"
Bram Moolenaar1d59aa12020-09-19 18:50:13 +0200576" call Decho("&l:bexpr<".&l:bexpr."> buf#".bufnr())
Bram Moolenaara6878372014-03-22 21:02:50 +0100577 au FileType netrw setl beval
Bram Moolenaar8d043172014-01-23 14:24:41 +0100578 au WinLeave * if &ft == "netrw" && exists("s:initbeval")|let &beval= s:initbeval|endif
579 au VimEnter * let s:initbeval= &beval
580"else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100581" if v:version < 700 | call Decho("did not install beval events: v:version=".v:version." < 700","~".expand("<slnum>")) | endif
582" if !has("balloon_eval") | call Decho("did not install beval events: does not have balloon_eval","~".expand("<slnum>")) | endif
583" if exists("s:initbeval") | call Decho("did not install beval events: s:initbeval exists","~".expand("<slnum>")) | endif
584" if exists("g:netrw_nobeval") | call Decho("did not install beval events: g:netrw_nobeval exists","~".expand("<slnum>")) | endif
585" if !has("syntax") | call Decho("did not install beval events: does not have syntax highlighting","~".expand("<slnum>")) | endif
586" if exists("g:syntax_on") | call Decho("did not install beval events: g:syntax_on exists","~".expand("<slnum>")) | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200587endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200588au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200589
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +0200590if g:netrw_keepj =~# "keepj"
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100591 com! -nargs=* NetrwKeepj keepj <args>
592else
593 let g:netrw_keepj= ""
594 com! -nargs=* NetrwKeepj <args>
595endif
596
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000597" ==============================
598" Netrw Utility Functions: {{{1
599" ==============================
600
Bram Moolenaaradc21822011-04-01 18:03:16 +0200601" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +0100602" netrw#BalloonHelp: {{{2
Bram Moolenaar8d043172014-01-23 14:24:41 +0100603if v:version >= 700 && has("balloon_eval") && has("syntax") && exists("g:syntax_on") && !exists("g:netrw_nobeval")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100604" call Decho("loading netrw#BalloonHelp()",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100605 fun! netrw#BalloonHelp()
Bram Moolenaar8d043172014-01-23 14:24:41 +0100606 if &ft != "netrw"
607 return ""
608 endif
Bram Moolenaar1d59aa12020-09-19 18:50:13 +0200609 if exists("s:popuperr_id") && popup_getpos(s:popuperr_id) != {}
610 " popup error window is still showing
611 " s:pouperr_id and s:popuperr_text are set up in netrw#ErrorMsg()
612 if exists("s:popuperr_text") && s:popuperr_text != "" && v:beval_text != s:popuperr_text
613 " text under mouse hasn't changed; only close window when it changes
614 call popup_close(s:popuperr_id)
615 unlet s:popuperr_text
616 else
617 let s:popuperr_text= v:beval_text
618 endif
619 let mesg= ""
620 elseif !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
Bram Moolenaar8d043172014-01-23 14:24:41 +0100621 let mesg= ""
622 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
623 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
624 elseif getline(v:beval_lnum) =~ '^"\s*/'
625 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
626 elseif v:beval_text == "Sorted" || v:beval_text == "by"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100627 let mesg = 's: sort by name, time, file size, extension r: reverse sorting order mt: mark target'
Bram Moolenaar8d043172014-01-23 14:24:41 +0100628 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
629 let mesg = "S: edit sorting sequence"
630 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
631 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
632 elseif v:beval_text == "Quick" || v:beval_text == "Help"
633 let mesg = "Help: press <F1>"
634 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
635 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
636 else
637 let mesg= ""
638 endif
639 return mesg
640 endfun
641"else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100642" if v:version < 700 |call Decho("did not load netrw#BalloonHelp(): vim version ".v:version." < 700 -","~".expand("<slnum>"))|endif
643" if !has("balloon_eval") |call Decho("did not load netrw#BalloonHelp(): does not have balloon eval","~".expand("<slnum>")) |endif
644" if !has("syntax") |call Decho("did not load netrw#BalloonHelp(): syntax disabled","~".expand("<slnum>")) |endif
645" if !exists("g:syntax_on") |call Decho("did not load netrw#BalloonHelp(): g:syntax_on n/a","~".expand("<slnum>")) |endif
646" if exists("g:netrw_nobeval") |call Decho("did not load netrw#BalloonHelp(): g:netrw_nobeval exists","~".expand("<slnum>")) |endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200647endif
648
Bram Moolenaar071d4272004-06-13 20:20:40 +0000649" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200650" netrw#Explore: launch the local browser in the directory of the current file {{{2
651" indx: == -1: Nexplore
652" == -2: Pexplore
653" == +: this is overloaded:
654" * If Nexplore/Pexplore is in use, then this refers to the
655" indx'th item in the w:netrw_explore_list[] of items which
656" matched the */pattern **/pattern *//pattern **//pattern
657" * If Hexplore or Vexplore, then this will override
658" g:netrw_winsize to specify the qty of rows or columns the
659" newly split window should have.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100660" dosplit==0: the window will be split iff the current file has been modified and hidden not set
Bram Moolenaarff034192013-04-24 18:51:19 +0200661" dosplit==1: the window will be split before running the local browser
662" style == 0: Explore style == 1: Explore!
663" == 2: Hexplore style == 3: Hexplore!
664" == 4: Vexplore style == 5: Vexplore!
665" == 6: Texplore
666fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100667" 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("%")." ft=".&ft)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100668" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200669 if !exists("b:netrw_curdir")
670 let b:netrw_curdir= getcwd()
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100671" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200672 endif
Bram Moolenaara6878372014-03-22 21:02:50 +0100673
674 " record current file for Rexplore's benefit
675 if &ft != "netrw"
676 let w:netrw_rexfile= expand("%:p")
677 endif
678
679 " record current directory
Bram Moolenaarff034192013-04-24 18:51:19 +0200680 let curdir = simplify(b:netrw_curdir)
681 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200682 if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
683 let curdir= substitute(curdir,'\','/','g')
684 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100685" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100686
687 " using completion, directories with spaces in their names (thanks, Bill Gates, for a truly dumb idea)
688 " will end up with backslashes here. Solution: strip off backslashes that precede white space and
689 " try Explore again.
690 if a:0 > 0
691" call Decho('considering retry: a:1<'.a:1.'>: '.
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100692 \ ((a:1 =~ "\\\s")? 'has backslash whitespace' : 'does not have backslash whitespace').', '.
693 \ ((filereadable(s:NetrwFile(a:1)))? 'is readable' : 'is not readable').', '.
694 \ ((isdirectory(s:NetrwFile(a:1))))? 'is a directory' : 'is not a directory',
695 \ '~'.expand("<slnum>"))
696 if a:1 =~ "\\\s" && !filereadable(s:NetrwFile(a:1)) && !isdirectory(s:NetrwFile(a:1))
697" call Decho("re-trying Explore with <".substitute(a:1,'\\\(\s\)','\1','g').">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100698 call netrw#Explore(a:indx,a:dosplit,a:style,substitute(a:1,'\\\(\s\)','\1','g'))
699" call Dret("netrw#Explore : returning from retry")
700 return
701" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100702" call Decho("retry not needed",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100703 endif
704 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200705
706 " save registers
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200707 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100708" call Decho("(netrw#Explore) save @* and @+",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100709 sil! let keepregstar = @*
710 sil! let keepregplus = @+
711 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200712 sil! let keepregslash= @/
713
Bram Moolenaar8d043172014-01-23 14:24:41 +0100714 " if dosplit
715 " -or- file has been modified AND file not hidden when abandoned
716 " -or- Texplore used
717 if a:dosplit || (&modified && &hidden == 0 && &bufhidden != "hide") || a:style == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100718" call Decho("case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200719 call s:SaveWinVars()
720 let winsz= g:netrw_winsize
721 if a:indx > 0
722 let winsz= a:indx
723 endif
724
725 if a:style == 0 " Explore, Sexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100726" call Decho("style=0: Explore or Sexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200727 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200728 if winsz == 0|let winsz= ""|endif
729 exe "noswapfile ".winsz."wincmd s"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100730" call Decho("exe noswapfile ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200731
732 elseif a:style == 1 "Explore!, Sexplore!
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100733" call Decho("style=1: Explore! or Sexplore!",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200734 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200735 if winsz == 0|let winsz= ""|endif
736 exe "keepalt noswapfile ".winsz."wincmd v"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100737" call Decho("exe keepalt noswapfile ".winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200738
739 elseif a:style == 2 " Hexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100740" call Decho("style=2: Hexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200741 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200742 if winsz == 0|let winsz= ""|endif
743 exe "keepalt noswapfile bel ".winsz."wincmd s"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100744" call Decho("exe keepalt noswapfile bel ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200745
746 elseif a:style == 3 " Hexplore!
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100747" call Decho("style=3: Hexplore!",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200748 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200749 if winsz == 0|let winsz= ""|endif
750 exe "keepalt noswapfile abo ".winsz."wincmd s"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100751" call Decho("exe keepalt noswapfile abo ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200752
753 elseif a:style == 4 " Vexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100754" call Decho("style=4: Vexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200755 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200756 if winsz == 0|let winsz= ""|endif
757 exe "keepalt noswapfile lefta ".winsz."wincmd v"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100758" call Decho("exe keepalt noswapfile lefta ".winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200759
760 elseif a:style == 5 " Vexplore!
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100761" call Decho("style=5: Vexplore!",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200762 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200763 if winsz == 0|let winsz= ""|endif
764 exe "keepalt noswapfile rightb ".winsz."wincmd v"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100765" call Decho("exe keepalt noswapfile rightb ".winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200766
767 elseif a:style == 6 " Texplore
768 call s:SaveBufVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100769" call Decho("style = 6: Texplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200770 exe "keepalt tabnew ".fnameescape(curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100771" call Decho("exe keepalt tabnew ".fnameescape(curdir),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200772 call s:RestoreBufVars()
773 endif
774 call s:RestoreWinVars()
775" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100776" call Decho("case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200777 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100778 NetrwKeepj norm! 0
Bram Moolenaarff034192013-04-24 18:51:19 +0200779
780 if a:0 > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100781" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200782 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100783" call Decho("..case a:1<".a:1.">: starts with ~ and unix or cygwin",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200784 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100785" call Decho("..using dirname<".dirname."> (case: ~ && unix||cygwin)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200786 elseif a:1 == '.'
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100787" call Decho("..case a:1<".a:1.">: matches .",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200788 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
789 if dirname !~ '/$'
790 let dirname= dirname."/"
791 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100792" call Decho("..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200793 elseif a:1 =~ '\$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100794" call Decho("..case a:1<".a:1.">: matches ending $",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200795 let dirname= simplify(expand(a:1))
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100796" call Decho("..using user-specified dirname<".dirname."> with $env-var",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200797 elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://'
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100798" call Decho("..case a:1<".a:1.">: other, not pattern or filepattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200799 let dirname= simplify(a:1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100800" call Decho("..using user-specified dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200801 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100802" call Decho("..case a:1: pattern or filepattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200803 let dirname= a:1
804 endif
805 else
806 " clear explore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100807" call Decho("case a:0=".a:0.": clearing Explore list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200808 call s:NetrwClearExplore()
809" call Dret("netrw#Explore : cleared list")
810 return
811 endif
812
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100813" call Decho("dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200814 if dirname =~ '\.\./\=$'
815 let dirname= simplify(fnamemodify(dirname,':p:h'))
816 elseif dirname =~ '\.\.' || dirname == '.'
817 let dirname= simplify(fnamemodify(dirname,':p'))
818 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100819" call Decho("dirname<".dirname."> (after simplify)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200820
821 if dirname =~ '^\*//'
822 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100823" call Decho("case starpat=1: Explore *//pattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200824 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
825 let starpat= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100826" call Decho("..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200827 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
828
829 elseif dirname =~ '^\*\*//'
830 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100831" call Decho("case starpat=2: Explore **//pattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200832 let pattern= substitute(dirname,'^\*\*//','','')
833 let starpat= 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100834" call Decho("..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200835
836 elseif dirname =~ '/\*\*/'
837 " handle .../**/.../filepat
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100838" call Decho("case starpat=4: Explore .../**/.../filepat",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200839 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
840 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
841 let b:netrw_curdir = prefixdir
842 else
843 let b:netrw_curdir= getcwd().'/'.prefixdir
844 endif
845 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
846 let starpat= 4
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100847" call Decho("..pwd<".getcwd()."> dirname<".dirname.">",'~'.expand("<slnum>"))
848" call Decho("..case Explore ../**/../filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200849
850 elseif dirname =~ '^\*/'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200851 " case starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaarff034192013-04-24 18:51:19 +0200852 let starpat= 3
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100853" call Decho("case starpat=3: Explore */filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200854
855 elseif dirname=~ '^\*\*/'
856 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
857 let starpat= 4
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100858" call Decho("case starpat=4: Explore **/filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200859
860 else
861 let starpat= 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100862" call Decho("case starpat=0: default",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200863 endif
864
865 if starpat == 0 && a:indx >= 0
866 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100867" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname.">, handles Explore Hexplore Vexplore Sexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200868 if dirname == ""
869 let dirname= curfiledir
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100870" call Decho("..empty dirname, using current file's directory<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200871 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +0200872 if dirname =~# '^scp://' || dirname =~ '^ftp://'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200873 call netrw#Nread(2,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200874 else
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200875 if dirname == ""
876 let dirname= getcwd()
877 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100878 " Windows : check for a drive specifier, or else for a remote share name ('\\Foo' or '//Foo',
Bram Moolenaara6878372014-03-22 21:02:50 +0100879 " depending on whether backslashes have been converted to forward slashes by earlier code).
880 if dirname !~ '^[a-zA-Z]:' && dirname !~ '^\\\\\w\+' && dirname !~ '^//\w\+'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200881 let dirname= b:netrw_curdir."/".dirname
882 endif
883 elseif dirname !~ '^/'
884 let dirname= b:netrw_curdir."/".dirname
885 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100886" call Decho("..calling LocalBrowseCheck(dirname<".dirname.">)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200887 call netrw#LocalBrowseCheck(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100888" call Decho(" modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
889" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200890 endif
891 if exists("w:netrw_bannercnt")
892 " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
893 " If one wants to return the same place in the netrw window, use :Rex instead.
894 exe w:netrw_bannercnt
895 endif
896
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100897" call Decho("curdir<".curdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200898 " ---------------------------------------------------------------------
899 " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest
900" if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100901" NetrwKeepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaarff034192013-04-24 18:51:19 +0200902" else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100903" NetrwKeepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaarff034192013-04-24 18:51:19 +0200904" endif
905 " ---------------------------------------------------------------------
906
907 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
908 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
909 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
910 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
911 elseif a:indx <= 0
912 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100913" call Decho("case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200914 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100915" call Decho("..set up <s-up> and <s-down> maps",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200916 let s:didstarstar= 1
917 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
918 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
919 endif
920
921 if has("path_extra")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100922" call Decho("..starpat=".starpat.": has +path_extra",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200923 if !exists("w:netrw_explore_indx")
924 let w:netrw_explore_indx= 0
925 endif
926
927 let indx = a:indx
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100928" call Decho("..starpat=".starpat.": set indx= [a:indx=".indx."]",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200929
930 if indx == -1
931 " Nexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100932" call Decho("..case Nexplore with starpat=".starpat.": (indx=".indx.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200933 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100934 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200935 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100936" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100937 if @* != keepregstar | sil! let @* = keepregstar | endif
938 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +0100939 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200940 sil! let @/ = keepregslash
941" call Dret("netrw#Explore")
942 return
943 endif
944 let indx= w:netrw_explore_indx
945 if indx < 0 | let indx= 0 | endif
946 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
947 let curfile= w:netrw_explore_list[indx]
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100948" call Decho("....indx=".indx." curfile<".curfile.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200949 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
950 let indx= indx + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100951" call Decho("....indx=".indx." (Nexplore while loop)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200952 endwhile
953 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100954" call Decho("....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200955
956 elseif indx == -2
957 " Pexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100958" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200959 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100960 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200961 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +0100962" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100963 if @* != keepregstar | sil! let @* = keepregstar | endif
964 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +0100965 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200966 sil! let @/ = keepregslash
967" call Dret("netrw#Explore")
968 return
969 endif
970 let indx= w:netrw_explore_indx
971 if indx < 0 | let indx= 0 | endif
972 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
973 let curfile= w:netrw_explore_list[indx]
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100974" call Decho("....indx=".indx." curfile<".curfile.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200975 while indx >= 0 && curfile == w:netrw_explore_list[indx]
976 let indx= indx - 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100977" call Decho("....indx=".indx." (Pexplore while loop)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200978 endwhile
979 if indx < 0 | let indx= 0 | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100980" call Decho("....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200981
982 else
983 " Explore -- initialize
984 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100985" call Decho("..starpat=".starpat.": case Explore: initialize (indx=".indx.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100986 NetrwKeepj keepalt call s:NetrwClearExplore()
Bram Moolenaarff034192013-04-24 18:51:19 +0200987 let w:netrw_explore_indx= 0
988 if !exists("b:netrw_curdir")
989 let b:netrw_curdir= getcwd()
990 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100991" call Decho("....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200992
993 " switch on starpat to build the w:netrw_explore_list of files
994 if starpat == 1
995 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100996" call Decho("..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls,'~'.expand("<slnum>"))
997" call Decho("....pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200998 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100999 exe "NetrwKeepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaarff034192013-04-24 18:51:19 +02001000 catch /^Vim\%((\a\+)\)\=:E480/
1001 keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
1002" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
1003 return
1004 endtry
1005 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
1006 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1007
1008 elseif starpat == 2
1009 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001010" call Decho("..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)",'~'.expand("<slnum>"))
1011" call Decho("....pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001012 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001013 exe "sil NetrwKeepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
Bram Moolenaarff034192013-04-24 18:51:19 +02001014 catch /^Vim\%((\a\+)\)\=:E480/
1015 keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
1016 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001017 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001018" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01001019 if @* != keepregstar | sil! let @* = keepregstar | endif
1020 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001021 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001022 sil! let @/ = keepregslash
1023" call Dret("netrw#Explore : no files matched pattern")
1024 return
1025 endtry
1026 let s:netrw_curdir = b:netrw_curdir
1027 let w:netrw_explore_list = getqflist()
1028 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
1029 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1030
1031 elseif starpat == 3
1032 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001033" call Decho("..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001034 let filepat= substitute(dirname,'^\*/','','')
1035 let filepat= substitute(filepat,'^[%#<]','\\&','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001036" call Decho("....b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
1037" call Decho("....filepat<".filepat.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001038 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
1039 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
1040
1041 elseif starpat == 4
1042 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001043" call Decho("..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001044 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
1045 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
1046 endif " switch on starpat to build w:netrw_explore_list
1047
1048 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001049" call Decho("....w:netrw_explore_list<".string(w:netrw_explore_list).">",'~'.expand("<slnum>"))
1050" call Decho("....w:netrw_explore_listlen=".w:netrw_explore_listlen,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001051
1052 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001053 keepalt NetrwKeepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001054 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001055" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01001056 if @* != keepregstar | sil! let @* = keepregstar | endif
1057 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001058 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001059 sil! let @/ = keepregslash
1060" call Dret("netrw#Explore : no files matched")
1061 return
1062 endif
1063 endif " if indx ... endif
1064
1065 " NetrwStatusLine support - for exploring support
1066 let w:netrw_explore_indx= indx
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001067" call Decho("....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001068
1069 " wrap the indx around, but issue a note
1070 if indx >= w:netrw_explore_listlen || indx < 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001071" call Decho("....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001072 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
1073 let w:netrw_explore_indx= indx
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001074 keepalt NetrwKeepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaarff034192013-04-24 18:51:19 +02001075 endif
1076
1077 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001078" call Decho("....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001079 let newdir= substitute(dirfile,'/[^/]*$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001080" call Decho("....newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001081
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001082" call Decho("....calling LocalBrowseCheck(newdir<".newdir.">)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001083 call netrw#LocalBrowseCheck(newdir)
1084 if !exists("w:netrw_liststyle")
1085 let w:netrw_liststyle= g:netrw_liststyle
1086 endif
1087 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001088 keepalt NetrwKeepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaarff034192013-04-24 18:51:19 +02001089 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001090 keepalt NetrwKeepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaarff034192013-04-24 18:51:19 +02001091 endif
1092 let w:netrw_explore_mtchcnt = indx + 1
1093 let w:netrw_explore_bufnr = bufnr("%")
1094 let w:netrw_explore_line = line(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001095 keepalt NetrwKeepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001096" call Decho("....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001097
1098 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001099" call Decho("..your vim does not have +path_extra",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001100 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001101 keepalt NetrwKeepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
Bram Moolenaarff034192013-04-24 18:51:19 +02001102 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001103 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001104" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01001105 if @* != keepregstar | sil! let @* = keepregstar | endif
1106 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001107 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001108 sil! let @/ = keepregslash
1109" call Dret("netrw#Explore : missing +path_extra")
1110 return
1111 endif
1112
1113 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001114" call Decho("..default case: Explore newdir<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001115 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
1116 sil! unlet w:netrw_treedict
1117 sil! unlet w:netrw_treetop
1118 endif
1119 let newdir= dirname
1120 if !exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001121 NetrwKeepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaarff034192013-04-24 18:51:19 +02001122 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001123 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaarff034192013-04-24 18:51:19 +02001124 endif
1125 endif
1126
1127 " visual display of **/ **// */ Exploration files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001128" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"),'~'.expand("<slnum>"))
1129" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001130 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001131" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001132 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01001133 " only update match list when current directory isn't the same as before
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001134" call Decho("only update match list when current directory not the same as before",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001135 let s:explore_prvdir = b:netrw_curdir
1136 let s:explore_match = ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01001137 let dirlen = strlen(b:netrw_curdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02001138 if b:netrw_curdir !~ '/$'
1139 let dirlen= dirlen + 1
1140 endif
1141 let prvfname= ""
1142 for fname in w:netrw_explore_list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001143" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001144 if fname =~ '^'.b:netrw_curdir
1145 if s:explore_match == ""
1146 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1147 else
1148 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1149 endif
1150 elseif fname !~ '^/' && fname != prvfname
1151 if s:explore_match == ""
1152 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
1153 else
1154 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
1155 endif
1156 endif
1157 let prvfname= fname
1158 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001159" call Decho("explore_match<".s:explore_match.">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001160 if has("syntax") && exists("g:syntax_on") && g:syntax_on
1161 exe "2match netrwMarkFile /".s:explore_match."/"
1162 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001163 endif
1164 echo "<s-up>==Pexplore <s-down>==Nexplore"
1165 else
1166 2match none
1167 if exists("s:explore_match") | unlet s:explore_match | endif
1168 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
1169 echo " "
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001170" call Decho("cleared explore match list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001171 endif
1172
Bram Moolenaara6878372014-03-22 21:02:50 +01001173 " since Explore may be used to initialize netrw's browser,
1174 " there's no danger of a late FocusGained event on initialization.
1175 " Consequently, set s:netrw_events to 2.
1176 let s:netrw_events= 2
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001177 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001178" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01001179 if @* != keepregstar | sil! let @* = keepregstar | endif
1180 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001181 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001182 sil! let @/ = keepregslash
1183" call Dret("netrw#Explore : @/<".@/.">")
1184endfun
1185
1186" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01001187" netrw#Lexplore: toggle Explorer window, keeping it on the left of the current tab {{{2
Bram Moolenaar71badf92023-04-22 22:40:14 +01001188" Uses g:netrw_chgwin : specifies the window where Lexplore files are to be opened
1189" t:netrw_lexposn : winsaveview() output (used on Lexplore window)
1190" t:netrw_lexbufnr: the buffer number of the Lexplore buffer (internal to this function)
1191" s:lexplore_win : window number of Lexplore window (serves to indicate which window is a Lexplore window)
1192" w:lexplore_buf : buffer number of Lexplore window (serves to indicate which window is a Lexplore window)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001193fun! netrw#Lexplore(count,rightside,...)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001194" call Dfunc("netrw#Lexplore(count=".a:count." rightside=".a:rightside.",...) a:0=".a:0." ft=".&ft)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001195 let curwin= winnr()
1196
Bram Moolenaara6878372014-03-22 21:02:50 +01001197 if a:0 > 0 && a:1 != ""
1198 " if a netrw window is already on the left-side of the tab
1199 " and a directory has been specified, explore with that
1200 " directory.
Bram Moolenaar85850f32019-07-19 22:05:51 +02001201" call Decho("case has input argument(s) (a:1<".a:1.">)")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001202 let a1 = expand(a:1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001203" call Decho("a:1<".a:1."> curwin#".curwin,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001204 exe "1wincmd w"
1205 if &ft == "netrw"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001206" call Decho("exe Explore ".fnameescape(a:1),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001207 exe "Explore ".fnameescape(a1)
1208 exe curwin."wincmd w"
Bram Moolenaar71badf92023-04-22 22:40:14 +01001209 let s:lexplore_win= curwin
1210 let w:lexplore_buf= bufnr("%")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001211 if exists("t:netrw_lexposn")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001212" call Decho("forgetting t:netrw_lexposn",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001213 unlet t:netrw_lexposn
1214 endif
1215" call Dret("netrw#Lexplore")
1216 return
Bram Moolenaara6878372014-03-22 21:02:50 +01001217 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001218 exe curwin."wincmd w"
1219 else
1220 let a1= ""
Bram Moolenaar85850f32019-07-19 22:05:51 +02001221" call Decho("no input arguments")
Bram Moolenaara6878372014-03-22 21:02:50 +01001222 endif
1223
Bram Moolenaar8d043172014-01-23 14:24:41 +01001224 if exists("t:netrw_lexbufnr")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001225 " check if t:netrw_lexbufnr refers to a netrw window
Bram Moolenaar8d043172014-01-23 14:24:41 +01001226 let lexwinnr = bufwinnr(t:netrw_lexbufnr)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001227" call Decho("lexwinnr= bufwinnr(t:netrw_lexbufnr#".t:netrw_lexbufnr.")=".lexwinnr)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001228 else
1229 let lexwinnr= 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02001230" call Decho("t:netrw_lexbufnr doesn't exist")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001231 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001232" call Decho("lexwinnr=".lexwinnr,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001233
1234 if lexwinnr > 0
1235 " close down netrw explorer window
Bram Moolenaar85850f32019-07-19 22:05:51 +02001236" call Decho("t:netrw_lexbufnr#".t:netrw_lexbufnr.": close down netrw window",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001237 exe lexwinnr."wincmd w"
1238 let g:netrw_winsize = -winwidth(0)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001239 let t:netrw_lexposn = winsaveview()
1240" call Decho("saving posn to t:netrw_lexposn<".string(t:netrw_lexposn).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001241" call Decho("saving t:netrw_lexposn",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001242 close
1243 if lexwinnr < curwin
1244 let curwin= curwin - 1
Bram Moolenaar8d043172014-01-23 14:24:41 +01001245 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001246 if lexwinnr != curwin
1247 exe curwin."wincmd w"
1248 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01001249 unlet t:netrw_lexbufnr
Bram Moolenaar85850f32019-07-19 22:05:51 +02001250" call Decho("unlet t:netrw_lexbufnr")
Bram Moolenaar8d043172014-01-23 14:24:41 +01001251
1252 else
1253 " open netrw explorer window
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001254" call Decho("t:netrw_lexbufnr<n/a>: open netrw explorer window",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01001255 exe "1wincmd w"
1256 let keep_altv = g:netrw_altv
1257 let g:netrw_altv = 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001258 if a:count != 0
1259 let netrw_winsize = g:netrw_winsize
1260 let g:netrw_winsize = a:count
Bram Moolenaar8d043172014-01-23 14:24:41 +01001261 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001262 let curfile= expand("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001263" call Decho("curfile<".curfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001264 exe (a:rightside? "botright" : "topleft")." vertical ".((g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize) . " new"
Bram Moolenaar85850f32019-07-19 22:05:51 +02001265" call Decho("new buf#".bufnr("%")." win#".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001266 if a:0 > 0 && a1 != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001267" call Decho("case 1: Explore ".a1,'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001268 call netrw#Explore(0,0,0,a1)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001269 exe "Explore ".fnameescape(a1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001270 elseif curfile =~ '^\a\{3,}://'
1271" call Decho("case 2: Explore ".substitute(curfile,'[^/\\]*$','',''),'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001272 call netrw#Explore(0,0,0,substitute(curfile,'[^/\\]*$','',''))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001273 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001274" call Decho("case 3: Explore .",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001275 call netrw#Explore(0,0,0,".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001276 endif
1277 if a:count != 0
1278 let g:netrw_winsize = netrw_winsize
1279 endif
1280 setlocal winfixwidth
Bram Moolenaar8d043172014-01-23 14:24:41 +01001281 let g:netrw_altv = keep_altv
1282 let t:netrw_lexbufnr = bufnr("%")
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02001283 " done to prevent build-up of hidden buffers due to quitting and re-invocation of :Lexplore.
1284 " Since the intended use of :Lexplore is to have an always-present explorer window, the extra
Bram Moolenaar71badf92023-04-22 22:40:14 +01001285 " effort to prevent mis-use of :Lex is warranted.
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02001286 set bh=wipe
Bram Moolenaar85850f32019-07-19 22:05:51 +02001287" call Decho("let t:netrw_lexbufnr=".t:netrw_lexbufnr)
1288" call Decho("t:netrw_lexposn".(exists("t:netrw_lexposn")? string(t:netrw_lexposn) : " n/a"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001289 if exists("t:netrw_lexposn")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001290" call Decho("restoring to t:netrw_lexposn",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001291" call Decho("restoring posn to t:netrw_lexposn<".string(t:netrw_lexposn).">",'~'.expand("<slnum>"))
1292 call winrestview(t:netrw_lexposn)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001293 unlet t:netrw_lexposn
1294 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01001295 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001296
1297 " set up default window for editing via <cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01001298 if exists("g:netrw_chgwin") && g:netrw_chgwin == -1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001299 if a:rightside
1300 let g:netrw_chgwin= 1
1301 else
1302 let g:netrw_chgwin= 2
1303 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001304" call Decho("let g:netrw_chgwin=".g:netrw_chgwin)
Bram Moolenaara6878372014-03-22 21:02:50 +01001305 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001306
Bram Moolenaar8d043172014-01-23 14:24:41 +01001307" call Dret("netrw#Lexplore")
1308endfun
1309
1310" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01001311" netrw#Clean: remove netrw {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00001312" supports :NetrwClean -- remove netrw from first directory on runtimepath
1313" :NetrwClean! -- remove netrw from all directories on runtimepath
Bram Moolenaara6878372014-03-22 21:02:50 +01001314fun! netrw#Clean(sys)
1315" call Dfunc("netrw#Clean(sys=".a:sys.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001316
1317 if a:sys
1318 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
1319 else
1320 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
1321 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001322" call Decho("choice=".choice,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00001323 let diddel= 0
1324 let diddir= ""
1325
1326 if choice == 1
1327 for dir in split(&rtp,',')
1328 if filereadable(dir."/plugin/netrwPlugin.vim")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001329" call Decho("removing netrw-related files from ".dir,'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001330 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
1331 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
1332 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
1333 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
1334 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
1335 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 +00001336 let diddir= dir
1337 let diddel= diddel + 1
1338 if !a:sys|break|endif
1339 endif
1340 endfor
1341 endif
1342
1343 echohl WarningMsg
1344 if diddel == 0
1345 echomsg "netrw is either not installed or not removable"
1346 elseif diddel == 1
1347 echomsg "removed one copy of netrw from <".diddir.">"
1348 else
1349 echomsg "removed ".diddel." copies of netrw"
1350 endif
1351 echohl None
1352
Bram Moolenaara6878372014-03-22 21:02:50 +01001353" call Dret("netrw#Clean")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001354endfun
1355
Bram Moolenaar5c736222010-01-06 20:54:52 +01001356" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01001357" netrw#MakeTgt: make a target out of the directory name provided {{{2
1358fun! netrw#MakeTgt(dname)
1359" call Dfunc("netrw#MakeTgt(dname<".a:dname.">)")
1360 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001361 let svpos = winsaveview()
1362" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001363 let s:netrwmftgt_islocal= (a:dname !~ '^\a\{3,}://')
1364" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001365 if s:netrwmftgt_islocal
1366 let netrwmftgt= simplify(a:dname)
1367 else
1368 let netrwmftgt= a:dname
1369 endif
1370 if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
1371 " re-selected target, so just clear it
1372 unlet s:netrwmftgt s:netrwmftgt_islocal
1373 else
1374 let s:netrwmftgt= netrwmftgt
1375 endif
1376 if g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001377 call s:NetrwRefresh((b:netrw_curdir !~ '\a\{3,}://'),b:netrw_curdir)
Bram Moolenaara6878372014-03-22 21:02:50 +01001378 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001379" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))"
1380 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01001381" call Dret("netrw#MakeTgt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001382endfun
1383
Bram Moolenaara6878372014-03-22 21:02:50 +01001384" ---------------------------------------------------------------------
1385" netrw#Obtain: {{{2
1386" netrw#Obtain(islocal,fname[,tgtdirectory])
Bram Moolenaarff034192013-04-24 18:51:19 +02001387" islocal=0 obtain from remote source
1388" =1 obtain from local source
1389" fname : a filename or a list of filenames
1390" tgtdir : optional place where files are to go (not present, uses getcwd())
Bram Moolenaara6878372014-03-22 21:02:50 +01001391fun! netrw#Obtain(islocal,fname,...)
1392" call Dfunc("netrw#Obtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
Bram Moolenaarff034192013-04-24 18:51:19 +02001393 " NetrwStatusLine support - for obtaining support
1394
1395 if type(a:fname) == 1
1396 let fnamelist= [ a:fname ]
1397 elseif type(a:fname) == 3
1398 let fnamelist= a:fname
1399 else
1400 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
Bram Moolenaara6878372014-03-22 21:02:50 +01001401" call Dret("netrw#Obtain")
Bram Moolenaarff034192013-04-24 18:51:19 +02001402 return
1403 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001404" call Decho("fnamelist<".string(fnamelist).">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001405 if a:0 > 0
1406 let tgtdir= a:1
1407 else
1408 let tgtdir= getcwd()
1409 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001410" call Decho("tgtdir<".tgtdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001411
1412 if exists("b:netrw_islocal") && b:netrw_islocal
1413 " obtain a file from local b:netrw_curdir to (local) tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001414" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001415 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
1416 let topath= s:ComposePath(tgtdir,"")
1417 if (has("win32") || has("win95") || has("win64") || has("win16"))
1418 " transfer files one at time
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001419" call Decho("transfer files one at a time",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001420 for fname in fnamelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001421" call Decho("system(".g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath).")",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001422 call system(g:netrw_localcopycmd.g:netrw_localcopycmdopt." ".s:ShellEscape(fname)." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001423 if v:shell_error != 0
1424 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001425" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001426 return
1427 endif
1428 endfor
1429 else
1430 " transfer files with one command
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001431" call Decho("transfer files with one command",'~'.expand("<slnum>"))
1432 let filelist= join(map(deepcopy(fnamelist),"s:ShellEscape(v:val)"))
1433" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath).")",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001434 call system(g:netrw_localcopycmd.g:netrw_localcopycmdopt." ".filelist." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001435 if v:shell_error != 0
1436 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001437" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001438 return
1439 endif
1440 endif
1441 elseif !exists("b:netrw_curdir")
1442 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
1443 else
1444 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
1445 endif
1446
1447 else
1448 " obtain files from remote b:netrw_curdir to local tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001449" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001450 if type(a:fname) == 1
1451 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
1452 endif
1453 call s:NetrwMethod(b:netrw_curdir)
1454
1455 if b:netrw_method == 4
1456 " obtain file using scp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001457" call Decho("obtain via scp (method#4)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001458 if exists("g:netrw_port") && g:netrw_port != ""
1459 let useport= " ".g:netrw_scpport." ".g:netrw_port
1460 else
1461 let useport= ""
1462 endif
1463 if b:netrw_fname =~ '/'
1464 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
1465 else
1466 let path= ""
1467 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001468 let filelist= join(map(deepcopy(fnamelist),'escape(s:ShellEscape(g:netrw_machine.":".path.v:val,1)," ")'))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001469 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.s:ShellEscape(useport,1)." ".filelist." ".s:ShellEscape(tgtdir,1))
Bram Moolenaarff034192013-04-24 18:51:19 +02001470
1471 elseif b:netrw_method == 2
1472 " obtain file using ftp + .netrc
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001473" call Decho("obtain via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001474 call s:SaveBufVars()|sil NetrwKeepj new|call s:RestoreBufVars()
Bram Moolenaarff034192013-04-24 18:51:19 +02001475 let tmpbufnr= bufnr("%")
1476 setl ff=unix
1477 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001478 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001479" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001480 endif
1481
1482 if exists("b:netrw_fname") && b:netrw_fname != ""
1483 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001484" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001485 endif
1486
1487 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001488 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001489" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001490 endif
1491 for fname in fnamelist
1492 call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001493" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001494 endfor
1495 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001496 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
Bram Moolenaarff034192013-04-24 18:51:19 +02001497 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001498 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaarff034192013-04-24 18:51:19 +02001499 endif
1500 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1501 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1502 let debugkeep= &debug
1503 setl debug=msg
1504 call netrw#ErrorMsg(s:ERROR,getline(1),4)
1505 let &debug= debugkeep
1506 endif
1507
1508 elseif b:netrw_method == 3
1509 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001510" call Decho("obtain via ftp+mipf (method #3)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001511 call s:SaveBufVars()|sil NetrwKeepj new|call s:RestoreBufVars()
Bram Moolenaarff034192013-04-24 18:51:19 +02001512 let tmpbufnr= bufnr("%")
1513 setl ff=unix
1514
1515 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001516 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001517" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001518 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001519 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001520" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001521 endif
1522
1523 if exists("g:netrw_uid") && g:netrw_uid != ""
1524 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001525 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001526" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001527 if exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001528 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaarff034192013-04-24 18:51:19 +02001529 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001530" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001531 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001532 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001533" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001534 endif
1535 endif
1536
1537 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001538 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001539" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001540 endif
1541
1542 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001543 NetrwKeepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001544" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001545 endif
1546
1547 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001548 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001549" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001550 endif
1551
1552 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001553 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001554" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001555 endif
1556 for fname in fnamelist
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001557 NetrwKeepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaarff034192013-04-24 18:51:19 +02001558 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001559" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001560
1561 " perform ftp:
1562 " -i : turns off interactive prompting from ftp
1563 " -n unix : DON'T use <.netrc>, even though it exists
1564 " -n win32: quit being obnoxious about password
Bram Moolenaar91359012019-11-30 17:57:03 +01001565 " Note: using "_dd to delete to the black hole register; avoids messing up @@
1566 NetrwKeepj norm! 1G"_dd
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001567 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaarff034192013-04-24 18:51:19 +02001568 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1569 if getline(1) !~ "^$"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001570" call Decho("error<".getline(1).">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001571 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001572 NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarff034192013-04-24 18:51:19 +02001573 endif
1574 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02001575
1576 elseif b:netrw_method == 9
1577 " obtain file using sftp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001578" call Decho("obtain via sftp (method #9)",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02001579 if a:fname =~ '/'
1580 let localfile= substitute(a:fname,'^.*/','','')
1581 else
1582 let localfile= a:fname
1583 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001584 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1).s:ShellEscape(localfile)." ".s:ShellEscape(tgtdir))
Bram Moolenaar13600302014-05-22 18:26:40 +02001585
Bram Moolenaarff034192013-04-24 18:51:19 +02001586 elseif !exists("b:netrw_method") || b:netrw_method < 0
Bram Moolenaar13600302014-05-22 18:26:40 +02001587 " probably a badly formed url; protocol not recognized
1588" call Dret("netrw#Obtain : unsupported method")
1589 return
1590
1591 else
1592 " protocol recognized but not supported for Obtain (yet?)
1593 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001594 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"current protocol not supported for obtaining file",97)
Bram Moolenaar13600302014-05-22 18:26:40 +02001595 endif
1596" call Dret("netrw#Obtain : current protocol not supported for obtaining file")
Bram Moolenaarff034192013-04-24 18:51:19 +02001597 return
1598 endif
1599
1600 " restore status line
1601 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001602 NetrwKeepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaarff034192013-04-24 18:51:19 +02001603 endif
1604
1605 endif
1606
1607 " cleanup
1608 if exists("tmpbufnr")
1609 if bufnr("%") != tmpbufnr
1610 exe tmpbufnr."bw!"
1611 else
1612 q!
1613 endif
1614 endif
1615
Bram Moolenaara6878372014-03-22 21:02:50 +01001616" call Dret("netrw#Obtain")
1617endfun
1618
1619" ---------------------------------------------------------------------
1620" netrw#Nread: save position, call netrw#NetRead(), and restore position {{{2
1621fun! netrw#Nread(mode,fname)
1622" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001623 let svpos= winsaveview()
1624" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001625 call netrw#NetRead(a:mode,a:fname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001626" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
1627 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01001628
1629 if exists("w:netrw_liststyle") && w:netrw_liststyle != s:TREELIST
1630 if exists("w:netrw_bannercnt")
1631 " start with cursor just after the banner
1632 exe w:netrw_bannercnt
1633 endif
1634 endif
1635" call Dret("netrw#Nread")
1636endfun
1637
1638" ------------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02001639" s:NetrwOptionsSave: save options prior to setting to "netrw-buffer-standard" form {{{2
1640" Options get restored by s:NetrwOptionsRestore()
1641"
1642" Option handling:
1643" * save user's options (s:NetrwOptionsSave)
1644" * set netrw-safe options (s:NetrwOptionsSafe)
1645" - change an option only when user option != safe option (s:netrwSetSafeSetting)
1646" * restore user's options (s:netrwOPtionsRestore)
1647" - restore a user option when != safe option (s:NetrwRestoreSetting)
1648" vt: (variable type) normally its either "w:" or "s:"
1649fun! s:NetrwOptionsSave(vt)
1650" call Dfunc("s:NetrwOptionsSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma)
1651" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"),'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001652" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt." hid=".&hid,'~'.expand("<slnum>"))
1653" call Decho("(s:NetrwOptionsSave) lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001654
1655 if !exists("{a:vt}netrw_optionsave")
1656 let {a:vt}netrw_optionsave= 1
1657 else
1658" call Dret("s:NetrwOptionsSave : options already saved")
1659 return
1660 endif
1661" call Decho("prior to save: fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff,'~'.expand("<slnum>"))
1662
1663 " Save current settings and current directory
1664" call Decho("saving current settings and current directory",'~'.expand("<slnum>"))
1665 let s:yykeep = @@
1666 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
1667 let {a:vt}netrw_aikeep = &l:ai
1668 let {a:vt}netrw_awkeep = &l:aw
1669 let {a:vt}netrw_bhkeep = &l:bh
1670 let {a:vt}netrw_blkeep = &l:bl
1671 let {a:vt}netrw_btkeep = &l:bt
1672 let {a:vt}netrw_bombkeep = &l:bomb
1673 let {a:vt}netrw_cedit = &cedit
1674 let {a:vt}netrw_cikeep = &l:ci
1675 let {a:vt}netrw_cinkeep = &l:cin
1676 let {a:vt}netrw_cinokeep = &l:cino
1677 let {a:vt}netrw_comkeep = &l:com
1678 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001679 let {a:vt}netrw_cuckeep = &l:cuc
1680 let {a:vt}netrw_culkeep = &l:cul
1681" call Decho("(s:NetrwOptionsSave) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001682 let {a:vt}netrw_diffkeep = &l:diff
1683 let {a:vt}netrw_fenkeep = &l:fen
Bram Moolenaar85850f32019-07-19 22:05:51 +02001684 if !exists("g:netrw_ffkeep") || g:netrw_ffkeep
1685 let {a:vt}netrw_ffkeep = &l:ff
1686 endif
1687 let {a:vt}netrw_fokeep = &l:fo " formatoptions
1688 let {a:vt}netrw_gdkeep = &l:gd " gdefault
Bram Moolenaar71badf92023-04-22 22:40:14 +01001689 let {a:vt}netrw_gokeep = &go " guioptions
Bram Moolenaar85850f32019-07-19 22:05:51 +02001690 let {a:vt}netrw_hidkeep = &l:hidden
1691 let {a:vt}netrw_imkeep = &l:im
1692 let {a:vt}netrw_iskkeep = &l:isk
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001693 let {a:vt}netrw_lines = &lines
Bram Moolenaar85850f32019-07-19 22:05:51 +02001694 let {a:vt}netrw_lskeep = &l:ls
1695 let {a:vt}netrw_makeep = &l:ma
1696 let {a:vt}netrw_magickeep = &l:magic
1697 let {a:vt}netrw_modkeep = &l:mod
1698 let {a:vt}netrw_nukeep = &l:nu
1699 let {a:vt}netrw_rnukeep = &l:rnu
1700 let {a:vt}netrw_repkeep = &l:report
1701 let {a:vt}netrw_rokeep = &l:ro
1702 let {a:vt}netrw_selkeep = &l:sel
1703 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar85850f32019-07-19 22:05:51 +02001704 if !g:netrw_use_noswf
1705 let {a:vt}netrw_swfkeep = &l:swf
1706 endif
1707 let {a:vt}netrw_tskeep = &l:ts
1708 let {a:vt}netrw_twkeep = &l:tw " textwidth
1709 let {a:vt}netrw_wigkeep = &l:wig " wildignore
1710 let {a:vt}netrw_wrapkeep = &l:wrap
1711 let {a:vt}netrw_writekeep = &l:write
1712
1713 " save a few selected netrw-related variables
1714" call Decho("saving a few selected netrw-related variables",'~'.expand("<slnum>"))
1715 if g:netrw_keepdir
1716 let {a:vt}netrw_dirkeep = getcwd()
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001717" call Decho("saving to ".a:vt."netrw_dirkeep<".{a:vt}netrw_dirkeep.">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001718 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001719 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar85850f32019-07-19 22:05:51 +02001720 sil! let {a:vt}netrw_starkeep = @*
1721 sil! let {a:vt}netrw_pluskeep = @+
1722 endif
1723 sil! let {a:vt}netrw_slashkeep= @/
1724
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001725" call Decho("(s:NetrwOptionsSave) lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001726" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
1727" call Dret("s:NetrwOptionsSave : tab#".tabpagenr()." win#".winnr())
1728endfun
1729
1730" ---------------------------------------------------------------------
1731" s:NetrwOptionsSafe: sets options to help netrw do its job {{{2
1732" Use s:NetrwSaveOptions() to save user settings
1733" Use s:NetrwOptionsRestore() to restore user settings
1734fun! s:NetrwOptionsSafe(islocal)
1735" call Dfunc("s:NetrwOptionsSafe(islocal=".a:islocal.") win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
1736" call Decho("win#".winnr()."'s ft=".&ft,'~'.expand("<slnum>"))
1737" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
1738 if exists("+acd") | call s:NetrwSetSafeSetting("&l:acd",0)|endif
1739 call s:NetrwSetSafeSetting("&l:ai",0)
1740 call s:NetrwSetSafeSetting("&l:aw",0)
1741 call s:NetrwSetSafeSetting("&l:bl",0)
1742 call s:NetrwSetSafeSetting("&l:bomb",0)
1743 if a:islocal
1744 call s:NetrwSetSafeSetting("&l:bt","nofile")
1745 else
1746 call s:NetrwSetSafeSetting("&l:bt","acwrite")
1747 endif
1748 call s:NetrwSetSafeSetting("&l:ci",0)
1749 call s:NetrwSetSafeSetting("&l:cin",0)
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001750 if g:netrw_fastbrowse > a:islocal
1751 call s:NetrwSetSafeSetting("&l:bh","hide")
1752 else
1753 call s:NetrwSetSafeSetting("&l:bh","delete")
1754 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001755 call s:NetrwSetSafeSetting("&l:cino","")
1756 call s:NetrwSetSafeSetting("&l:com","")
1757 if &cpo =~ 'a' | call s:NetrwSetSafeSetting("&cpo",substitute(&cpo,'a','','g')) | endif
1758 if &cpo =~ 'A' | call s:NetrwSetSafeSetting("&cpo",substitute(&cpo,'A','','g')) | endif
1759 setl fo=nroql2
Bram Moolenaar71badf92023-04-22 22:40:14 +01001760 if &go =~ 'a' | set go-=a | endif
1761 if &go =~ 'A' | set go-=A | endif
1762 if &go =~ 'P' | set go-=P | endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001763 call s:NetrwSetSafeSetting("&l:hid",0)
1764 call s:NetrwSetSafeSetting("&l:im",0)
1765 setl isk+=@ isk+=* isk+=/
1766 call s:NetrwSetSafeSetting("&l:magic",1)
1767 if g:netrw_use_noswf
1768 call s:NetrwSetSafeSetting("swf",0)
1769 endif
1770 call s:NetrwSetSafeSetting("&l:report",10000)
1771 call s:NetrwSetSafeSetting("&l:sel","inclusive")
1772 call s:NetrwSetSafeSetting("&l:spell",0)
1773 call s:NetrwSetSafeSetting("&l:tw",0)
1774 call s:NetrwSetSafeSetting("&l:wig","")
1775 setl cedit&
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001776
1777 " set up cuc and cul based on g:netrw_cursor and listing style
1778 " COMBAK -- cuc cul related
1779 call s:NetrwCursor(0)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001780
1781 " allow the user to override safe options
1782" call Decho("ft<".&ft."> ei=".&ei,'~'.expand("<slnum>"))
1783 if &ft == "netrw"
1784" call Decho("do any netrw FileType autocmds (doau FileType netrw)",'~'.expand("<slnum>"))
1785 keepalt NetrwKeepj doau FileType netrw
1786 endif
1787
1788" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh." bt<".&bt.">",'~'.expand("<slnum>"))
1789" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
1790" call Dret("s:NetrwOptionsSafe")
1791endfun
1792
1793" ---------------------------------------------------------------------
1794" s:NetrwOptionsRestore: restore options (based on prior s:NetrwOptionsSave) {{{2
1795fun! s:NetrwOptionsRestore(vt)
1796" call Dfunc("s:NetrwOptionsRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001797" call Decho("(s:NetrwOptionsRestore) lines=".&lines)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001798" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001799 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001800" call Decho("case ".a:vt."netrw_optionsave : doesn't exist",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01001801 if filereadable(expand("%"))
Bram Moolenaar3c053a12022-10-16 13:11:12 +01001802" call Decho("..doing filetype detect anyway")
Bram Moolenaar71badf92023-04-22 22:40:14 +01001803 filetype detect
1804" call Decho("..settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
1805 else
1806 setl ft=netrw
Bram Moolenaar3c053a12022-10-16 13:11:12 +01001807 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001808" call Decho("..ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001809" call Dret("s:NetrwOptionsRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaara6878372014-03-22 21:02:50 +01001810 return
1811 endif
1812 unlet {a:vt}netrw_optionsave
1813
1814 if exists("+acd")
1815 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001816" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001817 let curdir = getcwd()
1818 let &l:acd = {a:vt}netrw_acdkeep
1819 unlet {a:vt}netrw_acdkeep
1820 if &l:acd
1821 call s:NetrwLcd(curdir)
1822 endif
1823 endif
1824 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001825" call Decho("(s:NetrwOptionsRestore) #1 lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001826 call s:NetrwRestoreSetting(a:vt."netrw_aikeep","&l:ai")
1827 call s:NetrwRestoreSetting(a:vt."netrw_awkeep","&l:aw")
1828 call s:NetrwRestoreSetting(a:vt."netrw_blkeep","&l:bl")
1829 call s:NetrwRestoreSetting(a:vt."netrw_btkeep","&l:bt")
1830 call s:NetrwRestoreSetting(a:vt."netrw_bombkeep","&l:bomb")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001831" call Decho("(s:NetrwOptionsRestore) #2 lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001832 call s:NetrwRestoreSetting(a:vt."netrw_cedit","&cedit")
1833 call s:NetrwRestoreSetting(a:vt."netrw_cikeep","&l:ci")
1834 call s:NetrwRestoreSetting(a:vt."netrw_cinkeep","&l:cin")
1835 call s:NetrwRestoreSetting(a:vt."netrw_cinokeep","&l:cino")
1836 call s:NetrwRestoreSetting(a:vt."netrw_comkeep","&l:com")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001837" call Decho("(s:NetrwOptionsRestore) #3 lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001838 call s:NetrwRestoreSetting(a:vt."netrw_cpokeep","&l:cpo")
1839 call s:NetrwRestoreSetting(a:vt."netrw_diffkeep","&l:diff")
1840 call s:NetrwRestoreSetting(a:vt."netrw_fenkeep","&l:fen")
1841 if exists("g:netrw_ffkeep") && g:netrw_ffkeep
1842 call s:NetrwRestoreSetting(a:vt."netrw_ffkeep")","&l:ff")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001843 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001844" call Decho("(s:NetrwOptionsRestore) #4 lines=".&lines)
1845 call s:NetrwRestoreSetting(a:vt."netrw_fokeep" ,"&l:fo")
1846 call s:NetrwRestoreSetting(a:vt."netrw_gdkeep" ,"&l:gd")
Bram Moolenaar71badf92023-04-22 22:40:14 +01001847 call s:NetrwRestoreSetting(a:vt."netrw_gokeep" ,"&go")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001848 call s:NetrwRestoreSetting(a:vt."netrw_hidkeep" ,"&l:hidden")
1849" call Decho("(s:NetrwOptionsRestore) #5 lines=".&lines)
1850 call s:NetrwRestoreSetting(a:vt."netrw_imkeep" ,"&l:im")
1851 call s:NetrwRestoreSetting(a:vt."netrw_iskkeep" ,"&l:isk")
1852" call Decho("(s:NetrwOptionsRestore) #6 lines=".&lines)
1853 call s:NetrwRestoreSetting(a:vt."netrw_lines" ,"&lines")
1854" call Decho("(s:NetrwOptionsRestore) #7 lines=".&lines)
1855 call s:NetrwRestoreSetting(a:vt."netrw_lskeep" ,"&l:ls")
1856 call s:NetrwRestoreSetting(a:vt."netrw_makeep" ,"&l:ma")
Bram Moolenaar85850f32019-07-19 22:05:51 +02001857 call s:NetrwRestoreSetting(a:vt."netrw_magickeep","&l:magic")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001858 call s:NetrwRestoreSetting(a:vt."netrw_modkeep" ,"&l:mod")
1859 call s:NetrwRestoreSetting(a:vt."netrw_nukeep" ,"&l:nu")
1860" call Decho("(s:NetrwOptionsRestore) #8 lines=".&lines)
1861 call s:NetrwRestoreSetting(a:vt."netrw_rnukeep" ,"&l:rnu")
1862 call s:NetrwRestoreSetting(a:vt."netrw_repkeep" ,"&l:report")
1863 call s:NetrwRestoreSetting(a:vt."netrw_rokeep" ,"&l:ro")
1864 call s:NetrwRestoreSetting(a:vt."netrw_selkeep" ,"&l:sel")
1865" call Decho("(s:NetrwOptionsRestore) #9 lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001866 call s:NetrwRestoreSetting(a:vt."netrw_spellkeep","&l:spell")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001867 call s:NetrwRestoreSetting(a:vt."netrw_twkeep" ,"&l:tw")
1868 call s:NetrwRestoreSetting(a:vt."netrw_wigkeep" ,"&l:wig")
1869 call s:NetrwRestoreSetting(a:vt."netrw_wrapkeep" ,"&l:wrap")
Bram Moolenaar85850f32019-07-19 22:05:51 +02001870 call s:NetrwRestoreSetting(a:vt."netrw_writekeep","&l:write")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001871" call Decho("(s:NetrwOptionsRestore) #10 lines=".&lines)
Bram Moolenaar85850f32019-07-19 22:05:51 +02001872 call s:NetrwRestoreSetting("s:yykeep","@@")
1873 " former problem: start with liststyle=0; press <i> : result, following line resets l:ts.
1874 " Fixed; in s:PerformListing, when w:netrw_liststyle is s:LONGLIST, will use a printf to pad filename with spaces
1875 " rather than by appending a tab which previously was using "&ts" to set the desired spacing. (Sep 28, 2018)
1876 call s:NetrwRestoreSetting(a:vt."netrw_tskeep","&l:ts")
1877
Bram Moolenaara6878372014-03-22 21:02:50 +01001878 if exists("{a:vt}netrw_swfkeep")
1879 if &directory == ""
1880 " user hasn't specified a swapfile directory;
1881 " netrw will temporarily set the swapfile directory
1882 " to the current directory as returned by getcwd().
1883 let &l:directory= getcwd()
1884 sil! let &l:swf = {a:vt}netrw_swfkeep
1885 setl directory=
1886 unlet {a:vt}netrw_swfkeep
1887 elseif &l:swf != {a:vt}netrw_swfkeep
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001888 if !g:netrw_use_noswf
1889 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
1890 sil! let &l:swf= {a:vt}netrw_swfkeep
1891 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001892 unlet {a:vt}netrw_swfkeep
1893 endif
1894 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001895 if exists("{a:vt}netrw_dirkeep") && isdirectory(s:NetrwFile({a:vt}netrw_dirkeep)) && g:netrw_keepdir
Bram Moolenaara6878372014-03-22 21:02:50 +01001896 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
1897 if exists("{a:vt}netrw_dirkeep")
1898 call s:NetrwLcd(dirkeep)
1899 unlet {a:vt}netrw_dirkeep
1900 endif
1901 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001902 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001903" call Decho("has clipboard",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001904 call s:NetrwRestoreSetting(a:vt."netrw_starkeep","@*")
1905 call s:NetrwRestoreSetting(a:vt."netrw_pluskeep","@+")
Bram Moolenaara6878372014-03-22 21:02:50 +01001906 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02001907 call s:NetrwRestoreSetting(a:vt."netrw_slashkeep","@/")
Bram Moolenaara6878372014-03-22 21:02:50 +01001908
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001909" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
1910" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"),'~'.expand("<slnum>"))
1911" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
1912" call Decho("diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"),'~'.expand("<slnum>"))
1913" call Decho("ts=".&l:ts,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001914 " Moved the filetype detect here from NetrwGetFile() because remote files
1915 " were having their filetype detect-generated settings overwritten by
1916 " NetrwOptionRestore.
1917 if &ft != "netrw"
Bram Moolenaar71badf92023-04-22 22:40:14 +01001918" call Decho("before: filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
1919 filetype detect
1920" call Decho("after : filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001921 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001922" call Decho("(s:NetrwOptionsRestore) lines=".&lines)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001923" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02001924" call Dret("s:NetrwOptionsRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaara6878372014-03-22 21:02:50 +01001925endfun
1926
1927" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02001928" s:NetrwSetSafeSetting: sets an option to a safe setting {{{2
1929" but only when the options' value and the safe setting differ
1930" Doing this means that netrw will not come up as having changed a
1931" setting last when it really didn't actually change it.
1932"
1933" Called from s:NetrwOptionsSafe
1934" ex. call s:NetrwSetSafeSetting("&l:sel","inclusive")
1935fun! s:NetrwSetSafeSetting(setting,safesetting)
1936" call Dfunc("s:NetrwSetSafeSetting(setting<".a:setting."> safesetting<".a:safesetting.">)")
Bram Moolenaara6878372014-03-22 21:02:50 +01001937
Bram Moolenaar85850f32019-07-19 22:05:51 +02001938 if a:setting =~ '^&'
1939" call Decho("fyi: a:setting starts with &")
1940 exe "let settingval= ".a:setting
1941" call Decho("fyi: settingval<".settingval.">")
Bram Moolenaara6878372014-03-22 21:02:50 +01001942
Bram Moolenaar85850f32019-07-19 22:05:51 +02001943 if settingval != a:safesetting
1944" call Decho("set setting<".a:setting."> to option value<".a:safesetting.">")
1945 if type(a:safesetting) == 0
1946 exe "let ".a:setting."=".a:safesetting
1947 elseif type(a:safesetting) == 1
1948 exe "let ".a:setting."= '".a:safesetting."'"
1949 else
1950 call netrw#ErrorMsg(s:ERROR,"(s:NetrwRestoreSetting) doesn't know how to restore ".a:setting." with a safesetting of type#".type(a:safesetting),105)
1951 endif
1952 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02001953 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001954
Bram Moolenaar85850f32019-07-19 22:05:51 +02001955" call Dret("s:NetrwSetSafeSetting")
Bram Moolenaara6878372014-03-22 21:02:50 +01001956endfun
1957
1958" ------------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02001959" s:NetrwRestoreSetting: restores specified setting using associated keepvar, {{{2
1960" but only if the setting value differs from the associated keepvar.
1961" Doing this means that netrw will not come up as having changed a
1962" setting last when it really didn't actually change it.
1963"
1964" Used by s:NetrwOptionsRestore() to restore each netrw-senstive setting
1965" keepvars are set up by s:NetrwOptionsSave
1966fun! s:NetrwRestoreSetting(keepvar,setting)
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001967""" call Dfunc("s:NetrwRestoreSetting(a:keepvar<".a:keepvar."> a:setting<".a:setting.">)")
Bram Moolenaara6878372014-03-22 21:02:50 +01001968
Bram Moolenaar85850f32019-07-19 22:05:51 +02001969 " typically called from s:NetrwOptionsRestore
1970 " call s:NetrwRestoreSettings(keep-option-variable-name,'associated-option')
1971 " ex. call s:NetrwRestoreSetting(a:vt."netrw_selkeep","&l:sel")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02001972 " Restores option (but only if different) from a:keepvar
Bram Moolenaar85850f32019-07-19 22:05:51 +02001973 if exists(a:keepvar)
1974 exe "let keepvarval= ".a:keepvar
1975 exe "let setting= ".a:setting
1976
1977"" call Decho("fyi: a:keepvar<".a:keepvar."> exists")
1978"" call Decho("fyi: keepvarval=".keepvarval)
1979"" call Decho("fyi: a:setting<".a:setting."> setting<".setting.">")
1980
1981 if setting != keepvarval
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01001982"" call Decho("restore setting<".a:setting."> (currently=".setting.") to keepvarval<".keepvarval.">")
Bram Moolenaar85850f32019-07-19 22:05:51 +02001983 if type(a:setting) == 0
1984 exe "let ".a:setting."= ".keepvarval
1985 elseif type(a:setting) == 1
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02001986 exe "let ".a:setting."= '".substitute(keepvarval,"'","''","g")."'"
Bram Moolenaar85850f32019-07-19 22:05:51 +02001987 else
1988 call netrw#ErrorMsg(s:ERROR,"(s:NetrwRestoreSetting) doesn't know how to restore ".a:keepvar." with a setting of type#".type(a:setting),105)
1989 endif
1990 endif
1991
1992 exe "unlet ".a:keepvar
Bram Moolenaara6878372014-03-22 21:02:50 +01001993 endif
1994
Bram Moolenaar85850f32019-07-19 22:05:51 +02001995"" call Dret("s:NetrwRestoreSetting")
Bram Moolenaarff034192013-04-24 18:51:19 +02001996endfun
1997
1998" ---------------------------------------------------------------------
1999" NetrwStatusLine: {{{2
2000fun! NetrwStatusLine()
2001
2002" vvv NetrwStatusLine() debugging vvv
2003" let g:stlmsg=""
2004" if !exists("w:netrw_explore_bufnr")
2005" let g:stlmsg="!X<explore_bufnr>"
2006" elseif w:netrw_explore_bufnr != bufnr("%")
2007" let g:stlmsg="explore_bufnr!=".bufnr("%")
2008" endif
2009" if !exists("w:netrw_explore_line")
2010" let g:stlmsg=" !X<explore_line>"
2011" elseif w:netrw_explore_line != line(".")
2012" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
2013" endif
2014" if !exists("w:netrw_explore_list")
2015" let g:stlmsg=" !X<explore_list>"
2016" endif
2017" ^^^ NetrwStatusLine() debugging ^^^
2018
2019 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")
2020 " restore user's status line
2021 let &stl = s:netrw_users_stl
2022 let &laststatus = s:netrw_users_ls
2023 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
2024 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
2025 return ""
2026 else
2027 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
2028 endif
2029endfun
2030
Bram Moolenaar85850f32019-07-19 22:05:51 +02002031" ===============================
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002032" Netrw Transfer Functions: {{{1
2033" ===============================
2034
Bram Moolenaar071d4272004-06-13 20:20:40 +00002035" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002036" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002037" mode: =0 read remote file and insert before current line
2038" =1 read remote file and insert after current line
2039" =2 replace with remote file
2040" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002041fun! netrw#NetRead(mode,...)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02002042" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw.((a:0 > 0)? " a:1<".a:1.">" : ""))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002043
Bram Moolenaar5c736222010-01-06 20:54:52 +01002044 " NetRead: save options {{{3
Bram Moolenaar85850f32019-07-19 22:05:51 +02002045 call s:NetrwOptionsSave("w:")
2046 call s:NetrwOptionsSafe(0)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002047 call s:RestoreCursorline()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002048 " NetrwSafeOptions sets a buffer up for a netrw listing, which includes buflisting off.
2049 " However, this setting is not wanted for a remote editing session. The buffer should be "nofile", still.
2050 setl bl
Bram Moolenaar85850f32019-07-19 22:05:51 +02002051" call Decho("buf#".bufnr("%")."<".bufname("%")."> bl=".&bl." bt=".&bt." bh=".&bh,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002052
Bram Moolenaar5c736222010-01-06 20:54:52 +01002053 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002054 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002055 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002056 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002057 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002058 elseif a:mode == 2 " replace with remote file
2059 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002060 elseif a:mode == 3 " skip read of file (leave as temporary)
2061 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002062 else
2063 exe a:mode
2064 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002065 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002066 let ichoice = (a:0 == 0)? 0 : 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002067" call Decho("readcmd<".readcmd."> ichoice=".ichoice,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002068
Bram Moolenaar5c736222010-01-06 20:54:52 +01002069 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00002070 let tmpfile= s:GetTempfile("")
2071 if tmpfile == ""
2072" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002073 return
2074 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002075
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002076 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002077
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002078 " attempt to repeat with previous host-file-etc
2079 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002080" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002081 let choice = b:netrw_lastfile
2082 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002083
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002084 else
2085 exe "let choice= a:" . ichoice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002086" call Decho("no lastfile: choice<" . choice . ">",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002087
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002088 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002089 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002090 echomsg 'NetRead Usage:'
2091 echomsg ':Nread machine:path uses rcp'
2092 echomsg ':Nread "machine path" uses ftp with <.netrc>'
2093 echomsg ':Nread "machine id password path" uses ftp'
2094 echomsg ':Nread dav://machine[:port]/path uses cadaver'
2095 echomsg ':Nread fetch://machine/path uses fetch'
2096 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
2097 echomsg ':Nread http://[user@]machine/path uses http wget'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002098 echomsg ':Nread file:///path uses elinks'
Bram Moolenaara6878372014-03-22 21:02:50 +01002099 echomsg ':Nread https://[user@]machine/path uses http wget'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002100 echomsg ':Nread rcp://[user@]machine/path uses rcp'
2101 echomsg ':Nread rsync://machine[:port]/path uses rsync'
2102 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
2103 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002104 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002105 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002106
Bram Moolenaar9964e462007-05-05 17:54:07 +00002107 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002108 " Reconstruct Choice if choice starts with '"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002109" call Decho("reconstructing choice",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002110 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002111 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +02002112 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002113 else
2114 " case "... ... ..."
2115 let choice = strpart(choice,1,strlen(choice)-1)
2116 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002117
Bram Moolenaar9964e462007-05-05 17:54:07 +00002118 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002119 let wholechoice = wholechoice . " " . choice
2120 let ichoice = ichoice + 1
2121 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002122 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002123 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002124 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002125" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002126 return
2127 endif
2128 let choice= a:{ichoice}
2129 endwhile
2130 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2131 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002132 endif
2133 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002134
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002135" call Decho("choice<" . choice . ">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002136 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002137
Bram Moolenaar5c736222010-01-06 20:54:52 +01002138 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00002139 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002140 if !exists("b:netrw_method") || b:netrw_method < 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02002141" call Dret("netrw#NetRead : unsupported method")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002142 return
2143 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002144 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002145
Bram Moolenaar8d043172014-01-23 14:24:41 +01002146 " Check whether or not NetrwBrowse() should be handling this request
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002147" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02002148 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002149" call Decho("yes, choice matches '^.*[\/]$'",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002150 NetrwKeepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002151" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002152 return
Bram Moolenaar071d4272004-06-13 20:20:40 +00002153 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002154
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002155 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +01002156 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002157 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002158 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2159 echo "(netrw) Processing your read request..."
2160 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002161
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002162 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002163 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002164 if b:netrw_method == 1 " read with rcp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002165" call Decho("read via rcp (method #1)",'~'.expand("<slnum>"))
Bram Moolenaard68071d2006-05-02 22:08:30 +00002166 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002167 " ER: on Win2K" rcp machine[.user]:file tmpfile
Bram Moolenaar8d043172014-01-23 14:24:41 +01002168 " ER: when machine contains '.' adding .user is required (use $USERNAME)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002169 " ER: the tmpfile is full path: rcp sees C:\... as host C
2170 if s:netrw_has_nt_rcp == 1
2171 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2172 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2173 else
2174 " Any way needed it machine contains a '.'
2175 let uid_machine = g:netrw_machine .'.'. $USERNAME
2176 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002177 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002178 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2179 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2180 else
2181 let uid_machine = g:netrw_machine
2182 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002183 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002184 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".s:ShellEscape(uid_machine.":".b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00002185 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002186 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002187
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002188 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002189 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002190 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002191" call Decho("read via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
Bram Moolenaar8dff8182006-04-06 20:18:50 +00002192 let netrw_fname= b:netrw_fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002193 NetrwKeepj call s:SaveBufVars()|new|NetrwKeepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002194 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002195 setl ff=unix
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002196 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002197" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002198 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002199 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002200" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002201 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002202 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002203" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002204 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002205 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002206 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002207 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002208 endif
2209 " 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 +00002210 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +00002211 let debugkeep = &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02002212 setl debug=msg
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002213 NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +00002214 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002215 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +00002216 call s:SaveBufVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002217 keepj bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01002218 if bufname("%") == "" && getline("$") == "" && line('$') == 1
2219 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +00002220 q!
2221 endif
2222 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002223 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002224 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002225
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002226 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002227 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002228 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
2229 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002230" call Decho("read via ftp+mipf (method #3)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002231 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002232 NetrwKeepj call s:SaveBufVars()|new|NetrwKeepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002233 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002234 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002235 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002236 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002237" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002238 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002239 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002240" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002241 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002242
Bram Moolenaar97d62492012-11-15 21:28:22 +01002243 if exists("g:netrw_uid") && g:netrw_uid != ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002244 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002245 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002246" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002247 if exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002248 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002249 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002250" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002251 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002252 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002253" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002254 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002255 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002256
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002257 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002258 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002259" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002260 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002261 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002262 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002263" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002264 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002265 NetrwKeepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002266" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002267
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002268 " perform ftp:
2269 " -i : turns off interactive prompting from ftp
2270 " -n unix : DON'T use <.netrc>, even though it exists
2271 " -n win32: quit being obnoxious about password
Bram Moolenaar91359012019-11-30 17:57:03 +01002272 NetrwKeepj norm! 1G"_dd
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002273 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002274 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2275 if getline(1) !~ "^$"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002276" call Decho("error<".getline(1).">",'~'.expand("<slnum>"))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002277 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002278 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002279 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002280 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002281 call s:SaveBufVars()|keepj bd!|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002282 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002283 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002284
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002285 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002286 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002287 elseif b:netrw_method == 4 " read with scp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002288" call Decho("read via scp (method #4)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002289 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00002290 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002291 else
2292 let useport= ""
2293 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002294 " 'C' in 'C:\path\to\file' is handled as hostname on windows.
2295 " This is workaround to avoid mis-handle windows local-path:
2296 if g:netrw_scp_cmd =~ '^scp' && (has("win32") || has("win95") || has("win64") || has("win16"))
2297 let tmpfile_get = substitute(tr(tmpfile, '\', '/'), '^\(\a\):[/\\]\(.*\)$', '/\1/\2', '')
2298 else
2299 let tmpfile_get = tmpfile
2300 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02002301 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".escape(s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1),' ')." ".s:ShellEscape(tmpfile_get,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00002302 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002303 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002304
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002305 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002306 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002307 elseif b:netrw_method == 5
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002308" call Decho("read via http (method #5)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002309 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002310 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002311 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002312 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002313" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002314 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002315 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002316
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002317 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
2318 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002319" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)",'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002320 if exists("g:netrw_http_xcmd")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002321 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_cmd." ".s:ShellEscape(b:netrw_http."://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".s:ShellEscape(tmpfile,1))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002322 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002323 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(b:netrw_http."://".g:netrw_machine.b:netrw_fname,1))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002324 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002325 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002326
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002327 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002328 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002329" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002330 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
2331 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002332" call Decho("netrw_html<".netrw_html.">",'~'.expand("<slnum>"))
2333" call Decho("netrw_tag <".netrw_tag.">",'~'.expand("<slnum>"))
2334 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(b:netrw_http."://".g:netrw_machine.netrw_html,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00002335 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002336" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002337 exe 'NetrwKeepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002338 endif
2339 let b:netrw_lastfile = choice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002340" call Decho("setl ro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02002341 setl ro nomod
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002342
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002343 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002344 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002345 elseif b:netrw_method == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002346" call Decho("read via cadaver (method #6)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002347
Bram Moolenaar5c736222010-01-06 20:54:52 +01002348 if !executable(g:netrw_dav_cmd)
2349 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
2350" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
2351 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002352 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002353 if g:netrw_dav_cmd =~ "curl"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002354 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_dav_cmd." ".s:ShellEscape("dav://".g:netrw_machine.b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002355 else
2356 " Construct execution string (four lines) which will be passed through filter
2357 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
2358 new
Bram Moolenaarff034192013-04-24 18:51:19 +02002359 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002360 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002361 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01002362 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002363 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01002364 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002365 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002366 NetrwKeepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002367 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002368 NetrwKeepj put ='get '.netrw_fname.' '.tmpfile
2369 NetrwKeepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002370
Bram Moolenaar5c736222010-01-06 20:54:52 +01002371 " perform cadaver operation:
Bram Moolenaar91359012019-11-30 17:57:03 +01002372 NetrwKeepj norm! 1G"_dd
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002373 call s:NetrwExe(s:netrw_silentxfer."%!".g:netrw_dav_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002374 keepj bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01002375 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002376 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002377 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002378
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002379 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002380 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002381 elseif b:netrw_method == 7
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002382" call Decho("read via rsync (method #7)",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02002383 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".s:ShellEscape(g:netrw_machine.g:netrw_rsync_sep.b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00002384 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002385 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002386
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002387 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002388 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002389 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002390 elseif b:netrw_method == 8
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002391" call Decho("read via fetch (method #8)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002392 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002393 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002394 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002395 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002396" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002397 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002398 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01002399 if exists("g:netrw_option") && g:netrw_option =~ ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002400 let netrw_option= "http"
2401 else
2402 let netrw_option= "ftp"
2403 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002404" call Decho("read via fetch for ".netrw_option,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002405
Bram Moolenaar446cb832008-06-24 21:56:24 +00002406 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002407 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002408 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002409 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002410 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002411
Bram Moolenaar446cb832008-06-24 21:56:24 +00002412 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002413 let b:netrw_lastfile = choice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002414" call Decho("setl ro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02002415 setl ro nomod
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002416
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002417 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002418 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002419 elseif b:netrw_method == 9
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002420" call Decho("read via sftp (method #9)",'~'.expand("<slnum>"))
2421 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002422 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002423 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002424
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002425 ".........................................
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002426 " NetRead: (file) NetRead Method #10 {{{3
2427 elseif b:netrw_method == 10 && exists("g:netrw_file_cmd")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002428" " call Decho("read via ".b:netrw_file_cmd." (method #10)",'~'.expand("<slnum>"))
2429 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_file_cmd." ".s:ShellEscape(b:netrw_fname,1)." ".tmpfile)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002430 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
2431 let b:netrw_lastfile = choice
2432
2433 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002434 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002435 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002436 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002437 endif
2438 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002439
Bram Moolenaar5c736222010-01-06 20:54:52 +01002440 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002441 if exists("b:netrw_method")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002442" call Decho("cleanup b:netrw_method and b:netrw_fname",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002443 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002444 unlet b:netrw_fname
2445 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002446 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002447" call Decho("cleanup by deleting tmpfile<".tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002448 NetrwKeepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002449 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02002450 NetrwKeepj call s:NetrwOptionsRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002451
Bram Moolenaar9964e462007-05-05 17:54:07 +00002452" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002453endfun
2454
2455" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002456" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002457fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00002458" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002459
Bram Moolenaar5c736222010-01-06 20:54:52 +01002460 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002461 let mod= 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02002462 call s:NetrwOptionsSave("w:")
2463 call s:NetrwOptionsSafe(0)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002464
Bram Moolenaar5c736222010-01-06 20:54:52 +01002465 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00002466 let tmpfile= s:GetTempfile("")
2467 if tmpfile == ""
2468" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002469 return
2470 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002471
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002472 if a:0 == 0
2473 let ichoice = 0
2474 else
2475 let ichoice = 1
2476 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002477
Bram Moolenaar9964e462007-05-05 17:54:07 +00002478 let curbufname= expand("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002479" call Decho("curbufname<".curbufname.">",'~'.expand("<slnum>"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002480 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00002481 " For binary writes, always write entire file.
2482 " (line numbers don't really make sense for that).
2483 " Also supports the writing of tar and zip files.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002484" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002485 exe "sil NetrwKeepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002486 elseif g:netrw_cygwin
2487 " write (selected portion of) file to temporary
Bram Moolenaar8d043172014-01-23 14:24:41 +01002488 let cygtmpfile= substitute(tmpfile,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002489" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002490 exe "sil NetrwKeepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002491 else
2492 " write (selected portion of) file to temporary
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002493" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002494 exe "sil NetrwKeepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002495 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002496
Bram Moolenaar9964e462007-05-05 17:54:07 +00002497 if curbufname == ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01002498 " when the file is [No Name], and one attempts to Nwrite it, the buffer takes
Bram Moolenaar9964e462007-05-05 17:54:07 +00002499 " on the temporary file's name. Deletion of the temporary file during
2500 " cleanup then causes an error message.
2501 0file!
2502 endif
2503
Bram Moolenaar5c736222010-01-06 20:54:52 +01002504 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002505 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002506
Bram Moolenaar9964e462007-05-05 17:54:07 +00002507 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002508 " attempt to repeat with previous host-file-etc
2509 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002510" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002511 let choice = b:netrw_lastfile
2512 let ichoice= ichoice + 1
2513 else
2514 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002515
Bram Moolenaar8d043172014-01-23 14:24:41 +01002516 " Reconstruct Choice when choice starts with '"'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002517 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002518 echomsg 'NetWrite Usage:"'
2519 echomsg ':Nwrite machine:path uses rcp'
2520 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
2521 echomsg ':Nwrite "machine id password path" uses ftp'
2522 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
2523 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
2524 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
2525 echomsg ':Nwrite rcp://machine/path uses rcp'
2526 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
2527 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
2528 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002529 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002530 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002531
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002532 elseif match(choice,"^\"") != -1
2533 if match(choice,"\"$") != -1
2534 " case "..."
2535 let choice=strpart(choice,1,strlen(choice)-2)
2536 else
2537 " case "... ... ..."
2538 let choice = strpart(choice,1,strlen(choice)-1)
2539 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002540
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002541 while match(choice,"\"$") == -1
2542 let wholechoice= wholechoice . " " . choice
2543 let ichoice = ichoice + 1
2544 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002545 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002546 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002547 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002548" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002549 return
2550 endif
2551 let choice= a:{ichoice}
2552 endwhile
2553 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2554 endif
2555 endif
2556 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002557 let ichoice= ichoice + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002558" call Decho("choice<" . choice . "> ichoice=".ichoice,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002559
Bram Moolenaar9964e462007-05-05 17:54:07 +00002560 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002561 NetrwKeepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002562 if !exists("b:netrw_method") || b:netrw_method < 0
2563" call Dfunc("netrw#NetWrite : unsupported method")
2564 return
2565 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002566
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002567 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01002568 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002569 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002570 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2571 echo "(netrw) Processing your write request..."
Bram Moolenaar85850f32019-07-19 22:05:51 +02002572" call Decho("Processing your write request...",'~'.expand("<slnum>"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002573 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002574
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002575 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002576 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002577 if b:netrw_method == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002578" call Decho("write via rcp (method #1)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002579 if s:netrw_has_nt_rcp == 1
2580 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2581 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2582 else
2583 let uid_machine = g:netrw_machine .'.'. $USERNAME
2584 endif
2585 else
2586 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2587 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2588 else
2589 let uid_machine = g:netrw_machine
2590 endif
2591 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002592 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(uid_machine.":".b:netrw_fname,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002593 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002594
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002595 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002596 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002597 elseif b:netrw_method == 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002598" call Decho("write via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002599 let netrw_fname = b:netrw_fname
2600
2601 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2602 let bhkeep = &l:bh
2603 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002604 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002605 keepj keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002606
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002607" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02002608 setl ff=unix
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002609 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002610" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002611 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002612 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002613" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002614 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002615 NetrwKeepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002616" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002617 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002618 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002619 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002620" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
2621 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002622 endif
2623 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2624 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002625 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002626 NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002627 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002628 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002629 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002630
2631 " remove enew buffer (quietly)
2632 let filtbuf= bufnr("%")
2633 exe curbuf."b!"
2634 let &l:bh = bhkeep
2635 exe filtbuf."bw!"
2636
Bram Moolenaar071d4272004-06-13 20:20:40 +00002637 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002638
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002639 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002640 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002641 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002642 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002643" call Decho("read via ftp+mipf (method #3)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002644 let netrw_fname = b:netrw_fname
2645 let bhkeep = &l:bh
2646
2647 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2648 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002649 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002650 keepj keepalt enew
Bram Moolenaarff034192013-04-24 18:51:19 +02002651 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002652
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002653 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002654 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002655" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002656 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002657 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002658" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002659 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002660 if exists("g:netrw_uid") && g:netrw_uid != ""
2661 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002662 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002663" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002664 if exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002665 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002666 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002667" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002668 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002669 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002670" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002671 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002672 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002673 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002674" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002675 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002676 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002677" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002678 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002679 NetrwKeepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002680" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002681 " save choice/id/password for future use
2682 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002683
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002684 " perform ftp:
2685 " -i : turns off interactive prompting from ftp
2686 " -n unix : DON'T use <.netrc>, even though it exists
2687 " -n win32: quit being obnoxious about password
Bram Moolenaar91359012019-11-30 17:57:03 +01002688 NetrwKeepj norm! 1G"_dd
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002689 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002690 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2691 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002692 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002693 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002694 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002695 let mod=1
2696 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002697
2698 " remove enew buffer (quietly)
2699 let filtbuf= bufnr("%")
2700 exe curbuf."b!"
2701 let &l:bh= bhkeep
2702 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002703
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002704 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002705 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002706 elseif b:netrw_method == 4
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002707" call Decho("write via scp (method #4)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002708 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00002709 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002710 else
2711 let useport= ""
2712 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002713 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002714 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002715
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002716 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002717 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002718 elseif b:netrw_method == 5
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002719" call Decho("write via http (method #5)",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002720 let curl= substitute(g:netrw_http_put_cmd,'\s\+.*$',"","")
2721 if executable(curl)
2722 let url= g:netrw_choice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002723 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_put_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(url,1) )
Bram Moolenaar8d043172014-01-23 14:24:41 +01002724 elseif !exists("g:netrw_quiet")
Bram Moolenaar85850f32019-07-19 22:05:51 +02002725 call netrw#ErrorMsg(s:ERROR,"can't write to http using <".g:netrw_http_put_cmd.">".",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002726 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002727
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002728 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002729 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002730 elseif b:netrw_method == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002731" call Decho("write via cadaver (method #6)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002732
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002733 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01002734 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
2735 let bhkeep = &l:bh
2736
2737 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2738 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002739 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002740 keepj keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002741
Bram Moolenaarff034192013-04-24 18:51:19 +02002742 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002743 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002744 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002745 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002746 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002747 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002748 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002749 NetrwKeepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00002750 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002751 NetrwKeepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002752
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002753 " perform cadaver operation:
Bram Moolenaar91359012019-11-30 17:57:03 +01002754 NetrwKeepj norm! 1G"_dd
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002755 call s:NetrwExe(s:netrw_silentxfer."%!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002756
2757 " remove enew buffer (quietly)
2758 let filtbuf= bufnr("%")
2759 exe curbuf."b!"
2760 let &l:bh = bhkeep
2761 exe filtbuf."bw!"
2762
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002763 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002764
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002765 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002766 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002767 elseif b:netrw_method == 7
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002768" call Decho("write via rsync (method #7)",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02002769 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.g:netrw_rsync_sep.b:netrw_fname,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002770 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002771
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002772 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002773 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002774 elseif b:netrw_method == 9
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002775" call Decho("write via sftp (method #9)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002776 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002777 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2778 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2779 else
2780 let uid_machine = g:netrw_machine
2781 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002782
2783 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2784 let bhkeep = &l:bh
2785 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002786 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002787 keepj keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002788
Bram Moolenaarff034192013-04-24 18:51:19 +02002789 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002790 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002791" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01002792 let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002793 call s:NetrwExe(s:netrw_silentxfer."%!".sftpcmd.' '.s:ShellEscape(uid_machine,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002794 let filtbuf= bufnr("%")
2795 exe curbuf."b!"
2796 let &l:bh = bhkeep
2797 exe filtbuf."bw!"
2798 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002799
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002800 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002801 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002802 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002803 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002804 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002805 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002806 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002807
Bram Moolenaar5c736222010-01-06 20:54:52 +01002808 " NetWrite: Cleanup: {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002809" call Decho("cleanup",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002810 if s:FileReadable(tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002811" call Decho("tmpfile<".tmpfile."> readable, will now delete it",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002812 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002813 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02002814 call s:NetrwOptionsRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002815
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002816 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002817 " restore modifiability; usually equivalent to set nomod
2818 let &mod= mod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002819" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002820 elseif !exists("leavemod")
2821 " indicate that the buffer has not been modified since last written
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002822" call Decho("set nomod",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01002823 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002824" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002825 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002826
Bram Moolenaar9964e462007-05-05 17:54:07 +00002827" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002828endfun
2829
2830" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002831" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002832" uses NetRead to get a copy of the file into a temporarily file,
2833" then sources that file,
2834" then removes that file.
2835fun! netrw#NetSource(...)
2836" call Dfunc("netrw#NetSource() a:0=".a:0)
2837 if a:0 > 0 && a:1 == '?'
2838 " give help
2839 echomsg 'NetSource Usage:'
2840 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
2841 echomsg ':Nsource fetch://machine/path uses fetch'
2842 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02002843 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002844 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
2845 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
2846 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
2847 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
2848 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002849 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002850 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002851 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002852 call netrw#NetRead(3,a:{i})
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002853" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002854 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002855" call Decho("exe so ".fnameescape(s:netrw_tmpfile),'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002856 exe "so ".fnameescape(s:netrw_tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002857" call Decho("delete(".s:netrw_tmpfile.")",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01002858 if delete(s:netrw_tmpfile)
2859 call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".s:netrw_tmpfile.">!",103)
2860 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002861 unlet s:netrw_tmpfile
2862 else
2863 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
2864 endif
2865 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002866 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00002867 endif
2868" call Dret("netrw#NetSource")
2869endfun
2870
Bram Moolenaar8d043172014-01-23 14:24:41 +01002871" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01002872" netrw#SetTreetop: resets the tree top to the current directory/specified directory {{{2
2873" (implements the :Ntree command)
Bram Moolenaar85850f32019-07-19 22:05:51 +02002874fun! netrw#SetTreetop(iscmd,...)
2875" call Dfunc("netrw#SetTreetop(iscmd=".a:iscmd." ".((a:0 > 0)? a:1 : "").") a:0=".a:0)
2876" call Decho("w:netrw_treetop<".w:netrw_treetop.">")
Bram Moolenaara6878372014-03-22 21:02:50 +01002877
Bram Moolenaar85850f32019-07-19 22:05:51 +02002878 " iscmd==0: netrw#SetTreetop called using gn mapping
2879 " iscmd==1: netrw#SetTreetop called using :Ntree from the command line
2880" call Decho("(iscmd=".a:iscmd.": called using :Ntree from command line",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002881 " clear out the current tree
2882 if exists("w:netrw_treetop")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002883" call Decho("clearing out current tree",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002884 let inittreetop= w:netrw_treetop
2885 unlet w:netrw_treetop
2886 endif
2887 if exists("w:netrw_treedict")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002888" call Decho("freeing w:netrw_treedict",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002889 unlet w:netrw_treedict
2890 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02002891" call Decho("inittreetop<".(exists("inittreetop")? inittreetop : "n/a").">")
Bram Moolenaara6878372014-03-22 21:02:50 +01002892
Bram Moolenaar85850f32019-07-19 22:05:51 +02002893 if (a:iscmd == 0 || a:1 == "") && exists("inittreetop")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02002894 let treedir = s:NetrwTreePath(inittreetop)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002895" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002896 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002897 if isdirectory(s:NetrwFile(a:1))
2898" call Decho("a:1<".a:1."> is a directory",'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02002899 let treedir = a:1
2900 let s:netrw_treetop = treedir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002901 elseif exists("b:netrw_curdir") && (isdirectory(s:NetrwFile(b:netrw_curdir."/".a:1)) || a:1 =~ '^\a\{3,}://')
Bram Moolenaar89a9c152021-08-29 21:55:35 +02002902 let treedir = b:netrw_curdir."/".a:1
2903 let s:netrw_treetop = treedir
Bram Moolenaar85850f32019-07-19 22:05:51 +02002904" call Decho("a:1<".a:1."> is NOT a directory, using treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002905 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002906 " normally the cursor is left in the message window.
2907 " However, here this results in the directory being listed in the message window, which is not wanted.
2908 let netrwbuf= bufnr("%")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002909 call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002910 exe bufwinnr(netrwbuf)."wincmd w"
Bram Moolenaar89a9c152021-08-29 21:55:35 +02002911 let treedir = "."
2912 let s:netrw_treetop = getcwd()
Bram Moolenaar8d043172014-01-23 14:24:41 +01002913 endif
2914 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002915" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02002916
2917 " determine if treedir is remote or local
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002918 let islocal= expand("%") !~ '^\a\{3,}://'
2919" call Decho("islocal=".islocal,'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02002920
2921 " browse the resulting directory
Bram Moolenaara6878372014-03-22 21:02:50 +01002922 if islocal
2923 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(islocal,treedir))
2924 else
2925 call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,treedir))
2926 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02002927
Bram Moolenaara6878372014-03-22 21:02:50 +01002928" call Dret("netrw#SetTreetop")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002929endfun
2930
Bram Moolenaar9964e462007-05-05 17:54:07 +00002931" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00002932" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002933" readcmd == %r : replace buffer with newly read file
2934" == 0r : read file at top of buffer
2935" == r : read file after current line
2936" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002937fun! s:NetrwGetFile(readcmd, tfile, method)
2938" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002939
2940 " readcmd=='t': simply do nothing
2941 if a:readcmd == 't'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002942" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01002943" call Dret("NetrwGetFile : skip read of tfile<".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002944 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002945 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002946
Bram Moolenaar9964e462007-05-05 17:54:07 +00002947 " get name of remote filename (ie. url and all)
2948 let rfile= bufname("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002949" call Decho("rfile<".rfile.">",'~'.expand("<slnum>"))
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002950
Bram Moolenaar9964e462007-05-05 17:54:07 +00002951 if exists("*NetReadFixup")
2952 " for the use of NetReadFixup (not otherwise used internally)
2953 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002954 endif
2955
Bram Moolenaar9964e462007-05-05 17:54:07 +00002956 if a:readcmd[0] == '%'
2957 " get file into buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002958" call Decho("get file into buffer",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002959
2960 " rename the current buffer to the temp file (ie. tfile)
2961 if g:netrw_cygwin
Bram Moolenaar8d043172014-01-23 14:24:41 +01002962 let tfile= substitute(a:tfile,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00002963 else
2964 let tfile= a:tfile
2965 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02002966 call s:NetrwBufRename(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002967
2968 " edit temporary file (ie. read the temporary file in)
2969 if rfile =~ '\.zip$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002970" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002971 call zip#Browse(tfile)
2972 elseif rfile =~ '\.tar$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002973" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002974 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002975 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002976" call Decho("handling remote gzip-compressed tar file",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002977 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002978 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002979" call Decho("handling remote bz2-compressed tar file",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002980 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002981 elseif rfile =~ '\.tar\.xz$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002982" call Decho("handling remote xz-compressed tar file",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002983 call tar#Browse(tfile)
2984 elseif rfile =~ '\.txz$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002985" call Decho("handling remote xz-compressed tar file (.txz)",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002986 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002987 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002988" call Decho("edit temporary file",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002989 NetrwKeepj e!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002990 endif
2991
2992 " rename buffer back to remote filename
Bram Moolenaar85850f32019-07-19 22:05:51 +02002993 call s:NetrwBufRename(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002994
Bram Moolenaar71badf92023-04-22 22:40:14 +01002995 " Jan 19, 2022: COMBAK -- bram problem with https://github.com/vim/vim/pull/9554.diff filetype
Bram Moolenaar97d62492012-11-15 21:28:22 +01002996 " Detect filetype of local version of remote file.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002997 " Note that isk must not include a "/" for scripts.vim
2998 " to process this detection correctly.
Bram Moolenaar71badf92023-04-22 22:40:14 +01002999" call Decho("detect filetype of local version of remote file<".rfile.">",'~'.expand("<slnum>"))
3000" call Decho("..did_filetype()=".did_filetype())
Christian Brabandtd8b86c92023-09-17 18:52:56 +02003001" setl ft=
Bram Moolenaar71badf92023-04-22 22:40:14 +01003002" call Decho("..initial filetype<".&ft."> for buf#".bufnr()."<".bufname().">")
3003 let iskkeep= &isk
Bram Moolenaar97d62492012-11-15 21:28:22 +01003004 setl isk-=/
Bram Moolenaar71badf92023-04-22 22:40:14 +01003005 filetype detect
3006" call Decho("..local filetype<".&ft."> for buf#".bufnr()."<".bufname().">")
3007 let &isk= iskkeep
Bram Moolenaar85850f32019-07-19 22:05:51 +02003008" call Dredir("ls!","NetrwGetFile (renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003009 let line1 = 1
3010 let line2 = line("$")
3011
Bram Moolenaar8d043172014-01-23 14:24:41 +01003012 elseif !&ma
3013 " attempting to read a file after the current line in the file, but the buffer is not modifiable
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003014 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"attempt to read<".a:tfile."> into a non-modifiable buffer!",94)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003015" call Dret("NetrwGetFile : attempt to read<".a:tfile."> into a non-modifiable buffer!")
Bram Moolenaar8d043172014-01-23 14:24:41 +01003016 return
3017
Bram Moolenaar9964e462007-05-05 17:54:07 +00003018 elseif s:FileReadable(a:tfile)
3019 " read file after current line
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003020" call Decho("read file<".a:tfile."> after current line",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003021 let curline = line(".")
3022 let lastline= line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003023" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003024 exe "NetrwKeepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003025 let line1= curline + 1
3026 let line2= line("$") - lastline + 1
3027
3028 else
3029 " not readable
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003030" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
3031" call Decho("tfile<".a:tfile."> not readable",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003032 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003033" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003034 return
3035 endif
3036
3037 " User-provided (ie. optional) fix-it-up command
3038 if exists("*NetReadFixup")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003039" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003040 NetrwKeepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003041" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003042" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003043 endif
3044
Bram Moolenaaradc21822011-04-01 18:03:16 +02003045 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00003046 " update the Buffers menu
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003047 NetrwKeepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003048 endif
3049
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003050" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003051
3052 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00003053" redraw!
3054
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003055" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003056" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003057endfun
3058
Bram Moolenaar9964e462007-05-05 17:54:07 +00003059" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003060" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003061" Input:
3062" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
3063" Output:
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003064" b:netrw_method= 1: rcp
3065" 2: ftp + <.netrc>
3066" 3: ftp + machine, id, password, and [path]filename
3067" 4: scp
3068" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003069" 6: dav
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003070" 7: rsync
3071" 8: fetch
3072" 9: sftp
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003073" 10: file
Bram Moolenaar5c736222010-01-06 20:54:52 +01003074" g:netrw_machine= hostname
3075" b:netrw_fname = filename
3076" g:netrw_port = optional port number (for ftp)
3077" g:netrw_choice = copy of input url (choice)
3078fun! s:NetrwMethod(choice)
Bram Moolenaar85850f32019-07-19 22:05:51 +02003079" call Dfunc("s:NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003080
Bram Moolenaar251e1912011-06-19 05:09:16 +02003081 " sanity check: choice should have at least three slashes in it
3082 if strlen(substitute(a:choice,'[^/]','','g')) < 3
3083 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
3084 let b:netrw_method = -1
Bram Moolenaar85850f32019-07-19 22:05:51 +02003085" call Dret("s:NetrwMethod : incorrect url format<".a:choice.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003086 return
3087 endif
3088
Bram Moolenaar5c736222010-01-06 20:54:52 +01003089 " record current g:netrw_machine, if any
3090 " curmachine used if protocol == ftp and no .netrc
3091 if exists("g:netrw_machine")
3092 let curmachine= g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003093" call Decho("curmachine<".curmachine.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003094 else
3095 let curmachine= "N O T A HOST"
3096 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003097 if exists("g:netrw_port")
3098 let netrw_port= g:netrw_port
3099 endif
3100
3101 " insure that netrw_ftp_cmd starts off every method determination
3102 " with the current g:netrw_ftp_cmd
3103 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01003104
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003105 " initialization
3106 let b:netrw_method = 0
3107 let g:netrw_machine = ""
3108 let b:netrw_fname = ""
3109 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003110 let g:netrw_choice = a:choice
3111
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003112 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003113 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00003114 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
3115 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003116 " rcpurm : rcp://[user@]host/filename Use rcp
3117 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003118 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02003119 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01003120 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003121 " rsyncurm : rsync://host[:port]/path Use rsync
3122 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3123 " sftpurm : sftp://[user@]host/filename Use scp
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003124 " fileurm : file://[user@]host/filename Use elinks or links
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003125 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3126 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02003127 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
3128 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003129 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003130 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02003131 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003132 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003133 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02003134 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003135 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003136 let fileurm = '^file\=://\(.*\)$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003137
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003138" call Decho("determine method:",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003139 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02003140 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003141 if match(a:choice,rcpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003142" call Decho("rcp://...",'~'.expand("<slnum>"))
Bram Moolenaar83bab712005-08-01 21:58:57 +00003143 let b:netrw_method = 1
3144 let userid = substitute(a:choice,rcpurm,'\1',"")
3145 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3146 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003147 if userid != ""
3148 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003149 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003150
Bram Moolenaaradc21822011-04-01 18:03:16 +02003151 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003152 elseif match(a:choice,scpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003153" call Decho("scp://...",'~'.expand("<slnum>"))
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003154 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003155 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3156 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3157 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003158
Bram Moolenaar15146672011-10-20 22:22:38 +02003159 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003160 elseif match(a:choice,httpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003161" call Decho("http[s]://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003162 let b:netrw_method = 5
3163 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3164 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaara6878372014-03-22 21:02:50 +01003165 let b:netrw_http = (a:choice =~ '^https:')? "https" : "http"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003166
Bram Moolenaaradc21822011-04-01 18:03:16 +02003167 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003168 elseif match(a:choice,davurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003169" call Decho("dav://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003170 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02003171 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003172 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3173 else
3174 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3175 endif
3176 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003177
Bram Moolenaaradc21822011-04-01 18:03:16 +02003178 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003179 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003180" call Decho("rsync://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003181 let b:netrw_method = 7
3182 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3183 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003184
Bram Moolenaaradc21822011-04-01 18:03:16 +02003185 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003186 elseif match(a:choice,ftpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003187" call Decho("ftp://...",'~'.expand("<slnum>"))
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003188 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003189 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3190 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3191 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003192" call Decho("g:netrw_machine<".g:netrw_machine.">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003193 if userid != ""
3194 let g:netrw_uid= userid
3195 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003196
Bram Moolenaaradc21822011-04-01 18:03:16 +02003197 if curmachine != g:netrw_machine
Bram Moolenaar85850f32019-07-19 22:05:51 +02003198 if exists("s:netrw_hup[".g:netrw_machine."]")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003199 call NetUserPass("ftp:".g:netrw_machine)
3200 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003201 " if there's a change in hostname, require password re-entry
3202 unlet s:netrw_passwd
3203 endif
3204 if exists("netrw_port")
3205 unlet netrw_port
3206 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003207 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003208
Bram Moolenaar446cb832008-06-24 21:56:24 +00003209 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003210 let b:netrw_method = 3
3211 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003212 let host= substitute(g:netrw_machine,'\..*$','','')
3213 if exists("s:netrw_hup[host]")
3214 call NetUserPass("ftp:".host)
3215
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02003216 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~# '-[sS]:'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003217" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
3218" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02003219 if g:netrw_ftp_cmd =~# '-[sS]:\S*MACHINE\>'
Bram Moolenaare6ae6222013-05-21 21:01:10 +02003220 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',g:netrw_machine,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003221" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003222 endif
3223 let b:netrw_method= 2
3224 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003225" call Decho("using <".expand("$HOME/.netrc")."> (readable)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003226 let b:netrw_method= 2
3227 else
3228 if !exists("g:netrw_uid") || g:netrw_uid == ""
3229 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003230 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003231 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003232 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003233 endif
3234 let b:netrw_method= 3
3235 endif
3236 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003237
Bram Moolenaaradc21822011-04-01 18:03:16 +02003238 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003239 elseif match(a:choice,fetchurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003240" call Decho("fetch://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003241 let b:netrw_method = 8
3242 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3243 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3244 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3245 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003246
Bram Moolenaaradc21822011-04-01 18:03:16 +02003247 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003248 elseif match(a:choice,mipf) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003249" call Decho("(ftp) host id pass file",'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00003250 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003251 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3252 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003253 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003254 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003255 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003256
Bram Moolenaaradc21822011-04-01 18:03:16 +02003257 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003258 elseif match(a:choice,mf) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003259" call Decho("(ftp) host file",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003260 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003261 let b:netrw_method = 3
3262 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3263 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003264
Bram Moolenaar9964e462007-05-05 17:54:07 +00003265 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003266 let b:netrw_method = 2
3267 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3268 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3269 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003270
Bram Moolenaaradc21822011-04-01 18:03:16 +02003271 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003272 elseif match(a:choice,sftpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003273" call Decho("sftp://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003274 let b:netrw_method = 9
3275 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3276 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003277
Bram Moolenaaradc21822011-04-01 18:03:16 +02003278 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003279 elseif match(a:choice,rcphf) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003280" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003281 let b:netrw_method = 1
3282 let userid = substitute(a:choice,rcphf,'\2',"")
3283 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
3284 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003285" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">",'~'.expand("<slnum>"))
3286" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">",'~'.expand("<slnum>"))
3287" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">",'~'.expand("<slnum>"))
3288" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003289 if userid != ""
3290 let g:netrw_uid= userid
3291 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003292
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003293 " Method#10: file://user@hostname/...path-to-file {{{3
3294 elseif match(a:choice,fileurm) == 0 && exists("g:netrw_file_cmd")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003295" call Decho("http[s]://...",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003296 let b:netrw_method = 10
3297 let b:netrw_fname = substitute(a:choice,fileurm,'\1',"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003298" call Decho('\1<'.substitute(a:choice,fileurm,'\1',"").">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003299
Bram Moolenaaradc21822011-04-01 18:03:16 +02003300 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003301 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003302 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003303 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003304 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003305 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003306 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003307 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00003308
Bram Moolenaar81695252004-12-29 20:58:21 +00003309 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02003310 " remove any leading [:#] from port number
3311 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3312 elseif exists("netrw_port")
3313 " retain port number as implicit for subsequent ftp operations
3314 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00003315 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003316
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003317" call Decho("a:choice <".a:choice.">",'~'.expand("<slnum>"))
3318" call Decho("b:netrw_method <".b:netrw_method.">",'~'.expand("<slnum>"))
3319" call Decho("g:netrw_machine<".g:netrw_machine.">",'~'.expand("<slnum>"))
3320" call Decho("g:netrw_port <".g:netrw_port.">",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003321" if exists("g:netrw_uid") "Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003322" call Decho("g:netrw_uid <".g:netrw_uid.">",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003323" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00003324" if exists("s:netrw_passwd") "Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003325" call Decho("s:netrw_passwd <".s:netrw_passwd.">",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003326" endif "Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003327" call Decho("b:netrw_fname <".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02003328" call Dret("s:NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00003329endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003330
3331" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003332" NetReadFixup: this sort of function is typically written by the user {{{2
3333" to handle extra junk that their system's ftp dumps
3334" into the transfer. This function is provided as an
3335" example and as a fix for a Windows 95 problem: in my
3336" experience, win95's ftp always dumped four blank lines
3337" at the end of the transfer.
3338if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
3339 fun! NetReadFixup(method, line1, line2)
3340" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003341
3342 " sanity checks -- attempt to convert inputs to integers
3343 let method = a:method + 0
3344 let line1 = a:line1 + 0
3345 let line2 = a:line2 + 0
3346 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
3347" call Dret("NetReadFixup")
3348 return
3349 endif
3350
Bram Moolenaar9964e462007-05-05 17:54:07 +00003351 if method == 3 " ftp (no <.netrc>)
3352 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003353 if fourblanklines >= line1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003354 exe "sil NetrwKeepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003355 call histdel("/",-1)
3356 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003357 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003358
Bram Moolenaar9964e462007-05-05 17:54:07 +00003359" call Dret("NetReadFixup")
3360 endfun
3361endif
3362
3363" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003364" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003365" Usage: :call NetUserPass() -- will prompt for userid and password
3366" :call NetUserPass("uid") -- will prompt for password
3367" :call NetUserPass("uid","password") -- sets global userid and password
3368" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
3369" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00003370fun! NetUserPass(...)
3371
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003372" call Dfunc("NetUserPass() a:0=".a:0)
3373
3374 if !exists('s:netrw_hup')
3375 let s:netrw_hup= {}
3376 endif
3377
Bram Moolenaar071d4272004-06-13 20:20:40 +00003378 if a:0 == 0
Bram Moolenaar97d62492012-11-15 21:28:22 +01003379 " case: no input arguments
3380
3381 " change host and username if not previously entered; get new password
3382 if !exists("g:netrw_machine")
3383 let g:netrw_machine= input('Enter hostname: ')
3384 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003385 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01003386 " get username (user-id) via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00003387 let g:netrw_uid= input('Enter username: ')
3388 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003389 " get password via prompting
Bram Moolenaar446cb832008-06-24 21:56:24 +00003390 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003391
3392 " set up hup database
3393 let host = substitute(g:netrw_machine,'\..*$','','')
3394 if !exists('s:netrw_hup[host]')
3395 let s:netrw_hup[host]= {}
3396 endif
3397 let s:netrw_hup[host].uid = g:netrw_uid
3398 let s:netrw_hup[host].passwd = s:netrw_passwd
3399
3400 elseif a:0 == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01003401 " case: one input argument
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003402
3403 if a:1 =~ '^ftp:'
Bram Moolenaar97d62492012-11-15 21:28:22 +01003404 " get host from ftp:... url
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003405 " access userid and password from hup (host-user-passwd) dictionary
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003406" call Decho("case a:0=1: a:1<".a:1."> (get host from ftp:... url)",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003407 let host = substitute(a:1,'^ftp:','','')
3408 let host = substitute(host,'\..*','','')
3409 if exists("s:netrw_hup[host]")
3410 let g:netrw_uid = s:netrw_hup[host].uid
3411 let s:netrw_passwd = s:netrw_hup[host].passwd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003412" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">",'~'.expand("<slnum>"))
3413" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003414 else
3415 let g:netrw_uid = input("Enter UserId: ")
3416 let s:netrw_passwd = inputsecret("Enter Password: ")
3417 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003418
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003419 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01003420 " case: one input argument, not an url. Using it as a new user-id.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003421" call Decho("case a:0=1: a:1<".a:1."> (get host from input argument, not an url)",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003422 if exists("g:netrw_machine")
Bram Moolenaara6878372014-03-22 21:02:50 +01003423 if g:netrw_machine =~ '[0-9.]\+'
3424 let host= g:netrw_machine
3425 else
3426 let host= substitute(g:netrw_machine,'\..*$','','')
3427 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003428 else
3429 let g:netrw_machine= input('Enter hostname: ')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003430 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003431 let g:netrw_uid = a:1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003432" call Decho("set g:netrw_uid= <".g:netrw_uid.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01003433 if exists("g:netrw_passwd")
3434 " ask for password if one not previously entered
3435 let s:netrw_passwd= g:netrw_passwd
3436 else
3437 let s:netrw_passwd = inputsecret("Enter Password: ")
3438 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003439 endif
3440
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003441" call Decho("host<".host.">",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003442 if exists("host")
3443 if !exists('s:netrw_hup[host]')
3444 let s:netrw_hup[host]= {}
3445 endif
3446 let s:netrw_hup[host].uid = g:netrw_uid
3447 let s:netrw_hup[host].passwd = s:netrw_passwd
3448 endif
3449
3450 elseif a:0 == 2
3451 let g:netrw_uid = a:1
3452 let s:netrw_passwd = a:2
3453
3454 elseif a:0 == 3
3455 " enter hostname, user-id, and password into the hup dictionary
3456 let host = substitute(a:1,'^\a\+:','','')
3457 let host = substitute(host,'\..*$','','')
3458 if !exists('s:netrw_hup[host]')
3459 let s:netrw_hup[host]= {}
3460 endif
3461 let s:netrw_hup[host].uid = a:2
3462 let s:netrw_hup[host].passwd = a:3
3463 let g:netrw_uid = s:netrw_hup[host].uid
3464 let s:netrw_passwd = s:netrw_hup[host].passwd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003465" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">",'~'.expand("<slnum>"))
3466" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">",'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00003467 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003468
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003469" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003470endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003471
Bram Moolenaar85850f32019-07-19 22:05:51 +02003472" =================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00003473" Shared Browsing Support: {{{1
Bram Moolenaar85850f32019-07-19 22:05:51 +02003474" =================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00003475
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003476" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003477" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
3478fun! s:ExplorePatHls(pattern)
3479" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
3480 let repat= substitute(a:pattern,'^**/\{1,2}','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003481" call Decho("repat<".repat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003482 let repat= escape(repat,'][.\')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003483" call Decho("repat<".repat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003484 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
3485" call Dret("s:ExplorePatHls repat<".repat.">")
3486 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00003487endfun
3488
3489" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003490" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003491" 0: (user: <mb>) bookmark current directory
3492" 1: (user: <gb>) change to the bookmarked directory
3493" 2: (user: <qb>) list bookmarks
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003494" 3: (browsing) records current directory history
3495" 4: (user: <u>) go up (previous) directory, using history
3496" 5: (user: <U>) go down (next) directory, using history
Bram Moolenaar446cb832008-06-24 21:56:24 +00003497" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01003498fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar85850f32019-07-19 22:05:51 +02003499" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhistcnt." histmax=".g:netrw_dirhistmax)
Bram Moolenaarff034192013-04-24 18:51:19 +02003500 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3501" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
3502 return
3503 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003504
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003505 let ykeep = @@
3506 let curbufnr = bufnr("%")
3507
Bram Moolenaar9964e462007-05-05 17:54:07 +00003508 if a:chg == 0
3509 " bookmark the current directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003510" call Decho("(user: <b>) bookmark the current directory",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003511 if exists("s:netrwmarkfilelist_{curbufnr}")
3512 call s:NetrwBookmark(0)
3513 echo "bookmarked marked files"
3514 else
3515 call s:MakeBookmark(a:curdir)
3516 echo "bookmarked the current directory"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003517 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003518
KSR-Yasudaf4498252023-10-06 03:34:17 +09003519 try
3520 call s:NetrwBookHistSave()
3521 catch
3522 endtry
3523
Bram Moolenaar9964e462007-05-05 17:54:07 +00003524 elseif a:chg == 1
3525 " change to the bookmarked directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003526" call Decho("(user: <".v:count."gb>) change to the bookmarked directory",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003527 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003528" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003529 exe "NetrwKeepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00003530 else
3531 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3532 endif
3533
3534 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003535" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00003536 let didwork= 0
3537 " list user's bookmarks
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003538" call Decho("(user: <q>) list user's bookmarks",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003539 if exists("g:netrw_bookmarklist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003540" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003541 let cnt= 1
3542 for bmd in g:netrw_bookmarklist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003543" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1],'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02003544 echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
Bram Moolenaar5c736222010-01-06 20:54:52 +01003545 let didwork = 1
3546 let cnt = cnt + 1
3547 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00003548 endif
3549
3550 " list directory history
Bram Moolenaar85850f32019-07-19 22:05:51 +02003551 " Note: history is saved only when PerformListing is done;
3552 " ie. when netrw can re-use a netrw buffer, the current directory is not saved in the history.
3553 let cnt = g:netrw_dirhistcnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00003554 let first = 1
3555 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003556 if g:netrw_dirhistmax > 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003557 while ( first || cnt != g:netrw_dirhistcnt )
3558" call Decho("first=".first." cnt=".cnt." dirhistcnt=".g:netrw_dirhistcnt,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003559 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003560" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt},'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02003561 echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003562 let didwork= 1
3563 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003564 let histcnt = histcnt + 1
3565 let first = 0
3566 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003567 if cnt < 0
3568 let cnt= cnt + g:netrw_dirhistmax
3569 endif
3570 endwhile
3571 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02003572 let g:netrw_dirhistcnt= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003573 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003574 if didwork
3575 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3576 endif
3577
3578 elseif a:chg == 3
3579 " saves most recently visited directories (when they differ)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003580" call Decho("(browsing) record curdir history",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02003581 if !exists("g:netrw_dirhistcnt") || !exists("g:netrw_dirhist_{g:netrw_dirhistcnt}") || g:netrw_dirhist_{g:netrw_dirhistcnt} != a:curdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003582 if g:netrw_dirhistmax > 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003583 let g:netrw_dirhistcnt = ( g:netrw_dirhistcnt + 1 ) % g:netrw_dirhistmax
3584 let g:netrw_dirhist_{g:netrw_dirhistcnt} = a:curdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003585 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003586" call Decho("save dirhist#".g:netrw_dirhistcnt."<".g:netrw_dirhist_{g:netrw_dirhistcnt}.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003587 endif
3588
3589 elseif a:chg == 4
3590 " u: change to the previous directory stored on the history list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003591" call Decho("(user: <u>) chg to prev dir from history",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003592 if g:netrw_dirhistmax > 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003593 let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt - v:count1 ) % g:netrw_dirhistmax
3594 if g:netrw_dirhistcnt < 0
3595 let g:netrw_dirhistcnt= g:netrw_dirhistcnt + g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003596 endif
3597 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02003598 let g:netrw_dirhistcnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003599 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003600 if exists("g:netrw_dirhist_{g:netrw_dirhistcnt}")
3601" call Decho("changedir u#".g:netrw_dirhistcnt."<".g:netrw_dirhist_{g:netrw_dirhistcnt}.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003602 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003603 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003604" call Decho("setl ma noro",'~'.expand("<slnum>"))
3605 sil! NetrwKeepj %d _
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003606 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003607" call Decho("setl nomod",'~'.expand("<slnum>"))
3608" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003609 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003610" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt}),'~'.expand("<slnum>"))
3611 exe "NetrwKeepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00003612 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003613 if g:netrw_dirhistmax > 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003614 let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt + v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003615 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02003616 let g:netrw_dirhistcnt= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003617 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003618 echo "Sorry, no predecessor directory exists yet"
3619 endif
3620
3621 elseif a:chg == 5
3622 " U: change to the subsequent directory stored on the history list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003623" call Decho("(user: <U>) chg to next dir from history",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003624 if g:netrw_dirhistmax > 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003625 let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt + 1 ) % g:netrw_dirhistmax
3626 if exists("g:netrw_dirhist_{g:netrw_dirhistcnt}")
3627" call Decho("changedir U#".g:netrw_dirhistcnt."<".g:netrw_dirhist_{g:netrw_dirhistcnt}.">",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003628 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003629" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003630 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003631 sil! NetrwKeepj %d _
3632" call Decho("removed all lines from buffer (%d)",'~'.expand("<slnum>"))
3633" call Decho("setl nomod",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003634 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003635" call Decho("(set nomod) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003636 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003637" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt}),'~'.expand("<slnum>"))
3638 exe "NetrwKeepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003639 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02003640 let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt - 1 ) % g:netrw_dirhistmax
3641 if g:netrw_dirhistcnt < 0
3642 let g:netrw_dirhistcnt= g:netrw_dirhistcnt + g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003643 endif
3644 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003645 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003646 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02003647 let g:netrw_dirhistcnt= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003648 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003649 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003650
3651 elseif a:chg == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003652" call Decho("(user: <mB>) delete bookmark'd directory",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003653 if exists("s:netrwmarkfilelist_{curbufnr}")
3654 call s:NetrwBookmark(1)
3655 echo "removed marked files from bookmarks"
3656 else
3657 " delete the v:count'th bookmark
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003658 let iremove = v:count
3659 let dremove = g:netrw_bookmarklist[iremove - 1]
3660" call Decho("delete bookmark#".iremove."<".g:netrw_bookmarklist[iremove - 1].">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003661 call s:MergeBookmarks()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003662" call Decho("remove g:netrw_bookmarklist[".(iremove-1)."]<".g:netrw_bookmarklist[(iremove-1)].">",'~'.expand("<slnum>"))
3663 NetrwKeepj call remove(g:netrw_bookmarklist,iremove-1)
3664 echo "removed ".dremove." from g:netrw_bookmarklist"
3665" call Decho("g:netrw_bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003666 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003667" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
KSR-Yasudaf4498252023-10-06 03:34:17 +09003668
3669 try
3670 call s:NetrwBookHistSave()
3671 catch
3672 endtry
Bram Moolenaar9964e462007-05-05 17:54:07 +00003673 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003674 call s:NetrwBookmarkMenu()
Bram Moolenaarff034192013-04-24 18:51:19 +02003675 call s:NetrwTgtMenu()
Bram Moolenaar97d62492012-11-15 21:28:22 +01003676 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003677" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003678endfun
3679
3680" ---------------------------------------------------------------------
3681" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003682" Will source the history file (.netrwhist) only if the g:netrw_disthistmax is > 0.
Bram Moolenaar5c736222010-01-06 20:54:52 +01003683" Sister function: s:NetrwBookHistSave()
3684fun! s:NetrwBookHistRead()
3685" call Dfunc("s:NetrwBookHistRead()")
Bram Moolenaarff034192013-04-24 18:51:19 +02003686 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003687" call Dret("s:NetrwBookHistRead - nothing read (suppressed due to dirhistmax=".(exists("g:netrw_dirhistmax")? g:netrw_dirhistmax : "n/a").")")
Bram Moolenaarff034192013-04-24 18:51:19 +02003688 return
3689 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003690 let ykeep= @@
Bram Moolenaar85850f32019-07-19 22:05:51 +02003691
3692 " read bookmarks
Bram Moolenaar5c736222010-01-06 20:54:52 +01003693 if !exists("s:netrw_initbookhist")
3694 let home = s:NetrwHome()
3695 let savefile= home."/.netrwbook"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003696 if filereadable(s:NetrwFile(savefile))
3697" call Decho("sourcing .netrwbook",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003698 exe "keepalt NetrwKeepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003699 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003700
3701 " read history
Bram Moolenaaradc21822011-04-01 18:03:16 +02003702 if g:netrw_dirhistmax > 0
3703 let savefile= home."/.netrwhist"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003704 if filereadable(s:NetrwFile(savefile))
3705" call Decho("sourcing .netrwhist",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003706 exe "keepalt NetrwKeepj so ".savefile
Bram Moolenaaradc21822011-04-01 18:03:16 +02003707 endif
3708 let s:netrw_initbookhist= 1
3709 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003710 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003711 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003712
Bram Moolenaar97d62492012-11-15 21:28:22 +01003713 let @@= ykeep
Bram Moolenaar85850f32019-07-19 22:05:51 +02003714" call Decho("dirhistmax=".(exists("g:netrw_dirhistmax")? g:netrw_dirhistmax : "n/a"),'~'.expand("<slnum>"))
3715" call Decho("dirhistcnt=".(exists("g:netrw_dirhistcnt")? g:netrw_dirhistcnt : "n/a"),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003716" call Dret("s:NetrwBookHistRead")
3717endfun
3718
3719" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02003720" s:NetrwBookHistSave: this function saves bookmarks and history to files {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003721" Sister function: s:NetrwBookHistRead()
3722" I used to do this via viminfo but that appears to
3723" be unreliable for long-term storage
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003724" If g:netrw_dirhistmax is <= 0, no history or bookmarks
3725" will be saved.
Bram Moolenaar85850f32019-07-19 22:05:51 +02003726" (s:NetrwBookHistHandler(3,...) used to record history)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003727fun! s:NetrwBookHistSave()
Bram Moolenaar85850f32019-07-19 22:05:51 +02003728" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax." dirhistcnt=".g:netrw_dirhistcnt)
Bram Moolenaarff034192013-04-24 18:51:19 +02003729 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02003730" call Dret("s:NetrwBookHistSave : nothing saved (dirhistmax=".g:netrw_dirhistmax.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003731 return
3732 endif
3733
Bram Moolenaar5c736222010-01-06 20:54:52 +01003734 let savefile= s:NetrwHome()."/.netrwhist"
Bram Moolenaar85850f32019-07-19 22:05:51 +02003735" call Decho("savefile<".savefile.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003736 1split
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02003737
3738 " setting up a new buffer which will become .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01003739 call s:NetrwEnew()
Bram Moolenaar85850f32019-07-19 22:05:51 +02003740" call Decho("case g:netrw_use_noswf=".g:netrw_use_noswf.(exists("+acd")? " +acd" : " -acd"),'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003741 if g:netrw_use_noswf
3742 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
3743 else
3744 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000
3745 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003746 setl nocin noai noci magic nospell nohid wig= noaw
3747 setl ma noro write
3748 if exists("+acd") | setl noacd | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003749 sil! NetrwKeepj keepalt %d _
Bram Moolenaar5c736222010-01-06 20:54:52 +01003750
Bram Moolenaar85850f32019-07-19 22:05:51 +02003751 " rename enew'd file: .netrwhist -- no attempt to merge
3752 " record dirhistmax and current dirhistcnt
3753 " save history
3754" call Decho("saving history: dirhistmax=".g:netrw_dirhistmax." dirhistcnt=".g:netrw_dirhistcnt." lastline=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02003755 sil! keepalt file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01003756 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
Bram Moolenaar85850f32019-07-19 22:05:51 +02003757 call setline(2,"let g:netrw_dirhistcnt =".g:netrw_dirhistcnt)
3758 if g:netrw_dirhistmax > 0
3759 let lastline = line("$")
3760 let cnt = g:netrw_dirhistcnt
3761 let first = 1
3762 while ( first || cnt != g:netrw_dirhistcnt )
3763 let lastline= lastline + 1
3764 if exists("g:netrw_dirhist_{cnt}")
3765 call setline(lastline,'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
3766" call Decho("..".lastline.'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'",'~'.expand("<slnum>"))
3767 endif
3768 let first = 0
3769 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3770 if cnt < 0
3771 let cnt= cnt + g:netrw_dirhistmax
3772 endif
3773 endwhile
3774 exe "sil! w! ".savefile
3775" call Decho("exe sil! w! ".savefile,'~'.expand("<slnum>"))
3776 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003777
Bram Moolenaar85850f32019-07-19 22:05:51 +02003778 " save bookmarks
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003779 sil NetrwKeepj %d _
Bram Moolenaar5c736222010-01-06 20:54:52 +01003780 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
Bram Moolenaar85850f32019-07-19 22:05:51 +02003781" call Decho("saving bookmarks",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003782 " merge and write .netrwbook
3783 let savefile= s:NetrwHome()."/.netrwbook"
3784
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003785 if filereadable(s:NetrwFile(savefile))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003786 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003787 exe "sil NetrwKeepj keepalt so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003788 for bdm in booklist
3789 if index(g:netrw_bookmarklist,bdm) == -1
3790 call add(g:netrw_bookmarklist,bdm)
3791 endif
3792 endfor
3793 call sort(g:netrw_bookmarklist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003794 endif
3795
3796 " construct and save .netrwbook
3797 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003798 exe "sil! w! ".savefile
Bram Moolenaar85850f32019-07-19 22:05:51 +02003799" call Decho("exe sil! w! ".savefile,'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003800 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02003801
3802 " cleanup -- remove buffer used to construct history
Bram Moolenaar5c736222010-01-06 20:54:52 +01003803 let bgone= bufnr("%")
3804 q!
Bram Moolenaarff034192013-04-24 18:51:19 +02003805 exe "keepalt ".bgone."bwipe!"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003806
3807" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003808endfun
3809
3810" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003811" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
3812" list of the contents of a local or remote directory. It is assumed that the
3813" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
3814" with the requested remote hostname first.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003815" Often called via: Explore/e dirname/etc -> netrw#LocalBrowseCheck() -> s:NetrwBrowse()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003816fun! s:NetrwBrowse(islocal,dirname)
3817 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003818" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
Bram Moolenaar85850f32019-07-19 22:05:51 +02003819" call Decho("fyi: modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
3820" call Decho("fyi: tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
3821" call Dredir("ls!","s:NetrwBrowse")
Bram Moolenaara6878372014-03-22 21:02:50 +01003822
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003823 " save alternate-file's filename if w:netrw_rexlocal doesn't exist
3824 " This is useful when one edits a local file, then :e ., then :Rex
3825 if a:islocal && !exists("w:netrw_rexfile") && bufname("#") != ""
3826 let w:netrw_rexfile= bufname("#")
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02003827" call Decho("setting w:netrw_rexfile<".w:netrw_rexfile."> win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003828 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003829
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003830 " s:NetrwBrowse : initialize history {{{3
3831 if !exists("s:netrw_initbookhist")
3832 NetrwKeepj call s:NetrwBookHistRead()
3833 endif
3834
3835 " s:NetrwBrowse : simplify the dirname (especially for ".."s in dirnames) {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003836 if a:dirname !~ '^\a\{3,}://'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003837 let dirname= simplify(a:dirname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02003838" call Decho("simplified dirname<".dirname.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003839 else
3840 let dirname= a:dirname
3841 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003842
Bram Moolenaar85850f32019-07-19 22:05:51 +02003843 " repoint t:netrw_lexbufnr if appropriate
3844 if exists("t:netrw_lexbufnr") && bufnr("%") == t:netrw_lexbufnr
3845" call Decho("set repointlexbufnr to true!")
3846 let repointlexbufnr= 1
3847 endif
3848
3849 " s:NetrwBrowse : sanity checks: {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003850 if exists("s:netrw_skipbrowse")
3851 unlet s:netrw_skipbrowse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003852" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." filename<".expand("%")."> win#".winnr()." ft<".&ft.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01003853" call Dret("s:NetrwBrowse : s:netrw_skipbrowse existed")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003854 return
3855 endif
3856 if !exists("*shellescape")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003857 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003858" call Dret("s:NetrwBrowse : missing shellescape()")
3859 return
3860 endif
3861 if !exists("*fnameescape")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003862 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003863" call Dret("s:NetrwBrowse : missing fnameescape()")
3864 return
3865 endif
3866
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003867 " s:NetrwBrowse : save options: {{{3
Bram Moolenaar85850f32019-07-19 22:05:51 +02003868 call s:NetrwOptionsSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003869
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003870 " s:NetrwBrowse : re-instate any marked files {{{3
Bram Moolenaar85850f32019-07-19 22:05:51 +02003871 if has("syntax") && exists("g:syntax_on") && g:syntax_on
3872 if exists("s:netrwmarkfilelist_{bufnr('%')}")
3873" call Decho("clearing marked files",'~'.expand("<slnum>"))
3874 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3875 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003876 endif
3877
3878 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003879 " s:NetrwBrowse : set up "safe" options for local directory/file {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003880" call Decho("handle w:netrw_acdkeep:",'~'.expand("<slnum>"))
3881" call Decho("NetrwKeepj lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02003882 if s:NetrwLcd(dirname)
3883" call Dret("s:NetrwBrowse : lcd failure")
3884 return
3885 endif
3886 " call s:NetrwOptionsSafe() " tst952 failed with this enabled.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003887" call Decho("getcwd<".getcwd().">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003888
Bram Moolenaar5c736222010-01-06 20:54:52 +01003889 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003890 " s:NetrwBrowse : remote regular file handler {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003891" call Decho("handle remote regular file: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003892 if bufname(dirname) != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003893" call Decho("edit buf#".bufname(dirname)." in win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003894 exe "NetrwKeepj b ".bufname(dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +01003895 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003896 " attempt transfer of remote regular file
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003897" call Decho("attempt transfer as regular file<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003898
3899 " remove any filetype indicator from end of dirname, except for the
3900 " "this is a directory" indicator (/).
3901 " There shouldn't be one of those here, anyway.
3902 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003903" call Decho("new path<".path.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003904 call s:RemotePathAnalysis(dirname)
3905
3906 " s:NetrwBrowse : remote-read the requested file into current buffer {{{3
3907 call s:NetrwEnew(dirname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02003908 call s:NetrwOptionsSafe(a:islocal)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003909 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003910" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003911 let b:netrw_curdir = dirname
3912 let url = s:method."://".((s:user == "")? "" : s:user."@").s:machine.(s:port ? ":".s:port : "")."/".s:path
Bram Moolenaar85850f32019-07-19 22:05:51 +02003913 call s:NetrwBufRename(url)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003914 exe "sil! NetrwKeepj keepalt doau BufReadPre ".fnameescape(s:fname)
3915 sil call netrw#NetRead(2,url)
3916 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003917" call Decho("url<".url.">",'~'.expand("<slnum>"))
3918" call Decho("s:path<".s:path.">",'~'.expand("<slnum>"))
3919" call Decho("s:fname<".s:fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003920 if s:path =~ '.bz2'
3921 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.bz2$','',''))
3922 elseif s:path =~ '.gz'
3923 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.gz$','',''))
3924 elseif s:path =~ '.gz'
3925 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.txz$','',''))
3926 else
3927 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(s:fname)
3928 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003929 endif
3930
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003931 " s:NetrwBrowse : save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003932 call s:SetBufWinVars()
Bram Moolenaar85850f32019-07-19 22:05:51 +02003933 call s:NetrwOptionsRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003934" call Decho("setl ma nomod",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003935 setl ma nomod noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003936" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003937
Bram Moolenaar446cb832008-06-24 21:56:24 +00003938" call Dret("s:NetrwBrowse : file<".s:fname.">")
3939 return
3940 endif
3941
Bram Moolenaaradc21822011-04-01 18:03:16 +02003942 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003943 call s:UseBufWinVars()
3944
3945 " set up some variables {{{3
3946 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003947 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003948 let s:last_sort_by = g:netrw_sort_by
3949
3950 " set up menu {{{3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003951 NetrwKeepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003952
Bram Moolenaar97d62492012-11-15 21:28:22 +01003953 " get/set-up buffer {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003954" call Decho("saving position across a buffer refresh",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003955 let svpos = winsaveview()
3956" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003957 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003958
Bram Moolenaar446cb832008-06-24 21:56:24 +00003959 " maintain markfile highlighting
Bram Moolenaar85850f32019-07-19 22:05:51 +02003960 if has("syntax") && exists("g:syntax_on") && g:syntax_on
3961 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
3962" " call Decho("bufnr(%)=".bufnr('%'),'~'.expand("<slnum>"))
3963" " call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/",'~'.expand("<slnum>"))
3964 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3965 else
3966" " call Decho("2match none",'~'.expand("<slnum>"))
3967 2match none
3968 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003969 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003970 if reusing && line("$") > 1
Bram Moolenaar85850f32019-07-19 22:05:51 +02003971 call s:NetrwOptionsRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003972" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003973 setl noma nomod nowrap
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003974" call Decho("(set noma nomod nowrap) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003975" call Dret("s:NetrwBrowse : re-using not-cleared buffer")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003976 return
3977 endif
3978
3979 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003980" call Decho("set b:netrw_curdir to the new directory name<".dirname."> (buf#".bufnr("%").")",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003981 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003982 if b:netrw_curdir =~ '[/\\]$'
3983 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
3984 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01003985 if b:netrw_curdir =~ '\a:$' && (has("win32") || has("win95") || has("win64") || has("win16"))
3986 let b:netrw_curdir= b:netrw_curdir."/"
3987 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003988 if b:netrw_curdir == ''
3989 if has("amiga")
3990 " On the Amiga, the empty string connotes the current directory
3991 let b:netrw_curdir= getcwd()
3992 else
3993 " under unix, when the root directory is encountered, the result
3994 " from the preceding substitute is an empty string.
3995 let b:netrw_curdir= '/'
3996 endif
3997 endif
3998 if !a:islocal && b:netrw_curdir !~ '/$'
3999 let b:netrw_curdir= b:netrw_curdir.'/'
4000 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004001" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004002
4003 " ------------
4004 " (local only) {{{3
4005 " ------------
4006 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004007" call Decho("local only:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004008
4009 " Set up ShellCmdPost handling. Append current buffer to browselist
4010 call s:LocalFastBrowser()
4011
4012 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
4013 if !g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004014" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
4015" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004016 if !exists("&l:acd") || !&l:acd
Bram Moolenaar85850f32019-07-19 22:05:51 +02004017 if s:NetrwLcd(b:netrw_curdir)
4018" call Dret("s:NetrwBrowse : lcd failure")
4019 return
4020 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004021 endif
4022 endif
4023
4024 " --------------------------------
4025 " remote handling: {{{3
4026 " --------------------------------
4027 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004028" call Decho("remote only:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004029
Bram Moolenaar97d62492012-11-15 21:28:22 +01004030 " analyze dirname and g:netrw_list_cmd {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004031" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004032 if dirname =~# "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004033 let dirname= b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004034" call Decho("(dirname was <NetrwTreeListing>) dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004035 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
4036 let dirname= substitute(b:netrw_curdir,'\\','/','g')
4037 if dirname !~ '/$'
4038 let dirname= dirname.'/'
4039 endif
4040 let b:netrw_curdir = dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004041" call Decho("(liststyle is TREELIST) dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004042 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004043 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004044" call Decho("(normal) dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004045 endif
4046
4047 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
4048 if dirname !~ dirpat
4049 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004050 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004051 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02004052 NetrwKeepj call s:NetrwOptionsRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004053" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004054 setl noma nomod nowrap
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004055" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004056" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
4057 return
4058 endif
4059 let b:netrw_curdir= dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004060" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004061 endif " (additional remote handling)
4062
Bram Moolenaar85850f32019-07-19 22:05:51 +02004063 " -------------------------------
4064 " Perform Directory Listing: {{{3
4065 " -------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004066 NetrwKeepj call s:NetrwMaps(a:islocal)
4067 NetrwKeepj call s:NetrwCommands(a:islocal)
4068 NetrwKeepj call s:PerformListing(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004069
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004070 " restore option(s)
Bram Moolenaar85850f32019-07-19 22:05:51 +02004071 call s:NetrwOptionsRestore("w:")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004072" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4073
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004074 " If there is a rexposn: restore position with rexposn
4075 " Otherwise : set rexposn
4076 if exists("s:rexposn_".bufnr("%"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004077" call Decho("restoring posn to s:rexposn_".bufnr('%')."<".string(s:rexposn_{bufnr('%')}).">",'~'.expand("<slnum>"))
4078 NetrwKeepj call winrestview(s:rexposn_{bufnr('%')})
4079 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
4080 NetrwKeepj exe w:netrw_bannercnt
4081 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004082 else
4083 NetrwKeepj call s:SetRexDir(a:islocal,b:netrw_curdir)
4084 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02004085 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaara6878372014-03-22 21:02:50 +01004086 let &l:bexpr= "netrw#BalloonHelp()"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004087" call Decho("set up balloon help: l:bexpr=".&l:bexpr,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004088 setl beval
Bram Moolenaaradc21822011-04-01 18:03:16 +02004089 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004090
Bram Moolenaar85850f32019-07-19 22:05:51 +02004091 " repoint t:netrw_lexbufnr if appropriate
4092 if exists("repointlexbufnr")
4093 let t:netrw_lexbufnr= bufnr("%")
4094" call Decho("repoint t:netrw_lexbufnr to #".t:netrw_lexbufnr)
4095 endif
4096
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004097 " restore position
4098 if reusing
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004099" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
4100 call winrestview(svpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004101 endif
4102
Bram Moolenaara6878372014-03-22 21:02:50 +01004103 " The s:LocalBrowseRefresh() function is called by an autocmd
Bram Moolenaar85850f32019-07-19 22:05:51 +02004104 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow or medium speed).
4105 " However, s:NetrwBrowse() causes the FocusGained event to fire the first time.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004106" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4107" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02004108" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004109 return
4110endfun
4111
4112" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004113" s:NetrwFile: because of g:netrw_keepdir, isdirectory(), type(), etc may or {{{2
4114" may not apply correctly; ie. netrw's idea of the current directory may
4115" differ from vim's. This function insures that netrw's idea of the current
4116" directory is used.
Bram Moolenaar85850f32019-07-19 22:05:51 +02004117" Returns a path to the file specified by a:fname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004118fun! s:NetrwFile(fname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02004119" "" call Dfunc("s:NetrwFile(fname<".a:fname.">) win#".winnr())
4120" "" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'),'~'.expand("<slnum>"))
4121" "" call Decho("g:netrw_cygwin =".(exists("g:netrw_cygwin")? g:netrw_cygwin : 'n/a'),'~'.expand("<slnum>"))
4122" "" call Decho("g:netrw_liststyle=".(exists("g:netrw_liststyle")? g:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
4123" "" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004124
4125 " clean up any leading treedepthstring
4126 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
4127 let fname= substitute(a:fname,'^'.s:treedepthstring.'\+','','')
Bram Moolenaar85850f32019-07-19 22:05:51 +02004128" "" call Decho("clean up any leading treedepthstring: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004129 else
4130 let fname= a:fname
4131 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004132
4133 if g:netrw_keepdir
4134 " vim's idea of the current directory possibly may differ from netrw's
4135 if !exists("b:netrw_curdir")
4136 let b:netrw_curdir= getcwd()
4137 endif
4138
4139 if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004140 if fname =~ '^\' || fname =~ '^\a:\'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004141 " windows, but full path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004142 let ret= fname
Bram Moolenaar85850f32019-07-19 22:05:51 +02004143" "" call Decho("windows+full path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004144 else
4145 " windows, relative path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004146 let ret= s:ComposePath(b:netrw_curdir,fname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02004147" "" call Decho("windows+rltv path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004148 endif
4149
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004150 elseif fname =~ '^/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004151 " not windows, full path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004152 let ret= fname
Bram Moolenaar85850f32019-07-19 22:05:51 +02004153" "" call Decho("unix+full path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004154 else
4155 " not windows, relative path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004156 let ret= s:ComposePath(b:netrw_curdir,fname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02004157" "" call Decho("unix+rltv path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004158 endif
4159 else
4160 " vim and netrw agree on the current directory
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004161 let ret= fname
Bram Moolenaar85850f32019-07-19 22:05:51 +02004162" "" call Decho("vim and netrw agree on current directory (g:netrw_keepdir=".g:netrw_keepdir.")",'~'.expand("<slnum>"))
4163" "" call Decho("vim directory: ".getcwd(),'~'.expand("<slnum>"))
4164" "" call Decho("netrw directory: ".(exists("b:netrw_curdir")? b:netrw_curdir : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004165 endif
4166
Bram Moolenaar85850f32019-07-19 22:05:51 +02004167" "" call Dret("s:NetrwFile ".ret)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004168 return ret
4169endfun
4170
4171" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004172" s:NetrwFileInfo: supports qf (query for file information) {{{2
4173fun! s:NetrwFileInfo(islocal,fname)
Bram Moolenaar8d043172014-01-23 14:24:41 +01004174" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">) b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004175 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004176 if a:islocal
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004177 let lsopt= "-lsad"
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004178 if g:netrw_sizestyle =~# 'H'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004179 let lsopt= "-lsadh"
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004180 elseif g:netrw_sizestyle =~# 'h'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004181 let lsopt= "-lsadh --si"
4182 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004183" call Decho("(s:NetrwFileInfo) lsopt<".lsopt.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004184 if (has("unix") || has("macunix")) && executable("/bin/ls")
Bram Moolenaar8d043172014-01-23 14:24:41 +01004185
4186 if getline(".") == "../"
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004187 echo system("/bin/ls ".lsopt." ".s:ShellEscape(".."))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004188" call Decho("#1: echo system(/bin/ls -lsad ".s:ShellEscape(..).")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004189
Bram Moolenaara6878372014-03-22 21:02:50 +01004190 elseif w:netrw_liststyle == s:TREELIST && getline(".") !~ '^'.s:treedepthstring
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004191 echo system("/bin/ls ".lsopt." ".s:ShellEscape(b:netrw_curdir))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004192" call Decho("#2: echo system(/bin/ls -lsad ".s:ShellEscape(b:netrw_curdir).")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004193
4194 elseif exists("b:netrw_curdir")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004195 echo system("/bin/ls ".lsopt." ".s:ShellEscape(s:ComposePath(b:netrw_curdir,a:fname)))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004196" call Decho("#3: echo system(/bin/ls -lsad ".s:ShellEscape(b:netrw_curdir.a:fname).")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004197
Bram Moolenaar446cb832008-06-24 21:56:24 +00004198 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004199" call Decho('using ls '.a:fname." using cwd<".getcwd().">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004200 echo system("/bin/ls ".lsopt." ".s:ShellEscape(s:NetrwFile(a:fname)))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004201" call Decho("#5: echo system(/bin/ls -lsad ".s:ShellEscape(a:fname).")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004202 endif
4203 else
4204 " use vim functions to return information about file below cursor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004205" call Decho("using vim functions to query for file info",'~'.expand("<slnum>"))
4206 if !isdirectory(s:NetrwFile(a:fname)) && !filereadable(s:NetrwFile(a:fname)) && a:fname =~ '[*@/]'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004207 let fname= substitute(a:fname,".$","","")
4208 else
4209 let fname= a:fname
4210 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004211 let t = getftime(s:NetrwFile(fname))
4212 let sz = getfsize(s:NetrwFile(fname))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004213 if g:netrw_sizestyle =~# "[hH]"
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004214 let sz= s:NetrwHumanReadable(sz)
4215 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004216 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(s:NetrwFile(fname)))
4217" call Decho("fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004218 endif
4219 else
4220 echo "sorry, \"qf\" not supported yet for remote files"
4221 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004222 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004223" call Dret("s:NetrwFileInfo")
4224endfun
4225
4226" ---------------------------------------------------------------------
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004227" s:NetrwFullPath: returns the full path to a directory and/or file {{{2
4228fun! s:NetrwFullPath(filename)
4229" " call Dfunc("s:NetrwFullPath(filename<".a:filename.">)")
4230 let filename= a:filename
4231 if filename !~ '^/'
4232 let filename= resolve(getcwd().'/'.filename)
4233 endif
4234 if filename != "/" && filename =~ '/$'
4235 let filename= substitute(filename,'/$','','')
4236 endif
4237" " call Dret("s:NetrwFullPath <".filename.">")
4238 return filename
4239endfun
4240
4241" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02004242" s:NetrwGetBuffer: [get a new|find an old netrw] buffer for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004243" returns 0=cleared buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004244" 1=re-used buffer (buffer not cleared)
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004245" Nov 09, 2020: tst952 shows that when user does :set hidden that NetrwGetBuffer will come up with a [No Name] buffer (hid fix)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004246fun! s:NetrwGetBuffer(islocal,dirname)
4247" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004248" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." hid=".&hid,'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004249" call Decho("netrwbuf dictionary=".(exists("s:netrwbuf")? string(s:netrwbuf) : 'n/a'),'~'.expand("<slnum>"))
4250" call Dredir("ls!","s:NetrwGetBuffer")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004251 let dirname= a:dirname
4252
4253 " re-use buffer if possible {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004254" call Decho("--re-use a buffer if possible--",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004255 if !exists("s:netrwbuf")
Bram Moolenaar85850f32019-07-19 22:05:51 +02004256" call Decho(" s:netrwbuf initialized to {}",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004257 let s:netrwbuf= {}
4258 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02004259" call Decho(" s:netrwbuf =".string(s:netrwbuf),'~'.expand("<slnum>"))
4260" call Decho(" w:netrw_liststyle =".(exists("w:netrw_liststyle")? w:netrw_liststyle : "n/a"),'~'.expand("<slnum>"))
4261
4262 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
4263 let bufnum = -1
4264
4265 if !empty(s:netrwbuf) && has_key(s:netrwbuf,s:NetrwFullPath(dirname))
4266 if has_key(s:netrwbuf,"NetrwTreeListing")
4267 let bufnum= s:netrwbuf["NetrwTreeListing"]
4268 else
4269 let bufnum= s:netrwbuf[s:NetrwFullPath(dirname)]
4270 endif
4271" call Decho(" NetrwTreeListing: bufnum#".bufnum,'~'.expand("<slnum>"))
4272 if !bufexists(bufnum)
4273 call remove(s:netrwbuf,"NetrwTreeListing"])
4274 let bufnum= -1
4275 endif
4276 elseif bufnr("NetrwTreeListing") != -1
4277 let bufnum= bufnr("NetrwTreeListing")
4278" call Decho(" NetrwTreeListing".": bufnum#".bufnum,'~'.expand("<slnum>"))
4279 else
4280" call Decho(" did not find a NetrwTreeListing buffer",'~'.expand("<slnum>"))
4281 let bufnum= -1
4282 endif
4283
4284 elseif has_key(s:netrwbuf,s:NetrwFullPath(dirname))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004285 let bufnum= s:netrwbuf[s:NetrwFullPath(dirname)]
Bram Moolenaar85850f32019-07-19 22:05:51 +02004286" call Decho(" lookup netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."]=".bufnum,'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004287 if !bufexists(bufnum)
4288 call remove(s:netrwbuf,s:NetrwFullPath(dirname))
4289 let bufnum= -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004290 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02004291
Bram Moolenaar446cb832008-06-24 21:56:24 +00004292 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02004293" call Decho(" lookup netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."] not a key",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004294 let bufnum= -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004295 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02004296" call Decho(" bufnum#".bufnum,'~'.expand("<slnum>"))
4297
Bram Moolenaar71badf92023-04-22 22:40:14 +01004298 " highjack the current buffer
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004299 " IF the buffer already has the desired name
4300 " AND it is empty
4301 let curbuf = bufname("%")
4302 if curbuf == '.'
4303 let curbuf = getcwd()
4304 endif
4305" call Dredir("ls!","NetrwGetFile (renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">)")
Bram Moolenaar71badf92023-04-22 22:40:14 +01004306" call Decho("deciding if netrw may highjack the current buffer#".bufnr("%")."<".curbuf.">",'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004307" call Decho("..dirname<".dirname."> IF dirname == bufname",'~'.expand("<slnum>"))
4308" call Decho("..curbuf<".curbuf.">",'~'.expand("<slnum>"))
4309" call Decho("..line($)=".line("$")." AND this is 1",'~'.expand("<slnum>"))
4310" call Decho("..getline(%)<".getline("%")."> AND this line is empty",'~'.expand("<slnum>"))
4311 if dirname == curbuf && line("$") == 1 && getline("%") == ""
Bram Moolenaar85850f32019-07-19 22:05:51 +02004312" call Dret("s:NetrwGetBuffer 0<cleared buffer> : highjacking buffer#".bufnr("%"))
4313 return 0
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004314 else " DEBUG
Bram Moolenaar71badf92023-04-22 22:40:14 +01004315" call Decho("..did NOT highjack buffer",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004316 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004317 " Aug 14, 2021: was thinking about looking for a [No Name] buffer here and using it, but that might cause problems
Bram Moolenaar446cb832008-06-24 21:56:24 +00004318
4319 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004320 if bufnum < 0 " get enew buffer and name it
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004321" call Decho("--get enew buffer and name it (bufnum#".bufnum."<0 OR bufexists(".bufnum.")=".bufexists(bufnum)."==0)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004322 call s:NetrwEnew(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004323" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004324 " name the buffer
4325 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
4326 " Got enew buffer; transform into a NetrwTreeListing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004327" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004328 let w:netrw_treebufnr = bufnr("%")
4329 call s:NetrwBufRename("NetrwTreeListing")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004330 if g:netrw_use_noswf
4331 setl nobl bt=nofile noswf
4332 else
4333 setl nobl bt=nofile
4334 endif
4335 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[[')<cr>
4336 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']]')<cr>
4337 nnoremap <silent> <buffer> [] :sil call <SID>TreeListMove('[]')<cr>
4338 nnoremap <silent> <buffer> ][ :sil call <SID>TreeListMove('][')<cr>
Bram Moolenaar85850f32019-07-19 22:05:51 +02004339" call Decho(" tree listing bufnr=".w:netrw_treebufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004340 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02004341 call s:NetrwBufRename(dirname)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004342 " enter the new buffer into the s:netrwbuf dictionary
4343 let s:netrwbuf[s:NetrwFullPath(dirname)]= bufnr("%")
4344" call Decho("update netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."]=".bufnr("%"),'~'.expand("<slnum>"))
4345" call Decho("netrwbuf dictionary=".string(s:netrwbuf),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004346 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004347" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004348
4349 else " Re-use the buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004350" call Decho("--re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01004351 " ignore all events
Bram Moolenaar446cb832008-06-24 21:56:24 +00004352 let eikeep= &ei
Bram Moolenaara6878372014-03-22 21:02:50 +01004353 setl ei=all
Bram Moolenaar71badf92023-04-22 22:40:14 +01004354
4355 if &ft == "netrw"
4356" call Decho("buffer type is netrw; not using keepalt with b ".bufnum)
4357 exe "sil! NetrwKeepj noswapfile b ".bufnum
4358" call Dredir("ls!","one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004359 else
Bram Moolenaar71badf92023-04-22 22:40:14 +01004360" call Decho("buffer type is not netrw; using keepalt with b ".bufnum)
4361 call s:NetrwEditBuf(bufnum)
4362" call Dredir("ls!","two")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004363 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004364" call Decho(" line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004365 if bufname("%") == '.'
Bram Moolenaar85850f32019-07-19 22:05:51 +02004366 call s:NetrwBufRename(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00004367 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01004368
4369 " restore ei
Bram Moolenaar446cb832008-06-24 21:56:24 +00004370 let &ei= eikeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004371
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004372 if line("$") <= 1 && getline(1) == ""
4373 " empty buffer
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004374 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004375" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
4376" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004377" call Dret("s:NetrwGetBuffer 0<buffer empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
4378 return 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004379
Bram Moolenaar97d62492012-11-15 21:28:22 +01004380 elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004381" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse." a:islocal=".a:islocal.": clear buffer",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004382 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004383 sil NetrwKeepj %d _
4384" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
4385" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004386" call Dret("s:NetrwGetBuffer 0<cleared buffer> : re-using buffer#".bufnr("%").", but refreshing due to g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004387 return 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004388
Bram Moolenaar446cb832008-06-24 21:56:24 +00004389 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004390" call Decho("--re-use tree listing--",'~'.expand("<slnum>"))
4391" call Decho(" clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004392 setl ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004393 sil NetrwKeepj %d _
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004394 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004395" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
4396" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004397" call Dret("s:NetrwGetBuffer 0<cleared buffer> : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004398 return 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004399
Bram Moolenaar446cb832008-06-24 21:56:24 +00004400 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004401" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
4402" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4403" call Dret("s:NetrwGetBuffer 1<buffer not cleared>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004404 return 1
4405 endif
4406 endif
4407
4408 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
4409 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
4410 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
4411 " med 1 D H
4412 " fast 2 H H
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004413" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004414 let fname= expand("%")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004415 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar85850f32019-07-19 22:05:51 +02004416 call s:NetrwBufRename(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004417
4418 " delete all lines from buffer {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004419" call Decho("--delete all lines from buffer--",'~'.expand("<slnum>"))
4420" call Decho(" clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
4421 sil! keepalt NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00004422
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004423" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
4424" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4425" call Dret("s:NetrwGetBuffer 0<cleared buffer>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004426 return 0
4427endfun
4428
4429" ---------------------------------------------------------------------
4430" s:NetrwGetcwd: get the current directory. {{{2
4431" Change backslashes to forward slashes, if any.
4432" If doesc is true, escape certain troublesome characters
4433fun! s:NetrwGetcwd(doesc)
4434" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
4435 let curdir= substitute(getcwd(),'\\','/','ge')
4436 if curdir !~ '[\/]$'
4437 let curdir= curdir.'/'
4438 endif
4439 if a:doesc
4440 let curdir= fnameescape(curdir)
4441 endif
4442" call Dret("NetrwGetcwd <".curdir.">")
4443 return curdir
4444endfun
4445
4446" ---------------------------------------------------------------------
4447" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
4448fun! s:NetrwGetWord()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004449" call Dfunc("s:NetrwGetWord() liststyle=".s:ShowStyle()." virtcol=".virtcol("."))
4450" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4451 let keepsol= &l:sol
4452 setl nosol
4453
Bram Moolenaar446cb832008-06-24 21:56:24 +00004454 call s:UseBufWinVars()
4455
4456 " insure that w:netrw_liststyle is set up
4457 if !exists("w:netrw_liststyle")
4458 if exists("g:netrw_liststyle")
4459 let w:netrw_liststyle= g:netrw_liststyle
4460 else
4461 let w:netrw_liststyle= s:THINLIST
4462 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004463" call Decho("w:netrw_liststyle=".w:netrw_liststyle,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004464 endif
4465
4466 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
4467 " Active Banner support
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004468" call Decho("active banner handling",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004469 NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004470 let dirname= "./"
4471 let curline= getline('.')
4472
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004473 if curline =~# '"\s*Sorted by\s'
Bram Moolenaar91359012019-11-30 17:57:03 +01004474 NetrwKeepj norm! "_s
Bram Moolenaar446cb832008-06-24 21:56:24 +00004475 let s:netrw_skipbrowse= 1
4476 echo 'Pressing "s" also works'
4477
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004478 elseif curline =~# '"\s*Sort sequence:'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004479 let s:netrw_skipbrowse= 1
4480 echo 'Press "S" to edit sorting sequence'
4481
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004482 elseif curline =~# '"\s*Quick Help:'
Bram Moolenaar85850f32019-07-19 22:05:51 +02004483 NetrwKeepj norm! ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00004484 let s:netrw_skipbrowse= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004485
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004486 elseif curline =~# '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar85850f32019-07-19 22:05:51 +02004487 NetrwKeepj norm! a
Bram Moolenaar446cb832008-06-24 21:56:24 +00004488 let s:netrw_skipbrowse= 1
4489 echo 'Pressing "a" also works'
4490
4491 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004492 exe 'sil NetrwKeepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004493 endif
4494
4495 elseif w:netrw_liststyle == s:THINLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004496" call Decho("thin column handling",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004497 NetrwKeepj norm! 0
4498 let dirname= substitute(getline('.'),'\t -->.*$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004499
4500 elseif w:netrw_liststyle == s:LONGLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004501" call Decho("long column handling",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004502 NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004503 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
4504
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004505 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004506" call Decho("treelist handling",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004507 let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004508 let dirname= substitute(dirname,'\t -->.*$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004509
4510 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004511" call Decho("obtain word from wide listing",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004512 let dirname= getline('.')
4513
4514 if !exists("b:netrw_cpf")
4515 let b:netrw_cpf= 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004516 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004517 call histdel("/",-1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004518" "call Decho("computed cpf=".b:netrw_cpf,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004519 endif
4520
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004521" call Decho("buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004522 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004523" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
4524" call Decho("1: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004525 if filestart == 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004526 NetrwKeepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004527 else
4528 call cursor(line("."),filestart+1)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004529 NetrwKeepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004530 endif
4531 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004532 let eofname= filestart + b:netrw_cpf + 1
4533 if eofname <= col("$")
4534 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004535 NetrwKeepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004536 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004537 NetrwKeepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00004538 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004539 let dirname = @a
4540 let @a = rega
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004541" call Decho("2: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004542 let dirname= substitute(dirname,'\s\+$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004543" call Decho("3: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004544 endif
4545
4546 " symlinks are indicated by a trailing "@". Remove it before further processing.
4547 let dirname= substitute(dirname,"@$","","")
4548
4549 " executables are indicated by a trailing "*". Remove it before further processing.
4550 let dirname= substitute(dirname,"\*$","","")
4551
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004552 let &l:sol= keepsol
4553
Bram Moolenaar446cb832008-06-24 21:56:24 +00004554" call Dret("s:NetrwGetWord <".dirname.">")
4555 return dirname
4556endfun
4557
4558" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02004559" s:NetrwListSettings: make standard settings for making a netrw listing {{{2
4560" g:netrw_bufsettings will be used after the listing is produced.
4561" Called by s:NetrwGetBuffer()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004562fun! s:NetrwListSettings(islocal)
4563" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004564" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004565 let fname= bufname("%")
Bram Moolenaar85850f32019-07-19 22:05:51 +02004566" " call Decho("setl bt=nofile nobl ma nonu nowrap noro nornu",'~'.expand("<slnum>"))
4567 " nobl noma nomod nonu noma nowrap ro nornu (std g:netrw_bufsettings)
4568 setl bt=nofile nobl ma nonu nowrap noro nornu
4569 call s:NetrwBufRename(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004570 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004571 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004572 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02004573" call Dredir("ls!","s:NetrwListSettings")
4574" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004575 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaarff034192013-04-24 18:51:19 +02004576 setl isk+=.,~,-
Bram Moolenaar446cb832008-06-24 21:56:24 +00004577 if g:netrw_fastbrowse > a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004578 setl bh=hide
Bram Moolenaar446cb832008-06-24 21:56:24 +00004579 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004580 setl bh=delete
Bram Moolenaar446cb832008-06-24 21:56:24 +00004581 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004582" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004583" call Dret("s:NetrwListSettings")
4584endfun
4585
4586" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02004587" s:NetrwListStyle: change list style (thin - long - wide - tree) {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004588" islocal=0: remote browsing
4589" =1: local browsing
4590fun! s:NetrwListStyle(islocal)
4591" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
Bram Moolenaar13600302014-05-22 18:26:40 +02004592
Bram Moolenaar97d62492012-11-15 21:28:22 +01004593 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004594 let fname = s:NetrwGetWord()
4595 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004596 let svpos = winsaveview()
4597" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004598 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004599" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
4600" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle,'~'.expand("<slnum>"))
4601" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004602
Bram Moolenaar85850f32019-07-19 22:05:51 +02004603 " repoint t:netrw_lexbufnr if appropriate
4604 if exists("t:netrw_lexbufnr") && bufnr("%") == t:netrw_lexbufnr
4605" call Decho("set repointlexbufnr to true!")
4606 let repointlexbufnr= 1
4607 endif
4608
Bram Moolenaar446cb832008-06-24 21:56:24 +00004609 if w:netrw_liststyle == s:THINLIST
4610 " use one column listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004611" call Decho("use one column list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004612 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4613
4614 elseif w:netrw_liststyle == s:LONGLIST
4615 " use long list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004616" call Decho("use long list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004617 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4618
4619 elseif w:netrw_liststyle == s:WIDELIST
4620 " give wide list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004621" call Decho("use wide list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004622 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4623
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004624 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004625" call Decho("use tree list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004626 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4627
4628 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004629 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004630 let g:netrw_liststyle = s:THINLIST
4631 let w:netrw_liststyle = g:netrw_liststyle
4632 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4633 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004634 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004635" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004636
4637 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004638" call Decho("clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
4639 sil! NetrwKeepj %d _
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004640 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004641" call Decho("setl nomod",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004642 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004643" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004644
4645 " refresh the listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004646" call Decho("refresh the listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004647 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004648 NetrwKeepj call s:NetrwCursor(0)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004649
Bram Moolenaar85850f32019-07-19 22:05:51 +02004650 " repoint t:netrw_lexbufnr if appropriate
4651 if exists("repointlexbufnr")
4652 let t:netrw_lexbufnr= bufnr("%")
4653" call Decho("repoint t:netrw_lexbufnr to #".t:netrw_lexbufnr)
4654 endif
4655
Bram Moolenaar13600302014-05-22 18:26:40 +02004656 " restore position; keep cursor on the filename
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004657" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
4658 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004659 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004660
4661" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4662endfun
4663
4664" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004665" s:NetrwBannerCtrl: toggles the display of the banner {{{2
4666fun! s:NetrwBannerCtrl(islocal)
4667" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
4668
Bram Moolenaar97d62492012-11-15 21:28:22 +01004669 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004670 " toggle the banner (enable/suppress)
4671 let g:netrw_banner= !g:netrw_banner
4672
4673 " refresh the listing
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004674 let svpos= winsaveview()
4675" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004676 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4677
4678 " keep cursor on the filename
Bram Moolenaar85850f32019-07-19 22:05:51 +02004679 if g:netrw_banner && exists("w:netrw_bannercnt") && line(".") >= w:netrw_bannercnt
4680 let fname= s:NetrwGetWord()
4681 sil NetrwKeepj $
4682 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4683" " call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'),'~'.expand("<slnum>"))
4684 if result <= 0 && exists("w:netrw_bannercnt")
4685 exe "NetrwKeepj ".w:netrw_bannercnt
4686 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004687 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004688 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004689" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
4690endfun
4691
4692" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004693" s:NetrwBookmark: supports :NetrwMB[!] [file]s {{{2
4694"
4695" No bang: enters files/directories into Netrw's bookmark system
4696" No argument and in netrw buffer:
4697" if there are marked files: bookmark marked files
4698" otherwise : bookmark file/directory under cursor
4699" No argument and not in netrw buffer: bookmarks current open file
4700" Has arguments: globs them individually and bookmarks them
4701"
4702" With bang: deletes files/directories from Netrw's bookmark system
4703fun! s:NetrwBookmark(del,...)
4704" call Dfunc("s:NetrwBookmark(del=".a:del.",...) a:0=".a:0)
4705 if a:0 == 0
4706 if &ft == "netrw"
4707 let curbufnr = bufnr("%")
4708
4709 if exists("s:netrwmarkfilelist_{curbufnr}")
4710 " for every filename in the marked list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004711" call Decho("bookmark every filename in marked list",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004712 let svpos = winsaveview()
4713" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004714 let islocal= expand("%") !~ '^\a\{3,}://'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004715 for fname in s:netrwmarkfilelist_{curbufnr}
4716 if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
4717 endfor
4718 let curdir = exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
4719 call s:NetrwUnmarkList(curbufnr,curdir)
4720 NetrwKeepj call s:NetrwRefresh(islocal,s:NetrwBrowseChgDir(islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004721" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
4722 NetrwKeepj call winrestview(svpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004723 else
4724 let fname= s:NetrwGetWord()
4725 if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
4726 endif
4727
4728 else
4729 " bookmark currently open file
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004730" call Decho("bookmark currently open file",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004731 let fname= expand("%")
4732 if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
4733 endif
4734
4735 else
4736 " bookmark specified files
4737 " attempts to infer if working remote or local
4738 " by deciding if the current file begins with an url
4739 " Globbing cannot be done remotely.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004740 let islocal= expand("%") !~ '^\a\{3,}://'
4741" call Decho("bookmark specified file".((a:0>1)? "s" : ""),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004742 let i = 1
4743 while i <= a:0
4744 if islocal
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004745 if v:version > 704 || (v:version == 704 && has("patch656"))
4746 let mbfiles= glob(fnameescape(a:{i}),0,1,1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004747 else
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004748 let mbfiles= glob(fnameescape(a:{i}),0,1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004749 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004750 else
4751 let mbfiles= [a:{i}]
4752 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004753" call Decho("mbfiles".string(mbfiles),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004754 for mbfile in mbfiles
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004755" call Decho("mbfile<".mbfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004756 if a:del|call s:DeleteBookmark(mbfile)|else|call s:MakeBookmark(mbfile)|endif
4757 endfor
4758 let i= i + 1
4759 endwhile
4760 endif
4761
4762 " update the menu
4763 call s:NetrwBookmarkMenu()
4764
4765" call Dret("s:NetrwBookmark")
4766endfun
4767
4768" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004769" s:NetrwBookmarkMenu: Uses menu priorities {{{2
4770" .2.[cnt] for bookmarks, and
4771" .3.[cnt] for history
4772" (see s:NetrwMenu())
4773fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004774 if !exists("s:netrw_menucnt")
4775 return
4776 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02004777" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhistcnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004778
4779 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02004780 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00004781 if exists("g:NetrwTopLvlMenu")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004782" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004783 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4784 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004785 endif
4786 if !exists("s:netrw_initbookhist")
4787 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004788 endif
4789
4790 " show bookmarked places
Bram Moolenaarff034192013-04-24 18:51:19 +02004791 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004792 let cnt= 1
4793 for bmd in g:netrw_bookmarklist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004794" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004795 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004796
4797 " show bookmarks for goto menu
Bram Moolenaar8d043172014-01-23 14:24:41 +01004798 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004799
4800 " show bookmarks for deletion menu
Bram Moolenaar8d043172014-01-23 14:24:41 +01004801 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 +01004802 let cnt= cnt + 1
4803 endfor
4804
4805 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004806
4807 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02004808 if g:netrw_dirhistmax > 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02004809 let cnt = g:netrw_dirhistcnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02004810 let first = 1
4811 let histcnt = 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02004812 while ( first || cnt != g:netrw_dirhistcnt )
Bram Moolenaaradc21822011-04-01 18:03:16 +02004813 let histcnt = histcnt + 1
Bram Moolenaar85850f32019-07-19 22:05:51 +02004814 let priority = g:netrw_dirhistcnt + histcnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02004815 if exists("g:netrw_dirhist_{cnt}")
4816 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004817" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02004818 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
4819 endif
4820 let first = 0
4821 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4822 if cnt < 0
4823 let cnt= cnt + g:netrw_dirhistmax
4824 endif
4825 endwhile
4826 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004827
Bram Moolenaar9964e462007-05-05 17:54:07 +00004828 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004829" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004830endfun
4831
4832" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004833" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
4834" directory and a new directory name. Also, if the
4835" "new directory name" is actually a file,
4836" NetrwBrowseChgDir() edits the file.
4837fun! s:NetrwBrowseChgDir(islocal,newdir,...)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004838" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." win#".winnr()." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004839" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00004840
Bram Moolenaar97d62492012-11-15 21:28:22 +01004841 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004842 if !exists("b:netrw_curdir")
4843 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
4844 " and the current window is the NetrwMessage window.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004845 let @@= ykeep
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004846" call Decho("b:netrw_curdir doesn't exist!",'~'.expand("<slnum>"))
4847" call Decho("getcwd<".getcwd().">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004848" call Dredir("ls!","s:NetrwBrowseChgDir")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004849" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004850 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004851 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004852" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004853
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004854 " NetrwBrowseChgDir; save options and initialize {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004855" call Decho("saving options",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004856 call s:SavePosn(s:netrw_posn)
4857 NetrwKeepj call s:NetrwOptionsSave("s:")
4858 NetrwKeepj call s:NetrwOptionsSafe(a:islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004859 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004860 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004861 else
Bram Moolenaara6878372014-03-22 21:02:50 +01004862 let dirname = b:netrw_curdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004863 endif
4864 let newdir = a:newdir
4865 let dolockout = 0
Bram Moolenaar13600302014-05-22 18:26:40 +02004866 let dorestore = 1
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004867" call Decho("win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004868" call Decho("dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004869" call Decho("newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004870
4871 " ignore <cr>s when done in the banner
Bram Moolenaar85850f32019-07-19 22:05:51 +02004872" call Decho('(s:NetrwBrowseChgDir) ignore [return]s when done in banner (g:netrw_banner='.g:netrw_banner.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004873 if g:netrw_banner
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004874" call Decho("win#".winnr()." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a')." line(.)#".line('.')." line($)#".line("#"),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004875 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt && line("$") >= w:netrw_bannercnt
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004876 if getline(".") =~# 'Quick Help'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004877" call Decho("#1: quickhelp=".g:netrw_quickhelp." ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004878 let g:netrw_quickhelp= (g:netrw_quickhelp + 1)%len(s:QuickHelp)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004879" call Decho("#2: quickhelp=".g:netrw_quickhelp." ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02004880 setl ma noro nowrap
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004881 NetrwKeepj call setline(line('.'),'" Quick Help: <F1>:help '.s:QuickHelp[g:netrw_quickhelp])
Bram Moolenaara6878372014-03-22 21:02:50 +01004882 setl noma nomod nowrap
Bram Moolenaar85850f32019-07-19 22:05:51 +02004883 NetrwKeepj call s:NetrwOptionsRestore("s:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004884" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004885 endif
4886 endif
4887" else " Decho
Bram Moolenaar85850f32019-07-19 22:05:51 +02004888" call Decho("g:netrw_banner=".g:netrw_banner." (no banner)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004889 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004890
Bram Moolenaar446cb832008-06-24 21:56:24 +00004891 " set up o/s-dependent directory recognition pattern
4892 if has("amiga")
4893 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00004894 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004895 let dirpat= '[\/]$'
4896 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004897" call Decho("set up o/s-dependent directory recognition pattern: dirname<".dirname."> dirpat<".dirpat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004898
4899 if dirname !~ dirpat
4900 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02004901 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004902 let dirname= dirname.'/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004903" call Decho("adjusting dirname<".dirname.'> (put trailing "/" back)','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004904 endif
4905
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004906" call Decho("[newdir<".newdir."> ".((newdir =~ dirpat)? "=~" : "!~")." dirpat<".dirpat.">] && [islocal=".a:islocal."] && [newdir is ".(isdirectory(s:NetrwFile(newdir))? "" : "not ")."a directory]",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004907 if newdir !~ dirpat && !(a:islocal && isdirectory(s:NetrwFile(s:ComposePath(dirname,newdir))))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004908 " ------------------------------
4909 " NetrwBrowseChgDir: edit a file {{{3
4910 " ------------------------------
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004911" call Decho('edit-a-file: case "handling a file": win#'.winnr().' newdir<'.newdir.'> !~ dirpat<'.dirpat.">",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004912
Bram Moolenaar97d62492012-11-15 21:28:22 +01004913 " save position for benefit of Rexplore
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004914 let s:rexposn_{bufnr("%")}= winsaveview()
4915" call Decho("edit-a-file: saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004916" call Decho("edit-a-file: win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft,'~'.expand("<slnum>"))
4917" call Decho("edit-a-file: w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a')." w:netrw_treedict:".(exists("w:netrw_treedict")? "exists" : 'n/a')." newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004918
Bram Moolenaar446cb832008-06-24 21:56:24 +00004919 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004920" call Decho("edit-a-file: handle tree listing: w:netrw_treedict<".(exists("w:netrw_treedict")? string(w:netrw_treedict) : 'n/a').">",'~'.expand("<slnum>"))
4921" call Decho("edit-a-file: newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02004922" let newdir = s:NetrwTreePath(s:netrw_treetop)
4923" call Decho("edit-a-file: COMBAK why doesn't this recognize file1's directory???")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004924 let dirname= s:NetrwTreeDir(a:islocal)
Bram Moolenaar85850f32019-07-19 22:05:51 +02004925 "COMBAK : not working for a symlink -- but what about a regular file? a directory?
4926" call Decho("COMBAK : not working for a symlink -- but what about a regular file? a directory?")
4927 " Feb 17, 2019: following if-else-endif restored -- wasn't editing a file in tree mode
Bram Moolenaar446cb832008-06-24 21:56:24 +00004928 if dirname =~ '/$'
4929 let dirname= dirname.newdir
4930 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01004931 let dirname= dirname."/".newdir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004932 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004933" call Decho("edit-a-file: dirname<".dirname.">",'~'.expand("<slnum>"))
4934" call Decho("edit-a-file: tree listing",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004935 elseif newdir =~ '^\(/\|\a:\)'
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004936" call Decho("edit-a-file: handle an url or path starting with /: <".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004937 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004938 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004939 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004940 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004941" call Decho("edit-a-file: handling a file: dirname<".dirname."> (a:0=".a:0.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004942 " this lets netrw#BrowseX avoid the edit
Bram Moolenaar446cb832008-06-24 21:56:24 +00004943 if a:0 < 1
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004944" call Decho("edit-a-file: (a:0=".a:0."<1) set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"),'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02004945 NetrwKeepj call s:NetrwOptionsRestore("s:")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004946 let curdir= b:netrw_curdir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004947 if !exists("s:didsplit")
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004948" " call Decho("edit-a-file: s:didsplit does not exist; g:netrw_browse_split=".string(g:netrw_browse_split)." win#".winnr()." g:netrw_chgwin=".g:netrw_chgwin",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004949 if type(g:netrw_browse_split) == 3
4950 " open file in server
4951 " Note that g:netrw_browse_split is a List: [servername,tabnr,winnr]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004952" call Decho("edit-a-file: open file in server",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004953 call s:NetrwServerEdit(a:islocal,dirname)
4954" call Dret("s:NetrwBrowseChgDir")
4955 return
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004956
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004957 elseif g:netrw_browse_split == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01004958 " horizontally splitting the window first
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004959" call Decho("edit-a-file: horizontally splitting window prior to edit",'~'.expand("<slnum>"))
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004960 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
4961 exe "keepalt ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004962 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004963 keepalt wincmd _
Bram Moolenaar5c736222010-01-06 20:54:52 +01004964 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004965 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004966
Bram Moolenaar446cb832008-06-24 21:56:24 +00004967 elseif g:netrw_browse_split == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01004968 " vertically splitting the window first
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004969" call Decho("edit-a-file: vertically splitting window prior to edit",'~'.expand("<slnum>"))
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004970 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
4971 exe "keepalt ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004972 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004973 keepalt wincmd |
Bram Moolenaar5c736222010-01-06 20:54:52 +01004974 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004975 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004976
Bram Moolenaar446cb832008-06-24 21:56:24 +00004977 elseif g:netrw_browse_split == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004978 " open file in new tab
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004979" call Decho("edit-a-file: opening new tab prior to edit",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02004980 keepalt tabnew
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004981 if !exists("b:netrw_curdir")
4982 let b:netrw_curdir= getcwd()
4983 endif
4984 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004985
Bram Moolenaar446cb832008-06-24 21:56:24 +00004986 elseif g:netrw_browse_split == 4
Bram Moolenaar97d62492012-11-15 21:28:22 +01004987 " act like "P" (ie. open previous window)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004988" call Decho("edit-a-file: use previous window for edit",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004989 if s:NetrwPrevWinOpen(2) == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004990 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004991" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004992 return
4993 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02004994 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02004995
Bram Moolenaar9964e462007-05-05 17:54:07 +00004996 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004997 " handling a file, didn't split, so remove menu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004998" call Decho("edit-a-file: handling a file+didn't split, so remove menu",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004999 call s:NetrwMenu(0)
5000 " optional change to window
5001 if g:netrw_chgwin >= 1
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005002" call Decho("edit-a-file: changing window to #".g:netrw_chgwin.": (due to g:netrw_chgwin)",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02005003 if winnr("$")+1 == g:netrw_chgwin
5004 " if g:netrw_chgwin is set to one more than the last window, then
5005 " vertically split the last window to make that window available.
5006 let curwin= winnr()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005007 exe "NetrwKeepj keepalt ".winnr("$")."wincmd w"
Bram Moolenaar13600302014-05-22 18:26:40 +02005008 vs
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005009 exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd ".curwin
Bram Moolenaar13600302014-05-22 18:26:40 +02005010 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005011 exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00005012 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005013 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00005014 endif
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005015
Bram Moolenaar9964e462007-05-05 17:54:07 +00005016 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005017
Bram Moolenaar446cb832008-06-24 21:56:24 +00005018 " the point where netrw actually edits the (local) file
5019 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
Bram Moolenaar71badf92023-04-22 22:40:14 +01005020 " use keepalt to support :e # to return to a directory listing
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005021 if !&mod
5022 " if e the new file would fail due to &mod, then don't change any of the flags
5023 let dolockout= 1
5024 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005025 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005026" call Decho("edit-a-file: edit local file: exe e! ".fnameescape(dirname),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01005027 " some like c-^ to return to the last edited file
5028 " others like c-^ to return to the netrw buffer
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005029 " Apr 30, 2020: used to have e! here. That can cause loss of a modified file,
5030 " so emit error E37 instead.
Bram Moolenaar71badf92023-04-22 22:40:14 +01005031 call s:NetrwEditFile("e","",dirname)
5032" call Decho("edit-a-file: after e ".dirname.": hidden=".&hidden." bufhidden<".&bufhidden."> mod=".&mod,'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005033 " COMBAK -- cuc cul related
5034 call s:NetrwCursor(1)
Bram Moolenaar13600302014-05-22 18:26:40 +02005035 if &hidden || &bufhidden == "hide"
5036 " file came from vim's hidden storage. Don't "restore" options with it.
5037 let dorestore= 0
5038 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00005039 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005040" call Decho("edit-a-file: remote file: NetrwBrowse will edit it",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00005041 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005042
5043 " handle g:Netrw_funcref -- call external-to-netrw functions
5044 " This code will handle g:Netrw_funcref as an individual function reference
5045 " or as a list of function references. It will ignore anything that's not
5046 " a function reference. See :help Funcref for information about function references.
5047 if exists("g:Netrw_funcref")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005048" call Decho("edit-a-file: handle optional Funcrefs",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005049 if type(g:Netrw_funcref) == 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005050" call Decho("edit-a-file: handling a g:Netrw_funcref",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005051 NetrwKeepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005052 elseif type(g:Netrw_funcref) == 3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005053" call Decho("edit-a-file: handling a list of g:Netrw_funcrefs",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005054 for Fncref in g:Netrw_funcref
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005055 if type(Fncref) == 2
5056 NetrwKeepj call Fncref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005057 endif
5058 endfor
5059 endif
5060 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005061 endif
5062
5063 elseif newdir =~ '^/'
Bram Moolenaar97d62492012-11-15 21:28:22 +01005064 " ----------------------------------------------------
5065 " NetrwBrowseChgDir: just go to the new directory spec {{{3
5066 " ----------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005067" call Decho('goto-newdir: case "just go to new directory spec": newdir<'.newdir.'>','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005068 let dirname = newdir
5069 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02005070 NetrwKeepj call s:NetrwOptionsRestore("s:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005071 norm! m`
Bram Moolenaar446cb832008-06-24 21:56:24 +00005072
5073 elseif newdir == './'
Bram Moolenaar97d62492012-11-15 21:28:22 +01005074 " ---------------------------------------------
5075 " NetrwBrowseChgDir: refresh the directory list {{{3
5076 " ---------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02005077" call Decho('(s:NetrwBrowseChgDir)refresh-dirlist: case "refresh directory listing": newdir == "./"','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005078 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005079 norm! m`
Bram Moolenaar446cb832008-06-24 21:56:24 +00005080
5081 elseif newdir == '../'
Bram Moolenaar97d62492012-11-15 21:28:22 +01005082 " --------------------------------------
5083 " NetrwBrowseChgDir: go up one directory {{{3
5084 " --------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02005085" call Decho('(s:NetrwBrowseChgDir)go-up: case "go up one directory": newdir == "../"','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005086
5087 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5088 " force a refresh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005089" call Decho("go-up: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
5090" call Decho("go-up: setl noro ma",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005091 setl noro ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005092 NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00005093 endif
5094
5095 if has("amiga")
5096 " amiga
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005097" call Decho('go-up: case "go up one directory": newdir == "../" and amiga','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005098 if a:islocal
5099 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
5100 let dirname= substitute(dirname,'/$','','')
5101 else
5102 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
5103 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005104" call Decho("go-up: amiga: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005105
Bram Moolenaar8d043172014-01-23 14:24:41 +01005106 elseif !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
5107 " windows
5108 if a:islocal
5109 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
5110 if dirname == ""
5111 let dirname= '/'
5112 endif
5113 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005114 let dirname= substitute(dirname,'^\(\a\{3,}://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
Bram Moolenaar8d043172014-01-23 14:24:41 +01005115 endif
5116 if dirname =~ '^\a:$'
5117 let dirname= dirname.'/'
5118 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005119" call Decho("go-up: windows: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01005120
Bram Moolenaar446cb832008-06-24 21:56:24 +00005121 else
5122 " unix or cygwin
Bram Moolenaar85850f32019-07-19 22:05:51 +02005123" call Decho('(s:NetrwBrowseChgDir)go-up: case "go up one directory": newdir == "../" and unix or cygwin','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005124 if a:islocal
5125 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
5126 if dirname == ""
5127 let dirname= '/'
5128 endif
5129 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005130 let dirname= substitute(dirname,'^\(\a\{3,}://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005131 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005132" call Decho("go-up: unix: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005133 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005134 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02005135 norm! m`
Bram Moolenaar446cb832008-06-24 21:56:24 +00005136
5137 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005138 " --------------------------------------
5139 " NetrwBrowseChgDir: Handle Tree Listing {{{3
5140 " --------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02005141" call Decho('(s:NetrwBrowseChgDir)tree-list: case liststyle is TREELIST and w:netrw_treedict exists','~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005142 " force a refresh (for TREELIST, NetrwTreeDir() will force the refresh)
5143" call Decho("tree-list: setl noro ma",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005144 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00005145 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005146" call Decho("tree-list: clear buffer<".expand("%")."> with :%d (force refresh)",'~'.expand("<slnum>"))
5147 NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00005148 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005149 let treedir = s:NetrwTreeDir(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005150" call Decho("tree-list: treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02005151 let s:treecurpos = winsaveview()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005152 let haskey = 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005153" call Decho("tree-list: w:netrw_treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005154
5155 " search treedict for tree dir as-is
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005156" call Decho("tree-list: search treedict for tree dir as-is",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005157 if has_key(w:netrw_treedict,treedir)
Bram Moolenaar85850f32019-07-19 22:05:51 +02005158" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'> : found it!','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005159 let haskey= 1
5160 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02005161" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'> : not found','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005162 endif
5163
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005164 " search treedict for treedir with a [/@] appended
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005165" call Decho("tree-list: search treedict for treedir with a [/@] appended",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005166 if !haskey && treedir !~ '[/@]$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005167 if has_key(w:netrw_treedict,treedir."/")
5168 let treedir= treedir."/"
Bram Moolenaar85850f32019-07-19 22:05:51 +02005169" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched.for treedir<'.treedir.'> found it!','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005170 let haskey = 1
5171 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02005172" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'/> : not found','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005173 endif
5174 endif
5175
5176 " search treedict for treedir with any trailing / elided
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005177" call Decho("tree-list: search treedict for treedir with any trailing / elided",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005178 if !haskey && treedir =~ '/$'
5179 let treedir= substitute(treedir,'/$','','')
5180 if has_key(w:netrw_treedict,treedir)
Bram Moolenaar85850f32019-07-19 22:05:51 +02005181" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched.for treedir<'.treedir.'> found it!','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005182 let haskey = 1
5183 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02005184" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'> : not found','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005185 endif
5186 endif
5187
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005188" call Decho("haskey=".haskey,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005189 if haskey
5190 " close tree listing for selected subdirectory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005191" call Decho("tree-list: closing selected subdirectory<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005192 call remove(w:netrw_treedict,treedir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005193" call Decho("tree-list: removed entry<".treedir."> from treedict",'~'.expand("<slnum>"))
5194" call Decho("tree-list: yielding treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005195 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00005196 else
5197 " go down one directory
5198 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005199" call Decho("tree-list: go down one dir: treedir<".treedir.">",'~'.expand("<slnum>"))
5200" call Decho("tree-list: ... : dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005201 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005202 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005203" call Decho("setting s:treeforceredraw to true",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005204 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005205
5206 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01005207 " ----------------------------------------
5208 " NetrwBrowseChgDir: Go down one directory {{{3
5209 " ----------------------------------------
5210 let dirname = s:ComposePath(dirname,newdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005211" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005212 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02005213 norm! m`
Bram Moolenaar9964e462007-05-05 17:54:07 +00005214 endif
5215
Bram Moolenaar97d62492012-11-15 21:28:22 +01005216 " --------------------------------------
5217 " NetrwBrowseChgDir: Restore and Cleanup {{{3
5218 " --------------------------------------
Bram Moolenaar13600302014-05-22 18:26:40 +02005219 if dorestore
5220 " dorestore is zero'd when a local file was hidden or bufhidden;
5221 " in such a case, we want to keep whatever settings it may have.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005222" call Decho("doing option restore (dorestore=".dorestore.")",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02005223 NetrwKeepj call s:NetrwOptionsRestore("s:")
Bram Moolenaar13600302014-05-22 18:26:40 +02005224" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005225" call Decho("skipping option restore (dorestore==0): hidden=".&hidden." bufhidden=".&bufhidden." mod=".&mod,'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02005226 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02005227 if dolockout && dorestore
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005228" call Decho("restore: filewritable(dirname<".dirname.">)=".filewritable(dirname),'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005229 if filewritable(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005230" call Decho("restore: doing modification lockout settings: ma nomod noro",'~'.expand("<slnum>"))
5231" call Decho("restore: setl ma nomod noro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02005232 setl ma noro nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005233" call Decho("restore: ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005234 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005235" call Decho("restore: doing modification lockout settings: ma nomod ro",'~'.expand("<slnum>"))
5236" call Decho("restore: setl ma nomod noro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02005237 setl ma ro nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005238" call Decho("restore: ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005239 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00005240 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005241 call s:RestorePosn(s:netrw_posn)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005242 let @@= ykeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00005243
Bram Moolenaar446cb832008-06-24 21:56:24 +00005244" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
5245 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00005246endfun
5247
5248" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01005249" s:NetrwBrowseUpDir: implements the "-" mappings {{{2
5250" for thin, long, and wide: cursor placed just after banner
5251" for tree, keeps cursor on current filename
5252fun! s:NetrwBrowseUpDir(islocal)
5253" call Dfunc("s:NetrwBrowseUpDir(islocal=".a:islocal.")")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005254 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt-1
5255 " this test needed because occasionally this function seems to be incorrectly called
5256 " when multiple leftmouse clicks are taken when atop the one line help in the banner.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005257 " I'm allowing the very bottom line to permit a "-" exit so that one may escape empty
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005258 " directories.
5259" call Dret("s:NetrwBrowseUpDir : cursor not in file area")
5260 return
5261 endif
5262
Bram Moolenaara6878372014-03-22 21:02:50 +01005263 norm! 0
5264 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005265" call Decho("case: treestyle",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005266 let curline= getline(".")
5267 let swwline= winline() - 1
5268 if exists("w:netrw_treetop")
5269 let b:netrw_curdir= w:netrw_treetop
Bram Moolenaar85850f32019-07-19 22:05:51 +02005270 elseif exists("b:netrw_curdir")
5271 let w:netrw_treetop= b:netrw_curdir
5272 else
5273 let w:netrw_treetop= getcwd()
5274 let b:netrw_curdir = w:netrw_treetop
Bram Moolenaara6878372014-03-22 21:02:50 +01005275 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005276 let curfile = getline(".")
5277 let curpath = s:NetrwTreePath(w:netrw_treetop)
Bram Moolenaara6878372014-03-22 21:02:50 +01005278 if a:islocal
5279 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,'../'))
5280 else
5281 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
5282 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005283" call Decho("looking for curfile<^".s:treedepthstring.curfile.">",'~'.expand("<slnum>"))
5284" call Decho("having curpath<".curpath.">",'~'.expand("<slnum>"))
5285 if w:netrw_treetop == '/'
5286 keepj call search('^\M'.curfile,"w")
5287 elseif curfile == '../'
5288 keepj call search('^\M'.curfile,"wb")
5289 else
5290" call Decho("search(^\\M".s:treedepthstring.curfile.") backwards"))
5291 while 1
5292 keepj call search('^\M'.s:treedepthstring.curfile,"wb")
5293 let treepath= s:NetrwTreePath(w:netrw_treetop)
5294" call Decho("..current treepath<".treepath.">",'~'.expand("<slnum>"))
5295 if treepath == curpath
5296 break
5297 endif
5298 endwhile
Bram Moolenaara6878372014-03-22 21:02:50 +01005299 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005300
Bram Moolenaara6878372014-03-22 21:02:50 +01005301 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005302" call Decho("case: not treestyle",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02005303 call s:SavePosn(s:netrw_posn)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005304 if exists("b:netrw_curdir")
5305 let curdir= b:netrw_curdir
5306 else
5307 let curdir= expand(getcwd())
5308 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01005309 if a:islocal
5310 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,'../'))
5311 else
5312 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
5313 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005314 call s:RestorePosn(s:netrw_posn)
5315 let curdir= substitute(curdir,'^.*[\/]','','')
5316 call search('\<'.curdir.'/','wc')
Bram Moolenaara6878372014-03-22 21:02:50 +01005317 endif
5318" call Dret("s:NetrwBrowseUpDir")
5319endfun
5320
5321" ---------------------------------------------------------------------
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005322" netrw#BrowseX: (implements "x" and "gx") executes a special "viewer" script or program for the {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01005323" given filename; typically this means given their extension.
5324" 0=local, 1=remote
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005325fun! netrw#BrowseX(fname,remote)
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005326 let use_ctrlo= 1
Bram Moolenaar91359012019-11-30 17:57:03 +01005327" call Dfunc("netrw#BrowseX(fname<".a:fname."> remote=".a:remote.") implements x and gx maps")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005328
Bram Moolenaar91359012019-11-30 17:57:03 +01005329 if a:remote == 0 && isdirectory(a:fname)
5330 " if its really just a local directory, then do a "gf" instead
5331" call Decho("remote≡0 and a:fname<".a:fname."> ".(isdirectory(a:fname)? "is a directory" : "is not a directory"),'~'.expand("<slnum>"))
Bram Moolenaar29634562020-01-09 21:46:04 +01005332" call Decho("..appears to be a local directory; using e ".a:fname." instead",'~'.expand("<slnum>"))
5333 exe "e ".a:fname
Bram Moolenaar91359012019-11-30 17:57:03 +01005334" call Dret("netrw#BrowseX")
5335 return
5336 elseif a:remote == 1 && a:fname !~ '^https\=:' && a:fname =~ '/$'
5337 " remote directory, not a webpage access, looks like an attempt to do a directory listing
5338" call Decho("remote≡1 and a:fname<".a:fname.">",'~'.expand("<slnum>"))
5339" call Decho("..and fname ".((a:fname =~ '^https\=:')? 'matches' : 'does not match').'^https\=:','~'.expand("<slnum>"))
5340" call Decho("..and fname ".((a:fname =~ '/$')? 'matches' : 'does not match').' /$','~'.expand("<slnum>"))
5341" call Decho("..appears to be a remote directory listing request; using gf instead",'~'.expand("<slnum>"))
5342 norm! gf
5343" call Dret("netrw#BrowseX")
5344 return
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005345 endif
Bram Moolenaar91359012019-11-30 17:57:03 +01005346" call Decho("not a local file nor a webpage request",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005347
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005348 if exists("g:netrw_browsex_viewer") && exists("g:netrw_browsex_support_remote") && !g:netrw_browsex_support_remote
5349 let remote = a:remote
5350 else
5351 let remote = 0
5352 endif
5353
Bram Moolenaar97d62492012-11-15 21:28:22 +01005354 let ykeep = @@
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005355 let screenposn = winsaveview()
Bram Moolenaar46973992017-12-14 19:56:46 +01005356" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005357
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005358 " need to save and restore aw setting as gx can invoke this function from non-netrw buffers
5359 let awkeep = &aw
5360 set noaw
5361
Bram Moolenaar5c736222010-01-06 20:54:52 +01005362 " special core dump handler
5363 if a:fname =~ '/core\(\.\d\+\)\=$'
5364 if exists("g:Netrw_corehandler")
5365 if type(g:Netrw_corehandler) == 2
5366 " g:Netrw_corehandler is a function reference (see :help Funcref)
Bram Moolenaar46973992017-12-14 19:56:46 +01005367" call Decho("g:Netrw_corehandler is a funcref",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005368 call g:Netrw_corehandler(s:NetrwFile(a:fname))
Bram Moolenaarff034192013-04-24 18:51:19 +02005369 elseif type(g:Netrw_corehandler) == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01005370 " g:Netrw_corehandler is a List of function references (see :help Funcref)
Bram Moolenaar46973992017-12-14 19:56:46 +01005371" call Decho("g:Netrw_corehandler is a List",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005372 for Fncref in g:Netrw_corehandler
Bram Moolenaar71badf92023-04-22 22:40:14 +01005373 if type(Fncref) == 2
5374 call Fncref(a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005375 endif
5376 endfor
5377 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005378" call Decho("restoring posn: screenposn<".string(screenposn).">,'~'.expand("<slnum>"))"
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005379 call winrestview(screenposn)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005380 let @@= ykeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005381 let &aw= awkeep
5382" call Dret("netrw#BrowseX : coredump handler invoked")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005383 return
5384 endif
5385 endif
5386
Bram Moolenaar446cb832008-06-24 21:56:24 +00005387 " set up the filename
5388 " (lower case the extension, make a local copy of a remote file)
5389 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
5390 if has("win32") || has("win95") || has("win64") || has("win16")
5391 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00005392 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005393 if exten =~ "[\\/]"
5394 let exten= ""
5395 endif
Bram Moolenaar46973992017-12-14 19:56:46 +01005396" call Decho("exten<".exten.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005397
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005398 if remote == 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005399 " create a local copy
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005400" call Decho("remote: remote=".remote.": create a local copy of <".a:fname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02005401 setl bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01005402 call netrw#NetRead(3,a:fname)
5403 " attempt to rename tempfile
5404 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01005405 let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
Bram Moolenaar46973992017-12-14 19:56:46 +01005406" call Decho("basename<".basename.">",'~'.expand("<slnum>"))
5407" call Decho("newname <".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02005408 if s:netrw_tmpfile != newname && newname != ""
5409 if rename(s:netrw_tmpfile,newname) == 0
5410 " renaming succeeded
5411" call Decho("renaming succeeded (tmpfile<".s:netrw_tmpfile."> to <".newname.">)")
5412 let fname= newname
5413 else
5414 " renaming failed
5415" call Decho("renaming failed (tmpfile<".s:netrw_tmpfile."> to <".newname.">)")
5416 let fname= s:netrw_tmpfile
5417 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005418 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005419 let fname= s:netrw_tmpfile
5420 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00005421 else
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005422" call Decho("local: remote=".remote.": handling local copy of <".a:fname.">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005423 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005424 " special ~ handler for local
5425 if fname =~ '^\~' && expand("$HOME") != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005426" call Decho('invoking special ~ handler','~'.expand("<slnum>"))
5427 let fname= s:NetrwFile(substitute(fname,'^\~',expand("$HOME"),''))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005428 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005429 endif
Bram Moolenaar46973992017-12-14 19:56:46 +01005430" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
5431" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005432
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02005433 " set up redirection (avoids browser messages)
5434 " by default, g:netrw_suppress_gx_mesg is true
5435 if g:netrw_suppress_gx_mesg
5436 if &srr =~ "%s"
5437 if (has("win32") || has("win95") || has("win64") || has("win16"))
5438 let redir= substitute(&srr,"%s","nul","")
5439 else
5440 let redir= substitute(&srr,"%s","/dev/null","")
5441 endif
5442 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
5443 let redir= &srr . "nul"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005444 else
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02005445 let redir= &srr . "/dev/null"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005446 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01005447 else
5448 let redir= ""
Bram Moolenaar446cb832008-06-24 21:56:24 +00005449 endif
Bram Moolenaar46973992017-12-14 19:56:46 +01005450" call Decho("set up redirection: redir{".redir."} srr{".&srr."}",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005451
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005452 " extract any viewing options. Assumes that they're set apart by spaces.
Bram Moolenaar446cb832008-06-24 21:56:24 +00005453 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005454" call Decho("extract any viewing options from g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005455 if g:netrw_browsex_viewer =~ '\s'
5456 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
5457 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
5458 let oviewer = ''
5459 let cnt = 1
5460 while !executable(viewer) && viewer != oviewer
5461 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
5462 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
5463 let cnt = cnt + 1
5464 let oviewer = viewer
Bram Moolenaar46973992017-12-14 19:56:46 +01005465" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005466 endwhile
5467 else
5468 let viewer = g:netrw_browsex_viewer
5469 let viewopt = ""
5470 endif
Bram Moolenaar46973992017-12-14 19:56:46 +01005471" call Decho("viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005472 endif
5473
5474 " execute the file handler
Bram Moolenaar46973992017-12-14 19:56:46 +01005475" call Decho("execute the file handler (if any)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005476 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005477" call Decho("(netrw#BrowseX) g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005478 let ret= netrwFileHandlers#Invoke(exten,fname)
5479
5480 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005481" call Decho("(netrw#BrowseX) g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005482 call s:NetrwExe("sil !".viewer." ".viewopt.s:ShellEscape(fname,1).redir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005483 let ret= v:shell_error
5484
5485 elseif has("win32") || has("win64")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005486" call Decho("(netrw#BrowseX) win".(has("win32")? "32" : "64"),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005487 if executable("start")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005488 call s:NetrwExe('sil! !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005489 elseif executable("rundll32")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005490 call s:NetrwExe('sil! !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005491 else
5492 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
5493 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005494 let ret= v:shell_error
5495
Bram Moolenaar97d62492012-11-15 21:28:22 +01005496 elseif has("win32unix")
5497 let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005498" call Decho("(netrw#BrowseX) cygwin: winfname<".s:ShellEscape(winfname,1).">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005499 if executable("start")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005500" call Decho("(netrw#BrowseX) win32unix+start",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005501 call s:NetrwExe('sil !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005502 elseif executable("rundll32")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005503" call Decho("(netrw#BrowseX) win32unix+rundll32",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005504 call s:NetrwExe('sil !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005505 elseif executable("cygstart")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005506" call Decho("(netrw#BrowseX) win32unix+cygstart",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005507 call s:NetrwExe('sil !cygstart '.s:ShellEscape(fname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005508 else
5509 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
5510 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005511 let ret= v:shell_error
5512
Bram Moolenaar85850f32019-07-19 22:05:51 +02005513 elseif has("unix") && $DESKTOP_SESSION == "mate" && executable("atril")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005514" call Decho("(netrw#BrowseX) unix and atril",'~'.expand("<slnum>"))
5515 if a:fname =~ '^https\=://'
5516 " atril does not appear to understand how to handle html -- so use gvim to edit the document
5517 let use_ctrlo= 0
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005518" call Decho("fname<".fname.">")
5519" call Decho("a:fname<".a:fname.">")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005520 call s:NetrwExe("sil! !gvim ".fname.' -c "keepj keepalt file '.fnameescape(a:fname).'"')
5521
5522 else
5523 call s:NetrwExe("sil !atril ".s:ShellEscape(fname,1).redir)
5524 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005525 let ret= v:shell_error
5526
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005527 elseif has("unix") && executable("kfmclient") && s:CheckIfKde()
5528" call Decho("(netrw#BrowseX) unix and kfmclient",'~'.expand("<slnum>"))
5529 call s:NetrwExe("sil !kfmclient exec ".s:ShellEscape(fname,1)." ".redir)
5530 let ret= v:shell_error
5531
5532 elseif has("unix") && executable("exo-open") && executable("xdg-open") && executable("setsid")
5533" call Decho("(netrw#BrowseX) unix, exo-open, xdg-open",'~'.expand("<slnum>"))
5534 call s:NetrwExe("sil !setsid xdg-open ".s:ShellEscape(fname,1).redir.'&')
5535 let ret= v:shell_error
5536
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005537 elseif has("unix") && executable("xdg-open")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005538" call Decho("(netrw#BrowseX) unix and xdg-open",'~'.expand("<slnum>"))
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005539 call s:NetrwExe("sil !xdg-open ".s:ShellEscape(fname,1).redir.'&')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005540 let ret= v:shell_error
5541
5542 elseif has("macunix") && executable("open")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005543" call Decho("(netrw#BrowseX) macunix and open",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005544 call s:NetrwExe("sil !open ".s:ShellEscape(fname,1)." ".redir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005545 let ret= v:shell_error
5546
5547 else
5548 " netrwFileHandlers#Invoke() always returns 0
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005549" call Decho("(netrw#BrowseX) use netrwFileHandlers",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005550 let ret= netrwFileHandlers#Invoke(exten,fname)
5551 endif
5552
5553 " if unsuccessful, attempt netrwFileHandlers#Invoke()
5554 if ret
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005555" call Decho("(netrw#BrowseX) ret=".ret," indicates unsuccessful thus far",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005556 let ret= netrwFileHandlers#Invoke(exten,fname)
5557 endif
5558
Bram Moolenaarc236c162008-07-13 17:41:49 +00005559 " restoring redraw! after external file handlers
5560 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00005561
5562 " cleanup: remove temporary file,
5563 " delete current buffer if success with handler,
5564 " return to prior buffer (directory listing)
5565 " Feb 12, 2008: had to de-activiate removal of
5566 " temporary file because it wasn't getting seen.
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005567" if remote == 1 && fname != a:fname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005568"" call Decho("deleting temporary file<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005569" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005570" endif
5571
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005572 if remote == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02005573 setl bh=delete bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00005574 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02005575 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00005576 endif
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01005577 if use_ctrlo
5578 exe "sil! NetrwKeepj norm! \<c-o>"
5579 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005580 endif
Bram Moolenaar46973992017-12-14 19:56:46 +01005581" call Decho("restoring posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005582 call winrestview(screenposn)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005583 let @@ = ykeep
5584 let &aw= awkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005585
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005586" call Dret("netrw#BrowseX")
5587endfun
5588
5589" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02005590" netrw#GX: gets word under cursor for gx support {{{2
5591" See also: netrw#BrowseXVis
5592" netrw#BrowseX
5593fun! netrw#GX()
5594" call Dfunc("netrw#GX()")
5595 if &ft == "netrw"
5596 let fname= s:NetrwGetWord()
5597 else
5598 let fname= expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>'))
5599 endif
5600" call Dret("netrw#GX <".fname.">")
5601 return fname
5602endfun
5603
5604" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005605" netrw#BrowseXVis: used by gx in visual mode to select a file for browsing {{{2
5606fun! netrw#BrowseXVis()
5607" call Dfunc("netrw#BrowseXVis()")
Bram Moolenaar91359012019-11-30 17:57:03 +01005608 let akeep = @a
5609 norm! gv"ay
5610 let gxfile= @a
5611 let @a = akeep
5612 call netrw#BrowseX(gxfile,netrw#CheckIfRemote(gxfile))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005613" call Dret("netrw#BrowseXVis")
5614endfun
5615
5616" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02005617" s:NetrwBufRename: renames a buffer without the side effect of retaining an unlisted buffer having the old name {{{2
5618" Using the file command on a "[No Name]" buffer does not seem to cause the old "[No Name]" buffer
5619" to become an unlisted buffer, so in that case don't bwipe it.
5620fun! s:NetrwBufRename(newname)
5621" call Dfunc("s:NetrwBufRename(newname<".a:newname.">) buf(%)#".bufnr("%")."<".bufname(bufnr("%")).">")
5622" call Dredir("ls!","s:NetrwBufRename (before rename)")
5623 let oldbufname= bufname(bufnr("%"))
5624" call Decho("buf#".bufnr("%").": oldbufname<".oldbufname.">",'~'.expand("<slnum>"))
5625
5626 if oldbufname != a:newname
5627" call Decho("do buffer rename: oldbufname<".oldbufname."> ≠ a:newname<".a:newname.">",'~'.expand("<slnum>"))
5628 let b:junk= 1
5629" call Decho("rename buffer: sil! keepj keepalt file ".fnameescape(a:newname),'~'.expand("<slnum>"))
5630 exe 'sil! keepj keepalt file '.fnameescape(a:newname)
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005631" call Dredir("ls!","s:NetrwBufRename (before bwipe)~".expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02005632 let oldbufnr= bufnr(oldbufname)
5633" call Decho("oldbufname<".oldbufname."> oldbufnr#".oldbufnr,'~'.expand("<slnum>"))
5634" call Decho("bufnr(%)=".bufnr("%"),'~'.expand("<slnum>"))
5635 if oldbufname != "" && oldbufnr != -1 && oldbufnr != bufnr("%")
5636" call Decho("bwipe ".oldbufnr,'~'.expand("<slnum>"))
5637 exe "bwipe! ".oldbufnr
5638" else " Decho
5639" call Decho("did *not* bwipe buf#".oldbufnr,'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02005640" call Decho("..reason: if oldbufname<".oldbufname."> is empty",'~'.expand("<slnum>"))"
5641" call Decho("..reason: if oldbufnr#".oldbufnr." is -1",'~'.expand("<slnum>"))"
5642" call Decho("..reason: if oldbufnr#".oldbufnr." != bufnr(%)#".bufnr("%"),'~'.expand("<slnum>"))"
Bram Moolenaar85850f32019-07-19 22:05:51 +02005643 endif
5644" call Dredir("ls!","s:NetrwBufRename (after rename)")
5645" else " Decho
5646" call Decho("oldbufname<".oldbufname."> == a:newname: did *not* rename",'~'.expand("<slnum>"))
5647 endif
5648
5649" call Dret("s:NetrwBufRename : buf#".bufnr("%").": oldname<".oldbufname."> newname<".a:newname."> expand(%)<".expand("%").">")
5650endfun
5651
5652" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005653" netrw#CheckIfRemote: returns 1 if current file looks like an url, 0 else {{{2
Bram Moolenaar85850f32019-07-19 22:05:51 +02005654fun! netrw#CheckIfRemote(...)
5655" call Dfunc("netrw#CheckIfRemote() a:0=".a:0)
5656 if a:0 > 0
5657 let curfile= a:1
5658 else
5659 let curfile= expand("%")
5660 endif
5661" call Decho("curfile<".curfile.">")
5662 if curfile =~ '^\a\{3,}://'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005663" call Dret("netrw#CheckIfRemote 1")
5664 return 1
5665 else
5666" call Dret("netrw#CheckIfRemote 0")
5667 return 0
5668 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00005669endfun
5670
5671" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005672" s:NetrwChgPerm: (implements "gp") change file permission {{{2
5673fun! s:NetrwChgPerm(islocal,curdir)
5674" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005675 let ykeep = @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01005676 call inputsave()
5677 let newperm= input("Enter new permission: ")
5678 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005679 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',s:ShellEscape(expand("<cfile>")),'')
5680 let chgperm= substitute(chgperm,'\<PERM\>',s:ShellEscape(newperm),'')
5681" call Decho("chgperm<".chgperm.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005682 call system(chgperm)
5683 if v:shell_error != 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005684 NetrwKeepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005685 endif
5686 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005687 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005688 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005689 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01005690" call Dret("s:NetrwChgPerm")
5691endfun
5692
5693" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005694" s:CheckIfKde: checks if kdeinit is running {{{2
5695" Returns 0: kdeinit not running
5696" 1: kdeinit is running
5697fun! s:CheckIfKde()
5698" call Dfunc("s:CheckIfKde()")
5699 " seems kde systems often have gnome-open due to dependencies, even though
5700 " gnome-open's subsidiary display tools are largely absent. Kde systems
5701 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
5702 if !exists("s:haskdeinit")
5703 if has("unix") && executable("ps") && !has("win32unix")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005704 let s:haskdeinit= system("ps -e") =~ '\<kdeinit'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005705 if v:shell_error
5706 let s:haskdeinit = 0
5707 endif
5708 else
5709 let s:haskdeinit= 0
5710 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005711" call Decho("setting s:haskdeinit=".s:haskdeinit,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005712 endif
5713
5714" call Dret("s:CheckIfKde ".s:haskdeinit)
5715 return s:haskdeinit
5716endfun
5717
5718" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005719" s:NetrwClearExplore: clear explore variables (if any) {{{2
5720fun! s:NetrwClearExplore()
5721" call Dfunc("s:NetrwClearExplore()")
5722 2match none
5723 if exists("s:explore_match") |unlet s:explore_match |endif
5724 if exists("s:explore_indx") |unlet s:explore_indx |endif
5725 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
5726 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
5727 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
5728 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
5729 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
5730 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
5731 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
5732" redraw!
5733 echo " "
5734 echo " "
5735" call Dret("s:NetrwClearExplore")
5736endfun
5737
5738" ---------------------------------------------------------------------
Bram Moolenaar71badf92023-04-22 22:40:14 +01005739" s:NetrwEditBuf: decides whether or not to use keepalt to edit a buffer {{{2
5740fun! s:NetrwEditBuf(bufnum)
5741" call Dfunc("s:NetrwEditBuf(fname<".a:bufnum.">)")
5742 if exists("g:netrw_altfile") && g:netrw_altfile && &ft == "netrw"
5743" call Decho("exe sil! NetrwKeepj keepalt noswapfile b ".fnameescape(a:bufnum))
5744 exe "sil! NetrwKeepj keepalt noswapfile b ".fnameescape(a:bufnum)
5745 else
5746" call Decho("exe sil! NetrwKeepj noswapfile b ".fnameescape(a:bufnum))
Bram Moolenaarb7398fe2023-05-14 18:50:25 +01005747 exe "sil! NetrwKeepj noswapfile b ".fnameescape(a:bufnum)
Bram Moolenaar71badf92023-04-22 22:40:14 +01005748 endif
5749" call Dret("s:NetrwEditBuf")
5750endfun
5751
5752" ---------------------------------------------------------------------
5753" s:NetrwEditFile: decides whether or not to use keepalt to edit a file {{{2
5754" NetrwKeepj [keepalt] <OPT> <CMD> <FILENAME>
5755fun! s:NetrwEditFile(cmd,opt,fname)
5756" call Dfunc("s:NetrwEditFile(cmd<".a:cmd.">,opt<".a:opt.">,fname<".a:fname.">) ft<".&ft.">")
5757 if exists("g:netrw_altfile") && g:netrw_altfile && &ft == "netrw"
5758" call Decho("exe NetrwKeepj keepalt ".a:opt." ".a:cmd." ".fnameescape(a:fname))
5759 exe "NetrwKeepj keepalt ".a:opt." ".a:cmd." ".fnameescape(a:fname)
5760 else
5761" call Decho("exe NetrwKeepj ".a:opt." ".a:cmd." ".fnameescape(a:fname))
5762 exe "NetrwKeepj ".a:opt." ".a:cmd." ".fnameescape(a:fname)
5763 endif
5764" call Dret("s:NetrwEditFile")
5765endfun
5766
5767" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005768" s:NetrwExploreListUniq: {{{2
5769fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02005770" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005771
5772 " this assumes that the list is already sorted
5773 let newexplist= []
5774 for member in a:explist
5775 if !exists("uniqmember") || member != uniqmember
5776 let uniqmember = member
5777 let newexplist = newexplist + [ member ]
5778 endif
5779 endfor
5780
Bram Moolenaar15146672011-10-20 22:22:38 +02005781" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005782 return newexplist
5783endfun
5784
5785" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02005786" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
5787fun! s:NetrwForceChgDir(islocal,newdir)
5788" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005789 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02005790 if a:newdir !~ '/$'
5791 " ok, looks like force is needed to get directory-style treatment
5792 if a:newdir =~ '@$'
5793 let newdir= substitute(a:newdir,'@$','/','')
5794 elseif a:newdir =~ '[*=|\\]$'
5795 let newdir= substitute(a:newdir,'.$','/','')
5796 else
5797 let newdir= a:newdir.'/'
5798 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005799" call Decho("adjusting newdir<".newdir."> due to gd",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02005800 else
5801 " should already be getting treatment as a directory
5802 let newdir= a:newdir
5803 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005804 let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005805 call s:NetrwBrowse(a:islocal,newdir)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005806 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02005807" call Dret("s:NetrwForceChgDir")
5808endfun
5809
5810" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005811" s:NetrwGlob: does glob() if local, remote listing otherwise {{{2
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02005812" direntry: this is the name of the directory. Will be fnameescape'd to prevent wildcard handling by glob()
5813" expr : this is the expression to follow the directory. Will use s:ComposePath()
5814" pare =1: remove the current directory from the resulting glob() filelist
5815" =0: leave the current directory in the resulting glob() filelist
5816fun! s:NetrwGlob(direntry,expr,pare)
5817" call Dfunc("s:NetrwGlob(direntry<".a:direntry."> expr<".a:expr."> pare=".a:pare.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005818 if netrw#CheckIfRemote()
5819 keepalt 1sp
5820 keepalt enew
5821 let keep_liststyle = w:netrw_liststyle
5822 let w:netrw_liststyle = s:THINLIST
5823 if s:NetrwRemoteListing() == 0
5824 keepj keepalt %s@/@@
5825 let filelist= getline(1,$)
5826 q!
5827 else
5828 " remote listing error -- leave treedict unchanged
5829 let filelist= w:netrw_treedict[a:direntry]
5830 endif
5831 let w:netrw_liststyle= keep_liststyle
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02005832 elseif v:version > 704 || (v:version == 704 && has("patch656"))
5833 let filelist= glob(s:ComposePath(fnameescape(a:direntry),a:expr),0,1,1)
5834 if a:pare
5835 let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
5836 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005837 else
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02005838 let filelist= glob(s:ComposePath(fnameescape(a:direntry),a:expr),0,1)
5839 if a:pare
5840 let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
5841 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005842 endif
5843" call Dret("s:NetrwGlob ".string(filelist))
5844 return filelist
5845endfun
5846
5847" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02005848" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
5849fun! s:NetrwForceFile(islocal,newfile)
Bram Moolenaarff034192013-04-24 18:51:19 +02005850" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005851 if a:newfile =~ '[/@*=|\\]$'
5852 let newfile= substitute(a:newfile,'.$','','')
5853 else
5854 let newfile= a:newfile
5855 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005856 if a:islocal
5857 call s:NetrwBrowseChgDir(a:islocal,newfile)
5858 else
5859 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
5860 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005861" call Dret("s:NetrwForceFile")
5862endfun
5863
5864" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005865" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
5866" and switches the hiding mode. The actual hiding is done by
5867" s:NetrwListHide().
5868" g:netrw_hide= 0: show all
5869" 1: show not-hidden files
5870" 2: show hidden files only
5871fun! s:NetrwHide(islocal)
5872" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005873 let ykeep= @@
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005874 let svpos= winsaveview()
5875" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005876
5877 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005878" call Decho("((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">",'~'.expand("<slnum>"))
5879" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005880
5881 " hide the files in the markfile list
5882 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005883" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." l:isk=".&l:isk,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005884 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
5885 " remove fname from hiding list
5886 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
5887 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
5888 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005889" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005890 else
5891 " append fname to hiding list
5892 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
5893 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
5894 else
5895 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
5896 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005897" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005898 endif
5899 endfor
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005900 NetrwKeepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005901 let g:netrw_hide= 1
5902
5903 else
5904
5905 " switch between show-all/show-not-hidden/show-hidden
5906 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005907 exe "NetrwKeepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005908 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005909 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005910 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005911" call Dret("NetrwHide")
5912 return
5913 endif
5914 endif
5915
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005916 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005917" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5918 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005919 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005920" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00005921endfun
5922
5923" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005924" s:NetrwHideEdit: allows user to edit the file/directory hiding list {{{2
5925fun! s:NetrwHideEdit(islocal)
5926" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
5927
5928 let ykeep= @@
5929 " save current cursor position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005930 let svpos= winsaveview()
5931" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005932
5933 " get new hiding list from user
5934 call inputsave()
5935 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
5936 call inputrestore()
5937 let g:netrw_list_hide= newhide
5938" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
5939
5940 " refresh the listing
5941 sil NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
5942
5943 " restore cursor position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005944" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5945 call winrestview(svpos)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005946 let @@= ykeep
5947
5948" call Dret("NetrwHideEdit")
5949endfun
5950
5951" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005952" s:NetrwHidden: invoked by "gh" {{{2
5953fun! s:NetrwHidden(islocal)
5954" call Dfunc("s:NetrwHidden()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005955 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005956 " save current position
Bram Moolenaar85850f32019-07-19 22:05:51 +02005957 let svpos = winsaveview()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005958" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005959
5960 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
Bram Moolenaar85850f32019-07-19 22:05:51 +02005961 " remove .file pattern from hiding list
5962" call Decho("remove .file pattern from hiding list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005963 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01005964 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar85850f32019-07-19 22:05:51 +02005965" call Decho("add .file pattern from hiding list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005966 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
5967 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02005968" call Decho("set .file pattern as hiding list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005969 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
5970 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02005971 if g:netrw_list_hide =~ '^,'
5972 let g:netrw_list_hide= strpart(g:netrw_list_hide,1)
5973 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005974
5975 " refresh screen and return to saved position
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005976 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005977" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5978 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005979 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005980" call Dret("s:NetrwHidden")
5981endfun
5982
5983" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005984" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
5985fun! s:NetrwHome()
5986 if exists("g:netrw_home")
Bram Moolenaar85850f32019-07-19 22:05:51 +02005987 let home= expand(g:netrw_home)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005988 else
5989 " go to vim plugin home
5990 for home in split(&rtp,',') + ['']
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005991 if isdirectory(s:NetrwFile(home)) && filewritable(s:NetrwFile(home)) | break | endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005992 let basehome= substitute(home,'[/\\]\.vim$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005993 if isdirectory(s:NetrwFile(basehome)) && filewritable(s:NetrwFile(basehome))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005994 let home= basehome."/.vim"
5995 break
5996 endif
5997 endfor
5998 if home == ""
5999 " just pick the first directory
6000 let home= substitute(&rtp,',.*$','','')
6001 endif
6002 if (has("win32") || has("win95") || has("win64") || has("win16"))
6003 let home= substitute(home,'/','\\','g')
6004 endif
6005 endif
6006 " insure that the home directory exists
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006007 if g:netrw_dirhistmax > 0 && !isdirectory(s:NetrwFile(home))
Bram Moolenaar85850f32019-07-19 22:05:51 +02006008" call Decho("insure that the home<".home."> directory exists")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006009 if exists("g:netrw_mkdir")
Bram Moolenaar85850f32019-07-19 22:05:51 +02006010" call Decho("call system(".g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)).")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006011 call system(g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006012 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02006013" call Decho("mkdir(".home.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006014 call mkdir(home)
6015 endif
6016 endif
6017 let g:netrw_home= home
6018 return home
6019endfun
6020
6021" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006022" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
6023fun! s:NetrwLeftmouse(islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02006024 if exists("s:netrwdrag")
6025 return
6026 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02006027 if &ft != "netrw"
6028 return
6029 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006030" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006031
Bram Moolenaar97d62492012-11-15 21:28:22 +01006032 let ykeep= @@
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006033 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02006034 while getchar(0) != 0
6035 "clear the input stream
6036 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006037 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006038 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006039 let mouse_lnum = v:mouse_lnum
6040 let wlastline = line('w$')
6041 let lastline = line('$')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006042" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr(),'~'.expand("<slnum>"))
6043" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0),'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006044 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
6045 " appears to be a status bar leftmouse click
Bram Moolenaar97d62492012-11-15 21:28:22 +01006046 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006047" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
6048 return
6049 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006050 " Dec 04, 2013: following test prevents leftmouse selection/deselection of directories and files in treelist mode
Bram Moolenaar8d043172014-01-23 14:24:41 +01006051 " Windows are separated by vertical separator bars - but the mouse seems to be doing what it should when dragging that bar
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006052 " without this test when its disabled.
6053 " May 26, 2014: edit file, :Lex, resize window -- causes refresh. Reinstated a modified test. See if problems develop.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006054" call Decho("v:mouse_col=".v:mouse_col." col#".col('.')." virtcol#".virtcol('.')." col($)#".col("$")." virtcol($)#".virtcol("$"),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006055 if v:mouse_col > virtcol('.')
6056 let @@= ykeep
6057" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
6058 return
6059 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006060
Bram Moolenaar446cb832008-06-24 21:56:24 +00006061 if a:islocal
6062 if exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006063 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006064 endif
6065 else
6066 if exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006067 NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006068 endif
6069 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006070 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006071" call Dret("s:NetrwLeftmouse")
6072endfun
6073
6074" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006075" s:NetrwCLeftmouse: used to select a file/directory for a target {{{2
6076fun! s:NetrwCLeftmouse(islocal)
Bram Moolenaar85850f32019-07-19 22:05:51 +02006077 if &ft != "netrw"
6078 return
6079 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006080" call Dfunc("s:NetrwCLeftmouse(islocal=".a:islocal.")")
6081 call s:NetrwMarkFileTgt(a:islocal)
6082" call Dret("s:NetrwCLeftmouse")
6083endfun
6084
6085" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006086" s:NetrwServerEdit: edit file in a server gvim, usually NETRWSERVER (implements <c-r>){{{2
6087" a:islocal=0 : <c-r> not used, remote
Bram Moolenaar85850f32019-07-19 22:05:51 +02006088" a:islocal=1 : <c-r> not used, local
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006089" a:islocal=2 : <c-r> used, remote
6090" a:islocal=3 : <c-r> used, local
6091fun! s:NetrwServerEdit(islocal,fname)
6092" call Dfunc("s:NetrwServerEdit(islocal=".a:islocal.",fname<".a:fname.">)")
6093 let islocal = a:islocal%2 " =0: remote =1: local
6094 let ctrlr = a:islocal >= 2 " =0: <c-r> not used =1: <c-r> used
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006095" call Decho("islocal=".islocal." ctrlr=".ctrlr,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006096
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006097 if (islocal && isdirectory(s:NetrwFile(a:fname))) || (!islocal && a:fname =~ '/$')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006098 " handle directories in the local window -- not in the remote vim server
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006099 " user must have closed the NETRWSERVER window. Treat as normal editing from netrw.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006100" call Decho("handling directory in client window",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006101 let g:netrw_browse_split= 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006102 if exists("s:netrw_browse_split") && exists("s:netrw_browse_split_".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006103 let g:netrw_browse_split= s:netrw_browse_split_{winnr()}
6104 unlet s:netrw_browse_split_{winnr()}
6105 endif
6106 call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,a:fname))
6107" call Dret("s:NetrwServerEdit")
6108 return
6109 endif
6110
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006111" call Decho("handling file in server window",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006112 if has("clientserver") && executable("gvim")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006113" call Decho("has clientserver and gvim",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006114
6115 if exists("g:netrw_browse_split") && type(g:netrw_browse_split) == 3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006116" call Decho("g:netrw_browse_split=".string(g:netrw_browse_split),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006117 let srvrname = g:netrw_browse_split[0]
6118 let tabnum = g:netrw_browse_split[1]
6119 let winnum = g:netrw_browse_split[2]
6120
6121 if serverlist() !~ '\<'.srvrname.'\>'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006122" call Decho("server not available; ctrlr=".ctrlr,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006123
6124 if !ctrlr
6125 " user must have closed the server window and the user did not use <c-r>, but
6126 " used something like <cr>.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006127" call Decho("user must have closed server AND did not use ctrl-r",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006128 if exists("g:netrw_browse_split")
6129 unlet g:netrw_browse_split
6130 endif
6131 let g:netrw_browse_split= 0
6132 if exists("s:netrw_browse_split_".winnr())
6133 let g:netrw_browse_split= s:netrw_browse_split_{winnr()}
6134 endif
6135 call s:NetrwBrowseChgDir(islocal,a:fname)
6136" call Dret("s:NetrwServerEdit")
6137 return
6138
6139 elseif has("win32") && executable("start")
6140 " start up remote netrw server under windows
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006141" call Decho("starting up gvim server<".srvrname."> for windows",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006142 call system("start gvim --servername ".srvrname)
6143
6144 else
6145 " start up remote netrw server under linux
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006146" call Decho("starting up gvim server<".srvrname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006147 call system("gvim --servername ".srvrname)
6148 endif
6149 endif
6150
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006151" call Decho("srvrname<".srvrname."> tabnum=".tabnum." winnum=".winnum." server-editing<".a:fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006152 call remote_send(srvrname,":tabn ".tabnum."\<cr>")
6153 call remote_send(srvrname,":".winnum."wincmd w\<cr>")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006154 call remote_send(srvrname,":e ".fnameescape(s:NetrwFile(a:fname))."\<cr>")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006155
6156 else
6157
6158 if serverlist() !~ '\<'.g:netrw_servername.'\>'
6159
6160 if !ctrlr
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006161" call Decho("server<".g:netrw_servername."> not available and ctrl-r not used",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006162 if exists("g:netrw_browse_split")
6163 unlet g:netrw_browse_split
6164 endif
6165 let g:netrw_browse_split= 0
6166 call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,a:fname))
6167" call Dret("s:NetrwServerEdit")
6168 return
6169
6170 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006171" call Decho("server<".g:netrw_servername."> not available but ctrl-r used",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006172 if has("win32") && executable("start")
6173 " start up remote netrw server under windows
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006174" call Decho("starting up gvim server<".g:netrw_servername."> for windows",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006175 call system("start gvim --servername ".g:netrw_servername)
6176 else
6177 " start up remote netrw server under linux
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006178" call Decho("starting up gvim server<".g:netrw_servername.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006179 call system("gvim --servername ".g:netrw_servername)
6180 endif
6181 endif
6182 endif
6183
6184 while 1
6185 try
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006186" call Decho("remote-send: e ".a:fname,'~'.expand("<slnum>"))
6187 call remote_send(g:netrw_servername,":e ".fnameescape(s:NetrwFile(a:fname))."\<cr>")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006188 break
6189 catch /^Vim\%((\a\+)\)\=:E241/
6190 sleep 200m
6191 endtry
6192 endwhile
6193
6194 if exists("g:netrw_browse_split")
6195 if type(g:netrw_browse_split) != 3
6196 let s:netrw_browse_split_{winnr()}= g:netrw_browse_split
6197 endif
6198 unlet g:netrw_browse_split
6199 endif
6200 let g:netrw_browse_split= [g:netrw_servername,1,1]
6201 endif
6202
6203 else
6204 call netrw#ErrorMsg(s:ERROR,"you need a gui-capable vim and client-server to use <ctrl-r>",98)
6205 endif
6206
6207" call Dret("s:NetrwServerEdit")
6208endfun
6209
6210" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01006211" s:NetrwSLeftmouse: marks the file under the cursor. May be dragged to select additional files {{{2
6212fun! s:NetrwSLeftmouse(islocal)
Bram Moolenaar85850f32019-07-19 22:05:51 +02006213 if &ft != "netrw"
6214 return
6215 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01006216" call Dfunc("s:NetrwSLeftmouse(islocal=".a:islocal.")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006217
Bram Moolenaar8d043172014-01-23 14:24:41 +01006218 let s:ngw= s:NetrwGetWord()
6219 call s:NetrwMarkFile(a:islocal,s:ngw)
6220
6221" call Dret("s:NetrwSLeftmouse")
Bram Moolenaarff034192013-04-24 18:51:19 +02006222endfun
6223
6224" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01006225" s:NetrwSLeftdrag: invoked via a shift-leftmouse and dragging {{{2
6226" Used to mark multiple files.
6227fun! s:NetrwSLeftdrag(islocal)
6228" call Dfunc("s:NetrwSLeftdrag(islocal=".a:islocal.")")
6229 if !exists("s:netrwdrag")
6230 let s:netrwdrag = winnr()
6231 if a:islocal
6232 nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02006233 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01006234 nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(0)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02006235 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01006236 endif
6237 let ngw = s:NetrwGetWord()
6238 if !exists("s:ngw") || s:ngw != ngw
6239 call s:NetrwMarkFile(a:islocal,ngw)
6240 endif
6241 let s:ngw= ngw
6242" call Dret("s:NetrwSLeftdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
6243endfun
6244
6245" ---------------------------------------------------------------------
6246" s:NetrwSLeftrelease: terminates shift-leftmouse dragging {{{2
6247fun! s:NetrwSLeftrelease(islocal)
6248" call Dfunc("s:NetrwSLeftrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
6249 if exists("s:netrwdrag")
6250 nunmap <s-leftrelease>
6251 let ngw = s:NetrwGetWord()
6252 if !exists("s:ngw") || s:ngw != ngw
6253 call s:NetrwMarkFile(a:islocal,ngw)
6254 endif
6255 if exists("s:ngw")
6256 unlet s:ngw
6257 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006258 unlet s:netrwdrag
6259 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01006260" call Dret("s:NetrwSLeftrelease")
Bram Moolenaarff034192013-04-24 18:51:19 +02006261endfun
6262
6263" ---------------------------------------------------------------------
Bram Moolenaar91359012019-11-30 17:57:03 +01006264" s:NetrwListHide: uses [range]g~...~d to delete files that match {{{2
6265" comma-separated patterns given in g:netrw_list_hide
Bram Moolenaar446cb832008-06-24 21:56:24 +00006266fun! s:NetrwListHide()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006267" call Dfunc("s:NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar85850f32019-07-19 22:05:51 +02006268" call Decho("initial: ".string(getline(w:netrw_bannercnt,'$')))
Bram Moolenaar97d62492012-11-15 21:28:22 +01006269 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006270
6271 " find a character not in the "hide" string to use as a separator for :g and :v commands
Bram Moolenaar85850f32019-07-19 22:05:51 +02006272 " How-it-works: take the hiding command, convert it into a range.
6273 " Duplicate characters don't matter.
6274 " Remove all such characters from the '/~@#...890' string.
6275 " Use the first character left as a separator character.
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02006276" call Decho("find a character not in the hide string to use as a separator",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006277 let listhide= g:netrw_list_hide
Bram Moolenaar91359012019-11-30 17:57:03 +01006278 let sep = strpart(substitute('~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02006279" call Decho("sep<".sep."> (sep not in hide string)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006280
6281 while listhide != ""
6282 if listhide =~ ','
6283 let hide = substitute(listhide,',.*$','','e')
6284 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
6285 else
6286 let hide = listhide
6287 let listhide = ""
6288 endif
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02006289" call Decho("..extracted pattern from listhide: hide<".hide."> g:netrw_sort_by<".g:netrw_sort_by.'>','~'.expand("<slnum>"))
Bram Moolenaar91359012019-11-30 17:57:03 +01006290 if g:netrw_sort_by =~ '^[ts]'
6291 if hide =~ '^\^'
6292" call Decho("..modify hide to handle a \"^...\" pattern",'~'.expand("<slnum>"))
6293 let hide= substitute(hide,'^\^','^\(\\d\\+/\)','')
6294 elseif hide =~ '^\\(\^'
6295 let hide= substitute(hide,'^\\(\^','\\(^\\(\\d\\+/\\)','')
6296 endif
6297" call Decho("..hide<".hide."> listhide<".listhide.'>','~'.expand("<slnum>"))
6298 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006299
6300 " Prune the list by hiding any files which match
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02006301" call Decho("..prune the list by hiding any files which ".((g:netrw_hide == 1)? "" : "don't")."match hide<".hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006302 if g:netrw_hide == 1
Bram Moolenaar85850f32019-07-19 22:05:51 +02006303" call Decho("..hiding<".hide.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006304 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006305 elseif g:netrw_hide == 2
Bram Moolenaar85850f32019-07-19 22:05:51 +02006306" call Decho("..showing<".hide.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006307 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006308 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02006309" call Decho("..result: ".string(getline(w:netrw_bannercnt,'$')),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006310 endwhile
Bram Moolenaar85850f32019-07-19 22:05:51 +02006311
Bram Moolenaar446cb832008-06-24 21:56:24 +00006312 if g:netrw_hide == 2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006313 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
Bram Moolenaar85850f32019-07-19 22:05:51 +02006314" call Decho("..v KEEP: ".string(getline(w:netrw_bannercnt,'$')),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006315 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar85850f32019-07-19 22:05:51 +02006316" call Decho("..g KEEP: ".string(getline(w:netrw_bannercnt,'$')),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006317 endif
6318
Bram Moolenaaradc21822011-04-01 18:03:16 +02006319 " remove any blank lines that have somehow remained.
6320 " This seems to happen under Windows.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006321 exe 'sil! NetrwKeepj 1,$g@^\s*$@d'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006322
Bram Moolenaar97d62492012-11-15 21:28:22 +01006323 let @@= ykeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006324" call Dret("s:NetrwListHide")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006325endfun
6326
6327" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006328" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006329" implements the "d" mapping.
Bram Moolenaar446cb832008-06-24 21:56:24 +00006330fun! s:NetrwMakeDir(usrhost)
Bram Moolenaara6878372014-03-22 21:02:50 +01006331" call Dfunc("s:NetrwMakeDir(usrhost<".a:usrhost.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006332
Bram Moolenaar97d62492012-11-15 21:28:22 +01006333 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006334 " get name of new directory from user. A bare <CR> will skip.
6335 " if its currently a directory, also request will be skipped, but with
6336 " a message.
6337 call inputsave()
6338 let newdirname= input("Please give directory name: ")
6339 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006340" call Decho("newdirname<".newdirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006341
6342 if newdirname == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01006343 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01006344" call Dret("s:NetrwMakeDir : user aborted with bare <cr>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006345 return
6346 endif
6347
6348 if a:usrhost == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006349" call Decho("local mkdir",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006350
6351 " Local mkdir:
6352 " sanity checks
6353 let fullnewdir= b:netrw_curdir.'/'.newdirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006354" call Decho("fullnewdir<".fullnewdir.">",'~'.expand("<slnum>"))
6355 if isdirectory(s:NetrwFile(fullnewdir))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006356 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006357 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006358 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006359 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01006360" call Dret("s:NetrwMakeDir : directory<".newdirname."> exists previously")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006361 return
6362 endif
6363 if s:FileReadable(fullnewdir)
6364 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006365 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006366 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006367 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01006368" call Dret("s:NetrwMakeDir : file<".newdirname."> exists previously")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006369 return
6370 endif
6371
6372 " requested new local directory is neither a pre-existing file or
6373 " directory, so make it!
6374 if exists("*mkdir")
Bram Moolenaar8d043172014-01-23 14:24:41 +01006375 if has("unix")
6376 call mkdir(fullnewdir,"p",xor(0777, system("umask")))
6377 else
6378 call mkdir(fullnewdir,"p")
6379 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006380 else
6381 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar85850f32019-07-19 22:05:51 +02006382 if s:NetrwLcd(b:netrw_curdir)
6383" call Dret("s:NetrwMakeDir : lcd failure")
6384 return
6385 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006386" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02006387 call s:NetrwExe("sil! !".g:netrw_localmkdir.g:netrw_localmkdiropt.' '.s:ShellEscape(newdirname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01006388 if v:shell_error != 0
6389 let @@= ykeep
6390 call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006391" call Dret("s:NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.s:ShellEscape(newdirname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01006392 return
6393 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006394 if !g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006395" call Decho("restoring netrw_origdir since g:netrw_keepdir=".g:netrw_keepdir,'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02006396 if s:NetrwLcd(netrw_origdir)
6397" call Dret("s:NetrwBrowse : lcd failure")
6398 return
6399 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006400 endif
6401 endif
6402
6403 if v:shell_error == 0
6404 " refresh listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006405" call Decho("refresh listing",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006406 let svpos= winsaveview()
6407" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006408 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006409" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6410 call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006411 elseif !exists("g:netrw_quiet")
6412 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
6413 endif
6414" redraw!
6415
6416 elseif !exists("b:netrw_method") || b:netrw_method == 4
Bram Moolenaara6878372014-03-22 21:02:50 +01006417 " Remote mkdir: using ssh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006418" call Decho("remote mkdir",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006419 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
6420 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006421 call s:NetrwExe("sil! !".mkdircmd." ".s:ShellEscape(newdirname,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006422 if v:shell_error == 0
6423 " refresh listing
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006424 let svpos= winsaveview()
6425" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006426 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006427" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6428 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006429 elseif !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006430 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006431 endif
6432" redraw!
6433
6434 elseif b:netrw_method == 2
Bram Moolenaara6878372014-03-22 21:02:50 +01006435 " Remote mkdir: using ftp+.netrc
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006436 let svpos= winsaveview()
6437" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006438" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006439 if exists("b:netrw_fname")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006440" call Decho("b:netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006441 let remotepath= b:netrw_fname
6442 else
6443 let remotepath= ""
6444 endif
6445 call s:NetrwRemoteFtpCmd(remotepath,g:netrw_remote_mkdir.' "'.newdirname.'"')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006446 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006447" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6448 NetrwKeepj call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01006449
Bram Moolenaar446cb832008-06-24 21:56:24 +00006450 elseif b:netrw_method == 3
Bram Moolenaara6878372014-03-22 21:02:50 +01006451 " Remote mkdir: using ftp + machine, id, passwd, and fname (ie. no .netrc)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006452 let svpos= winsaveview()
6453" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006454" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006455 if exists("b:netrw_fname")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006456" call Decho("b:netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006457 let remotepath= b:netrw_fname
6458 else
6459 let remotepath= ""
6460 endif
6461 call s:NetrwRemoteFtpCmd(remotepath,g:netrw_remote_mkdir.' "'.newdirname.'"')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006462 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006463" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6464 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006465 endif
6466
Bram Moolenaar97d62492012-11-15 21:28:22 +01006467 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01006468" call Dret("s:NetrwMakeDir")
6469endfun
6470
6471" ---------------------------------------------------------------------
6472" s:TreeSqueezeDir: allows a shift-cr (gvim only) to squeeze the current tree-listing directory {{{2
6473fun! s:TreeSqueezeDir(islocal)
6474" call Dfunc("s:TreeSqueezeDir(islocal=".a:islocal.")")
6475 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6476 " its a tree-listing style
6477 let curdepth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
Bram Moolenaara6878372014-03-22 21:02:50 +01006478 let stopline = (exists("w:netrw_bannercnt")? (w:netrw_bannercnt + 1) : 1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006479 let depth = strchars(substitute(curdepth,' ','','g'))
6480 let srch = -1
6481" call Decho("curdepth<".curdepth.'>','~'.expand("<slnum>"))
6482" call Decho("depth =".depth,'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006483" call Decho("stopline#".stopline,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006484" call Decho("curline#".line(".")."<".getline('.').'>','~'.expand("<slnum>"))
6485 if depth >= 2
6486 NetrwKeepj norm! 0
6487 let curdepthm1= substitute(curdepth,'^'.s:treedepthstring,'','')
6488 let srch = search('^'.curdepthm1.'\%('.s:treedepthstring.'\)\@!','bW',stopline)
6489" call Decho("curdepthm1<".curdepthm1.'>','~'.expand("<slnum>"))
6490" call Decho("case depth>=2: srch<".srch.'>','~'.expand("<slnum>"))
6491 elseif depth == 1
6492 NetrwKeepj norm! 0
6493 let treedepthchr= substitute(s:treedepthstring,' ','','')
6494 let srch = search('^[^'.treedepthchr.']','bW',stopline)
6495" call Decho("case depth==1: srch<".srch.'>','~'.expand("<slnum>"))
6496 endif
6497 if srch > 0
6498" call Decho("squeezing at line#".line(".").": ".getline('.'),'~'.expand("<slnum>"))
6499 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,s:NetrwGetWord()))
6500 exe srch
6501 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01006502 endif
6503" call Dret("s:TreeSqueezeDir")
6504endfun
6505
6506" ---------------------------------------------------------------------
6507" s:NetrwMaps: {{{2
6508fun! s:NetrwMaps(islocal)
6509" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
6510
Bram Moolenaar85850f32019-07-19 22:05:51 +02006511 " mouse <Plug> maps: {{{3
Bram Moolenaara6878372014-03-22 21:02:50 +01006512 if g:netrw_mousemaps && g:netrw_retmap
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006513" call Decho("set up Rexplore 2-leftmouse",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006514 if !hasmapto("<Plug>NetrwReturn")
6515 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006516" call Decho("making map for 2-leftmouse",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006517 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
6518 elseif maparg("<c-leftmouse>","n") == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006519" call Decho("making map for c-leftmouse",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006520 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
6521 endif
6522 endif
6523 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006524" call Decho("made <Plug>NetrwReturn map",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006525 endif
6526
Bram Moolenaar85850f32019-07-19 22:05:51 +02006527 " generate default <Plug> maps {{{3
6528 if !hasmapto('<Plug>NetrwHide') |nmap <buffer> <silent> <nowait> a <Plug>NetrwHide_a|endif
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01006529 if !hasmapto('<Plug>NetrwBrowseUpDir') |nmap <buffer> <silent> <nowait> - <Plug>NetrwBrowseUpDir|endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02006530 if !hasmapto('<Plug>NetrwOpenFile') |nmap <buffer> <silent> <nowait> % <Plug>NetrwOpenFile|endif
6531 if !hasmapto('<Plug>NetrwBadd_cb') |nmap <buffer> <silent> <nowait> cb <Plug>NetrwBadd_cb|endif
6532 if !hasmapto('<Plug>NetrwBadd_cB') |nmap <buffer> <silent> <nowait> cB <Plug>NetrwBadd_cB|endif
6533 if !hasmapto('<Plug>NetrwLcd') |nmap <buffer> <silent> <nowait> cd <Plug>NetrwLcd|endif
6534 if !hasmapto('<Plug>NetrwSetChgwin') |nmap <buffer> <silent> <nowait> C <Plug>NetrwSetChgwin|endif
6535 if !hasmapto('<Plug>NetrwRefresh') |nmap <buffer> <silent> <nowait> <c-l> <Plug>NetrwRefresh|endif
6536 if !hasmapto('<Plug>NetrwLocalBrowseCheck') |nmap <buffer> <silent> <nowait> <cr> <Plug>NetrwLocalBrowseCheck|endif
6537 if !hasmapto('<Plug>NetrwServerEdit') |nmap <buffer> <silent> <nowait> <c-r> <Plug>NetrwServerEdit|endif
6538 if !hasmapto('<Plug>NetrwMakeDir') |nmap <buffer> <silent> <nowait> d <Plug>NetrwMakeDir|endif
6539 if !hasmapto('<Plug>NetrwBookHistHandler_gb')|nmap <buffer> <silent> <nowait> gb <Plug>NetrwBookHistHandler_gb|endif
6540" ---------------------------------------------------------------------
6541" if !hasmapto('<Plug>NetrwForceChgDir') |nmap <buffer> <silent> <nowait> gd <Plug>NetrwForceChgDir|endif
6542" if !hasmapto('<Plug>NetrwForceFile') |nmap <buffer> <silent> <nowait> gf <Plug>NetrwForceFile|endif
6543" if !hasmapto('<Plug>NetrwHidden') |nmap <buffer> <silent> <nowait> gh <Plug>NetrwHidden|endif
6544" if !hasmapto('<Plug>NetrwSetTreetop') |nmap <buffer> <silent> <nowait> gn <Plug>NetrwSetTreetop|endif
6545" if !hasmapto('<Plug>NetrwChgPerm') |nmap <buffer> <silent> <nowait> gp <Plug>NetrwChgPerm|endif
6546" if !hasmapto('<Plug>NetrwBannerCtrl') |nmap <buffer> <silent> <nowait> I <Plug>NetrwBannerCtrl|endif
6547" if !hasmapto('<Plug>NetrwListStyle') |nmap <buffer> <silent> <nowait> i <Plug>NetrwListStyle|endif
6548" if !hasmapto('<Plug>NetrwMarkMoveMF2Arglist')|nmap <buffer> <silent> <nowait> ma <Plug>NetrwMarkMoveMF2Arglist|endif
6549" if !hasmapto('<Plug>NetrwMarkMoveArglist2MF')|nmap <buffer> <silent> <nowait> mA <Plug>NetrwMarkMoveArglist2MF|endif
6550" if !hasmapto('<Plug>NetrwBookHistHandler_mA')|nmap <buffer> <silent> <nowait> mb <Plug>NetrwBookHistHandler_mA|endif
6551" if !hasmapto('<Plug>NetrwBookHistHandler_mB')|nmap <buffer> <silent> <nowait> mB <Plug>NetrwBookHistHandler_mB|endif
6552" if !hasmapto('<Plug>NetrwMarkFileCopy') |nmap <buffer> <silent> <nowait> mc <Plug>NetrwMarkFileCopy|endif
6553" if !hasmapto('<Plug>NetrwMarkFileDiff') |nmap <buffer> <silent> <nowait> md <Plug>NetrwMarkFileDiff|endif
6554" if !hasmapto('<Plug>NetrwMarkFileEdit') |nmap <buffer> <silent> <nowait> me <Plug>NetrwMarkFileEdit|endif
6555" if !hasmapto('<Plug>NetrwMarkFile') |nmap <buffer> <silent> <nowait> mf <Plug>NetrwMarkFile|endif
6556" if !hasmapto('<Plug>NetrwUnmarkList') |nmap <buffer> <silent> <nowait> mF <Plug>NetrwUnmarkList|endif
6557" if !hasmapto('<Plug>NetrwMarkFileGrep') |nmap <buffer> <silent> <nowait> mg <Plug>NetrwMarkFileGrep|endif
6558" if !hasmapto('<Plug>NetrwMarkHideSfx') |nmap <buffer> <silent> <nowait> mh <Plug>NetrwMarkHideSfx|endif
6559" if !hasmapto('<Plug>NetrwMarkFileMove') |nmap <buffer> <silent> <nowait> mm <Plug>NetrwMarkFileMove|endif
6560" if !hasmapto('<Plug>NetrwMarkFilePrint') |nmap <buffer> <silent> <nowait> mp <Plug>NetrwMarkFilePrint|endif
6561" if !hasmapto('<Plug>NetrwMarkFileRegexp') |nmap <buffer> <silent> <nowait> mr <Plug>NetrwMarkFileRegexp|endif
6562" if !hasmapto('<Plug>NetrwMarkFileSource') |nmap <buffer> <silent> <nowait> ms <Plug>NetrwMarkFileSource|endif
6563" if !hasmapto('<Plug>NetrwMarkFileTag') |nmap <buffer> <silent> <nowait> mT <Plug>NetrwMarkFileTag|endif
6564" if !hasmapto('<Plug>NetrwMarkFileTgt') |nmap <buffer> <silent> <nowait> mt <Plug>NetrwMarkFileTgt|endif
6565" if !hasmapto('<Plug>NetrwUnMarkFile') |nmap <buffer> <silent> <nowait> mu <Plug>NetrwUnMarkFile|endif
6566" if !hasmapto('<Plug>NetrwMarkFileVimCmd') |nmap <buffer> <silent> <nowait> mv <Plug>NetrwMarkFileVimCmd|endif
6567" if !hasmapto('<Plug>NetrwMarkFileExe_mx') |nmap <buffer> <silent> <nowait> mx <Plug>NetrwMarkFileExe_mx|endif
6568" if !hasmapto('<Plug>NetrwMarkFileExe_mX') |nmap <buffer> <silent> <nowait> mX <Plug>NetrwMarkFileExe_mX|endif
6569" if !hasmapto('<Plug>NetrwMarkFileCompress') |nmap <buffer> <silent> <nowait> mz <Plug>NetrwMarkFileCompress|endif
6570" if !hasmapto('<Plug>NetrwObtain') |nmap <buffer> <silent> <nowait> O <Plug>NetrwObtain|endif
6571" if !hasmapto('<Plug>NetrwSplit_o') |nmap <buffer> <silent> <nowait> o <Plug>NetrwSplit_o|endif
6572" if !hasmapto('<Plug>NetrwPreview') |nmap <buffer> <silent> <nowait> p <Plug>NetrwPreview|endif
6573" if !hasmapto('<Plug>NetrwPrevWinOpen') |nmap <buffer> <silent> <nowait> P <Plug>NetrwPrevWinOpen|endif
6574" if !hasmapto('<Plug>NetrwBookHistHandler_qb')|nmap <buffer> <silent> <nowait> qb <Plug>NetrwBookHistHandler_qb|endif
6575" if !hasmapto('<Plug>NetrwFileInfo') |nmap <buffer> <silent> <nowait> qf <Plug>NetrwFileInfo|endif
6576" if !hasmapto('<Plug>NetrwMarkFileQFEL_qF') |nmap <buffer> <silent> <nowait> qF <Plug>NetrwMarkFileQFEL_qF|endif
6577" if !hasmapto('<Plug>NetrwMarkFileQFEL_qL') |nmap <buffer> <silent> <nowait> qL <Plug>NetrwMarkFileQFEL_qL|endif
6578" if !hasmapto('<Plug>NetrwSortStyle') |nmap <buffer> <silent> <nowait> s <Plug>NetrwSortStyle|endif
6579" if !hasmapto('<Plug>NetSortSequence') |nmap <buffer> <silent> <nowait> S <Plug>NetSortSequence|endif
6580" if !hasmapto('<Plug>NetrwSetTgt_Tb') |nmap <buffer> <silent> <nowait> Tb <Plug>NetrwSetTgt_Tb|endif
6581" if !hasmapto('<Plug>NetrwSetTgt_Th') |nmap <buffer> <silent> <nowait> Th <Plug>NetrwSetTgt_Th|endif
6582" if !hasmapto('<Plug>NetrwSplit_t') |nmap <buffer> <silent> <nowait> t <Plug>NetrwSplit_t|endif
6583" if !hasmapto('<Plug>NetrwBookHistHandler_u') |nmap <buffer> <silent> <nowait> u <Plug>NetrwBookHistHandler_u|endif
6584" if !hasmapto('<Plug>NetrwBookHistHandler_U') |nmap <buffer> <silent> <nowait> U <Plug>NetrwBookHistHandler_U|endif
6585" if !hasmapto('<Plug>NetrwSplit_v') |nmap <buffer> <silent> <nowait> v <Plug>NetrwSplit_v|endif
6586" if !hasmapto('<Plug>NetrwBrowseX') |nmap <buffer> <silent> <nowait> x <Plug>NetrwBrowseX|endif
6587" if !hasmapto('<Plug>NetrwLocalExecute') |nmap <buffer> <silent> <nowait> X <Plug>NetrwLocalExecute|endif
6588
Bram Moolenaara6878372014-03-22 21:02:50 +01006589 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006590" call Decho("make local maps",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02006591 " local normal-mode maps {{{3
6592 nnoremap <buffer> <silent> <Plug>NetrwHide_a :<c-u>call <SID>NetrwHide(1)<cr>
6593 nnoremap <buffer> <silent> <Plug>NetrwBrowseUpDir :<c-u>call <SID>NetrwBrowseUpDir(1)<cr>
6594 nnoremap <buffer> <silent> <Plug>NetrwOpenFile :<c-u>call <SID>NetrwOpenFile(1)<cr>
6595 nnoremap <buffer> <silent> <Plug>NetrwBadd_cb :<c-u>call <SID>NetrwBadd(1,0)<cr>
6596 nnoremap <buffer> <silent> <Plug>NetrwBadd_cB :<c-u>call <SID>NetrwBadd(1,1)<cr>
6597 nnoremap <buffer> <silent> <Plug>NetrwLcd :<c-u>call <SID>NetrwLcd(b:netrw_curdir)<cr>
6598 nnoremap <buffer> <silent> <Plug>NetrwSetChgwin :<c-u>call <SID>NetrwSetChgwin()<cr>
6599 nnoremap <buffer> <silent> <Plug>NetrwLocalBrowseCheck :<c-u>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
6600 nnoremap <buffer> <silent> <Plug>NetrwServerEdit :<c-u>call <SID>NetrwServerEdit(3,<SID>NetrwGetWord())<cr>
6601 nnoremap <buffer> <silent> <Plug>NetrwMakeDir :<c-u>call <SID>NetrwMakeDir("")<cr>
6602 nnoremap <buffer> <silent> <Plug>NetrwBookHistHandler_gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
6603" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006604 nnoremap <buffer> <silent> <nowait> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
6605 nnoremap <buffer> <silent> <nowait> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
6606 nnoremap <buffer> <silent> <nowait> gh :<c-u>call <SID>NetrwHidden(1)<cr>
Bram Moolenaar85850f32019-07-19 22:05:51 +02006607 nnoremap <buffer> <silent> <nowait> gn :<c-u>call netrw#SetTreetop(0,<SID>NetrwGetWord())<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006608 nnoremap <buffer> <silent> <nowait> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006609 nnoremap <buffer> <silent> <nowait> I :<c-u>call <SID>NetrwBannerCtrl(1)<cr>
6610 nnoremap <buffer> <silent> <nowait> i :<c-u>call <SID>NetrwListStyle(1)<cr>
6611 nnoremap <buffer> <silent> <nowait> ma :<c-u>call <SID>NetrwMarkFileArgList(1,0)<cr>
6612 nnoremap <buffer> <silent> <nowait> mA :<c-u>call <SID>NetrwMarkFileArgList(1,1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006613 nnoremap <buffer> <silent> <nowait> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
6614 nnoremap <buffer> <silent> <nowait> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
6615 nnoremap <buffer> <silent> <nowait> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
6616 nnoremap <buffer> <silent> <nowait> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
6617 nnoremap <buffer> <silent> <nowait> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
6618 nnoremap <buffer> <silent> <nowait> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
6619 nnoremap <buffer> <silent> <nowait> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
6620 nnoremap <buffer> <silent> <nowait> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
6621 nnoremap <buffer> <silent> <nowait> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
6622 nnoremap <buffer> <silent> <nowait> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
6623 nnoremap <buffer> <silent> <nowait> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
6624 nnoremap <buffer> <silent> <nowait> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
6625 nnoremap <buffer> <silent> <nowait> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006626 nnoremap <buffer> <silent> <nowait> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006627 nnoremap <buffer> <silent> <nowait> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006628 nnoremap <buffer> <silent> <nowait> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
6629 nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
6630 nnoremap <buffer> <silent> <nowait> mx :<c-u>call <SID>NetrwMarkFileExe(1,0)<cr>
6631 nnoremap <buffer> <silent> <nowait> mX :<c-u>call <SID>NetrwMarkFileExe(1,1)<cr>
6632 nnoremap <buffer> <silent> <nowait> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006633 nnoremap <buffer> <silent> <nowait> O :<c-u>call <SID>NetrwObtain(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006634 nnoremap <buffer> <silent> <nowait> o :call <SID>NetrwSplit(3)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006635 nnoremap <buffer> <silent> <nowait> p :<c-u>call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
6636 nnoremap <buffer> <silent> <nowait> P :<c-u>call <SID>NetrwPrevWinOpen(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006637 nnoremap <buffer> <silent> <nowait> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
6638 nnoremap <buffer> <silent> <nowait> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
6639 nnoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006640 nnoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(1,getloclist(v:count))<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006641 nnoremap <buffer> <silent> <nowait> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006642 nnoremap <buffer> <silent> <nowait> S :<c-u>call <SID>NetSortSequence(1)<cr>
6643 nnoremap <buffer> <silent> <nowait> Tb :<c-u>call <SID>NetrwSetTgt(1,'b',v:count1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006644 nnoremap <buffer> <silent> <nowait> t :call <SID>NetrwSplit(4)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006645 nnoremap <buffer> <silent> <nowait> Th :<c-u>call <SID>NetrwSetTgt(1,'h',v:count)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006646 nnoremap <buffer> <silent> <nowait> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
6647 nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
6648 nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(5)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006649 nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
6650 nnoremap <buffer> <silent> <nowait> X :<c-u>call <SID>NetrwLocalExecute(expand("<cword>"))"<cr>
Bram Moolenaar85850f32019-07-19 22:05:51 +02006651
6652 nnoremap <buffer> <silent> <nowait> r :<c-u>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>
Bram Moolenaara6878372014-03-22 21:02:50 +01006653 if !hasmapto('<Plug>NetrwHideEdit')
6654 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaara6878372014-03-22 21:02:50 +01006655 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006656 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006657 if !hasmapto('<Plug>NetrwRefresh')
6658 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaara6878372014-03-22 21:02:50 +01006659 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02006660 nnoremap <buffer> <silent> <Plug>NetrwRefresh <c-l>:call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,(exists("w:netrw_liststyle") && exists("w:netrw_treetop") && w:netrw_liststyle == 3)? w:netrw_treetop : './'))<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006661 if s:didstarstar || !mapcheck("<s-down>","n")
6662 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006663 endif
6664 if s:didstarstar || !mapcheck("<s-up>","n")
6665 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006666 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006667 if !hasmapto('<Plug>NetrwTreeSqueeze')
6668 nmap <buffer> <silent> <nowait> <s-cr> <Plug>NetrwTreeSqueeze
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006669 endif
6670 nnoremap <buffer> <silent> <Plug>NetrwTreeSqueeze :call <SID>TreeSqueezeDir(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006671 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
6672 if g:netrw_mousemaps == 1
Bram Moolenaar85850f32019-07-19 22:05:51 +02006673 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
6674 nmap <buffer> <c-leftmouse> <Plug>NetrwCLeftmouse
6675 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
6676 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
6677 nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
6678 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
6679 imap <buffer> <leftmouse> <Plug>ILeftmouse
6680 imap <buffer> <middlemouse> <Plug>IMiddlemouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006681 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006682 nno <buffer> <silent> <Plug>NetrwCLeftmouse <leftmouse>:call <SID>NetrwCLeftmouse(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006683 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006684 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006685 nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006686 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
Bram Moolenaara6878372014-03-22 21:02:50 +01006687 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6688 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006689 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006690 exe 'nnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6691 exe 'nnoremap <buffer> <silent> <nowait> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6692 exe 'nnoremap <buffer> <silent> <nowait> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
6693 exe 'nnoremap <buffer> <silent> <nowait> d :call <SID>NetrwMakeDir("")<cr>'
6694 exe 'vnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6695 exe 'vnoremap <buffer> <silent> <nowait> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6696 exe 'vnoremap <buffer> <silent> <nowait> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006697 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
6698
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006699 " support user-specified maps
6700 call netrw#UserMaps(1)
6701
Bram Moolenaar85850f32019-07-19 22:05:51 +02006702 else
6703 " remote normal-mode maps {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006704" call Decho("make remote maps",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006705 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar85850f32019-07-19 22:05:51 +02006706 nnoremap <buffer> <silent> <Plug>NetrwHide_a :<c-u>call <SID>NetrwHide(0)<cr>
6707 nnoremap <buffer> <silent> <Plug>NetrwBrowseUpDir :<c-u>call <SID>NetrwBrowseUpDir(0)<cr>
6708 nnoremap <buffer> <silent> <Plug>NetrwOpenFile :<c-u>call <SID>NetrwOpenFile(0)<cr>
6709 nnoremap <buffer> <silent> <Plug>NetrwBadd_cb :<c-u>call <SID>NetrwBadd(0,0)<cr>
6710 nnoremap <buffer> <silent> <Plug>NetrwBadd_cB :<c-u>call <SID>NetrwBadd(0,1)<cr>
6711 nnoremap <buffer> <silent> <Plug>NetrwLcd :<c-u>call <SID>NetrwLcd(b:netrw_curdir)<cr>
6712 nnoremap <buffer> <silent> <Plug>NetrwSetChgwin :<c-u>call <SID>NetrwSetChgwin()<cr>
6713 nnoremap <buffer> <silent> <Plug>NetrwRefresh :<c-u>call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
6714 nnoremap <buffer> <silent> <Plug>NetrwLocalBrowseCheck :<c-u>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
6715 nnoremap <buffer> <silent> <Plug>NetrwServerEdit :<c-u>call <SID>NetrwServerEdit(2,<SID>NetrwGetWord())<cr>
6716 nnoremap <buffer> <silent> <Plug>NetrwBookHistHandler_gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
6717" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006718 nnoremap <buffer> <silent> <nowait> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
6719 nnoremap <buffer> <silent> <nowait> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
6720 nnoremap <buffer> <silent> <nowait> gh :<c-u>call <SID>NetrwHidden(0)<cr>
6721 nnoremap <buffer> <silent> <nowait> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
6722 nnoremap <buffer> <silent> <nowait> I :<c-u>call <SID>NetrwBannerCtrl(1)<cr>
6723 nnoremap <buffer> <silent> <nowait> i :<c-u>call <SID>NetrwListStyle(0)<cr>
6724 nnoremap <buffer> <silent> <nowait> ma :<c-u>call <SID>NetrwMarkFileArgList(0,0)<cr>
6725 nnoremap <buffer> <silent> <nowait> mA :<c-u>call <SID>NetrwMarkFileArgList(0,1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006726 nnoremap <buffer> <silent> <nowait> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006727 nnoremap <buffer> <silent> <nowait> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006728 nnoremap <buffer> <silent> <nowait> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
6729 nnoremap <buffer> <silent> <nowait> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
6730 nnoremap <buffer> <silent> <nowait> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
6731 nnoremap <buffer> <silent> <nowait> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
6732 nnoremap <buffer> <silent> <nowait> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
6733 nnoremap <buffer> <silent> <nowait> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
6734 nnoremap <buffer> <silent> <nowait> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
6735 nnoremap <buffer> <silent> <nowait> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
6736 nnoremap <buffer> <silent> <nowait> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
6737 nnoremap <buffer> <silent> <nowait> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
6738 nnoremap <buffer> <silent> <nowait> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006739 nnoremap <buffer> <silent> <nowait> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006740 nnoremap <buffer> <silent> <nowait> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006741 nnoremap <buffer> <silent> <nowait> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
6742 nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
6743 nnoremap <buffer> <silent> <nowait> mx :<c-u>call <SID>NetrwMarkFileExe(0,0)<cr>
6744 nnoremap <buffer> <silent> <nowait> mX :<c-u>call <SID>NetrwMarkFileExe(0,1)<cr>
6745 nnoremap <buffer> <silent> <nowait> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006746 nnoremap <buffer> <silent> <nowait> O :<c-u>call <SID>NetrwObtain(0)<cr>
6747 nnoremap <buffer> <silent> <nowait> o :call <SID>NetrwSplit(0)<cr>
6748 nnoremap <buffer> <silent> <nowait> p :<c-u>call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
6749 nnoremap <buffer> <silent> <nowait> P :<c-u>call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006750 nnoremap <buffer> <silent> <nowait> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006751 nnoremap <buffer> <silent> <nowait> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
6752 nnoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006753 nnoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(0,getloclist(v:count))<cr>
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02006754 nnoremap <buffer> <silent> <nowait> r :<c-u>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>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006755 nnoremap <buffer> <silent> <nowait> s :call <SID>NetrwSortStyle(0)<cr>
6756 nnoremap <buffer> <silent> <nowait> S :<c-u>call <SID>NetSortSequence(0)<cr>
6757 nnoremap <buffer> <silent> <nowait> Tb :<c-u>call <SID>NetrwSetTgt(0,'b',v:count1)<cr>
6758 nnoremap <buffer> <silent> <nowait> t :call <SID>NetrwSplit(1)<cr>
6759 nnoremap <buffer> <silent> <nowait> Th :<c-u>call <SID>NetrwSetTgt(0,'h',v:count)<cr>
6760 nnoremap <buffer> <silent> <nowait> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
6761 nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
6762 nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(2)<cr>
6763 nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006764 if !hasmapto('<Plug>NetrwHideEdit')
6765 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaara6878372014-03-22 21:02:50 +01006766 endif
6767 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
6768 if !hasmapto('<Plug>NetrwRefresh')
6769 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaara6878372014-03-22 21:02:50 +01006770 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006771 if !hasmapto('<Plug>NetrwTreeSqueeze')
6772 nmap <buffer> <silent> <nowait> <s-cr> <Plug>NetrwTreeSqueeze
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006773 endif
6774 nnoremap <buffer> <silent> <Plug>NetrwTreeSqueeze :call <SID>TreeSqueezeDir(0)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006775
6776 let mapsafepath = escape(s:path, s:netrw_map_escape)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006777 let mapsafeusermach = escape(((s:user == "")? "" : s:user."@").s:machine, s:netrw_map_escape)
Bram Moolenaara6878372014-03-22 21:02:50 +01006778
6779 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
6780 if g:netrw_mousemaps == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006781 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
6782 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
6783 nmap <buffer> <c-leftmouse> <Plug>NetrwCLeftmouse
6784 nno <buffer> <silent> <Plug>NetrwCLeftmouse <leftmouse>:call <SID>NetrwCLeftmouse(0)<cr>
6785 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
6786 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(0)<cr>
6787 nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
6788 nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(0)<cr>
6789 nmap <middlemouse> <Plug>NetrwMiddlemouse
6790 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
6791 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
6792 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
6793 imap <buffer> <leftmouse> <Plug>ILeftmouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006794 imap <buffer> <middlemouse> <Plug>IMiddlemouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006795 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
Bram Moolenaara6878372014-03-22 21:02:50 +01006796 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6797 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006798 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006799 exe 'nnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6800 exe 'nnoremap <buffer> <silent> <nowait> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
6801 exe 'nnoremap <buffer> <silent> <nowait> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6802 exe 'nnoremap <buffer> <silent> <nowait> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6803 exe 'vnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6804 exe 'vnoremap <buffer> <silent> <nowait> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6805 exe 'vnoremap <buffer> <silent> <nowait> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006806 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006807
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006808 " support user-specified maps
6809 call netrw#UserMaps(0)
Bram Moolenaar85850f32019-07-19 22:05:51 +02006810 endif " }}}3
Bram Moolenaara6878372014-03-22 21:02:50 +01006811
6812" call Dret("s:NetrwMaps")
6813endfun
6814
6815" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006816" s:NetrwCommands: set up commands {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006817" If -buffer, the command is only available from within netrw buffers
6818" Otherwise, the command is available from any window, so long as netrw
6819" has been used at least once in the session.
Bram Moolenaara6878372014-03-22 21:02:50 +01006820fun! s:NetrwCommands(islocal)
6821" call Dfunc("s:NetrwCommands(islocal=".a:islocal.")")
6822
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006823 com! -nargs=* -complete=file -bang NetrwMB call s:NetrwBookmark(<bang>0,<f-args>)
6824 com! -nargs=* NetrwC call s:NetrwSetChgwin(<q-args>)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006825 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,"win#".winnr()." not a former netrw window",79)|endif
Bram Moolenaara6878372014-03-22 21:02:50 +01006826 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006827 com! -buffer -nargs=+ -complete=file MF call s:NetrwMarkFiles(1,<f-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +01006828 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006829 com! -buffer -nargs=+ -complete=file MF call s:NetrwMarkFiles(0,<f-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +01006830 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006831 com! -buffer -nargs=? -complete=file MT call s:NetrwMarkTarget(<q-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +01006832
6833" call Dret("s:NetrwCommands")
6834endfun
6835
6836" ---------------------------------------------------------------------
6837" s:NetrwMarkFiles: apply s:NetrwMarkFile() to named file(s) {{{2
6838" glob()ing only works with local files
6839fun! s:NetrwMarkFiles(islocal,...)
6840" call Dfunc("s:NetrwMarkFiles(islocal=".a:islocal."...) a:0=".a:0)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006841 let curdir = s:NetrwGetCurdir(a:islocal)
6842 let i = 1
Bram Moolenaara6878372014-03-22 21:02:50 +01006843 while i <= a:0
6844 if a:islocal
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02006845 if v:version > 704 || (v:version == 704 && has("patch656"))
Bram Moolenaar91359012019-11-30 17:57:03 +01006846 let mffiles= glob(a:{i},0,1,1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006847 else
Bram Moolenaar91359012019-11-30 17:57:03 +01006848 let mffiles= glob(a:{i},0,1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006849 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01006850 else
6851 let mffiles= [a:{i}]
6852 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006853" call Decho("mffiles".string(mffiles),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006854 for mffile in mffiles
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006855" call Decho("mffile<".mffile.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006856 call s:NetrwMarkFile(a:islocal,mffile)
6857 endfor
6858 let i= i + 1
6859 endwhile
6860" call Dret("s:NetrwMarkFiles")
6861endfun
6862
6863" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006864" s:NetrwMarkTarget: implements :MT (mark target) {{{2
Bram Moolenaara6878372014-03-22 21:02:50 +01006865fun! s:NetrwMarkTarget(...)
6866" call Dfunc("s:NetrwMarkTarget() a:0=".a:0)
6867 if a:0 == 0 || (a:0 == 1 && a:1 == "")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006868 let curdir = s:NetrwGetCurdir(1)
6869 let tgt = b:netrw_curdir
Bram Moolenaara6878372014-03-22 21:02:50 +01006870 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006871 let curdir = s:NetrwGetCurdir((a:1 =~ '^\a\{3,}://')? 0 : 1)
6872 let tgt = a:1
Bram Moolenaara6878372014-03-22 21:02:50 +01006873 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006874" call Decho("tgt<".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006875 let s:netrwmftgt = tgt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006876 let s:netrwmftgt_islocal = tgt !~ '^\a\{3,}://'
6877 let curislocal = b:netrw_curdir !~ '^\a\{3,}://'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006878 let svpos = winsaveview()
6879" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006880 call s:NetrwRefresh(curislocal,s:NetrwBrowseChgDir(curislocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006881" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6882 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01006883" call Dret("s:NetrwMarkTarget")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006884endfun
6885
6886" ---------------------------------------------------------------------
6887" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
6888" mark and unmark files. If a markfile list exists,
6889" then the rename and delete functions will use it instead
6890" of whatever may happen to be under the cursor at that
6891" moment. When the mouse and gui are available,
6892" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006893"
6894" Creates two lists
6895" s:netrwmarkfilelist -- holds complete paths to all marked files
6896" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
6897"
6898" Creates a marked file match string
6899" s:netrwmarfilemtch_# -- used with 2match to display marked files
6900"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006901" Creates a buffer version of islocal
6902" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00006903fun! s:NetrwMarkFile(islocal,fname)
6904" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006905" call Decho("bufnr(%)=".bufnr("%").": ".bufname("%"),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006906
6907 " sanity check
6908 if empty(a:fname)
Bram Moolenaar6c391a72021-09-09 21:55:11 +02006909" call Dret("s:NetrwMarkFile : empty fname")
Bram Moolenaarff034192013-04-24 18:51:19 +02006910 return
6911 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006912 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02006913
Bram Moolenaar97d62492012-11-15 21:28:22 +01006914 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006915 let curbufnr= bufnr("%")
Bram Moolenaara6878372014-03-22 21:02:50 +01006916 if a:fname =~ '^\a'
6917 let leader= '\<'
6918 else
6919 let leader= ''
6920 endif
6921 if a:fname =~ '\a$'
6922 let trailer = '\>[@=|\/\*]\=\ze\%( \|\t\|$\)'
6923 else
6924 let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)'
6925 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006926
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006927 if exists("s:netrwmarkfilelist_".curbufnr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006928 " markfile list pre-exists
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006929" call Decho("case s:netrwmarkfilelist_".curbufnr." already exists",'~'.expand("<slnum>"))
6930" call Decho("starting s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
6931" call Decho("starting s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">",'~'.expand("<slnum>"))
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006932 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00006933
6934 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006935 " append filename to buffer's markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006936" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006937 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaara6878372014-03-22 21:02:50 +01006938 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|'.leader.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006939
6940 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006941 " remove filename from buffer's markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006942" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006943 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
6944 if s:netrwmarkfilelist_{curbufnr} == []
6945 " local markfilelist is empty; remove it entirely
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006946" call Decho("markfile list now empty",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006947 call s:NetrwUnmarkList(curbufnr,curdir)
6948 else
6949 " rebuild match list to display markings correctly
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006950" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006951 let s:netrwmarkfilemtch_{curbufnr}= ""
Bram Moolenaara6878372014-03-22 21:02:50 +01006952 let first = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006953 for fname in s:netrwmarkfilelist_{curbufnr}
6954 if first
Bram Moolenaara6878372014-03-22 21:02:50 +01006955 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.leader.escape(fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006956 else
Bram Moolenaara6878372014-03-22 21:02:50 +01006957 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|'.leader.escape(fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006958 endif
6959 let first= 0
6960 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006961" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006962 endif
6963 endif
6964
6965 else
6966 " initialize new markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006967" call Decho("case: initialize new markfilelist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006968
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006969" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006970 let s:netrwmarkfilelist_{curbufnr}= []
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006971 call add(s:netrwmarkfilelist_{curbufnr},substitute(a:fname,'[|@]$','',''))
6972" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006973
6974 " build initial markfile matching pattern
6975 if a:fname =~ '/$'
Bram Moolenaara6878372014-03-22 21:02:50 +01006976 let s:netrwmarkfilemtch_{curbufnr}= leader.escape(a:fname,g:netrw_markfileesc)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006977 else
Bram Moolenaara6878372014-03-22 21:02:50 +01006978 let s:netrwmarkfilemtch_{curbufnr}= leader.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006979 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006980" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006981 endif
6982
6983 " handle global markfilelist
6984 if exists("s:netrwmarkfilelist")
6985 let dname= s:ComposePath(b:netrw_curdir,a:fname)
6986 if index(s:netrwmarkfilelist,dname) == -1
6987 " append new filename to global markfilelist
6988 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01006989" call Decho("append filename<".a:fname."> to global s:markfilelist<".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006990 else
6991 " remove new filename from global markfilelist
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01006992" call Decho("remove new filename from global s:markfilelist",'~'.expand("<slnum>"))
6993" call Decho("..filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006994 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01006995" call Decho("..ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006996 if s:netrwmarkfilelist == []
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01006997" call Decho("s:netrwmarkfilelist is empty; unlet it",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006998 unlet s:netrwmarkfilelist
6999 endif
7000 endif
7001 else
7002 " initialize new global-directory markfilelist
7003 let s:netrwmarkfilelist= []
7004 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007005" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007006 endif
7007
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007008 " set up 2match'ing to netrwmarkfilemtch_# list
Bram Moolenaar85850f32019-07-19 22:05:51 +02007009 if has("syntax") && exists("g:syntax_on") && g:syntax_on
7010 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
7011" " call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/",'~'.expand("<slnum>"))
7012 if exists("g:did_drchip_netrwlist_syntax")
7013 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
7014 endif
7015 else
7016" " call Decho("2match none",'~'.expand("<slnum>"))
7017 2match none
Bram Moolenaar5c736222010-01-06 20:54:52 +01007018 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007019 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007020 let @@= ykeep
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01007021" call Decho("s:netrwmarkfilelist[".(exists("s:netrwmarkfilelist")? string(s:netrwmarkfilelist) : "")."] (avail in all buffers)",'~'.expand("<slnum>"))
7022" call Dret("s:NetrwMarkFile : s:netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist")."> (buf#".curbufnr."list)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007023endfun
7024
7025" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007026" s:NetrwMarkFileArgList: ma: move the marked file list to the argument list (tomflist=0) {{{2
7027" mA: move the argument list to marked file list (tomflist=1)
7028" Uses the global marked file list
7029fun! s:NetrwMarkFileArgList(islocal,tomflist)
7030" call Dfunc("s:NetrwMarkFileArgList(islocal=".a:islocal.",tomflist=".a:tomflist.")")
7031
7032 let svpos = winsaveview()
7033" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7034 let curdir = s:NetrwGetCurdir(a:islocal)
7035 let curbufnr = bufnr("%")
7036
7037 if a:tomflist
7038 " mA: move argument list to marked file list
7039 while argc()
7040 let fname= argv(0)
7041" call Decho("exe argdel ".fname,'~'.expand("<slnum>"))
7042 exe "argdel ".fnameescape(fname)
7043 call s:NetrwMarkFile(a:islocal,fname)
7044 endwhile
7045
7046 else
7047 " ma: move marked file list to argument list
7048 if exists("s:netrwmarkfilelist")
7049
7050 " for every filename in the marked list
7051 for fname in s:netrwmarkfilelist
7052" call Decho("exe argadd ".fname,'~'.expand("<slnum>"))
7053 exe "argadd ".fnameescape(fname)
7054 endfor " for every file in the marked list
7055
7056 " unmark list and refresh
7057 call s:NetrwUnmarkList(curbufnr,curdir)
7058 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
7059" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7060 NetrwKeepj call winrestview(svpos)
7061 endif
7062 endif
7063
7064" call Dret("s:NetrwMarkFileArgList")
7065endfun
7066
7067" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007068" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
7069" compress/decompress files using the programs
7070" in g:netrw_compress and g:netrw_uncompress,
7071" using g:netrw_compress_suffix to know which to
7072" do. By default:
7073" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007074" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00007075fun! s:NetrwMarkFileCompress(islocal)
7076" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007077 let svpos = winsaveview()
7078" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007079 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007080 let curbufnr = bufnr("%")
7081
Bram Moolenaarff034192013-04-24 18:51:19 +02007082 " sanity check
7083 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007084 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007085" call Dret("s:NetrwMarkFileCompress")
7086 return
7087 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007088" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007089
Bram Moolenaar446cb832008-06-24 21:56:24 +00007090 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
Bram Moolenaarff034192013-04-24 18:51:19 +02007091
7092 " for every filename in the marked list
Bram Moolenaar446cb832008-06-24 21:56:24 +00007093 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaarff034192013-04-24 18:51:19 +02007094 let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007095" call Decho("extracted sfx<".sfx.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007096 if exists("g:netrw_decompress['".sfx."']")
7097 " fname has a suffix indicating that its compressed; apply associated decompression routine
7098 let exe= g:netrw_decompress[sfx]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007099" call Decho("fname<".fname."> is compressed so decompress with <".exe.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007100 let exe= netrw#WinPath(exe)
7101 if a:islocal
7102 if g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007103 let fname= s:ShellEscape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007104 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02007105 call system(exe." ".fname)
7106 if v:shell_error
7107 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaar46973992017-12-14 19:56:46 +01007108 endif
7109 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02007110 let fname= s:ShellEscape(b:netrw_curdir.fname,1)
7111 NetrwKeepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaar46973992017-12-14 19:56:46 +01007112 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02007113
Bram Moolenaarff034192013-04-24 18:51:19 +02007114 endif
7115 unlet sfx
7116
Bram Moolenaar446cb832008-06-24 21:56:24 +00007117 if exists("exe")
7118 unlet exe
7119 elseif a:islocal
7120 " fname not a compressed file, so compress it
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007121 call system(netrw#WinPath(g:netrw_compress)." ".s:ShellEscape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007122 if v:shell_error
7123 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_compress<".g:netrw_compress."> to something that works",104)
7124 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007125 else
7126 " fname not a compressed file, so compress it
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007127 NetrwKeepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".s:ShellEscape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007128 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007129 endfor " for every file in the marked list
7130
Bram Moolenaar446cb832008-06-24 21:56:24 +00007131 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007132 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007133" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7134 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007135 endif
7136" call Dret("s:NetrwMarkFileCompress")
7137endfun
7138
7139" ---------------------------------------------------------------------
7140" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
7141" If no marked files, then set up directory as the
7142" target. Currently does not support copying entire
7143" directories. Uses the local-buffer marked file list.
7144" Returns 1=success (used by NetrwMarkFileMove())
7145" 0=failure
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007146fun! s:NetrwMarkFileCopy(islocal,...)
7147" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0)
7148
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007149 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02007150 let curbufnr = bufnr("%")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007151 if b:netrw_curdir !~ '/$'
7152 if !exists("b:netrw_curdir")
7153 let b:netrw_curdir= curdir
7154 endif
7155 let b:netrw_curdir= b:netrw_curdir."/"
7156 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007157
Bram Moolenaarff034192013-04-24 18:51:19 +02007158 " sanity check
7159 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007160 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007161" call Dret("s:NetrwMarkFileCopy")
7162 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007163 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007164" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007165
Bram Moolenaar446cb832008-06-24 21:56:24 +00007166 if !exists("s:netrwmftgt")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007167 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007168" call Dret("s:NetrwMarkFileCopy 0")
7169 return 0
7170 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007171" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007172
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007173 if a:islocal && s:netrwmftgt_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00007174 " Copy marked files, local directory to local directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007175" call Decho("copy from local to local",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007176 if !executable(g:netrw_localcopycmd)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007177 call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
7178" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
7179 return
7180 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007181
7182 " copy marked files while within the same directory (ie. allow renaming)
7183 if simplify(s:netrwmftgt) == simplify(b:netrw_curdir)
7184 if len(s:netrwmarkfilelist_{bufnr('%')}) == 1
7185 " only one marked file
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007186" call Decho("case: only one marked file",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007187 let args = s:ShellEscape(b:netrw_curdir.s:netrwmarkfilelist_{bufnr('%')}[0])
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007188 let oldname = s:netrwmarkfilelist_{bufnr('%')}[0]
7189 elseif a:0 == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007190" call Decho("case: handling one input argument",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007191 " this happens when the next case was used to recursively call s:NetrwMarkFileCopy()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007192 let args = s:ShellEscape(b:netrw_curdir.a:1)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007193 let oldname = a:1
7194 else
7195 " copy multiple marked files inside the same directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007196" call Decho("case: handling a multiple marked files",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007197 let s:recursive= 1
7198 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7199 let ret= s:NetrwMarkFileCopy(a:islocal,oldname)
7200 if ret == 0
7201 break
7202 endif
7203 endfor
7204 unlet s:recursive
7205 call s:NetrwUnmarkList(curbufnr,curdir)
7206" call Dret("s:NetrwMarkFileCopy ".ret)
7207 return ret
7208 endif
7209
7210 call inputsave()
7211 let newname= input("Copy ".oldname." to : ",oldname,"file")
7212 call inputrestore()
7213 if newname == ""
7214" call Dret("s:NetrwMarkFileCopy 0")
7215 return 0
7216 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007217 let args= s:ShellEscape(oldname)
7218 let tgt = s:ShellEscape(s:netrwmftgt.'/'.newname)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007219 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007220 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"s:ShellEscape(b:netrw_curdir.\"/\".v:val)"))
7221 let tgt = s:ShellEscape(s:netrwmftgt)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007222 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007223 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7224 let args= substitute(args,'/','\\','g')
7225 let tgt = substitute(tgt, '/','\\','g')
7226 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007227 if args =~ "'" |let args= substitute(args,"'\\(.*\\)'",'\1','')|endif
7228 if tgt =~ "'" |let tgt = substitute(tgt ,"'\\(.*\\)'",'\1','')|endif
7229 if args =~ '//'|let args= substitute(args,'//','/','g')|endif
7230 if tgt =~ '//'|let tgt = substitute(tgt ,'//','/','g')|endif
7231" call Decho("args <".args.">",'~'.expand("<slnum>"))
7232" call Decho("tgt <".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007233 if isdirectory(s:NetrwFile(args))
7234" call Decho("args<".args."> is a directory",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007235 let copycmd= g:netrw_localcopydircmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007236" call Decho("using copydircmd<".copycmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007237 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7238 " window's xcopy doesn't copy a directory to a target properly. Instead, it copies a directory's
7239 " contents to a target. One must append the source directory name to the target to get xcopy to
7240 " do the right thing.
7241 let tgt= tgt.'\'.substitute(a:1,'^.*[\\/]','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007242" call Decho("modified tgt for xcopy",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007243 endif
7244 else
7245 let copycmd= g:netrw_localcopycmd
7246 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007247 if g:netrw_localcopycmd =~ '\s'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007248 let copycmd = substitute(copycmd,'\s.*$','','')
7249 let copycmdargs = substitute(copycmd,'^.\{-}\(\s.*\)$','\1','')
Bram Moolenaarff034192013-04-24 18:51:19 +02007250 let copycmd = netrw#WinPath(copycmd).copycmdargs
7251 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007252 let copycmd = netrw#WinPath(copycmd)
Bram Moolenaarff034192013-04-24 18:51:19 +02007253 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007254" call Decho("args <".args.">",'~'.expand("<slnum>"))
7255" call Decho("tgt <".tgt.">",'~'.expand("<slnum>"))
7256" call Decho("copycmd<".copycmd.">",'~'.expand("<slnum>"))
7257" call Decho("system(".copycmd." '".args."' '".tgt."')",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007258 call system(copycmd.g:netrw_localcopycmdopt." '".args."' '".tgt."'")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007259 if v:shell_error != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007260 if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
Bram Moolenaar85850f32019-07-19 22:05:51 +02007261 call netrw#ErrorMsg(s:ERROR,"copy failed; perhaps due to vim's current directory<".getcwd()."> not matching netrw's (".b:netrw_curdir.") (see :help netrw-cd)",101)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007262 else
7263 call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localcopycmd<".g:netrw_localcopycmd.">; it doesn't work!",80)
7264 endif
7265" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".s:ShellEscape(s:netrwmftgt))
Bram Moolenaar97d62492012-11-15 21:28:22 +01007266 return 0
7267 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007268
7269 elseif a:islocal && !s:netrwmftgt_islocal
7270 " Copy marked files, local directory to remote directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007271" call Decho("copy from local to remote",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007272 NetrwKeepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007273
7274 elseif !a:islocal && s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007275 " Copy marked files, remote directory to local directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007276" call Decho("copy from remote to local",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007277 NetrwKeepj call netrw#Obtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007278
7279 elseif !a:islocal && !s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007280 " Copy marked files, remote directory to remote directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007281" call Decho("copy from remote to remote",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007282 let curdir = getcwd()
7283 let tmpdir = s:GetTempfile("")
7284 if tmpdir !~ '/'
7285 let tmpdir= curdir."/".tmpdir
7286 endif
7287 if exists("*mkdir")
7288 call mkdir(tmpdir)
7289 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02007290 call s:NetrwExe("sil! !".g:netrw_localmkdir.g:netrw_localmkdiropt.' '.s:ShellEscape(tmpdir,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01007291 if v:shell_error != 0
7292 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007293" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.s:ShellEscape(tmpdir,1) )
Bram Moolenaar97d62492012-11-15 21:28:22 +01007294 return
7295 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007296 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007297 if isdirectory(s:NetrwFile(tmpdir))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007298 if s:NetrwLcd(tmpdir)
7299" call Dret("s:NetrwMarkFileCopy : lcd failure")
7300 return
7301 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007302 NetrwKeepj call netrw#Obtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007303 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007304 NetrwKeepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007305 if getcwd() == tmpdir
7306 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007307 NetrwKeepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007308 endfor
Bram Moolenaar85850f32019-07-19 22:05:51 +02007309 if s:NetrwLcd(curdir)
7310" call Dret("s:NetrwMarkFileCopy : lcd failure")
7311 return
7312 endif
Bram Moolenaar29634562020-01-09 21:46:04 +01007313 if delete(tmpdir,"d")
7314 call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".tmpdir.">!",103)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007315 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007316 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02007317 if s:NetrwLcd(curdir)
7318" call Dret("s:NetrwMarkFileCopy : lcd failure")
7319 return
7320 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007321 endif
7322 endif
7323 endif
7324
7325 " -------
7326 " cleanup
7327 " -------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007328" call Decho("cleanup",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02007329 " remove markings from local buffer
7330 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007331" call Decho(" g:netrw_fastbrowse =".g:netrw_fastbrowse,'~'.expand("<slnum>"))
7332" call Decho(" s:netrwmftgt =".s:netrwmftgt,'~'.expand("<slnum>"))
7333" call Decho(" s:netrwmftgt_islocal=".s:netrwmftgt_islocal,'~'.expand("<slnum>"))
7334" call Decho(" curdir =".curdir,'~'.expand("<slnum>"))
7335" call Decho(" a:islocal =".a:islocal,'~'.expand("<slnum>"))
7336" call Decho(" curbufnr =".curbufnr,'~'.expand("<slnum>"))
7337 if exists("s:recursive")
7338" call Decho(" s:recursive =".s:recursive,'~'.expand("<slnum>"))
7339 else
7340" call Decho(" s:recursive =n/a",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007341 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007342 " see s:LocalFastBrowser() for g:netrw_fastbrowse interpretation (refreshing done for both slow and medium)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007343 if g:netrw_fastbrowse <= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007344 NetrwKeepj call s:LocalBrowseRefresh()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007345 else
7346 " refresh local and targets for fast browsing
7347 if !exists("s:recursive")
7348 " remove markings from local buffer
7349" call Decho(" remove markings from local buffer",'~'.expand("<slnum>"))
7350 NetrwKeepj call s:NetrwUnmarkList(curbufnr,curdir)
7351 endif
7352
7353 " refresh buffers
7354 if s:netrwmftgt_islocal
7355" call Decho(" refresh s:netrwmftgt=".s:netrwmftgt,'~'.expand("<slnum>"))
7356 NetrwKeepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
7357 endif
7358 if a:islocal && s:netrwmftgt != curdir
7359" call Decho(" refresh curdir=".curdir,'~'.expand("<slnum>"))
7360 NetrwKeepj call s:NetrwRefreshDir(a:islocal,curdir)
7361 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007362 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007363
Bram Moolenaar446cb832008-06-24 21:56:24 +00007364" call Dret("s:NetrwMarkFileCopy 1")
7365 return 1
7366endfun
7367
7368" ---------------------------------------------------------------------
7369" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
7370" invoke vim's diff mode on the marked files.
7371" Either two or three files can be so handled.
7372" Uses the global marked file list.
7373fun! s:NetrwMarkFileDiff(islocal)
7374" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
7375 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007376
Bram Moolenaarff034192013-04-24 18:51:19 +02007377 " sanity check
7378 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007379 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007380" call Dret("s:NetrwMarkFileDiff")
7381 return
7382 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007383 let curdir= s:NetrwGetCurdir(a:islocal)
7384" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007385
Bram Moolenaara6878372014-03-22 21:02:50 +01007386 if exists("s:netrwmarkfilelist_{".curbufnr."}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007387 let cnt = 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007388 for fname in s:netrwmarkfilelist
7389 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007390 if cnt == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007391" call Decho("diffthis: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007392 exe "NetrwKeepj e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007393 diffthis
7394 elseif cnt == 2 || cnt == 3
7395 vsplit
7396 wincmd l
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007397" call Decho("diffthis: ".fname,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007398 exe "NetrwKeepj e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007399 diffthis
7400 else
7401 break
7402 endif
7403 endfor
7404 call s:NetrwUnmarkList(curbufnr,curdir)
7405 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007406
Bram Moolenaar446cb832008-06-24 21:56:24 +00007407" call Dret("s:NetrwMarkFileDiff")
7408endfun
7409
7410" ---------------------------------------------------------------------
7411" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
7412" Uses global markfilelist
7413fun! s:NetrwMarkFileEdit(islocal)
7414" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
7415
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007416 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007417 let curbufnr = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02007418
7419 " sanity check
7420 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007421 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007422" call Dret("s:NetrwMarkFileEdit")
7423 return
7424 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007425" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007426
Bram Moolenaar446cb832008-06-24 21:56:24 +00007427 if exists("s:netrwmarkfilelist_{curbufnr}")
7428 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007429 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007430 " unmark markedfile list
7431" call s:NetrwUnmarkList(curbufnr,curdir)
7432 call s:NetrwUnmarkAll()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007433" call Decho("exe sil args ".flist,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007434 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00007435 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007436 echo "(use :bn, :bp to navigate files; :Rex to return)"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007437
Bram Moolenaar446cb832008-06-24 21:56:24 +00007438" call Dret("s:NetrwMarkFileEdit")
7439endfun
7440
7441" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007442" s:NetrwMarkFileQFEL: convert a quickfix-error or location list into a marked file list {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +02007443fun! s:NetrwMarkFileQFEL(islocal,qfel)
7444" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
7445 call s:NetrwUnmarkAll()
7446 let curbufnr= bufnr("%")
7447
7448 if !empty(a:qfel)
7449 for entry in a:qfel
7450 let bufnmbr= entry["bufnr"]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007451" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"],'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007452 if !exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007453" call Decho("case: no marked file list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007454 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
7455 elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
7456 " s:NetrwMarkFile will remove duplicate entries from the marked file list.
7457 " So, this test lets two or more hits on the same pattern to be ignored.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007458" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007459 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
7460 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007461" call Decho("case: ".bufname(bufnmbr)." already in marked file list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007462 endif
7463 endfor
7464 echo "(use me to edit marked files)"
7465 else
7466 call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
7467 endif
7468
7469" call Dret("s:NetrwMarkFileQFEL")
7470endfun
7471
7472" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007473" s:NetrwMarkFileExe: (invoked by mx and mX) execute arbitrary system command on marked files {{{2
7474" mx enbloc=0: Uses the local marked-file list, applies command to each file individually
7475" mX enbloc=1: Uses the global marked-file list, applies command to entire list
7476fun! s:NetrwMarkFileExe(islocal,enbloc)
7477" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.",enbloc=".a:enbloc.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007478 let svpos = winsaveview()
7479" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007480 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007481 let curbufnr = bufnr("%")
7482
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007483 if a:enbloc == 0
7484 " individually apply command to files, one at a time
7485 " sanity check
7486 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
7487 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
7488" call Dret("s:NetrwMarkFileExe")
7489 return
7490 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007491" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007492
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007493 if exists("s:netrwmarkfilelist_{curbufnr}")
7494 " get the command
7495 call inputsave()
7496 let cmd= input("Enter command: ","","file")
7497 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007498" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007499 if cmd == ""
7500" call Dret("s:NetrwMarkFileExe : early exit, empty command")
7501 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007502 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007503
7504 " apply command to marked files, individually. Substitute: filename -> %
7505 " If no %, then append a space and the filename to the command
7506 for fname in s:netrwmarkfilelist_{curbufnr}
7507 if a:islocal
7508 if g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007509 let fname= s:ShellEscape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007510 endif
7511 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007512 let fname= s:ShellEscape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007513 endif
7514 if cmd =~ '%'
7515 let xcmd= substitute(cmd,'%',fname,'g')
7516 else
7517 let xcmd= cmd.' '.fname
7518 endif
7519 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007520" call Decho("local: xcmd<".xcmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007521 let ret= system(xcmd)
7522 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007523" call Decho("remote: xcmd<".xcmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007524 let ret= s:RemoteSystem(xcmd)
7525 endif
7526 if v:shell_error < 0
7527 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
7528 break
7529 else
7530 echo ret
7531 endif
7532 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00007533
7534 " unmark marked file list
7535 call s:NetrwUnmarkList(curbufnr,curdir)
7536
7537 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007538 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007539" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7540 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007541 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007542 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007543 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007544
7545 else " apply command to global list of files, en bloc
7546
7547 call inputsave()
7548 let cmd= input("Enter command: ","","file")
7549 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007550" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007551 if cmd == ""
7552" call Dret("s:NetrwMarkFileExe : early exit, empty command")
7553 return
7554 endif
7555 if cmd =~ '%'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007556 let cmd= substitute(cmd,'%',join(map(s:netrwmarkfilelist,'s:ShellEscape(v:val)'),' '),'g')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007557 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007558 let cmd= cmd.' '.join(map(s:netrwmarkfilelist,'s:ShellEscape(v:val)'),' ')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007559 endif
7560 if a:islocal
7561 call system(cmd)
7562 if v:shell_error < 0
7563 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
7564 endif
7565 else
7566 let ret= s:RemoteSystem(cmd)
7567 endif
7568 call s:NetrwUnmarkAll()
7569
7570 " refresh the listing
7571 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007572" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7573 NetrwKeepj call winrestview(svpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007574
7575 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007576
Bram Moolenaar446cb832008-06-24 21:56:24 +00007577" call Dret("s:NetrwMarkFileExe")
7578endfun
7579
7580" ---------------------------------------------------------------------
7581" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
7582" as the marked file(s) (toggles suffix presence)
7583" Uses the local marked file list.
7584fun! s:NetrwMarkHideSfx(islocal)
7585" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007586 let svpos = winsaveview()
7587" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007588 let curbufnr = bufnr("%")
7589
7590 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
7591 if exists("s:netrwmarkfilelist_{curbufnr}")
7592
7593 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007594" call Decho("s:NetrwMarkFileCopy: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007595 " construct suffix pattern
7596 if fname =~ '\.'
7597 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
7598 else
7599 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
7600 endif
7601 " determine if its in the hiding list or not
7602 let inhidelist= 0
7603 if g:netrw_list_hide != ""
7604 let itemnum = 0
7605 let hidelist= split(g:netrw_list_hide,',')
7606 for hidepat in hidelist
7607 if sfxpat == hidepat
7608 let inhidelist= 1
7609 break
7610 endif
7611 let itemnum= itemnum + 1
7612 endfor
7613 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007614" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007615 if inhidelist
7616 " remove sfxpat from list
7617 call remove(hidelist,itemnum)
7618 let g:netrw_list_hide= join(hidelist,",")
7619 elseif g:netrw_list_hide != ""
7620 " append sfxpat to non-empty list
7621 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
7622 else
7623 " set hiding list to sfxpat
7624 let g:netrw_list_hide= sfxpat
7625 endif
7626 endfor
7627
7628 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007629 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007630" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7631 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007632 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007633 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007634 endif
7635
7636" call Dret("s:NetrwMarkHideSfx")
7637endfun
7638
7639" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007640" s:NetrwMarkFileVimCmd: (invoked by mv) execute arbitrary vim command on marked files, one at a time {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +02007641" Uses the local marked-file list.
7642fun! s:NetrwMarkFileVimCmd(islocal)
7643" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007644 let svpos = winsaveview()
7645" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007646 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02007647 let curbufnr = bufnr("%")
7648
Bram Moolenaarff034192013-04-24 18:51:19 +02007649 " sanity check
7650 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007651 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007652" call Dret("s:NetrwMarkFileVimCmd")
7653 return
7654 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007655" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007656
Bram Moolenaar15146672011-10-20 22:22:38 +02007657 if exists("s:netrwmarkfilelist_{curbufnr}")
7658 " get the command
7659 call inputsave()
7660 let cmd= input("Enter vim command: ","","file")
7661 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007662" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007663 if cmd == ""
7664" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
7665 return
7666 endif
7667
7668 " apply command to marked files. Substitute: filename -> %
7669 " If no %, then append a space and the filename to the command
7670 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007671" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007672 if a:islocal
7673 1split
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007674 exe "sil! NetrwKeepj keepalt e ".fnameescape(fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007675" call Decho("local<".fname.">: exe ".cmd,'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007676 exe cmd
7677 exe "sil! keepalt wq!"
7678 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007679" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007680 echo "sorry, \"mv\" not supported yet for remote files"
Bram Moolenaar15146672011-10-20 22:22:38 +02007681 endif
7682 endfor
7683
7684 " unmark marked file list
7685 call s:NetrwUnmarkList(curbufnr,curdir)
7686
7687 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007688 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007689" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7690 NetrwKeepj call winrestview(svpos)
Bram Moolenaar15146672011-10-20 22:22:38 +02007691 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007692 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar15146672011-10-20 22:22:38 +02007693 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007694
Bram Moolenaar15146672011-10-20 22:22:38 +02007695" call Dret("s:NetrwMarkFileVimCmd")
7696endfun
7697
7698" ---------------------------------------------------------------------
7699" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
7700" as the marked file(s) (toggles suffix presence)
7701" Uses the local marked file list.
7702fun! s:NetrwMarkHideSfx(islocal)
7703" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007704 let svpos = winsaveview()
7705" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007706 let curbufnr = bufnr("%")
7707
7708 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
7709 if exists("s:netrwmarkfilelist_{curbufnr}")
7710
7711 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007712" call Decho("s:NetrwMarkFileCopy: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007713 " construct suffix pattern
7714 if fname =~ '\.'
7715 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
7716 else
7717 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
7718 endif
7719 " determine if its in the hiding list or not
7720 let inhidelist= 0
7721 if g:netrw_list_hide != ""
7722 let itemnum = 0
7723 let hidelist= split(g:netrw_list_hide,',')
7724 for hidepat in hidelist
7725 if sfxpat == hidepat
7726 let inhidelist= 1
7727 break
7728 endif
7729 let itemnum= itemnum + 1
7730 endfor
7731 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007732" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007733 if inhidelist
7734 " remove sfxpat from list
7735 call remove(hidelist,itemnum)
7736 let g:netrw_list_hide= join(hidelist,",")
7737 elseif g:netrw_list_hide != ""
7738 " append sfxpat to non-empty list
7739 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
7740 else
7741 " set hiding list to sfxpat
7742 let g:netrw_list_hide= sfxpat
7743 endif
7744 endfor
7745
7746 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007747 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007748" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7749 NetrwKeepj call winrestview(svpos)
Bram Moolenaar15146672011-10-20 22:22:38 +02007750 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007751 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar15146672011-10-20 22:22:38 +02007752 endif
7753
7754" call Dret("s:NetrwMarkHideSfx")
7755endfun
7756
7757" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007758" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
7759" Uses the global markfilelist
7760fun! s:NetrwMarkFileGrep(islocal)
7761" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007762 let svpos = winsaveview()
7763" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007764 let curbufnr = bufnr("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007765 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007766
7767 if exists("s:netrwmarkfilelist")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01007768" call Decho("using s:netrwmarkfilelist".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007769 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01007770" call Decho("keeping copy of s:netrwmarkfilelist in function-local variable,'~'.expand("<slnum>"))"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007771 call s:NetrwUnmarkAll()
Bram Moolenaarff034192013-04-24 18:51:19 +02007772 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007773" call Decho('no marked files, using "*"','~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007774 let netrwmarkfilelist= "*"
7775 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007776
Bram Moolenaarff034192013-04-24 18:51:19 +02007777 " ask user for pattern
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01007778" call Decho("ask user for search pattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007779 call inputsave()
7780 let pat= input("Enter pattern: ","")
7781 call inputrestore()
7782 let patbang = ""
7783 if pat =~ '^!'
7784 let patbang = "!"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007785 let pat = strpart(pat,2)
Bram Moolenaarff034192013-04-24 18:51:19 +02007786 endif
7787 if pat =~ '^\i'
7788 let pat = escape(pat,'/')
7789 let pat = '/'.pat.'/'
7790 else
7791 let nonisi = pat[0]
7792 endif
7793
7794 " use vimgrep for both local and remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007795" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007796 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007797 exe "NetrwKeepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
Bram Moolenaarff034192013-04-24 18:51:19 +02007798 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007799 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
Bram Moolenaarff034192013-04-24 18:51:19 +02007800" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
7801 return
7802 endtry
7803 echo "(use :cn, :cp to navigate, :Rex to return)"
7804
7805 2match none
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007806" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7807 NetrwKeepj call winrestview(svpos)
Bram Moolenaarff034192013-04-24 18:51:19 +02007808
7809 if exists("nonisi")
7810 " original, user-supplied pattern did not begin with a character from isident
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007811" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02007812 if pat =~# nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
Bram Moolenaarff034192013-04-24 18:51:19 +02007813 call s:NetrwMarkFileQFEL(a:islocal,getqflist())
Bram Moolenaar446cb832008-06-24 21:56:24 +00007814 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007815 endif
7816
7817" call Dret("s:NetrwMarkFileGrep")
7818endfun
7819
7820" ---------------------------------------------------------------------
7821" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
7822" uses the global marked file list
7823" s:netrwmfloc= 0: target directory is remote
7824" = 1: target directory is local
7825fun! s:NetrwMarkFileMove(islocal)
7826" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007827 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007828 let curbufnr = bufnr("%")
7829
7830 " sanity check
Bram Moolenaarff034192013-04-24 18:51:19 +02007831 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007832 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007833" call Dret("s:NetrwMarkFileMove")
7834 return
7835 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007836" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007837
Bram Moolenaar446cb832008-06-24 21:56:24 +00007838 if !exists("s:netrwmftgt")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007839 NetrwKeepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007840" call Dret("s:NetrwMarkFileCopy 0")
7841 return 0
7842 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007843" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007844
7845 if a:islocal && s:netrwmftgt_islocal
7846 " move: local -> local
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007847" call Decho("move from local to local",'~'.expand("<slnum>"))
7848" call Decho("local to local move",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007849 if !executable(g:netrw_localmovecmd)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007850 call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
7851" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
7852 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007853 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02007854 let tgt = s:ShellEscape(s:netrwmftgt)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007855" call Decho("tgt<".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007856 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007857 let tgt= substitute(tgt, '/','\\','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007858" call Decho("windows exception: tgt<".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007859 if g:netrw_localmovecmd =~ '\s'
7860 let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','')
7861 let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
7862 let movecmd = netrw#WinPath(movecmd).movecmdargs
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007863" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007864 else
7865 let movecmd = netrw#WinPath(movecmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007866" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007867 endif
7868 else
7869 let movecmd = netrw#WinPath(g:netrw_localmovecmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007870" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007871 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007872 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar71badf92023-04-22 22:40:14 +01007873 if g:netrw_keepdir
7874 " Jul 19, 2022: fixing file move when g:netrw_keepdir is 1
7875 let fname= b:netrw_curdir."/".fname
7876 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007877 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7878 let fname= substitute(fname,'/','\\','g')
Bram Moolenaar71badf92023-04-22 22:40:14 +01007879 if g:netrw_keepdir
7880 " Jul 19, 2022: fixing file move when g:netrw_keepdir is 1
7881 let fname= b:netrw_curdir."\\".fname
7882 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007883 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007884" call Decho("system(".movecmd." ".s:ShellEscape(fname)." ".tgt.")",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02007885 let ret= system(movecmd.g:netrw_localmovecmdopt." ".s:ShellEscape(fname)." ".tgt)
Bram Moolenaarff034192013-04-24 18:51:19 +02007886 if v:shell_error != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007887 if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
Bram Moolenaar85850f32019-07-19 22:05:51 +02007888 call netrw#ErrorMsg(s:ERROR,"move failed; perhaps due to vim's current directory<".getcwd()."> not matching netrw's (".b:netrw_curdir.") (see :help netrw-cd)",100)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007889 else
7890 call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localmovecmd<".g:netrw_localmovecmd.">; it doesn't work!",54)
7891 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007892 break
7893 endif
7894 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00007895
7896 elseif a:islocal && !s:netrwmftgt_islocal
7897 " move: local -> remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007898" call Decho("move from local to remote",'~'.expand("<slnum>"))
7899" call Decho("copy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007900 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007901 NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007902" call Decho("remove",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007903 for fname in mflist
7904 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
7905 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
7906 endfor
7907 unlet mflist
7908
7909 elseif !a:islocal && s:netrwmftgt_islocal
7910 " move: remote -> local
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007911" call Decho("move from remote to local",'~'.expand("<slnum>"))
7912" call Decho("copy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007913 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007914 NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007915" call Decho("remove",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007916 for fname in mflist
7917 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
7918 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
7919 endfor
7920 unlet mflist
7921
7922 elseif !a:islocal && !s:netrwmftgt_islocal
7923 " move: remote -> remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007924" call Decho("move from remote to remote",'~'.expand("<slnum>"))
7925" call Decho("copy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007926 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007927 NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007928" call Decho("remove",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007929 for fname in mflist
7930 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
7931 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
7932 endfor
7933 unlet mflist
7934 endif
7935
7936 " -------
7937 " cleanup
7938 " -------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007939" call Decho("cleanup",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007940
7941 " remove markings from local buffer
7942 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
7943
7944 " refresh buffers
7945 if !s:netrwmftgt_islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007946" call Decho("refresh netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007947 NetrwKeepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007948 endif
7949 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007950" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007951 NetrwKeepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007952 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007953 if g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007954" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007955 NetrwKeepj call s:LocalBrowseRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007956 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007957
Bram Moolenaar446cb832008-06-24 21:56:24 +00007958" call Dret("s:NetrwMarkFileMove")
7959endfun
7960
7961" ---------------------------------------------------------------------
7962" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
7963" using the hardcopy command. Local marked-file list only.
7964fun! s:NetrwMarkFilePrint(islocal)
7965" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
7966 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02007967
7968 " sanity check
7969 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007970 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007971" call Dret("s:NetrwMarkFilePrint")
7972 return
7973 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007974" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
7975 let curdir= s:NetrwGetCurdir(a:islocal)
7976
Bram Moolenaar446cb832008-06-24 21:56:24 +00007977 if exists("s:netrwmarkfilelist_{curbufnr}")
7978 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
Bram Moolenaar446cb832008-06-24 21:56:24 +00007979 call s:NetrwUnmarkList(curbufnr,curdir)
7980 for fname in netrwmarkfilelist
7981 if a:islocal
7982 if g:netrw_keepdir
7983 let fname= s:ComposePath(curdir,fname)
7984 endif
7985 else
7986 let fname= curdir.fname
7987 endif
7988 1split
7989 " the autocmds will handle both local and remote files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007990" call Decho("exe sil e ".escape(fname,' '),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007991 exe "sil NetrwKeepj e ".fnameescape(fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007992" call Decho("hardcopy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007993 hardcopy
7994 q
7995 endfor
7996 2match none
7997 endif
7998" call Dret("s:NetrwMarkFilePrint")
7999endfun
8000
8001" ---------------------------------------------------------------------
8002" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
8003" files when given a regexp (for which a prompt is
Bram Moolenaarff034192013-04-24 18:51:19 +02008004" issued) (matches to name of files).
Bram Moolenaar446cb832008-06-24 21:56:24 +00008005fun! s:NetrwMarkFileRegexp(islocal)
8006" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
8007
8008 " get the regular expression
8009 call inputsave()
8010 let regexp= input("Enter regexp: ","","file")
8011 call inputrestore()
8012
8013 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008014 let curdir= s:NetrwGetCurdir(a:islocal)
Bram Moolenaar85850f32019-07-19 22:05:51 +02008015" call Decho("curdir<".fnameescape(curdir).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008016 " get the matching list of files using local glob()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008017" call Decho("handle local regexp",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008018 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02008019 if v:version > 704 || (v:version == 704 && has("patch656"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02008020 let filelist= glob(s:ComposePath(dirname,regexp),0,1,1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008021 else
8022 let files = glob(s:ComposePath(dirname,regexp),0,0)
Bram Moolenaar85850f32019-07-19 22:05:51 +02008023 let filelist= split(files,"\n")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008024 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02008025" call Decho("files<".string(filelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008026
8027 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01008028 for fname in filelist
Bram Moolenaar85850f32019-07-19 22:05:51 +02008029 if fname =~ '^'.fnameescape(curdir)
8030" call Decho("fname<".substitute(fname,'^'.fnameescape(curdir).'/','','').">",'~'.expand("<slnum>"))
8031 NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^'.fnameescape(curdir).'/','',''))
8032 else
8033" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
8034 NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
8035 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008036 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00008037
8038 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008039" call Decho("handle remote regexp",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008040
8041 " convert displayed listing into a filelist
8042 let eikeep = &ei
8043 let areg = @a
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008044 sil NetrwKeepj %y a
Bram Moolenaara6878372014-03-22 21:02:50 +01008045 setl ei=all ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008046" call Decho("setl ei=all ma",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008047 1split
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008048 NetrwKeepj call s:NetrwEnew()
Bram Moolenaar85850f32019-07-19 22:05:51 +02008049 NetrwKeepj call s:NetrwOptionsSafe(a:islocal)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008050 sil NetrwKeepj norm! "ap
8051 NetrwKeepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00008052 let bannercnt= search('^" =====','W')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008053 exe "sil NetrwKeepj 1,".bannercnt."d"
Bram Moolenaara6878372014-03-22 21:02:50 +01008054 setl bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008055 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008056 sil NetrwKeepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01008057 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008058 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008059 sil NetrwKeepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01008060 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008061 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008062 exe 'sil NetrwKeepj %s/^'.s:treedepthstring.' //e'
8063 sil! NetrwKeepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01008064 call histdel("/",-1)
8065 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008066 endif
8067 " convert regexp into the more usual glob-style format
8068 let regexp= substitute(regexp,'\*','.*','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008069" call Decho("regexp<".regexp.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008070 exe "sil! NetrwKeepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01008071 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008072 let filelist= getline(1,line("$"))
8073 q!
8074 for filename in filelist
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008075 NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008076 endfor
8077 unlet filelist
8078 let @a = areg
8079 let &ei = eikeep
8080 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02008081 echo " (use me to edit marked files)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008082
8083" call Dret("s:NetrwMarkFileRegexp")
8084endfun
8085
8086" ---------------------------------------------------------------------
8087" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
8088" Uses the local marked file list.
8089fun! s:NetrwMarkFileSource(islocal)
8090" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
8091 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02008092
8093 " sanity check
8094 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008095 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02008096" call Dret("s:NetrwMarkFileSource")
8097 return
8098 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008099" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
8100 let curdir= s:NetrwGetCurdir(a:islocal)
8101
Bram Moolenaar446cb832008-06-24 21:56:24 +00008102 if exists("s:netrwmarkfilelist_{curbufnr}")
8103 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar446cb832008-06-24 21:56:24 +00008104 call s:NetrwUnmarkList(curbufnr,curdir)
8105 for fname in netrwmarkfilelist
8106 if a:islocal
8107 if g:netrw_keepdir
8108 let fname= s:ComposePath(curdir,fname)
8109 endif
8110 else
8111 let fname= curdir.fname
8112 endif
8113 " the autocmds will handle sourcing both local and remote files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008114" call Decho("exe so ".fnameescape(fname),'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008115 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008116 endfor
8117 2match none
8118 endif
8119" call Dret("s:NetrwMarkFileSource")
8120endfun
8121
8122" ---------------------------------------------------------------------
8123" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
8124" Uses the global markfilelist
8125fun! s:NetrwMarkFileTag(islocal)
8126" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008127 let svpos = winsaveview()
8128" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008129 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008130 let curbufnr = bufnr("%")
8131
Bram Moolenaarff034192013-04-24 18:51:19 +02008132 " sanity check
8133 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008134 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02008135" call Dret("s:NetrwMarkFileTag")
8136 return
8137 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008138" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008139
Bram Moolenaar446cb832008-06-24 21:56:24 +00008140 if exists("s:netrwmarkfilelist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008141" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
8142 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "s:ShellEscape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008143 call s:NetrwUnmarkAll()
8144
8145 if a:islocal
Bram Moolenaar85850f32019-07-19 22:05:51 +02008146
8147" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")",'~'.expand("<slnum>"))
8148 call system(g:netrw_ctags." ".netrwmarkfilelist)
8149 if v:shell_error
Bram Moolenaar446cb832008-06-24 21:56:24 +00008150 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
8151 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02008152
Bram Moolenaar446cb832008-06-24 21:56:24 +00008153 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008154 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaara6878372014-03-22 21:02:50 +01008155 call netrw#Obtain(a:islocal,"tags")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008156 let curdir= b:netrw_curdir
8157 1split
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008158 NetrwKeepj e tags
Bram Moolenaar446cb832008-06-24 21:56:24 +00008159 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008160" call Decho("curdir<".curdir."> path<".path.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008161 exe 'NetrwKeepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01008162 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008163 wq!
8164 endif
8165 2match none
8166 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008167" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8168 call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008169 endif
8170
8171" call Dret("s:NetrwMarkFileTag")
8172endfun
8173
8174" ---------------------------------------------------------------------
8175" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008176" Sets up two variables,
Bram Moolenaarff034192013-04-24 18:51:19 +02008177" s:netrwmftgt : holds the target directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00008178" s:netrwmftgt_islocal : 0=target directory is remote
Bram Moolenaarff034192013-04-24 18:51:19 +02008179" 1=target directory is local
Bram Moolenaar446cb832008-06-24 21:56:24 +00008180fun! s:NetrwMarkFileTgt(islocal)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008181" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
8182 let svpos = winsaveview()
8183" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008184 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008185 let hadtgt = exists("s:netrwmftgt")
8186 if !exists("w:netrw_bannercnt")
8187 let w:netrw_bannercnt= b:netrw_bannercnt
8188 endif
8189
8190 " set up target
8191 if line(".") < w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008192" call Decho("set up target: line(.) < w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008193 " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
8194 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008195" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008196 unlet s:netrwmftgt s:netrwmftgt_islocal
8197 if g:netrw_fastbrowse <= 1
Bram Moolenaara6878372014-03-22 21:02:50 +01008198 call s:LocalBrowseRefresh()
Bram Moolenaarff034192013-04-24 18:51:19 +02008199 endif
8200 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008201" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8202 call winrestview(svpos)
Bram Moolenaarff034192013-04-24 18:51:19 +02008203" call Dret("s:NetrwMarkFileTgt : removed target")
8204 return
8205 else
8206 let s:netrwmftgt= b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008207" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008208 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008209
8210 else
8211 " get word under cursor.
8212 " * If directory, use it for the target.
8213 " * If file, use b:netrw_curdir for the target
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008214" call Decho("get word under cursor",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008215 let curword= s:NetrwGetWord()
8216 let tgtdir = s:ComposePath(curdir,curword)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008217 if a:islocal && isdirectory(s:NetrwFile(tgtdir))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008218 let s:netrwmftgt = tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008219" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008220 elseif !a:islocal && tgtdir =~ '/$'
8221 let s:netrwmftgt = tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008222" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008223 else
8224 let s:netrwmftgt = curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008225" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008226 endif
8227 endif
8228 if a:islocal
8229 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
8230 let s:netrwmftgt= simplify(s:netrwmftgt)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008231" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008232 endif
8233 if g:netrw_cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008234 let s:netrwmftgt= substitute(system("cygpath ".s:ShellEscape(s:netrwmftgt)),'\n$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008235 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
8236 endif
8237 let s:netrwmftgt_islocal= a:islocal
8238
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008239 " need to do refresh so that the banner will be updated
8240 " s:LocalBrowseRefresh handles all local-browsing buffers when not fast browsing
Bram Moolenaar5c736222010-01-06 20:54:52 +01008241 if g:netrw_fastbrowse <= 1
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02008242" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse.", so refreshing all local netrw buffers",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01008243 call s:LocalBrowseRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008244 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008245" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008246 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008247 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,w:netrw_treetop))
8248 else
8249 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
8250 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008251" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8252 call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008253 if !hadtgt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008254 sil! NetrwKeepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00008255 endif
8256
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008257" call Decho("getmatches=".string(getmatches()),'~'.expand("<slnum>"))
8258" call Decho("s:netrwmarkfilelist=".(exists("s:netrwmarkfilelist")? string(s:netrwmarkfilelist) : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008259" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
8260endfun
8261
8262" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008263" s:NetrwGetCurdir: gets current directory and sets up b:netrw_curdir if necessary {{{2
8264fun! s:NetrwGetCurdir(islocal)
8265" call Dfunc("s:NetrwGetCurdir(islocal=".a:islocal.")")
8266
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008267 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008268 let b:netrw_curdir = s:NetrwTreePath(w:netrw_treetop)
8269" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used s:NetrwTreeDir)",'~'.expand("<slnum>"))
8270 elseif !exists("b:netrw_curdir")
8271 let b:netrw_curdir= getcwd()
8272" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)",'~'.expand("<slnum>"))
8273 endif
8274
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02008275" call Decho("b:netrw_curdir<".b:netrw_curdir."> ".((b:netrw_curdir !~ '\<\a\{3,}://')? "does not match" : "matches")." url pattern",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008276 if b:netrw_curdir !~ '\<\a\{3,}://'
8277 let curdir= b:netrw_curdir
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02008278" call Decho("g:netrw_keepdir=".g:netrw_keepdir,'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008279 if g:netrw_keepdir == 0
8280 call s:NetrwLcd(curdir)
8281 endif
8282 endif
8283
8284" call Dret("s:NetrwGetCurdir <".curdir.">")
8285 return b:netrw_curdir
8286endfun
8287
8288" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008289" s:NetrwOpenFile: query user for a filename and open it {{{2
8290fun! s:NetrwOpenFile(islocal)
8291" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008292 let ykeep= @@
Bram Moolenaarc236c162008-07-13 17:41:49 +00008293 call inputsave()
8294 let fname= input("Enter filename: ")
8295 call inputrestore()
Bram Moolenaar89a9c152021-08-29 21:55:35 +02008296" call Decho("(s:NetrwOpenFile) fname<".fname.">",'~'.expand("<slnum>"))
8297
8298 " determine if Lexplore is in use
8299 if exists("t:netrw_lexbufnr")
8300 " check if t:netrw_lexbufnr refers to a netrw window
8301" call Decho("(s:netrwOpenFile) ..t:netrw_lexbufnr=".t:netrw_lexbufnr,'~'.expand("<slnum>"))
8302 let lexwinnr = bufwinnr(t:netrw_lexbufnr)
8303 if lexwinnr != -1 && exists("g:netrw_chgwin") && g:netrw_chgwin != -1
8304" call Decho("(s:netrwOpenFile) ..Lexplore in use",'~'.expand("<slnum>"))
8305 exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w"
8306 exe "NetrwKeepj e ".fnameescape(fname)
8307 let @@= ykeep
8308" call Dret("s:NetrwOpenFile : creating a file with Lexplore mode")
8309 endif
8310 endif
8311
8312 " Does the filename contain a path?
Bram Moolenaarc236c162008-07-13 17:41:49 +00008313 if fname !~ '[/\\]'
8314 if exists("b:netrw_curdir")
8315 if exists("g:netrw_quiet")
8316 let netrw_quiet_keep = g:netrw_quiet
8317 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008318 let g:netrw_quiet = 1
8319 " save position for benefit of Rexplore
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008320 let s:rexposn_{bufnr("%")}= winsaveview()
8321" call Decho("saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008322 if b:netrw_curdir =~ '/$'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008323 exe "NetrwKeepj e ".fnameescape(b:netrw_curdir.fname)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008324 else
8325 exe "e ".fnameescape(b:netrw_curdir."/".fname)
8326 endif
8327 if exists("netrw_quiet_keep")
8328 let g:netrw_quiet= netrw_quiet_keep
8329 else
8330 unlet g:netrw_quiet
8331 endif
8332 endif
8333 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008334 exe "NetrwKeepj e ".fnameescape(fname)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008335 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008336 let @@= ykeep
Bram Moolenaarc236c162008-07-13 17:41:49 +00008337" call Dret("s:NetrwOpenFile")
8338endfun
8339
8340" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008341" netrw#Shrink: shrinks/expands a netrw or Lexplorer window {{{2
8342" For the mapping to this function be made via
8343" netrwPlugin, you'll need to have had
8344" g:netrw_usetab set to non-zero.
8345fun! netrw#Shrink()
8346" call Dfunc("netrw#Shrink() ft<".&ft."> winwidth=".winwidth(0)." lexbuf#".((exists("t:netrw_lexbufnr"))? t:netrw_lexbufnr : 'n/a'))
8347 let curwin = winnr()
8348 let wiwkeep = &wiw
8349 set wiw=1
8350
8351 if &ft == "netrw"
8352 if winwidth(0) > g:netrw_wiw
8353 let t:netrw_winwidth= winwidth(0)
8354 exe "vert resize ".g:netrw_wiw
8355 wincmd l
8356 if winnr() == curwin
8357 wincmd h
8358 endif
8359" call Decho("vert resize 0",'~'.expand("<slnum>"))
8360 else
8361 exe "vert resize ".t:netrw_winwidth
8362" call Decho("vert resize ".t:netrw_winwidth,'~'.expand("<slnum>"))
8363 endif
8364
8365 elseif exists("t:netrw_lexbufnr")
8366 exe bufwinnr(t:netrw_lexbufnr)."wincmd w"
8367 if winwidth(bufwinnr(t:netrw_lexbufnr)) > g:netrw_wiw
8368 let t:netrw_winwidth= winwidth(0)
8369 exe "vert resize ".g:netrw_wiw
8370 wincmd l
8371 if winnr() == curwin
8372 wincmd h
8373 endif
8374" call Decho("vert resize 0",'~'.expand("<slnum>"))
8375 elseif winwidth(bufwinnr(t:netrw_lexbufnr)) >= 0
8376 exe "vert resize ".t:netrw_winwidth
8377" call Decho("vert resize ".t:netrw_winwidth,'~'.expand("<slnum>"))
8378 else
8379 call netrw#Lexplore(0,0)
8380 endif
8381
8382 else
8383 call netrw#Lexplore(0,0)
8384 endif
8385 let wiw= wiwkeep
8386
8387" call Dret("netrw#Shrink")
8388endfun
8389
8390" ---------------------------------------------------------------------
8391" s:NetSortSequence: allows user to edit the sorting sequence {{{2
8392fun! s:NetSortSequence(islocal)
8393" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
8394
8395 let ykeep= @@
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008396 let svpos= winsaveview()
8397" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008398 call inputsave()
8399 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
8400 call inputrestore()
8401
8402 " refresh the listing
8403 let g:netrw_sort_sequence= newsortseq
8404 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008405" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8406 NetrwKeepj call winrestview(svpos)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008407 let @@= ykeep
8408
8409" call Dret("NetSortSequence")
8410endfun
8411
8412" ---------------------------------------------------------------------
8413" s:NetrwUnmarkList: delete local marked file list and remove their contents from the global marked-file list {{{2
8414" User access provided by the <mF> mapping. (see :help netrw-mF)
Bram Moolenaarff034192013-04-24 18:51:19 +02008415" Used by many MarkFile functions.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008416fun! s:NetrwUnmarkList(curbufnr,curdir)
8417" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
8418
8419 " remove all files in local marked-file list from global list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008420 if exists("s:netrwmarkfilelist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008421 for mfile in s:netrwmarkfilelist_{a:curbufnr}
8422 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
8423 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
8424 call remove(s:netrwmarkfilelist,idx) " remove from global list
8425 endfor
8426 if s:netrwmarkfilelist == []
8427 unlet s:netrwmarkfilelist
8428 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008429
Bram Moolenaar446cb832008-06-24 21:56:24 +00008430 " getting rid of the local marked-file lists is easy
8431 unlet s:netrwmarkfilelist_{a:curbufnr}
8432 endif
8433 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
8434 unlet s:netrwmarkfilemtch_{a:curbufnr}
8435 endif
8436 2match none
8437" call Dret("s:NetrwUnmarkList")
8438endfun
8439
8440" ---------------------------------------------------------------------
8441" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
8442fun! s:NetrwUnmarkAll()
8443" call Dfunc("s:NetrwUnmarkAll()")
8444 if exists("s:netrwmarkfilelist")
8445 unlet s:netrwmarkfilelist
8446 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008447 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008448 2match none
8449" call Dret("s:NetrwUnmarkAll")
8450endfun
8451
8452" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02008453" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00008454fun! s:NetrwUnmarkAll2()
8455" call Dfunc("s:NetrwUnmarkAll2()")
8456 redir => netrwmarkfilelist_let
8457 let
8458 redir END
8459 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008460 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
Bram Moolenaar446cb832008-06-24 21:56:24 +00008461 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
8462 for flist in netrwmarkfilelist_list
8463 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
8464 unlet s:netrwmarkfilelist_{curbufnr}
8465 unlet s:netrwmarkfilemtch_{curbufnr}
8466 endfor
8467" call Dret("s:NetrwUnmarkAll2")
8468endfun
8469
8470" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008471" s:NetrwUnMarkFile: called via mu map; unmarks *all* marked files, both global and buffer-local {{{2
8472"
8473" Marked files are in two types of lists:
8474" s:netrwmarkfilelist -- holds complete paths to all marked files
8475" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
8476"
8477" Marked files suitable for use with 2match are in:
8478" s:netrwmarkfilemtch_# -- used with 2match to display marked files
Bram Moolenaar446cb832008-06-24 21:56:24 +00008479fun! s:NetrwUnMarkFile(islocal)
8480" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008481 let svpos = winsaveview()
8482" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008483 let curbufnr = bufnr("%")
8484
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008485 " unmark marked file list
8486 " (although I expect s:NetrwUpload() to do it, I'm just making sure)
8487 if exists("s:netrwmarkfilelist")
8488" " call Decho("unlet'ing: s:netrwmarkfilelist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008489 unlet s:netrwmarkfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00008490 endif
8491
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008492 let ibuf= 1
8493 while ibuf < bufnr("$")
8494 if exists("s:netrwmarkfilelist_".ibuf)
8495 unlet s:netrwmarkfilelist_{ibuf}
8496 unlet s:netrwmarkfilemtch_{ibuf}
8497 endif
8498 let ibuf = ibuf + 1
8499 endwhile
8500 2match none
8501
Bram Moolenaar446cb832008-06-24 21:56:24 +00008502" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008503"call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8504call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008505" call Dret("s:NetrwUnMarkFile")
8506endfun
8507
8508" ---------------------------------------------------------------------
8509" s:NetrwMenu: generates the menu for gvim and netrw {{{2
8510fun! s:NetrwMenu(domenu)
8511
8512 if !exists("g:NetrwMenuPriority")
8513 let g:NetrwMenuPriority= 80
8514 endif
8515
Bram Moolenaaradc21822011-04-01 18:03:16 +02008516 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00008517" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
8518
8519 if !exists("s:netrw_menu_enabled") && a:domenu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008520" call Decho("initialize menu",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008521 let s:netrw_menu_enabled= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008522 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
8523 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
8524 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
8525 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
8526 if g:netrw_dirhistmax > 0
8527 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
8528 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
8529 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
8530 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
8531 else
8532 exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\<cr>"
8533 endif
8534 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o o'
8535 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v v'
8536 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
8537 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p p'
8538 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
8539 exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
8540 exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
8541 exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
8542 exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
8543 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
8544 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
8545 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
8546 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
8547 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
8548 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008549 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Tab<tab>t t'
Bram Moolenaarff034192013-04-24 18:51:19 +02008550 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
8551 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
8552 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
8553 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
8554 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
8555 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
8556 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
8557 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
8558 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
8559 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
8560 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
8561 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
8562 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
8563 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
8564 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
8565 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
8566 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
8567 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
8568 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
8569 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
8570 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
8571 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
8572 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
8573 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
8574 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
8575 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
8576 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
8577 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
8578 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
8579 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.1 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Show\ All<tab>a :let g:netrw_hide=0<cr><c-L>'
8580 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.3 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Normal<tab>a :let g:netrw_hide=1<cr><c-L>'
8581 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Hidden\ Only<tab>a :let g:netrw_hide=2<cr><c-L>'
8582 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
8583 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.1 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Name<tab>s :let g:netrw_sort_by="name"<cr><c-L>'
8584 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.2 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Time<tab>s :let g:netrw_sort_by="time"<cr><c-L>'
8585 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.3 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Size<tab>s :let g:netrw_sort_by="size"<cr><c-L>'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008586 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.3 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Exten<tab>s :let g:netrw_sort_by="exten"<cr><c-L>'
Bram Moolenaarff034192013-04-24 18:51:19 +02008587 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
8588 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008589 let s:netrw_menucnt= 28
Bram Moolenaarff034192013-04-24 18:51:19 +02008590 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
8591 call s:NetrwTgtMenu() " let bookmarks and history be easy targets
Bram Moolenaar446cb832008-06-24 21:56:24 +00008592
8593 elseif !a:domenu
8594 let s:netrwcnt = 0
8595 let curwin = winnr()
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02008596 windo if getline(2) =~# "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008597 exe curwin."wincmd w"
8598
8599 if s:netrwcnt <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008600" call Decho("clear menus",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008601 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008602" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*','~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008603 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00008604 endif
8605 endif
8606" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008607 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00008608 endif
8609
8610endfun
8611
8612" ---------------------------------------------------------------------
8613" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
8614" Used by the O maps (as <SID>NetrwObtain())
8615fun! s:NetrwObtain(islocal)
8616" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
8617
Bram Moolenaar97d62492012-11-15 21:28:22 +01008618 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008619 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008620 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\{3,}://'
Bram Moolenaara6878372014-03-22 21:02:50 +01008621 call netrw#Obtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00008622 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
8623 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02008624 call netrw#Obtain(a:islocal,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008625 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008626 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008627
8628" call Dret("NetrwObtain")
8629endfun
8630
8631" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008632" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
8633" If there's only one window, then the window will first be split.
8634" Returns:
8635" choice = 0 : didn't have to choose
8636" choice = 1 : saved modified file in window first
8637" choice = 2 : didn't save modified file, opened window
8638" choice = 3 : cancel open
8639fun! s:NetrwPrevWinOpen(islocal)
Bram Moolenaar71badf92023-04-22 22:40:14 +01008640" call Dfunc("s:NetrwPrevWinOpen(islocal=".a:islocal.") win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008641
Bram Moolenaar97d62492012-11-15 21:28:22 +01008642 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008643 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
Bram Moolenaara6878372014-03-22 21:02:50 +01008644 let curdir = b:netrw_curdir
Bram Moolenaar71badf92023-04-22 22:40:14 +01008645" call Decho("COMBAK#1: mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008646
8647 " get last window number and the word currently under the cursor
Bram Moolenaar8d043172014-01-23 14:24:41 +01008648 let origwin = winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008649 let lastwinnr = winnr("$")
Bram Moolenaar71badf92023-04-22 22:40:14 +01008650" call Decho("origwin#".origwin." lastwinnr#".lastwinnr)
8651" call Decho("COMBAK#2: mod=".&mod." win#".winnr())
8652 let curword = s:NetrwGetWord()
8653 let choice = 0
8654 let s:prevwinopen= 1 " lets s:NetrwTreeDir() know that NetrwPrevWinOpen called it (s:NetrwTreeDir() will unlet s:prevwinopen)
8655" call Decho("COMBAK#3: mod=".&mod." win#".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008656 let s:treedir = s:NetrwTreeDir(a:islocal)
Bram Moolenaar71badf92023-04-22 22:40:14 +01008657" call Decho("COMBAK#4: mod=".&mod." win#".winnr())
Bram Moolenaara6878372014-03-22 21:02:50 +01008658 let curdir = s:treedir
Bram Moolenaar71badf92023-04-22 22:40:14 +01008659" call Decho("COMBAK#5: mod=".&mod." win#".winnr())
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008660" call Decho("winnr($)#".lastwinnr." curword<".curword.">",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01008661" call Decho("COMBAK#6: mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008662
Bram Moolenaar8d043172014-01-23 14:24:41 +01008663 let didsplit = 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008664 if lastwinnr == 1
8665 " if only one window, open a new one first
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008666" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02008667 " g:netrw_preview=0: preview window shown in a horizontally split window
8668 " g:netrw_preview=1: preview window shown in a vertically split window
Bram Moolenaar446cb832008-06-24 21:56:24 +00008669 if g:netrw_preview
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008670 " vertically split preview window
Bram Moolenaar85850f32019-07-19 22:05:51 +02008671 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008672" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02008673 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008674 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008675 " horizontally split preview window
Bram Moolenaar85850f32019-07-19 22:05:51 +02008676 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008677" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02008678 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008679 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008680 let didsplit = 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008681" call Decho("did split",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008682
8683 else
Bram Moolenaar71badf92023-04-22 22:40:14 +01008684" call Decho("COMBAK#7: mod=".&mod." win#".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008685 NetrwKeepj call s:SaveBufVars()
Bram Moolenaar71badf92023-04-22 22:40:14 +01008686" call Decho("COMBAK#8: mod=".&mod." win#".winnr())
Bram Moolenaar8d043172014-01-23 14:24:41 +01008687 let eikeep= &ei
Bram Moolenaar71badf92023-04-22 22:40:14 +01008688" call Decho("COMBAK#9: mod=".&mod." win#".winnr())
Bram Moolenaara6878372014-03-22 21:02:50 +01008689 setl ei=all
Bram Moolenaar71badf92023-04-22 22:40:14 +01008690" call Decho("COMBAK#10: mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008691 wincmd p
Bram Moolenaar71badf92023-04-22 22:40:14 +01008692" call Decho("COMBAK#11: mod=".&mod)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008693" call Decho("wincmd p (now in win#".winnr().") curdir<".curdir.">",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01008694" call Decho("COMBAK#12: mod=".&mod)
8695
8696 if exists("s:lexplore_win") && s:lexplore_win == winnr()
8697 " whoops -- user trying to open file in the Lexplore window.
8698 " Use Lexplore's opening-file window instead.
8699" call Decho("whoops -- user trying to open file in Lexplore Window. Use win#".g:netrw_chgwin." instead")
8700" exe g:netrw_chgwin."wincmd w"
8701 wincmd p
8702 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
8703 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008704
8705 " prevwinnr: the window number of the "prev" window
8706 " prevbufnr: the buffer number of the buffer in the "prev" window
8707 " bnrcnt : the qty of windows open on the "prev" buffer
8708 let prevwinnr = winnr()
8709 let prevbufnr = bufnr("%")
8710 let prevbufname = bufname("%")
8711 let prevmod = &mod
8712 let bnrcnt = 0
Bram Moolenaar71badf92023-04-22 22:40:14 +01008713" call Decho("COMBAK#13: mod=".&mod." win#".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008714 NetrwKeepj call s:RestoreBufVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008715" call Decho("after wincmd p: win#".winnr()." win($)#".winnr("$")." origwin#".origwin." &mod=".&mod." bufname(%)<".bufname("%")."> prevbufnr=".prevbufnr,'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01008716" call Decho("COMBAK#14: mod=".&mod." win#".winnr())
Bram Moolenaar8d043172014-01-23 14:24:41 +01008717
8718 " if the previous window's buffer has been changed (ie. its modified flag is set),
Bram Moolenaar446cb832008-06-24 21:56:24 +00008719 " and it doesn't appear in any other extant window, then ask the
8720 " user if s/he wants to abandon modifications therein.
Bram Moolenaar8d043172014-01-23 14:24:41 +01008721 if prevmod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008722" call Decho("detected that prev window's buffer has been modified: prevbufnr=".prevbufnr." winnr()#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008723 windo if winbufnr(0) == prevbufnr | let bnrcnt=bnrcnt+1 | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008724" call Decho("prevbufnr=".prevbufnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr()=".winnr()." prevwinnr#".prevwinnr,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008725 exe prevwinnr."wincmd w"
Bram Moolenaar71badf92023-04-22 22:40:14 +01008726" call Decho("COMBAK#15: mod=".&mod." win#".winnr())
Bram Moolenaar8d043172014-01-23 14:24:41 +01008727
8728 if bnrcnt == 1 && &hidden == 0
8729 " only one copy of the modified buffer in a window, and
8730 " hidden not set, so overwriting will lose the modified file. Ask first...
8731 let choice = confirm("Save modified buffer<".prevbufname."> first?","&Yes\n&No\n&Cancel")
Bram Moolenaar85850f32019-07-19 22:05:51 +02008732" call Decho("prevbufname<".prevbufname."> choice=".choice." current-winnr#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008733 let &ei= eikeep
Bram Moolenaar71badf92023-04-22 22:40:14 +01008734" call Decho("COMBAK#16: mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008735
8736 if choice == 1
8737 " Yes -- write file & then browse
8738 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008739 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00008740 if v:errmsg != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008741 call netrw#ErrorMsg(s:ERROR,"unable to write <".(exists("prevbufname")? prevbufname : 'n/a').">!",30)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008742 exe origwin."wincmd w"
8743 let &ei = eikeep
8744 let @@ = ykeep
8745" call Dret("s:NetrwPrevWinOpen ".choice." : unable to write <".prevbufname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008746 return choice
8747 endif
8748
8749 elseif choice == 2
8750 " No -- don't worry about changed file, just browse anyway
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008751" call Decho("don't worry about chgd file, just browse anyway (winnr($)#".winnr("$").")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008752 echomsg "**note** changes to ".prevbufname." abandoned"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008753
8754 else
8755 " Cancel -- don't do this
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008756" call Decho("cancel, don't browse, switch to win#".origwin,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008757 exe origwin."wincmd w"
8758 let &ei= eikeep
8759 let @@ = ykeep
8760" call Dret("s:NetrwPrevWinOpen ".choice." : cancelled")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008761 return choice
8762 endif
8763 endif
8764 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008765 let &ei= eikeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008766 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01008767" call Decho("COMBAK#17: mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00008768
8769 " restore b:netrw_curdir (window split/enew may have lost it)
8770 let b:netrw_curdir= curdir
8771 if a:islocal < 2
8772 if a:islocal
8773 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
8774 else
8775 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
8776 endif
8777 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008778 let @@= ykeep
Bram Moolenaar8d043172014-01-23 14:24:41 +01008779" call Dret("s:NetrwPrevWinOpen ".choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008780 return choice
8781endfun
8782
8783" ---------------------------------------------------------------------
8784" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
8785" Always assumed to be local -> remote
8786" call s:NetrwUpload(filename, target)
8787" call s:NetrwUpload(filename, target, fromdirectory)
8788fun! s:NetrwUpload(fname,tgt,...)
8789" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
8790
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008791 if a:tgt =~ '^\a\{3,}://'
8792 let tgtdir= substitute(a:tgt,'^\a\{3,}://[^/]\+/\(.\{-}\)$','\1','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008793 else
8794 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
8795 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008796" call Decho("tgtdir<".tgtdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008797
8798 if a:0 > 0
8799 let fromdir= a:1
8800 else
8801 let fromdir= getcwd()
8802 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008803" call Decho("fromdir<".fromdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008804
8805 if type(a:fname) == 1
8806 " handle uploading a single file using NetWrite
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008807" call Decho("handle uploading a single file via NetWrite",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008808 1split
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008809" call Decho("exe e ".fnameescape(s:NetrwFile(a:fname)),'~'.expand("<slnum>"))
8810 exe "NetrwKeepj e ".fnameescape(s:NetrwFile(a:fname))
8811" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008812 if a:tgt =~ '/$'
8813 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008814" call Decho("exe w! ".fnameescape(wfname),'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008815 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008816 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008817" call Decho("writing local->remote: exe w ".fnameescape(a:tgt),'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008818 exe "w ".fnameescape(a:tgt)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008819" call Decho("done writing local->remote",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008820 endif
8821 q!
8822
8823 elseif type(a:fname) == 3
8824 " handle uploading a list of files via scp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008825" call Decho("handle uploading a list of files via scp",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008826 let curdir= getcwd()
8827 if a:tgt =~ '^scp:'
Bram Moolenaar85850f32019-07-19 22:05:51 +02008828 if s:NetrwLcd(fromdir)
8829" call Dret("s:NetrwUpload : lcd failure")
8830 return
8831 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008832 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008833 let args = join(map(filelist,"s:ShellEscape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008834 if exists("g:netrw_port") && g:netrw_port != ""
8835 let useport= " ".g:netrw_scpport." ".g:netrw_port
8836 else
8837 let useport= ""
8838 endif
8839 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
8840 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008841 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.s:ShellEscape(useport,1)." ".args." ".s:ShellEscape(machine.":".tgt,1))
Bram Moolenaar85850f32019-07-19 22:05:51 +02008842 if s:NetrwLcd(curdir)
8843" call Dret("s:NetrwUpload : lcd failure")
8844 return
8845 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008846
8847 elseif a:tgt =~ '^ftp:'
8848 call s:NetrwMethod(a:tgt)
8849
8850 if b:netrw_method == 2
8851 " handle uploading a list of files via ftp+.netrc
8852 let netrw_fname = b:netrw_fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008853 sil NetrwKeepj new
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008854" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008855
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008856 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008857" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008858
8859 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008860 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008861" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008862 endif
8863
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008864 NetrwKeepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008865" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008866
Bram Moolenaaradc21822011-04-01 18:03:16 +02008867 if tgtdir == ""
8868 let tgtdir= '/'
8869 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008870 NetrwKeepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008871" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008872
8873 for fname in a:fname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008874 NetrwKeepj call setline(line("$")+1,'put "'.s:NetrwFile(fname).'"')
8875" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008876 endfor
8877
8878 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008879 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008880 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008881" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
8882 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008883 endif
8884 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008885 sil NetrwKeepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01008886 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008887 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
8888 call netrw#ErrorMsg(s:ERROR,getline(1),14)
8889 else
8890 bw!|q
8891 endif
8892
8893 elseif b:netrw_method == 3
8894 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
8895 let netrw_fname= b:netrw_fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008896 NetrwKeepj call s:SaveBufVars()|sil NetrwKeepj new|NetrwKeepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008897 let tmpbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02008898 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00008899
8900 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008901 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008902" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008903 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008904 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008905" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008906 endif
8907
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008908 if exists("g:netrw_uid") && g:netrw_uid != ""
8909 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008910 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008911" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008912 if exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008913 NetrwKeepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008914 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008915" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008916 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008917 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008918" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008919 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008920 endif
8921
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008922 NetrwKeepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008923" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008924
8925 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008926 NetrwKeepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008927" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008928 endif
8929
8930 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008931 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008932" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008933 endif
8934
8935 for fname in a:fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008936 NetrwKeepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008937" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008938 endfor
8939
8940 " perform ftp:
8941 " -i : turns off interactive prompting from ftp
8942 " -n unix : DON'T use <.netrc>, even though it exists
8943 " -n win32: quit being obnoxious about password
Bram Moolenaar91359012019-11-30 17:57:03 +01008944 NetrwKeepj norm! 1G"_dd
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008945 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008946 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008947 sil NetrwKeepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01008948 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008949 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
8950 let debugkeep= &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02008951 setl debug=msg
Bram Moolenaar446cb832008-06-24 21:56:24 +00008952 call netrw#ErrorMsg(s:ERROR,getline(1),15)
8953 let &debug = debugkeep
8954 let mod = 1
8955 else
8956 bw!|q
8957 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008958 elseif !exists("b:netrw_method") || b:netrw_method < 0
Bram Moolenaar85850f32019-07-19 22:05:51 +02008959" call Dret("s:#NetrwUpload : unsupported method")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008960 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00008961 endif
8962 else
8963 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
8964 endif
8965 endif
8966
8967" call Dret("s:NetrwUpload")
8968endfun
8969
8970" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02008971" s:NetrwPreview: supports netrw's "p" map {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00008972fun! s:NetrwPreview(path) range
8973" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaar85850f32019-07-19 22:05:51 +02008974" call Decho("g:netrw_alto =".(exists("g:netrw_alto")? g:netrw_alto : 'n/a'),'~'.expand("<slnum>"))
8975" call Decho("g:netrw_preview=".(exists("g:netrw_preview")? g:netrw_preview : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008976 let ykeep= @@
Bram Moolenaar85850f32019-07-19 22:05:51 +02008977 NetrwKeepj call s:NetrwOptionsSave("s:")
8978 if a:path !~ '^\*\{1,2}/' && a:path !~ '^\a\{3,}://'
8979 NetrwKeepj call s:NetrwOptionsSafe(1)
8980 else
8981 NetrwKeepj call s:NetrwOptionsSafe(0)
8982 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008983 if has("quickfix")
Bram Moolenaar85850f32019-07-19 22:05:51 +02008984" call Decho("has quickfix",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008985 if !isdirectory(s:NetrwFile(a:path))
Bram Moolenaar85850f32019-07-19 22:05:51 +02008986" call Decho("good; not previewing a directory",'~'.expand("<slnum>"))
8987 if g:netrw_preview
8988 " vertical split
Bram Moolenaar15146672011-10-20 22:22:38 +02008989 let pvhkeep = &pvh
8990 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
8991 let &pvh = winwidth(0) - winsz
Bram Moolenaar85850f32019-07-19 22:05:51 +02008992" call Decho("g:netrw_preview: winsz=".winsz." &pvh=".&pvh." (temporarily) g:netrw_winsize=".g:netrw_winsize,'~'.expand("<slnum>"))
8993 else
8994 " horizontal split
8995 let pvhkeep = &pvh
8996 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
8997 let &pvh = winheight(0) - winsz
8998" call Decho("!g:netrw_preview: winsz=".winsz." &pvh=".&pvh." (temporarily) g:netrw_winsize=".g:netrw_winsize,'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008999 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02009000 " g:netrw_preview g:netrw_alto
9001 " 1 : vert 1: top -- preview window is vertically split off and on the left
9002 " 1 : vert 0: bot -- preview window is vertically split off and on the right
9003 " 0 : 1: top -- preview window is horizontally split off and on the top
9004 " 0 : 0: bot -- preview window is horizontally split off and on the bottom
9005 "
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009006 " Note that the file being previewed is already known to not be a directory, hence we can avoid doing a LocalBrowseCheck() check via
Bram Moolenaar85850f32019-07-19 22:05:51 +02009007 " the BufEnter event set up in netrwPlugin.vim
9008" call Decho("exe ".(g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path),'~'.expand("<slnum>"))
9009 let eikeep = &ei
9010 set ei=BufEnter
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009011 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
Bram Moolenaar85850f32019-07-19 22:05:51 +02009012 let &ei= eikeep
9013" call Decho("winnr($)=".winnr("$"),'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009014 if exists("pvhkeep")
9015 let &pvh= pvhkeep
9016 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009017 elseif !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009018 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009019 endif
9020 elseif !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009021 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009022 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02009023 NetrwKeepj call s:NetrwOptionsRestore("s:")
Bram Moolenaar97d62492012-11-15 21:28:22 +01009024 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00009025" call Dret("NetrwPreview")
9026endfun
9027
9028" ---------------------------------------------------------------------
9029" s:NetrwRefresh: {{{2
9030fun! s:NetrwRefresh(islocal,dirname)
Bram Moolenaar85850f32019-07-19 22:05:51 +02009031" call Dfunc("s:NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") g:netrw_hide=".g:netrw_hide." g:netrw_sort_direction=".g:netrw_sort_direction)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009032 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
Bram Moolenaarff034192013-04-24 18:51:19 +02009033 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009034" call Decho("setl ma noro",'~'.expand("<slnum>"))
9035" call Decho("clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01009036 let ykeep = @@
Bram Moolenaar85850f32019-07-19 22:05:51 +02009037 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
9038 if !exists("w:netrw_treetop")
9039 if exists("b:netrw_curdir")
9040 let w:netrw_treetop= b:netrw_curdir
9041 else
9042 let w:netrw_treetop= getcwd()
9043 endif
9044 endif
9045 NetrwKeepj call s:NetrwRefreshTreeDict(w:netrw_treetop)
9046 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02009047
9048 " save the cursor position before refresh.
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009049 let screenposn = winsaveview()
9050" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009051
9052" call Decho("win#".winnr().": ".winheight(0)."x".winwidth(0)." curfile<".expand("%").">",'~'.expand("<slnum>"))
9053" call Decho("clearing buffer prior to refresh",'~'.expand("<slnum>"))
9054 sil! NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00009055 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009056 NetrwKeepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009057 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009058 NetrwKeepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009059 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02009060
9061 " restore position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009062" call Decho("restoring posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
9063 NetrwKeepj call winrestview(screenposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009064
9065 " restore file marks
Bram Moolenaar85850f32019-07-19 22:05:51 +02009066 if has("syntax") && exists("g:syntax_on") && g:syntax_on
9067 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
9068" " call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/",'~'.expand("<slnum>"))
9069 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
9070 else
9071" " call Decho("2match none (bufnr(%)=".bufnr("%")."<".bufname("%").">)",'~'.expand("<slnum>"))
9072 2match none
9073 endif
9074 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009075
Bram Moolenaar97d62492012-11-15 21:28:22 +01009076" restore
9077 let @@= ykeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009078" call Dret("s:NetrwRefresh")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009079endfun
9080
9081" ---------------------------------------------------------------------
9082" s:NetrwRefreshDir: refreshes a directory by name {{{2
9083" Called by NetrwMarkFileCopy()
Bram Moolenaara6878372014-03-22 21:02:50 +01009084" Interfaces to s:NetrwRefresh() and s:LocalBrowseRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009085fun! s:NetrwRefreshDir(islocal,dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01009086" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009087 if g:netrw_fastbrowse == 0
9088 " slowest mode (keep buffers refreshed, local or remote)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009089" call Decho("slowest mode: keep buffers refreshed, local or remote",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009090 let tgtwin= bufwinnr(a:dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009091" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009092
9093 if tgtwin > 0
9094 " tgtwin is being displayed, so refresh it
9095 let curwin= winnr()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009096" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009097 exe tgtwin."wincmd w"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009098 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009099 exe curwin."wincmd w"
9100
9101 elseif bufnr(a:dirname) > 0
9102 let bn= bufnr(a:dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009103" call Decho("bd bufnr(".a:dirname.")=".bn,'~'.expand("<slnum>"))
9104 exe "sil keepj bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00009105 endif
9106
9107 elseif g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009108" call Decho("medium-speed mode: refresh local buffers only",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009109 NetrwKeepj call s:LocalBrowseRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009110 endif
9111" call Dret("s:NetrwRefreshDir")
9112endfun
9113
9114" ---------------------------------------------------------------------
Bram Moolenaar13600302014-05-22 18:26:40 +02009115" s:NetrwSetChgwin: set g:netrw_chgwin; a <cr> will use the specified
9116" window number to do its editing in.
9117" Supports [count]C where the count, if present, is used to specify
9118" a window to use for editing via the <cr> mapping.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009119fun! s:NetrwSetChgwin(...)
Bram Moolenaar13600302014-05-22 18:26:40 +02009120" call Dfunc("s:NetrwSetChgwin() v:count=".v:count)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009121 if a:0 > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009122" call Decho("a:1<".a:1.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009123 if a:1 == "" " :NetrwC win#
9124 let g:netrw_chgwin= winnr()
9125 else " :NetrwC
9126 let g:netrw_chgwin= a:1
9127 endif
9128 elseif v:count > 0 " [count]C
Bram Moolenaar13600302014-05-22 18:26:40 +02009129 let g:netrw_chgwin= v:count
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009130 else " C
Bram Moolenaar13600302014-05-22 18:26:40 +02009131 let g:netrw_chgwin= winnr()
9132 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009133 echo "editing window now set to window#".g:netrw_chgwin
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009134" call Dret("s:NetrwSetChgwin : g:netrw_chgwin=".g:netrw_chgwin)
Bram Moolenaar13600302014-05-22 18:26:40 +02009135endfun
9136
9137" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009138" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
9139" What this function does is to compute a priority for the patterns
9140" in the g:netrw_sort_sequence. It applies a substitute to any
9141" "files" that satisfy each pattern, putting the priority / in
9142" front. An "*" pattern handles the default priority.
9143fun! s:NetrwSetSort()
9144" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01009145 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00009146 if w:netrw_liststyle == s:LONGLIST
9147 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
9148 else
9149 let seqlist = g:netrw_sort_sequence
9150 endif
9151 " sanity check -- insure that * appears somewhere
9152 if seqlist == ""
9153 let seqlist= '*'
9154 elseif seqlist !~ '\*'
9155 let seqlist= seqlist.',*'
9156 endif
9157 let priority = 1
9158 while seqlist != ""
9159 if seqlist =~ ','
9160 let seq = substitute(seqlist,',.*$','','e')
9161 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
9162 else
9163 let seq = seqlist
9164 let seqlist = ""
9165 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009166 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01009167 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00009168 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01009169 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00009170 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01009171 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00009172 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009173" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009174
9175 " sanity check
9176 if w:netrw_bannercnt > line("$")
9177 " apparently no files were left after a Hiding pattern was used
9178" call Dret("SetSort : no files left after hiding")
9179 return
9180 endif
9181 if seq == '*'
9182 let starpriority= spriority
9183 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009184 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01009185 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009186 " sometimes multiple sorting patterns will match the same file or directory.
9187 " The following substitute is intended to remove the excess matches.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009188 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
9189 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009190 endif
9191 let priority = priority + 1
9192 endwhile
9193 if exists("starpriority")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009194 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/e'
9195 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009196 endif
9197
9198 " Following line associated with priority -- items that satisfy a priority
9199 " pattern get prefixed by ###/ which permits easy sorting by priority.
9200 " Sometimes files can satisfy multiple priority patterns -- only the latest
9201 " priority pattern needs to be retained. So, at this point, these excess
9202 " priority prefixes need to be removed, but not directories that happen to
9203 " be just digits themselves.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009204 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
9205 NetrwKeepj call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01009206 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00009207
9208" call Dret("SetSort")
9209endfun
9210
Bram Moolenaarff034192013-04-24 18:51:19 +02009211" ---------------------------------------------------------------------
9212" s:NetrwSetTgt: sets the target to the specified choice index {{{2
9213" Implements [count]Tb (bookhist<b>)
9214" [count]Th (bookhist<h>)
9215" See :help netrw-qb for how to make the choice.
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009216fun! s:NetrwSetTgt(islocal,bookhist,choice)
9217" call Dfunc("s:NetrwSetTgt(islocal=".a:islocal." bookhist<".a:bookhist."> choice#".a:choice.")")
Bram Moolenaarff034192013-04-24 18:51:19 +02009218
9219 if a:bookhist == 'b'
9220 " supports choosing a bookmark as a target using a qb-generated list
9221 let choice= a:choice - 1
9222 if exists("g:netrw_bookmarklist[".choice."]")
Bram Moolenaara6878372014-03-22 21:02:50 +01009223 call netrw#MakeTgt(g:netrw_bookmarklist[choice])
Bram Moolenaarff034192013-04-24 18:51:19 +02009224 else
9225 echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
9226 endif
9227
9228 elseif a:bookhist == 'h'
9229 " supports choosing a history stack entry as a target using a qb-generated list
9230 let choice= (a:choice % g:netrw_dirhistmax) + 1
9231 if exists("g:netrw_dirhist_".choice)
9232 let histentry = g:netrw_dirhist_{choice}
Bram Moolenaara6878372014-03-22 21:02:50 +01009233 call netrw#MakeTgt(histentry)
Bram Moolenaarff034192013-04-24 18:51:19 +02009234 else
9235 echomsg "Sorry, history#".a:choice." not available!"
9236 endif
9237 endif
9238
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009239 " refresh the display
9240 if !exists("b:netrw_curdir")
9241 let b:netrw_curdir= getcwd()
9242 endif
9243 call s:NetrwRefresh(a:islocal,b:netrw_curdir)
9244
Bram Moolenaarff034192013-04-24 18:51:19 +02009245" call Dret("s:NetrwSetTgt")
9246endfun
9247
Bram Moolenaar446cb832008-06-24 21:56:24 +00009248" =====================================================================
Bram Moolenaar85850f32019-07-19 22:05:51 +02009249" s:NetrwSortStyle: change sorting style (name - time - size - exten) and refresh display {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00009250fun! s:NetrwSortStyle(islocal)
9251" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009252 NetrwKeepj call s:NetrwSaveWordPosn()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009253 let svpos= winsaveview()
9254" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009255
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009256 let g:netrw_sort_by= (g:netrw_sort_by =~# '^n')? 'time' : (g:netrw_sort_by =~# '^t')? 'size' : (g:netrw_sort_by =~# '^siz')? 'exten' : 'name'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009257 NetrwKeepj norm! 0
9258 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009259" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
9260 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009261
9262" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
9263endfun
9264
9265" ---------------------------------------------------------------------
9266" s:NetrwSplit: mode {{{2
9267" =0 : net and o
9268" =1 : net and t
9269" =2 : net and v
9270" =3 : local and o
9271" =4 : local and t
9272" =5 : local and v
9273fun! s:NetrwSplit(mode)
9274" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
9275
Bram Moolenaar97d62492012-11-15 21:28:22 +01009276 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00009277 call s:SaveWinVars()
9278
9279 if a:mode == 0
9280 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02009281 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02009282 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009283" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02009284 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009285 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009286 NetrwKeepj call s:RestoreWinVars()
9287 NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009288 unlet s:didsplit
9289
9290 elseif a:mode == 1
9291 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01009292 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009293" call Decho("tabnew",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009294 tabnew
9295 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009296 NetrwKeepj call s:RestoreWinVars()
9297 NetrwKeepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009298 unlet s:didsplit
9299
9300 elseif a:mode == 2
9301 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02009302 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02009303 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009304" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02009305 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009306 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009307 NetrwKeepj call s:RestoreWinVars()
9308 NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009309 unlet s:didsplit
9310
9311 elseif a:mode == 3
9312 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02009313 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02009314 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009315" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02009316 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009317 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009318 NetrwKeepj call s:RestoreWinVars()
9319 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009320 unlet s:didsplit
9321
9322 elseif a:mode == 4
9323 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00009324 let cursorword = s:NetrwGetWord()
Bram Moolenaar8d043172014-01-23 14:24:41 +01009325 let eikeep = &ei
9326 let netrw_winnr = winnr()
9327 let netrw_line = line(".")
9328 let netrw_col = virtcol(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009329 NetrwKeepj norm! H0
Bram Moolenaar8d043172014-01-23 14:24:41 +01009330 let netrw_hline = line(".")
Bram Moolenaara6878372014-03-22 21:02:50 +01009331 setl ei=all
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009332 exe "NetrwKeepj norm! ".netrw_hline."G0z\<CR>"
9333 exe "NetrwKeepj norm! ".netrw_line."G0".netrw_col."\<bar>"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009334 let &ei = eikeep
9335 let netrw_curdir = s:NetrwTreeDir(0)
9336" call Decho("tabnew",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009337 tabnew
Bram Moolenaar8d043172014-01-23 14:24:41 +01009338 let b:netrw_curdir = netrw_curdir
9339 let s:didsplit = 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009340 NetrwKeepj call s:RestoreWinVars()
9341 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009342 if &ft == "netrw"
Bram Moolenaara6878372014-03-22 21:02:50 +01009343 setl ei=all
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009344 exe "NetrwKeepj norm! ".netrw_hline."G0z\<CR>"
9345 exe "NetrwKeepj norm! ".netrw_line."G0".netrw_col."\<bar>"
Bram Moolenaar8d043172014-01-23 14:24:41 +01009346 let &ei= eikeep
9347 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009348 unlet s:didsplit
9349
9350 elseif a:mode == 5
9351 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02009352 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02009353 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009354" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02009355 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009356 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009357 NetrwKeepj call s:RestoreWinVars()
9358 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009359 unlet s:didsplit
9360
9361 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009362 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009363 endif
9364
Bram Moolenaar97d62492012-11-15 21:28:22 +01009365 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00009366" call Dret("s:NetrwSplit")
9367endfun
9368
9369" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02009370" s:NetrwTgtMenu: {{{2
9371fun! s:NetrwTgtMenu()
9372 if !exists("s:netrw_menucnt")
9373 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00009374 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02009375" call Dfunc("s:NetrwTgtMenu()")
9376
9377 " the following test assures that gvim is running, has menus available, and has menus enabled.
9378 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
9379 if exists("g:NetrwTopLvlMenu")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009380" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02009381 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
9382 endif
9383 if !exists("s:netrw_initbookhist")
9384 call s:NetrwBookHistRead()
9385 endif
9386
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009387 " try to cull duplicate entries
9388 let tgtdict={}
9389
Bram Moolenaarff034192013-04-24 18:51:19 +02009390 " target bookmarked places
9391 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009392" call Decho("installing bookmarks as easy targets",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02009393 let cnt= 1
9394 for bmd in g:netrw_bookmarklist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009395 if has_key(tgtdict,bmd)
9396 let cnt= cnt + 1
9397 continue
9398 endif
9399 let tgtdict[bmd]= cnt
Bram Moolenaarff034192013-04-24 18:51:19 +02009400 let ebmd= escape(bmd,g:netrw_menu_escape)
9401 " show bookmarks for goto menu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009402" call Decho("menu: Targets: ".bmd,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009403 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#MakeTgt('".bmd."')\<cr>"
Bram Moolenaarff034192013-04-24 18:51:19 +02009404 let cnt= cnt + 1
9405 endfor
9406 endif
9407
9408 " target directory browsing history
9409 if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009410" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02009411 let histcnt = 1
9412 while histcnt <= g:netrw_dirhistmax
Bram Moolenaar85850f32019-07-19 22:05:51 +02009413 let priority = g:netrw_dirhistcnt + histcnt
Bram Moolenaarff034192013-04-24 18:51:19 +02009414 if exists("g:netrw_dirhist_{histcnt}")
9415 let histentry = g:netrw_dirhist_{histcnt}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009416 if has_key(tgtdict,histentry)
9417 let histcnt = histcnt + 1
9418 continue
9419 endif
9420 let tgtdict[histentry] = histcnt
9421 let ehistentry = escape(histentry,g:netrw_menu_escape)
9422" call Decho("menu: Targets: ".histentry,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009423 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#MakeTgt('".histentry."')\<cr>"
Bram Moolenaarff034192013-04-24 18:51:19 +02009424 endif
9425 let histcnt = histcnt + 1
9426 endwhile
9427 endif
9428 endif
9429" call Dret("s:NetrwTgtMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009430endfun
9431
9432" ---------------------------------------------------------------------
9433" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
9434" (full path directory with trailing slash returned)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009435fun! s:NetrwTreeDir(islocal)
9436" call Dfunc("s:NetrwTreeDir(islocal=".a:islocal.") getline(".line(".").")"."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02009437" call Decho("Determine tree directory given current cursor position")
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009438" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'),'~'.expand("<slnum>"))
9439" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
9440" call Decho("w:netrw_treetop =".(exists("w:netrw_treetop")? w:netrw_treetop : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009441" call Decho("current line<".getline(".").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009442
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009443 if exists("s:treedir") && exists("s:prevwinopen")
Bram Moolenaar8d043172014-01-23 14:24:41 +01009444 " s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009445" call Decho('s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early')
Bram Moolenaar8d043172014-01-23 14:24:41 +01009446 let treedir= s:treedir
9447 unlet s:treedir
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009448 unlet s:prevwinopen
9449" call Dret("s:NetrwTreeDir ".treedir.": early return since s:treedir existed previously")
Bram Moolenaar8d043172014-01-23 14:24:41 +01009450 return treedir
9451 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009452 if exists("s:prevwinopen")
9453 unlet s:prevwinopen
9454 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01009455" call Decho("COMBAK#18 : mod=".&mod." win#".winnr())
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009456
Bram Moolenaar8d043172014-01-23 14:24:41 +01009457 if !exists("b:netrw_curdir") || b:netrw_curdir == ""
9458 let b:netrw_curdir= getcwd()
9459 endif
9460 let treedir = b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009461" call Decho("set initial treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01009462" call Decho("COMBAK#19 : mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00009463
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009464 let s:treecurpos= winsaveview()
9465" call Decho("saving posn to s:treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01009466" call Decho("COMBAK#20 : mod=".&mod." win#".winnr())
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009467
9468 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009469" call Decho("w:netrw_liststyle is TREELIST:",'~'.expand("<slnum>"))
9470" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01009471" call Decho("COMBAK#21 : mod=".&mod." win#".winnr())
Bram Moolenaar5c736222010-01-06 20:54:52 +01009472
9473 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009474 let curline= substitute(getline('.'),"\t -->.*$",'','')
9475 if curline =~ '/$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009476" call Decho("extract tree subdirectory from current line",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009477 let treedir= substitute(getline('.'),'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009478" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
9479 elseif curline =~ '@$'
9480" call Decho("handle symbolic link from current line",'~'.expand("<slnum>"))
9481 let treedir= resolve(substitute(substitute(getline('.'),'@.*$','','e'),'^|*\s*','','e'))
9482" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009483 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009484" call Decho("do not extract tree subdirectory from current line and set treedir to empty",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009485 let treedir= ""
9486 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01009487" call Decho("COMBAK#22 : mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00009488
9489 " detect user attempting to close treeroot
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009490" call Decho("check if user is attempting to close treeroot",'~'.expand("<slnum>"))
9491" call Decho(".win#".winnr()." buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009492" call Decho(".getline(".line(".").")<".getline('.').'> '.((getline('.') =~# '^'.s:treedepthstring)? '=~#' : '!~').' ^'.s:treedepthstring,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009493 if curline !~ '^'.s:treedepthstring && getline('.') != '..'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009494" call Decho(".user may have attempted to close treeroot",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009495 " now force a refresh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009496" call Decho(".force refresh: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
9497 sil! NetrwKeepj %d _
9498" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".(exists("s:treecurpos")? string(s:treecurpos) : 'n/a').">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009499 return b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01009500" else " Decho
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009501" call Decho(".user not attempting to close treeroot",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009502 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01009503" call Decho("COMBAK#23 : mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00009504
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009505" call Decho("islocal=".a:islocal." curline<".curline.">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009506 let potentialdir= s:NetrwFile(substitute(curline,'^'.s:treedepthstring.'\+ \(.*\)@$','\1',''))
9507" call Decho("potentialdir<".potentialdir."> isdir=".isdirectory(potentialdir),'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01009508" call Decho("COMBAK#24 : mod=".&mod." win#".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009509
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009510 " COMBAK: a symbolic link may point anywhere -- so it will be used to start a new treetop
9511" if a:islocal && curline =~ '@$' && isdirectory(s:NetrwFile(potentialdir))
9512" let newdir = w:netrw_treetop.'/'.potentialdir
9513" " call Decho("apply NetrwTreePath to newdir<".newdir.">",'~'.expand("<slnum>"))
9514" let treedir = s:NetrwTreePath(newdir)
9515" let w:netrw_treetop = newdir
9516" " call Decho("newdir <".newdir.">",'~'.expand("<slnum>"))
9517" else
9518" call Decho("apply NetrwTreePath to treetop<".w:netrw_treetop.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009519 let treedir = s:NetrwTreePath(w:netrw_treetop)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009520" endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009521 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +01009522" call Decho("COMBAK#25 : mod=".&mod." win#".winnr())
Bram Moolenaar8d043172014-01-23 14:24:41 +01009523
9524 " sanity maintenance: keep those //s away...
Bram Moolenaar446cb832008-06-24 21:56:24 +00009525 let treedir= substitute(treedir,'//$','/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009526" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +01009527" call Decho("COMBAK#26 : mod=".&mod." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00009528
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009529" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".(exists("s:treecurpos")? string(s:treecurpos) : 'n/a').">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009530 return treedir
9531endfun
9532
9533" ---------------------------------------------------------------------
9534" s:NetrwTreeDisplay: recursive tree display {{{2
9535fun! s:NetrwTreeDisplay(dir,depth)
9536" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
9537
9538 " insure that there are no folds
Bram Moolenaarff034192013-04-24 18:51:19 +02009539 setl nofen
Bram Moolenaar446cb832008-06-24 21:56:24 +00009540
9541 " install ../ and shortdir
9542 if a:depth == ""
9543 call setline(line("$")+1,'../')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009544" call Decho("setline#".line("$")." ../ (depth is zero)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009545 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009546 if a:dir =~ '^\a\{3,}://'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009547 if a:dir == w:netrw_treetop
9548 let shortdir= a:dir
9549 else
9550 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
9551 endif
9552 call setline(line("$")+1,a:depth.shortdir)
9553 else
9554 let shortdir= substitute(a:dir,'^.*/','','e')
9555 call setline(line("$")+1,a:depth.shortdir.'/')
9556 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009557" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009558 " append a / to dir if its missing one
9559 let dir= a:dir
Bram Moolenaar446cb832008-06-24 21:56:24 +00009560
9561 " display subtrees (if any)
Bram Moolenaar8d043172014-01-23 14:24:41 +01009562 let depth= s:treedepthstring.a:depth
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009563" call Decho("display subtrees with depth<".depth."> and current leaves",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009564
Bram Moolenaar85850f32019-07-19 22:05:51 +02009565 " implement g:netrw_hide for tree listings (uses g:netrw_list_hide)
9566 if g:netrw_hide == 1
9567 " hide given patterns
9568 let listhide= split(g:netrw_list_hide,',')
9569" call Decho("listhide=".string(listhide))
9570 for pat in listhide
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02009571 call filter(w:netrw_treedict[dir],'v:val !~ "'.escape(pat,'\\').'"')
Bram Moolenaar85850f32019-07-19 22:05:51 +02009572 endfor
9573
9574 elseif g:netrw_hide == 2
9575 " show given patterns (only)
9576 let listhide= split(g:netrw_list_hide,',')
9577" call Decho("listhide=".string(listhide))
9578 let entries=[]
9579 for entry in w:netrw_treedict[dir]
9580 for pat in listhide
9581 if entry =~ pat
9582 call add(entries,entry)
9583 break
9584 endif
9585 endfor
9586 endfor
9587 let w:netrw_treedict[dir]= entries
9588 endif
9589 if depth != ""
9590 " always remove "." and ".." entries when there's depth
9591 call filter(w:netrw_treedict[dir],'v:val !~ "\\.\\.$"')
9592 call filter(w:netrw_treedict[dir],'v:val !~ "\\.$"')
9593 endif
9594
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009595" call Decho("for every entry in w:netrw_treedict[".dir."]=".string(w:netrw_treedict[dir]),'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009596 for entry in w:netrw_treedict[dir]
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009597 if dir =~ '/$'
9598 let direntry= substitute(dir.entry,'[@/]$','','e')
9599 else
9600 let direntry= substitute(dir.'/'.entry,'[@/]$','','e')
9601 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009602" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009603 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009604" call Decho("<".direntry."> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009605 NetrwKeepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009606 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009607" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9608 NetrwKeepj call s:NetrwTreeDisplay(direntry.'/',depth)
9609 elseif entry =~ '@$' && has_key(w:netrw_treedict,direntry.'@')
9610" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009611 NetrwKeepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009612 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009613" call Decho("<".entry."> is not a key in treedict (no subtree)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009614 sil! NetrwKeepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009615 endif
9616 endfor
Bram Moolenaar85850f32019-07-19 22:05:51 +02009617" call Decho("displaying: ".string(getline(w:netrw_bannercnt,'$')))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009618
Bram Moolenaar446cb832008-06-24 21:56:24 +00009619" call Dret("NetrwTreeDisplay")
9620endfun
9621
9622" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009623" s:NetrwRefreshTreeDict: updates the contents information for a tree (w:netrw_treedict) {{{2
9624fun! s:NetrwRefreshTreeDict(dir)
9625" call Dfunc("s:NetrwRefreshTreeDict(dir<".a:dir.">)")
Bram Moolenaar85850f32019-07-19 22:05:51 +02009626 if !exists("w:netrw_treedict")
9627" call Dret("s:NetrwRefreshTreeDict : w:netrw_treedict doesn't exist")
9628 return
9629 endif
9630
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009631 for entry in w:netrw_treedict[a:dir]
9632 let direntry= substitute(a:dir.'/'.entry,'[@/]$','','e')
9633" call Decho("a:dir<".a:dir."> entry<".entry."> direntry<".direntry.">",'~'.expand("<slnum>"))
9634
9635 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
9636" call Decho("<".direntry."> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9637 NetrwKeepj call s:NetrwRefreshTreeDict(direntry)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009638 let liststar = s:NetrwGlob(direntry,'*',1)
9639 let listdotstar = s:NetrwGlob(direntry,'.*',1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009640 let w:netrw_treedict[direntry] = liststar + listdotstar
9641" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
9642
9643 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
9644" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9645 NetrwKeepj call s:NetrwRefreshTreeDict(direntry.'/')
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009646 let liststar = s:NetrwGlob(direntry.'/','*',1)
9647 let listdotstar= s:NetrwGlob(direntry.'/','.*',1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009648 let w:netrw_treedict[direntry]= liststar + listdotstar
9649" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
9650
9651 elseif entry =~ '@$' && has_key(w:netrw_treedict,direntry.'@')
9652" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9653 NetrwKeepj call s:NetrwRefreshTreeDict(direntry.'/')
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009654 let liststar = s:NetrwGlob(direntry.'/','*',1)
9655 let listdotstar= s:NetrwGlob(direntry.'/','.*',1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009656" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
9657
9658 else
Bram Moolenaar85850f32019-07-19 22:05:51 +02009659" call Decho('not updating w:netrw_treedict['.string(direntry).'] with entry<'.string(entry).'> (no subtree)','~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009660 endif
9661 endfor
9662" call Dret("s:NetrwRefreshTreeDict")
9663endfun
9664
9665" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009666" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009667" Called by s:PerformListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009668fun! s:NetrwTreeListing(dirname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009669 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009670" call Dfunc("s:NetrwTreeListing() bufname<".expand("%").">")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009671" call Decho("curdir<".a:dirname.">",'~'.expand("<slnum>"))
9672" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exist")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"),'~'.expand("<slnum>"))
9673" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009674
9675 " update the treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00009676 if !exists("w:netrw_treetop")
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009677" call Decho("update the treetop (w:netrw_treetop doesn't exist yet)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009678 let w:netrw_treetop= a:dirname
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009679 let s:netrw_treetop= w:netrw_treetop
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009680" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009681 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009682" call Decho("update the treetop (override w:netrw_treetop with a:dirname<".a:dirname.">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009683 let w:netrw_treetop= a:dirname
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009684 let s:netrw_treetop= w:netrw_treetop
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009685" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009686 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009687 if exists("w:netrw_treetop")
9688 let s:netrw_treetop= w:netrw_treetop
9689 else
9690 let w:netrw_treetop= getcwd()
9691 let s:netrw_treetop= w:netrw_treetop
9692 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009693
Bram Moolenaar446cb832008-06-24 21:56:24 +00009694 if !exists("w:netrw_treedict")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009695 " insure that we have a treedict, albeit empty
9696" call Decho("initializing w:netrw_treedict to empty",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009697 let w:netrw_treedict= {}
9698 endif
9699
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009700 " update the dictionary for the current directory
9701" call Decho("updating: w:netrw_treedict[".a:dirname.'] -> [directory listing]','~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009702" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009703 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d _'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009704 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009705" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]),'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009706 exe "sil! NetrwKeepj ".w:netrw_bannercnt.",$d _"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009707
9708 " if past banner, record word
9709 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
9710 let fname= expand("<cword>")
9711 else
9712 let fname= ""
9713 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009714" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
9715" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009716
9717 " display from treetop on down
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02009718" call Decho("(s:NetrwTreeListing) w:netrw_treetop<".w:netrw_treetop.">")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009719 NetrwKeepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009720" call Decho("s:NetrwTreeDisplay) setl noma nomod ro",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009721
9722 " remove any blank line remaining as line#1 (happens in treelisting mode with banner suppressed)
9723 while getline(1) =~ '^\s*$' && byte2line(1) > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009724" call Decho("deleting blank line",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009725 1d
9726 endwhile
9727
Bram Moolenaar13600302014-05-22 18:26:40 +02009728 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00009729
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009730" call Dret("s:NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009731 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00009732 endif
9733endfun
9734
9735" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +02009736" s:NetrwTreePath: returns path to current file/directory in tree listing {{{2
Bram Moolenaara6878372014-03-22 21:02:50 +01009737" Normally, treetop is w:netrw_treetop, but a
9738" user of the function ( netrw#SetTreetop() )
9739" wipes that out prior to calling this function
9740fun! s:NetrwTreePath(treetop)
Bram Moolenaar85850f32019-07-19 22:05:51 +02009741" call Dfunc("s:NetrwTreePath(treetop<".a:treetop.">) line#".line(".")."<".getline(".").">")
9742 if line(".") < w:netrw_bannercnt + 2
9743 let treedir= a:treetop
9744 if treedir !~ '/$'
9745 let treedir= treedir.'/'
9746 endif
9747" call Dret("s:NetrwTreePath ".treedir." : line#".line(".")." ≤ ".(w:netrw_bannercnt+2))
9748 return treedir
9749 endif
9750
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009751 let svpos = winsaveview()
9752" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009753 let depth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009754" call Decho("depth<".depth."> 1st subst",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009755 let depth = substitute(depth,'^'.s:treedepthstring,'','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009756" call Decho("depth<".depth."> 2nd subst (first depth removed)",'~'.expand("<slnum>"))
9757 let curline= getline('.')
9758" call Decho("curline<".curline.'>','~'.expand("<slnum>"))
9759 if curline =~ '/$'
9760" call Decho("extract tree directory from current line",'~'.expand("<slnum>"))
9761 let treedir= substitute(curline,'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
9762" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
9763 elseif curline =~ '@\s\+-->'
9764" call Decho("extract tree directory using symbolic link",'~'.expand("<slnum>"))
9765 let treedir= substitute(curline,'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
9766 let treedir= substitute(treedir,'@\s\+-->.*$','','e')
9767" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009768 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009769" call Decho("do not extract tree directory from current line and set treedir to empty",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009770 let treedir= ""
9771 endif
9772 " construct treedir by searching backwards at correct depth
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009773" call Decho("construct treedir by searching backwards for correct depth",'~'.expand("<slnum>"))
9774" call Decho("initial treedir<".treedir."> depth<".depth.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009775 while depth != "" && search('^'.depth.'[^'.s:treedepthstring.'].\{-}/$','bW')
9776 let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
9777 let treedir= dirname.treedir
9778 let depth = substitute(depth,'^'.s:treedepthstring,'','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009779" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009780 endwhile
Bram Moolenaar85850f32019-07-19 22:05:51 +02009781" call Decho("treedir#1<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009782 if a:treetop =~ '/$'
9783 let treedir= a:treetop.treedir
9784 else
9785 let treedir= a:treetop.'/'.treedir
9786 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +02009787" call Decho("treedir#2<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009788 let treedir= substitute(treedir,'//$','/','')
Bram Moolenaar85850f32019-07-19 22:05:51 +02009789" call Decho("treedir#3<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009790" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))"
9791 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01009792" call Dret("s:NetrwTreePath <".treedir.">")
9793 return treedir
9794endfun
9795
9796" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009797" s:NetrwWideListing: {{{2
9798fun! s:NetrwWideListing()
9799
9800 if w:netrw_liststyle == s:WIDELIST
9801" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
9802 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009803 " cpf: characters per filename
9804 " fpl: filenames per line
9805 " fpc: filenames per column
Bram Moolenaarff034192013-04-24 18:51:19 +02009806 setl ma noro
Bram Moolenaar91359012019-11-30 17:57:03 +01009807 let keepa= @a
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009808" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009809 let b:netrw_cpf= 0
9810 if line("$") >= w:netrw_bannercnt
Bram Moolenaar29634562020-01-09 21:46:04 +01009811 " determine the maximum filename size; use that to set cpf
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009812 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
9813 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009814 else
Bram Moolenaar91359012019-11-30 17:57:03 +01009815 let @a= keepa
Bram Moolenaar446cb832008-06-24 21:56:24 +00009816" call Dret("NetrwWideListing")
9817 return
9818 endif
Bram Moolenaar29634562020-01-09 21:46:04 +01009819 " allow for two spaces to separate columns
Bram Moolenaar5c736222010-01-06 20:54:52 +01009820 let b:netrw_cpf= b:netrw_cpf + 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009821" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009822
9823 " determine qty files per line (fpl)
9824 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
9825 if w:netrw_fpl <= 0
9826 let w:netrw_fpl= 1
9827 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009828" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009829
9830 " make wide display
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009831 " fpc: files per column of wide listing
9832 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'S",submatch(0)),"\\")/'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009833 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009834 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
9835 let newcolstart = w:netrw_bannercnt + fpc
9836 let newcolend = newcolstart + fpc - 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009837" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]",'~'.expand("<slnum>"))
Bram Moolenaar89a9c152021-08-29 21:55:35 +02009838 if has("clipboard") && g:netrw_clipboard
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01009839" call Decho("(s:NetrwWideListing) save @* and @+",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009840 sil! let keepregstar = @*
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009841 sil! let keepregplus = @+
Bram Moolenaara6878372014-03-22 21:02:50 +01009842 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009843 while line("$") >= newcolstart
9844 if newcolend > line("$") | let newcolend= line("$") | endif
9845 let newcolqty= newcolend - newcolstart
9846 exe newcolstart
Bram Moolenaar29634562020-01-09 21:46:04 +01009847 " COMBAK: both of the visual-mode using lines below are problematic vis-a-vis @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00009848 if newcolqty == 0
Bram Moolenaar91359012019-11-30 17:57:03 +01009849 exe "sil! NetrwKeepj norm! 0\<c-v>$h\"ax".w:netrw_bannercnt."G$\"ap"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009850 else
Bram Moolenaar29634562020-01-09 21:46:04 +01009851 exe "sil! NetrwKeepj norm! 0\<c-v>".newcolqty.'j$h"ax'.w:netrw_bannercnt.'G$"ap'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009852 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009853 exe "sil! NetrwKeepj ".newcolstart.','.newcolend.'d _'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009854 exe 'sil! NetrwKeepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00009855 endwhile
Bram Moolenaara6878372014-03-22 21:02:50 +01009856 if has("clipboard")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +01009857" call Decho("(s:NetrwWideListing) restore @* and @+",'~'.expand("<slnum>"))
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01009858 if @* != keepregstar | sil! let @* = keepregstar | endif
9859 if @+ != keepregplus | sil! let @+ = keepregplus | endif
Bram Moolenaara6878372014-03-22 21:02:50 +01009860 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009861 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$s/\s\+$//e'
9862 NetrwKeepj call histdel("/",-1)
9863 exe 'nno <buffer> <silent> w :call search(''^.\\|\s\s\zs\S'',''W'')'."\<cr>"
9864 exe 'nno <buffer> <silent> b :call search(''^.\\|\s\s\zs\S'',''bW'')'."\<cr>"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009865" call Decho("NetrwWideListing) setl noma nomod ro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02009866 exe "setl ".g:netrw_bufsettings
Bram Moolenaar91359012019-11-30 17:57:03 +01009867 let @a= keepa
Bram Moolenaar85850f32019-07-19 22:05:51 +02009868" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009869" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009870 return
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009871 else
9872 if hasmapto("w","n")
9873 sil! nunmap <buffer> w
9874 endif
9875 if hasmapto("b","n")
9876 sil! nunmap <buffer> b
9877 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009878 endif
9879
9880endfun
9881
9882" ---------------------------------------------------------------------
9883" s:PerformListing: {{{2
9884fun! s:PerformListing(islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009885" call Dfunc("s:PerformListing(islocal=".a:islocal.")")
9886" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02009887" call Decho("settings: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (enter)"." ei<".&ei.">",'~'.expand("<slnum>"))
9888 sil! NetrwKeepj %d _
9889" call DechoBuf(bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009890
Bram Moolenaar15146672011-10-20 22:22:38 +02009891 " set up syntax highlighting {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009892" call Decho("--set up syntax highlighting (ie. setl ft=netrw)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009893 sil! setl ft=netrw
Bram Moolenaar15146672011-10-20 22:22:38 +02009894
Bram Moolenaar85850f32019-07-19 22:05:51 +02009895 NetrwKeepj call s:NetrwOptionsSafe(a:islocal)
Bram Moolenaara6878372014-03-22 21:02:50 +01009896 setl noro ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009897" call Decho("setl noro ma bh=".&bh,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009898
9899" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
Bram Moolenaar85850f32019-07-19 22:05:51 +02009900" call Decho("Processing your browsing request...",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009901" endif " Decho
9902
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009903" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009904 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
9905 " force a refresh for tree listings
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009906" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
9907 sil! NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00009908 endif
9909
9910 " save current directory on directory history list
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009911 NetrwKeepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009912
9913 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009914 if g:netrw_banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009915" call Decho("--set up banner",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009916 NetrwKeepj call setline(1,'" ============================================================================')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009917 if exists("g:netrw_pchk")
9918 " this undocumented option allows pchk to run with different versions of netrw without causing spurious
9919 " failure detections.
9920 NetrwKeepj call setline(2,'" Netrw Directory Listing')
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009921 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009922 NetrwKeepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
9923 endif
9924 if exists("g:netrw_pchk")
9925 let curdir= substitute(b:netrw_curdir,expand("$HOME"),'~','')
9926 else
9927 let curdir= b:netrw_curdir
9928 endif
9929 if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash
9930 NetrwKeepj call setline(3,'" '.substitute(curdir,'/','\\','g'))
9931 else
9932 NetrwKeepj call setline(3,'" '.curdir)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009933 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009934 let w:netrw_bannercnt= 3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009935 NetrwKeepj exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01009936 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009937" call Decho("--no banner",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009938 NetrwKeepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01009939 let w:netrw_bannercnt= 1
9940 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009941" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." win#".winnr(),'~'.expand("<slnum>"))
9942" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009943
Bram Moolenaar85850f32019-07-19 22:05:51 +02009944 " construct sortby string: [name|time|size|exten] [reversed]
Bram Moolenaar446cb832008-06-24 21:56:24 +00009945 let sortby= g:netrw_sort_by
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009946 if g:netrw_sort_direction =~# "^r"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009947 let sortby= sortby." reversed"
9948 endif
9949
9950 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009951 if g:netrw_banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009952" call Decho("--handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02009953 if g:netrw_sort_by =~# "^n"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009954" call Decho("directories will be sorted by name",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02009955 " sorted by name (also includes the sorting sequence in the banner)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009956 NetrwKeepj put ='\" Sorted by '.sortby
9957 NetrwKeepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01009958 let w:netrw_bannercnt= w:netrw_bannercnt + 2
9959 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009960" call Decho("directories will be sorted by size or time",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +02009961 " sorted by time, size, exten
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009962 NetrwKeepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01009963 let w:netrw_bannercnt= w:netrw_bannercnt + 1
9964 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009965 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar8d043172014-01-23 14:24:41 +01009966" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009967" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009968 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009969
Bram Moolenaar85850f32019-07-19 22:05:51 +02009970 " show copy/move target, if any {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009971 if g:netrw_banner
9972 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009973" call Decho("--show copy/move target<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009974 NetrwKeepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01009975 if s:netrwmftgt_islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009976 sil! NetrwKeepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01009977 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009978 sil! NetrwKeepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01009979 endif
9980 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00009981 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009982" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009983 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009984 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00009985 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009986
9987 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009988 if g:netrw_banner
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02009989" call Decho("--handle hiding/showing in banner (g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009990 if g:netrw_list_hide != "" && g:netrw_hide
9991 if g:netrw_hide == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009992 NetrwKeepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01009993 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009994 NetrwKeepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01009995 endif
9996 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00009997 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009998 exe "NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaara6878372014-03-22 21:02:50 +01009999
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010000" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010001 let quickhelp = g:netrw_quickhelp%len(s:QuickHelp)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010002" call Decho("quickhelp =".quickhelp,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010003 NetrwKeepj put ='\" Quick Help: <F1>:help '.s:QuickHelp[quickhelp]
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010004" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010005 NetrwKeepj put ='\" =============================================================================='
Bram Moolenaar5c736222010-01-06 20:54:52 +010010006 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8d043172014-01-23 14:24:41 +010010007" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010008" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010009 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010010
10011 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +010010012 if g:netrw_banner
10013 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010014 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010015" call Decho("--w:netrw_bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +010010016" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010017" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010018 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010019
Bram Moolenaar446cb832008-06-24 21:56:24 +000010020 " get list of files
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010021" call Decho("--Get list of files - islocal=".a:islocal,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010022 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010023 NetrwKeepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +000010024 else " remote
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010025 NetrwKeepj let badresult= s:NetrwRemoteListing()
Bram Moolenaara6878372014-03-22 21:02:50 +010010026 if badresult
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010027" call Decho("w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a')." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010028" call Dret("s:PerformListing : error detected by NetrwRemoteListing")
10029 return
10030 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010031 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010032
10033 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +020010034 if !exists("w:netrw_bannercnt")
10035 let w:netrw_bannercnt= 0
10036 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010037" call Decho("--manipulate directory listing (hide, sort)",'~'.expand("<slnum>"))
10038" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)",'~'.expand("<slnum>"))
10039" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010040
Bram Moolenaar5c736222010-01-06 20:54:52 +010010041 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020010042" call Decho("manipulate directory listing (support hide)",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010043" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010044 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010045 NetrwKeepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +000010046 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +010010047 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010048" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010049
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010050 if g:netrw_sort_by =~# "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +000010051 " sort by name
Bram Moolenaar85850f32019-07-19 22:05:51 +020010052" call Decho("sort by name",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010053 NetrwKeepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +000010054
Bram Moolenaar5c736222010-01-06 20:54:52 +010010055 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010056" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010057 if g:netrw_sort_direction =~# 'n'
Bram Moolenaar85850f32019-07-19 22:05:51 +020010058 " name: sort by name of file
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010059 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +000010060 else
10061 " reverse direction sorting
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010062 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +000010063 endif
10064 endif
Bram Moolenaar91359012019-11-30 17:57:03 +010010065
Bram Moolenaar446cb832008-06-24 21:56:24 +000010066 " remove priority pattern prefix
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010067" call Decho("remove priority pattern prefix",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010068 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
10069 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010070
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010071 elseif g:netrw_sort_by =~# "^ext"
Bram Moolenaar85850f32019-07-19 22:05:51 +020010072 " exten: sort by extension
10073 " The histdel(...,-1) calls remove the last search from the search history
10074" call Decho("sort by extension",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010075 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g+/+s/^/001'.g:netrw_sepchr.'/'
10076 NetrwKeepj call histdel("/",-1)
10077 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v+[./]+s/^/002'.g:netrw_sepchr.'/'
10078 NetrwKeepj call histdel("/",-1)
10079 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v+['.g:netrw_sepchr.'/]+s/^\(.*\.\)\(.\{-\}\)$/\2'.g:netrw_sepchr.'&/e'
10080 NetrwKeepj call histdel("/",-1)
10081 if !g:netrw_banner || w:netrw_bannercnt < line("$")
10082" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010083 if g:netrw_sort_direction =~# 'n'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010084 " normal direction sorting
10085 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
10086 else
10087 " reverse direction sorting
10088 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
10089 endif
10090 endif
10091 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^.\{-}'.g:netrw_sepchr.'//e'
10092 NetrwKeepj call histdel("/",-1)
10093
Bram Moolenaar446cb832008-06-24 21:56:24 +000010094 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +010010095 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010096" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction,'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010097 if g:netrw_sort_direction =~# 'n'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010098" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010099 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +000010100 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010101" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort!','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010102 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +000010103 endif
Bram Moolenaar91359012019-11-30 17:57:03 +010010104" call Decho("remove leading digits/ (sorting) information from listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010105 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
10106 NetrwKeepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +010010107 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010108 endif
10109
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010110 elseif g:netrw_sort_direction =~# 'r'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010111" call Decho('(s:PerformListing) reverse the sorted listing','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010112 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010113 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +010010114 call histdel("/",-1)
10115 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010116 endif
10117 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010118" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010119
10120 " convert to wide/tree listing {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010121" call Decho("--modify display if wide/tree listing style",'~'.expand("<slnum>"))
10122" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#1)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010123 NetrwKeepj call s:NetrwWideListing()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010124" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#2)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010125 NetrwKeepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010126" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#3)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010127
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010128 " resolve symbolic links if local and (thin or tree)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010129 if a:islocal && (w:netrw_liststyle == s:THINLIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010130" call Decho("--resolve symbolic links if local and thin|tree",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +020010131 sil! g/@$/call s:ShowLink()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010132 endif
10133
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010134 if exists("w:netrw_bannercnt") && (line("$") >= w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010135 " place cursor on the top-left corner of the file listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010136" call Decho("--place cursor on top-left corner of file listing",'~'.expand("<slnum>"))
10137 exe 'sil! '.w:netrw_bannercnt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010138 sil! NetrwKeepj norm! 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010139" call Decho(" tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
10140 else
10141" call Decho("--did NOT place cursor on top-left corner",'~'.expand("<slnum>"))
10142" call Decho(" w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a'),'~'.expand("<slnum>"))
10143" call Decho(" line($)=".line("$"),'~'.expand("<slnum>"))
10144" call Decho(" g:netrw_banner=".(exists("g:netrw_banner")? g:netrw_banner : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010145 endif
10146
10147 " record previous current directory
10148 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010149" call Decho("--record netrw_prvdir<".w:netrw_prvdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010150
10151 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010152" call Decho("--save some window-oriented variables into buffer oriented variables",'~'.expand("<slnum>"))
10153" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#4)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010154 NetrwKeepj call s:SetBufWinVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010155" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#5)",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +020010156 NetrwKeepj call s:NetrwOptionsRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010157" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#6)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010158
10159 " set display to netrw display settings
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010160" call Decho("--set display to netrw display settings (".g:netrw_bufsettings.")",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020010161 exe "setl ".g:netrw_bufsettings
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010162" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#7)",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010163 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010164" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010165 exe "setl ts=".(g:netrw_maxfilenamelen+1)
10166 endif
Bram Moolenaar91359012019-11-30 17:57:03 +010010167" call Decho("PerformListing buffer:",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +020010168" call DechoBuf(bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010169
Bram Moolenaar8d043172014-01-23 14:24:41 +010010170 if exists("s:treecurpos")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010171" call Decho("s:treecurpos exists; restore posn",'~'.expand("<slnum>"))
10172" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (internal#8)",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010173" call Decho("restoring posn to s:treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
10174 NetrwKeepj call winrestview(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010175 unlet s:treecurpos
10176 endif
10177
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010178" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (return)",'~'.expand("<slnum>"))
10179" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010180" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
10181endfun
10182
10183" ---------------------------------------------------------------------
10184" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +000010185fun! s:SetupNetrwStatusLine(statline)
10186" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
10187
10188 if !exists("s:netrw_setup_statline")
10189 let s:netrw_setup_statline= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010190" call Decho("do first-time status line setup",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000010191
10192 if !exists("s:netrw_users_stl")
10193 let s:netrw_users_stl= &stl
10194 endif
10195 if !exists("s:netrw_users_ls")
10196 let s:netrw_users_ls= &laststatus
10197 endif
10198
10199 " set up User9 highlighting as needed
10200 let keepa= @a
10201 redir @a
10202 try
10203 hi User9
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010204 catch /^Vim\%((\a\{3,})\)\=:E411/
Bram Moolenaar9964e462007-05-05 17:54:07 +000010205 if &bg == "dark"
10206 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
10207 else
10208 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
10209 endif
10210 endtry
10211 redir END
10212 let @a= keepa
10213 endif
10214
10215 " set up status line (may use User9 highlighting)
10216 " insure that windows have a statusline
10217 " make sure statusline is displayed
10218 let &stl=a:statline
Bram Moolenaarff034192013-04-24 18:51:19 +020010219 setl laststatus=2
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010220" call Decho("stl=".&stl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010221 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +000010222
10223" call Dret("SetupNetrwStatusLine : stl=".&stl)
10224endfun
10225
Bram Moolenaar85850f32019-07-19 22:05:51 +020010226" =========================================
10227" Remote Directory Browsing Support: {{{1
10228" =========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +000010229
10230" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010231" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
10232" This function assumes that a long listing will be received. Size, time,
10233" and reverse sorts will be requested of the server but not otherwise
10234" enforced here.
10235fun! s:NetrwRemoteFtpCmd(path,listcmd)
10236" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) w:netrw_method=".(exists("w:netrw_method")? w:netrw_method : (exists("b:netrw_method")? b:netrw_method : "???")))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010237" call Decho("line($)=".line("$")." win#".winnr()." w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010238 " sanity check: {{{3
10239 if !exists("w:netrw_method")
10240 if exists("b:netrw_method")
10241 let w:netrw_method= b:netrw_method
10242 else
10243 call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93)
10244" call Dret("NetrwRemoteFtpCmd")
10245 return
10246 endif
10247 endif
10248
10249 " WinXX ftp uses unix style input, so set ff to unix " {{{3
10250 let ffkeep= &ff
10251 setl ma ff=unix noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010252" call Decho("setl ma ff=unix noro",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010253
10254 " clear off any older non-banner lines " {{{3
10255 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010256" call Decho('exe sil! NetrwKeepj '.w:netrw_bannercnt.",$d _ (clear off old non-banner lines)",'~'.expand("<slnum>"))
10257 exe "sil! NetrwKeepj ".w:netrw_bannercnt.",$d _"
Bram Moolenaara6878372014-03-22 21:02:50 +010010258
10259 ".........................................
10260 if w:netrw_method == 2 || w:netrw_method == 5 " {{{3
10261 " ftp + <.netrc>: Method #2
10262 if a:path != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010263 NetrwKeepj put ='cd \"'.a:path.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +010010264 endif
10265 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010266 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010267" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010268 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010269 NetrwKeepj call setline(line("$")+1,a:listcmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010270" exe "NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaara6878372014-03-22 21:02:50 +010010271 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010272" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1),'~'.expand("<slnum>"))
10273 exe s:netrw_silentxfer." NetrwKeepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1)
Bram Moolenaara6878372014-03-22 21:02:50 +010010274 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010275" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1),'~'.expand("<slnum>"))
10276 exe s:netrw_silentxfer." NetrwKeepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)
Bram Moolenaara6878372014-03-22 21:02:50 +010010277 endif
10278
10279 ".........................................
10280 elseif w:netrw_method == 3 " {{{3
10281 " ftp + machine,id,passwd,filename: Method #3
10282 setl ff=unix
10283 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010284 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara6878372014-03-22 21:02:50 +010010285 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010286 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara6878372014-03-22 21:02:50 +010010287 endif
10288
10289 " handle userid and password
10290 let host= substitute(g:netrw_machine,'\..*$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010291" call Decho("host<".host.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010292 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
10293 call NetUserPass("ftp:".host)
10294 endif
10295 if exists("g:netrw_uid") && g:netrw_uid != ""
10296 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010297 NetrwKeepj put =g:netrw_uid
Bram Moolenaara6878372014-03-22 21:02:50 +010010298 if exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010299 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +010010300 endif
10301 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010302 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +010010303 endif
10304 endif
10305
10306 if a:path != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010307 NetrwKeepj put ='cd \"'.a:path.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +010010308 endif
10309 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010310 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010311" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010312 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010313 NetrwKeepj call setline(line("$")+1,a:listcmd)
Bram Moolenaara6878372014-03-22 21:02:50 +010010314
10315 " perform ftp:
10316 " -i : turns off interactive prompting from ftp
10317 " -n unix : DON'T use <.netrc>, even though it exists
10318 " -n win32: quit being obnoxious about password
10319 if exists("w:netrw_bannercnt")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010320" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010321 call s:NetrwExe(s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaara6878372014-03-22 21:02:50 +010010322" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010323" call Decho("WARNING: w:netrw_bannercnt doesn't exist!",'~'.expand("<slnum>"))
10324" g/^./call Decho("SKIPPING ftp#".line(".").": ".getline("."),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010325 endif
10326
10327 ".........................................
10328 elseif w:netrw_method == 9 " {{{3
10329 " sftp username@machine: Method #9
10330 " s:netrw_sftp_cmd
10331 setl ff=unix
10332
10333 " restore settings
10334 let &ff= ffkeep
10335" call Dret("NetrwRemoteFtpCmd")
10336 return
10337
10338 ".........................................
10339 else " {{{3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010340 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . bufname("%") . ">",23)
Bram Moolenaara6878372014-03-22 21:02:50 +010010341 endif
10342
10343 " cleanup for Windows " {{{3
10344 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010345 sil! NetrwKeepj %s/\r$//e
10346 NetrwKeepj call histdel("/",-1)
Bram Moolenaara6878372014-03-22 21:02:50 +010010347 endif
10348 if a:listcmd == "dir"
10349 " infer directory/link based on the file permission string
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010350 sil! NetrwKeepj g/d\%([-r][-w][-x]\)\{3}/NetrwKeepj s@$@/@e
10351 sil! NetrwKeepj g/l\%([-r][-w][-x]\)\{3}/NetrwKeepj s/$/@/e
10352 NetrwKeepj call histdel("/",-1)
10353 NetrwKeepj call histdel("/",-1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010354 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010355 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
10356 NetrwKeepj call histdel("/",-1)
Bram Moolenaara6878372014-03-22 21:02:50 +010010357 endif
10358 endif
10359
10360 " ftp's listing doesn't seem to include ./ or ../ " {{{3
10361 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010362 exe 'NetrwKeepj '.w:netrw_bannercnt
10363 NetrwKeepj put ='./'
Bram Moolenaara6878372014-03-22 21:02:50 +010010364 endif
10365 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010366 exe 'NetrwKeepj '.w:netrw_bannercnt
10367 NetrwKeepj put ='../'
Bram Moolenaara6878372014-03-22 21:02:50 +010010368 endif
10369
10370 " restore settings " {{{3
10371 let &ff= ffkeep
10372" call Dret("NetrwRemoteFtpCmd")
10373endfun
10374
10375" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010376" s:NetrwRemoteListing: {{{2
10377fun! s:NetrwRemoteListing()
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010378" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">) win#".winnr())
Bram Moolenaar69a7cb42004-06-20 12:51:53 +000010379
Bram Moolenaara6878372014-03-22 21:02:50 +010010380 if !exists("w:netrw_bannercnt") && exists("s:bannercnt")
10381 let w:netrw_bannercnt= s:bannercnt
10382 endif
10383 if !exists("w:netrw_bannercnt") && exists("b:bannercnt")
10384 let w:netrw_bannercnt= s:bannercnt
10385 endif
10386
Bram Moolenaar446cb832008-06-24 21:56:24 +000010387 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000010388
Bram Moolenaar446cb832008-06-24 21:56:24 +000010389 " sanity check:
10390 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010391" call Decho("b:netrw_method=".b:netrw_method,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010392 if !executable("ftp")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010393" call Decho("ftp is not executable",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010394 if !exists("g:netrw_quiet")
10395 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
10396 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020010397 call s:NetrwOptionsRestore("w:")
Bram Moolenaara6878372014-03-22 21:02:50 +010010398" call Dret("s:NetrwRemoteListing -1")
10399 return -1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000010400 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010401
Bram Moolenaar8d043172014-01-23 14:24:41 +010010402 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010403" call Decho("g:netrw_list_cmd<",(exists("g:netrw_list_cmd")? 'n/a' : "-empty-").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010404 if !exists("g:netrw_quiet")
Bram Moolenaar8d043172014-01-23 14:24:41 +010010405 if g:netrw_list_cmd == ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010406 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your g:netrw_list_cmd is empty; perhaps ".g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010407 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010408 NetrwKeepj 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 +000010409 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000010410 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000010411
Bram Moolenaar85850f32019-07-19 22:05:51 +020010412 NetrwKeepj call s:NetrwOptionsRestore("w:")
Bram Moolenaara6878372014-03-22 21:02:50 +010010413" call Dret("s:NetrwRemoteListing -1")
10414 return -1
Bram Moolenaar446cb832008-06-24 21:56:24 +000010415 endif " (remote handling sanity check)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010416" call Decho("passed remote listing sanity checks",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000010417
Bram Moolenaar446cb832008-06-24 21:56:24 +000010418 if exists("b:netrw_method")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010419" call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010420 let w:netrw_method= b:netrw_method
10421 endif
10422
Bram Moolenaar13600302014-05-22 18:26:40 +020010423 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +020010424 " use ftp to get remote file listing {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010425" call Decho("use ftp to get remote file listing",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +010010426 let s:method = "ftp"
10427 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010428 if g:netrw_sort_by =~# '^t'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010429 let listcmd= g:netrw_ftp_timelist_cmd
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010430 elseif g:netrw_sort_by =~# '^s'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010431 let listcmd= g:netrw_ftp_sizelist_cmd
10432 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010433" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010434 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010435" exe "sil! keepalt NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010436
Bram Moolenaara6878372014-03-22 21:02:50 +010010437 " report on missing file or directory messages
10438 if search('[Nn]o such file or directory\|Failed to change directory')
10439 let mesg= getline(".")
10440 if exists("w:netrw_bannercnt")
10441 setl ma
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010442 exe w:netrw_bannercnt.",$d _"
Bram Moolenaara6878372014-03-22 21:02:50 +010010443 setl noma
10444 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020010445 NetrwKeepj call s:NetrwOptionsRestore("w:")
Bram Moolenaara6878372014-03-22 21:02:50 +010010446 call netrw#ErrorMsg(s:WARNING,mesg,96)
10447" call Dret("s:NetrwRemoteListing : -1")
10448 return -1
10449 endif
10450
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010451 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010452 " shorten the listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010453" call Decho("generate short listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010454 exe "sil! keepalt NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +000010455
10456 " cleanup
10457 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010458 exe "sil! keepalt NetrwKeepj g/".g:netrw_ftp_browse_reject."/NetrwKeepj d"
10459 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010460 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010461 sil! NetrwKeepj %s/\r$//e
10462 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010463
Bram Moolenaare6ae6222013-05-21 21:01:10 +020010464 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +000010465 let line1= line(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010466 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar97d62492012-11-15 21:28:22 +010010467 let line2= search('\.\.\/\%(\s\|$\)','cnW')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010468" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010469 if line2 == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010470" call Decho("netrw is putting ../ into listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010471 sil! NetrwKeepj put='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010472 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010473 exe "sil! NetrwKeepj ".line1
10474 sil! NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +000010475
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010476" call Decho("line1=".line1." line2=".line2." line(.)=".line("."),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010477 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010478" call Decho("M$ ftp cleanup",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010479 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
10480 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010481 else " normal ftp cleanup
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010482" call Decho("normal ftp cleanup",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010483 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
10484 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
10485 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
10486 NetrwKeepj call histdel("/",-1)
10487 NetrwKeepj call histdel("/",-1)
10488 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010489 endif
10490 endif
10491
Bram Moolenaar13600302014-05-22 18:26:40 +020010492 else
Bram Moolenaar446cb832008-06-24 21:56:24 +000010493 " use ssh to get remote file listing {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010494" call Decho("use ssh to get remote file listing: s:path<".s:path.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010495 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010496" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010497 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010498" call Decho("1: exe r! ".s:ShellEscape(listcmd.s:path, 1),'~'.expand("<slnum>"))
10499 exe "NetrwKeepj r! ".listcmd.s:ShellEscape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010500 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010501 sil! NetrwKeepj g/^Listing directory/NetrwKeepj d
10502 sil! NetrwKeepj g/^d[-rwx][-rwx][-rwx]/NetrwKeepj s+$+/+e
10503 sil! NetrwKeepj g/^l[-rwx][-rwx][-rwx]/NetrwKeepj s+$+@+e
10504 NetrwKeepj call histdel("/",-1)
10505 NetrwKeepj call histdel("/",-1)
10506 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010507 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010508 sil! NetrwKeepj g/^[dlsp-][-rwx][-rwx][-rwx]/NetrwKeepj s/^.*\s\(\S\+\)$/\1/e
10509 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010510 endif
10511 else
10512 if s:path == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010513" call Decho("2: exe r! ".listcmd,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010514 exe "NetrwKeepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +000010515 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010516" call Decho("3: exe r! ".listcmd.' '.s:ShellEscape(fnameescape(s:path),1),'~'.expand("<slnum>"))
10517 exe "NetrwKeepj keepalt r! ".listcmd.' '.s:ShellEscape(fnameescape(s:path),1)
10518" call Decho("listcmd<".listcmd."> path<".s:path.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010519 endif
10520 endif
10521
10522 " cleanup
Bram Moolenaara6878372014-03-22 21:02:50 +010010523 if g:netrw_ssh_browse_reject != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010524" call Decho("cleanup: exe sil! g/".g:netrw_ssh_browse_reject."/NetrwKeepj d",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010525 exe "sil! g/".g:netrw_ssh_browse_reject."/NetrwKeepj d"
10526 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010527 endif
10528 endif
10529
10530 if w:netrw_liststyle == s:LONGLIST
10531 " do a long listing; these substitutions need to be done prior to sorting {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010532" call Decho("fix long listing:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010533
10534 if s:method == "ftp"
10535 " cleanup
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010536 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010537 while getline('.') =~# g:netrw_ftp_browse_reject
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010538 sil! NetrwKeepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +000010539 endwhile
Bram Moolenaare6ae6222013-05-21 21:01:10 +020010540 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +000010541 let line1= line(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010542 sil! NetrwKeepj 1
10543 sil! NetrwKeepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +000010544 let line2= line(".")
10545 if line2 == 0
Bram Moolenaar446cb832008-06-24 21:56:24 +000010546 if b:netrw_curdir != '/'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010547 exe 'sil! NetrwKeepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +000010548 endif
10549 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010550 exe "sil! NetrwKeepj ".line1
10551 sil! NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +000010552 endif
10553
10554 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010555" call Decho("M$ ftp site listing cleanup",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010556 exe 'sil! NetrwKeepj '.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 +000010557 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010558" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010559 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010560 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2 \t\1/e'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010561 exe 'sil NetrwKeepj '.w:netrw_bannercnt
10562 NetrwKeepj call histdel("/",-1)
10563 NetrwKeepj call histdel("/",-1)
10564 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010565 endif
10566 endif
10567
10568" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010569" exe "NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010570" endif " Decho
Bram Moolenaara6878372014-03-22 21:02:50 +010010571
10572" call Dret("s:NetrwRemoteListing 0")
10573 return 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000010574endfun
10575
Bram Moolenaar446cb832008-06-24 21:56:24 +000010576" ---------------------------------------------------------------------
10577" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
10578fun! s:NetrwRemoteRm(usrhost,path) range
10579" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010580" call Decho("firstline=".a:firstline." lastline=".a:lastline,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010581 let svpos= winsaveview()
10582" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010583
10584 let all= 0
10585 if exists("s:netrwmarkfilelist_{bufnr('%')}")
10586 " remove all marked files
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010587" call Decho("remove all marked files with bufnr#".bufnr("%"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010588 for fname in s:netrwmarkfilelist_{bufnr("%")}
10589 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010590 if ok =~# 'q\%[uit]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010591 break
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010592 elseif ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010593 let all= 1
10594 endif
10595 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +010010596 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010597
10598 else
10599 " remove files specified by range
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010600" call Decho("remove files specified by range",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010601
10602 " preparation for removing multiple files/directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010603 let keepsol = &l:sol
10604 setl nosol
10605 let ctr = a:firstline
Bram Moolenaar446cb832008-06-24 21:56:24 +000010606
10607 " remove multiple files and directories
10608 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010609 exe "NetrwKeepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +000010610 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010611 if ok =~# 'q\%[uit]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010612 break
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010613 elseif ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010614 let all= 1
10615 endif
10616 let ctr= ctr + 1
10617 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010618 let &l:sol = keepsol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010619 endif
10620
10621 " refresh the (remote) directory listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010622" call Decho("refresh remote directory listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010623 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010624" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
10625 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010626
10627" call Dret("s:NetrwRemoteRm")
10628endfun
10629
10630" ---------------------------------------------------------------------
10631" s:NetrwRemoteRmFile: {{{2
10632fun! s:NetrwRemoteRmFile(path,rmfile,all)
10633" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
10634
10635 let all= a:all
10636 let ok = ""
10637
10638 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
10639 " attempt to remove file
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010640" call Decho("attempt to remove file (all=".all.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010641 if !all
10642 echohl Statement
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010643" call Decho("case all=0:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010644 call inputsave()
10645 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
10646 call inputrestore()
10647 echohl NONE
10648 if ok == ""
10649 let ok="no"
10650 endif
10651 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010652 if ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010653 let all= 1
10654 endif
10655 endif
10656
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010657 if all || ok =~# 'y\%[es]' || ok == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010658" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010659 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010660" call Decho("case ftp:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010661 let path= a:path
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010662 if path =~ '^\a\{3,}://'
10663 let path= substitute(path,'^\a\{3,}://[^/]\+/','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +000010664 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010665 sil! NetrwKeepj .,$d _
Bram Moolenaar446cb832008-06-24 21:56:24 +000010666 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
10667 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010668" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010669 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010670" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010671 if !exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010672 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010673 let ok="q"
10674 else
10675 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010676" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">",'~'.expand("<slnum>"))
10677" call Decho("remotedir<".remotedir.">",'~'.expand("<slnum>"))
10678" call Decho("rmfile<".a:rmfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010679 if remotedir != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010680 let netrw_rm_cmd= netrw_rm_cmd." ".s:ShellEscape(fnameescape(remotedir.a:rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010681 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010682 let netrw_rm_cmd= netrw_rm_cmd." ".s:ShellEscape(fnameescape(a:rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010683 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010684" call Decho("call system(".netrw_rm_cmd.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010685 let ret= system(netrw_rm_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010686 if v:shell_error != 0
10687 if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
Bram Moolenaar85850f32019-07-19 22:05:51 +020010688 call netrw#ErrorMsg(s:ERROR,"remove failed; perhaps due to vim's current directory<".getcwd()."> not matching netrw's (".b:netrw_curdir.") (see :help netrw-cd)",102)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010689 else
10690 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
10691 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010692 elseif ret != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010693 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010694 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010695" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010696 endif
10697 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010698 elseif ok =~# 'q\%[uit]'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010699" call Decho("ok==".ok,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010700 endif
10701
10702 else
10703 " attempt to remove directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010704" call Decho("attempt to remove directory",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010705 if !all
10706 call inputsave()
10707 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
10708 call inputrestore()
10709 if ok == ""
10710 let ok="no"
10711 endif
10712 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010713 if ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000010714 let all= 1
10715 endif
10716 endif
10717
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010718 if all || ok =~# 'y\%[es]' || ok == ""
Bram Moolenaar446cb832008-06-24 21:56:24 +000010719 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010720 NetrwKeepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010721 else
10722 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010723 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.s:ShellEscape(netrw#WinPath(rmfile))
10724" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000010725 let ret= system(netrw_rmdir_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010726" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010727
10728 if v:shell_error != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010729" call Decho("v:shell_error not 0",'~'.expand("<slnum>"))
10730 let netrw_rmf_cmd= s:MakeSshCmd(netrw#WinPath(g:netrw_rmf_cmd)).' '.s:ShellEscape(netrw#WinPath(substitute(rmfile,'[\/]$','','e')))
10731" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000010732 let ret= system(netrw_rmf_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010733" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010734
10735 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010736 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010737 endif
10738 endif
10739 endif
10740
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010741 elseif ok =~# 'q\%[uit]'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010742" call Decho("ok==".ok,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010743 endif
10744 endif
10745
10746" call Dret("s:NetrwRemoteRmFile ".ok)
10747 return ok
10748endfun
10749
10750" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010751" s:NetrwRemoteRename: rename a remote file or directory {{{2
10752fun! s:NetrwRemoteRename(usrhost,path) range
10753" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
10754
10755 " preparation for removing multiple files/directories
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010756 let svpos = winsaveview()
10757" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010758 let ctr = a:firstline
10759 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
10760
10761 " rename files given by the markfilelist
10762 if exists("s:netrwmarkfilelist_{bufnr('%')}")
10763 for oldname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010764" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010765 if exists("subfrom")
10766 let newname= substitute(oldname,subfrom,subto,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010767" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010768 else
10769 call inputsave()
10770 let newname= input("Moving ".oldname." to : ",oldname)
10771 call inputrestore()
10772 if newname =~ '^s/'
10773 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
10774 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
10775 let newname = substitute(oldname,subfrom,subto,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010776" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010777 endif
10778 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010779
Bram Moolenaar446cb832008-06-24 21:56:24 +000010780 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010781 NetrwKeepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010782 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010783 let oldname= s:ShellEscape(a:path.oldname)
10784 let newname= s:ShellEscape(a:path.newname)
10785" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010786 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010787 endif
10788
10789 endfor
10790 call s:NetrwUnMarkFile(1)
10791
10792 else
10793
10794 " attempt to rename files/directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010795 let keepsol= &l:sol
10796 setl nosol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010797 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010798 exe "NetrwKeepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +000010799
10800 let oldname= s:NetrwGetWord()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010801" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010802
10803 call inputsave()
10804 let newname= input("Moving ".oldname." to : ",oldname)
10805 call inputrestore()
10806
10807 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
10808 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
10809 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010810 let oldname= s:ShellEscape(a:path.oldname)
10811 let newname= s:ShellEscape(a:path.newname)
10812" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010813 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010814 endif
10815
10816 let ctr= ctr + 1
10817 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010818 let &l:sol= keepsol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010819 endif
10820
10821 " refresh the directory
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010822 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010823" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
10824 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010825
10826" call Dret("NetrwRemoteRename")
10827endfun
10828
Bram Moolenaar85850f32019-07-19 22:05:51 +020010829" ==========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +000010830" Local Directory Browsing Support: {{{1
10831" ==========================================
10832
10833" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +020010834" netrw#FileUrlEdit: handles editing file://* files {{{2
Bram Moolenaar97d62492012-11-15 21:28:22 +010010835" Should accept: file://localhost/etc/fstab
10836" file:///etc/fstab
10837" file:///c:/WINDOWS/clock.avi
10838" file:///c|/WINDOWS/clock.avi
10839" file://localhost/c:/WINDOWS/clock.avi
10840" file://localhost/c|/WINDOWS/clock.avi
10841" file://c:/foo.txt
10842" file:///c:/foo.txt
10843" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
Bram Moolenaar85850f32019-07-19 22:05:51 +020010844fun! netrw#FileUrlEdit(fname)
10845" call Dfunc("netrw#FileUrlEdit(fname<".a:fname.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +010010846 let fname = a:fname
10847 if fname =~ '^file://localhost/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010848" call Decho('converting file://localhost/ -to- file:///','~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010849 let fname= substitute(fname,'^file://localhost/','file:///','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010850" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010851 endif
10852 if (has("win32") || has("win95") || has("win64") || has("win16"))
10853 if fname =~ '^file:///\=\a[|:]/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010854" call Decho('converting file:///\a|/ -to- file://\a:/','~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010855 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010856" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010857 endif
10858 endif
10859 let fname2396 = netrw#RFC2396(fname)
10860 let fname2396e= fnameescape(fname2396)
10861 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
10862 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010863" call Decho("windows exception for plainfname",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010864 if plainfname =~ '^/\+\a:'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010865" call Decho('removing leading "/"s','~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010866 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
10867 endif
10868 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020010869
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010870" call Decho("fname2396<".fname2396.">",'~'.expand("<slnum>"))
10871" call Decho("plainfname<".plainfname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010872 exe "sil doau BufReadPre ".fname2396e
Bram Moolenaar85850f32019-07-19 22:05:51 +020010873 exe 'NetrwKeepj keepalt edit '.plainfname
10874 exe 'sil! NetrwKeepj keepalt bdelete '.fnameescape(a:fname)
10875
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010876" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +020010877" call Dret("netrw#FileUrlEdit")
Bram Moolenaar97d62492012-11-15 21:28:22 +010010878 exe "sil doau BufReadPost ".fname2396e
10879endfun
10880
10881" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010882" netrw#LocalBrowseCheck: {{{2
10883fun! netrw#LocalBrowseCheck(dirname)
Bram Moolenaar89a9c152021-08-29 21:55:35 +020010884 " This function is called by netrwPlugin.vim's s:LocalBrowseCheck(), s:NetrwRexplore(),
Bram Moolenaar85850f32019-07-19 22:05:51 +020010885 " and by <cr> when atop a listed file/directory (via a buffer-local map)
10886 "
10887 " unfortunate interaction -- split window debugging can't be used here, must use
10888 " D-echoRemOn or D-echoTabOn as the BufEnter event triggers
10889 " another call to LocalBrowseCheck() when attempts to write
10890 " to the DBG buffer are made.
10891 "
Bram Moolenaar446cb832008-06-24 21:56:24 +000010892 " The &ft == "netrw" test was installed because the BufEnter event
10893 " would hit when re-entering netrw windows, creating unexpected
10894 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar85850f32019-07-19 22:05:51 +020010895" call Dfunc("netrw#LocalBrowseCheck(dirname<".a:dirname.">)")
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020010896" call Decho("isdir<".a:dirname."> =".isdirectory(s:NetrwFile(a:dirname)).((exists("s:treeforceredraw")? " treeforceredraw" : "")).'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010897" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
Bram Moolenaar71badf92023-04-22 22:40:14 +010010898 " getting E930: Cannot use :redir inside execute
10899"" call Dredir("ls!","netrw#LocalBrowseCheck")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010900" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
10901" call Decho("current buffer#".bufnr("%")."<".bufname("%")."> ft=".&ft,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010902
Bram Moolenaar97d62492012-11-15 21:28:22 +010010903 let ykeep= @@
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010904 if isdirectory(s:NetrwFile(a:dirname))
10905" call Decho("is-directory ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")." ft<".&ft."> g:netrw_fastbrowse=".g:netrw_fastbrowse,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010906
Bram Moolenaar97d62492012-11-15 21:28:22 +010010907 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010908" call Decho("case 1 : ft=".&ft,'~'.expand("<slnum>"))
10909" call Decho("s:rexposn_".bufnr("%")."<".bufname("%")."> ".(exists("s:rexposn_".bufnr("%"))? "exists" : "does not exist"),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010910 sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +010010911
Bram Moolenaar446cb832008-06-24 21:56:24 +000010912 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010913" call Decho("case 2 (ft≡netrw && line($)≡1)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010914 sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +010010915
Bram Moolenaar5c736222010-01-06 20:54:52 +010010916 elseif exists("s:treeforceredraw")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010917" call Decho("case 3 (treeforceredraw)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010918 unlet s:treeforceredraw
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010919 sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010920 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010921" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010922" call Dret("netrw#LocalBrowseCheck")
10923 return
Bram Moolenaar446cb832008-06-24 21:56:24 +000010924 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010010925
Bram Moolenaar85850f32019-07-19 22:05:51 +020010926 " The following code wipes out currently unused netrw buffers
Bram Moolenaar97d62492012-11-15 21:28:22 +010010927 " IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
10928 " AND IF the listing style is not a tree listing
10929 if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010930" call Decho("wiping out currently unused netrw buffers",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010931 let ibuf = 1
10932 let buflast = bufnr("$")
10933 while ibuf <= buflast
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010934 if bufwinnr(ibuf) == -1 && isdirectory(s:NetrwFile(bufname(ibuf)))
10935 exe "sil! keepj keepalt ".ibuf."bw!"
Bram Moolenaar97d62492012-11-15 21:28:22 +010010936 endif
10937 let ibuf= ibuf + 1
10938 endwhile
10939 endif
10940 let @@= ykeep
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010941" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
10942" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010943 " not a directory, ignore it
Bram Moolenaara6878372014-03-22 21:02:50 +010010944" call Dret("netrw#LocalBrowseCheck : not a directory, ignoring it; dirname<".a:dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010945endfun
10946
10947" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010948" s:LocalBrowseRefresh: this function is called after a user has {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +000010949" performed any shell command. The idea is to cause all local-browsing
10950" buffers to be refreshed after a user has executed some shell command,
10951" on the chance that s/he removed/created a file/directory with it.
Bram Moolenaara6878372014-03-22 21:02:50 +010010952fun! s:LocalBrowseRefresh()
10953" call Dfunc("s:LocalBrowseRefresh() tabpagenr($)=".tabpagenr("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010954" call Decho("s:netrw_browselist =".(exists("s:netrw_browselist")? string(s:netrw_browselist) : '<n/a>'),'~'.expand("<slnum>"))
10955" call Decho("w:netrw_bannercnt =".(exists("w:netrw_bannercnt")? string(w:netrw_bannercnt) : '<n/a>'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010956
Bram Moolenaar446cb832008-06-24 21:56:24 +000010957 " determine which buffers currently reside in a tab
10958 if !exists("s:netrw_browselist")
Bram Moolenaara6878372014-03-22 21:02:50 +010010959" call Dret("s:LocalBrowseRefresh : browselist is empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010960 return
10961 endif
10962 if !exists("w:netrw_bannercnt")
Bram Moolenaara6878372014-03-22 21:02:50 +010010963" call Dret("s:LocalBrowseRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010964 return
10965 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010010966 if exists("s:netrw_events") && s:netrw_events == 1
10967 " s:LocalFastBrowser gets called (indirectly) from a
10968 let s:netrw_events= 2
10969" call Dret("s:LocalBrowseRefresh : avoid initial double refresh")
10970 return
Bram Moolenaar5c736222010-01-06 20:54:52 +010010971 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010972 let itab = 1
10973 let buftablist = []
Bram Moolenaar97d62492012-11-15 21:28:22 +010010974 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +000010975 while itab <= tabpagenr("$")
10976 let buftablist = buftablist + tabpagebuflist()
10977 let itab = itab + 1
Bram Moolenaar85850f32019-07-19 22:05:51 +020010978 sil! tabn
Bram Moolenaar446cb832008-06-24 21:56:24 +000010979 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010980" call Decho("buftablist".string(buftablist),'~'.expand("<slnum>"))
10981" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010982 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
10983 " | refresh any netrw window
10984 " | wipe out any non-displaying netrw buffer
Bram Moolenaar85850f32019-07-19 22:05:51 +020010985 let curwinid = win_getid(winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +000010986 let ibl = 0
10987 for ibuf in s:netrw_browselist
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010988" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010989 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
10990 " wipe out any non-displaying netrw buffer
Bram Moolenaar85850f32019-07-19 22:05:51 +020010991 " (ibuf not shown in a current window AND
10992 " ibuf not in any tab)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010993" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">",'~'.expand("<slnum>"))
10994 exe "sil! keepj bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010995 call remove(s:netrw_browselist,ibl)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010996" call Decho("browselist=".string(s:netrw_browselist),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010997 continue
10998 elseif index(tabpagebuflist(),ibuf) != -1
10999 " refresh any netrw buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011000" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011001 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011002 if getline(".") =~# 'Quick Help'
Bram Moolenaara6878372014-03-22 21:02:50 +010011003 " decrement g:netrw_quickhelp to prevent refresh from changing g:netrw_quickhelp
11004 " (counteracts s:NetrwBrowseChgDir()'s incrementing)
11005 let g:netrw_quickhelp= g:netrw_quickhelp - 1
11006 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011007" call Decho("#3: quickhelp=".g:netrw_quickhelp,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011008 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
11009 NetrwKeepj call s:NetrwRefreshTreeDict(w:netrw_treetop)
11010 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011011 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011012 endif
11013 let ibl= ibl + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011014" call Decho("bottom of s:netrw_browselist for loop: ibl=".ibl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011015 endfor
Bram Moolenaar85850f32019-07-19 22:05:51 +020011016" call Decho("restore window: win_gotoid(".curwinid.")")
11017 call win_gotoid(curwinid)
Bram Moolenaar97d62492012-11-15 21:28:22 +010011018 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +000011019
Bram Moolenaara6878372014-03-22 21:02:50 +010011020" call Dret("s:LocalBrowseRefresh")
Bram Moolenaar446cb832008-06-24 21:56:24 +000011021endfun
11022
11023" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +010011024" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
11025"
11026" g:netrw_ Directory Is
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011027" fastbrowse Local Remote
Bram Moolenaar97d62492012-11-15 21:28:22 +010011028" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
11029" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011030" fast 2 H H
Bram Moolenaar97d62492012-11-15 21:28:22 +010011031"
11032" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
11033" Hiding a buffer means that it will be re-used when examined, hence "fast".
Bram Moolenaara6878372014-03-22 21:02:50 +010011034" (re-using a buffer may not be as accurate)
11035"
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011036" s:netrw_events : doesn't exist, s:LocalFastBrowser() will install autocmds with medium-speed or fast browsing
Bram Moolenaara6878372014-03-22 21:02:50 +010011037" =1: autocmds installed, but ignore next FocusGained event to avoid initial double-refresh of listing.
11038" BufEnter may be first event, then a FocusGained event. Ignore the first FocusGained event.
11039" If :Explore used: it sets s:netrw_events to 2, so no FocusGained events are ignored.
11040" =2: autocmds installed (doesn't ignore any FocusGained events)
Bram Moolenaar97d62492012-11-15 21:28:22 +010011041fun! s:LocalFastBrowser()
Bram Moolenaar85850f32019-07-19 22:05:51 +020011042" call Dfunc("s:LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
11043" call Decho("s:netrw_events ".(exists("s:netrw_events")? "exists" : 'n/a'),'~'.expand("<slnum>"))
11044" call Decho("autocmd: ShellCmdPost ".(exists("#ShellCmdPost")? "already installed" : "not installed"),'~'.expand("<slnum>"))
11045" call Decho("autocmd: FocusGained ".(exists("#FocusGained")? "already installed" : "not installed"),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011046
11047 " initialize browselist, a list of buffer numbers that the local browser has used
11048 if !exists("s:netrw_browselist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011049" call Decho("initialize s:netrw_browselist",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011050 let s:netrw_browselist= []
11051 endif
11052
11053 " append current buffer to fastbrowse list
11054 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011055" call Decho("appendng current buffer to browselist",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011056 call add(s:netrw_browselist,bufnr("%"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011057" call Decho("browselist=".string(s:netrw_browselist),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011058 endif
11059
11060 " enable autocmd events to handle refreshing/removing local browser buffers
11061 " If local browse buffer is currently showing: refresh it
11062 " If local browse buffer is currently hidden : wipe it
11063 " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing
11064 " =1 : medium speed, re-use directory listing for remote only
11065 " =2 : fast speed, always re-use directory listing when possible
Bram Moolenaara6878372014-03-22 21:02:50 +010011066 if g:netrw_fastbrowse <= 1 && !exists("#ShellCmdPost") && !exists("s:netrw_events")
11067 let s:netrw_events= 1
11068 augroup AuNetrwEvent
Bram Moolenaar97d62492012-11-15 21:28:22 +010011069 au!
11070 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011071" call Decho("installing autocmd: ShellCmdPost",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011072 au ShellCmdPost * call s:LocalBrowseRefresh()
Bram Moolenaar97d62492012-11-15 21:28:22 +010011073 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011074" call Decho("installing autocmds: ShellCmdPost FocusGained",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011075 au ShellCmdPost,FocusGained * call s:LocalBrowseRefresh()
Bram Moolenaar97d62492012-11-15 21:28:22 +010011076 endif
11077 augroup END
Bram Moolenaar97d62492012-11-15 21:28:22 +010011078
11079 " user must have changed fastbrowse to its fast setting, so remove
11080 " the associated autocmd events
Bram Moolenaara6878372014-03-22 21:02:50 +010011081 elseif g:netrw_fastbrowse > 1 && exists("#ShellCmdPost") && exists("s:netrw_events")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011082" call Decho("remove AuNetrwEvent autcmd group",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011083 unlet s:netrw_events
11084 augroup AuNetrwEvent
Bram Moolenaar97d62492012-11-15 21:28:22 +010011085 au!
11086 augroup END
Bram Moolenaara6878372014-03-22 21:02:50 +010011087 augroup! AuNetrwEvent
Bram Moolenaar97d62492012-11-15 21:28:22 +010011088 endif
11089
Bram Moolenaar85850f32019-07-19 22:05:51 +020011090" call Dret("s:LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
Bram Moolenaar97d62492012-11-15 21:28:22 +010011091endfun
11092
11093" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010011094" s:LocalListing: does the job of "ls" for local directories {{{2
11095fun! s:LocalListing()
11096" call Dfunc("s:LocalListing()")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011097" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
11098" call Decho("modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
11099" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011100
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011101" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist",'~'.expand("<slnum>")) |endif
11102" 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",'~'.expand("<slnum>"))|endif
11103" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011104
11105 " get the list of files contained in the current directory
11106 let dirname = b:netrw_curdir
11107 let dirnamelen = strlen(b:netrw_curdir)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011108 let filelist = s:NetrwGlob(dirname,"*",0)
11109 let filelist = filelist + s:NetrwGlob(dirname,".*",0)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011110" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011111
11112 if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011113" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011114 elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/'
11115 " include ../ in the glob() entry if its missing
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011116" call Decho("forcibly including on \"..\"",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011117 let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011118" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011119 endif
11120
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011121" call Decho("before while: dirname <".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011122" call Decho("before while: dirnamelen<".dirnamelen.">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011123" call Decho("before while: filelist =".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011124
11125 if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
11126 let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
11127 let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011128" call Decho("dynamic_maxfilenamelen: filenames =".string(filelistcopy),'~'.expand("<slnum>"))
11129" call Decho("dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011130 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011131" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011132
11133 for filename in filelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011134" call Decho(" ",'~'.expand("<slnum>"))
11135" call Decho("for filename in filelist: filename<".filename.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011136
11137 if getftype(filename) == "link"
11138 " indicate a symbolic link
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011139" call Decho("indicate <".filename."> is a symbolic link with trailing @",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011140 let pfile= filename."@"
11141
11142 elseif getftype(filename) == "socket"
11143 " indicate a socket
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011144" call Decho("indicate <".filename."> is a socket with trailing =",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011145 let pfile= filename."="
11146
11147 elseif getftype(filename) == "fifo"
11148 " indicate a fifo
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011149" call Decho("indicate <".filename."> is a fifo with trailing |",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011150 let pfile= filename."|"
11151
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011152 elseif isdirectory(s:NetrwFile(filename))
Bram Moolenaara6878372014-03-22 21:02:50 +010011153 " indicate a directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011154" call Decho("indicate <".filename."> is a directory with trailing /",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011155 let pfile= filename."/"
11156
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011157 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(s:NetrwFile(filename))
Bram Moolenaara6878372014-03-22 21:02:50 +010011158 if (has("win32") || has("win95") || has("win64") || has("win16"))
11159 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
11160 " indicate an executable
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011161" call Decho("indicate <".filename."> is executable with trailing *",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011162 let pfile= filename."*"
11163 else
11164 " normal file
11165 let pfile= filename
11166 endif
11167 elseif executable(filename)
11168 " indicate an executable
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011169" call Decho("indicate <".filename."> is executable with trailing *",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011170 let pfile= filename."*"
11171 else
11172 " normal file
11173 let pfile= filename
11174 endif
11175
11176 else
11177 " normal file
11178 let pfile= filename
11179 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011180" call Decho("pfile<".pfile."> (after *@/ appending)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011181
11182 if pfile =~ '//$'
11183 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011184" call Decho("change // to /: pfile<".pfile.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011185 endif
11186 let pfile= strpart(pfile,dirnamelen)
11187 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011188" call Decho("filename<".filename.">",'~'.expand("<slnum>"))
11189" call Decho("pfile <".pfile.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011190
11191 if w:netrw_liststyle == s:LONGLIST
11192 let sz = getfsize(filename)
Bram Moolenaar71badf92023-04-22 22:40:14 +010011193 let szlen = 15 - (strdisplaywidth(longfile) - g:netrw_maxfilenamelen)
11194 let szlen = (szlen > 0) ? szlen : 0
11195 let fsz = printf("%".szlen."S",sz)
11196
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011197 if g:netrw_sizestyle =~# "[hH]"
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011198 let sz= s:NetrwHumanReadable(sz)
11199 endif
Bram Moolenaar71badf92023-04-22 22:40:14 +010011200 let longfile= printf("%-".g:netrw_maxfilenamelen."S",pfile)
11201 let pfile = longfile." ".sz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011202" call Decho("longlist support: sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011203 endif
11204
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011205 if g:netrw_sort_by =~# "^t"
Bram Moolenaara6878372014-03-22 21:02:50 +010011206 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar91359012019-11-30 17:57:03 +010011207 " Decorate listing by prepending a timestamp/ . Sorting will then be done based on time.
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011208" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (time)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011209" call Decho("getftime(".filename.")=".getftime(filename),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011210 let t = getftime(filename)
11211 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar91359012019-11-30 17:57:03 +010011212" call Decho("exe NetrwKeepj put ='".ft.'/'.pfile."'",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011213 let ftpfile= ft.'/'.pfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011214 sil! NetrwKeepj put=ftpfile
Bram Moolenaara6878372014-03-22 21:02:50 +010011215
11216 elseif g:netrw_sort_by =~ "^s"
11217 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011218" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (size)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011219" call Decho("getfsize(".filename.")=".getfsize(filename),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011220 let sz = getfsize(filename)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011221 if g:netrw_sizestyle =~# "[hH]"
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011222 let sz= s:NetrwHumanReadable(sz)
11223 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010011224 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011225" call Decho("exe NetrwKeepj put ='".fsz.'/'.filename."'",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011226 let fszpfile= fsz.'/'.pfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011227 sil! NetrwKeepj put =fszpfile
Bram Moolenaara6878372014-03-22 21:02:50 +010011228
11229 else
11230 " sort by name
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011231" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (name)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011232" call Decho("exe NetrwKeepj put ='".pfile."'",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011233 sil! NetrwKeepj put=pfile
Bram Moolenaara6878372014-03-22 21:02:50 +010011234 endif
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010011235" call DechoBuf(bufnr("%"),"bufnr(%)")
Bram Moolenaara6878372014-03-22 21:02:50 +010011236 endfor
11237
11238 " cleanup any windows mess at end-of-line
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011239 sil! NetrwKeepj g/^$/d
11240 sil! NetrwKeepj %s/\r$//e
Bram Moolenaara6878372014-03-22 21:02:50 +010011241 call histdel("/",-1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011242" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011243 exe "setl ts=".(g:netrw_maxfilenamelen+1)
11244
11245" call Dret("s:LocalListing")
11246endfun
11247
11248" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +010011249" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
11250fun! s:NetrwLocalExecute(cmd)
11251" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
11252 let ykeep= @@
11253 " sanity check
11254 if !executable(a:cmd)
11255 call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
11256 let @@= ykeep
11257" call Dret("s:NetrwLocalExecute")
11258 return
11259 endif
11260
11261 let optargs= input(":!".a:cmd,"","file")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011262" call Decho("optargs<".optargs.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011263 let result= system(a:cmd.optargs)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011264" call Decho("result,'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011265
11266 " strip any ansi escape sequences off
11267 let result = substitute(result,"\e\\[[0-9;]*m","","g")
11268
11269 " show user the result(s)
11270 echomsg result
11271 let @@= ykeep
11272
11273" call Dret("s:NetrwLocalExecute")
11274endfun
11275
11276" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011277" s:NetrwLocalRename: rename a local file or directory {{{2
Bram Moolenaar97d62492012-11-15 21:28:22 +010011278fun! s:NetrwLocalRename(path) range
11279" call Dfunc("NetrwLocalRename(path<".a:path.">)")
11280
11281 " preparation for removing multiple files/directories
Bram Moolenaar29634562020-01-09 21:46:04 +010011282 let ykeep = @@
11283 let ctr = a:firstline
11284 let svpos = winsaveview()
11285 let all = 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011286" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011287
11288 " rename files given by the markfilelist
11289 if exists("s:netrwmarkfilelist_{bufnr('%')}")
11290 for oldname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011291" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011292 if exists("subfrom")
11293 let newname= substitute(oldname,subfrom,subto,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011294" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011295 else
11296 call inputsave()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011297 let newname= input("Moving ".oldname." to : ",oldname,"file")
Bram Moolenaar97d62492012-11-15 21:28:22 +010011298 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011299 if newname =~ ''
11300 " two ctrl-x's : ignore all of string preceding the ctrl-x's
11301 let newname = substitute(newname,'^.*','','')
11302 elseif newname =~ ''
11303 " one ctrl-x : ignore portion of string preceding ctrl-x but after last /
11304 let newname = substitute(newname,'[^/]*','','')
11305 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010011306 if newname =~ '^s/'
11307 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
11308 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011309" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011310 let newname = substitute(oldname,subfrom,subto,'')
11311 endif
11312 endif
Bram Moolenaar29634562020-01-09 21:46:04 +010011313 if !all && filereadable(newname)
11314 call inputsave()
11315 let response= input("File<".newname."> already exists; do you want to overwrite it? (y/all/n) ")
11316 call inputrestore()
11317 if response == "all"
11318 let all= 1
11319 elseif response != "y" && response != "yes"
11320 " refresh the directory
11321" call Decho("refresh the directory listing",'~'.expand("<slnum>"))
11322 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
11323" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
11324 NetrwKeepj call winrestview(svpos)
11325 let @@= ykeep
11326" call Dret("NetrwLocalRename")
11327 return
11328 endif
11329 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010011330 call rename(oldname,newname)
11331 endfor
11332 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011333
Bram Moolenaar97d62492012-11-15 21:28:22 +010011334 else
11335
11336 " attempt to rename files/directories
11337 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011338 exe "NetrwKeepj ".ctr
Bram Moolenaar97d62492012-11-15 21:28:22 +010011339
11340 " sanity checks
11341 if line(".") < w:netrw_bannercnt
11342 let ctr= ctr + 1
11343 continue
11344 endif
11345 let curword= s:NetrwGetWord()
11346 if curword == "./" || curword == "../"
11347 let ctr= ctr + 1
11348 continue
11349 endif
11350
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011351 NetrwKeepj norm! 0
Bram Moolenaar97d62492012-11-15 21:28:22 +010011352 let oldname= s:ComposePath(a:path,curword)
Bram Moolenaar29634562020-01-09 21:46:04 +010011353" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011354
11355 call inputsave()
11356 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
11357 call inputrestore()
11358
11359 call rename(oldname,newname)
Bram Moolenaar29634562020-01-09 21:46:04 +010011360" call Decho("renaming <".oldname."> to <".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011361
11362 let ctr= ctr + 1
11363 endwhile
11364 endif
11365
11366 " refresh the directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011367" call Decho("refresh the directory listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011368 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011369" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
11370 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +010011371 let @@= ykeep
11372
11373" call Dret("NetrwLocalRename")
11374endfun
11375
11376" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011377" s:NetrwLocalRm: {{{2
11378fun! s:NetrwLocalRm(path) range
11379" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011380" call Decho("firstline=".a:firstline." lastline=".a:lastline,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011381
11382 " preparation for removing multiple files/directories
Bram Moolenaar97d62492012-11-15 21:28:22 +010011383 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +000011384 let ret = 0
11385 let all = 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011386 let svpos = winsaveview()
11387" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011388
11389 if exists("s:netrwmarkfilelist_{bufnr('%')}")
11390 " remove all marked files
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011391" call Decho("remove all marked files",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011392 for fname in s:netrwmarkfilelist_{bufnr("%")}
11393 let ok= s:NetrwLocalRmFile(a:path,fname,all)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011394 if ok =~# 'q\%[uit]' || ok == "no"
Bram Moolenaar446cb832008-06-24 21:56:24 +000011395 break
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011396 elseif ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000011397 let all= 1
11398 endif
11399 endfor
11400 call s:NetrwUnMarkFile(1)
11401
11402 else
11403 " remove (multiple) files and directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011404" call Decho("remove files in range [".a:firstline.",".a:lastline."]",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011405
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011406 let keepsol= &l:sol
11407 setl nosol
Bram Moolenaar446cb832008-06-24 21:56:24 +000011408 let ctr = a:firstline
11409 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011410 exe "NetrwKeepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +000011411
11412 " sanity checks
11413 if line(".") < w:netrw_bannercnt
11414 let ctr= ctr + 1
11415 continue
11416 endif
11417 let curword= s:NetrwGetWord()
11418 if curword == "./" || curword == "../"
11419 let ctr= ctr + 1
11420 continue
11421 endif
11422 let ok= s:NetrwLocalRmFile(a:path,curword,all)
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011423 if ok =~# 'q\%[uit]' || ok == "no"
Bram Moolenaar446cb832008-06-24 21:56:24 +000011424 break
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011425 elseif ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000011426 let all= 1
11427 endif
11428 let ctr= ctr + 1
11429 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011430 let &l:sol= keepsol
Bram Moolenaar446cb832008-06-24 21:56:24 +000011431 endif
11432
11433 " refresh the directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011434" call Decho("bufname<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011435 if bufname("%") != "NetrwMessage"
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011436 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011437" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
11438 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011439 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010011440 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +000011441
11442" call Dret("s:NetrwLocalRm")
11443endfun
11444
11445" ---------------------------------------------------------------------
11446" s:NetrwLocalRmFile: remove file fname given the path {{{2
11447" Give confirmation prompt unless all==1
11448fun! s:NetrwLocalRmFile(path,fname,all)
11449" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011450
Bram Moolenaar446cb832008-06-24 21:56:24 +000011451 let all= a:all
11452 let ok = ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011453 NetrwKeepj norm! 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011454 let rmfile= s:NetrwFile(s:ComposePath(a:path,a:fname))
11455" call Decho("rmfile<".rmfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011456
11457 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
11458 " attempt to remove file
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011459" call Decho("attempt to remove file<".rmfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011460 if !all
11461 echohl Statement
11462 call inputsave()
11463 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
11464 call inputrestore()
11465 echohl NONE
11466 if ok == ""
11467 let ok="no"
11468 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011469" call Decho("response: ok<".ok.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011470 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011471" call Decho("response: ok<".ok."> (after sub)",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011472 if ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000011473 let all= 1
11474 endif
11475 endif
11476
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011477 if all || ok =~# 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +000011478 let ret= s:NetrwDelete(rmfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011479" call Decho("errcode=".v:shell_error." ret=".ret,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011480 endif
11481
11482 else
11483 " attempt to remove directory
11484 if !all
11485 echohl Statement
11486 call inputsave()
11487 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
11488 call inputrestore()
11489 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
11490 if ok == ""
11491 let ok="no"
11492 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011493 if ok =~# 'a\%[ll]'
Bram Moolenaar446cb832008-06-24 21:56:24 +000011494 let all= 1
11495 endif
11496 endif
11497 let rmfile= substitute(rmfile,'[\/]$','','e')
11498
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011499 if all || ok =~# 'y\%[es]' || ok == ""
Bram Moolenaar71badf92023-04-22 22:40:14 +010011500 if delete(rmfile,"d")
11501 call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".rmfile.">!",103)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011502 endif
11503 endif
11504 endif
11505
11506" call Dret("s:NetrwLocalRmFile ".ok)
11507 return ok
11508endfun
11509
Bram Moolenaar85850f32019-07-19 22:05:51 +020011510" =====================================================================
Bram Moolenaar9964e462007-05-05 17:54:07 +000011511" Support Functions: {{{1
11512
Bram Moolenaar488c6512005-08-11 20:09:58 +000011513" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010011514" netrw#Access: intended to provide access to variable values for netrw's test suite {{{2
11515" 0: marked file list of current buffer
11516" 1: marked file target
11517fun! netrw#Access(ilist)
11518 if a:ilist == 0
11519 if exists("s:netrwmarkfilelist_".bufnr('%'))
11520 return s:netrwmarkfilelist_{bufnr('%')}
11521 else
11522 return "no-list-buf#".bufnr('%')
11523 endif
11524 elseif a:ilist == 1
11525 return s:netrwmftgt
Bram Moolenaar85850f32019-07-19 22:05:51 +020011526 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010011527endfun
11528
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011529" ---------------------------------------------------------------------
11530" netrw#Call: allows user-specified mappings to call internal netrw functions {{{2
11531fun! netrw#Call(funcname,...)
Bram Moolenaar85850f32019-07-19 22:05:51 +020011532 return call("s:".a:funcname,a:000)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011533endfun
11534
Bram Moolenaara6878372014-03-22 21:02:50 +010011535" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011536" netrw#Expose: allows UserMaps and pchk to look at otherwise script-local variables {{{2
11537" I expect this function to be used in
11538" :PChkAssert netrw#Expose("netrwmarkfilelist")
11539" for example.
11540fun! netrw#Expose(varname)
11541" call Dfunc("netrw#Expose(varname<".a:varname.">)")
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011542 if exists("s:".a:varname)
11543 exe "let retval= s:".a:varname
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010011544" call Decho("retval=".retval,'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011545 if exists("g:netrw_pchk")
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010011546" call Decho("type(g:netrw_pchk=".g:netrw_pchk.")=".type(retval),'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011547 if type(retval) == 3
11548 let retval = copy(retval)
11549 let i = 0
11550 while i < len(retval)
11551 let retval[i]= substitute(retval[i],expand("$HOME"),'~','')
11552 let i = i + 1
11553 endwhile
11554 endif
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010011555" call Dret("netrw#Expose ".string(retval)),'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011556 return string(retval)
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010011557 else
11558" call Decho("g:netrw_pchk doesn't exist",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011559 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011560 else
Bram Moolenaar5ef1c6a2019-11-10 22:09:11 +010011561" call Decho("s:".a:varname." doesn't exist",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011562 let retval= "n/a"
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011563 endif
11564
11565" call Dret("netrw#Expose ".string(retval))
11566 return retval
11567endfun
11568
11569" ---------------------------------------------------------------------
11570" netrw#Modify: allows UserMaps to set (modify) script-local variables {{{2
11571fun! netrw#Modify(varname,newvalue)
11572" call Dfunc("netrw#Modify(varname<".a:varname.">,newvalue<".string(a:newvalue).">)")
11573 exe "let s:".a:varname."= ".string(a:newvalue)
11574" call Dret("netrw#Modify")
11575endfun
11576
11577" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010011578" netrw#RFC2396: converts %xx into characters {{{2
11579fun! netrw#RFC2396(fname)
11580" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
11581 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
11582" call Dret("netrw#RFC2396 ".fname)
11583 return fname
11584endfun
11585
11586" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011587" netrw#UserMaps: supports user-specified maps {{{2
11588" see :help function()
11589"
11590" g:Netrw_UserMaps is a List with members such as:
11591" [[keymap sequence, function reference],...]
11592"
11593" The referenced function may return a string,
11594" refresh : refresh the display
11595" -other- : this string will be executed
11596" or it may return a List of strings.
11597"
11598" Each keymap-sequence will be set up with a nnoremap
Bram Moolenaar85850f32019-07-19 22:05:51 +020011599" to invoke netrw#UserMaps(a:islocal).
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011600" Related functions:
11601" netrw#Expose(varname) -- see s:varname variables
11602" netrw#Modify(varname,newvalue) -- modify value of s:varname variable
11603" netrw#Call(funcname,...) -- call internal netrw function with optional arguments
11604fun! netrw#UserMaps(islocal)
11605" call Dfunc("netrw#UserMaps(islocal=".a:islocal.")")
11606" call Decho("g:Netrw_UserMaps ".(exists("g:Netrw_UserMaps")? "exists" : "does NOT exist"),'~'.expand("<slnum>"))
11607
11608 " set up usermaplist
11609 if exists("g:Netrw_UserMaps") && type(g:Netrw_UserMaps) == 3
11610" call Decho("g:Netrw_UserMaps has type 3<List>",'~'.expand("<slnum>"))
11611 for umap in g:Netrw_UserMaps
11612" call Decho("type(umap[0]<".string(umap[0]).">)=".type(umap[0])." (should be 1=string)",'~'.expand("<slnum>"))
11613" call Decho("type(umap[1])=".type(umap[1])." (should be 1=string)",'~'.expand("<slnum>"))
11614 " if umap[0] is a string and umap[1] is a string holding a function name
11615 if type(umap[0]) == 1 && type(umap[1]) == 1
11616" call Decho("nno <buffer> <silent> ".umap[0]." :call s:UserMaps(".a:islocal.",".string(umap[1]).")<cr>",'~'.expand("<slnum>"))
11617 exe "nno <buffer> <silent> ".umap[0]." :call <SID>UserMaps(".a:islocal.",'".umap[1]."')<cr>"
11618 else
11619 call netrw#ErrorMsg(s:WARNING,"ignoring usermap <".string(umap[0])."> -- not a [string,funcref] entry",99)
11620 endif
11621 endfor
11622 endif
11623" call Dret("netrw#UserMaps")
11624endfun
11625
11626" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +020011627" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
11628fun! netrw#WinPath(path)
11629" call Dfunc("netrw#WinPath(path<".a:path.">)")
11630 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
11631 " remove cygdrive prefix, if present
Bram Moolenaar8d043172014-01-23 14:24:41 +010011632 let path = substitute(a:path,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaare6ae6222013-05-21 21:01:10 +020011633 " remove trailing slash (Win95)
11634 let path = substitute(path, '\(\\\|/\)$', '', 'g')
11635 " remove escaped spaces
11636 let path = substitute(path, '\ ', ' ', 'g')
11637 " convert slashes to backslashes
11638 let path = substitute(path, '/', '\', 'g')
11639 else
11640 let path= a:path
11641 endif
11642" call Dret("netrw#WinPath <".path.">")
11643 return path
11644endfun
11645
11646" ---------------------------------------------------------------------
Bram Moolenaar85850f32019-07-19 22:05:51 +020011647" s:NetrwBadd: adds marked files to buffer list or vice versa {{{2
11648" cb : bl2mf=0 add marked files to buffer list
11649" cB : bl2mf=1 use bufferlist to mark files
11650" (mnemonic: cb = copy (marked files) to buffer list)
11651fun! s:NetrwBadd(islocal,bl2mf)
11652" " call Dfunc("s:NetrwBadd(islocal=".a:islocal." mf2bl=".mf2bl.")")
11653 if a:bl2mf
11654 " cB: add buffer list to marked files
11655 redir => bufl
11656 ls
11657 redir END
11658 let bufl = map(split(bufl,"\n"),'substitute(v:val,''^.\{-}"\(.*\)".\{-}$'',''\1'','''')')
11659 for fname in bufl
11660 call s:NetrwMarkFile(a:islocal,fname)
11661 endfor
11662 else
11663 " cb: add marked files to buffer list
11664 for fname in s:netrwmarkfilelist_{bufnr("%")}
11665" " call Decho("badd ".fname,'~'.expand("<slnum>"))
11666 exe "badd ".fnameescape(fname)
11667 endfor
11668 let curbufnr = bufnr("%")
11669 let curdir = s:NetrwGetCurdir(a:islocal)
11670 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
11671 endif
11672" call Dret("s:NetrwBadd")
11673endfun
11674
11675" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011676" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
11677fun! s:ComposePath(base,subdir)
11678" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
11679
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011680 if has("amiga")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011681" call Decho("amiga",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010011682 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +000011683 if ec != '/' && ec != ':'
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011684 let ret = a:base."/" . a:subdir
Bram Moolenaarc236c162008-07-13 17:41:49 +000011685 else
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011686 let ret = a:base.a:subdir
Bram Moolenaarc236c162008-07-13 17:41:49 +000011687 endif
11688
Bram Moolenaar85850f32019-07-19 22:05:51 +020011689 " COMBAK: test on windows with changing to root directory: :e C:/
11690 elseif a:subdir =~ '^\a:[/\\]\([^/\\]\|$\)' && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011691" call Decho("windows",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011692 let ret= a:subdir
11693
Bram Moolenaar85850f32019-07-19 22:05:51 +020011694 elseif a:base =~ '^\a:[/\\]\([^/\\]\|$\)' && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011695" call Decho("windows",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010011696 if a:base =~ '[/\\]$'
11697 let ret= a:base.a:subdir
11698 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011699 let ret= a:base.'/'.a:subdir
Bram Moolenaar5c736222010-01-06 20:54:52 +010011700 endif
11701
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011702 elseif a:base =~ '^\a\{3,}://'
11703" call Decho("remote linux/macos",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011704 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
11705 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
11706 if a:subdir == '../'
11707 if curpath =~ '[^/]/[^/]\+/$'
11708 let curpath= substitute(curpath,'[^/]\+/$','','')
11709 else
11710 let curpath=""
11711 endif
11712 let ret= urlbase.curpath
11713 else
11714 let ret= urlbase.curpath.a:subdir
11715 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011716" call Decho("urlbase<".urlbase.">",'~'.expand("<slnum>"))
11717" call Decho("curpath<".curpath.">",'~'.expand("<slnum>"))
11718" call Decho("ret<".ret.">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011719
11720 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011721" call Decho("local linux/macos",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011722 let ret = substitute(a:base."/".a:subdir,"//","/","g")
11723 if a:base =~ '^//'
11724 " keeping initial '//' for the benefit of network share listing support
11725 let ret= '/'.ret
11726 endif
11727 let ret= simplify(ret)
11728 endif
11729
11730" call Dret("s:ComposePath ".ret)
11731 return ret
11732endfun
11733
11734" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011735" s:DeleteBookmark: deletes a file/directory from Netrw's bookmark system {{{2
11736" Related Functions: s:MakeBookmark() s:NetrwBookHistHandler() s:NetrwBookmark()
11737fun! s:DeleteBookmark(fname)
11738" call Dfunc("s:DeleteBookmark(fname<".a:fname.">)")
11739 call s:MergeBookmarks()
11740
11741 if exists("g:netrw_bookmarklist")
11742 let indx= index(g:netrw_bookmarklist,a:fname)
11743 if indx == -1
11744 let indx= 0
11745 while indx < len(g:netrw_bookmarklist)
11746 if g:netrw_bookmarklist[indx] =~ a:fname
11747 call remove(g:netrw_bookmarklist,indx)
11748 let indx= indx - 1
11749 endif
11750 let indx= indx + 1
11751 endwhile
11752 else
11753 " remove exact match
11754 call remove(g:netrw_bookmarklist,indx)
11755 endif
11756 endif
11757
11758" call Dret("s:DeleteBookmark")
11759endfun
11760
11761" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000011762" s:FileReadable: o/s independent filereadable {{{2
11763fun! s:FileReadable(fname)
11764" call Dfunc("s:FileReadable(fname<".a:fname.">)")
11765
11766 if g:netrw_cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011767 let ret= filereadable(s:NetrwFile(substitute(a:fname,g:netrw_cygdrive.'/\(.\)','\1:/','')))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011768 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011769 let ret= filereadable(s:NetrwFile(a:fname))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011770 endif
11771
11772" call Dret("s:FileReadable ".ret)
11773 return ret
11774endfun
11775
11776" ---------------------------------------------------------------------
11777" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
11778" Places correct suffix on end of temporary filename,
11779" using the suffix provided with fname
11780fun! s:GetTempfile(fname)
11781" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
11782
11783 if !exists("b:netrw_tmpfile")
11784 " get a brand new temporary filename
11785 let tmpfile= tempname()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011786" call Decho("tmpfile<".tmpfile."> : from tempname()",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011787
Bram Moolenaarc236c162008-07-13 17:41:49 +000011788 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011789" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011790
Bram Moolenaar9964e462007-05-05 17:54:07 +000011791 " sanity check -- does the temporary file's directory exist?
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011792 if !isdirectory(s:NetrwFile(substitute(tmpfile,'[^/]\+$','','e')))
11793" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011794 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +000011795" call Dret("s:GetTempfile getcwd<".getcwd().">")
11796 return ""
11797 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011798
Bram Moolenaar9964e462007-05-05 17:54:07 +000011799 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011800 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#BrowseX()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011801" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011802
Bram Moolenaar9964e462007-05-05 17:54:07 +000011803 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +000011804 if g:netrw_cygwin != 0
Bram Moolenaar8d043172014-01-23 14:24:41 +010011805 let tmpfile = substitute(tmpfile,'^\(\a\):',g:netrw_cygdrive.'/\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011806 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +000011807 if !exists("+shellslash") || !&ssl
11808 let tmpfile = substitute(tmpfile,'/','\','g')
11809 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011810 else
Bram Moolenaar446cb832008-06-24 21:56:24 +000011811 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +000011812 endif
11813 let b:netrw_tmpfile= tmpfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011814" call Decho("o/s dependent fixed tempname<".tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011815 else
11816 " re-use temporary filename
11817 let tmpfile= b:netrw_tmpfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011818" call Decho("tmpfile<".tmpfile."> re-using",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011819 endif
11820
11821 " use fname's suffix for the temporary file
11822 if a:fname != ""
11823 if a:fname =~ '\.[^./]\+$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011824" call Decho("using fname<".a:fname.">'s suffix",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020011825 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +000011826 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020011827 elseif a:fname =~ '.txz$'
11828 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011829 else
11830 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
11831 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011832" call Decho("suffix<".suffix.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011833 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011834" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011835 let tmpfile .= suffix
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011836" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011837 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
11838 endif
11839 endif
11840
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011841" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011842" call Dret("s:GetTempfile <".tmpfile.">")
11843 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +000011844endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +000011845
11846" ---------------------------------------------------------------------
11847" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +000011848" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +000011849fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011850" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar13600302014-05-22 18:26:40 +020011851 if s:user == ""
11852 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:machine,'')
11853 else
11854 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user."@".s:machine,'')
11855 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011856 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +000011857 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011858 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +000011859 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011860 else
11861 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
11862 endif
11863" call Dret("s:MakeSshCmd <".sshcmd.">")
11864 return sshcmd
11865endfun
11866
11867" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011868" s:MakeBookmark: enters a bookmark into Netrw's bookmark system {{{2
11869fun! s:MakeBookmark(fname)
11870" call Dfunc("s:MakeBookmark(fname<".a:fname.">)")
11871
11872 if !exists("g:netrw_bookmarklist")
11873 let g:netrw_bookmarklist= []
11874 endif
11875
11876 if index(g:netrw_bookmarklist,a:fname) == -1
11877 " curdir not currently in g:netrw_bookmarklist, so include it
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011878 if isdirectory(s:NetrwFile(a:fname)) && a:fname !~ '/$'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011879 call add(g:netrw_bookmarklist,a:fname.'/')
11880 elseif a:fname !~ '/'
11881 call add(g:netrw_bookmarklist,getcwd()."/".a:fname)
11882 else
11883 call add(g:netrw_bookmarklist,a:fname)
11884 endif
11885 call sort(g:netrw_bookmarklist)
11886 endif
11887
11888" call Dret("s:MakeBookmark")
11889endfun
11890
11891" ---------------------------------------------------------------------
11892" s:MergeBookmarks: merge current bookmarks with saved bookmarks {{{2
11893fun! s:MergeBookmarks()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011894" call Dfunc("s:MergeBookmarks() : merge current bookmarks into .netrwbook")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011895 " get bookmarks from .netrwbook file
11896 let savefile= s:NetrwHome()."/.netrwbook"
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011897 if filereadable(s:NetrwFile(savefile))
11898" call Decho("merge bookmarks (active and file)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011899 NetrwKeepj call s:NetrwBookHistSave()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011900" call Decho("bookmark delete savefile<".savefile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011901 NetrwKeepj call delete(savefile)
11902 endif
11903" call Dret("s:MergeBookmarks")
11904endfun
11905
11906" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011907" s:NetrwBMShow: {{{2
11908fun! s:NetrwBMShow()
11909" call Dfunc("s:NetrwBMShow()")
11910 redir => bmshowraw
11911 menu
11912 redir END
11913 let bmshowlist = split(bmshowraw,'\n')
11914 if bmshowlist != []
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011915 let bmshowfuncs= filter(bmshowlist,'v:val =~# "<SNR>\\d\\+_BMShow()"')
Bram Moolenaarc236c162008-07-13 17:41:49 +000011916 if bmshowfuncs != []
11917 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020011918 if bmshowfunc =~# '^call.*BMShow()'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011919 exe "sil! NetrwKeepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +000011920 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011921 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011922 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000011923" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
11924endfun
11925
11926" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +020011927" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011928fun! s:NetrwCursor(editfile)
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011929 if !exists("w:netrw_liststyle")
11930 let w:netrw_liststyle= g:netrw_liststyle
11931 endif
Bram Moolenaar15146672011-10-20 22:22:38 +020011932" 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 +020011933
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011934" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
11935
Bram Moolenaaradc21822011-04-01 18:03:16 +020011936 if &ft != "netrw"
11937 " if the current window isn't a netrw directory listing window, then use user cursorline/column
11938 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011939" call Decho("case ft!=netrw: use user cul,cuc",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011940
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011941 elseif g:netrw_cursor == 8
11942 if w:netrw_liststyle == s:WIDELIST
11943 setl cursorline
11944 setl cursorcolumn
11945 else
11946 setl cursorline
11947 endif
11948 elseif g:netrw_cursor == 7
11949 setl cursorline
11950 elseif g:netrw_cursor == 6
11951 if w:netrw_liststyle == s:WIDELIST
11952 setl cursorline
11953 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +020011954 elseif g:netrw_cursor == 4
11955 " all styles: cursorline, cursorcolumn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011956" call Decho("case g:netrw_cursor==4: setl cul cuc",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020011957 setl cursorline
11958 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +020011959
11960 elseif g:netrw_cursor == 3
11961 " thin-long-tree: cursorline, user's cursorcolumn
11962 " wide : cursorline, cursorcolumn
11963 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011964" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020011965 setl cursorline
11966 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +020011967 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011968" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020011969 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +020011970 endif
11971
11972 elseif g:netrw_cursor == 2
11973 " thin-long-tree: cursorline, user's cursorcolumn
11974 " wide : cursorline, user's cursorcolumn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011975" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020011976 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +020011977
11978 elseif g:netrw_cursor == 1
11979 " thin-long-tree: user's cursorline, user's cursorcolumn
11980 " wide : cursorline, user's cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +020011981 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011982" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +010011983 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +020011984 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011985" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011986 endif
11987
11988 else
Bram Moolenaaradc21822011-04-01 18:03:16 +020011989 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011990" call Decho("default: (use user's cul,cuc)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011991 let &l:cursorline = s:netrw_usercul
11992 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011993 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +020011994
Bram Moolenaar89a9c152021-08-29 21:55:35 +020011995" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
Bram Moolenaaradc21822011-04-01 18:03:16 +020011996" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011997endfun
11998
11999" ---------------------------------------------------------------------
12000" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
12001fun! s:RestoreCursorline()
Bram Moolenaar8d043172014-01-23 14:24:41 +010012002" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020012003 if exists("s:netrw_usercul")
12004 let &l:cursorline = s:netrw_usercul
12005 endif
12006 if exists("s:netrw_usercuc")
12007 let &l:cursorcolumn = s:netrw_usercuc
12008 endif
Bram Moolenaar89a9c152021-08-29 21:55:35 +020012009" call Decho("(s:RestoreCursorline) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
Bram Moolenaar00a927d2010-05-14 23:24:24 +020012010" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
12011endfun
12012
12013" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000012014" s:NetrwDelete: Deletes a file. {{{2
12015" Uses Steve Hall's idea to insure that Windows paths stay
12016" acceptable. No effect on Unix paths.
12017" Examples of use: let result= s:NetrwDelete(path)
12018fun! s:NetrwDelete(path)
12019" call Dfunc("s:NetrwDelete(path<".a:path.">)")
12020
Bram Moolenaar5c736222010-01-06 20:54:52 +010012021 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +000012022 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
12023 if exists("+shellslash")
12024 let sskeep= &shellslash
Bram Moolenaarff034192013-04-24 18:51:19 +020012025 setl noshellslash
Bram Moolenaarc236c162008-07-13 17:41:49 +000012026 let result = delete(path)
12027 let &shellslash = sskeep
12028 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012029" call Decho("exe let result= ".a:cmd."('".path."')",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000012030 let result= delete(path)
12031 endif
12032 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012033" call Decho("let result= delete(".path.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000012034 let result= delete(path)
12035 endif
12036 if result < 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012037 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +000012038 endif
12039
12040" call Dret("s:NetrwDelete ".result)
12041 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +000012042endfun
12043
12044" ---------------------------------------------------------------------
Bram Moolenaar89a9c152021-08-29 21:55:35 +020012045" s:NetrwBufRemover: removes a buffer that: {{{2s
12046" has buffer-id > 1
12047" is unlisted
12048" is unnamed
12049" does not appear in any window
12050fun! s:NetrwBufRemover(bufid)
12051" call Dfunc("s:NetrwBufRemover(".a:bufid.")")
12052" call Decho("buf#".a:bufid." ".((a:bufid > 1)? ">" : "≯")." must be >1 for removal","~".expand("<slnum>"))
12053" call Decho("buf#".a:bufid." is ".(buflisted(a:bufid)? "listed" : "unlisted"),"~".expand("<slnum>"))
12054" call Decho("buf#".a:bufid." has name <".bufname(a:bufid).">","~".expand("<slnum>"))
12055" call Decho("buf#".a:bufid." has winid#".bufwinid(a:bufid),"~".expand("<slnum>"))
12056
yasuda4dbb2662023-10-04 20:50:35 +020012057 if a:bufid > 1 && !buflisted(a:bufid) && bufloaded(a:bufid) && bufname(a:bufid) == "" && bufwinid(a:bufid) == -1
Bram Moolenaar89a9c152021-08-29 21:55:35 +020012058" call Decho("(s:NetrwBufRemover) removing buffer#".a:bufid,"~".expand("<slnum>"))
yasuda4dbb2662023-10-04 20:50:35 +020012059 exe "sil! bd! ".a:bufid
Bram Moolenaar89a9c152021-08-29 21:55:35 +020012060 endif
12061
12062" call Dret("s:NetrwBufRemover")
12063endfun
12064
12065" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000012066" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +010012067fun! s:NetrwEnew(...)
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020012068" call Dfunc("s:NetrwEnew() a:0=".a:0." win#".winnr()." winnr($)=".winnr("$")." bufnr($)=".bufnr("$")." expand(%)<".expand("%").">")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012069" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000012070
Bram Moolenaar89a9c152021-08-29 21:55:35 +020012071 " Clean out the last buffer:
12072 " Check if the last buffer has # > 1, is unlisted, is unnamed, and does not appear in a window
12073 " If so, delete it.
12074 call s:NetrwBufRemover(bufnr("$"))
12075
Bram Moolenaar446cb832008-06-24 21:56:24 +000012076 " grab a function-local-variable copy of buffer variables
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012077" call Decho("make function-local copy of netrw variables",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000012078 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
12079 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
12080 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
12081 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
12082 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
12083 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
12084 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
12085 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
12086 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
12087 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
12088 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
12089 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
12090 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
12091 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
12092 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
12093 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
12094
Bram Moolenaar85850f32019-07-19 22:05:51 +020012095 NetrwKeepj call s:NetrwOptionsRestore("w:")
Bram Moolenaar71badf92023-04-22 22:40:14 +010012096" call Decho("generate a buffer with NetrwKeepj enew!",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012097 " when tree listing uses file TreeListing... a new buffer is made.
12098 " Want the old buffer to be unlisted.
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012099 " COMBAK: this causes a problem, see P43
12100" setl nobl
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020012101 let netrw_keepdiff= &l:diff
Bram Moolenaar71badf92023-04-22 22:40:14 +010012102 call s:NetrwEditFile("enew!","","")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020012103 let &l:diff= netrw_keepdiff
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012104" call Decho("bufnr($)=".bufnr("$")."<".bufname(bufnr("$"))."> winnr($)=".winnr("$"),'~'.expand("<slnum>"))
Bram Moolenaar85850f32019-07-19 22:05:51 +020012105 NetrwKeepj call s:NetrwOptionsSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +000012106
Bram Moolenaar446cb832008-06-24 21:56:24 +000012107 " copy function-local-variables to buffer variable equivalents
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012108" call Decho("copy function-local variables back to buffer netrw variables",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000012109 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
12110 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
12111 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
12112 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
12113 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
12114 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
12115 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
12116 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
12117 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
12118 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
12119 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
12120 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
12121 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
12122 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
12123 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
12124 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
12125
Bram Moolenaar5c736222010-01-06 20:54:52 +010012126 if a:0 > 0
12127 let b:netrw_curdir= a:1
12128 if b:netrw_curdir =~ '/$'
12129 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012130 setl nobl
Bram Moolenaar5c736222010-01-06 20:54:52 +010012131 file NetrwTreeListing
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012132 setl nobl bt=nowrite bh=hide
Bram Moolenaaradc21822011-04-01 18:03:16 +020012133 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
12134 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +010012135 else
Bram Moolenaar85850f32019-07-19 22:05:51 +020012136 call s:NetrwBufRename(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +010012137 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000012138 endif
12139 endif
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020012140 if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
12141 let &l:bexpr = "netrw#BalloonHelp()"
12142 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000012143
Bram Moolenaar8d043172014-01-23 14:24:41 +010012144" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh." win#".winnr()." winnr($)#".winnr("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000012145endfun
12146
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012147" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012148" s:NetrwExe: executes a string using "!" {{{2
12149fun! s:NetrwExe(cmd)
Bram Moolenaar85850f32019-07-19 22:05:51 +020012150" call Dfunc("s:NetrwExe(a:cmd<".a:cmd.">)")
Bram Moolenaar71badf92023-04-22 22:40:14 +010012151 if has("win32") && &shell !~? 'cmd\|pwsh\|powershell' && !g:netrw_cygwin
Bram Moolenaar85850f32019-07-19 22:05:51 +020012152" call Decho("using win32:",expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012153 let savedShell=[&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash]
12154 set shell& shellcmdflag& shellxquote& shellxescape&
12155 set shellquote& shellpipe& shellredir& shellslash&
12156 exe a:cmd
12157 let [&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash] = savedShell
12158 else
Bram Moolenaar85850f32019-07-19 22:05:51 +020012159" call Decho("exe ".a:cmd,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012160 exe a:cmd
12161 endif
Bram Moolenaar29634562020-01-09 21:46:04 +010012162 if v:shell_error
12163 call netrw#ErrorMsg(s:WARNING,"shell signalled an error",106)
12164 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020012165" call Dret("s:NetrwExe : v:shell_error=".v:shell_error)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012166endfun
12167
12168" ---------------------------------------------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012169" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
12170fun! s:NetrwInsureWinVars()
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012171 if !exists("w:netrw_liststyle")
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012172" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012173 let curbuf = bufnr("%")
12174 let curwin = winnr()
12175 let iwin = 1
12176 while iwin <= winnr("$")
12177 exe iwin."wincmd w"
12178 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
12179 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
12180 let winvars= w:
12181 break
12182 endif
12183 let iwin= iwin + 1
12184 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +020012185 exe "keepalt ".curwin."wincmd w"
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012186 if exists("winvars")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012187" call Decho("copying w#".iwin." window variables to w#".curwin,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012188 for k in keys(winvars)
12189 let w:{k}= winvars[k]
12190 endfor
12191 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012192" call Dret("s:NetrwInsureWinVars win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012193 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012194endfun
12195
Bram Moolenaara6878372014-03-22 21:02:50 +010012196" ---------------------------------------------------------------------
12197" s:NetrwLcd: handles changing the (local) directory {{{2
Bram Moolenaar85850f32019-07-19 22:05:51 +020012198" Returns: 0=success
12199" -1=failed
Bram Moolenaara6878372014-03-22 21:02:50 +010012200fun! s:NetrwLcd(newdir)
12201" call Dfunc("s:NetrwLcd(newdir<".a:newdir.">)")
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020012202" call Decho("changing local directory",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010012203
Bram Moolenaar85850f32019-07-19 22:05:51 +020012204 let err472= 0
Bram Moolenaara6878372014-03-22 21:02:50 +010012205 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012206 exe 'NetrwKeepj sil lcd '.fnameescape(a:newdir)
Bram Moolenaara6878372014-03-22 21:02:50 +010012207 catch /^Vim\%((\a\+)\)\=:E344/
12208 " Vim's lcd fails with E344 when attempting to go above the 'root' of a Windows share.
12209 " Therefore, detect if a Windows share is present, and if E344 occurs, just settle at
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012210 " 'root' (ie. '\'). The share name may start with either backslashes ('\\Foo') or
Bram Moolenaara6878372014-03-22 21:02:50 +010012211 " forward slashes ('//Foo'), depending on whether backslashes have been converted to
12212 " forward slashes by earlier code; so check for both.
12213 if (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
12214 if a:newdir =~ '^\\\\\w\+' || a:newdir =~ '^//\w\+'
12215 let dirname = '\'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012216 exe 'NetrwKeepj sil lcd '.fnameescape(dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +010012217 endif
12218 endif
12219 catch /^Vim\%((\a\+)\)\=:E472/
Bram Moolenaar85850f32019-07-19 22:05:51 +020012220 let err472= 1
12221 endtry
12222
12223 if err472
Bram Moolenaara6878372014-03-22 21:02:50 +010012224 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".a:newdir."> (permissions?)",61)
12225 if exists("w:netrw_prvdir")
12226 let a:newdir= w:netrw_prvdir
12227 else
Bram Moolenaar85850f32019-07-19 22:05:51 +020012228 call s:NetrwOptionsRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012229" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +020012230 exe "setl ".g:netrw_bufsettings
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012231" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010012232 let a:newdir= dirname
Bram Moolenaara6878372014-03-22 21:02:50 +010012233 endif
Bram Moolenaar85850f32019-07-19 22:05:51 +020012234" call Dret("s:NetrwBrowse -1 : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
12235 return -1
12236 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010012237
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020012238" call Decho("getcwd <".getcwd().">")
12239" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar85850f32019-07-19 22:05:51 +020012240" call Dret("s:NetrwLcd 0")
12241 return 0
Bram Moolenaara6878372014-03-22 21:02:50 +010012242endfun
12243
Bram Moolenaar9964e462007-05-05 17:54:07 +000012244" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012245" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
12246" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
12247fun! s:NetrwSaveWordPosn()
12248" call Dfunc("NetrwSaveWordPosn()")
12249 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
12250" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
12251endfun
12252
12253" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012254" s:NetrwHumanReadable: takes a number and makes it "human readable" {{{2
12255" 1000 -> 1K, 1000000 -> 1M, 1000000000 -> 1G
12256fun! s:NetrwHumanReadable(sz)
12257" call Dfunc("s:NetrwHumanReadable(sz=".a:sz.") type=".type(a:sz)." style=".g:netrw_sizestyle )
12258
12259 if g:netrw_sizestyle == 'h'
12260 if a:sz >= 1000000000
12261 let sz = printf("%.1f",a:sz/1000000000.0)."g"
12262 elseif a:sz >= 10000000
12263 let sz = printf("%d",a:sz/1000000)."m"
12264 elseif a:sz >= 1000000
12265 let sz = printf("%.1f",a:sz/1000000.0)."m"
12266 elseif a:sz >= 10000
12267 let sz = printf("%d",a:sz/1000)."k"
12268 elseif a:sz >= 1000
12269 let sz = printf("%.1f",a:sz/1000.0)."k"
12270 else
12271 let sz= a:sz
12272 endif
12273
12274 elseif g:netrw_sizestyle == 'H'
12275 if a:sz >= 1073741824
12276 let sz = printf("%.1f",a:sz/1073741824.0)."G"
12277 elseif a:sz >= 10485760
12278 let sz = printf("%d",a:sz/1048576)."M"
12279 elseif a:sz >= 1048576
12280 let sz = printf("%.1f",a:sz/1048576.0)."M"
12281 elseif a:sz >= 10240
12282 let sz = printf("%d",a:sz/1024)."K"
12283 elseif a:sz >= 1024
12284 let sz = printf("%.1f",a:sz/1024.0)."K"
12285 else
12286 let sz= a:sz
12287 endif
12288
12289 else
12290 let sz= a:sz
12291 endif
12292
12293" call Dret("s:NetrwHumanReadable ".sz)
12294 return sz
12295endfun
12296
12297" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012298" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
12299" changed sorting, etc. Also see s:NetrwSaveWordPosn().
12300fun! s:NetrwRestoreWordPosn()
12301" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +020012302 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +000012303" call Dret("NetrwRestoreWordPosn")
12304endfun
12305
12306" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000012307" s:RestoreBufVars: {{{2
12308fun! s:RestoreBufVars()
12309" call Dfunc("s:RestoreBufVars()")
12310
12311 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
12312 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
12313 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
12314 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
12315 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
12316 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
12317
12318" call Dret("s:RestoreBufVars")
12319endfun
12320
12321" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000012322" s:RemotePathAnalysis: {{{2
12323fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +020012324" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +000012325
Bram Moolenaara6878372014-03-22 21:02:50 +010012326 " method :// user @ machine :port /path
Bram Moolenaar8d043172014-01-23 14:24:41 +010012327 let dirpat = '^\(\w\{-}\)://\(\(\w\+\)@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar9964e462007-05-05 17:54:07 +000012328 let s:method = substitute(a:dirname,dirpat,'\1','')
Bram Moolenaar8d043172014-01-23 14:24:41 +010012329 let s:user = substitute(a:dirname,dirpat,'\3','')
12330 let s:machine = substitute(a:dirname,dirpat,'\4','')
12331 let s:port = substitute(a:dirname,dirpat,'\5','')
12332 let s:path = substitute(a:dirname,dirpat,'\6','')
Bram Moolenaar13600302014-05-22 18:26:40 +020012333 let s:fname = substitute(s:path,'^.*/\ze.','','')
Bram Moolenaara6878372014-03-22 21:02:50 +010012334 if s:machine =~ '@'
12335 let dirpat = '^\(.*\)@\(.\{-}\)$'
12336 let s:user = s:user.'@'.substitute(s:machine,dirpat,'\1','')
12337 let s:machine = substitute(s:machine,dirpat,'\2','')
12338 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000012339
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012340" call Decho("set up s:method <".s:method .">",'~'.expand("<slnum>"))
12341" call Decho("set up s:user <".s:user .">",'~'.expand("<slnum>"))
12342" call Decho("set up s:machine<".s:machine.">",'~'.expand("<slnum>"))
12343" call Decho("set up s:port <".s:port.">",'~'.expand("<slnum>"))
12344" call Decho("set up s:path <".s:path .">",'~'.expand("<slnum>"))
12345" call Decho("set up s:fname <".s:fname .">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000012346
12347" call Dret("s:RemotePathAnalysis")
12348endfun
12349
12350" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000012351" s:RemoteSystem: runs a command on a remote host using ssh {{{2
12352" Returns status
12353" Runs system() on
12354" [cd REMOTEDIRPATH;] a:cmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012355" Note that it doesn't do s:ShellEscape(a:cmd)!
Bram Moolenaarc236c162008-07-13 17:41:49 +000012356fun! s:RemoteSystem(cmd)
12357" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
12358 if !executable(g:netrw_ssh_cmd)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012359 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
Bram Moolenaarc236c162008-07-13 17:41:49 +000012360 elseif !exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012361 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +000012362 else
12363 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
12364 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
12365 if remotedir != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012366 let cmd= cmd.' cd '.s:ShellEscape(remotedir).";"
Bram Moolenaarc236c162008-07-13 17:41:49 +000012367 else
12368 let cmd= cmd.' '
12369 endif
12370 let cmd= cmd.a:cmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012371" call Decho("call system(".cmd.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000012372 let ret= system(cmd)
12373 endif
12374" call Dret("s:RemoteSystem ".ret)
12375 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +000012376endfun
12377
12378" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012379" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +000012380fun! s:RestoreWinVars()
12381" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +000012382 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000012383 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
12384 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
12385 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
12386 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
12387 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
12388 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
12389 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
12390 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
12391 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
12392 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
12393 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
12394 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +000012395 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
12396 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000012397 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
12398 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
12399 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
12400" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +000012401endfun
12402
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012403" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012404" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
12405"
12406" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
12407" is true) and a command, :Rexplore, which call this function.
12408"
Bram Moolenaar85850f32019-07-19 22:05:51 +020012409" s:netrw_posn is set up by s:NetrwBrowseChgDir()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012410"
12411" s:rexposn_BUFNR used to save/restore cursor position
Bram Moolenaar446cb832008-06-24 21:56:24 +000012412fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +020012413 if exists("s:netrwdrag")
12414 return
12415 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012416" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir."> win#".winnr())
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012417" call Decho("currently in bufname<".bufname("%").">",'~'.expand("<slnum>"))
12418" call Decho("ft=".&ft." win#".winnr()." w:netrw_rexfile<".(exists("w:netrw_rexfile")? w:netrw_rexfile : 'n/a').">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010012419
12420 if &ft == "netrw" && exists("w:netrw_rexfile") && w:netrw_rexfile != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012421 " a :Rex while in a netrw buffer means: edit the file in w:netrw_rexfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012422" call Decho("in netrw buffer, will edit file<".w:netrw_rexfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012423 exe "NetrwKeepj e ".w:netrw_rexfile
Bram Moolenaara6878372014-03-22 21:02:50 +010012424 unlet w:netrw_rexfile
12425" call Dret("s:NetrwRexplore returning from netrw to buf#".bufnr("%")."<".bufname("%")."> (ft=".&ft.")")
Bram Moolenaar15146672011-10-20 22:22:38 +020012426 return
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012427" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012428" call Decho("treating as not-netrw-buffer: ft=".&ft.((&ft == "netrw")? " == netrw" : "!= netrw"),'~'.expand("<slnum>"))
12429" call Decho("treating as not-netrw-buffer: w:netrw_rexfile<".((exists("w:netrw_rexfile"))? w:netrw_rexfile : 'n/a').">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020012430 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010012431
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012432 " ---------------------------
12433 " :Rex issued while in a file
12434 " ---------------------------
12435
Bram Moolenaara6878372014-03-22 21:02:50 +010012436 " record current file so :Rex can return to it from netrw
12437 let w:netrw_rexfile= expand("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012438" call Decho("set w:netrw_rexfile<".w:netrw_rexfile."> (win#".winnr().")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010012439
12440 if !exists("w:netrw_rexlocal")
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012441" call Dret("s:NetrwRexplore w:netrw_rexlocal doesn't exist (".&ft." win#".winnr().")")
Bram Moolenaara6878372014-03-22 21:02:50 +010012442 return
12443 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012444" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020012445 if w:netrw_rexlocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012446 NetrwKeepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012447 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012448 NetrwKeepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +000012449 endif
Bram Moolenaar15146672011-10-20 22:22:38 +020012450 if exists("s:initbeval")
Bram Moolenaara6878372014-03-22 21:02:50 +010012451 setl beval
Bram Moolenaar15146672011-10-20 22:22:38 +020012452 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012453 if exists("s:rexposn_".bufnr("%"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012454" call Decho("restore posn, then unlet s:rexposn_".bufnr('%')."<".bufname("%").">",'~'.expand("<slnum>"))
12455 " restore position in directory listing
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012456" call Decho("restoring posn to s:rexposn_".bufnr('%')."<".string(s:rexposn_{bufnr('%')}).">",'~'.expand("<slnum>"))
12457 NetrwKeepj call winrestview(s:rexposn_{bufnr('%')})
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012458 if exists("s:rexposn_".bufnr('%'))
12459 unlet s:rexposn_{bufnr('%')}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012460 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +020012461 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012462" call Decho("s:rexposn_".bufnr('%')."<".bufname("%")."> doesn't exist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000012463 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010012464
Bram Moolenaar85850f32019-07-19 22:05:51 +020012465 if has("syntax") && exists("g:syntax_on") && g:syntax_on
12466 if exists("s:explore_match")
12467 exe "2match netrwMarkFile /".s:explore_match."/"
12468 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +010012469 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010012470
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012471" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010012472" call Dret("s:NetrwRexplore : ft=".&ft)
Bram Moolenaar446cb832008-06-24 21:56:24 +000012473endfun
12474
12475" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +010012476" s:SaveBufVars: save selected b: variables to s: variables {{{2
12477" use s:RestoreBufVars() to restore b: variables from s: variables
Bram Moolenaar9964e462007-05-05 17:54:07 +000012478fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +010012479" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000012480
12481 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
12482 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
12483 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
12484 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
12485 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
12486 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
12487
12488" call Dret("s:SaveBufVars")
12489endfun
12490
12491" ---------------------------------------------------------------------
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012492" s:SavePosn: saves position associated with current buffer into a dictionary {{{2
12493fun! s:SavePosn(posndict)
12494" call Dfunc("s:SavePosn(posndict) curbuf#".bufnr("%")."<".bufname("%").">")
12495
Bram Moolenaar85850f32019-07-19 22:05:51 +020012496 if !exists("a:posndict[bufnr('%')]")
12497 let a:posndict[bufnr("%")]= []
12498 endif
12499" call Decho("before push: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
12500 call add(a:posndict[bufnr("%")],winsaveview())
12501" call Decho("after push: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012502
12503" call Dret("s:SavePosn posndict")
12504 return a:posndict
12505endfun
12506
12507" ---------------------------------------------------------------------
12508" s:RestorePosn: restores position associated with current buffer using dictionary {{{2
12509fun! s:RestorePosn(posndict)
12510" call Dfunc("s:RestorePosn(posndict) curbuf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar85850f32019-07-19 22:05:51 +020012511 if exists("a:posndict")
12512 if has_key(a:posndict,bufnr("%"))
12513" call Decho("before pop: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
12514 let posnlen= len(a:posndict[bufnr("%")])
12515 if posnlen > 0
12516 let posnlen= posnlen - 1
12517" call Decho("restoring posn posndict[".bufnr("%")."][".posnlen."]=".string(a:posndict[bufnr("%")][posnlen]),'~'.expand("<slnum>"))
12518 call winrestview(a:posndict[bufnr("%")][posnlen])
12519 call remove(a:posndict[bufnr("%")],posnlen)
12520" call Decho("after pop: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
12521 endif
12522 endif
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012523 endif
12524" call Dret("s:RestorePosn")
12525endfun
12526
12527" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012528" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +000012529fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +010012530" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +000012531 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
12532 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
12533 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
12534 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
12535 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
12536 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
12537 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
12538 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
12539 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
12540 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
12541 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
12542 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
12543 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
12544 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
12545 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
12546 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
12547 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
12548 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
12549" call Dret("s:SaveWinVars")
12550endfun
12551
12552" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012553" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012554" To allow separate windows to have their own activities, such as
12555" Explore **/pattern, several variables have been made window-oriented.
12556" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +000012557" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012558" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +000012559fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +010012560" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +000012561 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
12562 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
12563 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
12564 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
12565 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
12566 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
12567 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
12568 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
12569 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
12570 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
12571" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012572endfun
12573
12574" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012575" s:SetRexDir: set directory for :Rexplore {{{2
12576fun! s:SetRexDir(islocal,dirname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012577" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">) win#".winnr())
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012578 let w:netrw_rexdir = a:dirname
12579 let w:netrw_rexlocal = a:islocal
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012580 let s:rexposn_{bufnr("%")} = winsaveview()
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012581" call Decho("setting w:netrw_rexdir =".w:netrw_rexdir,'~'.expand("<slnum>"))
12582" call Decho("setting w:netrw_rexlocal=".w:netrw_rexlocal,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012583" call Decho("saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012584" call Decho("setting s:rexposn_".bufnr("%")."<".bufname("%")."> to ".string(winsaveview()),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010012585" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000012586endfun
12587
12588" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012589" s:ShowLink: used to modify thin and tree listings to show links {{{2
12590fun! s:ShowLink()
12591" " call Dfunc("s:ShowLink()")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012592" " call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">",'~'.expand("<slnum>"))
12593" " call Decho(printf("line#%4d: %s",line("."),getline(".")),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012594 if exists("b:netrw_curdir")
12595 norm! $?\a
12596 let fname = b:netrw_curdir.'/'.s:NetrwGetWord()
12597 let resname = resolve(fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012598" " call Decho("fname <".fname.">",'~'.expand("<slnum>"))
12599" " call Decho("resname <".resname.">",'~'.expand("<slnum>"))
12600" " call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
12601 if resname =~ '^\M'.b:netrw_curdir.'/'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012602 let dirlen = strlen(b:netrw_curdir)
12603 let resname = strpart(resname,dirlen+1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012604" " call Decho("resname<".resname."> (b:netrw_curdir elided)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012605 endif
12606 let modline = getline(".")."\t --> ".resname
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012607" " call Decho("fname <".fname.">",'~'.expand("<slnum>"))
12608" " call Decho("modline<".modline.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012609 setl noro ma
12610 call setline(".",modline)
12611 setl ro noma nomod
12612 endif
12613" " call Dret("s:ShowLink".((exists("fname")? ' : '.fname : 'n/a')))
12614endfun
12615
12616" ---------------------------------------------------------------------
12617" s:ShowStyle: {{{2
12618fun! s:ShowStyle()
12619 if !exists("w:netrw_liststyle")
12620 let liststyle= g:netrw_liststyle
12621 else
12622 let liststyle= w:netrw_liststyle
12623 endif
12624 if liststyle == s:THINLIST
12625 return s:THINLIST.":thin"
12626 elseif liststyle == s:LONGLIST
12627 return s:LONGLIST.":long"
12628 elseif liststyle == s:WIDELIST
12629 return s:WIDELIST.":wide"
12630 elseif liststyle == s:TREELIST
12631 return s:TREELIST.":tree"
12632 else
12633 return 'n/a'
12634 endif
12635endfun
12636
12637" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +010012638" s:Strlen: this function returns the length of a string, even if its using multi-byte characters. {{{2
12639" Solution from Nicolai Weibull, vim docs (:help strlen()),
12640" Tony Mechelynck, and my own invention.
Bram Moolenaar446cb832008-06-24 21:56:24 +000012641fun! s:Strlen(x)
Bram Moolenaar8d043172014-01-23 14:24:41 +010012642" "" call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen.")")
12643
12644 if v:version >= 703 && exists("*strdisplaywidth")
12645 let ret= strdisplaywidth(a:x)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012646
Bram Moolenaar8d043172014-01-23 14:24:41 +010012647 elseif type(g:Align_xstrlen) == 1
12648 " allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc")
12649 exe "let ret= ".g:Align_xstrlen."('".substitute(a:x,"'","''","g")."')"
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012650
Bram Moolenaar8d043172014-01-23 14:24:41 +010012651 elseif g:Align_xstrlen == 1
Bram Moolenaar446cb832008-06-24 21:56:24 +000012652 " number of codepoints (Latin a + combining circumflex is two codepoints)
12653 " (comment from TM, solution from NW)
12654 let ret= strlen(substitute(a:x,'.','c','g'))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012655
Bram Moolenaar8d043172014-01-23 14:24:41 +010012656 elseif g:Align_xstrlen == 2
12657 " number of spacing codepoints (Latin a + combining circumflex is one spacing
Bram Moolenaar446cb832008-06-24 21:56:24 +000012658 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
12659 " (comment from TM, solution from TM)
Bram Moolenaar8d043172014-01-23 14:24:41 +010012660 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012661
Bram Moolenaar8d043172014-01-23 14:24:41 +010012662 elseif g:Align_xstrlen == 3
12663 " virtual length (counting, for instance, tabs as anything between 1 and
12664 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
Bram Moolenaar446cb832008-06-24 21:56:24 +000012665 " preceded by lam, one otherwise, etc.)
12666 " (comment from TM, solution from me)
Bram Moolenaar8d043172014-01-23 14:24:41 +010012667 let modkeep= &l:mod
12668 exe "norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +000012669 call setline(line("."),a:x)
12670 let ret= virtcol("$") - 1
Bram Moolenaar8d043172014-01-23 14:24:41 +010012671 d
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012672 NetrwKeepj norm! k
Bram Moolenaar8d043172014-01-23 14:24:41 +010012673 let &l:mod= modkeep
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012674
Bram Moolenaar446cb832008-06-24 21:56:24 +000012675 else
12676 " at least give a decent default
Bram Moolenaar8d043172014-01-23 14:24:41 +010012677 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +000012678 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010012679" "" call Dret("s:Strlen ".ret)
Bram Moolenaar446cb832008-06-24 21:56:24 +000012680 return ret
12681endfun
12682
12683" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012684" s:ShellEscape: shellescape(), or special windows handling {{{2
12685fun! s:ShellEscape(s, ...)
12686 if (has('win32') || has('win64')) && $SHELL == '' && &shellslash
12687 return printf('"%s"', substitute(a:s, '"', '""', 'g'))
12688 endif
12689 let f = a:0 > 0 ? a:1 : 0
12690 return shellescape(a:s, f)
12691endfun
12692
12693" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012694" s:TreeListMove: supports [[, ]], [], and ][ in tree mode {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +000012695fun! s:TreeListMove(dir)
12696" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012697 let curline = getline('.')
12698 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
12699 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
12700 let curindent = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
12701 let indentm1 = substitute(curindent,'^'.s:treedepthstring,'','')
12702 let treedepthchr = substitute(s:treedepthstring,' ','','g')
12703 let stopline = exists("w:netrw_bannercnt")? w:netrw_bannercnt : 1
12704" call Decho("prvline <".prvline."> #".(line(".")-1), '~'.expand("<slnum>"))
12705" call Decho("curline <".curline."> #".line(".") , '~'.expand("<slnum>"))
12706" call Decho("nxtline <".nxtline."> #".(line(".")+1), '~'.expand("<slnum>"))
12707" call Decho("curindent<".curindent.">" , '~'.expand("<slnum>"))
12708" call Decho("indentm1 <".indentm1.">" , '~'.expand("<slnum>"))
12709 " COMBAK : need to handle when on a directory
12710 " COMBAK : need to handle ]] and ][. In general, needs work!!!
Bram Moolenaar446cb832008-06-24 21:56:24 +000012711 if curline !~ '/$'
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012712 if a:dir == '[[' && prvline != ''
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012713 NetrwKeepj norm! 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012714 let nl = search('^'.indentm1.'\%('.s:treedepthstring.'\)\@!','bWe',stopline) " search backwards
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012715" call Decho("regfile srch back: ".nl,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012716 elseif a:dir == '[]' && nxtline != ''
12717 NetrwKeepj norm! 0
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +020012718" call Decho('srchpat<'.'^\%('.curindent.'\)\@!'.'>','~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010012719 let nl = search('^\%('.curindent.'\)\@!','We') " search forwards
12720 if nl != 0
12721 NetrwKeepj norm! k
12722 else
12723 NetrwKeepj norm! G
12724 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012725" call Decho("regfile srch fwd: ".nl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000012726 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000012727 endif
12728
12729" call Dret("s:TreeListMove")
12730endfun
12731
12732" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000012733" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
12734" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
12735" can't be called except via emenu. But due to locale, that menu line may not be called
12736" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
12737fun! s:UpdateBuffersMenu()
12738" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +020012739 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +000012740 try
Bram Moolenaaradc21822011-04-01 18:03:16 +020012741 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +000012742 catch /^Vim\%((\a\+)\)\=:E/
12743 let v:errmsg= ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010012744 sil NetrwKeepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +000012745 endtry
12746 endif
12747" call Dret("s:UpdateBuffersMenu")
12748endfun
12749
12750" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000012751" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +020012752" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012753fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +000012754" call Dfunc("s:UseBufWinVars()")
12755 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012756 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
12757 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
12758 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
12759 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
12760 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
12761 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
12762 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
12763 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
12764 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 +000012765" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012766endfun
12767
Bram Moolenaar1afcace2005-11-25 19:54:28 +000012768" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012769" s:UserMaps: supports user-defined UserMaps {{{2
12770" * calls a user-supplied funcref(islocal,curdir)
12771" * interprets result
12772" See netrw#UserMaps()
12773fun! s:UserMaps(islocal,funcname)
12774" call Dfunc("s:UserMaps(islocal=".a:islocal.",funcname<".a:funcname.">)")
12775
12776 if !exists("b:netrw_curdir")
12777 let b:netrw_curdir= getcwd()
12778 endif
12779 let Funcref = function(a:funcname)
12780 let result = Funcref(a:islocal)
12781
12782 if type(result) == 1
12783 " if result from user's funcref is a string...
12784" call Decho("result string from user funcref<".result.">",'~'.expand("<slnum>"))
12785 if result == "refresh"
12786" call Decho("refreshing display",'~'.expand("<slnum>"))
12787 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
12788 elseif result != ""
12789" call Decho("executing result<".result.">",'~'.expand("<slnum>"))
12790 exe result
12791 endif
12792
12793 elseif type(result) == 3
12794 " if result from user's funcref is a List...
12795" call Decho("result List from user funcref<".string(result).">",'~'.expand("<slnum>"))
12796 for action in result
12797 if action == "refresh"
12798" call Decho("refreshing display",'~'.expand("<slnum>"))
12799 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
12800 elseif action != ""
12801" call Decho("executing action<".action.">",'~'.expand("<slnum>"))
12802 exe action
12803 endif
12804 endfor
12805 endif
12806
12807" call Dret("s:UserMaps")
12808endfun
12809
Bram Moolenaar85850f32019-07-19 22:05:51 +020012810" ==========================
Bram Moolenaare6ae6222013-05-21 21:01:10 +020012811" Settings Restoration: {{{1
Bram Moolenaar85850f32019-07-19 22:05:51 +020012812" ==========================
Bram Moolenaar83bab712005-08-01 21:58:57 +000012813let &cpo= s:keepcpo
12814unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000012815
Bram Moolenaar85850f32019-07-19 22:05:51 +020012816" ===============
Bram Moolenaar83bab712005-08-01 21:58:57 +000012817" Modelines: {{{1
Bram Moolenaar85850f32019-07-19 22:05:51 +020012818" ===============
Bram Moolenaar071d4272004-06-13 20:20:40 +000012819" vim:ts=8 fdm=marker
Bram Moolenaar71badf92023-04-22 22:40:14 +010012820" doing autoload/netrw.vim version v172g ~57
12821" varname<g:netrw_dirhistcnt> value=0 ~1
12822" varname<s:THINLIST> value=0 ~1
12823" varname<s:LONGLIST> value=1 ~1
12824" varname<s:WIDELIST> value=2 ~1
12825" varname<s:TREELIST> value=3 ~1
12826" varname<s:MAXLIST> value=4 ~1
12827" varname<g:netrw_use_errorwindow> value=2 ~1
12828" varname<g:netrw_http_xcmd> value=-q -O ~1
12829" varname<g:netrw_http_put_cmd> value=curl -T ~1
12830" varname<g:netrw_keepj> value=keepj ~1
12831" varname<g:netrw_rcp_cmd> value=rcp ~1
12832" varname<g:netrw_rsync_cmd> value=rsync ~1
12833" varname<g:netrw_rsync_sep> value=/ ~1
12834" varname<g:netrw_scp_cmd> value=scp -q ~1
12835" varname<g:netrw_sftp_cmd> value=sftp ~1
12836" varname<g:netrw_ssh_cmd> value=ssh ~1
12837" varname<g:netrw_alto> value=0 ~1
12838" varname<g:netrw_altv> value=1 ~1
12839" varname<g:netrw_banner> value=1 ~1
12840" varname<g:netrw_browse_split> value=0 ~1
12841" varname<g:netrw_bufsettings> value=noma nomod nonu nobl nowrap ro nornu ~1
12842" varname<g:netrw_chgwin> value=-1 ~1
12843" varname<g:netrw_clipboard> value=1 ~1
12844" varname<g:netrw_compress> value=gzip ~1
12845" varname<g:netrw_ctags> value=ctags ~1
12846" varname<g:netrw_cursor> value=2 ~1
12847" (netrw) COMBAK: cuc=0 cul=0 initialization of s:netrw_cu[cl]
12848" varname<g:netrw_cygdrive> value=/cygdrive ~1
12849" varname<s:didstarstar> value=0 ~1
12850" varname<g:netrw_dirhistcnt> value=0 ~1
12851" varname<g:netrw_decompress> value={ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" } ~1
12852" varname<g:netrw_dirhistmax> value=10 ~1
12853" varname<g:netrw_errorlvl> value=0 ~1
12854" varname<g:netrw_fastbrowse> value=1 ~1
12855" varname<g:netrw_ftp_browse_reject> value=^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$ ~1
12856" varname<g:netrw_ftpmode> value=binary ~1
12857" varname<g:netrw_hide> value=1 ~1
12858" varname<g:netrw_keepdir> value=1 ~1
12859" varname<g:netrw_list_hide> value= ~1
12860" varname<g:netrw_localmkdir> value=mkdir ~1
12861" varname<g:netrw_remote_mkdir> value=mkdir ~1
12862" varname<g:netrw_liststyle> value=0 ~1
12863" varname<g:netrw_markfileesc> value=*./[\~ ~1
12864" varname<g:netrw_maxfilenamelen> value=32 ~1
12865" varname<g:netrw_menu> value=1 ~1
12866" varname<g:netrw_mkdir_cmd> value=ssh USEPORT HOSTNAME mkdir ~1
12867" varname<g:netrw_mousemaps> value=1 ~1
12868" varname<g:netrw_retmap> value=0 ~1
12869" varname<g:netrw_chgperm> value=chmod PERM FILENAME ~1
12870" varname<g:netrw_preview> value=0 ~1