blob: 64c08e98fac28dcb7c708f75f6c26c92c85b1ff6 [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 Moolenaare0fa3742016-02-20 15:47:01 +01003" Date: Feb 16, 2016
4" Version: 155 ASTRO-ONLY
Bram Moolenaarff034192013-04-24 18:51:19 +02005" Maintainer: Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-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 Moolenaara0f849e2015-10-30 14:37:44 +010016"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore(,'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +000017"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000018" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000019" (James 1:22 RSV)
20" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar9964e462007-05-05 17:54:07 +000021" Load Once: {{{1
Bram Moolenaar1afcace2005-11-25 19:54:28 +000022if &cp || exists("g:loaded_netrw")
23 finish
24endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010025" netrw requires vim having patch 213; netrw will benefit from vim's having patch#656, too
Bram Moolenaar13600302014-05-22 18:26:40 +020026if v:version < 704 || !has("patch213")
27 if !exists("s:needpatch213")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010028 unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch 213"
Bram Moolenaar13600302014-05-22 18:26:40 +020029 endif
30 let s:needpatch213= 1
31 finish
32endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010033let g:loaded_netrw = "v155"
Bram Moolenaar9964e462007-05-05 17:54:07 +000034if !exists("s:NOTE")
35 let s:NOTE = 0
36 let s:WARNING = 1
37 let s:ERROR = 2
38endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000039
Bram Moolenaar1afcace2005-11-25 19:54:28 +000040let s:keepcpo= &cpo
Bram Moolenaara6878372014-03-22 21:02:50 +010041setl cpo&vim
Bram Moolenaara0f849e2015-10-30 14:37:44 +010042"let g:dechofuncname= 1
Bram Moolenaar8d043172014-01-23 14:24:41 +010043"DechoRemOn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010044"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw,'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +000045
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000046" ======================
47" Netrw Variables: {{{1
48" ======================
49
Bram Moolenaar071d4272004-06-13 20:20:40 +000050" ---------------------------------------------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +020051" netrw#ErrorMsg: {{{2
52" 0=note = s:NOTE
53" 1=warning = s:WARNING
54" 2=error = s:ERROR
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010055" Usage: netrw#ErrorMsg(s:NOTE | s:WARNING | s:ERROR,"some message",error-number)
56" netrw#ErrorMsg(s:NOTE | s:WARNING | s:ERROR,["message1","message2",...],error-number)
57" (this function can optionally take a list of messages)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010058" Jan 19, 2016 : max errnum currently is 103
Bram Moolenaar5b435d62012-04-05 17:33:26 +020059fun! netrw#ErrorMsg(level,msg,errnum)
60" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
61
62 if a:level < g:netrw_errorlvl
Bram Moolenaare6ae6222013-05-21 21:01:10 +020063" call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl)
Bram Moolenaar5b435d62012-04-05 17:33:26 +020064 return
65 endif
66
67 if a:level == 1
68 let level= "**warning** (netrw) "
69 elseif a:level == 2
70 let level= "**error** (netrw) "
71 else
72 let level= "**note** (netrw) "
73 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010074" call Decho("level=".level,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020075
76 if g:netrw_use_errorwindow
77 " (default) netrw creates a one-line window to show error/warning
78 " messages (reliably displayed)
79
Bram Moolenaare0fa3742016-02-20 15:47:01 +010080 " record current window number
Bram Moolenaar5b435d62012-04-05 17:33:26 +020081 let s:winBeforeErr= winnr()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010082" call Decho("s:winBeforeErr=".s:winBeforeErr,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020083
84 " getting messages out reliably is just plain difficult!
85 " This attempt splits the current window, creating a one line window.
86 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010087" call Decho("write to NetrwMessage buffer",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020088 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaara0f849e2015-10-30 14:37:44 +010089" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020090 setl ma noro
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010091 if type(a:msg) == 3
92 for msg in a:msg
93 NetrwKeepj call setline(line("$")+1,level.msg)
94 endfor
95 else
96 NetrwKeepj call setline(line("$")+1,level.a:msg)
97 endif
98 NetrwKeepj $
Bram Moolenaar5b435d62012-04-05 17:33:26 +020099 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100100" call Decho("create a NetrwMessage buffer window",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200101 bo 1split
102 sil! call s:NetrwEnew()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100103 sil! NetrwKeepj call s:NetrwSafeOptions()
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200104 setl bt=nofile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100105 NetrwKeepj file NetrwMessage
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100106" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200107 setl ma noro
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100108 if type(a:msg) == 3
109 for msg in a:msg
110 NetrwKeepj call setline(line("$")+1,level.msg)
111 endfor
112 else
113 NetrwKeepj call setline(line("$"),level.a:msg)
114 endif
115 NetrwKeepj $
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200116 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100117" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200118 if &fo !~ '[ta]'
119 syn clear
120 syn match netrwMesgNote "^\*\*note\*\*"
121 syn match netrwMesgWarning "^\*\*warning\*\*"
122 syn match netrwMesgError "^\*\*error\*\*"
123 hi link netrwMesgWarning WarningMsg
124 hi link netrwMesgError Error
125 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100126" call Decho("setl noma ro bh=wipe",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +0200127 setl ro nomod noma bh=wipe
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200128
129 else
130 " (optional) netrw will show messages using echomsg. Even if the
131 " message doesn't appear, at least it'll be recallable via :messages
132" redraw!
133 if a:level == s:WARNING
134 echohl WarningMsg
135 elseif a:level == s:ERROR
136 echohl Error
137 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100138
139 if type(a:msg) == 3
140 for msg in a:msg
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100141 unsilent echomsg level.msg
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100142 endfor
143 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100144 unsilent echomsg level.a:msg
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100145 endif
146
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100147" call Decho("echomsg ***netrw*** ".a:msg,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200148 echohl None
149 endif
150
151" call Dret("netrw#ErrorMsg")
152endfun
153
154" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100155" s:NetrwInit: initializes variables if they haven't been defined {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100156" Loosely, varname = value.
157fun s:NetrwInit(varname,value)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100158" call Decho("varname<".a:varname."> value=".a:value,'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100159 if !exists(a:varname)
160 if type(a:value) == 0
161 exe "let ".a:varname."=".a:value
Bram Moolenaarff034192013-04-24 18:51:19 +0200162 elseif type(a:value) == 1 && a:value =~ '^[{[]'
163 exe "let ".a:varname."=".a:value
Bram Moolenaar5c736222010-01-06 20:54:52 +0100164 elseif type(a:value) == 1
165 exe "let ".a:varname."="."'".a:value."'"
166 else
167 exe "let ".a:varname."=".a:value
168 endif
169 endif
170endfun
171
172" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +0000173" Netrw Constants: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100174call s:NetrwInit("g:netrw_dirhist_cnt",0)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000175if !exists("s:LONGLIST")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100176 call s:NetrwInit("s:THINLIST",0)
177 call s:NetrwInit("s:LONGLIST",1)
178 call s:NetrwInit("s:WIDELIST",2)
179 call s:NetrwInit("s:TREELIST",3)
180 call s:NetrwInit("s:MAXLIST" ,4)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000181endif
182
183" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000184" Default values for netrw's global protocol variables {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +0200185call s:NetrwInit("g:netrw_use_errorwindow",1)
186
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000187if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100188 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000189 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100190 elseif executable("curl")
191 let g:netrw_dav_cmd = "curl"
192 else
193 let g:netrw_dav_cmd = ""
194 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000195endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000196if !exists("g:netrw_fetch_cmd")
197 if executable("fetch")
198 let g:netrw_fetch_cmd = "fetch -o"
199 else
200 let g:netrw_fetch_cmd = ""
201 endif
202endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100203if !exists("g:netrw_file_cmd")
204 if executable("elinks")
205 call s:NetrwInit("g:netrw_file_cmd","elinks")
206 elseif executable("links")
207 call s:NetrwInit("g:netrw_file_cmd","links")
208 endif
209endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000210if !exists("g:netrw_ftp_cmd")
211 let g:netrw_ftp_cmd = "ftp"
212endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200213let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200214if !exists("g:netrw_ftp_options")
215 let g:netrw_ftp_options= "-i -n"
216endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000217if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000218 if executable("elinks")
219 let g:netrw_http_cmd = "elinks"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100220 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000221 elseif executable("links")
222 let g:netrw_http_cmd = "links"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100223 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000224 elseif executable("curl")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100225 let g:netrw_http_cmd = "curl"
226 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000227 elseif executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100228 let g:netrw_http_cmd = "wget"
229 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000230 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100231 let g:netrw_http_cmd = "fetch"
232 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000233 else
234 let g:netrw_http_cmd = ""
235 endif
236endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100237call s:NetrwInit("g:netrw_http_put_cmd","curl -T")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100238call s:NetrwInit("g:netrw_keepj","keepj")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100239call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
240call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200241if !exists("g:netrw_scp_cmd")
242 if executable("scp")
243 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
244 elseif executable("pscp")
245 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk')
246 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk')
247 else
248 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q')
249 endif
250 else
251 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
252 endif
253endif
254
Bram Moolenaar5c736222010-01-06 20:54:52 +0100255call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
256call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000257
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000258if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000259 \ && exists("g:netrw_use_nt_rcp")
260 \ && g:netrw_use_nt_rcp
261 \ && executable( $SystemRoot .'/system32/rcp.exe')
262 let s:netrw_has_nt_rcp = 1
263 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000264else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000265 let s:netrw_has_nt_rcp = 0
266 let s:netrw_rcpmode = ''
267endif
268
269" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000270" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000271" Cygwin Detection ------- {{{3
272if !exists("g:netrw_cygwin")
273 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100274 if has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000275 let g:netrw_cygwin= 1
276 else
277 let g:netrw_cygwin= 0
278 endif
279 else
280 let g:netrw_cygwin= 0
281 endif
282endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000283" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100284call s:NetrwInit("g:netrw_alto" , &sb)
285call s:NetrwInit("g:netrw_altv" , &spr)
286call s:NetrwInit("g:netrw_banner" , 1)
287call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar13600302014-05-22 18:26:40 +0200288call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro nornu")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100289call s:NetrwInit("g:netrw_chgwin" , -1)
290call s:NetrwInit("g:netrw_compress" , "gzip")
291call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200292if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
293 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
294 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000295endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200296call s:NetrwInit("g:netrw_cursor" , 2)
297let s:netrw_usercul = &cursorline
298let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar8d043172014-01-23 14:24:41 +0100299call s:NetrwInit("g:netrw_cygdrive","/cygdrive")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000300" Default values - d-g ---------- {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +0200301call s:NetrwInit("s:didstarstar",0)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100302call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200303call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100304call s:NetrwInit("g:netrw_dirhistmax" , 10)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200305call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100306call s:NetrwInit("g:netrw_fastbrowse" , 1)
307call 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 +0000308if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000309 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
310 let g:netrw_ftp_list_cmd = "ls -lF"
311 let g:netrw_ftp_timelist_cmd = "ls -tlF"
312 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000313 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000314 let g:netrw_ftp_list_cmd = "dir"
315 let g:netrw_ftp_timelist_cmd = "dir"
316 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000317 endif
318endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100319call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000320" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100321call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000322if !exists("g:netrw_ignorenetrc")
323 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
324 let g:netrw_ignorenetrc= 1
325 else
326 let g:netrw_ignorenetrc= 0
327 endif
328endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100329call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000330if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000331 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000332 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200333 " provide a pscp-based listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000334 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
335 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100336 if exists("g:netrw_list_cmd_options")
337 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME: ".g:netrw_list_cmd_options
338 else
339 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
340 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000341 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200342 " provide a scp-based default listing command
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100343 if exists("g:netrw_list_cmd_options")
344 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa ".g:netrw_list_cmd_options
345 else
346 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
347 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000348 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100349" call Decho(g:netrw_ssh_cmd." is not executable",'~'.expand("<slnum>"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000350 let g:netrw_list_cmd= ""
351 endif
352endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100353call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000354" Default values - lh-lz ---------- {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200355if exists("g:netrw_local_copycmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200356 let g:netrw_localcopycmd= g:netrw_local_copycmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200357 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
358endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100359if !exists("g:netrw_localcmdshell")
360 let g:netrw_localcmdshell= ""
361endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000362if !exists("g:netrw_localcopycmd")
363 if has("win32") || has("win95") || has("win64") || has("win16")
364 if g:netrw_cygwin
365 let g:netrw_localcopycmd= "cp"
366 else
Bram Moolenaar13600302014-05-22 18:26:40 +0200367 let g:netrw_localcopycmd= expand("$COMSPEC")." /c copy"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000368 endif
369 elseif has("unix") || has("macunix")
370 let g:netrw_localcopycmd= "cp"
371 else
372 let g:netrw_localcopycmd= ""
373 endif
374endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100375if !exists("g:netrw_localcopydircmd")
376 if has("win32") || has("win95") || has("win64") || has("win16")
377 if g:netrw_cygwin
378 let g:netrw_localcopydircmd= "cp -R"
379 else
380 let g:netrw_localcopycmd= expand("$COMSPEC")." /c xcopy /e /c /h /i /k"
381 endif
382 elseif has("unix") || has("macunix")
383 let g:netrw_localcopydircmd= "cp -R"
384 else
385 let g:netrw_localcopycmd= ""
386 endif
387endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200388if exists("g:netrw_local_mkdir")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100389 let g:netrw_localmkdir= g:netrw_local_mkdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200390 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
391endif
Bram Moolenaar13600302014-05-22 18:26:40 +0200392if has("win32") || has("win95") || has("win64") || has("win16")
393 if g:netrw_cygwin
394 call s:NetrwInit("g:netrw_localmkdir","mkdir")
395 else
396 let g:netrw_localmkdir= expand("$COMSPEC")." /c mkdir"
397 endif
398else
399 call s:NetrwInit("g:netrw_localmkdir","mkdir")
400endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200401call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200402if exists("g:netrw_local_movecmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200403 let g:netrw_localmovecmd= g:netrw_local_movecmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200404 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
405endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000406if !exists("g:netrw_localmovecmd")
407 if has("win32") || has("win95") || has("win64") || has("win16")
408 if g:netrw_cygwin
409 let g:netrw_localmovecmd= "mv"
410 else
Bram Moolenaar13600302014-05-22 18:26:40 +0200411 let g:netrw_localmovecmd= expand("$COMSPEC")." /c move"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000412 endif
413 elseif has("unix") || has("macunix")
414 let g:netrw_localmovecmd= "mv"
415 else
416 let g:netrw_localmovecmd= ""
417 endif
418endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100419if v:version < 704 || !has("patch1109")
420 if exists("g:netrw_local_rmdir")
421 let g:netrw_localrmdir= g:netrw_local_rmdir
422 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
423 endif
424 if has("win32") || has("win95") || has("win64") || has("win16")
425 if g:netrw_cygwin
426 call s:NetrwInit("g:netrw_localrmdir","rmdir")
427 else
428 let g:netrw_localrmdir= expand("$COMSPEC")." /c rmdir"
429 endif
430 else
431 call s:NetrwInit("g:netrw_localrmdir","rmdir")
432 endif
Bram Moolenaar13600302014-05-22 18:26:40 +0200433endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100434call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
435" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000436if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000437 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000438endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000439if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000440 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
441endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000442" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100443call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
444call s:NetrwInit("g:netrw_maxfilenamelen", 32)
445call s:NetrwInit("g:netrw_menu" , 1)
446call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200447call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~ '[anh]'))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100448call s:NetrwInit("g:netrw_retmap" , 0)
449if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
450 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
451elseif has("win32") || has("win95") || has("win64") || has("win16")
452 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
453else
454 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000455endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100456call s:NetrwInit("g:netrw_preview" , 0)
457call s:NetrwInit("g:netrw_scpport" , "-P")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100458call s:NetrwInit("g:netrw_servername" , "NETRWSERVER")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100459call s:NetrwInit("g:netrw_sshport" , "-p")
460call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
461call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
462call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
Bram Moolenaara6878372014-03-22 21:02:50 +0100463call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f ")
464" Default values - q-s ---------- {{{3
465call s:NetrwInit("g:netrw_quickhelp",0)
466let s:QuickHelp= ["-:go up dir D:delete R:rename s:sort-by x:special",
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100467 \ "(create new) %:file d:directory",
468 \ "(windows split&open) o:horz v:vert p:preview",
469 \ "i:style qf:file info O:obtain r:reverse",
470 \ "(marks) mf:mark file mt:set target mm:move mc:copy",
471 \ "(bookmarks) mb:make mB:delete qb:list gb:go to",
472 \ "(history) qb:list u:go up U:go down",
473 \ "(targets) mt:target Tb:use bookmark Th:use history"]
Bram Moolenaar5c736222010-01-06 20:54:52 +0100474" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
475call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100476if !exists("g:netrw_keepj") || g:netrw_keepj == "keepj"
477 call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
478else
479 call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil " : " ")
480endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100481call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
482call s:NetrwInit("g:netrw_sort_options" , "")
483call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000484if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100485 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200486 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100487 else
488 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000489 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000490endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100491call s:NetrwInit("g:netrw_special_syntax" , 0)
492call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
Bram Moolenaara6878372014-03-22 21:02:50 +0100493call s:NetrwInit("g:netrw_use_noswf" , 1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100494call s:NetrwInit("g:netrw_sizestyle" ,"b")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000495" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100496call s:NetrwInit("g:netrw_timefmt","%c")
Bram Moolenaarff034192013-04-24 18:51:19 +0200497if !exists("g:netrw_xstrlen")
498 if exists("g:Align_xstrlen")
499 let g:netrw_xstrlen= g:Align_xstrlen
500 elseif exists("g:drawit_xstrlen")
501 let g:netrw_xstrlen= g:drawit_xstrlen
502 elseif &enc == "latin1" || !has("multi_byte")
503 let g:netrw_xstrlen= 0
504 else
505 let g:netrw_xstrlen= 1
506 endif
507endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100508call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100509call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200510call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100511call s:NetrwInit("g:netrw_wiw",1)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200512if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000513" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000514" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100515call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200516if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarff034192013-04-24 18:51:19 +0200517 call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200518else
Bram Moolenaarff034192013-04-24 18:51:19 +0200519 call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200520endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200521call s:NetrwInit("g:netrw_menu_escape",'.&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100522call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
523call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaara6878372014-03-22 21:02:50 +0100524if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4')
Bram Moolenaar8d043172014-01-23 14:24:41 +0100525 let s:treedepthstring= "│ "
526else
527 let s:treedepthstring= "| "
528endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000529
530" BufEnter event ignored by decho when following variable is true
531" Has a side effect that doau BufReadPost doesn't work, so
532" files read by network transfer aren't appropriately highlighted.
533"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000534
Bram Moolenaaradc21822011-04-01 18:03:16 +0200535" ======================
536" Netrw Initialization: {{{1
537" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200538if 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 +0100539" call Decho("installed beval events",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100540 let &l:bexpr = "netrw#BalloonHelp()"
541 au FileType netrw setl beval
Bram Moolenaar8d043172014-01-23 14:24:41 +0100542 au WinLeave * if &ft == "netrw" && exists("s:initbeval")|let &beval= s:initbeval|endif
543 au VimEnter * let s:initbeval= &beval
544"else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100545" if v:version < 700 | call Decho("did not install beval events: v:version=".v:version." < 700","~".expand("<slnum>")) | endif
546" if !has("balloon_eval") | call Decho("did not install beval events: does not have balloon_eval","~".expand("<slnum>")) | endif
547" if exists("s:initbeval") | call Decho("did not install beval events: s:initbeval exists","~".expand("<slnum>")) | endif
548" if exists("g:netrw_nobeval") | call Decho("did not install beval events: g:netrw_nobeval exists","~".expand("<slnum>")) | endif
549" if !has("syntax") | call Decho("did not install beval events: does not have syntax highlighting","~".expand("<slnum>")) | endif
550" 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 +0200551endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200552au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200553
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100554if g:netrw_keepj =~ "keepj"
555 com! -nargs=* NetrwKeepj keepj <args>
556else
557 let g:netrw_keepj= ""
558 com! -nargs=* NetrwKeepj <args>
559endif
560
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000561" ==============================
562" Netrw Utility Functions: {{{1
563" ==============================
564
Bram Moolenaaradc21822011-04-01 18:03:16 +0200565" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +0100566" netrw#BalloonHelp: {{{2
Bram Moolenaar8d043172014-01-23 14:24:41 +0100567if v:version >= 700 && has("balloon_eval") && has("syntax") && exists("g:syntax_on") && !exists("g:netrw_nobeval")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100568" call Decho("loading netrw#BalloonHelp()",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100569 fun! netrw#BalloonHelp()
Bram Moolenaar8d043172014-01-23 14:24:41 +0100570 if &ft != "netrw"
571 return ""
572 endif
573 if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
574 let mesg= ""
575 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
576 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
577 elseif getline(v:beval_lnum) =~ '^"\s*/'
578 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
579 elseif v:beval_text == "Sorted" || v:beval_text == "by"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100580 let mesg = 's: sort by name, time, file size, extension r: reverse sorting order mt: mark target'
Bram Moolenaar8d043172014-01-23 14:24:41 +0100581 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
582 let mesg = "S: edit sorting sequence"
583 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
584 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
585 elseif v:beval_text == "Quick" || v:beval_text == "Help"
586 let mesg = "Help: press <F1>"
587 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
588 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
589 else
590 let mesg= ""
591 endif
592 return mesg
593 endfun
594"else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100595" if v:version < 700 |call Decho("did not load netrw#BalloonHelp(): vim version ".v:version." < 700 -","~".expand("<slnum>"))|endif
596" if !has("balloon_eval") |call Decho("did not load netrw#BalloonHelp(): does not have balloon eval","~".expand("<slnum>")) |endif
597" if !has("syntax") |call Decho("did not load netrw#BalloonHelp(): syntax disabled","~".expand("<slnum>")) |endif
598" if !exists("g:syntax_on") |call Decho("did not load netrw#BalloonHelp(): g:syntax_on n/a","~".expand("<slnum>")) |endif
599" 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 +0200600endif
601
Bram Moolenaar071d4272004-06-13 20:20:40 +0000602" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200603" netrw#Explore: launch the local browser in the directory of the current file {{{2
604" indx: == -1: Nexplore
605" == -2: Pexplore
606" == +: this is overloaded:
607" * If Nexplore/Pexplore is in use, then this refers to the
608" indx'th item in the w:netrw_explore_list[] of items which
609" matched the */pattern **/pattern *//pattern **//pattern
610" * If Hexplore or Vexplore, then this will override
611" g:netrw_winsize to specify the qty of rows or columns the
612" newly split window should have.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100613" 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 +0200614" dosplit==1: the window will be split before running the local browser
615" style == 0: Explore style == 1: Explore!
616" == 2: Hexplore style == 3: Hexplore!
617" == 4: Vexplore style == 5: Vexplore!
618" == 6: Texplore
619fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100620" 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 +0100621" 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 +0200622 if !exists("b:netrw_curdir")
623 let b:netrw_curdir= getcwd()
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100624" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200625 endif
Bram Moolenaara6878372014-03-22 21:02:50 +0100626
627 " record current file for Rexplore's benefit
628 if &ft != "netrw"
629 let w:netrw_rexfile= expand("%:p")
630 endif
631
632 " record current directory
Bram Moolenaarff034192013-04-24 18:51:19 +0200633 let curdir = simplify(b:netrw_curdir)
634 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200635 if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
636 let curdir= substitute(curdir,'\','/','g')
637 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100638" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100639
640 " using completion, directories with spaces in their names (thanks, Bill Gates, for a truly dumb idea)
641 " will end up with backslashes here. Solution: strip off backslashes that precede white space and
642 " try Explore again.
643 if a:0 > 0
644" call Decho('considering retry: a:1<'.a:1.'>: '.
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100645 \ ((a:1 =~ "\\\s")? 'has backslash whitespace' : 'does not have backslash whitespace').', '.
646 \ ((filereadable(s:NetrwFile(a:1)))? 'is readable' : 'is not readable').', '.
647 \ ((isdirectory(s:NetrwFile(a:1))))? 'is a directory' : 'is not a directory',
648 \ '~'.expand("<slnum>"))
649 if a:1 =~ "\\\s" && !filereadable(s:NetrwFile(a:1)) && !isdirectory(s:NetrwFile(a:1))
650" call Decho("re-trying Explore with <".substitute(a:1,'\\\(\s\)','\1','g').">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100651 call netrw#Explore(a:indx,a:dosplit,a:style,substitute(a:1,'\\\(\s\)','\1','g'))
652" call Dret("netrw#Explore : returning from retry")
653 return
654" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100655" call Decho("retry not needed",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +0100656 endif
657 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200658
659 " save registers
Bram Moolenaara6878372014-03-22 21:02:50 +0100660 if has("clipboard")
661 sil! let keepregstar = @*
662 sil! let keepregplus = @+
663 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200664 sil! let keepregslash= @/
665
Bram Moolenaar8d043172014-01-23 14:24:41 +0100666 " if dosplit
667 " -or- file has been modified AND file not hidden when abandoned
668 " -or- Texplore used
669 if a:dosplit || (&modified && &hidden == 0 && &bufhidden != "hide") || a:style == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100670" 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 +0200671 call s:SaveWinVars()
672 let winsz= g:netrw_winsize
673 if a:indx > 0
674 let winsz= a:indx
675 endif
676
677 if a:style == 0 " Explore, Sexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100678" call Decho("style=0: Explore or Sexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200679 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200680 if winsz == 0|let winsz= ""|endif
681 exe "noswapfile ".winsz."wincmd s"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100682" call Decho("exe noswapfile ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200683
684 elseif a:style == 1 "Explore!, Sexplore!
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100685" call Decho("style=1: Explore! or Sexplore!",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200686 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200687 if winsz == 0|let winsz= ""|endif
688 exe "keepalt noswapfile ".winsz."wincmd v"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100689" call Decho("exe keepalt noswapfile ".winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200690
691 elseif a:style == 2 " Hexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100692" call Decho("style=2: Hexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200693 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200694 if winsz == 0|let winsz= ""|endif
695 exe "keepalt noswapfile bel ".winsz."wincmd s"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100696" call Decho("exe keepalt noswapfile bel ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200697
698 elseif a:style == 3 " Hexplore!
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100699" call Decho("style=3: Hexplore!",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200700 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200701 if winsz == 0|let winsz= ""|endif
702 exe "keepalt noswapfile abo ".winsz."wincmd s"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100703" call Decho("exe keepalt noswapfile abo ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200704
705 elseif a:style == 4 " Vexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100706" call Decho("style=4: Vexplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200707 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200708 if winsz == 0|let winsz= ""|endif
709 exe "keepalt noswapfile lefta ".winsz."wincmd v"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100710" call Decho("exe keepalt noswapfile lefta ".winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200711
712 elseif a:style == 5 " Vexplore!
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100713" call Decho("style=5: Vexplore!",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200714 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar13600302014-05-22 18:26:40 +0200715 if winsz == 0|let winsz= ""|endif
716 exe "keepalt noswapfile rightb ".winsz."wincmd v"
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100717" call Decho("exe keepalt noswapfile rightb ".winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200718
719 elseif a:style == 6 " Texplore
720 call s:SaveBufVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100721" call Decho("style = 6: Texplore",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200722 exe "keepalt tabnew ".fnameescape(curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100723" call Decho("exe keepalt tabnew ".fnameescape(curdir),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200724 call s:RestoreBufVars()
725 endif
726 call s:RestoreWinVars()
727" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100728" 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 +0200729 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100730 NetrwKeepj norm! 0
Bram Moolenaarff034192013-04-24 18:51:19 +0200731
732 if a:0 > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100733" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200734 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100735" call Decho("..case a:1<".a:1.">: starts with ~ and unix or cygwin",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200736 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100737" call Decho("..using dirname<".dirname."> (case: ~ && unix||cygwin)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200738 elseif a:1 == '.'
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100739" call Decho("..case a:1<".a:1.">: matches .",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200740 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
741 if dirname !~ '/$'
742 let dirname= dirname."/"
743 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100744" call Decho("..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200745 elseif a:1 =~ '\$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100746" call Decho("..case a:1<".a:1.">: matches ending $",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200747 let dirname= simplify(expand(a:1))
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100748" call Decho("..using user-specified dirname<".dirname."> with $env-var",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200749 elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://'
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100750" call Decho("..case a:1<".a:1.">: other, not pattern or filepattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200751 let dirname= simplify(a:1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100752" call Decho("..using user-specified dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200753 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100754" call Decho("..case a:1: pattern or filepattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200755 let dirname= a:1
756 endif
757 else
758 " clear explore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100759" call Decho("case a:0=".a:0.": clearing Explore list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200760 call s:NetrwClearExplore()
761" call Dret("netrw#Explore : cleared list")
762 return
763 endif
764
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100765" call Decho("dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200766 if dirname =~ '\.\./\=$'
767 let dirname= simplify(fnamemodify(dirname,':p:h'))
768 elseif dirname =~ '\.\.' || dirname == '.'
769 let dirname= simplify(fnamemodify(dirname,':p'))
770 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100771" call Decho("dirname<".dirname."> (after simplify)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200772
773 if dirname =~ '^\*//'
774 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100775" call Decho("case starpat=1: Explore *//pattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200776 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
777 let starpat= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100778" call Decho("..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200779 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
780
781 elseif dirname =~ '^\*\*//'
782 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100783" call Decho("case starpat=2: Explore **//pattern",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200784 let pattern= substitute(dirname,'^\*\*//','','')
785 let starpat= 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100786" call Decho("..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200787
788 elseif dirname =~ '/\*\*/'
789 " handle .../**/.../filepat
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100790" call Decho("case starpat=4: Explore .../**/.../filepat",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200791 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
792 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
793 let b:netrw_curdir = prefixdir
794 else
795 let b:netrw_curdir= getcwd().'/'.prefixdir
796 endif
797 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
798 let starpat= 4
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100799" call Decho("..pwd<".getcwd()."> dirname<".dirname.">",'~'.expand("<slnum>"))
800" call Decho("..case Explore ../**/../filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200801
802 elseif dirname =~ '^\*/'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200803 " case starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaarff034192013-04-24 18:51:19 +0200804 let starpat= 3
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100805" call Decho("case starpat=3: Explore */filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200806
807 elseif dirname=~ '^\*\*/'
808 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
809 let starpat= 4
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100810" call Decho("case starpat=4: Explore **/filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200811
812 else
813 let starpat= 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100814" call Decho("case starpat=0: default",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200815 endif
816
817 if starpat == 0 && a:indx >= 0
818 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100819" 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 +0200820 if dirname == ""
821 let dirname= curfiledir
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100822" call Decho("..empty dirname, using current file's directory<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200823 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200824 if dirname =~ '^scp://' || dirname =~ '^ftp://'
825 call netrw#Nread(2,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200826 else
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200827 if dirname == ""
828 let dirname= getcwd()
829 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100830 " Windows : check for a drive specifier, or else for a remote share name ('\\Foo' or '//Foo',
Bram Moolenaara6878372014-03-22 21:02:50 +0100831 " depending on whether backslashes have been converted to forward slashes by earlier code).
832 if dirname !~ '^[a-zA-Z]:' && dirname !~ '^\\\\\w\+' && dirname !~ '^//\w\+'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200833 let dirname= b:netrw_curdir."/".dirname
834 endif
835 elseif dirname !~ '^/'
836 let dirname= b:netrw_curdir."/".dirname
837 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100838" call Decho("..calling LocalBrowseCheck(dirname<".dirname.">)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200839 call netrw#LocalBrowseCheck(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100840" call Decho(" modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
841" 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 +0200842 endif
843 if exists("w:netrw_bannercnt")
844 " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
845 " If one wants to return the same place in the netrw window, use :Rex instead.
846 exe w:netrw_bannercnt
847 endif
848
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100849" call Decho("curdir<".curdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200850 " ---------------------------------------------------------------------
851 " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest
852" if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100853" NetrwKeepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaarff034192013-04-24 18:51:19 +0200854" else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100855" NetrwKeepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaarff034192013-04-24 18:51:19 +0200856" endif
857 " ---------------------------------------------------------------------
858
859 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
860 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
861 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
862 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
863 elseif a:indx <= 0
864 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100865" 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 +0200866 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100867" call Decho("..set up <s-up> and <s-down> maps",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200868 let s:didstarstar= 1
869 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
870 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
871 endif
872
873 if has("path_extra")
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100874" call Decho("..starpat=".starpat.": has +path_extra",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200875 if !exists("w:netrw_explore_indx")
876 let w:netrw_explore_indx= 0
877 endif
878
879 let indx = a:indx
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100880" call Decho("..starpat=".starpat.": set indx= [a:indx=".indx."]",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200881
882 if indx == -1
883 " Nexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100884" call Decho("..case Nexplore with starpat=".starpat.": (indx=".indx.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200885 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100886 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
Bram Moolenaara6878372014-03-22 21:02:50 +0100887 if has("clipboard")
888 sil! let @* = keepregstar
889 sil! let @+ = keepregstar
890 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200891 sil! let @/ = keepregslash
892" call Dret("netrw#Explore")
893 return
894 endif
895 let indx= w:netrw_explore_indx
896 if indx < 0 | let indx= 0 | endif
897 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
898 let curfile= w:netrw_explore_list[indx]
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100899" call Decho("....indx=".indx." curfile<".curfile.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200900 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
901 let indx= indx + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100902" call Decho("....indx=".indx." (Nexplore while loop)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200903 endwhile
904 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100905" call Decho("....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200906
907 elseif indx == -2
908 " Pexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100909" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200910 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100911 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
Bram Moolenaara6878372014-03-22 21:02:50 +0100912 if has("clipboard")
913 sil! let @* = keepregstar
914 sil! let @+ = keepregstar
915 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200916 sil! let @/ = keepregslash
917" call Dret("netrw#Explore")
918 return
919 endif
920 let indx= w:netrw_explore_indx
921 if indx < 0 | let indx= 0 | endif
922 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
923 let curfile= w:netrw_explore_list[indx]
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100924" call Decho("....indx=".indx." curfile<".curfile.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200925 while indx >= 0 && curfile == w:netrw_explore_list[indx]
926 let indx= indx - 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100927" call Decho("....indx=".indx." (Pexplore while loop)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200928 endwhile
929 if indx < 0 | let indx= 0 | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100930" call Decho("....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200931
932 else
933 " Explore -- initialize
934 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100935" call Decho("..starpat=".starpat.": case Explore: initialize (indx=".indx.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100936 NetrwKeepj keepalt call s:NetrwClearExplore()
Bram Moolenaarff034192013-04-24 18:51:19 +0200937 let w:netrw_explore_indx= 0
938 if !exists("b:netrw_curdir")
939 let b:netrw_curdir= getcwd()
940 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100941" call Decho("....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200942
943 " switch on starpat to build the w:netrw_explore_list of files
944 if starpat == 1
945 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100946" call Decho("..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls,'~'.expand("<slnum>"))
947" call Decho("....pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200948 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100949 exe "NetrwKeepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaarff034192013-04-24 18:51:19 +0200950 catch /^Vim\%((\a\+)\)\=:E480/
951 keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
952" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
953 return
954 endtry
955 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
956 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
957
958 elseif starpat == 2
959 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100960" call Decho("..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)",'~'.expand("<slnum>"))
961" call Decho("....pattern<".pattern.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200962 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +0100963 exe "sil NetrwKeepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
Bram Moolenaarff034192013-04-24 18:51:19 +0200964 catch /^Vim\%((\a\+)\)\=:E480/
965 keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
966 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaara6878372014-03-22 21:02:50 +0100967 if has("clipboard")
968 sil! let @* = keepregstar
969 sil! let @+ = keepregstar
970 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200971 sil! let @/ = keepregslash
972" call Dret("netrw#Explore : no files matched pattern")
973 return
974 endtry
975 let s:netrw_curdir = b:netrw_curdir
976 let w:netrw_explore_list = getqflist()
977 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
978 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
979
980 elseif starpat == 3
981 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100982" 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 +0200983 let filepat= substitute(dirname,'^\*/','','')
984 let filepat= substitute(filepat,'^[%#<]','\\&','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100985" call Decho("....b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
986" call Decho("....filepat<".filepat.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +0200987 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
988 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
989
990 elseif starpat == 4
991 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100992" 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 +0200993 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
994 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
995 endif " switch on starpat to build w:netrw_explore_list
996
997 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaara0f849e2015-10-30 14:37:44 +0100998" call Decho("....w:netrw_explore_list<".string(w:netrw_explore_list).">",'~'.expand("<slnum>"))
999" call Decho("....w:netrw_explore_listlen=".w:netrw_explore_listlen,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001000
1001 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001002 keepalt NetrwKeepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaara6878372014-03-22 21:02:50 +01001003 if has("clipboard")
1004 sil! let @* = keepregstar
1005 sil! let @+ = keepregstar
1006 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001007 sil! let @/ = keepregslash
1008" call Dret("netrw#Explore : no files matched")
1009 return
1010 endif
1011 endif " if indx ... endif
1012
1013 " NetrwStatusLine support - for exploring support
1014 let w:netrw_explore_indx= indx
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001015" 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 +02001016
1017 " wrap the indx around, but issue a note
1018 if indx >= w:netrw_explore_listlen || indx < 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001019" call Decho("....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001020 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
1021 let w:netrw_explore_indx= indx
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001022 keepalt NetrwKeepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaarff034192013-04-24 18:51:19 +02001023 endif
1024
1025 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001026" call Decho("....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001027 let newdir= substitute(dirfile,'/[^/]*$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001028" call Decho("....newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001029
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001030" call Decho("....calling LocalBrowseCheck(newdir<".newdir.">)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001031 call netrw#LocalBrowseCheck(newdir)
1032 if !exists("w:netrw_liststyle")
1033 let w:netrw_liststyle= g:netrw_liststyle
1034 endif
1035 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001036 keepalt NetrwKeepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaarff034192013-04-24 18:51:19 +02001037 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001038 keepalt NetrwKeepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaarff034192013-04-24 18:51:19 +02001039 endif
1040 let w:netrw_explore_mtchcnt = indx + 1
1041 let w:netrw_explore_bufnr = bufnr("%")
1042 let w:netrw_explore_line = line(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001043 keepalt NetrwKeepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001044" 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 +02001045
1046 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001047" call Decho("..your vim does not have +path_extra",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001048 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001049 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 +02001050 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001051 if has("clipboard")
1052 sil! let @* = keepregstar
1053 sil! let @+ = keepregstar
1054 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001055 sil! let @/ = keepregslash
1056" call Dret("netrw#Explore : missing +path_extra")
1057 return
1058 endif
1059
1060 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001061" call Decho("..default case: Explore newdir<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001062 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
1063 sil! unlet w:netrw_treedict
1064 sil! unlet w:netrw_treetop
1065 endif
1066 let newdir= dirname
1067 if !exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001068 NetrwKeepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaarff034192013-04-24 18:51:19 +02001069 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001070 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaarff034192013-04-24 18:51:19 +02001071 endif
1072 endif
1073
1074 " visual display of **/ **// */ Exploration files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001075" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"),'~'.expand("<slnum>"))
1076" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001077 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001078" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001079 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01001080 " only update match list when current directory isn't the same as before
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001081" call Decho("only update match list when current directory not the same as before",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001082 let s:explore_prvdir = b:netrw_curdir
1083 let s:explore_match = ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01001084 let dirlen = strlen(b:netrw_curdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02001085 if b:netrw_curdir !~ '/$'
1086 let dirlen= dirlen + 1
1087 endif
1088 let prvfname= ""
1089 for fname in w:netrw_explore_list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001090" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001091 if fname =~ '^'.b:netrw_curdir
1092 if s:explore_match == ""
1093 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1094 else
1095 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1096 endif
1097 elseif fname !~ '^/' && fname != prvfname
1098 if s:explore_match == ""
1099 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
1100 else
1101 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
1102 endif
1103 endif
1104 let prvfname= fname
1105 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001106" call Decho("explore_match<".s:explore_match.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001107 exe "2match netrwMarkFile /".s:explore_match."/"
1108 endif
1109 echo "<s-up>==Pexplore <s-down>==Nexplore"
1110 else
1111 2match none
1112 if exists("s:explore_match") | unlet s:explore_match | endif
1113 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
1114 echo " "
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001115" call Decho("cleared explore match list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001116 endif
1117
Bram Moolenaara6878372014-03-22 21:02:50 +01001118 " since Explore may be used to initialize netrw's browser,
1119 " there's no danger of a late FocusGained event on initialization.
1120 " Consequently, set s:netrw_events to 2.
1121 let s:netrw_events= 2
1122 if has("clipboard")
1123 sil! let @* = keepregstar
1124 sil! let @+ = keepregstar
1125 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02001126 sil! let @/ = keepregslash
1127" call Dret("netrw#Explore : @/<".@/.">")
1128endfun
1129
1130" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01001131" netrw#Lexplore: toggle Explorer window, keeping it on the left of the current tab {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001132fun! netrw#Lexplore(count,rightside,...)
1133" call Dfunc("netrw#Lexplore(count=".a:count."rightside=".a:rightside.",...) a:0=".a:0." ft=".&ft)
1134 let curwin= winnr()
1135
Bram Moolenaara6878372014-03-22 21:02:50 +01001136 if a:0 > 0 && a:1 != ""
1137 " if a netrw window is already on the left-side of the tab
1138 " and a directory has been specified, explore with that
1139 " directory.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001140 let a1 = expand(a:1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001141" call Decho("a:1<".a:1."> curwin#".curwin,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001142 exe "1wincmd w"
1143 if &ft == "netrw"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001144" call Decho("exe Explore ".fnameescape(a:1),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001145 exe "Explore ".fnameescape(a1)
1146 exe curwin."wincmd w"
1147 if exists("t:netrw_lexposn")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001148" call Decho("forgetting t:netrw_lexposn",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001149 unlet t:netrw_lexposn
1150 endif
1151" call Dret("netrw#Lexplore")
1152 return
Bram Moolenaara6878372014-03-22 21:02:50 +01001153 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001154 exe curwin."wincmd w"
1155 else
1156 let a1= ""
Bram Moolenaara6878372014-03-22 21:02:50 +01001157 endif
1158
Bram Moolenaar8d043172014-01-23 14:24:41 +01001159 if exists("t:netrw_lexbufnr")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001160 " check if t:netrw_lexbufnr refers to a netrw window
Bram Moolenaar8d043172014-01-23 14:24:41 +01001161 let lexwinnr = bufwinnr(t:netrw_lexbufnr)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001162 else
1163 let lexwinnr= 0
1164 endif
1165
1166 if lexwinnr > 0
1167 " close down netrw explorer window
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001168" call Decho("t:netrw_lexbufnr#".t:netrw_lexbufnr.": close down netrw window",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001169 exe lexwinnr."wincmd w"
1170 let g:netrw_winsize = -winwidth(0)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001171 let t:netrw_lexposn = winsaveview()
1172" call Decho("saving posn to t:netrw_lexposn<".string(t:netrw_lexposn).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001173" call Decho("saving t:netrw_lexposn",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001174 close
1175 if lexwinnr < curwin
1176 let curwin= curwin - 1
Bram Moolenaar8d043172014-01-23 14:24:41 +01001177 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001178 exe curwin."wincmd w"
Bram Moolenaar8d043172014-01-23 14:24:41 +01001179 unlet t:netrw_lexbufnr
1180
1181 else
1182 " open netrw explorer window
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001183" call Decho("t:netrw_lexbufnr<n/a>: open netrw explorer window",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01001184 exe "1wincmd w"
1185 let keep_altv = g:netrw_altv
1186 let g:netrw_altv = 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001187 if a:count != 0
1188 let netrw_winsize = g:netrw_winsize
1189 let g:netrw_winsize = a:count
Bram Moolenaar8d043172014-01-23 14:24:41 +01001190 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001191 let curfile= expand("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001192" call Decho("curfile<".curfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001193 exe (a:rightside? "botright" : "topleft")." vertical ".((g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize) . " new"
1194 if a:0 > 0 && a1 != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001195" call Decho("case 1: Explore ".a1,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001196 exe "Explore ".fnameescape(a1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001197 elseif curfile =~ '^\a\{3,}://'
1198" call Decho("case 2: Explore ".substitute(curfile,'[^/\\]*$','',''),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001199 exe "Explore ".substitute(curfile,'[^/\\]*$','','')
1200 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001201" call Decho("case 3: Explore .",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001202 Explore .
1203 endif
1204 if a:count != 0
1205 let g:netrw_winsize = netrw_winsize
1206 endif
1207 setlocal winfixwidth
Bram Moolenaar8d043172014-01-23 14:24:41 +01001208 let g:netrw_altv = keep_altv
1209 let t:netrw_lexbufnr = bufnr("%")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001210 if exists("t:netrw_lexposn")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001211" call Decho("restoring to t:netrw_lexposn",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001212" call Decho("restoring posn to t:netrw_lexposn<".string(t:netrw_lexposn).">",'~'.expand("<slnum>"))
1213 call winrestview(t:netrw_lexposn)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001214 unlet t:netrw_lexposn
1215 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01001216 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001217
1218 " set up default window for editing via <cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01001219 if exists("g:netrw_chgwin") && g:netrw_chgwin == -1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001220 if a:rightside
1221 let g:netrw_chgwin= 1
1222 else
1223 let g:netrw_chgwin= 2
1224 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001225 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001226
Bram Moolenaar8d043172014-01-23 14:24:41 +01001227" call Dret("netrw#Lexplore")
1228endfun
1229
1230" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01001231" netrw#Clean: remove netrw {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00001232" supports :NetrwClean -- remove netrw from first directory on runtimepath
1233" :NetrwClean! -- remove netrw from all directories on runtimepath
Bram Moolenaara6878372014-03-22 21:02:50 +01001234fun! netrw#Clean(sys)
1235" call Dfunc("netrw#Clean(sys=".a:sys.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001236
1237 if a:sys
1238 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
1239 else
1240 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
1241 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001242" call Decho("choice=".choice,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00001243 let diddel= 0
1244 let diddir= ""
1245
1246 if choice == 1
1247 for dir in split(&rtp,',')
1248 if filereadable(dir."/plugin/netrwPlugin.vim")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001249" call Decho("removing netrw-related files from ".dir,'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001250 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
1251 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
1252 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
1253 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
1254 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
1255 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 +00001256 let diddir= dir
1257 let diddel= diddel + 1
1258 if !a:sys|break|endif
1259 endif
1260 endfor
1261 endif
1262
1263 echohl WarningMsg
1264 if diddel == 0
1265 echomsg "netrw is either not installed or not removable"
1266 elseif diddel == 1
1267 echomsg "removed one copy of netrw from <".diddir.">"
1268 else
1269 echomsg "removed ".diddel." copies of netrw"
1270 endif
1271 echohl None
1272
Bram Moolenaara6878372014-03-22 21:02:50 +01001273" call Dret("netrw#Clean")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001274endfun
1275
Bram Moolenaar5c736222010-01-06 20:54:52 +01001276" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01001277" netrw#MakeTgt: make a target out of the directory name provided {{{2
1278fun! netrw#MakeTgt(dname)
1279" call Dfunc("netrw#MakeTgt(dname<".a:dname.">)")
1280 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001281 let svpos = winsaveview()
1282" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001283 let s:netrwmftgt_islocal= (a:dname !~ '^\a\{3,}://')
1284" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001285 if s:netrwmftgt_islocal
1286 let netrwmftgt= simplify(a:dname)
1287 else
1288 let netrwmftgt= a:dname
1289 endif
1290 if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
1291 " re-selected target, so just clear it
1292 unlet s:netrwmftgt s:netrwmftgt_islocal
1293 else
1294 let s:netrwmftgt= netrwmftgt
1295 endif
1296 if g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001297 call s:NetrwRefresh((b:netrw_curdir !~ '\a\{3,}://'),b:netrw_curdir)
Bram Moolenaara6878372014-03-22 21:02:50 +01001298 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001299" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))"
1300 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01001301" call Dret("netrw#MakeTgt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001302endfun
1303
Bram Moolenaara6878372014-03-22 21:02:50 +01001304" ---------------------------------------------------------------------
1305" netrw#Obtain: {{{2
1306" netrw#Obtain(islocal,fname[,tgtdirectory])
Bram Moolenaarff034192013-04-24 18:51:19 +02001307" islocal=0 obtain from remote source
1308" =1 obtain from local source
1309" fname : a filename or a list of filenames
1310" tgtdir : optional place where files are to go (not present, uses getcwd())
Bram Moolenaara6878372014-03-22 21:02:50 +01001311fun! netrw#Obtain(islocal,fname,...)
1312" 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 +02001313 " NetrwStatusLine support - for obtaining support
1314
1315 if type(a:fname) == 1
1316 let fnamelist= [ a:fname ]
1317 elseif type(a:fname) == 3
1318 let fnamelist= a:fname
1319 else
1320 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 +01001321" call Dret("netrw#Obtain")
Bram Moolenaarff034192013-04-24 18:51:19 +02001322 return
1323 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001324" call Decho("fnamelist<".string(fnamelist).">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001325 if a:0 > 0
1326 let tgtdir= a:1
1327 else
1328 let tgtdir= getcwd()
1329 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001330" call Decho("tgtdir<".tgtdir.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001331
1332 if exists("b:netrw_islocal") && b:netrw_islocal
1333 " obtain a file from local b:netrw_curdir to (local) tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001334" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001335 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
1336 let topath= s:ComposePath(tgtdir,"")
1337 if (has("win32") || has("win95") || has("win64") || has("win16"))
1338 " transfer files one at time
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001339" call Decho("transfer files one at a time",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001340 for fname in fnamelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001341" call Decho("system(".g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath).")",'~'.expand("<slnum>"))
1342 call system(g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001343 if v:shell_error != 0
1344 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 +01001345" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001346 return
1347 endif
1348 endfor
1349 else
1350 " transfer files with one command
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001351" call Decho("transfer files with one command",'~'.expand("<slnum>"))
1352 let filelist= join(map(deepcopy(fnamelist),"s:ShellEscape(v:val)"))
1353" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath).")",'~'.expand("<slnum>"))
1354 call system(g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001355 if v:shell_error != 0
1356 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 +01001357" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath))
Bram Moolenaarff034192013-04-24 18:51:19 +02001358 return
1359 endif
1360 endif
1361 elseif !exists("b:netrw_curdir")
1362 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
1363 else
1364 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
1365 endif
1366
1367 else
1368 " obtain files from remote b:netrw_curdir to local tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001369" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001370 if type(a:fname) == 1
1371 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
1372 endif
1373 call s:NetrwMethod(b:netrw_curdir)
1374
1375 if b:netrw_method == 4
1376 " obtain file using scp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001377" call Decho("obtain via scp (method#4)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001378 if exists("g:netrw_port") && g:netrw_port != ""
1379 let useport= " ".g:netrw_scpport." ".g:netrw_port
1380 else
1381 let useport= ""
1382 endif
1383 if b:netrw_fname =~ '/'
1384 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
1385 else
1386 let path= ""
1387 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001388 let filelist= join(map(deepcopy(fnamelist),'s:ShellEscape(g:netrw_machine.":".path.v:val,1)'))
1389 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 +02001390
1391 elseif b:netrw_method == 2
1392 " obtain file using ftp + .netrc
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001393" call Decho("obtain via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001394 call s:SaveBufVars()|sil NetrwKeepj new|call s:RestoreBufVars()
Bram Moolenaarff034192013-04-24 18:51:19 +02001395 let tmpbufnr= bufnr("%")
1396 setl ff=unix
1397 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001398 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001399" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001400 endif
1401
1402 if exists("b:netrw_fname") && b:netrw_fname != ""
1403 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001404" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001405 endif
1406
1407 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001408 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001409" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001410 endif
1411 for fname in fnamelist
1412 call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001413" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001414 endfor
1415 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001416 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 +02001417 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001418 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaarff034192013-04-24 18:51:19 +02001419 endif
1420 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1421 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1422 let debugkeep= &debug
1423 setl debug=msg
1424 call netrw#ErrorMsg(s:ERROR,getline(1),4)
1425 let &debug= debugkeep
1426 endif
1427
1428 elseif b:netrw_method == 3
1429 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001430" call Decho("obtain via ftp+mipf (method #3)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001431 call s:SaveBufVars()|sil NetrwKeepj new|call s:RestoreBufVars()
Bram Moolenaarff034192013-04-24 18:51:19 +02001432 let tmpbufnr= bufnr("%")
1433 setl ff=unix
1434
1435 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001436 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001437" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001438 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001439 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001440" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001441 endif
1442
1443 if exists("g:netrw_uid") && g:netrw_uid != ""
1444 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001445 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001446" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001447 if exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001448 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaarff034192013-04-24 18:51:19 +02001449 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001450" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001451 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001452 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001453" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001454 endif
1455 endif
1456
1457 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001458 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001459" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001460 endif
1461
1462 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001463 NetrwKeepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001464" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001465 endif
1466
1467 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001468 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001469" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001470 endif
1471
1472 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001473 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001474" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001475 endif
1476 for fname in fnamelist
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001477 NetrwKeepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaarff034192013-04-24 18:51:19 +02001478 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001479" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001480
1481 " perform ftp:
1482 " -i : turns off interactive prompting from ftp
1483 " -n unix : DON'T use <.netrc>, even though it exists
1484 " -n win32: quit being obnoxious about password
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001485 NetrwKeepj norm! 1Gdd
1486 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaarff034192013-04-24 18:51:19 +02001487 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1488 if getline(1) !~ "^$"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001489" call Decho("error<".getline(1).">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02001490 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001491 NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarff034192013-04-24 18:51:19 +02001492 endif
1493 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02001494
1495 elseif b:netrw_method == 9
1496 " obtain file using sftp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001497" call Decho("obtain via sftp (method #9)",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02001498 if a:fname =~ '/'
1499 let localfile= substitute(a:fname,'^.*/','','')
1500 else
1501 let localfile= a:fname
1502 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001503 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 +02001504
Bram Moolenaarff034192013-04-24 18:51:19 +02001505 elseif !exists("b:netrw_method") || b:netrw_method < 0
Bram Moolenaar13600302014-05-22 18:26:40 +02001506 " probably a badly formed url; protocol not recognized
1507" call Dret("netrw#Obtain : unsupported method")
1508 return
1509
1510 else
1511 " protocol recognized but not supported for Obtain (yet?)
1512 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001513 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"current protocol not supported for obtaining file",97)
Bram Moolenaar13600302014-05-22 18:26:40 +02001514 endif
1515" call Dret("netrw#Obtain : current protocol not supported for obtaining file")
Bram Moolenaarff034192013-04-24 18:51:19 +02001516 return
1517 endif
1518
1519 " restore status line
1520 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001521 NetrwKeepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaarff034192013-04-24 18:51:19 +02001522 endif
1523
1524 endif
1525
1526 " cleanup
1527 if exists("tmpbufnr")
1528 if bufnr("%") != tmpbufnr
1529 exe tmpbufnr."bw!"
1530 else
1531 q!
1532 endif
1533 endif
1534
Bram Moolenaara6878372014-03-22 21:02:50 +01001535" call Dret("netrw#Obtain")
1536endfun
1537
1538" ---------------------------------------------------------------------
1539" netrw#Nread: save position, call netrw#NetRead(), and restore position {{{2
1540fun! netrw#Nread(mode,fname)
1541" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001542 let svpos= winsaveview()
1543" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001544 call netrw#NetRead(a:mode,a:fname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001545" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
1546 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01001547
1548 if exists("w:netrw_liststyle") && w:netrw_liststyle != s:TREELIST
1549 if exists("w:netrw_bannercnt")
1550 " start with cursor just after the banner
1551 exe w:netrw_bannercnt
1552 endif
1553 endif
1554" call Dret("netrw#Nread")
1555endfun
1556
1557" ------------------------------------------------------------------------
1558" s:NetrwOptionRestore: restore options (based on prior s:NetrwOptionSave) {{{2
1559fun! s:NetrwOptionRestore(vt)
1560" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001561" 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 +01001562 if !exists("{a:vt}netrw_optionsave")
1563 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001564" call Decho("restoring posn to s:nbcd_curpos_".bufnr('%')."<".string(s:nbcd_curpos_{bufnr('%')}).">",'~'.expand("<slnum>"))
1565 NetrwKeepj call winrestview(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001566" call Decho("win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"),'~'.expand("<slnum>"))
1567" call Decho("unlet s:nbcd_curpos_".bufnr('%'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001568 unlet s:nbcd_curpos_{bufnr('%')}
1569 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001570" call Decho("no previous position",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001571 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001572" 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>"))
1573" 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 +01001574" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
1575 return
1576 endif
1577 unlet {a:vt}netrw_optionsave
1578
1579 if exists("+acd")
1580 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001581" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001582 let curdir = getcwd()
1583 let &l:acd = {a:vt}netrw_acdkeep
1584 unlet {a:vt}netrw_acdkeep
1585 if &l:acd
1586 call s:NetrwLcd(curdir)
1587 endif
1588 endif
1589 endif
1590 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
1591 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001592 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
1593 if exists("{a:vt}netrw_btkeep") |let &l:bt = {a:vt}netrw_btkeep |unlet {a:vt}netrw_btkeep |endif
1594 if exists("{a:vt}netrw_bombkeep") |let &l:bomb = {a:vt}netrw_bombkeep |unlet {a:vt}netrw_bombkeep |endif
1595 if exists("{a:vt}netrw_cedit") |let &cedit = {a:vt}netrw_cedit |unlet {a:vt}netrw_cedit |endif
1596 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
1597 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
1598 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
1599 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
1600 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
1601 if exists("{a:vt}netrw_diffkeep") |let &l:diff = {a:vt}netrw_diffkeep |unlet {a:vt}netrw_diffkeep |endif
1602 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001603 if exists("g:netrw_ffkep") && g:netrw_ffkeep
1604 if exists("{a:vt}netrw_ffkeep") |let &l:ff = {a:vt}netrw_ffkeep |unlet {a:vt}netrw_ffkeep |endif
1605 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001606 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
1607 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
1608 if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif
1609 if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif
1610 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
1611 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
1612 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
1613 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
1614 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
1615 if exists("{a:vt}netrw_nukeep") |let &l:nu = {a:vt}netrw_nukeep |unlet {a:vt}netrw_nukeep |endif
Bram Moolenaar13600302014-05-22 18:26:40 +02001616 if exists("{a:vt}netrw_rnukeep") |let &l:rnu = {a:vt}netrw_rnukeep |unlet {a:vt}netrw_rnukeep |endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001617 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
1618 if exists("{a:vt}netrw_rokeep") |let &l:ro = {a:vt}netrw_rokeep |unlet {a:vt}netrw_rokeep |endif
1619 if exists("{a:vt}netrw_selkeep") |let &l:sel = {a:vt}netrw_selkeep |unlet {a:vt}netrw_selkeep |endif
1620 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
1621 if has("clipboard")
1622 if exists("{a:vt}netrw_starkeep") |let @* = {a:vt}netrw_starkeep |unlet {a:vt}netrw_starkeep |endif
1623 endif
1624 " Problem: start with liststyle=0; press <i> : result, following line resets l:ts.
1625" if exists("{a:vt}netrw_tskeep") |let &l:ts = {a:vt}netrw_tskeep |unlet {a:vt}netrw_tskeep |endif
1626 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
1627 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
1628 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
1629 if exists("{a:vt}netrw_writekeep")|let &l:write = {a:vt}netrw_writekeep |unlet {a:vt}netrw_writekeep|endif
1630 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
1631 if exists("{a:vt}netrw_swfkeep")
1632 if &directory == ""
1633 " user hasn't specified a swapfile directory;
1634 " netrw will temporarily set the swapfile directory
1635 " to the current directory as returned by getcwd().
1636 let &l:directory= getcwd()
1637 sil! let &l:swf = {a:vt}netrw_swfkeep
1638 setl directory=
1639 unlet {a:vt}netrw_swfkeep
1640 elseif &l:swf != {a:vt}netrw_swfkeep
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001641 if !g:netrw_use_noswf
1642 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
1643 sil! let &l:swf= {a:vt}netrw_swfkeep
1644 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001645 unlet {a:vt}netrw_swfkeep
1646 endif
1647 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001648 if exists("{a:vt}netrw_dirkeep") && isdirectory(s:NetrwFile({a:vt}netrw_dirkeep)) && g:netrw_keepdir
Bram Moolenaara6878372014-03-22 21:02:50 +01001649 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
1650 if exists("{a:vt}netrw_dirkeep")
1651 call s:NetrwLcd(dirkeep)
1652 unlet {a:vt}netrw_dirkeep
1653 endif
1654 endif
1655 if has("clipboard")
1656 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
1657 endif
1658 if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
1659 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001660" call Decho("restoring posn to s:nbcd_curpos_".bufnr('%')."<".string(s:nbcd_curpos_{bufnr('%')}).">",'~'.expand("<slnum>"))
1661 NetrwKeepj call winrestview(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001662" call Decho("unlet s:nbcd_curpos_".bufnr('%'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001663 if exists("s:nbcd_curpos_".bufnr('%'))
1664 unlet s:nbcd_curpos_{bufnr('%')}
1665 endif
1666 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001667" call Decho("no previous position",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001668 endif
1669
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001670" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
1671" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"),'~'.expand("<slnum>"))
1672" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
1673" call Decho("diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"),'~'.expand("<slnum>"))
1674" call Decho("ts=".&l:ts,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001675 " Moved the filetype detect here from NetrwGetFile() because remote files
1676 " were having their filetype detect-generated settings overwritten by
1677 " NetrwOptionRestore.
1678 if &ft != "netrw"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001679" call Decho("filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001680 filetype detect
1681 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001682" 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 +01001683" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
1684endfun
1685
1686" ---------------------------------------------------------------------
1687" s:NetrwOptionSave: save options prior to setting to "netrw-buffer-standard" form {{{2
1688" Options get restored by s:NetrwOptionRestore()
1689" 06/08/07 : removed call to NetrwSafeOptions(), either placed
1690" immediately after NetrwOptionSave() calls in NetRead
1691" and NetWrite, or after the s:NetrwEnew() call in
1692" NetrwBrowse.
1693" vt: normally its "w:" or "s:" (a variable type)
1694fun! s:NetrwOptionSave(vt)
1695" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001696" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"),'~'.expand("<slnum>"))
1697" 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 +01001698
1699 if !exists("{a:vt}netrw_optionsave")
1700 let {a:vt}netrw_optionsave= 1
1701 else
1702" call Dret("s:NetrwOptionSave : options already saved")
1703 return
1704 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001705" call Decho("prior to save: fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001706
1707 " Save current settings and current directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001708" call Decho("saving current settings and current directory",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001709 let s:yykeep = @@
1710 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
1711 let {a:vt}netrw_aikeep = &l:ai
1712 let {a:vt}netrw_awkeep = &l:aw
1713 let {a:vt}netrw_bhkeep = &l:bh
1714 let {a:vt}netrw_blkeep = &l:bl
Bram Moolenaar13600302014-05-22 18:26:40 +02001715 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaara6878372014-03-22 21:02:50 +01001716 let {a:vt}netrw_bombkeep = &l:bomb
1717 let {a:vt}netrw_cedit = &cedit
1718 let {a:vt}netrw_cikeep = &l:ci
1719 let {a:vt}netrw_cinkeep = &l:cin
1720 let {a:vt}netrw_cinokeep = &l:cino
1721 let {a:vt}netrw_comkeep = &l:com
1722 let {a:vt}netrw_cpokeep = &l:cpo
1723 let {a:vt}netrw_diffkeep = &l:diff
1724 let {a:vt}netrw_fenkeep = &l:fen
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001725 if !exists("g:netrw_ffkeep") || g:netrw_ffkeep
Bram Moolenaar13600302014-05-22 18:26:40 +02001726 let {a:vt}netrw_ffkeep = &l:ff
1727 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01001728 let {a:vt}netrw_fokeep = &l:fo " formatoptions
1729 let {a:vt}netrw_gdkeep = &l:gd " gdefault
1730 let {a:vt}netrw_hidkeep = &l:hidden
1731 let {a:vt}netrw_imkeep = &l:im
1732 let {a:vt}netrw_iskkeep = &l:isk
1733 let {a:vt}netrw_lskeep = &l:ls
1734 let {a:vt}netrw_makeep = &l:ma
1735 let {a:vt}netrw_magickeep = &l:magic
1736 let {a:vt}netrw_modkeep = &l:mod
1737 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar13600302014-05-22 18:26:40 +02001738 let {a:vt}netrw_rnukeep = &l:rnu
Bram Moolenaara6878372014-03-22 21:02:50 +01001739 let {a:vt}netrw_repkeep = &l:report
1740 let {a:vt}netrw_rokeep = &l:ro
1741 let {a:vt}netrw_selkeep = &l:sel
1742 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001743 if !g:netrw_use_noswf
1744 let {a:vt}netrw_swfkeep = &l:swf
Bram Moolenaara6878372014-03-22 21:02:50 +01001745 endif
1746 if has("clipboard")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001747 let {a:vt}netrw_starkeep = @*
Bram Moolenaara6878372014-03-22 21:02:50 +01001748 endif
1749 let {a:vt}netrw_tskeep = &l:ts
1750 let {a:vt}netrw_twkeep = &l:tw " textwidth
1751 let {a:vt}netrw_wigkeep = &l:wig " wildignore
1752 let {a:vt}netrw_wrapkeep = &l:wrap
1753 let {a:vt}netrw_writekeep = &l:write
1754
1755 " save a few selected netrw-related variables
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001756" call Decho("saving a few selected netrw-related variables",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001757 if g:netrw_keepdir
1758 let {a:vt}netrw_dirkeep = getcwd()
1759 endif
1760 if has("clipboard")
1761 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
1762 endif
1763 sil! let {a:vt}netrw_regslash= @/
1764
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001765" 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 +01001766" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr())
1767endfun
1768
1769" ------------------------------------------------------------------------
1770" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
1771" Use s:NetrwSaveOptions() to save user settings
1772" Use s:NetrwOptionRestore() to restore user settings
1773fun! s:NetrwSafeOptions()
1774" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001775" call Decho("win#".winnr()."'s ft=".&ft,'~'.expand("<slnum>"))
1776" 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 +01001777 if exists("+acd") | setl noacd | endif
1778 setl noai
1779 setl noaw
1780 setl nobl
1781 setl nobomb
1782 setl bt=nofile
1783 setl noci
1784 setl nocin
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001785 setl bh=hide
Bram Moolenaara6878372014-03-22 21:02:50 +01001786 setl cino=
1787 setl com=
1788 setl cpo-=a
1789 setl cpo-=A
1790 setl fo=nroql2
1791 setl nohid
1792 setl noim
1793 setl isk+=@ isk+=* isk+=/
1794 setl magic
1795 if g:netrw_use_noswf
1796 setl noswf
1797 endif
1798 setl report=10000
1799 setl sel=inclusive
1800 setl nospell
1801 setl tw=0
1802 setl wig=
1803 setl cedit&
1804 call s:NetrwCursor()
1805
1806 " allow the user to override safe options
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001807" call Decho("ft<".&ft."> ei=".&ei,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01001808 if &ft == "netrw"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001809" call Decho("do any netrw FileType autocmds (doau FileType netrw)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001810 sil! keepalt NetrwKeepj doau FileType netrw
Bram Moolenaara6878372014-03-22 21:02:50 +01001811 endif
1812
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001813" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh." bt<".&bt.">",'~'.expand("<slnum>"))
1814" 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 +01001815" call Dret("s:NetrwSafeOptions")
Bram Moolenaarff034192013-04-24 18:51:19 +02001816endfun
1817
1818" ---------------------------------------------------------------------
1819" NetrwStatusLine: {{{2
1820fun! NetrwStatusLine()
1821
1822" vvv NetrwStatusLine() debugging vvv
1823" let g:stlmsg=""
1824" if !exists("w:netrw_explore_bufnr")
1825" let g:stlmsg="!X<explore_bufnr>"
1826" elseif w:netrw_explore_bufnr != bufnr("%")
1827" let g:stlmsg="explore_bufnr!=".bufnr("%")
1828" endif
1829" if !exists("w:netrw_explore_line")
1830" let g:stlmsg=" !X<explore_line>"
1831" elseif w:netrw_explore_line != line(".")
1832" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
1833" endif
1834" if !exists("w:netrw_explore_list")
1835" let g:stlmsg=" !X<explore_list>"
1836" endif
1837" ^^^ NetrwStatusLine() debugging ^^^
1838
1839 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")
1840 " restore user's status line
1841 let &stl = s:netrw_users_stl
1842 let &laststatus = s:netrw_users_ls
1843 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
1844 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
1845 return ""
1846 else
1847 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
1848 endif
1849endfun
1850
1851" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001852" Netrw Transfer Functions: {{{1
1853" ===============================
1854
Bram Moolenaar071d4272004-06-13 20:20:40 +00001855" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001856" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001857" mode: =0 read remote file and insert before current line
1858" =1 read remote file and insert after current line
1859" =2 replace with remote file
1860" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001861fun! netrw#NetRead(mode,...)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001862" 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 +00001863
Bram Moolenaar5c736222010-01-06 20:54:52 +01001864 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001865 call s:NetrwOptionSave("w:")
1866 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001867 call s:RestoreCursorline()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001868 " NetrwSafeOptions sets a buffer up for a netrw listing, which includes buflisting off.
1869 " However, this setting is not wanted for a remote editing session. The buffer should be "nofile", still.
1870 setl bl
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001871" call Decho("(netrw#NetRead) buf#".bufnr("%")."<".bufname("%")."> bl=".&bl." bt=".&bt." bh=".&bh,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001872
Bram Moolenaar5c736222010-01-06 20:54:52 +01001873 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001874 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001875 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001876 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001877 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001878 elseif a:mode == 2 " replace with remote file
1879 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +00001880 elseif a:mode == 3 " skip read of file (leave as temporary)
1881 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001882 else
1883 exe a:mode
1884 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001885 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001886 let ichoice = (a:0 == 0)? 0 : 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001887" call Decho("readcmd<".readcmd."> ichoice=".ichoice,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001888
Bram Moolenaar5c736222010-01-06 20:54:52 +01001889 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001890 let tmpfile= s:GetTempfile("")
1891 if tmpfile == ""
1892" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001893 return
1894 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001895
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001896 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001897
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001898 " attempt to repeat with previous host-file-etc
1899 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001900" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001901 let choice = b:netrw_lastfile
1902 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001903
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001904 else
1905 exe "let choice= a:" . ichoice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001906" call Decho("no lastfile: choice<" . choice . ">",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001907
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001908 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001909 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001910 echomsg 'NetRead Usage:'
1911 echomsg ':Nread machine:path uses rcp'
1912 echomsg ':Nread "machine path" uses ftp with <.netrc>'
1913 echomsg ':Nread "machine id password path" uses ftp'
1914 echomsg ':Nread dav://machine[:port]/path uses cadaver'
1915 echomsg ':Nread fetch://machine/path uses fetch'
1916 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1917 echomsg ':Nread http://[user@]machine/path uses http wget'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001918 echomsg ':Nread file:///path uses elinks'
Bram Moolenaara6878372014-03-22 21:02:50 +01001919 echomsg ':Nread https://[user@]machine/path uses http wget'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001920 echomsg ':Nread rcp://[user@]machine/path uses rcp'
1921 echomsg ':Nread rsync://machine[:port]/path uses rsync'
1922 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
1923 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001924 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001925 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001926
Bram Moolenaar9964e462007-05-05 17:54:07 +00001927 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001928 " Reconstruct Choice if choice starts with '"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001929" call Decho("reconstructing choice",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001930 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001931 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +02001932 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001933 else
1934 " case "... ... ..."
1935 let choice = strpart(choice,1,strlen(choice)-1)
1936 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001937
Bram Moolenaar9964e462007-05-05 17:54:07 +00001938 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001939 let wholechoice = wholechoice . " " . choice
1940 let ichoice = ichoice + 1
1941 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001942 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001943 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001944 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001945" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001946 return
1947 endif
1948 let choice= a:{ichoice}
1949 endwhile
1950 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1951 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001952 endif
1953 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001954
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001955" call Decho("choice<" . choice . ">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001956 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001957
Bram Moolenaar5c736222010-01-06 20:54:52 +01001958 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001959 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001960 if !exists("b:netrw_method") || b:netrw_method < 0
1961" call Dfunc("netrw#NetRead : unsupported method")
1962 return
1963 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001964 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001965
Bram Moolenaar8d043172014-01-23 14:24:41 +01001966 " Check whether or not NetrwBrowse() should be handling this request
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001967" 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 +02001968 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001969" call Decho("yes, choice matches '^.*[\/]$'",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01001970 NetrwKeepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001971" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001972 return
Bram Moolenaar071d4272004-06-13 20:20:40 +00001973 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001974
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001975 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001976 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001977 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001978 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1979 echo "(netrw) Processing your read request..."
1980 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001981
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001982 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001983 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001984 if b:netrw_method == 1 " read with rcp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01001985" call Decho("read via rcp (method #1)",'~'.expand("<slnum>"))
Bram Moolenaard68071d2006-05-02 22:08:30 +00001986 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001987 " ER: on Win2K" rcp machine[.user]:file tmpfile
Bram Moolenaar8d043172014-01-23 14:24:41 +01001988 " ER: when machine contains '.' adding .user is required (use $USERNAME)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001989 " ER: the tmpfile is full path: rcp sees C:\... as host C
1990 if s:netrw_has_nt_rcp == 1
1991 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1992 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1993 else
1994 " Any way needed it machine contains a '.'
1995 let uid_machine = g:netrw_machine .'.'. $USERNAME
1996 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001997 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001998 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1999 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2000 else
2001 let uid_machine = g:netrw_machine
2002 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002003 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002004 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 +00002005 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002006 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002007
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002008 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002009 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002010 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002011" call Decho("read via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
Bram Moolenaar8dff8182006-04-06 20:18:50 +00002012 let netrw_fname= b:netrw_fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002013 NetrwKeepj call s:SaveBufVars()|new|NetrwKeepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002014 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002015 setl ff=unix
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002016 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002017" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002018 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002019 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002020" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002021 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002022 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002023" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002024 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002025 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 +00002026 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002027 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002028 endif
2029 " 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 +00002030 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +00002031 let debugkeep = &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02002032 setl debug=msg
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002033 NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +00002034 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002035 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +00002036 call s:SaveBufVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002037 keepj bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01002038 if bufname("%") == "" && getline("$") == "" && line('$') == 1
2039 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +00002040 q!
2041 endif
2042 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002043 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002044 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002045
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002046 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002047 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002048 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
2049 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002050" call Decho("read via ftp+mipf (method #3)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002051 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002052 NetrwKeepj call s:SaveBufVars()|new|NetrwKeepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002053 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002054 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002055 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002056 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002057" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002058 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002059 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002060" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002061 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002062
Bram Moolenaar97d62492012-11-15 21:28:22 +01002063 if exists("g:netrw_uid") && g:netrw_uid != ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002064 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002065 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002066" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002067 if exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002068 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002069 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002070" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002071 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002072 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002073" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002074 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002075 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002076
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002077 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002078 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002079" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002080 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002081 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002082 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002083" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002084 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002085 NetrwKeepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002086" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002087
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002088 " perform ftp:
2089 " -i : turns off interactive prompting from ftp
2090 " -n unix : DON'T use <.netrc>, even though it exists
2091 " -n win32: quit being obnoxious about password
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002092 NetrwKeepj norm! 1Gdd
2093 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002094 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2095 if getline(1) !~ "^$"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002096" call Decho("error<".getline(1).">",'~'.expand("<slnum>"))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002097 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002098 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002099 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002100 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002101 call s:SaveBufVars()|keepj bd!|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002102 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002103 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002104
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002105 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002106 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002107 elseif b:netrw_method == 4 " read with scp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002108" call Decho("read via scp (method #4)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002109 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00002110 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002111 else
2112 let useport= ""
2113 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002114 " 'C' in 'C:\path\to\file' is handled as hostname on windows.
2115 " This is workaround to avoid mis-handle windows local-path:
2116 if g:netrw_scp_cmd =~ '^scp' && (has("win32") || has("win95") || has("win64") || has("win16"))
2117 let tmpfile_get = substitute(tr(tmpfile, '\', '/'), '^\(\a\):[/\\]\(.*\)$', '/\1/\2', '')
2118 else
2119 let tmpfile_get = tmpfile
2120 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002121 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1)." ".s:ShellEscape(tmpfile_get,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00002122 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002123 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002124
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002125 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002126 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002127 elseif b:netrw_method == 5
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002128" call Decho("read via http (method #5)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002129 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002130 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002131 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002132 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002133" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002134 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002135 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002136
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002137 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
2138 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002139" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)",'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002140 if exists("g:netrw_http_xcmd")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002141 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 +00002142 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002143 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 +00002144 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002145 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002146
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002147 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002148 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002149" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002150 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
2151 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002152" call Decho("netrw_html<".netrw_html.">",'~'.expand("<slnum>"))
2153" call Decho("netrw_tag <".netrw_tag.">",'~'.expand("<slnum>"))
2154 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 +00002155 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002156" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002157 exe 'NetrwKeepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002158 endif
2159 let b:netrw_lastfile = choice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002160" call Decho("setl ro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02002161 setl ro nomod
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002162
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002163 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002164 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002165 elseif b:netrw_method == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002166" call Decho("read via cadaver (method #6)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002167
Bram Moolenaar5c736222010-01-06 20:54:52 +01002168 if !executable(g:netrw_dav_cmd)
2169 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
2170" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
2171 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002172 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002173 if g:netrw_dav_cmd =~ "curl"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002174 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 +01002175 else
2176 " Construct execution string (four lines) which will be passed through filter
2177 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
2178 new
Bram Moolenaarff034192013-04-24 18:51:19 +02002179 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002180 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002181 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01002182 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002183 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01002184 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002185 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002186 NetrwKeepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002187 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002188 NetrwKeepj put ='get '.netrw_fname.' '.tmpfile
2189 NetrwKeepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002190
Bram Moolenaar5c736222010-01-06 20:54:52 +01002191 " perform cadaver operation:
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002192 NetrwKeepj norm! 1Gdd
2193 call s:NetrwExe(s:netrw_silentxfer."%!".g:netrw_dav_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002194 keepj bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01002195 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002196 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002197 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002198
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002199 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002200 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002201 elseif b:netrw_method == 7
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002202" call Decho("read via rsync (method #7)",'~'.expand("<slnum>"))
2203 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00002204 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002205 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002206
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002207 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002208 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002209 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002210 elseif b:netrw_method == 8
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002211" call Decho("read via fetch (method #8)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002212 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002213 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002214 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002215 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002216" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002217 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002218 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01002219 if exists("g:netrw_option") && g:netrw_option =~ ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002220 let netrw_option= "http"
2221 else
2222 let netrw_option= "ftp"
2223 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002224" call Decho("read via fetch for ".netrw_option,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002225
Bram Moolenaar446cb832008-06-24 21:56:24 +00002226 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002227 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 +00002228 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002229 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 +00002230 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002231
Bram Moolenaar446cb832008-06-24 21:56:24 +00002232 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002233 let b:netrw_lastfile = choice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002234" call Decho("setl ro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02002235 setl ro nomod
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002236
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002237 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002238 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002239 elseif b:netrw_method == 9
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002240" call Decho("read via sftp (method #9)",'~'.expand("<slnum>"))
2241 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 +00002242 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002243 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002244
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002245 ".........................................
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002246 " NetRead: (file) NetRead Method #10 {{{3
2247 elseif b:netrw_method == 10 && exists("g:netrw_file_cmd")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002248" " call Decho("read via ".b:netrw_file_cmd." (method #10)",'~'.expand("<slnum>"))
2249 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_file_cmd." ".s:ShellEscape(b:netrw_fname,1)." ".tmpfile)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002250 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
2251 let b:netrw_lastfile = choice
2252
2253 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002254 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002255 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002256 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002257 endif
2258 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002259
Bram Moolenaar5c736222010-01-06 20:54:52 +01002260 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002261 if exists("b:netrw_method")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002262" call Decho("cleanup b:netrw_method and b:netrw_fname",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002263 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002264 unlet b:netrw_fname
2265 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002266 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 +01002267" call Decho("cleanup by deleting tmpfile<".tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002268 NetrwKeepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002269 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002270 NetrwKeepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002271
Bram Moolenaar9964e462007-05-05 17:54:07 +00002272" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002273endfun
2274
2275" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002276" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002277fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00002278" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002279
Bram Moolenaar5c736222010-01-06 20:54:52 +01002280 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002281 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002282 call s:NetrwOptionSave("w:")
2283 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002284
Bram Moolenaar5c736222010-01-06 20:54:52 +01002285 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00002286 let tmpfile= s:GetTempfile("")
2287 if tmpfile == ""
2288" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002289 return
2290 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002291
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002292 if a:0 == 0
2293 let ichoice = 0
2294 else
2295 let ichoice = 1
2296 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002297
Bram Moolenaar9964e462007-05-05 17:54:07 +00002298 let curbufname= expand("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002299" call Decho("curbufname<".curbufname.">",'~'.expand("<slnum>"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002300 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00002301 " For binary writes, always write entire file.
2302 " (line numbers don't really make sense for that).
2303 " Also supports the writing of tar and zip files.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002304" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002305 exe "sil NetrwKeepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002306 elseif g:netrw_cygwin
2307 " write (selected portion of) file to temporary
Bram Moolenaar8d043172014-01-23 14:24:41 +01002308 let cygtmpfile= substitute(tmpfile,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002309" 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 +01002310 exe "sil NetrwKeepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002311 else
2312 " write (selected portion of) file to temporary
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002313" 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 +01002314 exe "sil NetrwKeepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002315 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002316
Bram Moolenaar9964e462007-05-05 17:54:07 +00002317 if curbufname == ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01002318 " when the file is [No Name], and one attempts to Nwrite it, the buffer takes
Bram Moolenaar9964e462007-05-05 17:54:07 +00002319 " on the temporary file's name. Deletion of the temporary file during
2320 " cleanup then causes an error message.
2321 0file!
2322 endif
2323
Bram Moolenaar5c736222010-01-06 20:54:52 +01002324 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002325 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002326
Bram Moolenaar9964e462007-05-05 17:54:07 +00002327 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002328 " attempt to repeat with previous host-file-etc
2329 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002330" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002331 let choice = b:netrw_lastfile
2332 let ichoice= ichoice + 1
2333 else
2334 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002335
Bram Moolenaar8d043172014-01-23 14:24:41 +01002336 " Reconstruct Choice when choice starts with '"'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002337 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002338 echomsg 'NetWrite Usage:"'
2339 echomsg ':Nwrite machine:path uses rcp'
2340 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
2341 echomsg ':Nwrite "machine id password path" uses ftp'
2342 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
2343 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
2344 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
2345 echomsg ':Nwrite rcp://machine/path uses rcp'
2346 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
2347 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
2348 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002349 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002350 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002351
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002352 elseif match(choice,"^\"") != -1
2353 if match(choice,"\"$") != -1
2354 " case "..."
2355 let choice=strpart(choice,1,strlen(choice)-2)
2356 else
2357 " case "... ... ..."
2358 let choice = strpart(choice,1,strlen(choice)-1)
2359 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002360
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002361 while match(choice,"\"$") == -1
2362 let wholechoice= wholechoice . " " . choice
2363 let ichoice = ichoice + 1
2364 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002365 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002366 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002367 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002368" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002369 return
2370 endif
2371 let choice= a:{ichoice}
2372 endwhile
2373 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2374 endif
2375 endif
2376 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002377 let ichoice= ichoice + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002378" call Decho("choice<" . choice . "> ichoice=".ichoice,'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002379
Bram Moolenaar9964e462007-05-05 17:54:07 +00002380 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002381 NetrwKeepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002382 if !exists("b:netrw_method") || b:netrw_method < 0
2383" call Dfunc("netrw#NetWrite : unsupported method")
2384 return
2385 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002386
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002387 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01002388 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002389 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002390 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2391 echo "(netrw) Processing your write request..."
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002392" call Decho("(netrw) Processing your write request...",'~'.expand("<slnum>"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002393 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002394
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002395 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002396 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002397 if b:netrw_method == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002398" call Decho("write via rcp (method #1)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002399 if s:netrw_has_nt_rcp == 1
2400 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2401 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2402 else
2403 let uid_machine = g:netrw_machine .'.'. $USERNAME
2404 endif
2405 else
2406 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2407 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2408 else
2409 let uid_machine = g:netrw_machine
2410 endif
2411 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002412 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 +00002413 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002414
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002415 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002416 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002417 elseif b:netrw_method == 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002418" call Decho("write via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002419 let netrw_fname = b:netrw_fname
2420
2421 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2422 let bhkeep = &l:bh
2423 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002424 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002425 keepj keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002426
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002427" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02002428 setl ff=unix
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002429 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002430" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002431 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002432 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002433" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002434 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002435 NetrwKeepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002436" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002437 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002438 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 +00002439 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002440" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
2441 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002442 endif
2443 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2444 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002445 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002446 NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002447 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002448 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002449 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002450
2451 " remove enew buffer (quietly)
2452 let filtbuf= bufnr("%")
2453 exe curbuf."b!"
2454 let &l:bh = bhkeep
2455 exe filtbuf."bw!"
2456
Bram Moolenaar071d4272004-06-13 20:20:40 +00002457 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002458
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002459 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002460 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002461 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002462 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002463" call Decho("read via ftp+mipf (method #3)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002464 let netrw_fname = b:netrw_fname
2465 let bhkeep = &l:bh
2466
2467 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2468 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002469 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002470 keepj keepalt enew
Bram Moolenaarff034192013-04-24 18:51:19 +02002471 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002472
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002473 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002474 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002475" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002476 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002477 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002478" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002479 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002480 if exists("g:netrw_uid") && g:netrw_uid != ""
2481 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002482 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002483" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002484 if exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002485 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002486 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002487" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002488 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002489 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002490" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002491 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002492 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002493 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002494" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002495 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002496 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002497" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002498 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002499 NetrwKeepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002500" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002501 " save choice/id/password for future use
2502 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002503
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002504 " perform ftp:
2505 " -i : turns off interactive prompting from ftp
2506 " -n unix : DON'T use <.netrc>, even though it exists
2507 " -n win32: quit being obnoxious about password
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002508 NetrwKeepj norm! 1Gdd
2509 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002510 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2511 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002512 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002513 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002514 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002515 let mod=1
2516 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002517
2518 " remove enew buffer (quietly)
2519 let filtbuf= bufnr("%")
2520 exe curbuf."b!"
2521 let &l:bh= bhkeep
2522 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002523
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002524 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002525 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002526 elseif b:netrw_method == 4
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002527" call Decho("write via scp (method #4)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002528 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00002529 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002530 else
2531 let useport= ""
2532 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002533 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 +00002534 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002535
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002536 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002537 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002538 elseif b:netrw_method == 5
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002539" call Decho("write via http (method #5)",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002540 let curl= substitute(g:netrw_http_put_cmd,'\s\+.*$',"","")
2541 if executable(curl)
2542 let url= g:netrw_choice
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002543 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 +01002544 elseif !exists("g:netrw_quiet")
2545 call netrw#ErrorMsg(s:ERROR,"can't write to http using <".g:netrw_http_put_cmd".">".",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002546 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002547
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002548 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002549 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002550 elseif b:netrw_method == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002551" call Decho("write via cadaver (method #6)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002552
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002553 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01002554 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
2555 let bhkeep = &l:bh
2556
2557 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2558 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002559 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002560 keepj keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002561
Bram Moolenaarff034192013-04-24 18:51:19 +02002562 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002563 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002564 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002565 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002566 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002567 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002568 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002569 NetrwKeepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00002570 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002571 NetrwKeepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002572
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002573 " perform cadaver operation:
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002574 NetrwKeepj norm! 1Gdd
2575 call s:NetrwExe(s:netrw_silentxfer."%!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002576
2577 " remove enew buffer (quietly)
2578 let filtbuf= bufnr("%")
2579 exe curbuf."b!"
2580 let &l:bh = bhkeep
2581 exe filtbuf."bw!"
2582
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002583 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002584
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002585 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002586 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002587 elseif b:netrw_method == 7
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002588" call Decho("write via rsync (method #7)",'~'.expand("<slnum>"))
2589 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002590 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002591
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002592 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002593 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002594 elseif b:netrw_method == 9
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002595" call Decho("write via sftp (method #9)",'~'.expand("<slnum>"))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002596 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002597 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2598 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2599 else
2600 let uid_machine = g:netrw_machine
2601 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002602
2603 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2604 let bhkeep = &l:bh
2605 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002606 setl bh=hide
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002607 keepj keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002608
Bram Moolenaarff034192013-04-24 18:51:19 +02002609 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002610 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002611" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01002612 let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002613 call s:NetrwExe(s:netrw_silentxfer."%!".sftpcmd.' '.s:ShellEscape(uid_machine,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002614 let filtbuf= bufnr("%")
2615 exe curbuf."b!"
2616 let &l:bh = bhkeep
2617 exe filtbuf."bw!"
2618 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002619
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002620 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002621 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002622 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002623 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002624 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002625 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002626 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002627
Bram Moolenaar5c736222010-01-06 20:54:52 +01002628 " NetWrite: Cleanup: {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002629" call Decho("cleanup",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002630 if s:FileReadable(tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002631" call Decho("tmpfile<".tmpfile."> readable, will now delete it",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002632 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002633 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002634 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002635
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002636 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002637 " restore modifiability; usually equivalent to set nomod
2638 let &mod= mod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002639" 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 +02002640 elseif !exists("leavemod")
2641 " indicate that the buffer has not been modified since last written
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002642" call Decho("set nomod",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01002643 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002644" 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 +00002645 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002646
Bram Moolenaar9964e462007-05-05 17:54:07 +00002647" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002648endfun
2649
2650" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002651" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002652" uses NetRead to get a copy of the file into a temporarily file,
2653" then sources that file,
2654" then removes that file.
2655fun! netrw#NetSource(...)
2656" call Dfunc("netrw#NetSource() a:0=".a:0)
2657 if a:0 > 0 && a:1 == '?'
2658 " give help
2659 echomsg 'NetSource Usage:'
2660 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
2661 echomsg ':Nsource fetch://machine/path uses fetch'
2662 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02002663 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002664 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
2665 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
2666 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
2667 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
2668 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002669 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002670 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002671 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002672 call netrw#NetRead(3,a:{i})
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002673" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002674 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002675" call Decho("exe so ".fnameescape(s:netrw_tmpfile),'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002676 exe "so ".fnameescape(s:netrw_tmpfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002677" call Decho("delete(".s:netrw_tmpfile.")",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01002678 if delete(s:netrw_tmpfile)
2679 call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".s:netrw_tmpfile.">!",103)
2680 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002681 unlet s:netrw_tmpfile
2682 else
2683 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
2684 endif
2685 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002686 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00002687 endif
2688" call Dret("netrw#NetSource")
2689endfun
2690
Bram Moolenaar8d043172014-01-23 14:24:41 +01002691" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01002692" netrw#SetTreetop: resets the tree top to the current directory/specified directory {{{2
2693" (implements the :Ntree command)
2694fun! netrw#SetTreetop(...)
2695" call Dfunc("netrw#SetTreetop(".((a:0 > 0)? a:1 : "").") a:0=".a:0)
2696
Bram Moolenaar8d043172014-01-23 14:24:41 +01002697 " clear out the current tree
2698 if exists("w:netrw_treetop")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002699" call Decho("clearing out current tree",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002700 let inittreetop= w:netrw_treetop
2701 unlet w:netrw_treetop
2702 endif
2703 if exists("w:netrw_treedict")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002704" call Decho("freeing w:netrw_treedict",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002705 unlet w:netrw_treedict
2706 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01002707
2708 if a:1 == "" && exists("inittreetop")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002709 let treedir= s:NetrwTreePath(inittreetop)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002710" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002711 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002712 if isdirectory(s:NetrwFile(a:1))
2713" call Decho("a:1<".a:1."> is a directory",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002714 let treedir= a:1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002715 elseif exists("b:netrw_curdir") && (isdirectory(s:NetrwFile(b:netrw_curdir."/".a:1)) || a:1 =~ '^\a\{3,}://')
Bram Moolenaar8d043172014-01-23 14:24:41 +01002716 let treedir= b:netrw_curdir."/".a:1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002717" call Decho("a:1<".a:1."> is NOT a directory, trying treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01002718 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002719 " normally the cursor is left in the message window.
2720 " However, here this results in the directory being listed in the message window, which is not wanted.
2721 let netrwbuf= bufnr("%")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002722 call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002723 exe bufwinnr(netrwbuf)."wincmd w"
Bram Moolenaara6878372014-03-22 21:02:50 +01002724 let treedir= "."
Bram Moolenaar8d043172014-01-23 14:24:41 +01002725 endif
2726 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002727" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
2728 let islocal= expand("%") !~ '^\a\{3,}://'
2729" call Decho("islocal=".islocal,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01002730 if islocal
2731 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(islocal,treedir))
2732 else
2733 call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,treedir))
2734 endif
2735" call Dret("netrw#SetTreetop")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002736endfun
2737
Bram Moolenaar9964e462007-05-05 17:54:07 +00002738" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00002739" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002740" readcmd == %r : replace buffer with newly read file
2741" == 0r : read file at top of buffer
2742" == r : read file after current line
2743" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002744fun! s:NetrwGetFile(readcmd, tfile, method)
2745" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002746
2747 " readcmd=='t': simply do nothing
2748 if a:readcmd == 't'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002749" 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 +00002750" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002751 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002752 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002753
Bram Moolenaar9964e462007-05-05 17:54:07 +00002754 " get name of remote filename (ie. url and all)
2755 let rfile= bufname("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002756" call Decho("rfile<".rfile.">",'~'.expand("<slnum>"))
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002757
Bram Moolenaar9964e462007-05-05 17:54:07 +00002758 if exists("*NetReadFixup")
2759 " for the use of NetReadFixup (not otherwise used internally)
2760 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002761 endif
2762
Bram Moolenaar9964e462007-05-05 17:54:07 +00002763 if a:readcmd[0] == '%'
2764 " get file into buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002765" call Decho("get file into buffer",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002766
2767 " rename the current buffer to the temp file (ie. tfile)
2768 if g:netrw_cygwin
Bram Moolenaar8d043172014-01-23 14:24:41 +01002769 let tfile= substitute(a:tfile,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00002770 else
2771 let tfile= a:tfile
2772 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002773" call Decho("exe sil! keepalt file ".fnameescape(tfile),'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002774 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002775
2776 " edit temporary file (ie. read the temporary file in)
2777 if rfile =~ '\.zip$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002778" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002779 call zip#Browse(tfile)
2780 elseif rfile =~ '\.tar$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002781" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002782 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002783 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002784" call Decho("handling remote gzip-compressed tar file",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002785 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002786 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002787" call Decho("handling remote bz2-compressed tar file",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002788 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002789 elseif rfile =~ '\.tar\.xz$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002790" call Decho("handling remote xz-compressed tar file",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002791 call tar#Browse(tfile)
2792 elseif rfile =~ '\.txz$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002793" call Decho("handling remote xz-compressed tar file (.txz)",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002794 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002795 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002796" call Decho("edit temporary file",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002797 NetrwKeepj e!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002798 endif
2799
2800 " rename buffer back to remote filename
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002801" call Decho("exe sil! keepalt file ".fnameescape(rfile),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002802 exe "sil! NetrwKeepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002803
Bram Moolenaar97d62492012-11-15 21:28:22 +01002804 " Detect filetype of local version of remote file.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002805 " Note that isk must not include a "/" for scripts.vim
2806 " to process this detection correctly.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002807" call Decho("detect filetype of local version of remote file",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01002808 let iskkeep= &l:isk
2809 setl isk-=/
Bram Moolenaar97d62492012-11-15 21:28:22 +01002810 let &l:isk= iskkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00002811" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
2812 let line1 = 1
2813 let line2 = line("$")
2814
Bram Moolenaar8d043172014-01-23 14:24:41 +01002815 elseif !&ma
2816 " 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 +01002817 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"attempt to read<".a:tfile."> into a non-modifiable buffer!",94)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002818" call Dret("NetrwGetFile : attempt to read<".a:tfile."> into a non-modifiable buffer!")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002819 return
2820
Bram Moolenaar9964e462007-05-05 17:54:07 +00002821 elseif s:FileReadable(a:tfile)
2822 " read file after current line
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002823" call Decho("read file<".a:tfile."> after current line",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002824 let curline = line(".")
2825 let lastline= line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002826" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002827 exe "NetrwKeepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002828 let line1= curline + 1
2829 let line2= line("$") - lastline + 1
2830
2831 else
2832 " not readable
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002833" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
2834" call Decho("tfile<".a:tfile."> not readable",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002835 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002836" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002837 return
2838 endif
2839
2840 " User-provided (ie. optional) fix-it-up command
2841 if exists("*NetReadFixup")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002842" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002843 NetrwKeepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002844" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002845" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002846 endif
2847
Bram Moolenaaradc21822011-04-01 18:03:16 +02002848 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00002849 " update the Buffers menu
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002850 NetrwKeepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002851 endif
2852
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002853" 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 +00002854
2855 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00002856" redraw!
2857
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002858" 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 +00002859" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002860endfun
2861
Bram Moolenaar9964e462007-05-05 17:54:07 +00002862" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002863" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01002864" Input:
2865" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
2866" Output:
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002867" b:netrw_method= 1: rcp
2868" 2: ftp + <.netrc>
2869" 3: ftp + machine, id, password, and [path]filename
2870" 4: scp
2871" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002872" 6: dav
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002873" 7: rsync
2874" 8: fetch
2875" 9: sftp
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002876" 10: file
Bram Moolenaar5c736222010-01-06 20:54:52 +01002877" g:netrw_machine= hostname
2878" b:netrw_fname = filename
2879" g:netrw_port = optional port number (for ftp)
2880" g:netrw_choice = copy of input url (choice)
2881fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002882" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002883
Bram Moolenaar251e1912011-06-19 05:09:16 +02002884 " sanity check: choice should have at least three slashes in it
2885 if strlen(substitute(a:choice,'[^/]','','g')) < 3
2886 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
2887 let b:netrw_method = -1
2888" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
2889 return
2890 endif
2891
Bram Moolenaar5c736222010-01-06 20:54:52 +01002892 " record current g:netrw_machine, if any
2893 " curmachine used if protocol == ftp and no .netrc
2894 if exists("g:netrw_machine")
2895 let curmachine= g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002896" call Decho("curmachine<".curmachine.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01002897 else
2898 let curmachine= "N O T A HOST"
2899 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002900 if exists("g:netrw_port")
2901 let netrw_port= g:netrw_port
2902 endif
2903
2904 " insure that netrw_ftp_cmd starts off every method determination
2905 " with the current g:netrw_ftp_cmd
2906 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002907
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002908 " initialization
2909 let b:netrw_method = 0
2910 let g:netrw_machine = ""
2911 let b:netrw_fname = ""
2912 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002913 let g:netrw_choice = a:choice
2914
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002915 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002916 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00002917 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
2918 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002919 " rcpurm : rcp://[user@]host/filename Use rcp
2920 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002921 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002922 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01002923 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002924 " rsyncurm : rsync://host[:port]/path Use rsync
2925 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2926 " sftpurm : sftp://[user@]host/filename Use scp
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002927 " fileurm : file://[user@]host/filename Use elinks or links
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002928 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2929 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002930 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2931 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002932 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002933 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002934 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002935 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002936 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002937 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002938 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01002939 let fileurm = '^file\=://\(.*\)$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002940
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002941" call Decho("determine method:",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002942 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02002943 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002944 if match(a:choice,rcpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002945" call Decho("rcp://...",'~'.expand("<slnum>"))
Bram Moolenaar83bab712005-08-01 21:58:57 +00002946 let b:netrw_method = 1
2947 let userid = substitute(a:choice,rcpurm,'\1',"")
2948 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2949 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002950 if userid != ""
2951 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002952 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002953
Bram Moolenaaradc21822011-04-01 18:03:16 +02002954 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002955 elseif match(a:choice,scpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002956" call Decho("scp://...",'~'.expand("<slnum>"))
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002957 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002958 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2959 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2960 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002961
Bram Moolenaar15146672011-10-20 22:22:38 +02002962 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002963 elseif match(a:choice,httpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002964" call Decho("http[s]://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002965 let b:netrw_method = 5
2966 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2967 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaara6878372014-03-22 21:02:50 +01002968 let b:netrw_http = (a:choice =~ '^https:')? "https" : "http"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002969
Bram Moolenaaradc21822011-04-01 18:03:16 +02002970 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002971 elseif match(a:choice,davurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002972" call Decho("dav://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002973 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02002974 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002975 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2976 else
2977 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2978 endif
2979 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002980
Bram Moolenaaradc21822011-04-01 18:03:16 +02002981 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002982 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002983" call Decho("rsync://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002984 let b:netrw_method = 7
2985 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2986 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002987
Bram Moolenaaradc21822011-04-01 18:03:16 +02002988 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002989 elseif match(a:choice,ftpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002990" call Decho("ftp://...",'~'.expand("<slnum>"))
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002991 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002992 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2993 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2994 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01002995" call Decho("g:netrw_machine<".g:netrw_machine.">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002996 if userid != ""
2997 let g:netrw_uid= userid
2998 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002999
Bram Moolenaaradc21822011-04-01 18:03:16 +02003000 if curmachine != g:netrw_machine
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003001 if exists("s:netwr_hup[".g:netrw_machine."]")
3002 call NetUserPass("ftp:".g:netrw_machine)
3003 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003004 " if there's a change in hostname, require password re-entry
3005 unlet s:netrw_passwd
3006 endif
3007 if exists("netrw_port")
3008 unlet netrw_port
3009 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003010 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003011
Bram Moolenaar446cb832008-06-24 21:56:24 +00003012 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003013 let b:netrw_method = 3
3014 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003015 let host= substitute(g:netrw_machine,'\..*$','','')
3016 if exists("s:netrw_hup[host]")
3017 call NetUserPass("ftp:".host)
3018
3019 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003020" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
3021" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003022 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
Bram Moolenaare6ae6222013-05-21 21:01:10 +02003023 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',g:netrw_machine,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003024" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003025 endif
3026 let b:netrw_method= 2
3027 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003028" call Decho("using <".expand("$HOME/.netrc")."> (readable)",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003029 let b:netrw_method= 2
3030 else
3031 if !exists("g:netrw_uid") || g:netrw_uid == ""
3032 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003033 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003034 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003035 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003036 endif
3037 let b:netrw_method= 3
3038 endif
3039 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003040
Bram Moolenaaradc21822011-04-01 18:03:16 +02003041 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003042 elseif match(a:choice,fetchurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003043" call Decho("fetch://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003044 let b:netrw_method = 8
3045 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3046 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3047 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3048 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003049
Bram Moolenaaradc21822011-04-01 18:03:16 +02003050 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003051 elseif match(a:choice,mipf) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003052" call Decho("(ftp) host id pass file",'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00003053 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003054 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3055 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003056 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003057 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003058 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003059
Bram Moolenaaradc21822011-04-01 18:03:16 +02003060 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003061 elseif match(a:choice,mf) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003062" call Decho("(ftp) host file",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003063 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003064 let b:netrw_method = 3
3065 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3066 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003067
Bram Moolenaar9964e462007-05-05 17:54:07 +00003068 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003069 let b:netrw_method = 2
3070 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3071 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3072 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003073
Bram Moolenaaradc21822011-04-01 18:03:16 +02003074 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003075 elseif match(a:choice,sftpurm) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003076" call Decho("sftp://...",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003077 let b:netrw_method = 9
3078 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3079 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003080
Bram Moolenaaradc21822011-04-01 18:03:16 +02003081 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003082 elseif match(a:choice,rcphf) == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003083" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003084 let b:netrw_method = 1
3085 let userid = substitute(a:choice,rcphf,'\2',"")
3086 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
3087 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003088" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">",'~'.expand("<slnum>"))
3089" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">",'~'.expand("<slnum>"))
3090" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">",'~'.expand("<slnum>"))
3091" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">",'~'.expand("<slnum>"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003092 if userid != ""
3093 let g:netrw_uid= userid
3094 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003095
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003096 " Method#10: file://user@hostname/...path-to-file {{{3
3097 elseif match(a:choice,fileurm) == 0 && exists("g:netrw_file_cmd")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003098" call Decho("http[s]://...",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003099 let b:netrw_method = 10
3100 let b:netrw_fname = substitute(a:choice,fileurm,'\1',"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003101" call Decho('\1<'.substitute(a:choice,fileurm,'\1',"").">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003102
Bram Moolenaaradc21822011-04-01 18:03:16 +02003103 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003104 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003105 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003106 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003107 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003108 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003109 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003110 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00003111
Bram Moolenaar81695252004-12-29 20:58:21 +00003112 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02003113 " remove any leading [:#] from port number
3114 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3115 elseif exists("netrw_port")
3116 " retain port number as implicit for subsequent ftp operations
3117 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00003118 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003119
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003120" call Decho("a:choice <".a:choice.">",'~'.expand("<slnum>"))
3121" call Decho("b:netrw_method <".b:netrw_method.">",'~'.expand("<slnum>"))
3122" call Decho("g:netrw_machine<".g:netrw_machine.">",'~'.expand("<slnum>"))
3123" call Decho("g:netrw_port <".g:netrw_port.">",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003124" if exists("g:netrw_uid") "Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003125" call Decho("g:netrw_uid <".g:netrw_uid.">",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003126" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00003127" if exists("s:netrw_passwd") "Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003128" call Decho("s:netrw_passwd <".s:netrw_passwd.">",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003129" endif "Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003130" call Decho("b:netrw_fname <".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003131" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00003132endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003133
3134" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003135" NetReadFixup: this sort of function is typically written by the user {{{2
3136" to handle extra junk that their system's ftp dumps
3137" into the transfer. This function is provided as an
3138" example and as a fix for a Windows 95 problem: in my
3139" experience, win95's ftp always dumped four blank lines
3140" at the end of the transfer.
3141if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
3142 fun! NetReadFixup(method, line1, line2)
3143" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003144
3145 " sanity checks -- attempt to convert inputs to integers
3146 let method = a:method + 0
3147 let line1 = a:line1 + 0
3148 let line2 = a:line2 + 0
3149 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
3150" call Dret("NetReadFixup")
3151 return
3152 endif
3153
Bram Moolenaar9964e462007-05-05 17:54:07 +00003154 if method == 3 " ftp (no <.netrc>)
3155 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003156 if fourblanklines >= line1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003157 exe "sil NetrwKeepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003158 call histdel("/",-1)
3159 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003160 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003161
Bram Moolenaar9964e462007-05-05 17:54:07 +00003162" call Dret("NetReadFixup")
3163 endfun
3164endif
3165
3166" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00003167" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003168" Usage: :call NetUserPass() -- will prompt for userid and password
3169" :call NetUserPass("uid") -- will prompt for password
3170" :call NetUserPass("uid","password") -- sets global userid and password
3171" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
3172" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00003173fun! NetUserPass(...)
3174
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003175" call Dfunc("NetUserPass() a:0=".a:0)
3176
3177 if !exists('s:netrw_hup')
3178 let s:netrw_hup= {}
3179 endif
3180
Bram Moolenaar071d4272004-06-13 20:20:40 +00003181 if a:0 == 0
Bram Moolenaar97d62492012-11-15 21:28:22 +01003182 " case: no input arguments
3183
3184 " change host and username if not previously entered; get new password
3185 if !exists("g:netrw_machine")
3186 let g:netrw_machine= input('Enter hostname: ')
3187 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003188 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01003189 " get username (user-id) via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00003190 let g:netrw_uid= input('Enter username: ')
3191 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003192 " get password via prompting
Bram Moolenaar446cb832008-06-24 21:56:24 +00003193 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003194
3195 " set up hup database
3196 let host = substitute(g:netrw_machine,'\..*$','','')
3197 if !exists('s:netrw_hup[host]')
3198 let s:netrw_hup[host]= {}
3199 endif
3200 let s:netrw_hup[host].uid = g:netrw_uid
3201 let s:netrw_hup[host].passwd = s:netrw_passwd
3202
3203 elseif a:0 == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01003204 " case: one input argument
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003205
3206 if a:1 =~ '^ftp:'
Bram Moolenaar97d62492012-11-15 21:28:22 +01003207 " get host from ftp:... url
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003208 " access userid and password from hup (host-user-passwd) dictionary
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003209" call Decho("case a:0=1: a:1<".a:1."> (get host from ftp:... url)",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003210 let host = substitute(a:1,'^ftp:','','')
3211 let host = substitute(host,'\..*','','')
3212 if exists("s:netrw_hup[host]")
3213 let g:netrw_uid = s:netrw_hup[host].uid
3214 let s:netrw_passwd = s:netrw_hup[host].passwd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003215" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">",'~'.expand("<slnum>"))
3216" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003217 else
3218 let g:netrw_uid = input("Enter UserId: ")
3219 let s:netrw_passwd = inputsecret("Enter Password: ")
3220 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003221
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003222 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01003223 " case: one input argument, not an url. Using it as a new user-id.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003224" 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 +02003225 if exists("g:netrw_machine")
Bram Moolenaara6878372014-03-22 21:02:50 +01003226 if g:netrw_machine =~ '[0-9.]\+'
3227 let host= g:netrw_machine
3228 else
3229 let host= substitute(g:netrw_machine,'\..*$','','')
3230 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003231 else
3232 let g:netrw_machine= input('Enter hostname: ')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003233 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003234 let g:netrw_uid = a:1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003235" call Decho("set g:netrw_uid= <".g:netrw_uid.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01003236 if exists("g:netrw_passwd")
3237 " ask for password if one not previously entered
3238 let s:netrw_passwd= g:netrw_passwd
3239 else
3240 let s:netrw_passwd = inputsecret("Enter Password: ")
3241 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003242 endif
3243
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003244" call Decho("host<".host.">",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003245 if exists("host")
3246 if !exists('s:netrw_hup[host]')
3247 let s:netrw_hup[host]= {}
3248 endif
3249 let s:netrw_hup[host].uid = g:netrw_uid
3250 let s:netrw_hup[host].passwd = s:netrw_passwd
3251 endif
3252
3253 elseif a:0 == 2
3254 let g:netrw_uid = a:1
3255 let s:netrw_passwd = a:2
3256
3257 elseif a:0 == 3
3258 " enter hostname, user-id, and password into the hup dictionary
3259 let host = substitute(a:1,'^\a\+:','','')
3260 let host = substitute(host,'\..*$','','')
3261 if !exists('s:netrw_hup[host]')
3262 let s:netrw_hup[host]= {}
3263 endif
3264 let s:netrw_hup[host].uid = a:2
3265 let s:netrw_hup[host].passwd = a:3
3266 let g:netrw_uid = s:netrw_hup[host].uid
3267 let s:netrw_passwd = s:netrw_hup[host].passwd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003268" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">",'~'.expand("<slnum>"))
3269" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">",'~'.expand("<slnum>"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00003270 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00003271
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003272" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003273endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003274
Bram Moolenaar9964e462007-05-05 17:54:07 +00003275" ===========================================
3276" Shared Browsing Support: {{{1
3277" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00003278
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003279" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003280" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
3281fun! s:ExplorePatHls(pattern)
3282" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
3283 let repat= substitute(a:pattern,'^**/\{1,2}','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003284" call Decho("repat<".repat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003285 let repat= escape(repat,'][.\')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003286" call Decho("repat<".repat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003287 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
3288" call Dret("s:ExplorePatHls repat<".repat.">")
3289 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00003290endfun
3291
3292" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003293" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003294" 0: (user: <mb>) bookmark current directory
3295" 1: (user: <gb>) change to the bookmarked directory
3296" 2: (user: <qb>) list bookmarks
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003297" 3: (browsing) records current directory history
3298" 4: (user: <u>) go up (previous) directory, using history
3299" 5: (user: <U>) go down (next) directory, using history
Bram Moolenaar446cb832008-06-24 21:56:24 +00003300" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01003301fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003302" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax)
Bram Moolenaarff034192013-04-24 18:51:19 +02003303 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3304" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
3305 return
3306 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003307
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003308 let ykeep = @@
3309 let curbufnr = bufnr("%")
3310
Bram Moolenaar9964e462007-05-05 17:54:07 +00003311 if a:chg == 0
3312 " bookmark the current directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003313" call Decho("(user: <b>) bookmark the current directory",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003314 if exists("s:netrwmarkfilelist_{curbufnr}")
3315 call s:NetrwBookmark(0)
3316 echo "bookmarked marked files"
3317 else
3318 call s:MakeBookmark(a:curdir)
3319 echo "bookmarked the current directory"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003320 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003321
3322 elseif a:chg == 1
3323 " change to the bookmarked directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003324" call Decho("(user: <".v:count."gb>) change to the bookmarked directory",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003325 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003326" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003327 exe "NetrwKeepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00003328 else
3329 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3330 endif
3331
3332 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003333" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00003334 let didwork= 0
3335 " list user's bookmarks
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003336" call Decho("(user: <q>) list user's bookmarks",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003337 if exists("g:netrw_bookmarklist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003338" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003339 let cnt= 1
3340 for bmd in g:netrw_bookmarklist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003341" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1],'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02003342 echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
Bram Moolenaar5c736222010-01-06 20:54:52 +01003343 let didwork = 1
3344 let cnt = cnt + 1
3345 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00003346 endif
3347
3348 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01003349 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00003350 let first = 1
3351 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003352 if g:netrw_dirhistmax > 0
3353 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003354" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003355 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003356" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt},'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02003357 echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003358 let didwork= 1
3359 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003360 let histcnt = histcnt + 1
3361 let first = 0
3362 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003363 if cnt < 0
3364 let cnt= cnt + g:netrw_dirhistmax
3365 endif
3366 endwhile
3367 else
3368 let g:netrw_dirhist_cnt= 0
3369 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003370 if didwork
3371 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3372 endif
3373
3374 elseif a:chg == 3
3375 " saves most recently visited directories (when they differ)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003376" call Decho("(browsing) record curdir history",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003377 if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003378 if g:netrw_dirhistmax > 0
3379 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3380 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
3381 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003382" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003383 endif
3384
3385 elseif a:chg == 4
3386 " u: change to the previous directory stored on the history list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003387" call Decho("(user: <u>) chg to prev dir from history",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003388 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003389 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003390 if g:netrw_dirhist_cnt < 0
3391 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3392 endif
3393 else
3394 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003395 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003396 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003397" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003398 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003399 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003400" call Decho("setl ma noro",'~'.expand("<slnum>"))
3401 sil! NetrwKeepj %d _
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003402 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003403" call Decho("setl nomod",'~'.expand("<slnum>"))
3404" 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 +00003405 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003406" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003407 exe "NetrwKeepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00003408 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003409 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003410 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003411 else
3412 let g:netrw_dirhist_cnt= 0
3413 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003414 echo "Sorry, no predecessor directory exists yet"
3415 endif
3416
3417 elseif a:chg == 5
3418 " U: change to the subsequent directory stored on the history list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003419" call Decho("(user: <U>) chg to next dir from history",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003420 if g:netrw_dirhistmax > 0
3421 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3422 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003423" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003424 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003425" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003426 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003427 sil! NetrwKeepj %d _
3428" call Decho("removed all lines from buffer (%d)",'~'.expand("<slnum>"))
3429" call Decho("setl nomod",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003430 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003431" 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 +02003432 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003433" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003434 exe "NetrwKeepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003435 else
3436 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
3437 if g:netrw_dirhist_cnt < 0
3438 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3439 endif
3440 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003441 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003442 else
3443 let g:netrw_dirhist_cnt= 0
3444 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003445 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003446
3447 elseif a:chg == 6
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003448" call Decho("(user: <mB>) delete bookmark'd directory",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003449 if exists("s:netrwmarkfilelist_{curbufnr}")
3450 call s:NetrwBookmark(1)
3451 echo "removed marked files from bookmarks"
3452 else
3453 " delete the v:count'th bookmark
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003454 let iremove = v:count
3455 let dremove = g:netrw_bookmarklist[iremove - 1]
3456" call Decho("delete bookmark#".iremove."<".g:netrw_bookmarklist[iremove - 1].">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003457 call s:MergeBookmarks()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003458" call Decho("remove g:netrw_bookmarklist[".(iremove-1)."]<".g:netrw_bookmarklist[(iremove-1)].">",'~'.expand("<slnum>"))
3459 NetrwKeepj call remove(g:netrw_bookmarklist,iremove-1)
3460 echo "removed ".dremove." from g:netrw_bookmarklist"
3461" call Decho("g:netrw_bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003462 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003463" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003464 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003465 call s:NetrwBookmarkMenu()
Bram Moolenaarff034192013-04-24 18:51:19 +02003466 call s:NetrwTgtMenu()
Bram Moolenaar97d62492012-11-15 21:28:22 +01003467 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003468" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003469endfun
3470
3471" ---------------------------------------------------------------------
3472" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003473" Will source the history file (.netrwhist) only if the g:netrw_disthistmax is > 0.
Bram Moolenaar5c736222010-01-06 20:54:52 +01003474" Sister function: s:NetrwBookHistSave()
3475fun! s:NetrwBookHistRead()
3476" call Dfunc("s:NetrwBookHistRead()")
Bram Moolenaarff034192013-04-24 18:51:19 +02003477 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3478" " call Dret("s:NetrwBookHistRead - suppressed due to g:netrw_dirhistmax")
3479 return
3480 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003481 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01003482 if !exists("s:netrw_initbookhist")
3483 let home = s:NetrwHome()
3484 let savefile= home."/.netrwbook"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003485 if filereadable(s:NetrwFile(savefile))
3486" call Decho("sourcing .netrwbook",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003487 exe "keepalt NetrwKeepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003488 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003489 if g:netrw_dirhistmax > 0
3490 let savefile= home."/.netrwhist"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003491 if filereadable(s:NetrwFile(savefile))
3492" call Decho("sourcing .netrwhist",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003493 exe "keepalt NetrwKeepj so ".savefile
Bram Moolenaaradc21822011-04-01 18:03:16 +02003494 endif
3495 let s:netrw_initbookhist= 1
3496 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003497 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003498 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003499 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01003500" call Dret("s:NetrwBookHistRead")
3501endfun
3502
3503" ---------------------------------------------------------------------
3504" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
3505" Sister function: s:NetrwBookHistRead()
3506" I used to do this via viminfo but that appears to
3507" be unreliable for long-term storage
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003508" If g:netrw_dirhistmax is <= 0, no history or bookmarks
3509" will be saved.
Bram Moolenaar5c736222010-01-06 20:54:52 +01003510fun! s:NetrwBookHistSave()
3511" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaarff034192013-04-24 18:51:19 +02003512 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003513" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
3514 return
3515 endif
3516
Bram Moolenaar5c736222010-01-06 20:54:52 +01003517 let savefile= s:NetrwHome()."/.netrwhist"
3518 1split
3519 call s:NetrwEnew()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003520 if g:netrw_use_noswf
3521 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
3522 else
3523 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000
3524 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003525 setl nocin noai noci magic nospell nohid wig= noaw
3526 setl ma noro write
3527 if exists("+acd") | setl noacd | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003528 sil! NetrwKeepj keepalt %d _
Bram Moolenaar5c736222010-01-06 20:54:52 +01003529
3530 " save .netrwhist -- no attempt to merge
Bram Moolenaarff034192013-04-24 18:51:19 +02003531 sil! keepalt file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01003532 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
3533 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
3534 let lastline = line("$")
3535 let cnt = 1
3536 while cnt <= g:netrw_dirhist_cnt
3537 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
3538 let cnt= cnt + 1
3539 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003540 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003541
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003542 sil NetrwKeepj %d _
Bram Moolenaar5c736222010-01-06 20:54:52 +01003543 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3544 " merge and write .netrwbook
3545 let savefile= s:NetrwHome()."/.netrwbook"
3546
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003547 if filereadable(s:NetrwFile(savefile))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003548 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003549 exe "sil NetrwKeepj keepalt so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003550 for bdm in booklist
3551 if index(g:netrw_bookmarklist,bdm) == -1
3552 call add(g:netrw_bookmarklist,bdm)
3553 endif
3554 endfor
3555 call sort(g:netrw_bookmarklist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003556 endif
3557
3558 " construct and save .netrwbook
3559 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003560 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003561 endif
3562 let bgone= bufnr("%")
3563 q!
Bram Moolenaarff034192013-04-24 18:51:19 +02003564 exe "keepalt ".bgone."bwipe!"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003565
3566" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003567endfun
3568
3569" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003570" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
3571" list of the contents of a local or remote directory. It is assumed that the
3572" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
3573" with the requested remote hostname first.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003574" Often called via: Explore/e dirname/etc -> netrw#LocalBrowseCheck() -> s:NetrwBrowse()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003575fun! s:NetrwBrowse(islocal,dirname)
3576 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003577" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003578" call Decho("modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
3579" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003580" call Dredir("ls!")
Bram Moolenaara6878372014-03-22 21:02:50 +01003581
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003582 " save alternate-file's filename if w:netrw_rexlocal doesn't exist
3583 " This is useful when one edits a local file, then :e ., then :Rex
3584 if a:islocal && !exists("w:netrw_rexfile") && bufname("#") != ""
3585 let w:netrw_rexfile= bufname("#")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003586" call Decho("setting w:netrw_rexfile<".w:netrw_rexfile."> win#".winnr())
Bram Moolenaar5c736222010-01-06 20:54:52 +01003587 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003588
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003589 " s:NetrwBrowse : initialize history {{{3
3590 if !exists("s:netrw_initbookhist")
3591 NetrwKeepj call s:NetrwBookHistRead()
3592 endif
3593
3594 " s:NetrwBrowse : simplify the dirname (especially for ".."s in dirnames) {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003595 if a:dirname !~ '^\a\{3,}://'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003596 let dirname= simplify(a:dirname)
3597 else
3598 let dirname= a:dirname
3599 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003600
3601 if exists("s:netrw_skipbrowse")
3602 unlet s:netrw_skipbrowse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003603" 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 +01003604" call Dret("s:NetrwBrowse : s:netrw_skipbrowse existed")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003605 return
3606 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003607
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003608 " s:NetrwBrowse : sanity checks: {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003609 if !exists("*shellescape")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003610 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003611" call Dret("s:NetrwBrowse : missing shellescape()")
3612 return
3613 endif
3614 if !exists("*fnameescape")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003615 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003616" call Dret("s:NetrwBrowse : missing fnameescape()")
3617 return
3618 endif
3619
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003620 " s:NetrwBrowse : save options: {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003621 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003622
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003623 " s:NetrwBrowse : re-instate any marked files {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003624 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003625" call Decho("clearing marked files",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003626 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3627 endif
3628
3629 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003630 " s:NetrwBrowse : set up "safe" options for local directory/file {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003631" call Decho("handle w:netrw_acdkeep:",'~'.expand("<slnum>"))
3632" call Decho("NetrwKeepj lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01003633 call s:NetrwLcd(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003634 call s:NetrwSafeOptions()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003635" call Decho("getcwd<".getcwd().">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003636
Bram Moolenaar5c736222010-01-06 20:54:52 +01003637 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003638 " s:NetrwBrowse : remote regular file handler {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003639" call Decho("handle remote regular file: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003640 if bufname(dirname) != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003641" call Decho("edit buf#".bufname(dirname)." in win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003642 exe "NetrwKeepj b ".bufname(dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +01003643 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003644 " attempt transfer of remote regular file
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003645" call Decho("attempt transfer as regular file<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003646
3647 " remove any filetype indicator from end of dirname, except for the
3648 " "this is a directory" indicator (/).
3649 " There shouldn't be one of those here, anyway.
3650 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003651" call Decho("new path<".path.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003652 call s:RemotePathAnalysis(dirname)
3653
3654 " s:NetrwBrowse : remote-read the requested file into current buffer {{{3
3655 call s:NetrwEnew(dirname)
3656 call s:NetrwSafeOptions()
3657 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003658" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003659 let b:netrw_curdir = dirname
3660 let url = s:method."://".((s:user == "")? "" : s:user."@").s:machine.(s:port ? ":".s:port : "")."/".s:path
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003661" call Decho("exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003662 exe "sil! NetrwKeepj keepalt file ".fnameescape(url)
3663 exe "sil! NetrwKeepj keepalt doau BufReadPre ".fnameescape(s:fname)
3664 sil call netrw#NetRead(2,url)
3665 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003666" call Decho("url<".url.">",'~'.expand("<slnum>"))
3667" call Decho("s:path<".s:path.">",'~'.expand("<slnum>"))
3668" call Decho("s:fname<".s:fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003669 if s:path =~ '.bz2'
3670 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.bz2$','',''))
3671 elseif s:path =~ '.gz'
3672 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.gz$','',''))
3673 elseif s:path =~ '.gz'
3674 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.txz$','',''))
3675 else
3676 exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(s:fname)
3677 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003678 endif
3679
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003680 " s:NetrwBrowse : save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003681 call s:SetBufWinVars()
3682 call s:NetrwOptionRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003683" call Decho("setl ma nomod",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003684 setl ma nomod noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003685" 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 +00003686
Bram Moolenaar446cb832008-06-24 21:56:24 +00003687" call Dret("s:NetrwBrowse : file<".s:fname.">")
3688 return
3689 endif
3690
Bram Moolenaaradc21822011-04-01 18:03:16 +02003691 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003692 call s:UseBufWinVars()
3693
3694 " set up some variables {{{3
3695 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003696 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003697 let s:last_sort_by = g:netrw_sort_by
3698
3699 " set up menu {{{3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003700 NetrwKeepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003701
Bram Moolenaar97d62492012-11-15 21:28:22 +01003702 " get/set-up buffer {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003703" call Decho("saving position across a buffer refresh",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003704 let svpos = winsaveview()
3705" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003706 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003707
Bram Moolenaar446cb832008-06-24 21:56:24 +00003708 " maintain markfile highlighting
3709 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003710" call Decho("bufnr(%)=".bufnr('%'),'~'.expand("<slnum>"))
3711" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003712 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3713 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003714" call Decho("2match none",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003715 2match none
3716 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003717 if reusing && line("$") > 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003718 call s:NetrwOptionRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003719" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003720 setl noma nomod nowrap
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003721" 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 +01003722" call Dret("s:NetrwBrowse : re-using not-cleared buffer")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003723 return
3724 endif
3725
3726 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003727" call Decho("set b:netrw_curdir to the new directory name<".dirname."> (buf#".bufnr("%").")",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003728 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003729 if b:netrw_curdir =~ '[/\\]$'
3730 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
3731 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01003732 if b:netrw_curdir =~ '\a:$' && (has("win32") || has("win95") || has("win64") || has("win16"))
3733 let b:netrw_curdir= b:netrw_curdir."/"
3734 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003735 if b:netrw_curdir == ''
3736 if has("amiga")
3737 " On the Amiga, the empty string connotes the current directory
3738 let b:netrw_curdir= getcwd()
3739 else
3740 " under unix, when the root directory is encountered, the result
3741 " from the preceding substitute is an empty string.
3742 let b:netrw_curdir= '/'
3743 endif
3744 endif
3745 if !a:islocal && b:netrw_curdir !~ '/$'
3746 let b:netrw_curdir= b:netrw_curdir.'/'
3747 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003748" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003749
3750 " ------------
3751 " (local only) {{{3
3752 " ------------
3753 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003754" call Decho("local only:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003755
3756 " Set up ShellCmdPost handling. Append current buffer to browselist
3757 call s:LocalFastBrowser()
3758
3759 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
3760 if !g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003761" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
3762" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003763 if !exists("&l:acd") || !&l:acd
Bram Moolenaara6878372014-03-22 21:02:50 +01003764 call s:NetrwLcd(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003765 endif
3766 endif
3767
3768 " --------------------------------
3769 " remote handling: {{{3
3770 " --------------------------------
3771 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003772" call Decho("remote only:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003773
Bram Moolenaar97d62492012-11-15 21:28:22 +01003774 " analyze dirname and g:netrw_list_cmd {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003775" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003776 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003777 let dirname= b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003778" call Decho("(dirname was <NetrwTreeListing>) dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003779 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3780 let dirname= substitute(b:netrw_curdir,'\\','/','g')
3781 if dirname !~ '/$'
3782 let dirname= dirname.'/'
3783 endif
3784 let b:netrw_curdir = dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003785" call Decho("(liststyle is TREELIST) dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003786 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003787 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003788" call Decho("(normal) dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003789 endif
3790
3791 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
3792 if dirname !~ dirpat
3793 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003794 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003795 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003796 NetrwKeepj call s:NetrwOptionRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003797" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003798 setl noma nomod nowrap
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003799" 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 +00003800" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
3801 return
3802 endif
3803 let b:netrw_curdir= dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003804" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003805 endif " (additional remote handling)
3806
3807 " -----------------------
3808 " Directory Listing: {{{3
3809 " -----------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003810 NetrwKeepj call s:NetrwMaps(a:islocal)
3811 NetrwKeepj call s:NetrwCommands(a:islocal)
3812 NetrwKeepj call s:PerformListing(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003813
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003814 " restore option(s)
3815 call s:NetrwOptionRestore("w:")
3816" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
3817
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003818 " If there is a rexposn: restore position with rexposn
3819 " Otherwise : set rexposn
3820 if exists("s:rexposn_".bufnr("%"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003821" call Decho("restoring posn to s:rexposn_".bufnr('%')."<".string(s:rexposn_{bufnr('%')}).">",'~'.expand("<slnum>"))
3822 NetrwKeepj call winrestview(s:rexposn_{bufnr('%')})
3823 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
3824 NetrwKeepj exe w:netrw_bannercnt
3825 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003826 else
3827 NetrwKeepj call s:SetRexDir(a:islocal,b:netrw_curdir)
3828 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003829 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaara6878372014-03-22 21:02:50 +01003830 let &l:bexpr= "netrw#BalloonHelp()"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003831" call Decho("set up balloon help: l:bexpr=".&l:bexpr,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01003832 setl beval
Bram Moolenaaradc21822011-04-01 18:03:16 +02003833 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003834
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003835 " restore position
3836 if reusing
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003837" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
3838 call winrestview(svpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01003839 endif
3840
Bram Moolenaara6878372014-03-22 21:02:50 +01003841 " The s:LocalBrowseRefresh() function is called by an autocmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01003842 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
Bram Moolenaara6878372014-03-22 21:02:50 +01003843 " However, s:NetrwBrowse() causes the FocusGained event to fire the firstt time.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003844" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
3845" 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 +02003846" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003847 return
3848endfun
3849
3850" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003851" s:NetrwFile: because of g:netrw_keepdir, isdirectory(), type(), etc may or {{{2
3852" may not apply correctly; ie. netrw's idea of the current directory may
3853" differ from vim's. This function insures that netrw's idea of the current
3854" directory is used.
3855fun! s:NetrwFile(fname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003856" call Dfunc("s:NetrwFile(fname<".a:fname.">) win#".winnr())
3857" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'))
3858" call Decho("g:netrw_cygwin =".(exists("g:netrw_cygwin")? g:netrw_cygwin : 'n/a'))
3859" call Decho("g:netrw_liststyle=".(exists("g:netrw_liststyle")? g:netrw_liststyle : 'n/a'))
3860" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
3861
3862 " clean up any leading treedepthstring
3863 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3864 let fname= substitute(a:fname,'^'.s:treedepthstring.'\+','','')
3865" call Decho("clean up any leading treedepthstring: fname<".fname.">")
3866 else
3867 let fname= a:fname
3868 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003869
3870 if g:netrw_keepdir
3871 " vim's idea of the current directory possibly may differ from netrw's
3872 if !exists("b:netrw_curdir")
3873 let b:netrw_curdir= getcwd()
3874 endif
3875
3876 if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003877 if fname =~ '^\' || fname =~ '^\a:\'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003878 " windows, but full path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003879 let ret= fname
3880" call Decho("windows+full path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003881 else
3882 " windows, relative path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003883 let ret= s:ComposePath(b:netrw_curdir,fname)
3884" call Decho("windows+rltv path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003885 endif
3886
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003887 elseif fname =~ '^/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003888 " not windows, full path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003889 let ret= fname
3890" call Decho("unix+full path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003891 else
3892 " not windows, relative path given
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003893 let ret= s:ComposePath(b:netrw_curdir,fname)
3894" call Decho("unix+rltv path: isdirectory(".fname.")",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003895 endif
3896 else
3897 " vim and netrw agree on the current directory
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003898 let ret= fname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003899" call Decho("vim and netrw agree on current directory (g:netrw_keepdir=".g:netrw_keepdir.")",'~'.expand("<slnum>"))
3900 endif
3901
3902" call Dret("s:NetrwFile ".ret)
3903 return ret
3904endfun
3905
3906" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003907" s:NetrwFileInfo: supports qf (query for file information) {{{2
3908fun! s:NetrwFileInfo(islocal,fname)
Bram Moolenaar8d043172014-01-23 14:24:41 +01003909" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">) b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01003910 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00003911 if a:islocal
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003912 let lsopt= "-lsad"
3913 if g:netrw_sizestyle =~ 'H'
3914 let lsopt= "-lsadh"
3915 elseif g:netrw_sizestyle =~ 'h'
3916 let lsopt= "-lsadh --si"
3917 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003918 if (has("unix") || has("macunix")) && executable("/bin/ls")
Bram Moolenaar8d043172014-01-23 14:24:41 +01003919
3920 if getline(".") == "../"
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003921 echo system("/bin/ls ".lsopt." ".s:ShellEscape(".."))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003922" call Decho("#1: echo system(/bin/ls -lsad ".s:ShellEscape(..).")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003923
Bram Moolenaara6878372014-03-22 21:02:50 +01003924 elseif w:netrw_liststyle == s:TREELIST && getline(".") !~ '^'.s:treedepthstring
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003925 echo system("/bin/ls ".lsopt." ".s:ShellEscape(b:netrw_curdir))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003926" call Decho("#2: echo system(/bin/ls -lsad ".s:ShellEscape(b:netrw_curdir).")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003927
3928 elseif exists("b:netrw_curdir")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003929 echo system("/bin/ls ".lsopt." ".s:ShellEscape(s:ComposePath(b:netrw_curdir,a:fname)))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003930" call Decho("#3: echo system(/bin/ls -lsad ".s:ShellEscape(b:netrw_curdir.a:fname).")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003931
Bram Moolenaar446cb832008-06-24 21:56:24 +00003932 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003933" call Decho('using ls '.a:fname." using cwd<".getcwd().">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003934 echo system("/bin/ls ".lsopt." ".s:ShellEscape(s:NetrwFile(a:fname)))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003935" call Decho("#5: echo system(/bin/ls -lsad ".s:ShellEscape(a:fname).")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003936 endif
3937 else
3938 " use vim functions to return information about file below cursor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003939" call Decho("using vim functions to query for file info",'~'.expand("<slnum>"))
3940 if !isdirectory(s:NetrwFile(a:fname)) && !filereadable(s:NetrwFile(a:fname)) && a:fname =~ '[*@/]'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003941 let fname= substitute(a:fname,".$","","")
3942 else
3943 let fname= a:fname
3944 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003945 let t = getftime(s:NetrwFile(fname))
3946 let sz = getfsize(s:NetrwFile(fname))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01003947 if g:netrw_sizestyle =~ "[hH]"
3948 let sz= s:NetrwHumanReadable(sz)
3949 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003950 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(s:NetrwFile(fname)))
3951" call Decho("fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003952 endif
3953 else
3954 echo "sorry, \"qf\" not supported yet for remote files"
3955 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003956 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00003957" call Dret("s:NetrwFileInfo")
3958endfun
3959
3960" ---------------------------------------------------------------------
3961" s:NetrwGetBuffer: {{{2
3962" returns 0=cleared buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003963" 1=re-used buffer (buffer not cleared)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003964fun! s:NetrwGetBuffer(islocal,dirname)
3965" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003966" 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 +00003967 let dirname= a:dirname
3968
3969 " re-use buffer if possible {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003970" call Decho("--re-use a buffer if possible--",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003971 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3972 " find NetrwTreeList buffer if there is one
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003973" call Decho("case liststyle=treelist: find NetrwTreeList buffer if there is one",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003974 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003975" call Decho(" re-using w:netrw_treebufnr=".w:netrw_treebufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003976 let eikeep= &ei
Bram Moolenaara6878372014-03-22 21:02:50 +01003977 setl ei=all
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003978 exe "sil! keepj noswapfile keepalt b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00003979 let &ei= eikeep
Bram Moolenaar8d043172014-01-23 14:24:41 +01003980 setl ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003981 sil! NetrwKeepj %d _
3982" 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>"))
3983" 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 +02003984" call Dret("s:NetrwGetBuffer 0<buffer cleared> : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
3985 return 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003986 endif
3987 let bufnum= -1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003988" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003989
3990 else
3991 " find buffer number of buffer named precisely the same as dirname {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003992" call Decho("case listtyle not treelist: find buffer numnber of buffer named precisely the same as dirname--",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003993" call Dredir("(NetrwGetBuffer) ls!","ls!")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003994
3995 " get dirname and associated buffer number
3996 let bufnum = bufnr(escape(dirname,'\'))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01003997" call Decho(" find buffer<".dirname.">'s number ",'~'.expand("<slnum>"))
3998" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003999
4000 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004001 " try appending a trailing /
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004002" call Decho(" try appending a trailing / to dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004003 let bufnum= bufnr(escape(dirname.'/','\'))
4004 if bufnum > 0
4005 let dirname= dirname.'/'
4006 endif
4007 endif
4008
4009 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004010 " try removing a trailing /
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004011" call Decho(" try removing a trailing / from dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004012 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
4013 if bufnum > 0
4014 let dirname= substitute(dirname,'/$','','')
4015 endif
4016 endif
4017
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004018" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004019 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
4020 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
4021 " handle approximate matches
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004022" call Decho(" handling approx match: bufnum#".bufnum.">0 AND bufname<".bufname(bufnum).">!=dirname<".dirname."> AND bufname(".bufnum.")!='.'",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004023 let ibuf = 1
4024 let buflast = bufnr("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004025" call Decho(" findbuf2: buflast=bufnr($)=".buflast,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004026 while ibuf <= buflast
4027 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00004028 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004029" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004030 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
4031 " bname is not empty
4032 " dirname ends with bname,
4033 " dirname doesn't start with /, so its not a absolute path
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004034" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004035 break
4036 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004037 if bname =~ '^'.dirname.'/\=$'
4038 " bname begins with dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004039" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004040 break
4041 endif
4042 if dirname =~ '^'.bname.'/$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004043" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$','~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004044 break
4045 endif
4046 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004047" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004048 break
4049 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004050 let ibuf= ibuf + 1
4051 endwhile
4052 if ibuf > buflast
4053 let bufnum= -1
4054 else
4055 let bufnum= ibuf
4056 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004057" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004058 endif
4059 endif
4060
4061 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004062 if bufnum < 0 || !bufexists(bufnum) " get enew buffer and name it
4063" 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 +00004064 call s:NetrwEnew(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004065" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004066 " name the buffer
4067 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
4068 " Got enew buffer; transform into a NetrwTreeListing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004069" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004070 if !exists("s:netrw_treelistnum")
4071 let s:netrw_treelistnum= 1
4072 else
4073 let s:netrw_treelistnum= s:netrw_treelistnum + 1
4074 endif
4075 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004076" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum),'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004077 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004078 if g:netrw_use_noswf
4079 setl nobl bt=nofile noswf
4080 else
4081 setl nobl bt=nofile
4082 endif
4083 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[[')<cr>
4084 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']]')<cr>
4085 nnoremap <silent> <buffer> [] :sil call <SID>TreeListMove('[]')<cr>
4086 nnoremap <silent> <buffer> ][ :sil call <SID>TreeListMove('][')<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004087" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004088 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004089" let v:errmsg = "" " Decho
4090 let escdirname = fnameescape(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004091" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">",'~'.expand("<slnum>"))
4092" call Decho(' exe sil! keepalt file '.escdirname,'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004093" let v:errmsg= "" " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004094 exe 'sil! keepj keepalt file '.escdirname
4095" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004096 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004097" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004098
4099 else " Re-use the buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004100" call Decho("--re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004101 let eikeep= &ei
Bram Moolenaara6878372014-03-22 21:02:50 +01004102 setl ei=all
Bram Moolenaar446cb832008-06-24 21:56:24 +00004103 if getline(2) =~ '^" Netrw Directory Listing'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004104" call Decho(" getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum,'~'.expand("<slnum>"))
4105 exe "sil! NetrwKeepj noswapfile keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00004106 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004107" call Decho(" getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum,'~'.expand("<slnum>"))
4108 exe "sil! NetrwKeepj noswapfile keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00004109 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004110" call Decho(" line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004111 if bufname("%") == '.'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004112" call Decho("exe sil! keepalt file ".fnameescape(getcwd()),'~'.expand("<slnum>"))
4113 exe "sil! NetrwKeepj keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00004114 endif
4115 let &ei= eikeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004116
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004117 if line("$") <= 1 && getline(1) == ""
4118 " empty buffer
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004119 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004120" 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>"))
4121" 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 +01004122" call Dret("s:NetrwGetBuffer 0<buffer empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
4123 return 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004124
Bram Moolenaar97d62492012-11-15 21:28:22 +01004125 elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004126" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse." a:islocal=".a:islocal.": clear buffer",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004127 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004128 sil NetrwKeepj %d _
4129" 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>"))
4130" 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 +01004131" 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 +00004132 return 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004133
Bram Moolenaar446cb832008-06-24 21:56:24 +00004134 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004135" call Decho("--re-use tree listing--",'~'.expand("<slnum>"))
4136" call Decho(" clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
4137 sil NetrwKeepj %d _
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004138 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004139" 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>"))
4140" 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 +01004141" 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 +00004142 return 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004143
Bram Moolenaar446cb832008-06-24 21:56:24 +00004144 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004145" 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>"))
4146" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4147" call Dret("s:NetrwGetBuffer 1<buffer not cleared>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004148 return 1
4149 endif
4150 endif
4151
4152 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
4153 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
4154 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
4155 " med 1 D H
4156 " fast 2 H H
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004157" 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 +00004158 let fname= expand("%")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004159 NetrwKeepj call s:NetrwListSettings(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004160" call Decho("exe sil! keepalt file ".fnameescape(fname),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004161 exe "sil! NetrwKeepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004162
4163 " delete all lines from buffer {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004164" call Decho("--delete all lines from buffer--",'~'.expand("<slnum>"))
4165" call Decho(" clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
4166 sil! keepalt NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00004167
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004168" 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>"))
4169" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4170" call Dret("s:NetrwGetBuffer 0<cleared buffer>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004171 return 0
4172endfun
4173
4174" ---------------------------------------------------------------------
4175" s:NetrwGetcwd: get the current directory. {{{2
4176" Change backslashes to forward slashes, if any.
4177" If doesc is true, escape certain troublesome characters
4178fun! s:NetrwGetcwd(doesc)
4179" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
4180 let curdir= substitute(getcwd(),'\\','/','ge')
4181 if curdir !~ '[\/]$'
4182 let curdir= curdir.'/'
4183 endif
4184 if a:doesc
4185 let curdir= fnameescape(curdir)
4186 endif
4187" call Dret("NetrwGetcwd <".curdir.">")
4188 return curdir
4189endfun
4190
4191" ---------------------------------------------------------------------
4192" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
4193fun! s:NetrwGetWord()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004194" call Dfunc("s:NetrwGetWord() liststyle=".s:ShowStyle()." virtcol=".virtcol("."))
4195" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
4196 let keepsol= &l:sol
4197 setl nosol
4198
Bram Moolenaar446cb832008-06-24 21:56:24 +00004199 call s:UseBufWinVars()
4200
4201 " insure that w:netrw_liststyle is set up
4202 if !exists("w:netrw_liststyle")
4203 if exists("g:netrw_liststyle")
4204 let w:netrw_liststyle= g:netrw_liststyle
4205 else
4206 let w:netrw_liststyle= s:THINLIST
4207 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004208" call Decho("w:netrw_liststyle=".w:netrw_liststyle,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004209 endif
4210
4211 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
4212 " Active Banner support
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004213" call Decho("active banner handling",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004214 NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004215 let dirname= "./"
4216 let curline= getline('.')
4217
4218 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004219 NetrwKeepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00004220 let s:netrw_skipbrowse= 1
4221 echo 'Pressing "s" also works'
4222
4223 elseif curline =~ '"\s*Sort sequence:'
4224 let s:netrw_skipbrowse= 1
4225 echo 'Press "S" to edit sorting sequence'
4226
4227 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004228 NetrwKeepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00004229 let s:netrw_skipbrowse= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004230
4231 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004232 NetrwKeepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00004233 let s:netrw_skipbrowse= 1
4234 echo 'Pressing "a" also works'
4235
4236 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004237 exe 'sil NetrwKeepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004238 endif
4239
4240 elseif w:netrw_liststyle == s:THINLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004241" call Decho("thin column handling",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004242 NetrwKeepj norm! 0
4243 let dirname= substitute(getline('.'),'\t -->.*$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004244
4245 elseif w:netrw_liststyle == s:LONGLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004246" call Decho("long column handling",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004247 NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004248 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
4249
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004250 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004251" call Decho("treelist handling",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004252 let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004253 let dirname= substitute(dirname,'\t -->.*$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004254
4255 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004256" call Decho("obtain word from wide listing",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004257 let dirname= getline('.')
4258
4259 if !exists("b:netrw_cpf")
4260 let b:netrw_cpf= 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004261 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 +01004262 call histdel("/",-1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004263" "call Decho("computed cpf=".b:netrw_cpf,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004264 endif
4265
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004266" call Decho("buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004267 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004268" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
4269" call Decho("1: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004270 if filestart == 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004271 NetrwKeepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004272 else
4273 call cursor(line("."),filestart+1)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004274 NetrwKeepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004275 endif
4276 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004277 let eofname= filestart + b:netrw_cpf + 1
4278 if eofname <= col("$")
4279 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004280 NetrwKeepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004281 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004282 NetrwKeepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00004283 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004284 let dirname = @a
4285 let @a = rega
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004286" call Decho("2: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004287 let dirname= substitute(dirname,'\s\+$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004288" call Decho("3: dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004289 endif
4290
4291 " symlinks are indicated by a trailing "@". Remove it before further processing.
4292 let dirname= substitute(dirname,"@$","","")
4293
4294 " executables are indicated by a trailing "*". Remove it before further processing.
4295 let dirname= substitute(dirname,"\*$","","")
4296
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004297 let &l:sol= keepsol
4298
Bram Moolenaar446cb832008-06-24 21:56:24 +00004299" call Dret("s:NetrwGetWord <".dirname.">")
4300 return dirname
4301endfun
4302
4303" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004304" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004305fun! s:NetrwListSettings(islocal)
4306" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004307" 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 +00004308 let fname= bufname("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004309" " call Decho("(NetrwListSettings) setl bt=nofile nobl ma nonu nowrap noro nornu",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02004310 setl bt=nofile nobl ma nonu nowrap noro nornu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004311" call Decho("(NetrwListSettings) exe sil! keepalt file ".fnameescape(fname),'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004312 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004313 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004314 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004315 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01004316" call Dredir("ls!")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004317" call Decho("(NetrwListSettings) exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004318 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaarff034192013-04-24 18:51:19 +02004319 setl isk+=.,~,-
Bram Moolenaar446cb832008-06-24 21:56:24 +00004320 if g:netrw_fastbrowse > a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004321 setl bh=hide
Bram Moolenaar446cb832008-06-24 21:56:24 +00004322 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004323 setl bh=delete
Bram Moolenaar446cb832008-06-24 21:56:24 +00004324 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004325" 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 +00004326" call Dret("s:NetrwListSettings")
4327endfun
4328
4329" ---------------------------------------------------------------------
4330" s:NetrwListStyle: {{{2
4331" islocal=0: remote browsing
4332" =1: local browsing
4333fun! s:NetrwListStyle(islocal)
4334" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
Bram Moolenaar13600302014-05-22 18:26:40 +02004335
Bram Moolenaar97d62492012-11-15 21:28:22 +01004336 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004337 let fname = s:NetrwGetWord()
4338 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004339 let svpos = winsaveview()
4340" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004341 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004342" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
4343" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle,'~'.expand("<slnum>"))
4344" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004345
4346 if w:netrw_liststyle == s:THINLIST
4347 " use one column listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004348" call Decho("use one column list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004349 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4350
4351 elseif w:netrw_liststyle == s:LONGLIST
4352 " use long list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004353" call Decho("use long list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004354 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4355
4356 elseif w:netrw_liststyle == s:WIDELIST
4357 " give wide list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004358" call Decho("use wide list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004359 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4360
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004361 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004362" call Decho("use tree list",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004363 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4364
4365 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004366 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004367 let g:netrw_liststyle = s:THINLIST
4368 let w:netrw_liststyle = g:netrw_liststyle
4369 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4370 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004371 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004372" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004373
4374 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004375" call Decho("clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
4376 sil! NetrwKeepj %d _
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004377 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004378" call Decho("setl nomod",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004379 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004380" 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 +00004381
4382 " refresh the listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004383" call Decho("refresh the listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004384 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4385 NetrwKeepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004386
Bram Moolenaar13600302014-05-22 18:26:40 +02004387 " restore position; keep cursor on the filename
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004388" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
4389 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004390 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004391
4392" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4393endfun
4394
4395" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004396" s:NetrwBannerCtrl: toggles the display of the banner {{{2
4397fun! s:NetrwBannerCtrl(islocal)
4398" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
4399
Bram Moolenaar97d62492012-11-15 21:28:22 +01004400 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004401 " toggle the banner (enable/suppress)
4402 let g:netrw_banner= !g:netrw_banner
4403
4404 " refresh the listing
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004405 let svpos= winsaveview()
4406" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004407 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4408
4409 " keep cursor on the filename
4410 let fname= s:NetrwGetWord()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004411 sil NetrwKeepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01004412 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004413" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'),'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004414 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004415 exe "NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01004416 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004417 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004418" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
4419endfun
4420
4421" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004422" s:NetrwBookmark: supports :NetrwMB[!] [file]s {{{2
4423"
4424" No bang: enters files/directories into Netrw's bookmark system
4425" No argument and in netrw buffer:
4426" if there are marked files: bookmark marked files
4427" otherwise : bookmark file/directory under cursor
4428" No argument and not in netrw buffer: bookmarks current open file
4429" Has arguments: globs them individually and bookmarks them
4430"
4431" With bang: deletes files/directories from Netrw's bookmark system
4432fun! s:NetrwBookmark(del,...)
4433" call Dfunc("s:NetrwBookmark(del=".a:del.",...) a:0=".a:0)
4434 if a:0 == 0
4435 if &ft == "netrw"
4436 let curbufnr = bufnr("%")
4437
4438 if exists("s:netrwmarkfilelist_{curbufnr}")
4439 " for every filename in the marked list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004440" call Decho("bookmark every filename in marked list",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004441 let svpos = winsaveview()
4442" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004443 let islocal= expand("%") !~ '^\a\{3,}://'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004444 for fname in s:netrwmarkfilelist_{curbufnr}
4445 if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
4446 endfor
4447 let curdir = exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
4448 call s:NetrwUnmarkList(curbufnr,curdir)
4449 NetrwKeepj call s:NetrwRefresh(islocal,s:NetrwBrowseChgDir(islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004450" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
4451 NetrwKeepj call winrestview(svpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004452 else
4453 let fname= s:NetrwGetWord()
4454 if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
4455 endif
4456
4457 else
4458 " bookmark currently open file
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004459" call Decho("bookmark currently open file",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004460 let fname= expand("%")
4461 if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
4462 endif
4463
4464 else
4465 " bookmark specified files
4466 " attempts to infer if working remote or local
4467 " by deciding if the current file begins with an url
4468 " Globbing cannot be done remotely.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004469 let islocal= expand("%") !~ '^\a\{3,}://'
4470" call Decho("bookmark specified file".((a:0>1)? "s" : ""),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004471 let i = 1
4472 while i <= a:0
4473 if islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004474 if v:version == 704 && has("patch656")
4475 let mbfiles= glob(a:{i},0,1,1)
4476 else
4477 let mbfiles= glob(a:{i},0,1)
4478 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004479 else
4480 let mbfiles= [a:{i}]
4481 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004482" call Decho("mbfiles".string(mbfiles),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004483 for mbfile in mbfiles
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004484" call Decho("mbfile<".mbfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004485 if a:del|call s:DeleteBookmark(mbfile)|else|call s:MakeBookmark(mbfile)|endif
4486 endfor
4487 let i= i + 1
4488 endwhile
4489 endif
4490
4491 " update the menu
4492 call s:NetrwBookmarkMenu()
4493
4494" call Dret("s:NetrwBookmark")
4495endfun
4496
4497" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004498" s:NetrwBookmarkMenu: Uses menu priorities {{{2
4499" .2.[cnt] for bookmarks, and
4500" .3.[cnt] for history
4501" (see s:NetrwMenu())
4502fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004503 if !exists("s:netrw_menucnt")
4504 return
4505 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004506" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004507
4508 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02004509 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00004510 if exists("g:NetrwTopLvlMenu")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004511" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004512 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4513 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004514 endif
4515 if !exists("s:netrw_initbookhist")
4516 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004517 endif
4518
4519 " show bookmarked places
Bram Moolenaarff034192013-04-24 18:51:19 +02004520 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004521 let cnt= 1
4522 for bmd in g:netrw_bookmarklist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004523" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004524 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004525
4526 " show bookmarks for goto menu
Bram Moolenaar8d043172014-01-23 14:24:41 +01004527 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004528
4529 " show bookmarks for deletion menu
Bram Moolenaar8d043172014-01-23 14:24:41 +01004530 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 +01004531 let cnt= cnt + 1
4532 endfor
4533
4534 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004535
4536 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02004537 if g:netrw_dirhistmax > 0
4538 let cnt = g:netrw_dirhist_cnt
4539 let first = 1
4540 let histcnt = 0
4541 while ( first || cnt != g:netrw_dirhist_cnt )
4542 let histcnt = histcnt + 1
4543 let priority = g:netrw_dirhist_cnt + histcnt
4544 if exists("g:netrw_dirhist_{cnt}")
4545 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004546" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02004547 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
4548 endif
4549 let first = 0
4550 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4551 if cnt < 0
4552 let cnt= cnt + g:netrw_dirhistmax
4553 endif
4554 endwhile
4555 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004556
Bram Moolenaar9964e462007-05-05 17:54:07 +00004557 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004558" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004559endfun
4560
4561" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004562" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
4563" directory and a new directory name. Also, if the
4564" "new directory name" is actually a file,
4565" NetrwBrowseChgDir() edits the file.
4566fun! s:NetrwBrowseChgDir(islocal,newdir,...)
4567" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004568" 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 +00004569
Bram Moolenaar97d62492012-11-15 21:28:22 +01004570 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004571 if !exists("b:netrw_curdir")
4572 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
4573 " and the current window is the NetrwMessage window.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004574 let @@= ykeep
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004575" call Decho("b:netrw_curdir doesn't exist!",'~'.expand("<slnum>"))
4576" call Decho("getcwd<".getcwd().">",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004577" call Dredir("ls!")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004578" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004579 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004580 endif
4581
Bram Moolenaar97d62492012-11-15 21:28:22 +01004582 " NetrwBrowseChgDir: save options and initialize {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004583" call Decho("saving options",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004584 NetrwKeepj call s:NetrwOptionSave("s:")
4585 NetrwKeepj call s:NetrwSafeOptions()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004586 let nbcd_curpos = winsaveview()
4587" call Decho("saving posn to nbcd_curpos<".string(nbcd_curpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004588 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004589 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004590 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004591 else
Bram Moolenaara6878372014-03-22 21:02:50 +01004592 let dirname = b:netrw_curdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004593 endif
4594 let newdir = a:newdir
4595 let dolockout = 0
Bram Moolenaar13600302014-05-22 18:26:40 +02004596 let dorestore = 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004597" call Decho("dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004598
4599 " ignore <cr>s when done in the banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004600" call Decho('ignore [return]s when done in banner (g:netrw_banner='.g:netrw_banner.")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004601 if g:netrw_banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004602" call Decho("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 +01004603 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt && line("$") >= w:netrw_bannercnt
4604 if getline(".") =~ 'Quick Help'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004605" 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 +01004606 let g:netrw_quickhelp= (g:netrw_quickhelp + 1)%len(s:QuickHelp)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004607" 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 +02004608 setl ma noro nowrap
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004609 NetrwKeepj call setline(line('.'),'" Quick Help: <F1>:help '.s:QuickHelp[g:netrw_quickhelp])
Bram Moolenaara6878372014-03-22 21:02:50 +01004610 setl noma nomod nowrap
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004611" call Decho("restoring posn to nbcd_curpos<".string(nbcd_curpos).">",'~'.expand("<slnum>"))
4612 NetrwKeepj call winrestview(nbcd_curpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004613 NetrwKeepj call s:NetrwOptionRestore("s:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004614" 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 +01004615 endif
4616 endif
4617" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004618" call Decho("(s:NetrwBrowseChgdir) g:netrw_banner=".g:netrw_banner." (no banner)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004619 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004620
Bram Moolenaar446cb832008-06-24 21:56:24 +00004621 " set up o/s-dependent directory recognition pattern
4622 if has("amiga")
4623 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00004624 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004625 let dirpat= '[\/]$'
4626 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004627" call Decho("set up o/s-dependent directory recognition pattern: dirname<".dirname."> dirpat<".dirpat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004628
4629 if dirname !~ dirpat
4630 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02004631 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004632 let dirname= dirname.'/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004633" call Decho("adjusting dirname<".dirname.'> (put trailing "/" back)','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004634 endif
4635
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004636" " call Decho("[newdir<".newdir."> ".((newdir =~ dirpat)? "=~" : "!~")." dirpat<".dirpat.">] && [islocal=".a:islocal."] && [newdir is ".(isdirectory(s:NetrwFile(newdir))? "" : "not ")."a directory]",'~'.expand("<slnum>"))
4637 if newdir !~ dirpat && !(a:islocal && isdirectory(s:NetrwFile(s:ComposePath(dirname,newdir))))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004638 " ------------------------------
4639 " NetrwBrowseChgDir: edit a file {{{3
4640 " ------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004641" call Decho('edit-a-file: case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004642
Bram Moolenaar97d62492012-11-15 21:28:22 +01004643 " save position for benefit of Rexplore
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004644 let s:rexposn_{bufnr("%")}= winsaveview()
4645" call Decho("edit-a-file: saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004646" call Decho("edit-a-file: win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft,'~'.expand("<slnum>"))
4647" 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 +01004648
Bram Moolenaar446cb832008-06-24 21:56:24 +00004649 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004650" call Decho("edit-a-file: handle tree listing: w:netrw_treedict<".(exists("w:netrw_treedict")? string(w:netrw_treedict) : 'n/a').">",'~'.expand("<slnum>"))
4651" call Decho("edit-a-file: newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004652 let dirname= s:NetrwTreeDir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004653 if dirname =~ '/$'
4654 let dirname= dirname.newdir
4655 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01004656 let dirname= dirname."/".newdir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004657 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004658" call Decho("edit-a-file: dirname<".dirname.">",'~'.expand("<slnum>"))
4659" call Decho("edit-a-file: tree listing",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004660 elseif newdir =~ '^\(/\|\a:\)'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004661" call Decho("edit-a-file: handle an url or path starting with /: <".newdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004662 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004663 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004664 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004665 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004666" call Decho("edit-a-file: handling a file: dirname<".dirname."> (a:0=".a:0.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004667 " this lets netrw#BrowseX avoid the edit
Bram Moolenaar446cb832008-06-24 21:56:24 +00004668 if a:0 < 1
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004669" 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 Moolenaar8feef4f2015-01-07 16:57:10 +01004670 NetrwKeepj call s:NetrwOptionRestore("s:")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004671 let curdir= b:netrw_curdir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004672 if !exists("s:didsplit")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004673" call Decho("edit-a-file: s:didsplit does not exist; g:netrw_browse_split=".string(g:netrw_browse_split)." win#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004674 if type(g:netrw_browse_split) == 3
4675 " open file in server
4676 " Note that g:netrw_browse_split is a List: [servername,tabnr,winnr]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004677" call Decho("edit-a-file: open file in server",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004678 call s:NetrwServerEdit(a:islocal,dirname)
4679" call Dret("s:NetrwBrowseChgDir")
4680 return
4681 elseif g:netrw_browse_split == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01004682 " horizontally splitting the window first
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004683" call Decho("edit-a-file: horizontally splitting window prior to edit",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02004684 keepalt new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004685 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004686 keepalt wincmd _
Bram Moolenaar5c736222010-01-06 20:54:52 +01004687 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004688 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004689 elseif g:netrw_browse_split == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01004690 " vertically splitting the window first
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004691" call Decho("edit-a-file: vertically splitting window prior to edit",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02004692 keepalt rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004693 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004694 keepalt wincmd |
Bram Moolenaar5c736222010-01-06 20:54:52 +01004695 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004696 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004697 elseif g:netrw_browse_split == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004698 " open file in new tab
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004699" call Decho("edit-a-file: opening new tab prior to edit",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02004700 keepalt tabnew
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004701 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004702 elseif g:netrw_browse_split == 4
Bram Moolenaar97d62492012-11-15 21:28:22 +01004703 " act like "P" (ie. open previous window)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004704" call Decho("edit-a-file: use previous window for edit",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004705 if s:NetrwPrevWinOpen(2) == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004706 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004707" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004708 return
4709 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004710 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004711 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004712 " handling a file, didn't split, so remove menu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004713" call Decho("edit-a-file: handling a file+didn't split, so remove menu",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004714 call s:NetrwMenu(0)
4715 " optional change to window
4716 if g:netrw_chgwin >= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004717" call Decho("edit-a-file: changing window to #".g:netrw_chgwin,'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02004718 if winnr("$")+1 == g:netrw_chgwin
4719 " if g:netrw_chgwin is set to one more than the last window, then
4720 " vertically split the last window to make that window available.
4721 let curwin= winnr()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004722 exe "NetrwKeepj keepalt ".winnr("$")."wincmd w"
Bram Moolenaar13600302014-05-22 18:26:40 +02004723 vs
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004724 exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd ".curwin
Bram Moolenaar13600302014-05-22 18:26:40 +02004725 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004726 exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004727 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004728 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004729 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004730 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004731
Bram Moolenaar446cb832008-06-24 21:56:24 +00004732 " the point where netrw actually edits the (local) file
4733 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
Bram Moolenaar8d043172014-01-23 14:24:41 +01004734 " no keepalt to support :e # to return to a directory listing
Bram Moolenaar446cb832008-06-24 21:56:24 +00004735 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004736" call Decho("edit-a-file: edit local file: exe e! ".fnameescape(dirname),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004737 " some like c-^ to return to the last edited file
4738 " others like c-^ to return to the netrw buffer
4739 if exists("g:netrw_altfile") && g:netrw_altfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004740 exe "NetrwKeepj keepalt e! ".fnameescape(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +01004741 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004742 exe "NetrwKeepj e! ".fnameescape(dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +01004743 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004744" call Decho("edit-a-file: after e! ".dirname.": hidden=".&hidden." bufhidden<".&bufhidden."> mod=".&mod,'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004745 call s:NetrwCursor()
Bram Moolenaar13600302014-05-22 18:26:40 +02004746 if &hidden || &bufhidden == "hide"
4747 " file came from vim's hidden storage. Don't "restore" options with it.
4748 let dorestore= 0
4749 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004750 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004751" call Decho("edit-a-file: remote file: NetrwBrowse will edit it",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00004752 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004753 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01004754
4755 " handle g:Netrw_funcref -- call external-to-netrw functions
4756 " This code will handle g:Netrw_funcref as an individual function reference
4757 " or as a list of function references. It will ignore anything that's not
4758 " a function reference. See :help Funcref for information about function references.
4759 if exists("g:Netrw_funcref")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004760" call Decho("edit-a-file: handle optional Funcrefs",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004761 if type(g:Netrw_funcref) == 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004762" call Decho("edit-a-file: handling a g:Netrw_funcref",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004763 NetrwKeepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004764 elseif type(g:Netrw_funcref) == 3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004765" call Decho("edit-a-file: handling a list of g:Netrw_funcrefs",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004766 for Fncref in g:Netrw_funcref
4767 if type(FncRef) == 2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004768 NetrwKeepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004769 endif
4770 endfor
4771 endif
4772 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004773 endif
4774
4775 elseif newdir =~ '^/'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004776 " ----------------------------------------------------
4777 " NetrwBrowseChgDir: just go to the new directory spec {{{3
4778 " ----------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004779" call Decho('goto-newdir: case "just go to new directory spec": newdir<'.newdir.'>','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004780 let dirname = newdir
4781 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
4782 NetrwKeepj call s:NetrwOptionRestore("s:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004783 norm! m`
Bram Moolenaar446cb832008-06-24 21:56:24 +00004784
4785 elseif newdir == './'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004786 " ---------------------------------------------
4787 " NetrwBrowseChgDir: refresh the directory list {{{3
4788 " ---------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004789" call Decho('refresh-dirlist: case "refresh directory listing": newdir == "./"','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004790 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004791 norm! m`
Bram Moolenaar446cb832008-06-24 21:56:24 +00004792
4793 elseif newdir == '../'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004794 " --------------------------------------
4795 " NetrwBrowseChgDir: go up one directory {{{3
4796 " --------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004797" call Decho('go-up: case "go up one directory": newdir == "../"','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004798
4799 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
4800 " force a refresh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004801" call Decho("go-up: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
4802" call Decho("go-up: setl noro ma",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004803 setl noro ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004804 NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00004805 endif
4806
4807 if has("amiga")
4808 " amiga
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004809" call Decho('go-up: case "go up one directory": newdir == "../" and amiga','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004810 if a:islocal
4811 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
4812 let dirname= substitute(dirname,'/$','','')
4813 else
4814 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
4815 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004816" call Decho("go-up: amiga: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004817
Bram Moolenaar8d043172014-01-23 14:24:41 +01004818 elseif !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
4819 " windows
4820 if a:islocal
4821 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4822 if dirname == ""
4823 let dirname= '/'
4824 endif
4825 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004826 let dirname= substitute(dirname,'^\(\a\{3,}://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
Bram Moolenaar8d043172014-01-23 14:24:41 +01004827 endif
4828 if dirname =~ '^\a:$'
4829 let dirname= dirname.'/'
4830 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004831" call Decho("go-up: windows: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004832
Bram Moolenaar446cb832008-06-24 21:56:24 +00004833 else
4834 " unix or cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004835" call Decho('go-up: case "go up one directory": newdir == "../" and unix or cygwin','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004836 if a:islocal
4837 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4838 if dirname == ""
4839 let dirname= '/'
4840 endif
4841 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004842 let dirname= substitute(dirname,'^\(\a\{3,}://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004843 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004844" call Decho("go-up: unix: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004845 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004846 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004847 norm m`
Bram Moolenaar446cb832008-06-24 21:56:24 +00004848
4849 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004850 " --------------------------------------
4851 " NetrwBrowseChgDir: Handle Tree Listing {{{3
4852 " --------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004853" call Decho('tree-list: case liststyle is TREELIST and w:netrw_treedict exists','~'.expand("<slnum>"))
4854 " force a refresh (for TREELIST, NetrwTreeDir() will force the refresh)
4855" call Decho("tree-list: setl noro ma",'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004856 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004857 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004858" call Decho("tree-list: clear buffer<".expand("%")."> with :%d (force refresh)",'~'.expand("<slnum>"))
4859 NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00004860 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004861 let treedir = s:NetrwTreeDir(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004862" call Decho("tree-list: treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004863 let s:treecurpos = nbcd_curpos
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004864 let haskey = 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004865" call Decho("tree-list: w:netrw_treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004866
4867 " search treedict for tree dir as-is
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004868" call Decho("tree-list: search treedict for tree dir as-is",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004869 if has_key(w:netrw_treedict,treedir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004870" call Decho('tree-list: ....searched for treedir<'.treedir.'> : found it!','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004871 let haskey= 1
4872 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004873" call Decho('tree-list: ....searched for treedir<'.treedir.'> : not found','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004874 endif
4875
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004876 " search treedict for treedir with a [/@] appended
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004877" call Decho("tree-list: search treedict for treedir with a [/@] appended",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004878 if !haskey && treedir !~ '[/@]$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004879 if has_key(w:netrw_treedict,treedir."/")
4880 let treedir= treedir."/"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004881" call Decho('tree-list: ....searched.for treedir<'.treedir.'> found it!','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004882 let haskey = 1
4883 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004884" call Decho('tree-list: ....searched for treedir<'.treedir.'/> : not found','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004885 endif
4886 endif
4887
4888 " search treedict for treedir with any trailing / elided
Bram Moolenaare0fa3742016-02-20 15:47:01 +01004889" call Decho("tree-list: search treedict for treedir with any trailing / elided",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004890 if !haskey && treedir =~ '/$'
4891 let treedir= substitute(treedir,'/$','','')
4892 if has_key(w:netrw_treedict,treedir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004893" call Decho('tree-list: ....searched.for treedir<'.treedir.'> found it!','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004894 let haskey = 1
4895 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004896" call Decho('tree-list: ....searched for treedir<'.treedir.'> : not found','~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004897 endif
4898 endif
4899
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004900" call Decho("haskey=".haskey,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004901 if haskey
4902 " close tree listing for selected subdirectory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004903" call Decho("tree-list: closing selected subdirectory<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004904 call remove(w:netrw_treedict,treedir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004905" call Decho("tree-list: removed entry<".treedir."> from treedict",'~'.expand("<slnum>"))
4906" call Decho("tree-list: yielding treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004907 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00004908 else
4909 " go down one directory
4910 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004911" call Decho("tree-list: go down one dir: treedir<".treedir.">",'~'.expand("<slnum>"))
4912" call Decho("tree-list: ... : dirname<".dirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004913 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004914 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004915" call Decho("setting s:treeforceredraw to true",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004916 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004917
4918 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004919 " ----------------------------------------
4920 " NetrwBrowseChgDir: Go down one directory {{{3
4921 " ----------------------------------------
4922 let dirname = s:ComposePath(dirname,newdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004923" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004924 NetrwKeepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004925 norm m`
Bram Moolenaar9964e462007-05-05 17:54:07 +00004926 endif
4927
Bram Moolenaar97d62492012-11-15 21:28:22 +01004928 " --------------------------------------
4929 " NetrwBrowseChgDir: Restore and Cleanup {{{3
4930 " --------------------------------------
Bram Moolenaar13600302014-05-22 18:26:40 +02004931 if dorestore
4932 " dorestore is zero'd when a local file was hidden or bufhidden;
4933 " in such a case, we want to keep whatever settings it may have.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004934" call Decho("doing option restore (dorestore=".dorestore.")",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004935 NetrwKeepj call s:NetrwOptionRestore("s:")
Bram Moolenaar13600302014-05-22 18:26:40 +02004936" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004937" call Decho("skipping option restore (dorestore==0): hidden=".&hidden." bufhidden=".&bufhidden." mod=".&mod,'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02004938 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02004939 if dolockout && dorestore
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004940" call Decho("restore: filewritable(dirname<".dirname.">)=".filewritable(dirname),'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004941 if filewritable(dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004942" call Decho("restore: doing modification lockout settings: ma nomod noro",'~'.expand("<slnum>"))
4943" call Decho("restore: setl ma nomod noro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02004944 setl ma noro nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004945" 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 +02004946 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004947" call Decho("restore: doing modification lockout settings: ma nomod ro",'~'.expand("<slnum>"))
4948" call Decho("restore: setl ma nomod noro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02004949 setl ma ro nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004950" 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 +02004951 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004952 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004953 let @@= ykeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00004954
Bram Moolenaar446cb832008-06-24 21:56:24 +00004955" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
4956 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00004957endfun
4958
4959" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01004960" s:NetrwBrowseUpDir: implements the "-" mappings {{{2
4961" for thin, long, and wide: cursor placed just after banner
4962" for tree, keeps cursor on current filename
4963fun! s:NetrwBrowseUpDir(islocal)
4964" call Dfunc("s:NetrwBrowseUpDir(islocal=".a:islocal.")")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004965 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt-1
4966 " this test needed because occasionally this function seems to be incorrectly called
4967 " when multiple leftmouse clicks are taken when atop the one line help in the banner.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004968 " I'm allowing the very bottom line to permit a "-" exit so that one may escape empty
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004969 " directories.
4970" call Dret("s:NetrwBrowseUpDir : cursor not in file area")
4971 return
4972 endif
4973
Bram Moolenaara6878372014-03-22 21:02:50 +01004974 norm! 0
4975 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004976" call Decho("case: treestyle",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01004977 let curline= getline(".")
4978 let swwline= winline() - 1
4979 if exists("w:netrw_treetop")
4980 let b:netrw_curdir= w:netrw_treetop
4981 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01004982 let curdir= b:netrw_curdir
Bram Moolenaara6878372014-03-22 21:02:50 +01004983 if a:islocal
4984 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,'../'))
4985 else
4986 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
4987 endif
4988 if !search('\c^'.s:treedepthstring.curline,'cw')
4989 if !search('\c^'.curline,'cw')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004990 sil! NetrwKeepj 1
Bram Moolenaara6878372014-03-22 21:02:50 +01004991 endif
4992 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004993 exe "sil! NetrwKeepj norm! z\<cr>"
Bram Moolenaara6878372014-03-22 21:02:50 +01004994 while winline() < swwline
4995 let curwinline= winline()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01004996 exe "sil! NetrwKeepj norm! \<c-y>"
Bram Moolenaara6878372014-03-22 21:02:50 +01004997 if curwinline == winline()
4998 break
4999 endif
5000 endwhile
5001 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005002" call Decho("case: not treestyle",'~'.expand("<slnum>"))
5003 if exists("b:netrw_curdir")
5004 let curdir= b:netrw_curdir
5005 else
5006 let curdir= expand(getcwd())
5007 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01005008 if a:islocal
5009 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,'../'))
5010 else
5011 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
5012 endif
5013 if exists("w:netrw_bannercnt")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005014" call Decho("moving to line#".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005015 exe w:netrw_bannercnt
5016 else
5017 1
5018 endif
5019 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005020 let curdir= substitute(curdir,'^.*[\/]','','')
5021 call search('\<'.curdir.'\>','wc')
Bram Moolenaara6878372014-03-22 21:02:50 +01005022" call Dret("s:NetrwBrowseUpDir")
5023endfun
5024
5025" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005026" netrw#BrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01005027" given filename; typically this means given their extension.
5028" 0=local, 1=remote
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005029fun! netrw#BrowseX(fname,remote)
5030" call Dfunc("netrw#BrowseX(fname<".a:fname."> remote=".a:remote.")")
5031
5032 " if its really just a directory, then do a "gf" instead
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005033 if (a:remote == 0 && isdirectory(a:fname)) || (a:remote == 1 && fname =~ '/$' && fname !~ '^https\=:')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005034 norm! gf
5035" call Dret("netrw#BrowseX : did gf instead")
5036 endif
5037
Bram Moolenaar446cb832008-06-24 21:56:24 +00005038
Bram Moolenaar97d62492012-11-15 21:28:22 +01005039 let ykeep = @@
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005040 let screenposn = winsaveview()
5041" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005042
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005043 " need to save and restore aw setting as gx can invoke this function from non-netrw buffers
5044 let awkeep = &aw
5045 set noaw
5046
Bram Moolenaar5c736222010-01-06 20:54:52 +01005047 " special core dump handler
5048 if a:fname =~ '/core\(\.\d\+\)\=$'
5049 if exists("g:Netrw_corehandler")
5050 if type(g:Netrw_corehandler) == 2
5051 " g:Netrw_corehandler is a function reference (see :help Funcref)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005052" call Decho("g:Netrw_corehandler is a funcref",'~'.expand("<slnum>"))
5053 call g:Netrw_corehandler(s:NetrwFile(a:fname))
Bram Moolenaarff034192013-04-24 18:51:19 +02005054 elseif type(g:Netrw_corehandler) == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01005055 " g:Netrw_corehandler is a List of function references (see :help Funcref)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005056" call Decho("g:Netrw_corehandler is a List",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005057 for Fncref in g:Netrw_corehandler
5058 if type(FncRef) == 2
5059 call FncRef(a:fname)
5060 endif
5061 endfor
5062 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005063" call Decho("restoring posn to screenposn<".string(screenposn).">,'~'.expand("<slnum>"))"
5064 call winrestview(screenposn)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005065 let @@= ykeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005066 let &aw= awkeep
5067" call Dret("netrw#BrowseX : coredump handler invoked")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005068 return
5069 endif
5070 endif
5071
Bram Moolenaar446cb832008-06-24 21:56:24 +00005072 " set up the filename
5073 " (lower case the extension, make a local copy of a remote file)
5074 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
5075 if has("win32") || has("win95") || has("win64") || has("win16")
5076 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00005077 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005078" call Decho("exten<".exten.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005079
Bram Moolenaar446cb832008-06-24 21:56:24 +00005080 if a:remote == 1
5081 " create a local copy
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005082" call Decho("remote: a:remote=".a:remote.": create a local copy of <".a:fname.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02005083 setl bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01005084 call netrw#NetRead(3,a:fname)
5085 " attempt to rename tempfile
5086 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01005087 let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005088" call Decho("basename<".basename.">",'~'.expand("<slnum>"))
5089" call Decho("newname <".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005090 if rename(s:netrw_tmpfile,newname) == 0
5091 " renaming succeeded
5092 let fname= newname
5093 else
5094 " renaming failed
5095 let fname= s:netrw_tmpfile
5096 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00005097 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005098" call Decho("local: a:remote=".a:remote.": handling local copy of <".a:fname.">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005099 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005100 " special ~ handler for local
5101 if fname =~ '^\~' && expand("$HOME") != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005102" call Decho('invoking special ~ handler','~'.expand("<slnum>"))
5103 let fname= s:NetrwFile(substitute(fname,'^\~',expand("$HOME"),''))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005104 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005105 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005106" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
5107" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005108
5109 " set up redirection
5110 if &srr =~ "%s"
5111 if (has("win32") || has("win95") || has("win64") || has("win16"))
5112 let redir= substitute(&srr,"%s","nul","")
5113 else
5114 let redir= substitute(&srr,"%s","/dev/null","")
5115 endif
5116 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
5117 let redir= &srr . "nul"
5118 else
5119 let redir= &srr . "/dev/null"
5120 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005121" call Decho("set up redirection: redir{".redir."} srr{".&srr."}",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005122
5123 " extract any viewing options. Assumes that they're set apart by quotes.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005124" call Decho("extract any viewing options",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005125 if exists("g:netrw_browsex_viewer")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005126" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005127 if g:netrw_browsex_viewer =~ '\s'
5128 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
5129 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
5130 let oviewer = ''
5131 let cnt = 1
5132 while !executable(viewer) && viewer != oviewer
5133 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
5134 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
5135 let cnt = cnt + 1
5136 let oviewer = viewer
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005137" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005138 endwhile
5139 else
5140 let viewer = g:netrw_browsex_viewer
5141 let viewopt = ""
5142 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005143" call Decho("viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005144 endif
5145
5146 " execute the file handler
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005147" call Decho("execute the file handler (if any)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005148 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005149" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005150 let ret= netrwFileHandlers#Invoke(exten,fname)
5151
5152 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005153" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
5154 call s:NetrwExe("sil !".viewer." ".viewopt.s:ShellEscape(fname,1).redir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005155 let ret= v:shell_error
5156
5157 elseif has("win32") || has("win64")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005158" call Decho("windows",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005159 if executable("start")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005160 call s:NetrwExe('sil! !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005161 elseif executable("rundll32")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005162 call s:NetrwExe('sil! !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005163 else
5164 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
5165 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005166 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
5167 let ret= v:shell_error
5168
Bram Moolenaar97d62492012-11-15 21:28:22 +01005169 elseif has("win32unix")
5170 let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005171" call Decho("cygwin: winfname<".s:ShellEscape(winfname,1).">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005172 if executable("start")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005173 call s:NetrwExe('sil !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005174 elseif executable("rundll32")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005175 call s:NetrwExe('sil !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005176 elseif executable("cygstart")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005177 call s:NetrwExe('sil !cygstart '.s:ShellEscape(fname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005178 else
5179 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
5180 endif
5181 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
5182 let ret= v:shell_error
5183
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005184 elseif has("unix") && executable("kfmclient") && s:CheckIfKde()
5185" call Decho("unix and kfmclient",'~'.expand("<slnum>"))
5186 call s:NetrwExe("sil !kfmclient exec ".s:ShellEscape(fname,1)." ".redir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005187 let ret= v:shell_error
5188
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005189 elseif has("unix") && executable("exo-open") && executable("xdg-open") && executable("setsid")
5190" call Decho("unix, exo-open, xdg-open",'~'.expand("<slnum>"))
5191 call s:NetrwExe("sil !setsid xdg-open ".s:ShellEscape(fname,1).redir)
5192 let ret= v:shell_error
5193
5194 elseif has("unix") && executable("xdg-open")
5195" call Decho("unix and xdg-open",'~'.expand("<slnum>"))
5196 call s:NetrwExe("sil !xdg-open ".s:ShellEscape(fname,1).redir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005197 let ret= v:shell_error
5198
5199 elseif has("macunix") && executable("open")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005200" call Decho("macunix and open",'~'.expand("<slnum>"))
5201 call s:NetrwExe("sil !open ".s:ShellEscape(fname,1)." ".redir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005202 let ret= v:shell_error
5203
5204 else
5205 " netrwFileHandlers#Invoke() always returns 0
5206 let ret= netrwFileHandlers#Invoke(exten,fname)
5207 endif
5208
5209 " if unsuccessful, attempt netrwFileHandlers#Invoke()
5210 if ret
5211 let ret= netrwFileHandlers#Invoke(exten,fname)
5212 endif
5213
Bram Moolenaarc236c162008-07-13 17:41:49 +00005214 " restoring redraw! after external file handlers
5215 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00005216
5217 " cleanup: remove temporary file,
5218 " delete current buffer if success with handler,
5219 " return to prior buffer (directory listing)
5220 " Feb 12, 2008: had to de-activiate removal of
5221 " temporary file because it wasn't getting seen.
5222" if a:remote == 1 && fname != a:fname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005223"" call Decho("deleting temporary file<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005224" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005225" endif
5226
5227 if a:remote == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02005228 setl bh=delete bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00005229 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02005230 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00005231 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005232 exe "sil! NetrwKeepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005233" redraw!
5234 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005235" call Decho("restoring posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
5236 call winrestview(screenposn)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005237 let @@ = ykeep
5238 let &aw= awkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005239
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005240" call Dret("netrw#BrowseX")
5241endfun
5242
5243" ---------------------------------------------------------------------
5244" netrw#BrowseXVis: used by gx in visual mode to select a file for browsing {{{2
5245fun! netrw#BrowseXVis()
5246" call Dfunc("netrw#BrowseXVis()")
5247 let atkeep = @@
5248 norm! gvy
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005249" call Decho("@@<".@@.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005250 call netrw#BrowseX(@@,netrw#CheckIfRemote())
5251 let @@ = atkeep
5252" call Dret("netrw#BrowseXVis")
5253endfun
5254
5255" ---------------------------------------------------------------------
5256" netrw#CheckIfRemote: returns 1 if current file looks like an url, 0 else {{{2
5257fun! netrw#CheckIfRemote()
5258" call Dfunc("netrw#CheckIfRemote()")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005259 if expand("%") =~ '^\a\{3,}://'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005260" call Dret("netrw#CheckIfRemote 1")
5261 return 1
5262 else
5263" call Dret("netrw#CheckIfRemote 0")
5264 return 0
5265 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00005266endfun
5267
5268" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005269" s:NetrwChgPerm: (implements "gp") change file permission {{{2
5270fun! s:NetrwChgPerm(islocal,curdir)
5271" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005272 let ykeep = @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01005273 call inputsave()
5274 let newperm= input("Enter new permission: ")
5275 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005276 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',s:ShellEscape(expand("<cfile>")),'')
5277 let chgperm= substitute(chgperm,'\<PERM\>',s:ShellEscape(newperm),'')
5278" call Decho("chgperm<".chgperm.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005279 call system(chgperm)
5280 if v:shell_error != 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005281 NetrwKeepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005282 endif
5283 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005284 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005285 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005286 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01005287" call Dret("s:NetrwChgPerm")
5288endfun
5289
5290" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005291" s:CheckIfKde: checks if kdeinit is running {{{2
5292" Returns 0: kdeinit not running
5293" 1: kdeinit is running
5294fun! s:CheckIfKde()
5295" call Dfunc("s:CheckIfKde()")
5296 " seems kde systems often have gnome-open due to dependencies, even though
5297 " gnome-open's subsidiary display tools are largely absent. Kde systems
5298 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
5299 if !exists("s:haskdeinit")
5300 if has("unix") && executable("ps") && !has("win32unix")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005301 let s:haskdeinit= system("ps -e") =~ '\<kdeinit'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005302 if v:shell_error
5303 let s:haskdeinit = 0
5304 endif
5305 else
5306 let s:haskdeinit= 0
5307 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005308" call Decho("setting s:haskdeinit=".s:haskdeinit,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005309 endif
5310
5311" call Dret("s:CheckIfKde ".s:haskdeinit)
5312 return s:haskdeinit
5313endfun
5314
5315" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005316" s:NetrwClearExplore: clear explore variables (if any) {{{2
5317fun! s:NetrwClearExplore()
5318" call Dfunc("s:NetrwClearExplore()")
5319 2match none
5320 if exists("s:explore_match") |unlet s:explore_match |endif
5321 if exists("s:explore_indx") |unlet s:explore_indx |endif
5322 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
5323 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
5324 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
5325 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
5326 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
5327 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
5328 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
5329" redraw!
5330 echo " "
5331 echo " "
5332" call Dret("s:NetrwClearExplore")
5333endfun
5334
5335" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005336" s:NetrwExploreListUniq: {{{2
5337fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02005338" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005339
5340 " this assumes that the list is already sorted
5341 let newexplist= []
5342 for member in a:explist
5343 if !exists("uniqmember") || member != uniqmember
5344 let uniqmember = member
5345 let newexplist = newexplist + [ member ]
5346 endif
5347 endfor
5348
Bram Moolenaar15146672011-10-20 22:22:38 +02005349" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005350 return newexplist
5351endfun
5352
5353" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02005354" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
5355fun! s:NetrwForceChgDir(islocal,newdir)
5356" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005357 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02005358 if a:newdir !~ '/$'
5359 " ok, looks like force is needed to get directory-style treatment
5360 if a:newdir =~ '@$'
5361 let newdir= substitute(a:newdir,'@$','/','')
5362 elseif a:newdir =~ '[*=|\\]$'
5363 let newdir= substitute(a:newdir,'.$','/','')
5364 else
5365 let newdir= a:newdir.'/'
5366 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005367" call Decho("adjusting newdir<".newdir."> due to gd",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02005368 else
5369 " should already be getting treatment as a directory
5370 let newdir= a:newdir
5371 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005372 let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005373 call s:NetrwBrowse(a:islocal,newdir)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005374 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02005375" call Dret("s:NetrwForceChgDir")
5376endfun
5377
5378" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005379" s:NetrwGlob: does glob() if local, remote listing otherwise {{{2
5380fun! s:NetrwGlob(direntry,expr)
5381" call Dfunc("s:NetrwGlob(direntry<".a:direntry."> expr<".a:expr.">)")
5382 if netrw#CheckIfRemote()
5383 keepalt 1sp
5384 keepalt enew
5385 let keep_liststyle = w:netrw_liststyle
5386 let w:netrw_liststyle = s:THINLIST
5387 if s:NetrwRemoteListing() == 0
5388 keepj keepalt %s@/@@
5389 let filelist= getline(1,$)
5390 q!
5391 else
5392 " remote listing error -- leave treedict unchanged
5393 let filelist= w:netrw_treedict[a:direntry]
5394 endif
5395 let w:netrw_liststyle= keep_liststyle
5396 else
5397 let filelist= glob(s:ComposePath(a:direntry,a:expr),0,1,1)
5398 let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
5399 endif
5400" call Dret("s:NetrwGlob ".string(filelist))
5401 return filelist
5402endfun
5403
5404" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02005405" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
5406fun! s:NetrwForceFile(islocal,newfile)
Bram Moolenaarff034192013-04-24 18:51:19 +02005407" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005408 if a:newfile =~ '[/@*=|\\]$'
5409 let newfile= substitute(a:newfile,'.$','','')
5410 else
5411 let newfile= a:newfile
5412 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005413 if a:islocal
5414 call s:NetrwBrowseChgDir(a:islocal,newfile)
5415 else
5416 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
5417 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005418" call Dret("s:NetrwForceFile")
5419endfun
5420
5421" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005422" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
5423" and switches the hiding mode. The actual hiding is done by
5424" s:NetrwListHide().
5425" g:netrw_hide= 0: show all
5426" 1: show not-hidden files
5427" 2: show hidden files only
5428fun! s:NetrwHide(islocal)
5429" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005430 let ykeep= @@
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005431 let svpos= winsaveview()
5432" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005433
5434 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005435" call Decho("((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">",'~'.expand("<slnum>"))
5436" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005437
5438 " hide the files in the markfile list
5439 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005440" 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 +00005441 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
5442 " remove fname from hiding list
5443 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
5444 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
5445 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005446" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005447 else
5448 " append fname to hiding list
5449 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
5450 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
5451 else
5452 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
5453 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005454" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005455 endif
5456 endfor
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005457 NetrwKeepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005458 let g:netrw_hide= 1
5459
5460 else
5461
5462 " switch between show-all/show-not-hidden/show-hidden
5463 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005464 exe "NetrwKeepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005465 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005466 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005467 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005468" call Dret("NetrwHide")
5469 return
5470 endif
5471 endif
5472
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005473 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005474" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5475 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005476 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005477" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00005478endfun
5479
5480" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005481" s:NetrwHideEdit: allows user to edit the file/directory hiding list {{{2
5482fun! s:NetrwHideEdit(islocal)
5483" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
5484
5485 let ykeep= @@
5486 " save current cursor position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005487 let svpos= winsaveview()
5488" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005489
5490 " get new hiding list from user
5491 call inputsave()
5492 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
5493 call inputrestore()
5494 let g:netrw_list_hide= newhide
5495" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
5496
5497 " refresh the listing
5498 sil NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
5499
5500 " restore cursor position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005501" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5502 call winrestview(svpos)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005503 let @@= ykeep
5504
5505" call Dret("NetrwHideEdit")
5506endfun
5507
5508" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005509" s:NetrwHidden: invoked by "gh" {{{2
5510fun! s:NetrwHidden(islocal)
5511" call Dfunc("s:NetrwHidden()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005512 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005513 " save current position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005514 let svpos= winsaveview()
5515" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005516
5517 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
5518 " remove pattern from hiding list
5519 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01005520 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005521 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
5522 else
5523 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
5524 endif
5525
5526 " refresh screen and return to saved position
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005527 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005528" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5529 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005530 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005531" call Dret("s:NetrwHidden")
5532endfun
5533
5534" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005535" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
5536fun! s:NetrwHome()
5537 if exists("g:netrw_home")
5538 let home= g:netrw_home
5539 else
5540 " go to vim plugin home
5541 for home in split(&rtp,',') + ['']
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005542 if isdirectory(s:NetrwFile(home)) && filewritable(s:NetrwFile(home)) | break | endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005543 let basehome= substitute(home,'[/\\]\.vim$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005544 if isdirectory(s:NetrwFile(basehome)) && filewritable(s:NetrwFile(basehome))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005545 let home= basehome."/.vim"
5546 break
5547 endif
5548 endfor
5549 if home == ""
5550 " just pick the first directory
5551 let home= substitute(&rtp,',.*$','','')
5552 endif
5553 if (has("win32") || has("win95") || has("win64") || has("win16"))
5554 let home= substitute(home,'/','\\','g')
5555 endif
5556 endif
5557 " insure that the home directory exists
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005558 if g:netrw_dirhistmax > 0 && !isdirectory(s:NetrwFile(home))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005559 if exists("g:netrw_mkdir")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005560 call system(g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005561 else
5562 call mkdir(home)
5563 endif
5564 endif
5565 let g:netrw_home= home
5566 return home
5567endfun
5568
5569" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005570" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
5571fun! s:NetrwLeftmouse(islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02005572 if exists("s:netrwdrag")
5573 return
5574 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005575" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005576
Bram Moolenaar97d62492012-11-15 21:28:22 +01005577 let ykeep= @@
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005578 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02005579 while getchar(0) != 0
5580 "clear the input stream
5581 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005582 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005583 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005584 let mouse_lnum = v:mouse_lnum
5585 let wlastline = line('w$')
5586 let lastline = line('$')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005587" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr(),'~'.expand("<slnum>"))
5588" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0),'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005589 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
5590 " appears to be a status bar leftmouse click
Bram Moolenaar97d62492012-11-15 21:28:22 +01005591 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005592" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
5593 return
5594 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005595 " Dec 04, 2013: following test prevents leftmouse selection/deselection of directories and files in treelist mode
Bram Moolenaar8d043172014-01-23 14:24:41 +01005596 " 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 +01005597 " without this test when its disabled.
5598 " 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 +01005599" 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 +01005600 if v:mouse_col > virtcol('.')
5601 let @@= ykeep
5602" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
5603 return
5604 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005605
Bram Moolenaar446cb832008-06-24 21:56:24 +00005606 if a:islocal
5607 if exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005608 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005609 endif
5610 else
5611 if exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005612 NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005613 endif
5614 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005615 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005616" call Dret("s:NetrwLeftmouse")
5617endfun
5618
5619" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005620" s:NetrwCLeftmouse: used to select a file/directory for a target {{{2
5621fun! s:NetrwCLeftmouse(islocal)
5622" call Dfunc("s:NetrwCLeftmouse(islocal=".a:islocal.")")
5623 call s:NetrwMarkFileTgt(a:islocal)
5624" call Dret("s:NetrwCLeftmouse")
5625endfun
5626
5627" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005628" s:NetrwServerEdit: edit file in a server gvim, usually NETRWSERVER (implements <c-r>){{{2
5629" a:islocal=0 : <c-r> not used, remote
5630" a:islocal=1 : <c-r> no used, local
5631" a:islocal=2 : <c-r> used, remote
5632" a:islocal=3 : <c-r> used, local
5633fun! s:NetrwServerEdit(islocal,fname)
5634" call Dfunc("s:NetrwServerEdit(islocal=".a:islocal.",fname<".a:fname.">)")
5635 let islocal = a:islocal%2 " =0: remote =1: local
5636 let ctrlr = a:islocal >= 2 " =0: <c-r> not used =1: <c-r> used
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005637" call Decho("islocal=".islocal." ctrlr=".ctrlr,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005638
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005639 if (islocal && isdirectory(s:NetrwFile(a:fname))) || (!islocal && a:fname =~ '/$')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005640 " handle directories in the local window -- not in the remote vim server
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005641 " user must have closed the NETRWSERVER window. Treat as normal editing from netrw.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005642" call Decho("handling directory in client window",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005643 let g:netrw_browse_split= 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005644 if exists("s:netrw_browse_split") && exists("s:netrw_browse_split_".winnr())
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005645 let g:netrw_browse_split= s:netrw_browse_split_{winnr()}
5646 unlet s:netrw_browse_split_{winnr()}
5647 endif
5648 call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,a:fname))
5649" call Dret("s:NetrwServerEdit")
5650 return
5651 endif
5652
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005653" call Decho("handling file in server window",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005654 if has("clientserver") && executable("gvim")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005655" call Decho("has clientserver and gvim",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005656
5657 if exists("g:netrw_browse_split") && type(g:netrw_browse_split) == 3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005658" call Decho("g:netrw_browse_split=".string(g:netrw_browse_split),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005659 let srvrname = g:netrw_browse_split[0]
5660 let tabnum = g:netrw_browse_split[1]
5661 let winnum = g:netrw_browse_split[2]
5662
5663 if serverlist() !~ '\<'.srvrname.'\>'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005664" call Decho("server not available; ctrlr=".ctrlr,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005665
5666 if !ctrlr
5667 " user must have closed the server window and the user did not use <c-r>, but
5668 " used something like <cr>.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005669" call Decho("user must have closed server AND did not use ctrl-r",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005670 if exists("g:netrw_browse_split")
5671 unlet g:netrw_browse_split
5672 endif
5673 let g:netrw_browse_split= 0
5674 if exists("s:netrw_browse_split_".winnr())
5675 let g:netrw_browse_split= s:netrw_browse_split_{winnr()}
5676 endif
5677 call s:NetrwBrowseChgDir(islocal,a:fname)
5678" call Dret("s:NetrwServerEdit")
5679 return
5680
5681 elseif has("win32") && executable("start")
5682 " start up remote netrw server under windows
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005683" call Decho("starting up gvim server<".srvrname."> for windows",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005684 call system("start gvim --servername ".srvrname)
5685
5686 else
5687 " start up remote netrw server under linux
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005688" call Decho("starting up gvim server<".srvrname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005689 call system("gvim --servername ".srvrname)
5690 endif
5691 endif
5692
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005693" call Decho("srvrname<".srvrname."> tabnum=".tabnum." winnum=".winnum." server-editing<".a:fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005694 call remote_send(srvrname,":tabn ".tabnum."\<cr>")
5695 call remote_send(srvrname,":".winnum."wincmd w\<cr>")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005696 call remote_send(srvrname,":e ".fnameescape(s:NetrwFile(a:fname))."\<cr>")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005697
5698 else
5699
5700 if serverlist() !~ '\<'.g:netrw_servername.'\>'
5701
5702 if !ctrlr
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005703" call Decho("server<".g:netrw_servername."> not available and ctrl-r not used",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005704 if exists("g:netrw_browse_split")
5705 unlet g:netrw_browse_split
5706 endif
5707 let g:netrw_browse_split= 0
5708 call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,a:fname))
5709" call Dret("s:NetrwServerEdit")
5710 return
5711
5712 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005713" call Decho("server<".g:netrw_servername."> not available but ctrl-r used",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005714 if has("win32") && executable("start")
5715 " start up remote netrw server under windows
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005716" call Decho("starting up gvim server<".g:netrw_servername."> for windows",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005717 call system("start gvim --servername ".g:netrw_servername)
5718 else
5719 " start up remote netrw server under linux
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005720" call Decho("starting up gvim server<".g:netrw_servername.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005721 call system("gvim --servername ".g:netrw_servername)
5722 endif
5723 endif
5724 endif
5725
5726 while 1
5727 try
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005728" call Decho("remote-send: e ".a:fname,'~'.expand("<slnum>"))
5729 call remote_send(g:netrw_servername,":e ".fnameescape(s:NetrwFile(a:fname))."\<cr>")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005730 break
5731 catch /^Vim\%((\a\+)\)\=:E241/
5732 sleep 200m
5733 endtry
5734 endwhile
5735
5736 if exists("g:netrw_browse_split")
5737 if type(g:netrw_browse_split) != 3
5738 let s:netrw_browse_split_{winnr()}= g:netrw_browse_split
5739 endif
5740 unlet g:netrw_browse_split
5741 endif
5742 let g:netrw_browse_split= [g:netrw_servername,1,1]
5743 endif
5744
5745 else
5746 call netrw#ErrorMsg(s:ERROR,"you need a gui-capable vim and client-server to use <ctrl-r>",98)
5747 endif
5748
5749" call Dret("s:NetrwServerEdit")
5750endfun
5751
5752" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01005753" s:NetrwSLeftmouse: marks the file under the cursor. May be dragged to select additional files {{{2
5754fun! s:NetrwSLeftmouse(islocal)
5755" call Dfunc("s:NetrwSLeftmouse(islocal=".a:islocal.")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005756
Bram Moolenaar8d043172014-01-23 14:24:41 +01005757 let s:ngw= s:NetrwGetWord()
5758 call s:NetrwMarkFile(a:islocal,s:ngw)
5759
5760" call Dret("s:NetrwSLeftmouse")
Bram Moolenaarff034192013-04-24 18:51:19 +02005761endfun
5762
5763" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01005764" s:NetrwSLeftdrag: invoked via a shift-leftmouse and dragging {{{2
5765" Used to mark multiple files.
5766fun! s:NetrwSLeftdrag(islocal)
5767" call Dfunc("s:NetrwSLeftdrag(islocal=".a:islocal.")")
5768 if !exists("s:netrwdrag")
5769 let s:netrwdrag = winnr()
5770 if a:islocal
5771 nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02005772 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01005773 nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(0)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02005774 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01005775 endif
5776 let ngw = s:NetrwGetWord()
5777 if !exists("s:ngw") || s:ngw != ngw
5778 call s:NetrwMarkFile(a:islocal,ngw)
5779 endif
5780 let s:ngw= ngw
5781" call Dret("s:NetrwSLeftdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5782endfun
5783
5784" ---------------------------------------------------------------------
5785" s:NetrwSLeftrelease: terminates shift-leftmouse dragging {{{2
5786fun! s:NetrwSLeftrelease(islocal)
5787" call Dfunc("s:NetrwSLeftrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5788 if exists("s:netrwdrag")
5789 nunmap <s-leftrelease>
5790 let ngw = s:NetrwGetWord()
5791 if !exists("s:ngw") || s:ngw != ngw
5792 call s:NetrwMarkFile(a:islocal,ngw)
5793 endif
5794 if exists("s:ngw")
5795 unlet s:ngw
5796 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005797 unlet s:netrwdrag
5798 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01005799" call Dret("s:NetrwSLeftrelease")
Bram Moolenaarff034192013-04-24 18:51:19 +02005800endfun
5801
5802" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005803" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
5804" separated patterns given in g:netrw_list_hide
5805fun! s:NetrwListHide()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005806" call Dfunc("s:NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005807 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005808
5809 " find a character not in the "hide" string to use as a separator for :g and :v commands
5810 " How-it-works: take the hiding command, convert it into a range. Duplicate
5811 " characters don't matter. Remove all such characters from the '/~...90'
5812 " string. Use the first character left as a separator character.
5813 let listhide= g:netrw_list_hide
5814 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005815" call Decho("sep=".sep,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005816
5817 while listhide != ""
5818 if listhide =~ ','
5819 let hide = substitute(listhide,',.*$','','e')
5820 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
5821 else
5822 let hide = listhide
5823 let listhide = ""
5824 endif
5825
5826 " Prune the list by hiding any files which match
5827 if g:netrw_hide == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005828" call Decho("hiding<".hide."> listhide<".listhide.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005829 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005830 elseif g:netrw_hide == 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005831" call Decho("showing<".hide."> listhide<".listhide.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005832 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005833 endif
5834 endwhile
5835 if g:netrw_hide == 2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005836 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
5837 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005838 endif
5839
Bram Moolenaaradc21822011-04-01 18:03:16 +02005840 " remove any blank lines that have somehow remained.
5841 " This seems to happen under Windows.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005842 exe 'sil! NetrwKeepj 1,$g@^\s*$@d'
Bram Moolenaaradc21822011-04-01 18:03:16 +02005843
Bram Moolenaar97d62492012-11-15 21:28:22 +01005844 let @@= ykeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005845" call Dret("s:NetrwListHide")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005846endfun
5847
5848" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005849" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005850" implements the "d" mapping.
Bram Moolenaar446cb832008-06-24 21:56:24 +00005851fun! s:NetrwMakeDir(usrhost)
Bram Moolenaara6878372014-03-22 21:02:50 +01005852" call Dfunc("s:NetrwMakeDir(usrhost<".a:usrhost.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005853
Bram Moolenaar97d62492012-11-15 21:28:22 +01005854 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005855 " get name of new directory from user. A bare <CR> will skip.
5856 " if its currently a directory, also request will be skipped, but with
5857 " a message.
5858 call inputsave()
5859 let newdirname= input("Please give directory name: ")
5860 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005861" call Decho("newdirname<".newdirname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005862
5863 if newdirname == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01005864 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01005865" call Dret("s:NetrwMakeDir : user aborted with bare <cr>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005866 return
5867 endif
5868
5869 if a:usrhost == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005870" call Decho("local mkdir",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005871
5872 " Local mkdir:
5873 " sanity checks
5874 let fullnewdir= b:netrw_curdir.'/'.newdirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005875" call Decho("fullnewdir<".fullnewdir.">",'~'.expand("<slnum>"))
5876 if isdirectory(s:NetrwFile(fullnewdir))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005877 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005878 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005879 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005880 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01005881" call Dret("s:NetrwMakeDir : directory<".newdirname."> exists previously")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005882 return
5883 endif
5884 if s:FileReadable(fullnewdir)
5885 if !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005886 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005887 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005888 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01005889" call Dret("s:NetrwMakeDir : file<".newdirname."> exists previously")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005890 return
5891 endif
5892
5893 " requested new local directory is neither a pre-existing file or
5894 " directory, so make it!
5895 if exists("*mkdir")
Bram Moolenaar8d043172014-01-23 14:24:41 +01005896 if has("unix")
5897 call mkdir(fullnewdir,"p",xor(0777, system("umask")))
5898 else
5899 call mkdir(fullnewdir,"p")
5900 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005901 else
5902 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaara6878372014-03-22 21:02:50 +01005903 call s:NetrwLcd(b:netrw_curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005904" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">",'~'.expand("<slnum>"))
5905 call s:NetrwExe("sil! !".g:netrw_localmkdir.' '.s:ShellEscape(newdirname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005906 if v:shell_error != 0
5907 let @@= ykeep
5908 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 +01005909" call Dret("s:NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.s:ShellEscape(newdirname,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01005910 return
5911 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005912 if !g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005913" call Decho("restoring netrw_origdir since g:netrw_keepdir=".g:netrw_keepdir,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005914 call s:NetrwLcd(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005915 endif
5916 endif
5917
5918 if v:shell_error == 0
5919 " refresh listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005920" call Decho("refresh listing",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005921 let svpos= winsaveview()
5922" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005923 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005924" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5925 call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005926 elseif !exists("g:netrw_quiet")
5927 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
5928 endif
5929" redraw!
5930
5931 elseif !exists("b:netrw_method") || b:netrw_method == 4
Bram Moolenaara6878372014-03-22 21:02:50 +01005932 " Remote mkdir: using ssh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005933" call Decho("remote mkdir",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005934 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
5935 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005936 call s:NetrwExe("sil! !".mkdircmd." ".s:ShellEscape(newdirname,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005937 if v:shell_error == 0
5938 " refresh listing
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005939 let svpos= winsaveview()
5940" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005941 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005942" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5943 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005944 elseif !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005945 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005946 endif
5947" redraw!
5948
5949 elseif b:netrw_method == 2
Bram Moolenaara6878372014-03-22 21:02:50 +01005950 " Remote mkdir: using ftp+.netrc
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005951 let svpos= winsaveview()
5952" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005953" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005954 if exists("b:netrw_fname")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005955" call Decho("b:netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005956 let remotepath= b:netrw_fname
5957 else
5958 let remotepath= ""
5959 endif
5960 call s:NetrwRemoteFtpCmd(remotepath,g:netrw_remote_mkdir.' "'.newdirname.'"')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005961 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005962" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5963 NetrwKeepj call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01005964
Bram Moolenaar446cb832008-06-24 21:56:24 +00005965 elseif b:netrw_method == 3
Bram Moolenaara6878372014-03-22 21:02:50 +01005966 " Remote mkdir: using ftp + machine, id, passwd, and fname (ie. no .netrc)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005967 let svpos= winsaveview()
5968" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005969" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005970 if exists("b:netrw_fname")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005971" call Decho("b:netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01005972 let remotepath= b:netrw_fname
5973 else
5974 let remotepath= ""
5975 endif
5976 call s:NetrwRemoteFtpCmd(remotepath,g:netrw_remote_mkdir.' "'.newdirname.'"')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01005977 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005978" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
5979 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005980 endif
5981
Bram Moolenaar97d62492012-11-15 21:28:22 +01005982 let @@= ykeep
Bram Moolenaara6878372014-03-22 21:02:50 +01005983" call Dret("s:NetrwMakeDir")
5984endfun
5985
5986" ---------------------------------------------------------------------
5987" s:TreeSqueezeDir: allows a shift-cr (gvim only) to squeeze the current tree-listing directory {{{2
5988fun! s:TreeSqueezeDir(islocal)
5989" call Dfunc("s:TreeSqueezeDir(islocal=".a:islocal.")")
5990 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5991 " its a tree-listing style
5992 let curdepth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
Bram Moolenaara6878372014-03-22 21:02:50 +01005993 let stopline = (exists("w:netrw_bannercnt")? (w:netrw_bannercnt + 1) : 1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005994 let depth = strchars(substitute(curdepth,' ','','g'))
5995 let srch = -1
5996" call Decho("curdepth<".curdepth.'>','~'.expand("<slnum>"))
5997" call Decho("depth =".depth,'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01005998" call Decho("stopline#".stopline,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01005999" call Decho("curline#".line(".")."<".getline('.').'>','~'.expand("<slnum>"))
6000 if depth >= 2
6001 NetrwKeepj norm! 0
6002 let curdepthm1= substitute(curdepth,'^'.s:treedepthstring,'','')
6003 let srch = search('^'.curdepthm1.'\%('.s:treedepthstring.'\)\@!','bW',stopline)
6004" call Decho("curdepthm1<".curdepthm1.'>','~'.expand("<slnum>"))
6005" call Decho("case depth>=2: srch<".srch.'>','~'.expand("<slnum>"))
6006 elseif depth == 1
6007 NetrwKeepj norm! 0
6008 let treedepthchr= substitute(s:treedepthstring,' ','','')
6009 let srch = search('^[^'.treedepthchr.']','bW',stopline)
6010" call Decho("case depth==1: srch<".srch.'>','~'.expand("<slnum>"))
6011 endif
6012 if srch > 0
6013" call Decho("squeezing at line#".line(".").": ".getline('.'),'~'.expand("<slnum>"))
6014 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,s:NetrwGetWord()))
6015 exe srch
6016 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01006017 endif
6018" call Dret("s:TreeSqueezeDir")
6019endfun
6020
6021" ---------------------------------------------------------------------
6022" s:NetrwMaps: {{{2
6023fun! s:NetrwMaps(islocal)
6024" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
6025
6026 if g:netrw_mousemaps && g:netrw_retmap
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006027" call Decho("set up Rexplore 2-leftmouse",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006028 if !hasmapto("<Plug>NetrwReturn")
6029 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006030" call Decho("making map for 2-leftmouse",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006031 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
6032 elseif maparg("<c-leftmouse>","n") == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006033" call Decho("making map for c-leftmouse",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006034 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
6035 endif
6036 endif
6037 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006038" call Decho("made <Plug>NetrwReturn map",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006039 endif
6040
6041 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006042" call Decho("make local maps",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006043 " local normal-mode maps
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006044 nnoremap <buffer> <silent> <nowait> a :<c-u>call <SID>NetrwHide(1)<cr>
6045 nnoremap <buffer> <silent> <nowait> - :<c-u>call <SID>NetrwBrowseUpDir(1)<cr>
6046 nnoremap <buffer> <silent> <nowait> % :<c-u>call <SID>NetrwOpenFile(1)<cr>
6047 nnoremap <buffer> <silent> <nowait> c :<c-u>call <SID>NetrwLcd(b:netrw_curdir)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006048 nnoremap <buffer> <silent> <nowait> C :<c-u>call <SID>NetrwSetChgwin()<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006049 nnoremap <buffer> <silent> <nowait> <cr> :<c-u>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
6050 nnoremap <buffer> <silent> <nowait> <c-r> :<c-u>call <SID>NetrwServerEdit(3,<SID>NetrwGetWord())<cr>
6051 nnoremap <buffer> <silent> <nowait> d :<c-u>call <SID>NetrwMakeDir("")<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006052 nnoremap <buffer> <silent> <nowait> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
6053 nnoremap <buffer> <silent> <nowait> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
6054 nnoremap <buffer> <silent> <nowait> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
6055 nnoremap <buffer> <silent> <nowait> gh :<c-u>call <SID>NetrwHidden(1)<cr>
6056 nnoremap <buffer> <silent> <nowait> gn :<c-u>call netrw#SetTreetop(<SID>NetrwGetWord())<cr>
6057 nnoremap <buffer> <silent> <nowait> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006058 nnoremap <buffer> <silent> <nowait> I :<c-u>call <SID>NetrwBannerCtrl(1)<cr>
6059 nnoremap <buffer> <silent> <nowait> i :<c-u>call <SID>NetrwListStyle(1)<cr>
6060 nnoremap <buffer> <silent> <nowait> ma :<c-u>call <SID>NetrwMarkFileArgList(1,0)<cr>
6061 nnoremap <buffer> <silent> <nowait> mA :<c-u>call <SID>NetrwMarkFileArgList(1,1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006062 nnoremap <buffer> <silent> <nowait> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
6063 nnoremap <buffer> <silent> <nowait> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
6064 nnoremap <buffer> <silent> <nowait> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
6065 nnoremap <buffer> <silent> <nowait> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
6066 nnoremap <buffer> <silent> <nowait> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
6067 nnoremap <buffer> <silent> <nowait> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
6068 nnoremap <buffer> <silent> <nowait> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
6069 nnoremap <buffer> <silent> <nowait> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
6070 nnoremap <buffer> <silent> <nowait> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
6071 nnoremap <buffer> <silent> <nowait> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
6072 nnoremap <buffer> <silent> <nowait> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
6073 nnoremap <buffer> <silent> <nowait> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
6074 nnoremap <buffer> <silent> <nowait> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006075 nnoremap <buffer> <silent> <nowait> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006076 nnoremap <buffer> <silent> <nowait> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006077 nnoremap <buffer> <silent> <nowait> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
6078 nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
6079 nnoremap <buffer> <silent> <nowait> mx :<c-u>call <SID>NetrwMarkFileExe(1,0)<cr>
6080 nnoremap <buffer> <silent> <nowait> mX :<c-u>call <SID>NetrwMarkFileExe(1,1)<cr>
6081 nnoremap <buffer> <silent> <nowait> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006082 nnoremap <buffer> <silent> <nowait> O :<c-u>call <SID>NetrwObtain(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006083 nnoremap <buffer> <silent> <nowait> o :call <SID>NetrwSplit(3)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006084 nnoremap <buffer> <silent> <nowait> p :<c-u>call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
6085 nnoremap <buffer> <silent> <nowait> P :<c-u>call <SID>NetrwPrevWinOpen(1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006086 nnoremap <buffer> <silent> <nowait> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
6087 nnoremap <buffer> <silent> <nowait> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
6088 nnoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006089 nnoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(1,getloclist(v:count))<cr>
6090 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 Moolenaara0f849e2015-10-30 14:37:44 +01006091 nnoremap <buffer> <silent> <nowait> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006092 nnoremap <buffer> <silent> <nowait> S :<c-u>call <SID>NetSortSequence(1)<cr>
6093 nnoremap <buffer> <silent> <nowait> Tb :<c-u>call <SID>NetrwSetTgt(1,'b',v:count1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006094 nnoremap <buffer> <silent> <nowait> t :call <SID>NetrwSplit(4)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006095 nnoremap <buffer> <silent> <nowait> Th :<c-u>call <SID>NetrwSetTgt(1,'h',v:count)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006096 nnoremap <buffer> <silent> <nowait> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
6097 nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
6098 nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(5)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006099 nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
6100 nnoremap <buffer> <silent> <nowait> X :<c-u>call <SID>NetrwLocalExecute(expand("<cword>"))"<cr>
6101" " local insert-mode maps
6102" inoremap <buffer> <silent> <nowait> a <c-o>:call <SID>NetrwHide(1)<cr>
6103" inoremap <buffer> <silent> <nowait> c <c-o>:exe "NetrwKeepj lcd ".fnameescape(b:netrw_curdir)<cr>
6104" inoremap <buffer> <silent> <nowait> c <c-o>:call <SID>NetrwLcd(b:netrw_curdir)<cr>
6105" inoremap <buffer> <silent> <nowait> C <c-o>:call <SID>NetrwSetChgwin()<cr>
6106" inoremap <buffer> <silent> <nowait> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
6107" inoremap <buffer> <silent> <nowait> - <c-o>:call <SID>NetrwBrowseUpDir(1)<cr>
6108" inoremap <buffer> <silent> <nowait> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
6109" inoremap <buffer> <silent> <nowait> d <c-o>:call <SID>NetrwMakeDir("")<cr>
6110" inoremap <buffer> <silent> <nowait> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
6111" inoremap <buffer> <silent> <nowait> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
6112" nnoremap <buffer> <silent> <nowait> gn :<c-u>call netrw#SetTreetop(<SID>NetrwGetWord())<cr>
6113" inoremap <buffer> <silent> <nowait> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
6114" inoremap <buffer> <silent> <nowait> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
6115" inoremap <buffer> <silent> <nowait> i <c-o>:call <SID>NetrwListStyle(1)<cr>
6116" inoremap <buffer> <silent> <nowait> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
6117" inoremap <buffer> <silent> <nowait> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
6118" inoremap <buffer> <silent> <nowait> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
6119" inoremap <buffer> <silent> <nowait> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
6120" inoremap <buffer> <silent> <nowait> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
6121" inoremap <buffer> <silent> <nowait> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
6122" inoremap <buffer> <silent> <nowait> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
6123" inoremap <buffer> <silent> <nowait> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
6124" inoremap <buffer> <silent> <nowait> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
6125" inoremap <buffer> <silent> <nowait> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
6126" inoremap <buffer> <silent> <nowait> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
6127" inoremap <buffer> <silent> <nowait> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
6128" inoremap <buffer> <silent> <nowait> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
6129" inoremap <buffer> <silent> <nowait> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
6130" inoremap <buffer> <silent> <nowait> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
6131" inoremap <buffer> <silent> <nowait> mv <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
6132" inoremap <buffer> <silent> <nowait> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1,0)<cr>
6133" inoremap <buffer> <silent> <nowait> mX <c-o>:<c-u>call <SID>NetrwMarkFileExe(1,1)<cr>
6134" inoremap <buffer> <silent> <nowait> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
6135" inoremap <buffer> <silent> <nowait> O <c-o>:call <SID>NetrwObtain(1)<cr>
6136" inoremap <buffer> <silent> <nowait> o <c-o>:call <SID>NetrwSplit(3)<cr>
6137" inoremap <buffer> <silent> <nowait> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
6138" inoremap <buffer> <silent> <nowait> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
6139" inoremap <buffer> <silent> <nowait> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
6140" inoremap <buffer> <silent> <nowait> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
6141" inoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
6142" inoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(1,getloclist(v:count))<cr>
6143" inoremap <buffer> <silent> <nowait> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
6144" inoremap <buffer> <silent> <nowait> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
6145" inoremap <buffer> <silent> <nowait> S <c-o>:call <SID>NetSortSequence(1)<cr>
6146" inoremap <buffer> <silent> <nowait> t <c-o>:call <SID>NetrwSplit(4)<cr>
6147" inoremap <buffer> <silent> <nowait> Tb <c-o>:<c-u>call <SID>NetrwSetTgt(1,'b',v:count1)<cr>
6148" inoremap <buffer> <silent> <nowait> Th <c-o>:<c-u>call <SID>NetrwSetTgt(1,'h',v:count)<cr>
6149" inoremap <buffer> <silent> <nowait> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
6150" inoremap <buffer> <silent> <nowait> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
6151" inoremap <buffer> <silent> <nowait> v <c-o>:call <SID>NetrwSplit(5)<cr>
6152" inoremap <buffer> <silent> <nowait> x <c-o>:call netrw#BrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006153 if !hasmapto('<Plug>NetrwHideEdit')
6154 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006155" imap <buffer> <unique> <c-h> <c-o><Plug>NetrwHideEdit
Bram Moolenaara6878372014-03-22 21:02:50 +01006156 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006157 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006158 if !hasmapto('<Plug>NetrwRefresh')
6159 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006160" imap <buffer> <unique> <c-l> <c-o><Plug>NetrwRefresh
Bram Moolenaara6878372014-03-22 21:02:50 +01006161 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006162 nnoremap <buffer> <silent> <Plug>NetrwRefresh <c-l>:call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,(w:netrw_liststyle == 3)? w:netrw_treetop : './'))<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006163 if s:didstarstar || !mapcheck("<s-down>","n")
6164 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006165" inoremap <buffer> <silent> <s-down> <c-o>:Nexplore<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006166 endif
6167 if s:didstarstar || !mapcheck("<s-up>","n")
6168 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006169" inoremap <buffer> <silent> <s-up> <c-o>:Pexplore<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006170 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006171 if !hasmapto('<Plug>NetrwTreeSqueeze')
6172 nmap <buffer> <silent> <nowait> <s-cr> <Plug>NetrwTreeSqueeze
6173" imap <buffer> <silent> <nowait> <s-cr> <c-o><Plug>NetrwTreeSqueeze
6174 endif
6175 nnoremap <buffer> <silent> <Plug>NetrwTreeSqueeze :call <SID>TreeSqueezeDir(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006176 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
6177 if g:netrw_mousemaps == 1
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006178 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006179 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
6180 nmap <buffer> <c-leftmouse> <Plug>NetrwCLeftmouse
6181 nno <buffer> <silent> <Plug>NetrwCLeftmouse <leftmouse>:call <SID>NetrwCLeftmouse(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006182 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006183 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006184 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006185 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006186 nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006187 nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006188 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006189 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
Bram Moolenaara6878372014-03-22 21:02:50 +01006190 imap <buffer> <leftmouse> <Plug>ILeftmouse
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006191" ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006192 imap <buffer> <middlemouse> <Plug>IMiddlemouse
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006193" ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
6194" imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
6195" ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006196 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6197 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006198" exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006199 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006200 exe 'nnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6201 exe 'nnoremap <buffer> <silent> <nowait> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6202 exe 'nnoremap <buffer> <silent> <nowait> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
6203 exe 'nnoremap <buffer> <silent> <nowait> d :call <SID>NetrwMakeDir("")<cr>'
6204 exe 'vnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6205 exe 'vnoremap <buffer> <silent> <nowait> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6206 exe 'vnoremap <buffer> <silent> <nowait> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006207" exe 'inoremap <buffer> <silent> <nowait> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6208" exe 'inoremap <buffer> <silent> <nowait> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
6209" exe 'inoremap <buffer> <silent> <nowait> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
6210" exe 'inoremap <buffer> <silent> <nowait> d <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006211 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
6212
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006213 " support user-specified maps
6214 call netrw#UserMaps(1)
6215
Bram Moolenaara6878372014-03-22 21:02:50 +01006216 else " remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006217" call Decho("make remote maps",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006218 call s:RemotePathAnalysis(b:netrw_curdir)
6219 " remote normal-mode maps
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006220 nnoremap <buffer> <silent> <nowait> a :<c-u>call <SID>NetrwHide(0)<cr>
6221 nnoremap <buffer> <silent> <nowait> - :<c-u>call <SID>NetrwBrowseUpDir(0)<cr>
6222 nnoremap <buffer> <silent> <nowait> % :<c-u>call <SID>NetrwOpenFile(0)<cr>
6223 nnoremap <buffer> <silent> <nowait> C :<c-u>call <SID>NetrwSetChgwin()<cr>
6224 nnoremap <buffer> <silent> <nowait> <c-l> :<c-u>call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
6225 nnoremap <buffer> <silent> <nowait> <cr> :<c-u>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
6226 nnoremap <buffer> <silent> <nowait> <c-r> :<c-u>call <SID>NetrwServerEdit(2,<SID>NetrwGetWord())<cr>
6227 nnoremap <buffer> <silent> <nowait> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
6228 nnoremap <buffer> <silent> <nowait> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
6229 nnoremap <buffer> <silent> <nowait> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
6230 nnoremap <buffer> <silent> <nowait> gh :<c-u>call <SID>NetrwHidden(0)<cr>
6231 nnoremap <buffer> <silent> <nowait> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
6232 nnoremap <buffer> <silent> <nowait> I :<c-u>call <SID>NetrwBannerCtrl(1)<cr>
6233 nnoremap <buffer> <silent> <nowait> i :<c-u>call <SID>NetrwListStyle(0)<cr>
6234 nnoremap <buffer> <silent> <nowait> ma :<c-u>call <SID>NetrwMarkFileArgList(0,0)<cr>
6235 nnoremap <buffer> <silent> <nowait> mA :<c-u>call <SID>NetrwMarkFileArgList(0,1)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006236 nnoremap <buffer> <silent> <nowait> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006237 nnoremap <buffer> <silent> <nowait> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006238 nnoremap <buffer> <silent> <nowait> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
6239 nnoremap <buffer> <silent> <nowait> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
6240 nnoremap <buffer> <silent> <nowait> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
6241 nnoremap <buffer> <silent> <nowait> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
6242 nnoremap <buffer> <silent> <nowait> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
6243 nnoremap <buffer> <silent> <nowait> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
6244 nnoremap <buffer> <silent> <nowait> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
6245 nnoremap <buffer> <silent> <nowait> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
6246 nnoremap <buffer> <silent> <nowait> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
6247 nnoremap <buffer> <silent> <nowait> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
6248 nnoremap <buffer> <silent> <nowait> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006249 nnoremap <buffer> <silent> <nowait> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006250 nnoremap <buffer> <silent> <nowait> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006251 nnoremap <buffer> <silent> <nowait> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
6252 nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
6253 nnoremap <buffer> <silent> <nowait> mx :<c-u>call <SID>NetrwMarkFileExe(0,0)<cr>
6254 nnoremap <buffer> <silent> <nowait> mX :<c-u>call <SID>NetrwMarkFileExe(0,1)<cr>
6255 nnoremap <buffer> <silent> <nowait> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006256 nnoremap <buffer> <silent> <nowait> O :<c-u>call <SID>NetrwObtain(0)<cr>
6257 nnoremap <buffer> <silent> <nowait> o :call <SID>NetrwSplit(0)<cr>
6258 nnoremap <buffer> <silent> <nowait> p :<c-u>call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
6259 nnoremap <buffer> <silent> <nowait> P :<c-u>call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006260 nnoremap <buffer> <silent> <nowait> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006261 nnoremap <buffer> <silent> <nowait> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
6262 nnoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006263 nnoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(0,getloclist(v:count))<cr>
6264 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>
6265 nnoremap <buffer> <silent> <nowait> s :call <SID>NetrwSortStyle(0)<cr>
6266 nnoremap <buffer> <silent> <nowait> S :<c-u>call <SID>NetSortSequence(0)<cr>
6267 nnoremap <buffer> <silent> <nowait> Tb :<c-u>call <SID>NetrwSetTgt(0,'b',v:count1)<cr>
6268 nnoremap <buffer> <silent> <nowait> t :call <SID>NetrwSplit(1)<cr>
6269 nnoremap <buffer> <silent> <nowait> Th :<c-u>call <SID>NetrwSetTgt(0,'h',v:count)<cr>
6270 nnoremap <buffer> <silent> <nowait> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
6271 nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
6272 nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(2)<cr>
6273 nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
6274" " remote insert-mode maps
6275" inoremap <buffer> <silent> <nowait> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
6276" inoremap <buffer> <silent> <nowait> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
6277" inoremap <buffer> <silent> <nowait> <s-cr> <c-o>:call <SID>TreeSqueezeDir(0)<cr>
6278" inoremap <buffer> <silent> <nowait> - <c-o>:call <SID>NetrwBrowseUpDir(0)<cr>
6279" inoremap <buffer> <silent> <nowait> a <c-o>:call <SID>NetrwHide(0)<cr>
6280" inoremap <buffer> <silent> <nowait> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
6281" inoremap <buffer> <silent> <nowait> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
6282" inoremap <buffer> <silent> <nowait> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
6283" inoremap <buffer> <silent> <nowait> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
6284" inoremap <buffer> <silent> <nowait> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
6285" inoremap <buffer> <silent> <nowait> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
6286" inoremap <buffer> <silent> <nowait> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
6287" inoremap <buffer> <silent> <nowait> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
6288" inoremap <buffer> <silent> <nowait> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
6289" inoremap <buffer> <silent> <nowait> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
6290" inoremap <buffer> <silent> <nowait> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
6291" inoremap <buffer> <silent> <nowait> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
6292" inoremap <buffer> <silent> <nowait> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
6293" inoremap <buffer> <silent> <nowait> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
6294" nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
6295" inoremap <buffer> <silent> <nowait> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0,0)<cr>
6296" inoremap <buffer> <silent> <nowait> mX <c-o>:<c-u>call <SID>NetrwMarkFileExe(0,1)<cr>
6297" inoremap <buffer> <silent> <nowait> mv <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
6298" inoremap <buffer> <silent> <nowait> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
6299" inoremap <buffer> <silent> <nowait> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
6300" inoremap <buffer> <silent> <nowait> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
6301" inoremap <buffer> <silent> <nowait> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
6302" inoremap <buffer> <silent> <nowait> C <c-o>:call <SID>NetrwSetChgwin()<cr>
6303" inoremap <buffer> <silent> <nowait> i <c-o>:call <SID>NetrwListStyle(0)<cr>
6304" inoremap <buffer> <silent> <nowait> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
6305" inoremap <buffer> <silent> <nowait> o <c-o>:call <SID>NetrwSplit(0)<cr>
6306" inoremap <buffer> <silent> <nowait> O <c-o>:call <SID>NetrwObtain(0)<cr>
6307" inoremap <buffer> <silent> <nowait> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
6308" inoremap <buffer> <silent> <nowait> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
6309" inoremap <buffer> <silent> <nowait> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
6310" inoremap <buffer> <silent> <nowait> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
6311" inoremap <buffer> <silent> <nowait> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
6312" inoremap <buffer> <silent> <nowait> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
6313" inoremap <buffer> <silent> <nowait> qL :<c-u>call <SID>NetrwMarkFileQFEL(0,getloclist(v:count))<cr>
6314" inoremap <buffer> <silent> <nowait> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
6315" inoremap <buffer> <silent> <nowait> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
6316" inoremap <buffer> <silent> <nowait> S <c-o>:call <SID>NetSortSequence(0)<cr>
6317" inoremap <buffer> <silent> <nowait> t <c-o>:call <SID>NetrwSplit(1)<cr>
6318" inoremap <buffer> <silent> <nowait> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
6319" inoremap <buffer> <silent> <nowait> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
6320" inoremap <buffer> <silent> <nowait> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
6321" inoremap <buffer> <silent> <nowait> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
6322" inoremap <buffer> <silent> <nowait> v <c-o>:call <SID>NetrwSplit(2)<cr>
6323" inoremap <buffer> <silent> <nowait> x <c-o>:call netrw#BrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
6324" inoremap <buffer> <silent> <nowait> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006325 if !hasmapto('<Plug>NetrwHideEdit')
6326 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006327" imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaara6878372014-03-22 21:02:50 +01006328 endif
6329 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
6330 if !hasmapto('<Plug>NetrwRefresh')
6331 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006332" imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaara6878372014-03-22 21:02:50 +01006333 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006334 if !hasmapto('<Plug>NetrwTreeSqueeze')
6335 nmap <buffer> <silent> <nowait> <s-cr> <Plug>NetrwTreeSqueeze
6336" imap <buffer> <silent> <nowait> <s-cr> <c-o><Plug>NetrwTreeSqueeze
6337 endif
6338 nnoremap <buffer> <silent> <Plug>NetrwTreeSqueeze :call <SID>TreeSqueezeDir(0)<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006339
6340 let mapsafepath = escape(s:path, s:netrw_map_escape)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006341 let mapsafeusermach = escape(((s:user == "")? "" : s:user."@").s:machine, s:netrw_map_escape)
Bram Moolenaara6878372014-03-22 21:02:50 +01006342
6343 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
6344 if g:netrw_mousemaps == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006345 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
6346 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
6347 nmap <buffer> <c-leftmouse> <Plug>NetrwCLeftmouse
6348 nno <buffer> <silent> <Plug>NetrwCLeftmouse <leftmouse>:call <SID>NetrwCLeftmouse(0)<cr>
6349 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
6350 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(0)<cr>
6351 nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
6352 nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(0)<cr>
6353 nmap <middlemouse> <Plug>NetrwMiddlemouse
6354 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
6355 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
6356 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
6357 imap <buffer> <leftmouse> <Plug>ILeftmouse
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006358" ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006359 imap <buffer> <middlemouse> <Plug>IMiddlemouse
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006360" ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006361 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006362" ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006363 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6364 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006365" exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006366 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006367 exe 'nnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6368 exe 'nnoremap <buffer> <silent> <nowait> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
6369 exe 'nnoremap <buffer> <silent> <nowait> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6370 exe 'nnoremap <buffer> <silent> <nowait> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6371 exe 'vnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6372 exe 'vnoremap <buffer> <silent> <nowait> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6373 exe 'vnoremap <buffer> <silent> <nowait> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006374" exe 'inoremap <buffer> <silent> <nowait> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6375" exe 'inoremap <buffer> <silent> <nowait> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
6376" exe 'inoremap <buffer> <silent> <nowait> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
6377" exe 'inoremap <buffer> <silent> <nowait> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaara6878372014-03-22 21:02:50 +01006378 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006379" inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaara6878372014-03-22 21:02:50 +01006380
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006381 " support user-specified maps
6382 call netrw#UserMaps(0)
6383 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01006384
6385" call Dret("s:NetrwMaps")
6386endfun
6387
6388" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006389" s:NetrwCommands: set up commands {{{2
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006390" If -buffer, the command is only available from within netrw buffers
6391" Otherwise, the command is available from any window, so long as netrw
6392" has been used at least once in the session.
Bram Moolenaara6878372014-03-22 21:02:50 +01006393fun! s:NetrwCommands(islocal)
6394" call Dfunc("s:NetrwCommands(islocal=".a:islocal.")")
6395
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006396 com! -nargs=* -complete=file -bang NetrwMB call s:NetrwBookmark(<bang>0,<f-args>)
6397 com! -nargs=* NetrwC call s:NetrwSetChgwin(<q-args>)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006398 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 +01006399 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006400 com! -buffer -nargs=+ -complete=file MF call s:NetrwMarkFiles(1,<f-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +01006401 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006402 com! -buffer -nargs=+ -complete=file MF call s:NetrwMarkFiles(0,<f-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +01006403 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006404 com! -buffer -nargs=? -complete=file MT call s:NetrwMarkTarget(<q-args>)
Bram Moolenaara6878372014-03-22 21:02:50 +01006405
6406" call Dret("s:NetrwCommands")
6407endfun
6408
6409" ---------------------------------------------------------------------
6410" s:NetrwMarkFiles: apply s:NetrwMarkFile() to named file(s) {{{2
6411" glob()ing only works with local files
6412fun! s:NetrwMarkFiles(islocal,...)
6413" call Dfunc("s:NetrwMarkFiles(islocal=".a:islocal."...) a:0=".a:0)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006414 let curdir = s:NetrwGetCurdir(a:islocal)
6415 let i = 1
Bram Moolenaara6878372014-03-22 21:02:50 +01006416 while i <= a:0
6417 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006418 if v:version == 704 && has("patch656")
6419 let mffiles= glob(a:{i},0,1,1)
6420 else
6421 let mffiles= glob(a:{i},0,1)
6422 endif
Bram Moolenaara6878372014-03-22 21:02:50 +01006423 else
6424 let mffiles= [a:{i}]
6425 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006426" call Decho("mffiles".string(mffiles),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006427 for mffile in mffiles
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006428" call Decho("mffile<".mffile.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006429 call s:NetrwMarkFile(a:islocal,mffile)
6430 endfor
6431 let i= i + 1
6432 endwhile
6433" call Dret("s:NetrwMarkFiles")
6434endfun
6435
6436" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006437" s:NetrwMarkTarget: implements :MT (mark target) {{{2
Bram Moolenaara6878372014-03-22 21:02:50 +01006438fun! s:NetrwMarkTarget(...)
6439" call Dfunc("s:NetrwMarkTarget() a:0=".a:0)
6440 if a:0 == 0 || (a:0 == 1 && a:1 == "")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006441 let curdir = s:NetrwGetCurdir(1)
6442 let tgt = b:netrw_curdir
Bram Moolenaara6878372014-03-22 21:02:50 +01006443 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006444 let curdir = s:NetrwGetCurdir((a:1 =~ '^\a\{3,}://')? 0 : 1)
6445 let tgt = a:1
Bram Moolenaara6878372014-03-22 21:02:50 +01006446 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006447" call Decho("tgt<".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006448 let s:netrwmftgt = tgt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006449 let s:netrwmftgt_islocal = tgt !~ '^\a\{3,}://'
6450 let curislocal = b:netrw_curdir !~ '^\a\{3,}://'
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006451 let svpos = winsaveview()
6452" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01006453 call s:NetrwRefresh(curislocal,s:NetrwBrowseChgDir(curislocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006454" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6455 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01006456" call Dret("s:NetrwMarkTarget")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006457endfun
6458
6459" ---------------------------------------------------------------------
6460" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
6461" mark and unmark files. If a markfile list exists,
6462" then the rename and delete functions will use it instead
6463" of whatever may happen to be under the cursor at that
6464" moment. When the mouse and gui are available,
6465" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006466"
6467" Creates two lists
6468" s:netrwmarkfilelist -- holds complete paths to all marked files
6469" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
6470"
6471" Creates a marked file match string
6472" s:netrwmarfilemtch_# -- used with 2match to display marked files
6473"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006474" Creates a buffer version of islocal
6475" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00006476fun! s:NetrwMarkFile(islocal,fname)
6477" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006478" call Decho("bufnr(%)=".bufnr("%").": ".bufname("%"),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006479
6480 " sanity check
6481 if empty(a:fname)
6482" call Dret("s:NetrwMarkFile : emtpy fname")
6483 return
6484 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006485 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02006486
Bram Moolenaar97d62492012-11-15 21:28:22 +01006487 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006488 let curbufnr= bufnr("%")
Bram Moolenaara6878372014-03-22 21:02:50 +01006489 if a:fname =~ '^\a'
6490 let leader= '\<'
6491 else
6492 let leader= ''
6493 endif
6494 if a:fname =~ '\a$'
6495 let trailer = '\>[@=|\/\*]\=\ze\%( \|\t\|$\)'
6496 else
6497 let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)'
6498 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006499
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006500 if exists("s:netrwmarkfilelist_".curbufnr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006501 " markfile list pre-exists
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006502" call Decho("case s:netrwmarkfilelist_".curbufnr." already exists",'~'.expand("<slnum>"))
6503" call Decho("starting s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
6504" call Decho("starting s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">",'~'.expand("<slnum>"))
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006505 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00006506
6507 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006508 " append filename to buffer's markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006509" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006510 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaara6878372014-03-22 21:02:50 +01006511 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|'.leader.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006512
6513 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00006514 " remove filename from buffer's markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006515" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006516 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
6517 if s:netrwmarkfilelist_{curbufnr} == []
6518 " local markfilelist is empty; remove it entirely
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006519" call Decho("markfile list now empty",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006520 call s:NetrwUnmarkList(curbufnr,curdir)
6521 else
6522 " rebuild match list to display markings correctly
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006523" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006524 let s:netrwmarkfilemtch_{curbufnr}= ""
Bram Moolenaara6878372014-03-22 21:02:50 +01006525 let first = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006526 for fname in s:netrwmarkfilelist_{curbufnr}
6527 if first
Bram Moolenaara6878372014-03-22 21:02:50 +01006528 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.leader.escape(fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006529 else
Bram Moolenaara6878372014-03-22 21:02:50 +01006530 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|'.leader.escape(fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006531 endif
6532 let first= 0
6533 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006534" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006535 endif
6536 endif
6537
6538 else
6539 " initialize new markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006540" call Decho("case: initialize new markfilelist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006541
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006542" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006543 let s:netrwmarkfilelist_{curbufnr}= []
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006544 call add(s:netrwmarkfilelist_{curbufnr},substitute(a:fname,'[|@]$','',''))
6545" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006546
6547 " build initial markfile matching pattern
6548 if a:fname =~ '/$'
Bram Moolenaara6878372014-03-22 21:02:50 +01006549 let s:netrwmarkfilemtch_{curbufnr}= leader.escape(a:fname,g:netrw_markfileesc)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006550 else
Bram Moolenaara6878372014-03-22 21:02:50 +01006551 let s:netrwmarkfilemtch_{curbufnr}= leader.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00006552 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006553" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006554 endif
6555
6556 " handle global markfilelist
6557 if exists("s:netrwmarkfilelist")
6558 let dname= s:ComposePath(b:netrw_curdir,a:fname)
6559 if index(s:netrwmarkfilelist,dname) == -1
6560 " append new filename to global markfilelist
6561 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006562" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006563 else
6564 " remove new filename from global markfilelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006565" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006566 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006567" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006568 if s:netrwmarkfilelist == []
6569 unlet s:netrwmarkfilelist
6570 endif
6571 endif
6572 else
6573 " initialize new global-directory markfilelist
6574 let s:netrwmarkfilelist= []
6575 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006576" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006577 endif
6578
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006579 " set up 2match'ing to netrwmarkfilemtch_# list
Bram Moolenaar446cb832008-06-24 21:56:24 +00006580 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006581" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006582 if exists("g:did_drchip_netrwlist_syntax")
6583 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
6584 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006585 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006586" call Decho("2match none",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006587 2match none
6588 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006589 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02006590" call Dret("s:NetrwMarkFile : s:netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006591endfun
6592
6593" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006594" s:NetrwMarkFileArgList: ma: move the marked file list to the argument list (tomflist=0) {{{2
6595" mA: move the argument list to marked file list (tomflist=1)
6596" Uses the global marked file list
6597fun! s:NetrwMarkFileArgList(islocal,tomflist)
6598" call Dfunc("s:NetrwMarkFileArgList(islocal=".a:islocal.",tomflist=".a:tomflist.")")
6599
6600 let svpos = winsaveview()
6601" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6602 let curdir = s:NetrwGetCurdir(a:islocal)
6603 let curbufnr = bufnr("%")
6604
6605 if a:tomflist
6606 " mA: move argument list to marked file list
6607 while argc()
6608 let fname= argv(0)
6609" call Decho("exe argdel ".fname,'~'.expand("<slnum>"))
6610 exe "argdel ".fnameescape(fname)
6611 call s:NetrwMarkFile(a:islocal,fname)
6612 endwhile
6613
6614 else
6615 " ma: move marked file list to argument list
6616 if exists("s:netrwmarkfilelist")
6617
6618 " for every filename in the marked list
6619 for fname in s:netrwmarkfilelist
6620" call Decho("exe argadd ".fname,'~'.expand("<slnum>"))
6621 exe "argadd ".fnameescape(fname)
6622 endfor " for every file in the marked list
6623
6624 " unmark list and refresh
6625 call s:NetrwUnmarkList(curbufnr,curdir)
6626 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6627" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6628 NetrwKeepj call winrestview(svpos)
6629 endif
6630 endif
6631
6632" call Dret("s:NetrwMarkFileArgList")
6633endfun
6634
6635" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006636" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
6637" compress/decompress files using the programs
6638" in g:netrw_compress and g:netrw_uncompress,
6639" using g:netrw_compress_suffix to know which to
6640" do. By default:
6641" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006642" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00006643fun! s:NetrwMarkFileCompress(islocal)
6644" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006645 let svpos = winsaveview()
6646" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006647 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006648 let curbufnr = bufnr("%")
6649
Bram Moolenaarff034192013-04-24 18:51:19 +02006650 " sanity check
6651 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006652 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02006653" call Dret("s:NetrwMarkFileCompress")
6654 return
6655 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006656" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006657
Bram Moolenaar446cb832008-06-24 21:56:24 +00006658 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
Bram Moolenaarff034192013-04-24 18:51:19 +02006659
6660 " for every filename in the marked list
Bram Moolenaar446cb832008-06-24 21:56:24 +00006661 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaarff034192013-04-24 18:51:19 +02006662 let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006663" call Decho("extracted sfx<".sfx.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006664 if exists("g:netrw_decompress['".sfx."']")
6665 " fname has a suffix indicating that its compressed; apply associated decompression routine
6666 let exe= g:netrw_decompress[sfx]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006667" call Decho("fname<".fname."> is compressed so decompress with <".exe.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006668 let exe= netrw#WinPath(exe)
6669 if a:islocal
6670 if g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006671 let fname= s:ShellEscape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006672 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006673 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006674 let fname= s:ShellEscape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006675 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006676 if executable(exe)
6677 if a:islocal
6678 call system(exe." ".fname)
6679 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006680 NetrwKeepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaarff034192013-04-24 18:51:19 +02006681 endif
6682 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006683 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaarff034192013-04-24 18:51:19 +02006684 endif
6685 endif
6686 unlet sfx
6687
Bram Moolenaar446cb832008-06-24 21:56:24 +00006688 if exists("exe")
6689 unlet exe
6690 elseif a:islocal
6691 " fname not a compressed file, so compress it
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006692 call system(netrw#WinPath(g:netrw_compress)." ".s:ShellEscape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006693 else
6694 " fname not a compressed file, so compress it
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006695 NetrwKeepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".s:ShellEscape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006696 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006697 endfor " for every file in the marked list
6698
Bram Moolenaar446cb832008-06-24 21:56:24 +00006699 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006700 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006701" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
6702 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006703 endif
6704" call Dret("s:NetrwMarkFileCompress")
6705endfun
6706
6707" ---------------------------------------------------------------------
6708" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
6709" If no marked files, then set up directory as the
6710" target. Currently does not support copying entire
6711" directories. Uses the local-buffer marked file list.
6712" Returns 1=success (used by NetrwMarkFileMove())
6713" 0=failure
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006714fun! s:NetrwMarkFileCopy(islocal,...)
6715" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0)
6716
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006717 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02006718 let curbufnr = bufnr("%")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006719 if b:netrw_curdir !~ '/$'
6720 if !exists("b:netrw_curdir")
6721 let b:netrw_curdir= curdir
6722 endif
6723 let b:netrw_curdir= b:netrw_curdir."/"
6724 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006725
Bram Moolenaarff034192013-04-24 18:51:19 +02006726 " sanity check
6727 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006728 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02006729" call Dret("s:NetrwMarkFileCopy")
6730 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006731 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006732" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006733
Bram Moolenaar446cb832008-06-24 21:56:24 +00006734 if !exists("s:netrwmftgt")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006735 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006736" call Dret("s:NetrwMarkFileCopy 0")
6737 return 0
6738 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006739" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006740
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006741 if a:islocal && s:netrwmftgt_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00006742 " Copy marked files, local directory to local directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006743" call Decho("copy from local to local",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02006744 if !executable(g:netrw_localcopycmd) && g:netrw_localcopycmd !~ '^'.expand("$COMSPEC").'\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01006745 call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
6746" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
6747 return
6748 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006749
6750 " copy marked files while within the same directory (ie. allow renaming)
6751 if simplify(s:netrwmftgt) == simplify(b:netrw_curdir)
6752 if len(s:netrwmarkfilelist_{bufnr('%')}) == 1
6753 " only one marked file
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006754" call Decho("case: only one marked file",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006755 let args = s:ShellEscape(b:netrw_curdir.s:netrwmarkfilelist_{bufnr('%')}[0])
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006756 let oldname = s:netrwmarkfilelist_{bufnr('%')}[0]
6757 elseif a:0 == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006758" call Decho("case: handling one input argument",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006759 " this happens when the next case was used to recursively call s:NetrwMarkFileCopy()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006760 let args = s:ShellEscape(b:netrw_curdir.a:1)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006761 let oldname = a:1
6762 else
6763 " copy multiple marked files inside the same directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006764" call Decho("case: handling a multiple marked files",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006765 let s:recursive= 1
6766 for oldname in s:netrwmarkfilelist_{bufnr("%")}
6767 let ret= s:NetrwMarkFileCopy(a:islocal,oldname)
6768 if ret == 0
6769 break
6770 endif
6771 endfor
6772 unlet s:recursive
6773 call s:NetrwUnmarkList(curbufnr,curdir)
6774" call Dret("s:NetrwMarkFileCopy ".ret)
6775 return ret
6776 endif
6777
6778 call inputsave()
6779 let newname= input("Copy ".oldname." to : ",oldname,"file")
6780 call inputrestore()
6781 if newname == ""
6782" call Dret("s:NetrwMarkFileCopy 0")
6783 return 0
6784 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006785 let args= s:ShellEscape(oldname)
6786 let tgt = s:ShellEscape(s:netrwmftgt.'/'.newname)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006787 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006788 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"s:ShellEscape(b:netrw_curdir.\"/\".v:val)"))
6789 let tgt = s:ShellEscape(s:netrwmftgt)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006790 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006791 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6792 let args= substitute(args,'/','\\','g')
6793 let tgt = substitute(tgt, '/','\\','g')
6794 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006795 if args =~ "'" |let args= substitute(args,"'\\(.*\\)'",'\1','')|endif
6796 if tgt =~ "'" |let tgt = substitute(tgt ,"'\\(.*\\)'",'\1','')|endif
6797 if args =~ '//'|let args= substitute(args,'//','/','g')|endif
6798 if tgt =~ '//'|let tgt = substitute(tgt ,'//','/','g')|endif
6799" call Decho("args <".args.">",'~'.expand("<slnum>"))
6800" call Decho("tgt <".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006801 if isdirectory(s:NetrwFile(args))
6802" call Decho("args<".args."> is a directory",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006803 let copycmd= g:netrw_localcopydircmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006804" call Decho("using copydircmd<".copycmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006805 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6806 " window's xcopy doesn't copy a directory to a target properly. Instead, it copies a directory's
6807 " contents to a target. One must append the source directory name to the target to get xcopy to
6808 " do the right thing.
6809 let tgt= tgt.'\'.substitute(a:1,'^.*[\\/]','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006810" call Decho("modified tgt for xcopy",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006811 endif
6812 else
6813 let copycmd= g:netrw_localcopycmd
6814 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006815 if g:netrw_localcopycmd =~ '\s'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006816 let copycmd = substitute(copycmd,'\s.*$','','')
6817 let copycmdargs = substitute(copycmd,'^.\{-}\(\s.*\)$','\1','')
Bram Moolenaarff034192013-04-24 18:51:19 +02006818 let copycmd = netrw#WinPath(copycmd).copycmdargs
6819 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006820 let copycmd = netrw#WinPath(copycmd)
Bram Moolenaarff034192013-04-24 18:51:19 +02006821 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006822" call Decho("args <".args.">",'~'.expand("<slnum>"))
6823" call Decho("tgt <".tgt.">",'~'.expand("<slnum>"))
6824" call Decho("copycmd<".copycmd.">",'~'.expand("<slnum>"))
6825" call Decho("system(".copycmd." '".args."' '".tgt."')",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006826 call system(copycmd." '".args."' '".tgt."'")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006827 if v:shell_error != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006828 if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
6829 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-c)",101)
6830 else
6831 call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localcopycmd<".g:netrw_localcopycmd.">; it doesn't work!",80)
6832 endif
6833" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".s:ShellEscape(s:netrwmftgt))
Bram Moolenaar97d62492012-11-15 21:28:22 +01006834 return 0
6835 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006836
6837 elseif a:islocal && !s:netrwmftgt_islocal
6838 " Copy marked files, local directory to remote directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006839" call Decho("copy from local to remote",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006840 NetrwKeepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006841
6842 elseif !a:islocal && s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006843 " Copy marked files, remote directory to local directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006844" call Decho("copy from remote to local",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006845 NetrwKeepj call netrw#Obtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006846
6847 elseif !a:islocal && !s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006848 " Copy marked files, remote directory to remote directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006849" call Decho("copy from remote to remote",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006850 let curdir = getcwd()
6851 let tmpdir = s:GetTempfile("")
6852 if tmpdir !~ '/'
6853 let tmpdir= curdir."/".tmpdir
6854 endif
6855 if exists("*mkdir")
6856 call mkdir(tmpdir)
6857 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006858 call s:NetrwExe("sil! !".g:netrw_localmkdir.' '.s:ShellEscape(tmpdir,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01006859 if v:shell_error != 0
6860 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 +01006861" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.s:ShellEscape(tmpdir,1) )
Bram Moolenaar97d62492012-11-15 21:28:22 +01006862 return
6863 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006864 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006865 if isdirectory(s:NetrwFile(tmpdir))
Bram Moolenaara6878372014-03-22 21:02:50 +01006866 call s:NetrwLcd(tmpdir)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006867 NetrwKeepj call netrw#Obtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006868 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006869 NetrwKeepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006870 if getcwd() == tmpdir
6871 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006872 NetrwKeepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006873 endfor
Bram Moolenaara6878372014-03-22 21:02:50 +01006874 call s:NetrwLcd(curdir)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006875 if v:version < 704 || !has("patch1109")
6876 call s:NetrwExe("sil !".g:netrw_localrmdir." ".s:ShellEscape(tmpdir,1))
6877 if v:shell_error != 0
6878 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",80)
6879" " call Dret("s:NetrwMarkFileCopy : failed: sil !".g:netrw_localrmdir." ".s:ShellEscape(tmpdir,1) )
6880 return
6881 endif
6882 else
6883 if delete(tmpdir,"d")
6884 call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".tmpdir.">!",103)
6885 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006886 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006887 else
Bram Moolenaara6878372014-03-22 21:02:50 +01006888 call s:NetrwLcd(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006889 endif
6890 endif
6891 endif
6892
6893 " -------
6894 " cleanup
6895 " -------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006896" call Decho("cleanup",'~'.expand("<slnum>"))
6897" call Decho(" g:netrw_fastbrowse =".g:netrw_fastbrowse,'~'.expand("<slnum>"))
6898" call Decho(" s:netrwmftgt =".s:netrwmftgt,'~'.expand("<slnum>"))
6899" call Decho(" s:netrwmftgt_islocal=".s:netrwmftgt_islocal,'~'.expand("<slnum>"))
6900" call Decho(" curdir =".curdir,'~'.expand("<slnum>"))
6901" call Decho(" a:islocal =".a:islocal,'~'.expand("<slnum>"))
6902" call Decho(" curbufnr =".curbufnr,'~'.expand("<slnum>"))
6903 if exists("s:recursive")
6904" call Decho(" s:recursive =".s:recursive,'~'.expand("<slnum>"))
6905 else
6906" call Decho(" s:recursive =n/a",'~'.expand("<slnum>"))
Bram Moolenaare6ae6222013-05-21 21:01:10 +02006907 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006908 " see s:LocalFastBrowser() for g:netrw_fastbrowse interpretation (refreshing done for both slow and medium)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006909 if g:netrw_fastbrowse <= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006910 NetrwKeepj call s:LocalBrowseRefresh()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01006911 else
6912 " refresh local and targets for fast browsing
6913 if !exists("s:recursive")
6914 " remove markings from local buffer
6915" call Decho(" remove markings from local buffer",'~'.expand("<slnum>"))
6916 NetrwKeepj call s:NetrwUnmarkList(curbufnr,curdir)
6917 endif
6918
6919 " refresh buffers
6920 if s:netrwmftgt_islocal
6921" call Decho(" refresh s:netrwmftgt=".s:netrwmftgt,'~'.expand("<slnum>"))
6922 NetrwKeepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
6923 endif
6924 if a:islocal && s:netrwmftgt != curdir
6925" call Decho(" refresh curdir=".curdir,'~'.expand("<slnum>"))
6926 NetrwKeepj call s:NetrwRefreshDir(a:islocal,curdir)
6927 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006928 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006929
Bram Moolenaar446cb832008-06-24 21:56:24 +00006930" call Dret("s:NetrwMarkFileCopy 1")
6931 return 1
6932endfun
6933
6934" ---------------------------------------------------------------------
6935" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
6936" invoke vim's diff mode on the marked files.
6937" Either two or three files can be so handled.
6938" Uses the global marked file list.
6939fun! s:NetrwMarkFileDiff(islocal)
6940" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
6941 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006942
Bram Moolenaarff034192013-04-24 18:51:19 +02006943 " sanity check
6944 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006945 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02006946" call Dret("s:NetrwMarkFileDiff")
6947 return
6948 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006949 let curdir= s:NetrwGetCurdir(a:islocal)
6950" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006951
Bram Moolenaara6878372014-03-22 21:02:50 +01006952 if exists("s:netrwmarkfilelist_{".curbufnr."}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006953 let cnt = 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006954 for fname in s:netrwmarkfilelist
6955 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006956 if cnt == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006957" call Decho("diffthis: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006958 exe "NetrwKeepj e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006959 diffthis
6960 elseif cnt == 2 || cnt == 3
6961 vsplit
6962 wincmd l
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006963" call Decho("diffthis: ".fname,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006964 exe "NetrwKeepj e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006965 diffthis
6966 else
6967 break
6968 endif
6969 endfor
6970 call s:NetrwUnmarkList(curbufnr,curdir)
6971 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006972
Bram Moolenaar446cb832008-06-24 21:56:24 +00006973" call Dret("s:NetrwMarkFileDiff")
6974endfun
6975
6976" ---------------------------------------------------------------------
6977" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
6978" Uses global markfilelist
6979fun! s:NetrwMarkFileEdit(islocal)
6980" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
6981
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006982 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006983 let curbufnr = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006984
6985 " sanity check
6986 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01006987 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02006988" call Dret("s:NetrwMarkFileEdit")
6989 return
6990 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006991" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02006992
Bram Moolenaar446cb832008-06-24 21:56:24 +00006993 if exists("s:netrwmarkfilelist_{curbufnr}")
6994 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006995 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006996 " unmark markedfile list
6997" call s:NetrwUnmarkList(curbufnr,curdir)
6998 call s:NetrwUnmarkAll()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01006999" call Decho("exe sil args ".flist,'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007000 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00007001 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007002 echo "(use :bn, :bp to navigate files; :Rex to return)"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007003
Bram Moolenaar446cb832008-06-24 21:56:24 +00007004" call Dret("s:NetrwMarkFileEdit")
7005endfun
7006
7007" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007008" s:NetrwMarkFileQFEL: convert a quickfix-error or location list into a marked file list {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +02007009fun! s:NetrwMarkFileQFEL(islocal,qfel)
7010" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
7011 call s:NetrwUnmarkAll()
7012 let curbufnr= bufnr("%")
7013
7014 if !empty(a:qfel)
7015 for entry in a:qfel
7016 let bufnmbr= entry["bufnr"]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007017" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"],'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007018 if !exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007019" call Decho("case: no marked file list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007020 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
7021 elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
7022 " s:NetrwMarkFile will remove duplicate entries from the marked file list.
7023 " So, this test lets two or more hits on the same pattern to be ignored.
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007024" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007025 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
7026 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007027" call Decho("case: ".bufname(bufnmbr)." already in marked file list",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007028 endif
7029 endfor
7030 echo "(use me to edit marked files)"
7031 else
7032 call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
7033 endif
7034
7035" call Dret("s:NetrwMarkFileQFEL")
7036endfun
7037
7038" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007039" s:NetrwMarkFileExe: (invoked by mx and mX) execute arbitrary system command on marked files {{{2
7040" mx enbloc=0: Uses the local marked-file list, applies command to each file individually
7041" mX enbloc=1: Uses the global marked-file list, applies command to entire list
7042fun! s:NetrwMarkFileExe(islocal,enbloc)
7043" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.",enbloc=".a:enbloc.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007044 let svpos = winsaveview()
7045" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007046 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007047 let curbufnr = bufnr("%")
7048
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007049 if a:enbloc == 0
7050 " individually apply command to files, one at a time
7051 " sanity check
7052 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
7053 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
7054" call Dret("s:NetrwMarkFileExe")
7055 return
7056 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007057" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007058
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007059 if exists("s:netrwmarkfilelist_{curbufnr}")
7060 " get the command
7061 call inputsave()
7062 let cmd= input("Enter command: ","","file")
7063 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007064" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007065 if cmd == ""
7066" call Dret("s:NetrwMarkFileExe : early exit, empty command")
7067 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007068 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007069
7070 " apply command to marked files, individually. Substitute: filename -> %
7071 " If no %, then append a space and the filename to the command
7072 for fname in s:netrwmarkfilelist_{curbufnr}
7073 if a:islocal
7074 if g:netrw_keepdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007075 let fname= s:ShellEscape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007076 endif
7077 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007078 let fname= s:ShellEscape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007079 endif
7080 if cmd =~ '%'
7081 let xcmd= substitute(cmd,'%',fname,'g')
7082 else
7083 let xcmd= cmd.' '.fname
7084 endif
7085 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007086" call Decho("local: xcmd<".xcmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007087 let ret= system(xcmd)
7088 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007089" call Decho("remote: xcmd<".xcmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007090 let ret= s:RemoteSystem(xcmd)
7091 endif
7092 if v:shell_error < 0
7093 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
7094 break
7095 else
7096 echo ret
7097 endif
7098 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00007099
7100 " unmark marked file list
7101 call s:NetrwUnmarkList(curbufnr,curdir)
7102
7103 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007104 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007105" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7106 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007107 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007108 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007109 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007110
7111 else " apply command to global list of files, en bloc
7112
7113 call inputsave()
7114 let cmd= input("Enter command: ","","file")
7115 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007116" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007117 if cmd == ""
7118" call Dret("s:NetrwMarkFileExe : early exit, empty command")
7119 return
7120 endif
7121 if cmd =~ '%'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007122 let cmd= substitute(cmd,'%',join(map(s:netrwmarkfilelist,'s:ShellEscape(v:val)'),' '),'g')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007123 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007124 let cmd= cmd.' '.join(map(s:netrwmarkfilelist,'s:ShellEscape(v:val)'),' ')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007125 endif
7126 if a:islocal
7127 call system(cmd)
7128 if v:shell_error < 0
7129 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
7130 endif
7131 else
7132 let ret= s:RemoteSystem(cmd)
7133 endif
7134 call s:NetrwUnmarkAll()
7135
7136 " refresh the listing
7137 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007138" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7139 NetrwKeepj call winrestview(svpos)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007140
7141 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007142
Bram Moolenaar446cb832008-06-24 21:56:24 +00007143" call Dret("s:NetrwMarkFileExe")
7144endfun
7145
7146" ---------------------------------------------------------------------
7147" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
7148" as the marked file(s) (toggles suffix presence)
7149" Uses the local marked file list.
7150fun! s:NetrwMarkHideSfx(islocal)
7151" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007152 let svpos = winsaveview()
7153" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007154 let curbufnr = bufnr("%")
7155
7156 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
7157 if exists("s:netrwmarkfilelist_{curbufnr}")
7158
7159 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007160" call Decho("s:NetrwMarkFileCopy: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007161 " construct suffix pattern
7162 if fname =~ '\.'
7163 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
7164 else
7165 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
7166 endif
7167 " determine if its in the hiding list or not
7168 let inhidelist= 0
7169 if g:netrw_list_hide != ""
7170 let itemnum = 0
7171 let hidelist= split(g:netrw_list_hide,',')
7172 for hidepat in hidelist
7173 if sfxpat == hidepat
7174 let inhidelist= 1
7175 break
7176 endif
7177 let itemnum= itemnum + 1
7178 endfor
7179 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007180" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007181 if inhidelist
7182 " remove sfxpat from list
7183 call remove(hidelist,itemnum)
7184 let g:netrw_list_hide= join(hidelist,",")
7185 elseif g:netrw_list_hide != ""
7186 " append sfxpat to non-empty list
7187 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
7188 else
7189 " set hiding list to sfxpat
7190 let g:netrw_list_hide= sfxpat
7191 endif
7192 endfor
7193
7194 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007195 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007196" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7197 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007198 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007199 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007200 endif
7201
7202" call Dret("s:NetrwMarkHideSfx")
7203endfun
7204
7205" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007206" s:NetrwMarkFileVimCmd: (invoked by mv) execute arbitrary vim command on marked files, one at a time {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +02007207" Uses the local marked-file list.
7208fun! s:NetrwMarkFileVimCmd(islocal)
7209" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007210 let svpos = winsaveview()
7211" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007212 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02007213 let curbufnr = bufnr("%")
7214
Bram Moolenaarff034192013-04-24 18:51:19 +02007215 " sanity check
7216 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007217 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007218" call Dret("s:NetrwMarkFileVimCmd")
7219 return
7220 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007221" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007222
Bram Moolenaar15146672011-10-20 22:22:38 +02007223 if exists("s:netrwmarkfilelist_{curbufnr}")
7224 " get the command
7225 call inputsave()
7226 let cmd= input("Enter vim command: ","","file")
7227 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007228" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007229 if cmd == ""
7230" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
7231 return
7232 endif
7233
7234 " apply command to marked files. Substitute: filename -> %
7235 " If no %, then append a space and the filename to the command
7236 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007237" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007238 if a:islocal
7239 1split
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007240 exe "sil! NetrwKeepj keepalt e ".fnameescape(fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007241" call Decho("local<".fname.">: exe ".cmd,'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007242 exe cmd
7243 exe "sil! keepalt wq!"
7244 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007245" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007246 echo "sorry, \"mv\" not supported yet for remote files"
Bram Moolenaar15146672011-10-20 22:22:38 +02007247 endif
7248 endfor
7249
7250 " unmark marked file list
7251 call s:NetrwUnmarkList(curbufnr,curdir)
7252
7253 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007254 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007255" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7256 NetrwKeepj call winrestview(svpos)
Bram Moolenaar15146672011-10-20 22:22:38 +02007257 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007258 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar15146672011-10-20 22:22:38 +02007259 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007260
Bram Moolenaar15146672011-10-20 22:22:38 +02007261" call Dret("s:NetrwMarkFileVimCmd")
7262endfun
7263
7264" ---------------------------------------------------------------------
7265" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
7266" as the marked file(s) (toggles suffix presence)
7267" Uses the local marked file list.
7268fun! s:NetrwMarkHideSfx(islocal)
7269" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007270 let svpos = winsaveview()
7271" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007272 let curbufnr = bufnr("%")
7273
7274 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
7275 if exists("s:netrwmarkfilelist_{curbufnr}")
7276
7277 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007278" call Decho("s:NetrwMarkFileCopy: fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007279 " construct suffix pattern
7280 if fname =~ '\.'
7281 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
7282 else
7283 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
7284 endif
7285 " determine if its in the hiding list or not
7286 let inhidelist= 0
7287 if g:netrw_list_hide != ""
7288 let itemnum = 0
7289 let hidelist= split(g:netrw_list_hide,',')
7290 for hidepat in hidelist
7291 if sfxpat == hidepat
7292 let inhidelist= 1
7293 break
7294 endif
7295 let itemnum= itemnum + 1
7296 endfor
7297 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007298" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02007299 if inhidelist
7300 " remove sfxpat from list
7301 call remove(hidelist,itemnum)
7302 let g:netrw_list_hide= join(hidelist,",")
7303 elseif g:netrw_list_hide != ""
7304 " append sfxpat to non-empty list
7305 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
7306 else
7307 " set hiding list to sfxpat
7308 let g:netrw_list_hide= sfxpat
7309 endif
7310 endfor
7311
7312 " refresh the listing
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007313 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007314" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7315 NetrwKeepj call winrestview(svpos)
Bram Moolenaar15146672011-10-20 22:22:38 +02007316 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007317 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar15146672011-10-20 22:22:38 +02007318 endif
7319
7320" call Dret("s:NetrwMarkHideSfx")
7321endfun
7322
7323" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007324" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
7325" Uses the global markfilelist
7326fun! s:NetrwMarkFileGrep(islocal)
7327" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007328 let svpos = winsaveview()
7329" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007330 let curbufnr = bufnr("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007331 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007332
7333 if exists("s:netrwmarkfilelist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007334" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007335 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007336 call s:NetrwUnmarkAll()
Bram Moolenaarff034192013-04-24 18:51:19 +02007337 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007338" call Decho('no marked files, using "*"','~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007339 let netrwmarkfilelist= "*"
7340 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007341
Bram Moolenaarff034192013-04-24 18:51:19 +02007342 " ask user for pattern
7343 call inputsave()
7344 let pat= input("Enter pattern: ","")
7345 call inputrestore()
7346 let patbang = ""
7347 if pat =~ '^!'
7348 let patbang = "!"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007349 let pat = strpart(pat,2)
Bram Moolenaarff034192013-04-24 18:51:19 +02007350 endif
7351 if pat =~ '^\i'
7352 let pat = escape(pat,'/')
7353 let pat = '/'.pat.'/'
7354 else
7355 let nonisi = pat[0]
7356 endif
7357
7358 " use vimgrep for both local and remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007359" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007360 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007361 exe "NetrwKeepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
Bram Moolenaarff034192013-04-24 18:51:19 +02007362 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007363 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
Bram Moolenaarff034192013-04-24 18:51:19 +02007364" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
7365 return
7366 endtry
7367 echo "(use :cn, :cp to navigate, :Rex to return)"
7368
7369 2match none
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007370" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7371 NetrwKeepj call winrestview(svpos)
Bram Moolenaarff034192013-04-24 18:51:19 +02007372
7373 if exists("nonisi")
7374 " original, user-supplied pattern did not begin with a character from isident
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007375" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007376 if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
7377 call s:NetrwMarkFileQFEL(a:islocal,getqflist())
Bram Moolenaar446cb832008-06-24 21:56:24 +00007378 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007379 endif
7380
7381" call Dret("s:NetrwMarkFileGrep")
7382endfun
7383
7384" ---------------------------------------------------------------------
7385" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
7386" uses the global marked file list
7387" s:netrwmfloc= 0: target directory is remote
7388" = 1: target directory is local
7389fun! s:NetrwMarkFileMove(islocal)
7390" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007391 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007392 let curbufnr = bufnr("%")
7393
7394 " sanity check
Bram Moolenaarff034192013-04-24 18:51:19 +02007395 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007396 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007397" call Dret("s:NetrwMarkFileMove")
7398 return
7399 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007400" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007401
Bram Moolenaar446cb832008-06-24 21:56:24 +00007402 if !exists("s:netrwmftgt")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007403 NetrwKeepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007404" call Dret("s:NetrwMarkFileCopy 0")
7405 return 0
7406 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007407" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007408
7409 if a:islocal && s:netrwmftgt_islocal
7410 " move: local -> local
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007411" call Decho("move from local to local",'~'.expand("<slnum>"))
7412" call Decho("local to local move",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02007413 if !executable(g:netrw_localmovecmd) && g:netrw_localmovecmd !~ '^'.expand("$COMSPEC").'\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01007414 call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
7415" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
7416 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007417 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007418 let tgt = s:ShellEscape(s:netrwmftgt)
7419" call Decho("tgt<".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007420 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7421 let tgt = substitute(tgt, '/','\\','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007422" call Decho("windows exception: tgt<".tgt.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007423 if g:netrw_localmovecmd =~ '\s'
7424 let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','')
7425 let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
7426 let movecmd = netrw#WinPath(movecmd).movecmdargs
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007427" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007428 else
7429 let movecmd = netrw#WinPath(movecmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007430" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007431 endif
7432 else
7433 let movecmd = netrw#WinPath(g:netrw_localmovecmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007434" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007435 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007436 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02007437 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7438 let fname= substitute(fname,'/','\\','g')
7439 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007440" call Decho("system(".movecmd." ".s:ShellEscape(fname)." ".tgt.")",'~'.expand("<slnum>"))
7441 let ret= system(movecmd." ".s:ShellEscape(fname)." ".tgt)
Bram Moolenaarff034192013-04-24 18:51:19 +02007442 if v:shell_error != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007443 if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
7444 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-c)",100)
7445 else
7446 call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localmovecmd<".g:netrw_localmovecmd.">; it doesn't work!",54)
7447 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007448 break
7449 endif
7450 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00007451
7452 elseif a:islocal && !s:netrwmftgt_islocal
7453 " move: local -> remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007454" call Decho("move from local to remote",'~'.expand("<slnum>"))
7455" call Decho("copy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007456 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007457 NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007458" call Decho("remove",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007459 for fname in mflist
7460 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
7461 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
7462 endfor
7463 unlet mflist
7464
7465 elseif !a:islocal && s:netrwmftgt_islocal
7466 " move: remote -> local
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007467" call Decho("move from remote to local",'~'.expand("<slnum>"))
7468" call Decho("copy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007469 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007470 NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007471" call Decho("remove",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007472 for fname in mflist
7473 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
7474 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
7475 endfor
7476 unlet mflist
7477
7478 elseif !a:islocal && !s:netrwmftgt_islocal
7479 " move: remote -> remote
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007480" call Decho("move from remote to remote",'~'.expand("<slnum>"))
7481" call Decho("copy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007482 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007483 NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007484" call Decho("remove",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007485 for fname in mflist
7486 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
7487 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
7488 endfor
7489 unlet mflist
7490 endif
7491
7492 " -------
7493 " cleanup
7494 " -------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007495" call Decho("cleanup",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007496
7497 " remove markings from local buffer
7498 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
7499
7500 " refresh buffers
7501 if !s:netrwmftgt_islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007502" call Decho("refresh netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007503 NetrwKeepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007504 endif
7505 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007506" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007507 NetrwKeepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007508 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007509 if g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007510" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007511 NetrwKeepj call s:LocalBrowseRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007512 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007513
Bram Moolenaar446cb832008-06-24 21:56:24 +00007514" call Dret("s:NetrwMarkFileMove")
7515endfun
7516
7517" ---------------------------------------------------------------------
7518" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
7519" using the hardcopy command. Local marked-file list only.
7520fun! s:NetrwMarkFilePrint(islocal)
7521" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
7522 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02007523
7524 " sanity check
7525 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007526 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007527" call Dret("s:NetrwMarkFilePrint")
7528 return
7529 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007530" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
7531 let curdir= s:NetrwGetCurdir(a:islocal)
7532
Bram Moolenaar446cb832008-06-24 21:56:24 +00007533 if exists("s:netrwmarkfilelist_{curbufnr}")
7534 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
Bram Moolenaar446cb832008-06-24 21:56:24 +00007535 call s:NetrwUnmarkList(curbufnr,curdir)
7536 for fname in netrwmarkfilelist
7537 if a:islocal
7538 if g:netrw_keepdir
7539 let fname= s:ComposePath(curdir,fname)
7540 endif
7541 else
7542 let fname= curdir.fname
7543 endif
7544 1split
7545 " the autocmds will handle both local and remote files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007546" call Decho("exe sil e ".escape(fname,' '),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007547 exe "sil NetrwKeepj e ".fnameescape(fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007548" call Decho("hardcopy",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007549 hardcopy
7550 q
7551 endfor
7552 2match none
7553 endif
7554" call Dret("s:NetrwMarkFilePrint")
7555endfun
7556
7557" ---------------------------------------------------------------------
7558" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
7559" files when given a regexp (for which a prompt is
Bram Moolenaarff034192013-04-24 18:51:19 +02007560" issued) (matches to name of files).
Bram Moolenaar446cb832008-06-24 21:56:24 +00007561fun! s:NetrwMarkFileRegexp(islocal)
7562" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
7563
7564 " get the regular expression
7565 call inputsave()
7566 let regexp= input("Enter regexp: ","","file")
7567 call inputrestore()
7568
7569 if a:islocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007570 let curdir= s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007571 " get the matching list of files using local glob()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007572" call Decho("handle local regexp",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007573 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007574 if v:version == 704 && has("patch656")
7575 let files = glob(s:ComposePath(dirname,regexp),0,0,1)
7576 else
7577 let files = glob(s:ComposePath(dirname,regexp),0,0)
7578 endif
7579" call Decho("files<".files.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007580 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007581
7582 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01007583 for fname in filelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007584" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007585 NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007586 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00007587
7588 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007589" call Decho("handle remote regexp",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007590
7591 " convert displayed listing into a filelist
7592 let eikeep = &ei
7593 let areg = @a
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007594 sil NetrwKeepj %y a
Bram Moolenaara6878372014-03-22 21:02:50 +01007595 setl ei=all ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007596" call Decho("setl ei=all ma",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007597 1split
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007598 NetrwKeepj call s:NetrwEnew()
7599 NetrwKeepj call s:NetrwSafeOptions()
7600 sil NetrwKeepj norm! "ap
7601 NetrwKeepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00007602 let bannercnt= search('^" =====','W')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007603 exe "sil NetrwKeepj 1,".bannercnt."d"
Bram Moolenaara6878372014-03-22 21:02:50 +01007604 setl bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007605 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007606 sil NetrwKeepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007607 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007608 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007609 sil NetrwKeepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01007610 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007611 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007612 exe 'sil NetrwKeepj %s/^'.s:treedepthstring.' //e'
7613 sil! NetrwKeepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01007614 call histdel("/",-1)
7615 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007616 endif
7617 " convert regexp into the more usual glob-style format
7618 let regexp= substitute(regexp,'\*','.*','g')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007619" call Decho("regexp<".regexp.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007620 exe "sil! NetrwKeepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01007621 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007622 let filelist= getline(1,line("$"))
7623 q!
7624 for filename in filelist
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007625 NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007626 endfor
7627 unlet filelist
7628 let @a = areg
7629 let &ei = eikeep
7630 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007631 echo " (use me to edit marked files)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007632
7633" call Dret("s:NetrwMarkFileRegexp")
7634endfun
7635
7636" ---------------------------------------------------------------------
7637" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
7638" Uses the local marked file list.
7639fun! s:NetrwMarkFileSource(islocal)
7640" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
7641 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02007642
7643 " sanity check
7644 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007645 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007646" call Dret("s:NetrwMarkFileSource")
7647 return
7648 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007649" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
7650 let curdir= s:NetrwGetCurdir(a:islocal)
7651
Bram Moolenaar446cb832008-06-24 21:56:24 +00007652 if exists("s:netrwmarkfilelist_{curbufnr}")
7653 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaar446cb832008-06-24 21:56:24 +00007654 call s:NetrwUnmarkList(curbufnr,curdir)
7655 for fname in netrwmarkfilelist
7656 if a:islocal
7657 if g:netrw_keepdir
7658 let fname= s:ComposePath(curdir,fname)
7659 endif
7660 else
7661 let fname= curdir.fname
7662 endif
7663 " the autocmds will handle sourcing both local and remote files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007664" call Decho("exe so ".fnameescape(fname),'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00007665 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007666 endfor
7667 2match none
7668 endif
7669" call Dret("s:NetrwMarkFileSource")
7670endfun
7671
7672" ---------------------------------------------------------------------
7673" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
7674" Uses the global markfilelist
7675fun! s:NetrwMarkFileTag(islocal)
7676" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007677 let svpos = winsaveview()
7678" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007679 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007680 let curbufnr = bufnr("%")
7681
Bram Moolenaarff034192013-04-24 18:51:19 +02007682 " sanity check
7683 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007684 NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaarff034192013-04-24 18:51:19 +02007685" call Dret("s:NetrwMarkFileTag")
7686 return
7687 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007688" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007689
Bram Moolenaar446cb832008-06-24 21:56:24 +00007690 if exists("s:netrwmarkfilelist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007691" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
7692 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "s:ShellEscape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007693 call s:NetrwUnmarkAll()
7694
7695 if a:islocal
7696 if executable(g:netrw_ctags)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007697" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007698 call system(g:netrw_ctags." ".netrwmarkfilelist)
7699 else
7700 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
7701 endif
7702 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007703 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaara6878372014-03-22 21:02:50 +01007704 call netrw#Obtain(a:islocal,"tags")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007705 let curdir= b:netrw_curdir
7706 1split
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007707 NetrwKeepj e tags
Bram Moolenaar446cb832008-06-24 21:56:24 +00007708 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007709" call Decho("curdir<".curdir."> path<".path.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007710 exe 'NetrwKeepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007711 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007712 wq!
7713 endif
7714 2match none
7715 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007716" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7717 call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007718 endif
7719
7720" call Dret("s:NetrwMarkFileTag")
7721endfun
7722
7723" ---------------------------------------------------------------------
7724" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007725" Sets up two variables,
Bram Moolenaarff034192013-04-24 18:51:19 +02007726" s:netrwmftgt : holds the target directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00007727" s:netrwmftgt_islocal : 0=target directory is remote
Bram Moolenaarff034192013-04-24 18:51:19 +02007728" 1=target directory is local
Bram Moolenaar446cb832008-06-24 21:56:24 +00007729fun! s:NetrwMarkFileTgt(islocal)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007730" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
7731 let svpos = winsaveview()
7732" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007733 let curdir = s:NetrwGetCurdir(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007734 let hadtgt = exists("s:netrwmftgt")
7735 if !exists("w:netrw_bannercnt")
7736 let w:netrw_bannercnt= b:netrw_bannercnt
7737 endif
7738
7739 " set up target
7740 if line(".") < w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007741" call Decho("set up target: line(.) < w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007742 " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
7743 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007744" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007745 unlet s:netrwmftgt s:netrwmftgt_islocal
7746 if g:netrw_fastbrowse <= 1
Bram Moolenaara6878372014-03-22 21:02:50 +01007747 call s:LocalBrowseRefresh()
Bram Moolenaarff034192013-04-24 18:51:19 +02007748 endif
7749 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007750" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7751 call winrestview(svpos)
Bram Moolenaarff034192013-04-24 18:51:19 +02007752" call Dret("s:NetrwMarkFileTgt : removed target")
7753 return
7754 else
7755 let s:netrwmftgt= b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007756" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007757 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007758
7759 else
7760 " get word under cursor.
7761 " * If directory, use it for the target.
7762 " * If file, use b:netrw_curdir for the target
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007763" call Decho("get word under cursor",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007764 let curword= s:NetrwGetWord()
7765 let tgtdir = s:ComposePath(curdir,curword)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007766 if a:islocal && isdirectory(s:NetrwFile(tgtdir))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007767 let s:netrwmftgt = tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007768" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007769 elseif !a:islocal && tgtdir =~ '/$'
7770 let s:netrwmftgt = tgtdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007771" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007772 else
7773 let s:netrwmftgt = curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007774" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007775 endif
7776 endif
7777 if a:islocal
7778 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
7779 let s:netrwmftgt= simplify(s:netrwmftgt)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007780" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007781 endif
7782 if g:netrw_cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007783 let s:netrwmftgt= substitute(system("cygpath ".s:ShellEscape(s:netrwmftgt)),'\n$','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007784 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
7785 endif
7786 let s:netrwmftgt_islocal= a:islocal
7787
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007788 " need to do refresh so that the banner will be updated
7789 " s:LocalBrowseRefresh handles all local-browsing buffers when not fast browsing
Bram Moolenaar5c736222010-01-06 20:54:52 +01007790 if g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007791" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse.", so refreshing all local netrw buffers")
Bram Moolenaara6878372014-03-22 21:02:50 +01007792 call s:LocalBrowseRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007793 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007794" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007795 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007796 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,w:netrw_treetop))
7797 else
7798 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
7799 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007800" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7801 call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007802 if !hadtgt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007803 sil! NetrwKeepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00007804 endif
7805
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007806" call Decho("getmatches=".string(getmatches()),'~'.expand("<slnum>"))
7807" call Decho("s:netrwmarkfilelist=".(exists("s:netrwmarkfilelist")? string(s:netrwmarkfilelist) : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007808" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
7809endfun
7810
7811" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007812" s:NetrwGetCurdir: gets current directory and sets up b:netrw_curdir if necessary {{{2
7813fun! s:NetrwGetCurdir(islocal)
7814" call Dfunc("s:NetrwGetCurdir(islocal=".a:islocal.")")
7815
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007816 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007817 let b:netrw_curdir = s:NetrwTreePath(w:netrw_treetop)
7818" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used s:NetrwTreeDir)",'~'.expand("<slnum>"))
7819 elseif !exists("b:netrw_curdir")
7820 let b:netrw_curdir= getcwd()
7821" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)",'~'.expand("<slnum>"))
7822 endif
7823
7824" call Decho("b:netrw_curdir<".b:netrw_curdir."> ".((b:netrw_curdir !~ '\<\a\{3,}://')? "does not match" : "matches")." url pattern")
7825 if b:netrw_curdir !~ '\<\a\{3,}://'
7826 let curdir= b:netrw_curdir
7827" call Decho("g:netrw_keepdir=".g:netrw_keepdir)
7828 if g:netrw_keepdir == 0
7829 call s:NetrwLcd(curdir)
7830 endif
7831 endif
7832
7833" call Dret("s:NetrwGetCurdir <".curdir.">")
7834 return b:netrw_curdir
7835endfun
7836
7837" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007838" s:NetrwOpenFile: query user for a filename and open it {{{2
7839fun! s:NetrwOpenFile(islocal)
7840" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007841 let ykeep= @@
Bram Moolenaarc236c162008-07-13 17:41:49 +00007842 call inputsave()
7843 let fname= input("Enter filename: ")
7844 call inputrestore()
7845 if fname !~ '[/\\]'
7846 if exists("b:netrw_curdir")
7847 if exists("g:netrw_quiet")
7848 let netrw_quiet_keep = g:netrw_quiet
7849 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007850 let g:netrw_quiet = 1
7851 " save position for benefit of Rexplore
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007852 let s:rexposn_{bufnr("%")}= winsaveview()
7853" call Decho("saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00007854 if b:netrw_curdir =~ '/$'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007855 exe "NetrwKeepj e ".fnameescape(b:netrw_curdir.fname)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007856 else
7857 exe "e ".fnameescape(b:netrw_curdir."/".fname)
7858 endif
7859 if exists("netrw_quiet_keep")
7860 let g:netrw_quiet= netrw_quiet_keep
7861 else
7862 unlet g:netrw_quiet
7863 endif
7864 endif
7865 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01007866 exe "NetrwKeepj e ".fnameescape(fname)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007867 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007868 let @@= ykeep
Bram Moolenaarc236c162008-07-13 17:41:49 +00007869" call Dret("s:NetrwOpenFile")
7870endfun
7871
7872" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007873" netrw#Shrink: shrinks/expands a netrw or Lexplorer window {{{2
7874" For the mapping to this function be made via
7875" netrwPlugin, you'll need to have had
7876" g:netrw_usetab set to non-zero.
7877fun! netrw#Shrink()
7878" call Dfunc("netrw#Shrink() ft<".&ft."> winwidth=".winwidth(0)." lexbuf#".((exists("t:netrw_lexbufnr"))? t:netrw_lexbufnr : 'n/a'))
7879 let curwin = winnr()
7880 let wiwkeep = &wiw
7881 set wiw=1
7882
7883 if &ft == "netrw"
7884 if winwidth(0) > g:netrw_wiw
7885 let t:netrw_winwidth= winwidth(0)
7886 exe "vert resize ".g:netrw_wiw
7887 wincmd l
7888 if winnr() == curwin
7889 wincmd h
7890 endif
7891" call Decho("vert resize 0",'~'.expand("<slnum>"))
7892 else
7893 exe "vert resize ".t:netrw_winwidth
7894" call Decho("vert resize ".t:netrw_winwidth,'~'.expand("<slnum>"))
7895 endif
7896
7897 elseif exists("t:netrw_lexbufnr")
7898 exe bufwinnr(t:netrw_lexbufnr)."wincmd w"
7899 if winwidth(bufwinnr(t:netrw_lexbufnr)) > g:netrw_wiw
7900 let t:netrw_winwidth= winwidth(0)
7901 exe "vert resize ".g:netrw_wiw
7902 wincmd l
7903 if winnr() == curwin
7904 wincmd h
7905 endif
7906" call Decho("vert resize 0",'~'.expand("<slnum>"))
7907 elseif winwidth(bufwinnr(t:netrw_lexbufnr)) >= 0
7908 exe "vert resize ".t:netrw_winwidth
7909" call Decho("vert resize ".t:netrw_winwidth,'~'.expand("<slnum>"))
7910 else
7911 call netrw#Lexplore(0,0)
7912 endif
7913
7914 else
7915 call netrw#Lexplore(0,0)
7916 endif
7917 let wiw= wiwkeep
7918
7919" call Dret("netrw#Shrink")
7920endfun
7921
7922" ---------------------------------------------------------------------
7923" s:NetSortSequence: allows user to edit the sorting sequence {{{2
7924fun! s:NetSortSequence(islocal)
7925" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
7926
7927 let ykeep= @@
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007928 let svpos= winsaveview()
7929" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007930 call inputsave()
7931 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
7932 call inputrestore()
7933
7934 " refresh the listing
7935 let g:netrw_sort_sequence= newsortseq
7936 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01007937" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
7938 NetrwKeepj call winrestview(svpos)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007939 let @@= ykeep
7940
7941" call Dret("NetSortSequence")
7942endfun
7943
7944" ---------------------------------------------------------------------
7945" s:NetrwUnmarkList: delete local marked file list and remove their contents from the global marked-file list {{{2
7946" User access provided by the <mF> mapping. (see :help netrw-mF)
Bram Moolenaarff034192013-04-24 18:51:19 +02007947" Used by many MarkFile functions.
Bram Moolenaar446cb832008-06-24 21:56:24 +00007948fun! s:NetrwUnmarkList(curbufnr,curdir)
7949" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
7950
7951 " remove all files in local marked-file list from global list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007952 if exists("s:netrwmarkfilelist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007953 for mfile in s:netrwmarkfilelist_{a:curbufnr}
7954 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
7955 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
7956 call remove(s:netrwmarkfilelist,idx) " remove from global list
7957 endfor
7958 if s:netrwmarkfilelist == []
7959 unlet s:netrwmarkfilelist
7960 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007961
Bram Moolenaar446cb832008-06-24 21:56:24 +00007962 " getting rid of the local marked-file lists is easy
7963 unlet s:netrwmarkfilelist_{a:curbufnr}
7964 endif
7965 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
7966 unlet s:netrwmarkfilemtch_{a:curbufnr}
7967 endif
7968 2match none
7969" call Dret("s:NetrwUnmarkList")
7970endfun
7971
7972" ---------------------------------------------------------------------
7973" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
7974fun! s:NetrwUnmarkAll()
7975" call Dfunc("s:NetrwUnmarkAll()")
7976 if exists("s:netrwmarkfilelist")
7977 unlet s:netrwmarkfilelist
7978 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007979 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007980 2match none
7981" call Dret("s:NetrwUnmarkAll")
7982endfun
7983
7984" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02007985" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00007986fun! s:NetrwUnmarkAll2()
7987" call Dfunc("s:NetrwUnmarkAll2()")
7988 redir => netrwmarkfilelist_let
7989 let
7990 redir END
7991 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
Bram Moolenaara0f849e2015-10-30 14:37:44 +01007992 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
Bram Moolenaar446cb832008-06-24 21:56:24 +00007993 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
7994 for flist in netrwmarkfilelist_list
7995 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
7996 unlet s:netrwmarkfilelist_{curbufnr}
7997 unlet s:netrwmarkfilemtch_{curbufnr}
7998 endfor
7999" call Dret("s:NetrwUnmarkAll2")
8000endfun
8001
8002" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008003" s:NetrwUnMarkFile: called via mu map; unmarks *all* marked files, both global and buffer-local {{{2
8004"
8005" Marked files are in two types of lists:
8006" s:netrwmarkfilelist -- holds complete paths to all marked files
8007" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
8008"
8009" Marked files suitable for use with 2match are in:
8010" s:netrwmarkfilemtch_# -- used with 2match to display marked files
Bram Moolenaar446cb832008-06-24 21:56:24 +00008011fun! s:NetrwUnMarkFile(islocal)
8012" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008013 let svpos = winsaveview()
8014" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008015 let curbufnr = bufnr("%")
8016
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008017 " unmark marked file list
8018 " (although I expect s:NetrwUpload() to do it, I'm just making sure)
8019 if exists("s:netrwmarkfilelist")
8020" " call Decho("unlet'ing: s:netrwmarkfilelist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008021 unlet s:netrwmarkfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00008022 endif
8023
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008024 let ibuf= 1
8025 while ibuf < bufnr("$")
8026 if exists("s:netrwmarkfilelist_".ibuf)
8027 unlet s:netrwmarkfilelist_{ibuf}
8028 unlet s:netrwmarkfilemtch_{ibuf}
8029 endif
8030 let ibuf = ibuf + 1
8031 endwhile
8032 2match none
8033
Bram Moolenaar446cb832008-06-24 21:56:24 +00008034" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008035"call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8036call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008037" call Dret("s:NetrwUnMarkFile")
8038endfun
8039
8040" ---------------------------------------------------------------------
8041" s:NetrwMenu: generates the menu for gvim and netrw {{{2
8042fun! s:NetrwMenu(domenu)
8043
8044 if !exists("g:NetrwMenuPriority")
8045 let g:NetrwMenuPriority= 80
8046 endif
8047
Bram Moolenaaradc21822011-04-01 18:03:16 +02008048 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00008049" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
8050
8051 if !exists("s:netrw_menu_enabled") && a:domenu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008052" call Decho("initialize menu",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008053 let s:netrw_menu_enabled= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008054 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
8055 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
8056 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
8057 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
8058 if g:netrw_dirhistmax > 0
8059 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
8060 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
8061 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
8062 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
8063 else
8064 exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\<cr>"
8065 endif
8066 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o o'
8067 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v v'
8068 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
8069 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p p'
8070 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
8071 exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
8072 exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
8073 exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
8074 exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
8075 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
8076 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
8077 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
8078 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
8079 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
8080 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 +01008081 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 +02008082 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
8083 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
8084 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
8085 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
8086 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
8087 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
8088 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
8089 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
8090 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
8091 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
8092 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
8093 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
8094 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
8095 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
8096 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
8097 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
8098 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
8099 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
8100 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
8101 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
8102 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
8103 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
8104 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
8105 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
8106 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
8107 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
8108 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
8109 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
8110 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
8111 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>'
8112 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>'
8113 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>'
8114 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
8115 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>'
8116 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>'
8117 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 +01008118 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 +02008119 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
8120 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008121 let s:netrw_menucnt= 28
Bram Moolenaarff034192013-04-24 18:51:19 +02008122 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
8123 call s:NetrwTgtMenu() " let bookmarks and history be easy targets
Bram Moolenaar446cb832008-06-24 21:56:24 +00008124
8125 elseif !a:domenu
8126 let s:netrwcnt = 0
8127 let curwin = winnr()
8128 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
8129 exe curwin."wincmd w"
8130
8131 if s:netrwcnt <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008132" call Decho("clear menus",'~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008133 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008134" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*','~'.expand("<slnum>"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008135 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00008136 endif
8137 endif
8138" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008139 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00008140 endif
8141
8142endfun
8143
8144" ---------------------------------------------------------------------
8145" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
8146" Used by the O maps (as <SID>NetrwObtain())
8147fun! s:NetrwObtain(islocal)
8148" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
8149
Bram Moolenaar97d62492012-11-15 21:28:22 +01008150 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008151 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008152 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\{3,}://'
Bram Moolenaara6878372014-03-22 21:02:50 +01008153 call netrw#Obtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00008154 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
8155 else
Bram Moolenaara6878372014-03-22 21:02:50 +01008156 call netrw#Obtain(a:islocal,expand("<cWORD>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008157 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008158 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008159
8160" call Dret("NetrwObtain")
8161endfun
8162
8163" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008164" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
8165" If there's only one window, then the window will first be split.
8166" Returns:
8167" choice = 0 : didn't have to choose
8168" choice = 1 : saved modified file in window first
8169" choice = 2 : didn't save modified file, opened window
8170" choice = 3 : cancel open
8171fun! s:NetrwPrevWinOpen(islocal)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008172" call Dfunc("s:NetrwPrevWinOpen(islocal=".a:islocal.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008173
Bram Moolenaar97d62492012-11-15 21:28:22 +01008174 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008175 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
Bram Moolenaara6878372014-03-22 21:02:50 +01008176 let curdir = b:netrw_curdir
Bram Moolenaar446cb832008-06-24 21:56:24 +00008177
8178 " get last window number and the word currently under the cursor
Bram Moolenaar8d043172014-01-23 14:24:41 +01008179 let origwin = winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008180 let lastwinnr = winnr("$")
8181 let curword = s:NetrwGetWord()
8182 let choice = 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008183 let s:treedir = s:NetrwTreeDir(a:islocal)
Bram Moolenaara6878372014-03-22 21:02:50 +01008184 let curdir = s:treedir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008185" call Decho("winnr($)#".lastwinnr." curword<".curword.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008186
Bram Moolenaar8d043172014-01-23 14:24:41 +01008187 let didsplit = 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008188 if lastwinnr == 1
8189 " if only one window, open a new one first
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008190" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008191 if g:netrw_preview
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008192 " vertically split preview window
Bram Moolenaar15146672011-10-20 22:22:38 +02008193 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008194" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02008195 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008196 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008197 " horizontally split preview window
Bram Moolenaar15146672011-10-20 22:22:38 +02008198 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008199" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +02008200 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008201 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008202 let didsplit = 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008203" call Decho("did split",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008204
8205 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008206 NetrwKeepj call s:SaveBufVars()
Bram Moolenaar8d043172014-01-23 14:24:41 +01008207 let eikeep= &ei
Bram Moolenaara6878372014-03-22 21:02:50 +01008208 setl ei=all
Bram Moolenaar446cb832008-06-24 21:56:24 +00008209 wincmd p
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008210" call Decho("wincmd p (now in win#".winnr().") curdir<".curdir.">",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008211
8212 " prevwinnr: the window number of the "prev" window
8213 " prevbufnr: the buffer number of the buffer in the "prev" window
8214 " bnrcnt : the qty of windows open on the "prev" buffer
8215 let prevwinnr = winnr()
8216 let prevbufnr = bufnr("%")
8217 let prevbufname = bufname("%")
8218 let prevmod = &mod
8219 let bnrcnt = 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008220 NetrwKeepj call s:RestoreBufVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008221" call Decho("after wincmd p: win#".winnr()." win($)#".winnr("$")." origwin#".origwin." &mod=".&mod." bufname(%)<".bufname("%")."> prevbufnr=".prevbufnr,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008222
8223 " if the previous window's buffer has been changed (ie. its modified flag is set),
Bram Moolenaar446cb832008-06-24 21:56:24 +00008224 " and it doesn't appear in any other extant window, then ask the
8225 " user if s/he wants to abandon modifications therein.
Bram Moolenaar8d043172014-01-23 14:24:41 +01008226 if prevmod
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008227" call Decho("detected that prev window's buffer has been modified: prevbufnr=".prevbufnr." winnr()#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008228 windo if winbufnr(0) == prevbufnr | let bnrcnt=bnrcnt+1 | endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008229" call Decho("prevbufnr=".prevbufnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr()=".winnr()." prevwinnr#".prevwinnr,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008230 exe prevwinnr."wincmd w"
8231
8232 if bnrcnt == 1 && &hidden == 0
8233 " only one copy of the modified buffer in a window, and
8234 " hidden not set, so overwriting will lose the modified file. Ask first...
8235 let choice = confirm("Save modified buffer<".prevbufname."> first?","&Yes\n&No\n&Cancel")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008236" call Decho("(NetrwPrevWinOpen) prevbufname<".prevbufname."> choice=".choice." current-winnr#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008237 let &ei= eikeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008238
8239 if choice == 1
8240 " Yes -- write file & then browse
8241 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008242 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00008243 if v:errmsg != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008244 call netrw#ErrorMsg(s:ERROR,"unable to write <".(exists("prevbufname")? prevbufname : 'n/a').">!",30)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008245 exe origwin."wincmd w"
8246 let &ei = eikeep
8247 let @@ = ykeep
8248" call Dret("s:NetrwPrevWinOpen ".choice." : unable to write <".prevbufname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008249 return choice
8250 endif
8251
8252 elseif choice == 2
8253 " No -- don't worry about changed file, just browse anyway
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008254" call Decho("don't worry about chgd file, just browse anyway (winnr($)#".winnr("$").")",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008255 echomsg "**note** changes to ".prevbufname." abandoned"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008256
8257 else
8258 " Cancel -- don't do this
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008259" call Decho("cancel, don't browse, switch to win#".origwin,'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008260 exe origwin."wincmd w"
8261 let &ei= eikeep
8262 let @@ = ykeep
8263" call Dret("s:NetrwPrevWinOpen ".choice." : cancelled")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008264 return choice
8265 endif
8266 endif
8267 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008268 let &ei= eikeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008269 endif
8270
8271 " restore b:netrw_curdir (window split/enew may have lost it)
8272 let b:netrw_curdir= curdir
8273 if a:islocal < 2
8274 if a:islocal
8275 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
8276 else
8277 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
8278 endif
8279 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008280 let @@= ykeep
Bram Moolenaar8d043172014-01-23 14:24:41 +01008281" call Dret("s:NetrwPrevWinOpen ".choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008282 return choice
8283endfun
8284
8285" ---------------------------------------------------------------------
8286" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
8287" Always assumed to be local -> remote
8288" call s:NetrwUpload(filename, target)
8289" call s:NetrwUpload(filename, target, fromdirectory)
8290fun! s:NetrwUpload(fname,tgt,...)
8291" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
8292
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008293 if a:tgt =~ '^\a\{3,}://'
8294 let tgtdir= substitute(a:tgt,'^\a\{3,}://[^/]\+/\(.\{-}\)$','\1','')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008295 else
8296 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
8297 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008298" call Decho("tgtdir<".tgtdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008299
8300 if a:0 > 0
8301 let fromdir= a:1
8302 else
8303 let fromdir= getcwd()
8304 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008305" call Decho("fromdir<".fromdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008306
8307 if type(a:fname) == 1
8308 " handle uploading a single file using NetWrite
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008309" call Decho("handle uploading a single file via NetWrite",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008310 1split
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008311" call Decho("exe e ".fnameescape(s:NetrwFile(a:fname)),'~'.expand("<slnum>"))
8312 exe "NetrwKeepj e ".fnameescape(s:NetrwFile(a:fname))
8313" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008314 if a:tgt =~ '/$'
8315 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008316" call Decho("exe w! ".fnameescape(wfname),'~'.expand("<slnum>"))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008317 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008318 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008319" call Decho("writing local->remote: exe w ".fnameescape(a:tgt),'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008320 exe "w ".fnameescape(a:tgt)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008321" call Decho("done writing local->remote",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008322 endif
8323 q!
8324
8325 elseif type(a:fname) == 3
8326 " handle uploading a list of files via scp
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008327" call Decho("handle uploading a list of files via scp",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008328 let curdir= getcwd()
8329 if a:tgt =~ '^scp:'
Bram Moolenaara6878372014-03-22 21:02:50 +01008330 call s:NetrwLcd(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008331 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008332 let args = join(map(filelist,"s:ShellEscape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008333 if exists("g:netrw_port") && g:netrw_port != ""
8334 let useport= " ".g:netrw_scpport." ".g:netrw_port
8335 else
8336 let useport= ""
8337 endif
8338 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
8339 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008340 call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.s:ShellEscape(useport,1)." ".args." ".s:ShellEscape(machine.":".tgt,1))
Bram Moolenaara6878372014-03-22 21:02:50 +01008341 call s:NetrwLcd(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008342
8343 elseif a:tgt =~ '^ftp:'
8344 call s:NetrwMethod(a:tgt)
8345
8346 if b:netrw_method == 2
8347 " handle uploading a list of files via ftp+.netrc
8348 let netrw_fname = b:netrw_fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008349 sil NetrwKeepj new
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008350" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008351
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008352 NetrwKeepj put =g:netrw_ftpmode
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008353" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008354
8355 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008356 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008357" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008358 endif
8359
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008360 NetrwKeepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008361" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008362
Bram Moolenaaradc21822011-04-01 18:03:16 +02008363 if tgtdir == ""
8364 let tgtdir= '/'
8365 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008366 NetrwKeepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008367" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008368
8369 for fname in a:fname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008370 NetrwKeepj call setline(line("$")+1,'put "'.s:NetrwFile(fname).'"')
8371" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008372 endfor
8373
8374 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008375 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 +00008376 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008377" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
8378 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008379 endif
8380 " 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 +01008381 sil NetrwKeepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01008382 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008383 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
8384 call netrw#ErrorMsg(s:ERROR,getline(1),14)
8385 else
8386 bw!|q
8387 endif
8388
8389 elseif b:netrw_method == 3
8390 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
8391 let netrw_fname= b:netrw_fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008392 NetrwKeepj call s:SaveBufVars()|sil NetrwKeepj new|NetrwKeepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008393 let tmpbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02008394 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00008395
8396 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008397 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008398" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008399 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008400 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008401" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008402 endif
8403
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008404 if exists("g:netrw_uid") && g:netrw_uid != ""
8405 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008406 NetrwKeepj put =g:netrw_uid
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008407" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008408 if exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008409 NetrwKeepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008410 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008411" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008412 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008413 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008414" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008415 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008416 endif
8417
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008418 NetrwKeepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008419" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008420
8421 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008422 NetrwKeepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008423" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008424 endif
8425
8426 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008427 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008428" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008429 endif
8430
8431 for fname in a:fname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008432 NetrwKeepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008433" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008434 endfor
8435
8436 " perform ftp:
8437 " -i : turns off interactive prompting from ftp
8438 " -n unix : DON'T use <.netrc>, even though it exists
8439 " -n win32: quit being obnoxious about password
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008440 NetrwKeepj norm! 1Gdd
8441 call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008442 " 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 +01008443 sil NetrwKeepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01008444 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008445 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
8446 let debugkeep= &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02008447 setl debug=msg
Bram Moolenaar446cb832008-06-24 21:56:24 +00008448 call netrw#ErrorMsg(s:ERROR,getline(1),15)
8449 let &debug = debugkeep
8450 let mod = 1
8451 else
8452 bw!|q
8453 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008454 elseif !exists("b:netrw_method") || b:netrw_method < 0
8455" call Dfunc("netrw#NetrwUpload : unsupported method")
8456 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00008457 endif
8458 else
8459 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
8460 endif
8461 endif
8462
8463" call Dret("s:NetrwUpload")
8464endfun
8465
8466" ---------------------------------------------------------------------
8467" s:NetrwPreview: {{{2
8468fun! s:NetrwPreview(path) range
8469" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008470 let ykeep= @@
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008471 NetrwKeepj call s:NetrwOptionSave("s:")
8472 NetrwKeepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008473 if has("quickfix")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008474 if !isdirectory(s:NetrwFile(a:path))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008475 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02008476 let pvhkeep = &pvh
8477 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
8478 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008479 endif
8480 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
8481 if exists("pvhkeep")
8482 let &pvh= pvhkeep
8483 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008484 elseif !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008485 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008486 endif
8487 elseif !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008488 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 +00008489 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008490 NetrwKeepj call s:NetrwOptionRestore("s:")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008491 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008492" call Dret("NetrwPreview")
8493endfun
8494
8495" ---------------------------------------------------------------------
8496" s:NetrwRefresh: {{{2
8497fun! s:NetrwRefresh(islocal,dirname)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008498" call Dfunc("s:NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008499 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
Bram Moolenaarff034192013-04-24 18:51:19 +02008500 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008501" call Decho("setl ma noro",'~'.expand("<slnum>"))
8502" call Decho("clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008503 let ykeep = @@
Bram Moolenaar13600302014-05-22 18:26:40 +02008504
8505 " save the cursor position before refresh.
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008506 let screenposn = winsaveview()
8507" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008508
8509" call Decho("win#".winnr().": ".winheight(0)."x".winwidth(0)." curfile<".expand("%").">",'~'.expand("<slnum>"))
8510" call Decho("clearing buffer prior to refresh",'~'.expand("<slnum>"))
8511 sil! NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00008512 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008513 NetrwKeepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008514 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008515 NetrwKeepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008516 endif
Bram Moolenaar13600302014-05-22 18:26:40 +02008517
8518 " restore position
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008519" call Decho("restoring posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
8520 NetrwKeepj call winrestview(screenposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008521
8522 " restore file marks
8523 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008524" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008525 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
8526 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008527" call Decho("2match none (bufnr(%)=".bufnr("%")."<".bufname("%").">)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008528 2match none
8529 endif
8530
Bram Moolenaar97d62492012-11-15 21:28:22 +01008531" restore
8532 let @@= ykeep
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008533" call Dret("s:NetrwRefresh")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008534endfun
8535
8536" ---------------------------------------------------------------------
8537" s:NetrwRefreshDir: refreshes a directory by name {{{2
8538" Called by NetrwMarkFileCopy()
Bram Moolenaara6878372014-03-22 21:02:50 +01008539" Interfaces to s:NetrwRefresh() and s:LocalBrowseRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008540fun! s:NetrwRefreshDir(islocal,dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008541" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008542 if g:netrw_fastbrowse == 0
8543 " slowest mode (keep buffers refreshed, local or remote)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008544" call Decho("slowest mode: keep buffers refreshed, local or remote",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008545 let tgtwin= bufwinnr(a:dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008546" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008547
8548 if tgtwin > 0
8549 " tgtwin is being displayed, so refresh it
8550 let curwin= winnr()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008551" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008552 exe tgtwin."wincmd w"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008553 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008554 exe curwin."wincmd w"
8555
8556 elseif bufnr(a:dirname) > 0
8557 let bn= bufnr(a:dirname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008558" call Decho("bd bufnr(".a:dirname.")=".bn,'~'.expand("<slnum>"))
8559 exe "sil keepj bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00008560 endif
8561
8562 elseif g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008563" call Decho("medium-speed mode: refresh local buffers only",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008564 NetrwKeepj call s:LocalBrowseRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008565 endif
8566" call Dret("s:NetrwRefreshDir")
8567endfun
8568
8569" ---------------------------------------------------------------------
Bram Moolenaar13600302014-05-22 18:26:40 +02008570" s:NetrwSetChgwin: set g:netrw_chgwin; a <cr> will use the specified
8571" window number to do its editing in.
8572" Supports [count]C where the count, if present, is used to specify
8573" a window to use for editing via the <cr> mapping.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008574fun! s:NetrwSetChgwin(...)
Bram Moolenaar13600302014-05-22 18:26:40 +02008575" call Dfunc("s:NetrwSetChgwin() v:count=".v:count)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008576 if a:0 > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008577" call Decho("a:1<".a:1.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008578 if a:1 == "" " :NetrwC win#
8579 let g:netrw_chgwin= winnr()
8580 else " :NetrwC
8581 let g:netrw_chgwin= a:1
8582 endif
8583 elseif v:count > 0 " [count]C
Bram Moolenaar13600302014-05-22 18:26:40 +02008584 let g:netrw_chgwin= v:count
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008585 else " C
Bram Moolenaar13600302014-05-22 18:26:40 +02008586 let g:netrw_chgwin= winnr()
8587 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008588 echo "editing window now set to window#".g:netrw_chgwin
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008589" call Dret("s:NetrwSetChgwin : g:netrw_chgwin=".g:netrw_chgwin)
Bram Moolenaar13600302014-05-22 18:26:40 +02008590endfun
8591
8592" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008593" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
8594" What this function does is to compute a priority for the patterns
8595" in the g:netrw_sort_sequence. It applies a substitute to any
8596" "files" that satisfy each pattern, putting the priority / in
8597" front. An "*" pattern handles the default priority.
8598fun! s:NetrwSetSort()
8599" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008600 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008601 if w:netrw_liststyle == s:LONGLIST
8602 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
8603 else
8604 let seqlist = g:netrw_sort_sequence
8605 endif
8606 " sanity check -- insure that * appears somewhere
8607 if seqlist == ""
8608 let seqlist= '*'
8609 elseif seqlist !~ '\*'
8610 let seqlist= seqlist.',*'
8611 endif
8612 let priority = 1
8613 while seqlist != ""
8614 if seqlist =~ ','
8615 let seq = substitute(seqlist,',.*$','','e')
8616 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
8617 else
8618 let seq = seqlist
8619 let seqlist = ""
8620 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008621 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01008622 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008623 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01008624 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008625 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01008626 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008627 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008628" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008629
8630 " sanity check
8631 if w:netrw_bannercnt > line("$")
8632 " apparently no files were left after a Hiding pattern was used
8633" call Dret("SetSort : no files left after hiding")
8634 return
8635 endif
8636 if seq == '*'
8637 let starpriority= spriority
8638 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008639 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01008640 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008641 " sometimes multiple sorting patterns will match the same file or directory.
8642 " The following substitute is intended to remove the excess matches.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008643 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
8644 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008645 endif
8646 let priority = priority + 1
8647 endwhile
8648 if exists("starpriority")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008649 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/e'
8650 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008651 endif
8652
8653 " Following line associated with priority -- items that satisfy a priority
8654 " pattern get prefixed by ###/ which permits easy sorting by priority.
8655 " Sometimes files can satisfy multiple priority patterns -- only the latest
8656 " priority pattern needs to be retained. So, at this point, these excess
8657 " priority prefixes need to be removed, but not directories that happen to
8658 " be just digits themselves.
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008659 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
8660 NetrwKeepj call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008661 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008662
8663" call Dret("SetSort")
8664endfun
8665
Bram Moolenaarff034192013-04-24 18:51:19 +02008666" ---------------------------------------------------------------------
8667" s:NetrwSetTgt: sets the target to the specified choice index {{{2
8668" Implements [count]Tb (bookhist<b>)
8669" [count]Th (bookhist<h>)
8670" See :help netrw-qb for how to make the choice.
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008671fun! s:NetrwSetTgt(islocal,bookhist,choice)
8672" call Dfunc("s:NetrwSetTgt(islocal=".a:islocal." bookhist<".a:bookhist."> choice#".a:choice.")")
Bram Moolenaarff034192013-04-24 18:51:19 +02008673
8674 if a:bookhist == 'b'
8675 " supports choosing a bookmark as a target using a qb-generated list
8676 let choice= a:choice - 1
8677 if exists("g:netrw_bookmarklist[".choice."]")
Bram Moolenaara6878372014-03-22 21:02:50 +01008678 call netrw#MakeTgt(g:netrw_bookmarklist[choice])
Bram Moolenaarff034192013-04-24 18:51:19 +02008679 else
8680 echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
8681 endif
8682
8683 elseif a:bookhist == 'h'
8684 " supports choosing a history stack entry as a target using a qb-generated list
8685 let choice= (a:choice % g:netrw_dirhistmax) + 1
8686 if exists("g:netrw_dirhist_".choice)
8687 let histentry = g:netrw_dirhist_{choice}
Bram Moolenaara6878372014-03-22 21:02:50 +01008688 call netrw#MakeTgt(histentry)
Bram Moolenaarff034192013-04-24 18:51:19 +02008689 else
8690 echomsg "Sorry, history#".a:choice." not available!"
8691 endif
8692 endif
8693
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008694 " refresh the display
8695 if !exists("b:netrw_curdir")
8696 let b:netrw_curdir= getcwd()
8697 endif
8698 call s:NetrwRefresh(a:islocal,b:netrw_curdir)
8699
Bram Moolenaarff034192013-04-24 18:51:19 +02008700" call Dret("s:NetrwSetTgt")
8701endfun
8702
Bram Moolenaar446cb832008-06-24 21:56:24 +00008703" =====================================================================
8704" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
8705fun! s:NetrwSortStyle(islocal)
8706" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008707 NetrwKeepj call s:NetrwSaveWordPosn()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008708 let svpos= winsaveview()
8709" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008710
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008711 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 +01008712 NetrwKeepj norm! 0
8713 NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008714" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
8715 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008716
8717" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
8718endfun
8719
8720" ---------------------------------------------------------------------
8721" s:NetrwSplit: mode {{{2
8722" =0 : net and o
8723" =1 : net and t
8724" =2 : net and v
8725" =3 : local and o
8726" =4 : local and t
8727" =5 : local and v
8728fun! s:NetrwSplit(mode)
8729" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
8730
Bram Moolenaar97d62492012-11-15 21:28:22 +01008731 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008732 call s:SaveWinVars()
8733
8734 if a:mode == 0
8735 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02008736 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02008737 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008738" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02008739 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008740 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008741 NetrwKeepj call s:RestoreWinVars()
8742 NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008743 unlet s:didsplit
8744
8745 elseif a:mode == 1
8746 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01008747 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008748" call Decho("tabnew",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008749 tabnew
8750 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008751 NetrwKeepj call s:RestoreWinVars()
8752 NetrwKeepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008753 unlet s:didsplit
8754
8755 elseif a:mode == 2
8756 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02008757 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02008758 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008759" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02008760 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008761 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008762 NetrwKeepj call s:RestoreWinVars()
8763 NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008764 unlet s:didsplit
8765
8766 elseif a:mode == 3
8767 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02008768 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02008769 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008770" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02008771 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008772 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008773 NetrwKeepj call s:RestoreWinVars()
8774 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008775 unlet s:didsplit
8776
8777 elseif a:mode == 4
8778 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00008779 let cursorword = s:NetrwGetWord()
Bram Moolenaar8d043172014-01-23 14:24:41 +01008780 let eikeep = &ei
8781 let netrw_winnr = winnr()
8782 let netrw_line = line(".")
8783 let netrw_col = virtcol(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008784 NetrwKeepj norm! H0
Bram Moolenaar8d043172014-01-23 14:24:41 +01008785 let netrw_hline = line(".")
Bram Moolenaara6878372014-03-22 21:02:50 +01008786 setl ei=all
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008787 exe "NetrwKeepj norm! ".netrw_hline."G0z\<CR>"
8788 exe "NetrwKeepj norm! ".netrw_line."G0".netrw_col."\<bar>"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008789 let &ei = eikeep
8790 let netrw_curdir = s:NetrwTreeDir(0)
8791" call Decho("tabnew",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008792 tabnew
Bram Moolenaar8d043172014-01-23 14:24:41 +01008793 let b:netrw_curdir = netrw_curdir
8794 let s:didsplit = 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008795 NetrwKeepj call s:RestoreWinVars()
8796 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008797 if &ft == "netrw"
Bram Moolenaara6878372014-03-22 21:02:50 +01008798 setl ei=all
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008799 exe "NetrwKeepj norm! ".netrw_hline."G0z\<CR>"
8800 exe "NetrwKeepj norm! ".netrw_line."G0".netrw_col."\<bar>"
Bram Moolenaar8d043172014-01-23 14:24:41 +01008801 let &ei= eikeep
8802 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008803 unlet s:didsplit
8804
8805 elseif a:mode == 5
8806 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02008807 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaar13600302014-05-22 18:26:40 +02008808 if winsz == 0|let winsz= ""|endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008809" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v",'~'.expand("<slnum>"))
Bram Moolenaar251e1912011-06-19 05:09:16 +02008810 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008811 let s:didsplit= 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008812 NetrwKeepj call s:RestoreWinVars()
8813 NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
8814 "call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008815 unlet s:didsplit
8816
8817 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008818 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008819 endif
8820
Bram Moolenaar97d62492012-11-15 21:28:22 +01008821 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008822" call Dret("s:NetrwSplit")
8823endfun
8824
8825" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02008826" s:NetrwTgtMenu: {{{2
8827fun! s:NetrwTgtMenu()
8828 if !exists("s:netrw_menucnt")
8829 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00008830 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02008831" call Dfunc("s:NetrwTgtMenu()")
8832
8833 " the following test assures that gvim is running, has menus available, and has menus enabled.
8834 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
8835 if exists("g:NetrwTopLvlMenu")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008836" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008837 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
8838 endif
8839 if !exists("s:netrw_initbookhist")
8840 call s:NetrwBookHistRead()
8841 endif
8842
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008843 " try to cull duplicate entries
8844 let tgtdict={}
8845
Bram Moolenaarff034192013-04-24 18:51:19 +02008846 " target bookmarked places
8847 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008848" call Decho("installing bookmarks as easy targets",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008849 let cnt= 1
8850 for bmd in g:netrw_bookmarklist
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008851 if has_key(tgtdict,bmd)
8852 let cnt= cnt + 1
8853 continue
8854 endif
8855 let tgtdict[bmd]= cnt
Bram Moolenaarff034192013-04-24 18:51:19 +02008856 let ebmd= escape(bmd,g:netrw_menu_escape)
8857 " show bookmarks for goto menu
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008858" call Decho("menu: Targets: ".bmd,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01008859 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 +02008860 let cnt= cnt + 1
8861 endfor
8862 endif
8863
8864 " target directory browsing history
8865 if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008866" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")",'~'.expand("<slnum>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008867 let histcnt = 1
8868 while histcnt <= g:netrw_dirhistmax
8869 let priority = g:netrw_dirhist_cnt + histcnt
8870 if exists("g:netrw_dirhist_{histcnt}")
8871 let histentry = g:netrw_dirhist_{histcnt}
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008872 if has_key(tgtdict,histentry)
8873 let histcnt = histcnt + 1
8874 continue
8875 endif
8876 let tgtdict[histentry] = histcnt
8877 let ehistentry = escape(histentry,g:netrw_menu_escape)
8878" call Decho("menu: Targets: ".histentry,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01008879 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 +02008880 endif
8881 let histcnt = histcnt + 1
8882 endwhile
8883 endif
8884 endif
8885" call Dret("s:NetrwTgtMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008886endfun
8887
8888" ---------------------------------------------------------------------
8889" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
8890" (full path directory with trailing slash returned)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008891fun! s:NetrwTreeDir(islocal)
8892" 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 Moolenaare0fa3742016-02-20 15:47:01 +01008893" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'))
8894" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
8895" call Decho("w:netrw_treetop =".(exists("w:netrw_treetop")? w:netrw_treetop : 'n/a'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008896
Bram Moolenaar8d043172014-01-23 14:24:41 +01008897 if exists("s:treedir")
8898 " s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early
8899 let treedir= s:treedir
8900 unlet s:treedir
8901" call Dret("s:NetrwTreeDir ".treedir)
8902 return treedir
8903 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008904
Bram Moolenaar8d043172014-01-23 14:24:41 +01008905 if !exists("b:netrw_curdir") || b:netrw_curdir == ""
8906 let b:netrw_curdir= getcwd()
8907 endif
8908 let treedir = b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008909" call Decho("set initial treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008910
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008911 let s:treecurpos= winsaveview()
8912" call Decho("saving posn to s:treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
8913
8914 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008915" call Decho("w:netrw_liststyle is TREELIST:",'~'.expand("<slnum>"))
8916" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008917
8918 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008919 let curline= substitute(getline('.'),"\t -->.*$",'','')
8920 if curline =~ '/$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008921" call Decho("extract tree subdirectory from current line",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008922 let treedir= substitute(getline('.'),'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008923" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
8924 elseif curline =~ '@$'
8925" call Decho("handle symbolic link from current line",'~'.expand("<slnum>"))
8926 let treedir= resolve(substitute(substitute(getline('.'),'@.*$','','e'),'^|*\s*','','e'))
8927" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008928 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008929" call Decho("do not extract tree subdirectory from current line and set treedir to empty",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008930 let treedir= ""
8931 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008932
8933 " detect user attempting to close treeroot
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008934" call Decho("check if user is attempting to close treeroot",'~'.expand("<slnum>"))
8935" call Decho(".win#".winnr()." buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
8936" call Decho(".getline(".line(".").")<".getline('.').'> '.((getline('.') =~ '^'.s:treedepthstring)? '=~' : '!~').' ^'.s:treedepthstring,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008937 if curline !~ '^'.s:treedepthstring && getline('.') != '..'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008938" call Decho(".user may have attempted to close treeroot",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008939 " now force a refresh
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008940" call Decho(".force refresh: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
8941 sil! NetrwKeepj %d _
8942" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".(exists("s:treecurpos")? string(s:treecurpos) : 'n/a').">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008943 return b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01008944" else " Decho
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008945" call Decho(".user not attempting to close treeroot",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008946 endif
8947
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008948" call Decho("islocal=".a:islocal." curline<".curline.">",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01008949 let potentialdir= s:NetrwFile(substitute(curline,'^'.s:treedepthstring.'\+ \(.*\)@$','\1',''))
8950" call Decho("potentialdir<".potentialdir."> isdir=".isdirectory(potentialdir),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008951
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008952 " COMBAK: a symbolic link may point anywhere -- so it will be used to start a new treetop
8953" if a:islocal && curline =~ '@$' && isdirectory(s:NetrwFile(potentialdir))
8954" let newdir = w:netrw_treetop.'/'.potentialdir
8955" " call Decho("apply NetrwTreePath to newdir<".newdir.">",'~'.expand("<slnum>"))
8956" let treedir = s:NetrwTreePath(newdir)
8957" let w:netrw_treetop = newdir
8958" " call Decho("newdir <".newdir.">",'~'.expand("<slnum>"))
8959" else
8960" call Decho("apply NetrwTreePath to treetop<".w:netrw_treetop.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01008961 let treedir = s:NetrwTreePath(w:netrw_treetop)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008962" endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008963 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008964
8965 " sanity maintenance: keep those //s away...
Bram Moolenaar446cb832008-06-24 21:56:24 +00008966 let treedir= substitute(treedir,'//$','/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008967" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008968
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008969" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".(exists("s:treecurpos")? string(s:treecurpos) : 'n/a').">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008970 return treedir
8971endfun
8972
8973" ---------------------------------------------------------------------
8974" s:NetrwTreeDisplay: recursive tree display {{{2
8975fun! s:NetrwTreeDisplay(dir,depth)
8976" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
8977
8978 " insure that there are no folds
Bram Moolenaarff034192013-04-24 18:51:19 +02008979 setl nofen
Bram Moolenaar446cb832008-06-24 21:56:24 +00008980
8981 " install ../ and shortdir
8982 if a:depth == ""
8983 call setline(line("$")+1,'../')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008984" call Decho("setline#".line("$")." ../ (depth is zero)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008985 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008986 if a:dir =~ '^\a\{3,}://'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008987 if a:dir == w:netrw_treetop
8988 let shortdir= a:dir
8989 else
8990 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
8991 endif
8992 call setline(line("$")+1,a:depth.shortdir)
8993 else
8994 let shortdir= substitute(a:dir,'^.*/','','e')
8995 call setline(line("$")+1,a:depth.shortdir.'/')
8996 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01008997" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008998
8999 " append a / to dir if its missing one
9000 let dir= a:dir
Bram Moolenaar446cb832008-06-24 21:56:24 +00009001
9002 " display subtrees (if any)
Bram Moolenaar8d043172014-01-23 14:24:41 +01009003 let depth= s:treedepthstring.a:depth
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009004" call Decho("display subtrees with depth<".depth."> and current leaves",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009005
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009006" call Decho("for every entry in w:netrw_treedict[".dir."]=".string(w:netrw_treedict[dir]),'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009007 for entry in w:netrw_treedict[dir]
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009008 if dir =~ '/$'
9009 let direntry= substitute(dir.entry,'[@/]$','','e')
9010 else
9011 let direntry= substitute(dir.'/'.entry,'[@/]$','','e')
9012 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009013" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009014 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009015" call Decho("<".direntry."> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009016 NetrwKeepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009017 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009018" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9019 NetrwKeepj call s:NetrwTreeDisplay(direntry.'/',depth)
9020 elseif entry =~ '@$' && has_key(w:netrw_treedict,direntry.'@')
9021" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009022 NetrwKeepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009023 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009024" call Decho("<".entry."> is not a key in treedict (no subtree)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009025 sil! NetrwKeepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009026 endif
9027 endfor
Bram Moolenaar8d043172014-01-23 14:24:41 +01009028
Bram Moolenaar446cb832008-06-24 21:56:24 +00009029" call Dret("NetrwTreeDisplay")
9030endfun
9031
9032" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009033" s:NetrwRefreshTreeDict: updates the contents information for a tree (w:netrw_treedict) {{{2
9034fun! s:NetrwRefreshTreeDict(dir)
9035" call Dfunc("s:NetrwRefreshTreeDict(dir<".a:dir.">)")
9036 for entry in w:netrw_treedict[a:dir]
9037 let direntry= substitute(a:dir.'/'.entry,'[@/]$','','e')
9038" call Decho("a:dir<".a:dir."> entry<".entry."> direntry<".direntry.">",'~'.expand("<slnum>"))
9039
9040 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
9041" call Decho("<".direntry."> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9042 NetrwKeepj call s:NetrwRefreshTreeDict(direntry)
9043 let liststar = s:NetrwGlob(direntry,'*')
9044 let listdotstar = s:NetrwGlob(direntry,'.*')
9045 let w:netrw_treedict[direntry] = liststar + listdotstar
9046" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
9047
9048 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
9049" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9050 NetrwKeepj call s:NetrwRefreshTreeDict(direntry.'/')
9051 let liststar = s:NetrwGlob(direntry.'/','*')
9052 let listdotstar= s:NetrwGlob(direntry.'/','.*')
9053 let w:netrw_treedict[direntry]= liststar + listdotstar
9054" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
9055
9056 elseif entry =~ '@$' && has_key(w:netrw_treedict,direntry.'@')
9057" call Decho("<".direntry."/> is a key in treedict - display subtree for it",'~'.expand("<slnum>"))
9058 NetrwKeepj call s:NetrwRefreshTreeDict(direntry.'/')
9059 let liststar = s:NetrwGlob(direntry.'/','*')
9060 let listdotstar= s:NetrwGlob(direntry.'/','.*')
9061" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
9062
9063 else
9064" call Decho('not updating w:netrw_treedict['.direntry.'] with entry<'.entry.'> (no subtree)',,'~'.expand("<slnum>"))
9065 endif
9066 endfor
9067" call Dret("s:NetrwRefreshTreeDict")
9068endfun
9069
9070" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009071" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009072" Called by s:PerformListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009073fun! s:NetrwTreeListing(dirname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009074 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaar446cb832008-06-24 21:56:24 +00009075" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009076" call Decho("curdir<".a:dirname.">",'~'.expand("<slnum>"))
9077" 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>"))
9078" 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 +00009079
9080 " update the treetop
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009081" call Decho("update the treetop",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009082 if !exists("w:netrw_treetop")
9083 let w:netrw_treetop= a:dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009084" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009085 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
9086 let w:netrw_treetop= a:dirname
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009087" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009088 endif
9089
Bram Moolenaar446cb832008-06-24 21:56:24 +00009090 if !exists("w:netrw_treedict")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009091 " insure that we have a treedict, albeit empty
9092" call Decho("initializing w:netrw_treedict to empty",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009093 let w:netrw_treedict= {}
9094 endif
9095
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009096 " update the dictionary for the current directory
9097" call Decho("updating: w:netrw_treedict[".a:dirname.'] -> [directory listing]','~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009098" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009099 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d _'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009100 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009101" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]),'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009102 exe "sil! NetrwKeepj ".w:netrw_bannercnt.",$d _"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009103
9104 " if past banner, record word
9105 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
9106 let fname= expand("<cword>")
9107 else
9108 let fname= ""
9109 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009110" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
9111" 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 +00009112
9113 " display from treetop on down
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009114 NetrwKeepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009115" call Decho("s:NetrwTreeDisplay) setl noma nomod ro",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009116
9117 " remove any blank line remaining as line#1 (happens in treelisting mode with banner suppressed)
9118 while getline(1) =~ '^\s*$' && byte2line(1) > 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009119" call Decho("deleting blank line",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009120 1d
9121 endwhile
9122
Bram Moolenaar13600302014-05-22 18:26:40 +02009123 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00009124
9125" call Dret("NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009126 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00009127 endif
9128endfun
9129
9130" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01009131" s:NetrwTreePath: returns path to current file in tree listing {{{2
9132" Normally, treetop is w:netrw_treetop, but a
9133" user of the function ( netrw#SetTreetop() )
9134" wipes that out prior to calling this function
9135fun! s:NetrwTreePath(treetop)
9136" call Dfunc("s:NetrwTreePath() line#".line(".")."<".getline(".").">")
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009137 let svpos = winsaveview()
9138" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009139 let depth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009140" call Decho("depth<".depth."> 1st subst",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009141 let depth = substitute(depth,'^'.s:treedepthstring,'','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009142" call Decho("depth<".depth."> 2nd subst (first depth removed)",'~'.expand("<slnum>"))
9143 let curline= getline('.')
9144" call Decho("curline<".curline.'>','~'.expand("<slnum>"))
9145 if curline =~ '/$'
9146" call Decho("extract tree directory from current line",'~'.expand("<slnum>"))
9147 let treedir= substitute(curline,'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
9148" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
9149 elseif curline =~ '@\s\+-->'
9150" call Decho("extract tree directory using symbolic link",'~'.expand("<slnum>"))
9151 let treedir= substitute(curline,'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
9152 let treedir= substitute(treedir,'@\s\+-->.*$','','e')
9153" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009154 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009155" call Decho("do not extract tree directory from current line and set treedir to empty",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009156 let treedir= ""
9157 endif
9158 " construct treedir by searching backwards at correct depth
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009159" call Decho("construct treedir by searching backwards for correct depth",'~'.expand("<slnum>"))
9160" call Decho("initial treedir<".treedir."> depth<".depth.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009161 while depth != "" && search('^'.depth.'[^'.s:treedepthstring.'].\{-}/$','bW')
9162 let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
9163 let treedir= dirname.treedir
9164 let depth = substitute(depth,'^'.s:treedepthstring,'','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009165" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009166 endwhile
9167 if a:treetop =~ '/$'
9168 let treedir= a:treetop.treedir
9169 else
9170 let treedir= a:treetop.'/'.treedir
9171 endif
9172 let treedir= substitute(treedir,'//$','/','')
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009173" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))"
9174 call winrestview(svpos)
Bram Moolenaara6878372014-03-22 21:02:50 +01009175" call Dret("s:NetrwTreePath <".treedir.">")
9176 return treedir
9177endfun
9178
9179" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009180" s:NetrwWideListing: {{{2
9181fun! s:NetrwWideListing()
9182
9183 if w:netrw_liststyle == s:WIDELIST
9184" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
9185 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009186 " cpf: characters per filename
9187 " fpl: filenames per line
9188 " fpc: filenames per column
Bram Moolenaarff034192013-04-24 18:51:19 +02009189 setl ma noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009190" call Decho("setl ma noro",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009191 let b:netrw_cpf= 0
9192 if line("$") >= w:netrw_bannercnt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009193 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
9194 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009195 else
9196" call Dret("NetrwWideListing")
9197 return
9198 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009199 let b:netrw_cpf= b:netrw_cpf + 2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009200" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009201
9202 " determine qty files per line (fpl)
9203 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
9204 if w:netrw_fpl <= 0
9205 let w:netrw_fpl= 1
9206 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009207" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009208
9209 " make wide display
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009210 " fpc: files per column of wide listing
9211 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'S",submatch(0)),"\\")/'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009212 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009213 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
9214 let newcolstart = w:netrw_bannercnt + fpc
9215 let newcolend = newcolstart + fpc - 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009216" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009217 if has("clipboard")
9218 sil! let keepregstar = @*
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009219 sil! let keepregplus = @+
Bram Moolenaara6878372014-03-22 21:02:50 +01009220 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009221 while line("$") >= newcolstart
9222 if newcolend > line("$") | let newcolend= line("$") | endif
9223 let newcolqty= newcolend - newcolstart
9224 exe newcolstart
9225 if newcolqty == 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009226 exe "sil! NetrwKeepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009227 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009228 exe "sil! NetrwKeepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009229 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009230 exe "sil! NetrwKeepj ".newcolstart.','.newcolend.'d _'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009231 exe 'sil! NetrwKeepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00009232 endwhile
Bram Moolenaara6878372014-03-22 21:02:50 +01009233 if has("clipboard")
9234 sil! let @*= keepregstar
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009235 sil! let @+= keepregplus
Bram Moolenaara6878372014-03-22 21:02:50 +01009236 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009237 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$s/\s\+$//e'
9238 NetrwKeepj call histdel("/",-1)
9239 exe 'nno <buffer> <silent> w :call search(''^.\\|\s\s\zs\S'',''W'')'."\<cr>"
9240 exe 'nno <buffer> <silent> b :call search(''^.\\|\s\s\zs\S'',''bW'')'."\<cr>"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009241" call Decho("NetrwWideListing) setl noma nomod ro",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +02009242 exe "setl ".g:netrw_bufsettings
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009243" call Decho("(NetrwWideListing) 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 +00009244" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009245 return
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009246 else
9247 if hasmapto("w","n")
9248 sil! nunmap <buffer> w
9249 endif
9250 if hasmapto("b","n")
9251 sil! nunmap <buffer> b
9252 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009253 endif
9254
9255endfun
9256
9257" ---------------------------------------------------------------------
9258" s:PerformListing: {{{2
9259fun! s:PerformListing(islocal)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009260" call Dfunc("s:PerformListing(islocal=".a:islocal.")")
9261" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
9262" 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)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009263
Bram Moolenaar15146672011-10-20 22:22:38 +02009264 " set up syntax highlighting {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009265" call Decho("--set up syntax highlighting (ie. setl ft=netrw)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009266 sil! setl ft=netrw
Bram Moolenaar15146672011-10-20 22:22:38 +02009267
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009268 NetrwKeepj call s:NetrwSafeOptions()
Bram Moolenaara6878372014-03-22 21:02:50 +01009269 setl noro ma
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009270" call Decho("setl noro ma bh=".&bh,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009271
9272" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009273" call Decho("(netrw) Processing your browsing request...",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009274" endif " Decho
9275
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009276" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009277 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
9278 " force a refresh for tree listings
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009279" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
9280 sil! NetrwKeepj %d _
Bram Moolenaar446cb832008-06-24 21:56:24 +00009281 endif
9282
9283 " save current directory on directory history list
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009284 NetrwKeepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009285
9286 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009287 if g:netrw_banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009288" call Decho("--set up banner",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009289 NetrwKeepj call setline(1,'" ============================================================================')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009290 if exists("g:netrw_pchk")
9291 " this undocumented option allows pchk to run with different versions of netrw without causing spurious
9292 " failure detections.
9293 NetrwKeepj call setline(2,'" Netrw Directory Listing')
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009294 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009295 NetrwKeepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
9296 endif
9297 if exists("g:netrw_pchk")
9298 let curdir= substitute(b:netrw_curdir,expand("$HOME"),'~','')
9299 else
9300 let curdir= b:netrw_curdir
9301 endif
9302 if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash
9303 NetrwKeepj call setline(3,'" '.substitute(curdir,'/','\\','g'))
9304 else
9305 NetrwKeepj call setline(3,'" '.curdir)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009306 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009307 let w:netrw_bannercnt= 3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009308 NetrwKeepj exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01009309 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009310" call Decho("--no banner",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009311 NetrwKeepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01009312 let w:netrw_bannercnt= 1
9313 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009314" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." win#".winnr(),'~'.expand("<slnum>"))
9315" 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 +00009316
9317 let sortby= g:netrw_sort_by
9318 if g:netrw_sort_direction =~ "^r"
9319 let sortby= sortby." reversed"
9320 endif
9321
9322 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009323 if g:netrw_banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009324" call Decho("--handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009325 if g:netrw_sort_by =~ "^n"
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009326" call Decho("directories will be sorted by name",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009327 " sorted by name
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009328 NetrwKeepj put ='\" Sorted by '.sortby
9329 NetrwKeepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01009330 let w:netrw_bannercnt= w:netrw_bannercnt + 2
9331 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009332" call Decho("directories will be sorted by size or time",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009333 " sorted by size or date
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009334 NetrwKeepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01009335 let w:netrw_bannercnt= w:netrw_bannercnt + 1
9336 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009337 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar8d043172014-01-23 14:24:41 +01009338" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009339" 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 +00009340 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009341
9342 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01009343 if g:netrw_banner
9344 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009345" call Decho("--show copy/move target<".s:netrwmftgt.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009346 NetrwKeepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01009347 if s:netrwmftgt_islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009348 sil! NetrwKeepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01009349 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009350 sil! NetrwKeepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01009351 endif
9352 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00009353 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009354" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009355 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009356 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00009357 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009358
9359 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01009360 if g:netrw_banner
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009361" call Decho("--handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009362 if g:netrw_list_hide != "" && g:netrw_hide
9363 if g:netrw_hide == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009364 NetrwKeepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01009365 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009366 NetrwKeepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01009367 endif
9368 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00009369 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009370 exe "NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaara6878372014-03-22 21:02:50 +01009371
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009372" 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 +01009373 let quickhelp = g:netrw_quickhelp%len(s:QuickHelp)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009374" call Decho("quickhelp =".quickhelp,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009375 NetrwKeepj put ='\" Quick Help: <F1>:help '.s:QuickHelp[quickhelp]
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009376" 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 +01009377 NetrwKeepj put ='\" =============================================================================='
Bram Moolenaar5c736222010-01-06 20:54:52 +01009378 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8d043172014-01-23 14:24:41 +01009379" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009380" 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 +00009381 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009382
9383 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01009384 if g:netrw_banner
9385 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009386 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009387" 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 +01009388" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009389" 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 +01009390 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009391
Bram Moolenaar446cb832008-06-24 21:56:24 +00009392 " get list of files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009393" call Decho("--Get list of files - islocal=".a:islocal,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009394 if a:islocal
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009395 NetrwKeepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009396 else " remote
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009397 NetrwKeepj let badresult= s:NetrwRemoteListing()
Bram Moolenaara6878372014-03-22 21:02:50 +01009398 if badresult
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009399" 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 +01009400" call Dret("s:PerformListing : error detected by NetrwRemoteListing")
9401 return
9402 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009403 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009404
9405 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009406 if !exists("w:netrw_bannercnt")
9407 let w:netrw_bannercnt= 0
9408 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009409" call Decho("--manipulate directory listing (hide, sort)",'~'.expand("<slnum>"))
9410" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)",'~'.expand("<slnum>"))
9411" 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 +01009412
Bram Moolenaar5c736222010-01-06 20:54:52 +01009413 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009414" call Decho("manipulate directory listing (hide)",'~'.expand("<slnum>"))
9415" 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 +00009416 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009417 NetrwKeepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009418 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009419 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009420" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009421
9422 if g:netrw_sort_by =~ "^n"
9423 " sort by name
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009424 NetrwKeepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00009425
Bram Moolenaar5c736222010-01-06 20:54:52 +01009426 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009427" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009428 if g:netrw_sort_direction =~ 'n'
9429 " normal direction sorting
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009430 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00009431 else
9432 " reverse direction sorting
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009433 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00009434 endif
9435 endif
9436 " remove priority pattern prefix
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009437" call Decho("remove priority pattern prefix",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009438 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
9439 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009440
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009441 elseif g:netrw_sort_by =~ "^ext"
9442 " sort by extension
9443 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g+/+s/^/001'.g:netrw_sepchr.'/'
9444 NetrwKeepj call histdel("/",-1)
9445 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v+[./]+s/^/002'.g:netrw_sepchr.'/'
9446 NetrwKeepj call histdel("/",-1)
9447 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v+['.g:netrw_sepchr.'/]+s/^\(.*\.\)\(.\{-\}\)$/\2'.g:netrw_sepchr.'&/e'
9448 NetrwKeepj call histdel("/",-1)
9449 if !g:netrw_banner || w:netrw_bannercnt < line("$")
9450" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
9451 if g:netrw_sort_direction =~ 'n'
9452 " normal direction sorting
9453 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
9454 else
9455 " reverse direction sorting
9456 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
9457 endif
9458 endif
9459 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^.\{-}'.g:netrw_sepchr.'//e'
9460 NetrwKeepj call histdel("/",-1)
9461
Bram Moolenaar446cb832008-06-24 21:56:24 +00009462 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01009463 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009464" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009465 if g:netrw_sort_direction =~ 'n'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009466" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009467 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00009468 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009469" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort!','~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009470 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00009471 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009472 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
9473 NetrwKeepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009474 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009475 endif
9476
9477 elseif g:netrw_sort_direction =~ 'r'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009478" call Decho('(s:PerformListing) reverse the sorted listing','~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009479 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009480 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01009481 call histdel("/",-1)
9482 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009483 endif
9484 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009485" 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 +00009486
9487 " convert to wide/tree listing {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009488" call Decho("--modify display if wide/tree listing style",'~'.expand("<slnum>"))
9489" 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 +01009490 NetrwKeepj call s:NetrwWideListing()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009491" 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 +01009492 NetrwKeepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009493" 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 +00009494
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009495 " resolve symbolic links if local and (thin or tree)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009496 if a:islocal && (w:netrw_liststyle == s:THINLIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009497" call Decho("--resolve symbolic links if local and thin|tree",'~'.expand("<slnum>"))
9498 g/@$/call s:ShowLink()
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009499 endif
9500
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009501 if exists("w:netrw_bannercnt") && (line("$") >= w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009502 " place cursor on the top-left corner of the file listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009503" call Decho("--place cursor on top-left corner of file listing",'~'.expand("<slnum>"))
9504 exe 'sil! '.w:netrw_bannercnt
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009505 sil! NetrwKeepj norm! 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009506" call Decho(" tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
9507 else
9508" call Decho("--did NOT place cursor on top-left corner",'~'.expand("<slnum>"))
9509" call Decho(" w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a'),'~'.expand("<slnum>"))
9510" call Decho(" line($)=".line("$"),'~'.expand("<slnum>"))
9511" call Decho(" g:netrw_banner=".(exists("g:netrw_banner")? g:netrw_banner : 'n/a'),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009512 endif
9513
9514 " record previous current directory
9515 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009516" call Decho("--record netrw_prvdir<".w:netrw_prvdir.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009517
9518 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009519" call Decho("--save some window-oriented variables into buffer oriented variables",'~'.expand("<slnum>"))
9520" 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 +01009521 NetrwKeepj call s:SetBufWinVars()
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009522" 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 Moolenaar8feef4f2015-01-07 16:57:10 +01009523 NetrwKeepj call s:NetrwOptionRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009524" 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 +00009525
9526 " set display to netrw display settings
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009527" call Decho("--set display to netrw display settings (".g:netrw_bufsettings.")",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009528 exe "setl ".g:netrw_bufsettings
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009529" 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 +01009530 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009531" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +01009532 exe "setl ts=".(g:netrw_maxfilenamelen+1)
9533 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009534
Bram Moolenaar8d043172014-01-23 14:24:41 +01009535 if exists("s:treecurpos")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009536" call Decho("s:treecurpos exists; restore posn",'~'.expand("<slnum>"))
9537" 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 +01009538" call Decho("restoring posn to s:treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
9539 NetrwKeepj call winrestview(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009540 unlet s:treecurpos
9541 endif
9542
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009543" 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>"))
9544" 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 +00009545" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
9546endfun
9547
9548" ---------------------------------------------------------------------
9549" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009550fun! s:SetupNetrwStatusLine(statline)
9551" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
9552
9553 if !exists("s:netrw_setup_statline")
9554 let s:netrw_setup_statline= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009555" call Decho("do first-time status line setup",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00009556
9557 if !exists("s:netrw_users_stl")
9558 let s:netrw_users_stl= &stl
9559 endif
9560 if !exists("s:netrw_users_ls")
9561 let s:netrw_users_ls= &laststatus
9562 endif
9563
9564 " set up User9 highlighting as needed
9565 let keepa= @a
9566 redir @a
9567 try
9568 hi User9
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009569 catch /^Vim\%((\a\{3,})\)\=:E411/
Bram Moolenaar9964e462007-05-05 17:54:07 +00009570 if &bg == "dark"
9571 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
9572 else
9573 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
9574 endif
9575 endtry
9576 redir END
9577 let @a= keepa
9578 endif
9579
9580 " set up status line (may use User9 highlighting)
9581 " insure that windows have a statusline
9582 " make sure statusline is displayed
9583 let &stl=a:statline
Bram Moolenaarff034192013-04-24 18:51:19 +02009584 setl laststatus=2
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009585" call Decho("stl=".&stl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009586 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00009587
9588" call Dret("SetupNetrwStatusLine : stl=".&stl)
9589endfun
9590
9591" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009592" Remote Directory Browsing Support: {{{1
9593" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00009594
9595" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +01009596" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
9597" This function assumes that a long listing will be received. Size, time,
9598" and reverse sorts will be requested of the server but not otherwise
9599" enforced here.
9600fun! s:NetrwRemoteFtpCmd(path,listcmd)
9601" 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 +01009602" call Decho("line($)=".line("$")." win#".winnr()." w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009603 " sanity check: {{{3
9604 if !exists("w:netrw_method")
9605 if exists("b:netrw_method")
9606 let w:netrw_method= b:netrw_method
9607 else
9608 call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93)
9609" call Dret("NetrwRemoteFtpCmd")
9610 return
9611 endif
9612 endif
9613
9614 " WinXX ftp uses unix style input, so set ff to unix " {{{3
9615 let ffkeep= &ff
9616 setl ma ff=unix noro
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009617" call Decho("setl ma ff=unix noro",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009618
9619 " clear off any older non-banner lines " {{{3
9620 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009621" call Decho('exe sil! NetrwKeepj '.w:netrw_bannercnt.",$d _ (clear off old non-banner lines)",'~'.expand("<slnum>"))
9622 exe "sil! NetrwKeepj ".w:netrw_bannercnt.",$d _"
Bram Moolenaara6878372014-03-22 21:02:50 +01009623
9624 ".........................................
9625 if w:netrw_method == 2 || w:netrw_method == 5 " {{{3
9626 " ftp + <.netrc>: Method #2
9627 if a:path != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009628 NetrwKeepj put ='cd \"'.a:path.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +01009629 endif
9630 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009631 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009632" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009633 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009634 NetrwKeepj call setline(line("$")+1,a:listcmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009635" exe "NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaara6878372014-03-22 21:02:50 +01009636 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009637" 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>"))
9638 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 +01009639 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009640" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1),'~'.expand("<slnum>"))
9641 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 +01009642 endif
9643
9644 ".........................................
9645 elseif w:netrw_method == 3 " {{{3
9646 " ftp + machine,id,passwd,filename: Method #3
9647 setl ff=unix
9648 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009649 NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaara6878372014-03-22 21:02:50 +01009650 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009651 NetrwKeepj put ='open '.g:netrw_machine
Bram Moolenaara6878372014-03-22 21:02:50 +01009652 endif
9653
9654 " handle userid and password
9655 let host= substitute(g:netrw_machine,'\..*$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009656" call Decho("host<".host.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009657 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
9658 call NetUserPass("ftp:".host)
9659 endif
9660 if exists("g:netrw_uid") && g:netrw_uid != ""
9661 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009662 NetrwKeepj put =g:netrw_uid
Bram Moolenaara6878372014-03-22 21:02:50 +01009663 if exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009664 NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +01009665 endif
9666 elseif exists("s:netrw_passwd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009667 NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +01009668 endif
9669 endif
9670
9671 if a:path != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009672 NetrwKeepj put ='cd \"'.a:path.'\"'
Bram Moolenaara6878372014-03-22 21:02:50 +01009673 endif
9674 if exists("g:netrw_ftpextracmd")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009675 NetrwKeepj put =g:netrw_ftpextracmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009676" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009677 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009678 NetrwKeepj call setline(line("$")+1,a:listcmd)
Bram Moolenaara6878372014-03-22 21:02:50 +01009679
9680 " perform ftp:
9681 " -i : turns off interactive prompting from ftp
9682 " -n unix : DON'T use <.netrc>, even though it exists
9683 " -n win32: quit being obnoxious about password
9684 if exists("w:netrw_bannercnt")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009685" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009686 call s:NetrwExe(s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
Bram Moolenaara6878372014-03-22 21:02:50 +01009687" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009688" call Decho("WARNING: w:netrw_bannercnt doesn't exist!",'~'.expand("<slnum>"))
9689" g/^./call Decho("SKIPPING ftp#".line(".").": ".getline("."),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +01009690 endif
9691
9692 ".........................................
9693 elseif w:netrw_method == 9 " {{{3
9694 " sftp username@machine: Method #9
9695 " s:netrw_sftp_cmd
9696 setl ff=unix
9697
9698 " restore settings
9699 let &ff= ffkeep
9700" call Dret("NetrwRemoteFtpCmd")
9701 return
9702
9703 ".........................................
9704 else " {{{3
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009705 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . bufname("%") . ">",23)
Bram Moolenaara6878372014-03-22 21:02:50 +01009706 endif
9707
9708 " cleanup for Windows " {{{3
9709 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009710 sil! NetrwKeepj %s/\r$//e
9711 NetrwKeepj call histdel("/",-1)
Bram Moolenaara6878372014-03-22 21:02:50 +01009712 endif
9713 if a:listcmd == "dir"
9714 " infer directory/link based on the file permission string
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009715 sil! NetrwKeepj g/d\%([-r][-w][-x]\)\{3}/NetrwKeepj s@$@/@e
9716 sil! NetrwKeepj g/l\%([-r][-w][-x]\)\{3}/NetrwKeepj s/$/@/e
9717 NetrwKeepj call histdel("/",-1)
9718 NetrwKeepj call histdel("/",-1)
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009719 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 +01009720 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
9721 NetrwKeepj call histdel("/",-1)
Bram Moolenaara6878372014-03-22 21:02:50 +01009722 endif
9723 endif
9724
9725 " ftp's listing doesn't seem to include ./ or ../ " {{{3
9726 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009727 exe 'NetrwKeepj '.w:netrw_bannercnt
9728 NetrwKeepj put ='./'
Bram Moolenaara6878372014-03-22 21:02:50 +01009729 endif
9730 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009731 exe 'NetrwKeepj '.w:netrw_bannercnt
9732 NetrwKeepj put ='../'
Bram Moolenaara6878372014-03-22 21:02:50 +01009733 endif
9734
9735 " restore settings " {{{3
9736 let &ff= ffkeep
9737" call Dret("NetrwRemoteFtpCmd")
9738endfun
9739
9740" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009741" s:NetrwRemoteListing: {{{2
9742fun! s:NetrwRemoteListing()
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009743" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">) win#".winnr())
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00009744
Bram Moolenaara6878372014-03-22 21:02:50 +01009745 if !exists("w:netrw_bannercnt") && exists("s:bannercnt")
9746 let w:netrw_bannercnt= s:bannercnt
9747 endif
9748 if !exists("w:netrw_bannercnt") && exists("b:bannercnt")
9749 let w:netrw_bannercnt= s:bannercnt
9750 endif
9751
Bram Moolenaar446cb832008-06-24 21:56:24 +00009752 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00009753
Bram Moolenaar446cb832008-06-24 21:56:24 +00009754 " sanity check:
9755 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009756" call Decho("b:netrw_method=".b:netrw_method,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009757 if !executable("ftp")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009758" call Decho("ftp is not executable",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009759 if !exists("g:netrw_quiet")
9760 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
9761 endif
9762 call s:NetrwOptionRestore("w:")
Bram Moolenaara6878372014-03-22 21:02:50 +01009763" call Dret("s:NetrwRemoteListing -1")
9764 return -1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00009765 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009766
Bram Moolenaar8d043172014-01-23 14:24:41 +01009767 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009768" call Decho("g:netrw_list_cmd<",(exists("g:netrw_list_cmd")? 'n/a' : "-empty-").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009769 if !exists("g:netrw_quiet")
Bram Moolenaar8d043172014-01-23 14:24:41 +01009770 if g:netrw_list_cmd == ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009771 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 +00009772 else
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009773 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 +00009774 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00009775 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00009776
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009777 NetrwKeepj call s:NetrwOptionRestore("w:")
Bram Moolenaara6878372014-03-22 21:02:50 +01009778" call Dret("s:NetrwRemoteListing -1")
9779 return -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00009780 endif " (remote handling sanity check)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009781" call Decho("passed remote listing sanity checks",'~'.expand("<slnum>"))
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00009782
Bram Moolenaar446cb832008-06-24 21:56:24 +00009783 if exists("b:netrw_method")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009784" call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009785 let w:netrw_method= b:netrw_method
9786 endif
9787
Bram Moolenaar13600302014-05-22 18:26:40 +02009788 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02009789 " use ftp to get remote file listing {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009790" call Decho("use ftp to get remote file listing",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009791 let s:method = "ftp"
9792 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00009793 if g:netrw_sort_by =~ '^t'
9794 let listcmd= g:netrw_ftp_timelist_cmd
9795 elseif g:netrw_sort_by =~ '^s'
9796 let listcmd= g:netrw_ftp_sizelist_cmd
9797 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009798" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009799 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009800" exe "sil! keepalt NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009801
Bram Moolenaara6878372014-03-22 21:02:50 +01009802 " report on missing file or directory messages
9803 if search('[Nn]o such file or directory\|Failed to change directory')
9804 let mesg= getline(".")
9805 if exists("w:netrw_bannercnt")
9806 setl ma
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009807 exe w:netrw_bannercnt.",$d _"
Bram Moolenaara6878372014-03-22 21:02:50 +01009808 setl noma
9809 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009810 NetrwKeepj call s:NetrwOptionRestore("w:")
Bram Moolenaara6878372014-03-22 21:02:50 +01009811 call netrw#ErrorMsg(s:WARNING,mesg,96)
9812" call Dret("s:NetrwRemoteListing : -1")
9813 return -1
9814 endif
9815
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009816 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 +00009817 " shorten the listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009818" call Decho("generate short listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009819 exe "sil! keepalt NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00009820
9821 " cleanup
9822 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009823 exe "sil! keepalt NetrwKeepj g/".g:netrw_ftp_browse_reject."/NetrwKeepj d"
9824 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009825 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009826 sil! NetrwKeepj %s/\r$//e
9827 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009828
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009829 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +00009830 let line1= line(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009831 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar97d62492012-11-15 21:28:22 +01009832 let line2= search('\.\.\/\%(\s\|$\)','cnW')
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009833" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009834 if line2 == 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009835" call Decho("netrw is putting ../ into listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009836 sil! NetrwKeepj put='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009837 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009838 exe "sil! NetrwKeepj ".line1
9839 sil! NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009840
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009841" call Decho("line1=".line1." line2=".line2." line(.)=".line("."),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009842 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009843" call Decho("M$ ftp cleanup",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009844 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
9845 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009846 else " normal ftp cleanup
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009847" call Decho("normal ftp cleanup",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009848 exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
9849 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
9850 exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
9851 NetrwKeepj call histdel("/",-1)
9852 NetrwKeepj call histdel("/",-1)
9853 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009854 endif
9855 endif
9856
Bram Moolenaar13600302014-05-22 18:26:40 +02009857 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00009858 " use ssh to get remote file listing {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009859" call Decho("use ssh to get remote file listing: s:path<".s:path.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009860 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009861" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009862 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009863" call Decho("1: exe r! ".s:ShellEscape(listcmd.s:path, 1),'~'.expand("<slnum>"))
9864 exe "NetrwKeepj r! ".listcmd.s:ShellEscape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009865 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009866 sil! NetrwKeepj g/^Listing directory/NetrwKeepj d
9867 sil! NetrwKeepj g/^d[-rwx][-rwx][-rwx]/NetrwKeepj s+$+/+e
9868 sil! NetrwKeepj g/^l[-rwx][-rwx][-rwx]/NetrwKeepj s+$+@+e
9869 NetrwKeepj call histdel("/",-1)
9870 NetrwKeepj call histdel("/",-1)
9871 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009872 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009873 sil! NetrwKeepj g/^[dlsp-][-rwx][-rwx][-rwx]/NetrwKeepj s/^.*\s\(\S\+\)$/\1/e
9874 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009875 endif
9876 else
9877 if s:path == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009878" call Decho("2: exe r! ".listcmd,'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009879 exe "NetrwKeepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00009880 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009881" call Decho("3: exe r! ".listcmd.' '.s:ShellEscape(fnameescape(s:path),1),'~'.expand("<slnum>"))
9882 exe "NetrwKeepj keepalt r! ".listcmd.' '.s:ShellEscape(fnameescape(s:path),1)
9883" call Decho("listcmd<".listcmd."> path<".s:path.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009884 endif
9885 endif
9886
9887 " cleanup
Bram Moolenaara6878372014-03-22 21:02:50 +01009888 if g:netrw_ssh_browse_reject != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009889" call Decho("cleanup: exe sil! g/".g:netrw_ssh_browse_reject."/NetrwKeepj d",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009890 exe "sil! g/".g:netrw_ssh_browse_reject."/NetrwKeepj d"
9891 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009892 endif
9893 endif
9894
9895 if w:netrw_liststyle == s:LONGLIST
9896 " do a long listing; these substitutions need to be done prior to sorting {{{3
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009897" call Decho("fix long listing:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009898
9899 if s:method == "ftp"
9900 " cleanup
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009901 exe "sil! NetrwKeepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00009902 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009903 sil! NetrwKeepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00009904 endwhile
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009905 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +00009906 let line1= line(".")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009907 sil! NetrwKeepj 1
9908 sil! NetrwKeepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00009909 let line2= line(".")
9910 if line2 == 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009911 if b:netrw_curdir != '/'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009912 exe 'sil! NetrwKeepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009913 endif
9914 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009915 exe "sil! NetrwKeepj ".line1
9916 sil! NetrwKeepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009917 endif
9918
9919 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009920" call Decho("M$ ftp site listing cleanup",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009921 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 +00009922 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009923" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009924 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009925 exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2 \t\1/e'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009926 exe 'sil NetrwKeepj '.w:netrw_bannercnt
9927 NetrwKeepj call histdel("/",-1)
9928 NetrwKeepj call histdel("/",-1)
9929 NetrwKeepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009930 endif
9931 endif
9932
9933" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009934" exe "NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."),''~''.expand("<slnum>"))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00009935" endif " Decho
Bram Moolenaara6878372014-03-22 21:02:50 +01009936
9937" call Dret("s:NetrwRemoteListing 0")
9938 return 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00009939endfun
9940
Bram Moolenaar446cb832008-06-24 21:56:24 +00009941" ---------------------------------------------------------------------
9942" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
9943fun! s:NetrwRemoteRm(usrhost,path) range
9944" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009945" call Decho("firstline=".a:firstline." lastline=".a:lastline,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009946 let svpos= winsaveview()
9947" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009948
9949 let all= 0
9950 if exists("s:netrwmarkfilelist_{bufnr('%')}")
9951 " remove all marked files
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009952" call Decho("remove all marked files with bufnr#".bufnr("%"),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009953 for fname in s:netrwmarkfilelist_{bufnr("%")}
9954 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
9955 if ok =~ 'q\%[uit]'
9956 break
9957 elseif ok =~ 'a\%[ll]'
9958 let all= 1
9959 endif
9960 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01009961 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009962
9963 else
9964 " remove files specified by range
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009965" call Decho("remove files specified by range",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009966
9967 " preparation for removing multiple files/directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009968 let keepsol = &l:sol
9969 setl nosol
9970 let ctr = a:firstline
Bram Moolenaar446cb832008-06-24 21:56:24 +00009971
9972 " remove multiple files and directories
9973 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009974 exe "NetrwKeepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00009975 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
9976 if ok =~ 'q\%[uit]'
9977 break
9978 elseif ok =~ 'a\%[ll]'
9979 let all= 1
9980 endif
9981 let ctr= ctr + 1
9982 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009983 let &l:sol = keepsol
Bram Moolenaar446cb832008-06-24 21:56:24 +00009984 endif
9985
9986 " refresh the (remote) directory listing
Bram Moolenaara0f849e2015-10-30 14:37:44 +01009987" call Decho("refresh remote directory listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +01009988 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +01009989" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
9990 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009991
9992" call Dret("s:NetrwRemoteRm")
9993endfun
9994
9995" ---------------------------------------------------------------------
9996" s:NetrwRemoteRmFile: {{{2
9997fun! s:NetrwRemoteRmFile(path,rmfile,all)
9998" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
9999
10000 let all= a:all
10001 let ok = ""
10002
10003 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
10004 " attempt to remove file
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010005" call Decho("attempt to remove file (all=".all.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010006 if !all
10007 echohl Statement
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010008" call Decho("case all=0:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010009 call inputsave()
10010 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
10011 call inputrestore()
10012 echohl NONE
10013 if ok == ""
10014 let ok="no"
10015 endif
10016 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
10017 if ok =~ 'a\%[ll]'
10018 let all= 1
10019 endif
10020 endif
10021
10022 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010023" 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 +000010024 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010025" call Decho("case ftp:",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010026 let path= a:path
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010027 if path =~ '^\a\{3,}://'
10028 let path= substitute(path,'^\a\{3,}://[^/]\+/','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +000010029 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010030 sil! NetrwKeepj .,$d _
Bram Moolenaar446cb832008-06-24 21:56:24 +000010031 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
10032 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010033" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010034 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010035" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010036 if !exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010037 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010038 let ok="q"
10039 else
10040 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010041" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">",'~'.expand("<slnum>"))
10042" call Decho("remotedir<".remotedir.">",'~'.expand("<slnum>"))
10043" call Decho("rmfile<".a:rmfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010044 if remotedir != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010045 let netrw_rm_cmd= netrw_rm_cmd." ".s:ShellEscape(fnameescape(remotedir.a:rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010046 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010047 let netrw_rm_cmd= netrw_rm_cmd." ".s:ShellEscape(fnameescape(a:rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010048 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010049" call Decho("call system(".netrw_rm_cmd.")",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010050 let ret= system(netrw_rm_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010051 if v:shell_error != 0
10052 if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
10053 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-c)",102)
10054 else
10055 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
10056 endif
10057 else if ret != 0
10058 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010059 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010060" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010061 endif
10062 endif
10063 elseif ok =~ 'q\%[uit]'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010064" call Decho("ok==".ok,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010065 endif
10066
10067 else
10068 " attempt to remove directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010069" call Decho("attempt to remove directory",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010070 if !all
10071 call inputsave()
10072 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
10073 call inputrestore()
10074 if ok == ""
10075 let ok="no"
10076 endif
10077 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
10078 if ok =~ 'a\%[ll]'
10079 let all= 1
10080 endif
10081 endif
10082
10083 if all || ok =~ 'y\%[es]' || ok == ""
10084 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010085 NetrwKeepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010086 else
10087 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010088 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.s:ShellEscape(netrw#WinPath(rmfile))
10089" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000010090 let ret= system(netrw_rmdir_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010091" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010092
10093 if v:shell_error != 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010094" call Decho("v:shell_error not 0",'~'.expand("<slnum>"))
10095 let netrw_rmf_cmd= s:MakeSshCmd(netrw#WinPath(g:netrw_rmf_cmd)).' '.s:ShellEscape(netrw#WinPath(substitute(rmfile,'[\/]$','','e')))
10096" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000010097 let ret= system(netrw_rmf_cmd)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010098" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010099
10100 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010101 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010102 endif
10103 endif
10104 endif
10105
10106 elseif ok =~ 'q\%[uit]'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010107" call Decho("ok==".ok,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010108 endif
10109 endif
10110
10111" call Dret("s:NetrwRemoteRmFile ".ok)
10112 return ok
10113endfun
10114
10115" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010116" s:NetrwRemoteRename: rename a remote file or directory {{{2
10117fun! s:NetrwRemoteRename(usrhost,path) range
10118" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
10119
10120 " preparation for removing multiple files/directories
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010121 let svpos = winsaveview()
10122" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010123 let ctr = a:firstline
10124 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
10125
10126 " rename files given by the markfilelist
10127 if exists("s:netrwmarkfilelist_{bufnr('%')}")
10128 for oldname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010129" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010130 if exists("subfrom")
10131 let newname= substitute(oldname,subfrom,subto,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010132" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010133 else
10134 call inputsave()
10135 let newname= input("Moving ".oldname." to : ",oldname)
10136 call inputrestore()
10137 if newname =~ '^s/'
10138 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
10139 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
10140 let newname = substitute(oldname,subfrom,subto,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010141" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010142 endif
10143 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010144
Bram Moolenaar446cb832008-06-24 21:56:24 +000010145 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010146 NetrwKeepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010147 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010148 let oldname= s:ShellEscape(a:path.oldname)
10149 let newname= s:ShellEscape(a:path.newname)
10150" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010151 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010152 endif
10153
10154 endfor
10155 call s:NetrwUnMarkFile(1)
10156
10157 else
10158
10159 " attempt to rename files/directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010160 let keepsol= &l:sol
10161 setl nosol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010162 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010163 exe "NetrwKeepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +000010164
10165 let oldname= s:NetrwGetWord()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010166" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010167
10168 call inputsave()
10169 let newname= input("Moving ".oldname." to : ",oldname)
10170 call inputrestore()
10171
10172 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
10173 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
10174 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010175 let oldname= s:ShellEscape(a:path.oldname)
10176 let newname= s:ShellEscape(a:path.newname)
10177" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010178 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010179 endif
10180
10181 let ctr= ctr + 1
10182 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010183 let &l:sol= keepsol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010184 endif
10185
10186 " refresh the directory
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010187 NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010188" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
10189 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010190
10191" call Dret("NetrwRemoteRename")
10192endfun
10193
10194" ---------------------------------------------------------------------
10195" Local Directory Browsing Support: {{{1
10196" ==========================================
10197
10198" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +010010199" netrw#FileUrlRead: handles reading file://* files {{{2
10200" Should accept: file://localhost/etc/fstab
10201" file:///etc/fstab
10202" file:///c:/WINDOWS/clock.avi
10203" file:///c|/WINDOWS/clock.avi
10204" file://localhost/c:/WINDOWS/clock.avi
10205" file://localhost/c|/WINDOWS/clock.avi
10206" file://c:/foo.txt
10207" file:///c:/foo.txt
10208" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
10209fun! netrw#FileUrlRead(fname)
10210" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
10211 let fname = a:fname
10212 if fname =~ '^file://localhost/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010213" call Decho('converting file://localhost/ -to- file:///','~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010214 let fname= substitute(fname,'^file://localhost/','file:///','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010215" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010216 endif
10217 if (has("win32") || has("win95") || has("win64") || has("win16"))
10218 if fname =~ '^file:///\=\a[|:]/'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010219" call Decho('converting file:///\a|/ -to- file://\a:/','~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010220 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010221" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010222 endif
10223 endif
10224 let fname2396 = netrw#RFC2396(fname)
10225 let fname2396e= fnameescape(fname2396)
10226 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
10227 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010228" call Decho("windows exception for plainfname",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010229 if plainfname =~ '^/\+\a:'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010230" call Decho('removing leading "/"s','~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010231 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
10232 endif
10233 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010234" call Decho("fname2396<".fname2396.">",'~'.expand("<slnum>"))
10235" call Decho("plainfname<".plainfname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010236 exe "sil doau BufReadPre ".fname2396e
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010237 exe 'NetrwKeepj r '.plainfname
Bram Moolenaarff034192013-04-24 18:51:19 +020010238 exe 'sil! bdelete '.plainfname
10239 exe 'keepalt file! '.plainfname
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010240 NetrwKeepj 1d
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010241" call Decho("setl nomod",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010242 setl nomod
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010243" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010244" call Dret("netrw#FileUrlRead")
10245 exe "sil doau BufReadPost ".fname2396e
10246endfun
10247
10248" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010249" netrw#LocalBrowseCheck: {{{2
10250fun! netrw#LocalBrowseCheck(dirname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010251 " This function is called by netrwPlugin.vim's s:LocalBrowse(), s:NetrwRexplore(), and by <cr> when atop listed file/directory
Bram Moolenaar446cb832008-06-24 21:56:24 +000010252 " unfortunate interaction -- split window debugging can't be
10253 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
10254 " event triggers another call to LocalBrowseCheck() when attempts
10255 " to write to the DBG buffer are made.
10256 " The &ft == "netrw" test was installed because the BufEnter event
10257 " would hit when re-entering netrw windows, creating unexpected
10258 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaara6878372014-03-22 21:02:50 +010010259" call Dfunc("netrw#LocalBrowseCheck(dirname<".a:dirname.">")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010260" call Decho("isdir<".a:dirname.">=".isdirectory(s:NetrwFile(a:dirname)).((exists("s:treeforceredraw")? " treeforceredraw" : "")).expand("<slnum>"))
10261" 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 +010010262" call Dredir("ls!","ls!")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010263" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
10264" call Decho("current buffer#".bufnr("%")."<".bufname("%")."> ft=".&ft,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010265
Bram Moolenaar97d62492012-11-15 21:28:22 +010010266 let ykeep= @@
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010267 if isdirectory(s:NetrwFile(a:dirname))
10268" 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 +010010269
Bram Moolenaar97d62492012-11-15 21:28:22 +010010270 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010271" call Decho("case 1 : ft=".&ft,'~'.expand("<slnum>"))
10272" call Decho("s:rexposn_".bufnr("%")."<".bufname("%")."> ".(exists("s:rexposn_".bufnr("%"))? "exists" : "does not exist"),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010273 sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +010010274
Bram Moolenaar446cb832008-06-24 21:56:24 +000010275 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010276" call Decho("case 2 (ft≡netrw && line($)≡1)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010277 sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar8d043172014-01-23 14:24:41 +010010278
Bram Moolenaar5c736222010-01-06 20:54:52 +010010279 elseif exists("s:treeforceredraw")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010280" call Decho("case 3 (treeforceredraw)",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010010281 unlet s:treeforceredraw
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010282 sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010283 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010010284
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010285" 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 +010010286" call Dret("netrw#LocalBrowseCheck")
10287 return
Bram Moolenaar446cb832008-06-24 21:56:24 +000010288 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010010289
Bram Moolenaar97d62492012-11-15 21:28:22 +010010290 " following code wipes out currently unused netrw buffers
10291 " IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
10292 " AND IF the listing style is not a tree listing
10293 if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010294" call Decho("wiping out currently unused netrw buffers",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010295 let ibuf = 1
10296 let buflast = bufnr("$")
10297 while ibuf <= buflast
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010298 if bufwinnr(ibuf) == -1 && isdirectory(s:NetrwFile(bufname(ibuf)))
10299 exe "sil! keepj keepalt ".ibuf."bw!"
Bram Moolenaar97d62492012-11-15 21:28:22 +010010300 endif
10301 let ibuf= ibuf + 1
10302 endwhile
10303 endif
10304 let @@= ykeep
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010305" 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>"))
10306" 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 +000010307 " not a directory, ignore it
Bram Moolenaara6878372014-03-22 21:02:50 +010010308" call Dret("netrw#LocalBrowseCheck : not a directory, ignoring it; dirname<".a:dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010309endfun
10310
10311" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010312" s:LocalBrowseRefresh: this function is called after a user has {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +000010313" performed any shell command. The idea is to cause all local-browsing
10314" buffers to be refreshed after a user has executed some shell command,
10315" on the chance that s/he removed/created a file/directory with it.
Bram Moolenaara6878372014-03-22 21:02:50 +010010316fun! s:LocalBrowseRefresh()
10317" call Dfunc("s:LocalBrowseRefresh() tabpagenr($)=".tabpagenr("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010318" call Decho("s:netrw_browselist =".(exists("s:netrw_browselist")? string(s:netrw_browselist) : '<n/a>'),'~'.expand("<slnum>"))
10319" call Decho("w:netrw_bannercnt =".(exists("w:netrw_bannercnt")? string(w:netrw_bannercnt) : '<n/a>'),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010320
Bram Moolenaar446cb832008-06-24 21:56:24 +000010321 " determine which buffers currently reside in a tab
10322 if !exists("s:netrw_browselist")
Bram Moolenaara6878372014-03-22 21:02:50 +010010323" call Dret("s:LocalBrowseRefresh : browselist is empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010324 return
10325 endif
10326 if !exists("w:netrw_bannercnt")
Bram Moolenaara6878372014-03-22 21:02:50 +010010327" call Dret("s:LocalBrowseRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010328 return
10329 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010010330 if exists("s:netrw_events") && s:netrw_events == 1
10331 " s:LocalFastBrowser gets called (indirectly) from a
10332 let s:netrw_events= 2
10333" call Dret("s:LocalBrowseRefresh : avoid initial double refresh")
10334 return
Bram Moolenaar5c736222010-01-06 20:54:52 +010010335 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010336 let itab = 1
10337 let buftablist = []
Bram Moolenaar97d62492012-11-15 21:28:22 +010010338 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +000010339 while itab <= tabpagenr("$")
10340 let buftablist = buftablist + tabpagebuflist()
10341 let itab = itab + 1
10342 tabn
10343 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010344" call Decho("buftablist".string(buftablist),'~'.expand("<slnum>"))
10345" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010346 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
10347 " | refresh any netrw window
10348 " | wipe out any non-displaying netrw buffer
10349 let curwin = winnr()
10350 let ibl = 0
10351 for ibuf in s:netrw_browselist
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010352" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010353 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
10354 " wipe out any non-displaying netrw buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010355" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">",'~'.expand("<slnum>"))
10356 exe "sil! keepj bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010357 call remove(s:netrw_browselist,ibl)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010358" call Decho("browselist=".string(s:netrw_browselist),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010359 continue
10360 elseif index(tabpagebuflist(),ibuf) != -1
10361 " refresh any netrw buffer
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010362" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf),'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010363 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaara6878372014-03-22 21:02:50 +010010364 if getline(".") =~ 'Quick Help'
10365 " decrement g:netrw_quickhelp to prevent refresh from changing g:netrw_quickhelp
10366 " (counteracts s:NetrwBrowseChgDir()'s incrementing)
10367 let g:netrw_quickhelp= g:netrw_quickhelp - 1
10368 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010369" call Decho("#3: quickhelp=".g:netrw_quickhelp,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010370 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
10371 NetrwKeepj call s:NetrwRefreshTreeDict(w:netrw_treetop)
10372 endif
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010373 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010374 endif
10375 let ibl= ibl + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010376" call Decho("bottom of s:netrw_browselist for loop: ibl=".ibl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010377 endfor
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010378" call Decho("restore window: exe ".curwin."wincmd w",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010379 exe curwin."wincmd w"
Bram Moolenaar97d62492012-11-15 21:28:22 +010010380 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +000010381
Bram Moolenaara6878372014-03-22 21:02:50 +010010382" call Dret("s:LocalBrowseRefresh")
Bram Moolenaar446cb832008-06-24 21:56:24 +000010383endfun
10384
10385" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +010010386" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
10387"
10388" g:netrw_ Directory Is
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010389" fastbrowse Local Remote
Bram Moolenaar97d62492012-11-15 21:28:22 +010010390" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
10391" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010392" fast 2 H H
Bram Moolenaar97d62492012-11-15 21:28:22 +010010393"
10394" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
10395" Hiding a buffer means that it will be re-used when examined, hence "fast".
Bram Moolenaara6878372014-03-22 21:02:50 +010010396" (re-using a buffer may not be as accurate)
10397"
10398" s:netrw_events : doesn't exist, s:LocalFastBrowser() will install autocmds whena med or fast browsing
10399" =1: autocmds installed, but ignore next FocusGained event to avoid initial double-refresh of listing.
10400" BufEnter may be first event, then a FocusGained event. Ignore the first FocusGained event.
10401" If :Explore used: it sets s:netrw_events to 2, so no FocusGained events are ignored.
10402" =2: autocmds installed (doesn't ignore any FocusGained events)
Bram Moolenaar97d62492012-11-15 21:28:22 +010010403fun! s:LocalFastBrowser()
Bram Moolenaara6878372014-03-22 21:02:50 +010010404" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010405" call Decho("s:netrw_events ".(exists("s:netrw_events")? "exists" : 'n/a'),'~'.expand("<slnum>"))
10406" call Decho("autocmd: ShellCmdPost ".(exists("#ShellCmdPost")? "installed" : "not installed"),'~'.expand("<slnum>"))
10407" call Decho("autocmd: FocusGained ".(exists("#FocusGained")? "installed" : "not installed"),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010408
10409 " initialize browselist, a list of buffer numbers that the local browser has used
10410 if !exists("s:netrw_browselist")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010411" call Decho("initialize s:netrw_browselist",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010412 let s:netrw_browselist= []
10413 endif
10414
10415 " append current buffer to fastbrowse list
10416 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010417" call Decho("appendng current buffer to browselist",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010418 call add(s:netrw_browselist,bufnr("%"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010419" call Decho("browselist=".string(s:netrw_browselist),'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010420 endif
10421
10422 " enable autocmd events to handle refreshing/removing local browser buffers
10423 " If local browse buffer is currently showing: refresh it
10424 " If local browse buffer is currently hidden : wipe it
10425 " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing
10426 " =1 : medium speed, re-use directory listing for remote only
10427 " =2 : fast speed, always re-use directory listing when possible
Bram Moolenaara6878372014-03-22 21:02:50 +010010428 if g:netrw_fastbrowse <= 1 && !exists("#ShellCmdPost") && !exists("s:netrw_events")
10429 let s:netrw_events= 1
10430 augroup AuNetrwEvent
Bram Moolenaar97d62492012-11-15 21:28:22 +010010431 au!
10432 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010433" call Decho("installing autocmd: ShellCmdPost",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010434 au ShellCmdPost * call s:LocalBrowseRefresh()
Bram Moolenaar97d62492012-11-15 21:28:22 +010010435 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010436" call Decho("installing autocmds: ShellCmdPost FocusGained",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010437 au ShellCmdPost,FocusGained * call s:LocalBrowseRefresh()
Bram Moolenaar97d62492012-11-15 21:28:22 +010010438 endif
10439 augroup END
Bram Moolenaar97d62492012-11-15 21:28:22 +010010440
10441 " user must have changed fastbrowse to its fast setting, so remove
10442 " the associated autocmd events
Bram Moolenaara6878372014-03-22 21:02:50 +010010443 elseif g:netrw_fastbrowse > 1 && exists("#ShellCmdPost") && exists("s:netrw_events")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010444" call Decho("remove AuNetrwEvent autcmd group",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010445 unlet s:netrw_events
10446 augroup AuNetrwEvent
Bram Moolenaar97d62492012-11-15 21:28:22 +010010447 au!
10448 augroup END
Bram Moolenaara6878372014-03-22 21:02:50 +010010449 augroup! AuNetrwEvent
Bram Moolenaar97d62492012-11-15 21:28:22 +010010450 endif
10451
10452" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
10453endfun
10454
10455" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010456" s:LocalListing: does the job of "ls" for local directories {{{2
10457fun! s:LocalListing()
10458" call Dfunc("s:LocalListing()")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010459" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
10460" call Decho("modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
10461" 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 +010010462
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010463" 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
10464" 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
10465" 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 +010010466
10467 " get the list of files contained in the current directory
10468 let dirname = b:netrw_curdir
10469 let dirnamelen = strlen(b:netrw_curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010470 if v:version == 704 && has("patch656")
10471" call Decho("using glob with patch656",'~'.expand("<slnum>"))
10472 let filelist = glob(s:ComposePath(dirname,"*"),0,1,1)
10473 let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1,1)
10474 else
10475" call Decho("using glob without patch656",'~'.expand("<slnum>"))
10476 let filelist = glob(s:ComposePath(dirname,"*"),0,1)
10477 let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1)
10478 endif
10479" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010480
10481 if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010482" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010483 elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/'
10484 " include ../ in the glob() entry if its missing
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010485" call Decho("forcibly including on \"..\"",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010486 let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010487" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010488 endif
10489
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010490" call Decho("before while: dirname<".dirname.">",'~'.expand("<slnum>"))
10491" call Decho("before while: dirnamelen<".dirnamelen.">",'~'.expand("<slnum>"))
10492" call Decho("before while: filelist=".string(filelist),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010493
10494 if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
10495 let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
10496 let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010497" call Decho("dynamic_maxfilenamelen: filenames =".string(filelistcopy),'~'.expand("<slnum>"))
10498" call Decho("dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010499 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010500" 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 +010010501
10502 for filename in filelist
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010503" call Decho(" ",'~'.expand("<slnum>"))
10504" call Decho("for filename in filelist: filename<".filename.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010505
10506 if getftype(filename) == "link"
10507 " indicate a symbolic link
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010508" call Decho("indicate <".filename."> is a symbolic link with trailing @",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010509 let pfile= filename."@"
10510
10511 elseif getftype(filename) == "socket"
10512 " indicate a socket
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010513" call Decho("indicate <".filename."> is a socket with trailing =",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010514 let pfile= filename."="
10515
10516 elseif getftype(filename) == "fifo"
10517 " indicate a fifo
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010518" call Decho("indicate <".filename."> is a fifo with trailing |",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010519 let pfile= filename."|"
10520
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010521 elseif isdirectory(s:NetrwFile(filename))
Bram Moolenaara6878372014-03-22 21:02:50 +010010522 " indicate a directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010523" call Decho("indicate <".filename."> is a directory with trailing /",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010524 let pfile= filename."/"
10525
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010526 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(s:NetrwFile(filename))
Bram Moolenaara6878372014-03-22 21:02:50 +010010527 if (has("win32") || has("win95") || has("win64") || has("win16"))
10528 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
10529 " indicate an executable
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010530" call Decho("indicate <".filename."> is executable with trailing *",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010531 let pfile= filename."*"
10532 else
10533 " normal file
10534 let pfile= filename
10535 endif
10536 elseif executable(filename)
10537 " indicate an executable
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010538" call Decho("indicate <".filename."> is executable with trailing *",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010539 let pfile= filename."*"
10540 else
10541 " normal file
10542 let pfile= filename
10543 endif
10544
10545 else
10546 " normal file
10547 let pfile= filename
10548 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010549" call Decho("pfile<".pfile."> (after *@/ appending)",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010550
10551 if pfile =~ '//$'
10552 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010553" call Decho("change // to /: pfile<".pfile.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010554 endif
10555 let pfile= strpart(pfile,dirnamelen)
10556 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010557" call Decho("filename<".filename.">",'~'.expand("<slnum>"))
10558" call Decho("pfile <".pfile.">",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010559
10560 if w:netrw_liststyle == s:LONGLIST
10561 let sz = getfsize(filename)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010562 if g:netrw_sizestyle =~ "[hH]"
10563 let sz= s:NetrwHumanReadable(sz)
10564 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010010565 let fsz = strpart(" ",1,15-strlen(sz)).sz
10566 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010567" call Decho("sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010568 endif
10569
10570 if g:netrw_sort_by =~ "^t"
10571 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010572" call Decho("getftime(".filename.")=".getftime(filename),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010573 let t = getftime(filename)
10574 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010575" call Decho("exe NetrwKeepj put ='".ft.'/'.filename."'",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010576 let ftpfile= ft.'/'.pfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010577 sil! NetrwKeepj put=ftpfile
Bram Moolenaara6878372014-03-22 21:02:50 +010010578
10579 elseif g:netrw_sort_by =~ "^s"
10580 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010581" call Decho("getfsize(".filename.")=".getfsize(filename),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010582 let sz = getfsize(filename)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010583 if g:netrw_sizestyle =~ "[hH]"
10584 let sz= s:NetrwHumanReadable(sz)
10585 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010010586 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010587" call Decho("exe NetrwKeepj put ='".fsz.'/'.filename."'",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010588 let fszpfile= fsz.'/'.pfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010589 sil! NetrwKeepj put =fszpfile
Bram Moolenaara6878372014-03-22 21:02:50 +010010590
10591 else
10592 " sort by name
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010593" call Decho("exe NetrwKeepj put ='".pfile."'",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010594 sil! NetrwKeepj put=pfile
Bram Moolenaara6878372014-03-22 21:02:50 +010010595 endif
10596 endfor
10597
10598 " cleanup any windows mess at end-of-line
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010599 sil! NetrwKeepj g/^$/d
10600 sil! NetrwKeepj %s/\r$//e
Bram Moolenaara6878372014-03-22 21:02:50 +010010601 call histdel("/",-1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010602" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010010603 exe "setl ts=".(g:netrw_maxfilenamelen+1)
10604
10605" call Dret("s:LocalListing")
10606endfun
10607
10608" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +010010609" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
10610fun! s:NetrwLocalExecute(cmd)
10611" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
10612 let ykeep= @@
10613 " sanity check
10614 if !executable(a:cmd)
10615 call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
10616 let @@= ykeep
10617" call Dret("s:NetrwLocalExecute")
10618 return
10619 endif
10620
10621 let optargs= input(":!".a:cmd,"","file")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010622" call Decho("optargs<".optargs.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010623 let result= system(a:cmd.optargs)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010624" call Decho("result,'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010625
10626 " strip any ansi escape sequences off
10627 let result = substitute(result,"\e\\[[0-9;]*m","","g")
10628
10629 " show user the result(s)
10630 echomsg result
10631 let @@= ykeep
10632
10633" call Dret("s:NetrwLocalExecute")
10634endfun
10635
10636" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010637" s:NetrwLocalRename: rename a local file or directory {{{2
Bram Moolenaar97d62492012-11-15 21:28:22 +010010638fun! s:NetrwLocalRename(path) range
10639" call Dfunc("NetrwLocalRename(path<".a:path.">)")
10640
10641 " preparation for removing multiple files/directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010642 let ykeep = @@
10643 let ctr = a:firstline
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010644 let svpos = winsaveview()
10645" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010646
10647 " rename files given by the markfilelist
10648 if exists("s:netrwmarkfilelist_{bufnr('%')}")
10649 for oldname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010650" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010651 if exists("subfrom")
10652 let newname= substitute(oldname,subfrom,subto,'')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010653" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010654 else
10655 call inputsave()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010656 let newname= input("Moving ".oldname." to : ",oldname,"file")
Bram Moolenaar97d62492012-11-15 21:28:22 +010010657 call inputrestore()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010658 if newname =~ ''
10659 " two ctrl-x's : ignore all of string preceding the ctrl-x's
10660 let newname = substitute(newname,'^.*','','')
10661 elseif newname =~ ''
10662 " one ctrl-x : ignore portion of string preceding ctrl-x but after last /
10663 let newname = substitute(newname,'[^/]*','','')
10664 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010010665 if newname =~ '^s/'
10666 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
10667 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010668" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010669 let newname = substitute(oldname,subfrom,subto,'')
10670 endif
10671 endif
10672 call rename(oldname,newname)
10673 endfor
10674 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010675
Bram Moolenaar97d62492012-11-15 21:28:22 +010010676 else
10677
10678 " attempt to rename files/directories
10679 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010680 exe "NetrwKeepj ".ctr
Bram Moolenaar97d62492012-11-15 21:28:22 +010010681
10682 " sanity checks
10683 if line(".") < w:netrw_bannercnt
10684 let ctr= ctr + 1
10685 continue
10686 endif
10687 let curword= s:NetrwGetWord()
10688 if curword == "./" || curword == "../"
10689 let ctr= ctr + 1
10690 continue
10691 endif
10692
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010693 NetrwKeepj norm! 0
Bram Moolenaar97d62492012-11-15 21:28:22 +010010694 let oldname= s:ComposePath(a:path,curword)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010695" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010696
10697 call inputsave()
10698 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
10699 call inputrestore()
10700
10701 call rename(oldname,newname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010702" call Decho("renaming <".oldname."> to <".newname.">",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010010703
10704 let ctr= ctr + 1
10705 endwhile
10706 endif
10707
10708 " refresh the directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010709" call Decho("refresh the directory listing",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010710 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010711" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
10712 NetrwKeepj call winrestview(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +010010713 let @@= ykeep
10714
10715" call Dret("NetrwLocalRename")
10716endfun
10717
10718" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010719" s:NetrwLocalRm: {{{2
10720fun! s:NetrwLocalRm(path) range
10721" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010722" call Decho("firstline=".a:firstline." lastline=".a:lastline,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010723
10724 " preparation for removing multiple files/directories
Bram Moolenaar97d62492012-11-15 21:28:22 +010010725 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +000010726 let ret = 0
10727 let all = 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010728 let svpos = winsaveview()
10729" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010730
10731 if exists("s:netrwmarkfilelist_{bufnr('%')}")
10732 " remove all marked files
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010733" call Decho("remove all marked files",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010734 for fname in s:netrwmarkfilelist_{bufnr("%")}
10735 let ok= s:NetrwLocalRmFile(a:path,fname,all)
10736 if ok =~ 'q\%[uit]' || ok == "no"
10737 break
10738 elseif ok =~ 'a\%[ll]'
10739 let all= 1
10740 endif
10741 endfor
10742 call s:NetrwUnMarkFile(1)
10743
10744 else
10745 " remove (multiple) files and directories
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010746" call Decho("remove files in range [".a:firstline.",".a:lastline."]",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010747
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010748 let keepsol= &l:sol
10749 setl nosol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010750 let ctr = a:firstline
10751 while ctr <= a:lastline
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010752 exe "NetrwKeepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +000010753
10754 " sanity checks
10755 if line(".") < w:netrw_bannercnt
10756 let ctr= ctr + 1
10757 continue
10758 endif
10759 let curword= s:NetrwGetWord()
10760 if curword == "./" || curword == "../"
10761 let ctr= ctr + 1
10762 continue
10763 endif
10764 let ok= s:NetrwLocalRmFile(a:path,curword,all)
10765 if ok =~ 'q\%[uit]' || ok == "no"
10766 break
10767 elseif ok =~ 'a\%[ll]'
10768 let all= 1
10769 endif
10770 let ctr= ctr + 1
10771 endwhile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010772 let &l:sol= keepsol
Bram Moolenaar446cb832008-06-24 21:56:24 +000010773 endif
10774
10775 " refresh the directory
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010776" call Decho("bufname<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010777 if bufname("%") != "NetrwMessage"
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010778 NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010779" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
10780 NetrwKeepj call winrestview(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010781 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010010782 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +000010783
10784" call Dret("s:NetrwLocalRm")
10785endfun
10786
10787" ---------------------------------------------------------------------
10788" s:NetrwLocalRmFile: remove file fname given the path {{{2
10789" Give confirmation prompt unless all==1
10790fun! s:NetrwLocalRmFile(path,fname,all)
10791" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010792
Bram Moolenaar446cb832008-06-24 21:56:24 +000010793 let all= a:all
10794 let ok = ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010010795 NetrwKeepj norm! 0
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010796 let rmfile= s:NetrwFile(s:ComposePath(a:path,a:fname))
10797" call Decho("rmfile<".rmfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010798
10799 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
10800 " attempt to remove file
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010801" call Decho("attempt to remove file<".rmfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010802 if !all
10803 echohl Statement
10804 call inputsave()
10805 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
10806 call inputrestore()
10807 echohl NONE
10808 if ok == ""
10809 let ok="no"
10810 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010811" call Decho("response: ok<".ok.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010812 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010813" call Decho("response: ok<".ok."> (after sub)",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010814 if ok =~ 'a\%[ll]'
10815 let all= 1
10816 endif
10817 endif
10818
10819 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +000010820 let ret= s:NetrwDelete(rmfile)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010821" call Decho("errcode=".v:shell_error." ret=".ret,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010822 endif
10823
10824 else
10825 " attempt to remove directory
10826 if !all
10827 echohl Statement
10828 call inputsave()
10829 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
10830 call inputrestore()
10831 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
10832 if ok == ""
10833 let ok="no"
10834 endif
10835 if ok =~ 'a\%[ll]'
10836 let all= 1
10837 endif
10838 endif
10839 let rmfile= substitute(rmfile,'[\/]$','','e')
10840
10841 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010842 if v:version < 704 || !has("patch1109")
10843" " call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.s:ShellEscape(rmfile).')','~'.expand("<slnum>"))
10844 call system(netrw#WinPath(g:netrw_localrmdir).' '.s:ShellEscape(rmfile))
10845" " call Decho("v:shell_error=".v:shell_error,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010846
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010847 if v:shell_error != 0
10848" " call Decho("2nd attempt to remove directory<".rmfile.">",'~'.expand("<slnum>"))
10849 let errcode= s:NetrwDelete(rmfile)
10850" " call Decho("errcode=".errcode,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000010851
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010852 if errcode != 0
10853 if has("unix")
10854" " call Decho("3rd attempt to remove directory<".rmfile.">",'~'.expand("<slnum>"))
10855 call system("rm ".s:ShellEscape(rmfile))
10856 if v:shell_error != 0 && !exists("g:netrw_quiet")
10857 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
10858 let ok="no"
10859 endif
10860 elseif !exists("g:netrw_quiet")
10861 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010862 let ok="no"
10863 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010864 endif
10865 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010010866 else
10867 if delete(rmfile,"d")
10868 call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".rmfile.">!",103)
10869 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000010870 endif
10871 endif
10872 endif
10873
10874" call Dret("s:NetrwLocalRmFile ".ok)
10875 return ok
10876endfun
10877
10878" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000010879" Support Functions: {{{1
10880
Bram Moolenaar488c6512005-08-11 20:09:58 +000010881" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010882" netrw#Access: intended to provide access to variable values for netrw's test suite {{{2
10883" 0: marked file list of current buffer
10884" 1: marked file target
10885fun! netrw#Access(ilist)
10886 if a:ilist == 0
10887 if exists("s:netrwmarkfilelist_".bufnr('%'))
10888 return s:netrwmarkfilelist_{bufnr('%')}
10889 else
10890 return "no-list-buf#".bufnr('%')
10891 endif
10892 elseif a:ilist == 1
10893 return s:netrwmftgt
10894endfun
10895
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010896" ---------------------------------------------------------------------
10897" netrw#Call: allows user-specified mappings to call internal netrw functions {{{2
10898fun! netrw#Call(funcname,...)
10899" call Dfunc("netrw#Call(funcname<".a:funcname.">,".string(a:000).")")
10900 if a:0 > 0
10901 exe "call s:".a:funcname."(".string(a:000).")"
10902 else
10903 exe "call s:".a:funcname."()"
10904 endif
10905" call Dret("netrw#Call")
10906endfun
10907
Bram Moolenaara6878372014-03-22 21:02:50 +010010908" ------------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010909
10910" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010911" netrw#Expose: allows UserMaps and pchk to look at otherwise script-local variables {{{2
10912" I expect this function to be used in
10913" :PChkAssert netrw#Expose("netrwmarkfilelist")
10914" for example.
10915fun! netrw#Expose(varname)
10916" call Dfunc("netrw#Expose(varname<".a:varname.">)")
10917 exe "let retval= s:".a:varname
10918 if exists("g:netrw_pchk")
10919 if type(retval) == 3
10920 let retval = copy(retval)
10921 let i = 0
10922 while i < len(retval)
10923 let retval[i]= substitute(retval[i],expand("$HOME"),'~','')
10924 let i = i + 1
10925 endwhile
10926 endif
10927" call Dret("netrw#Expose ".string(retval))
10928 return string(retval)
10929 endif
10930
10931" call Dret("netrw#Expose ".string(retval))
10932 return retval
10933endfun
10934
10935" ---------------------------------------------------------------------
10936" netrw#Modify: allows UserMaps to set (modify) script-local variables {{{2
10937fun! netrw#Modify(varname,newvalue)
10938" call Dfunc("netrw#Modify(varname<".a:varname.">,newvalue<".string(a:newvalue).">)")
10939 exe "let s:".a:varname."= ".string(a:newvalue)
10940" call Dret("netrw#Modify")
10941endfun
10942
10943" ---------------------------------------------------------------------
Bram Moolenaara6878372014-03-22 21:02:50 +010010944" netrw#RFC2396: converts %xx into characters {{{2
10945fun! netrw#RFC2396(fname)
10946" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
10947 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
10948" call Dret("netrw#RFC2396 ".fname)
10949 return fname
10950endfun
10951
10952" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010010953" netrw#UserMaps: supports user-specified maps {{{2
10954" see :help function()
10955"
10956" g:Netrw_UserMaps is a List with members such as:
10957" [[keymap sequence, function reference],...]
10958"
10959" The referenced function may return a string,
10960" refresh : refresh the display
10961" -other- : this string will be executed
10962" or it may return a List of strings.
10963"
10964" Each keymap-sequence will be set up with a nnoremap
10965" to invoke netrw#UserMaps(islocal).
10966" Related functions:
10967" netrw#Expose(varname) -- see s:varname variables
10968" netrw#Modify(varname,newvalue) -- modify value of s:varname variable
10969" netrw#Call(funcname,...) -- call internal netrw function with optional arguments
10970fun! netrw#UserMaps(islocal)
10971" call Dfunc("netrw#UserMaps(islocal=".a:islocal.")")
10972" call Decho("g:Netrw_UserMaps ".(exists("g:Netrw_UserMaps")? "exists" : "does NOT exist"),'~'.expand("<slnum>"))
10973
10974 " set up usermaplist
10975 if exists("g:Netrw_UserMaps") && type(g:Netrw_UserMaps) == 3
10976" call Decho("g:Netrw_UserMaps has type 3<List>",'~'.expand("<slnum>"))
10977 for umap in g:Netrw_UserMaps
10978" call Decho("type(umap[0]<".string(umap[0]).">)=".type(umap[0])." (should be 1=string)",'~'.expand("<slnum>"))
10979" call Decho("type(umap[1])=".type(umap[1])." (should be 1=string)",'~'.expand("<slnum>"))
10980 " if umap[0] is a string and umap[1] is a string holding a function name
10981 if type(umap[0]) == 1 && type(umap[1]) == 1
10982" call Decho("nno <buffer> <silent> ".umap[0]." :call s:UserMaps(".a:islocal.",".string(umap[1]).")<cr>",'~'.expand("<slnum>"))
10983 exe "nno <buffer> <silent> ".umap[0]." :call <SID>UserMaps(".a:islocal.",'".umap[1]."')<cr>"
10984 else
10985 call netrw#ErrorMsg(s:WARNING,"ignoring usermap <".string(umap[0])."> -- not a [string,funcref] entry",99)
10986 endif
10987 endfor
10988 endif
10989" call Dret("netrw#UserMaps")
10990endfun
10991
10992" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +020010993" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
10994fun! netrw#WinPath(path)
10995" call Dfunc("netrw#WinPath(path<".a:path.">)")
10996 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
10997 " remove cygdrive prefix, if present
Bram Moolenaar8d043172014-01-23 14:24:41 +010010998 let path = substitute(a:path,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaare6ae6222013-05-21 21:01:10 +020010999 " remove trailing slash (Win95)
11000 let path = substitute(path, '\(\\\|/\)$', '', 'g')
11001 " remove escaped spaces
11002 let path = substitute(path, '\ ', ' ', 'g')
11003 " convert slashes to backslashes
11004 let path = substitute(path, '/', '\', 'g')
11005 else
11006 let path= a:path
11007 endif
11008" call Dret("netrw#WinPath <".path.">")
11009 return path
11010endfun
11011
11012" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011013" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
11014fun! s:ComposePath(base,subdir)
11015" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
11016
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011017 if has("amiga")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011018" call Decho("amiga",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010011019 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +000011020 if ec != '/' && ec != ':'
11021 let ret = a:base . "/" . a:subdir
11022 else
11023 let ret = a:base . a:subdir
11024 endif
11025
11026 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011027" call Decho("windows",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011028 let ret= a:subdir
11029
Bram Moolenaar5c736222010-01-06 20:54:52 +010011030 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011031" call Decho("windows",'~'.expand("<slnum>"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010011032 if a:base =~ '[/\\]$'
11033 let ret= a:base.a:subdir
11034 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011035 let ret= a:base.'/'.a:subdir
Bram Moolenaar5c736222010-01-06 20:54:52 +010011036 endif
11037
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011038 elseif a:base =~ '^\a\{3,}://'
11039" call Decho("remote linux/macos",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011040 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
11041 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
11042 if a:subdir == '../'
11043 if curpath =~ '[^/]/[^/]\+/$'
11044 let curpath= substitute(curpath,'[^/]\+/$','','')
11045 else
11046 let curpath=""
11047 endif
11048 let ret= urlbase.curpath
11049 else
11050 let ret= urlbase.curpath.a:subdir
11051 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011052" call Decho("urlbase<".urlbase.">",'~'.expand("<slnum>"))
11053" call Decho("curpath<".curpath.">",'~'.expand("<slnum>"))
11054" call Decho("ret<".ret.">",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011055
11056 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011057" call Decho("local linux/macos",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011058 let ret = substitute(a:base."/".a:subdir,"//","/","g")
11059 if a:base =~ '^//'
11060 " keeping initial '//' for the benefit of network share listing support
11061 let ret= '/'.ret
11062 endif
11063 let ret= simplify(ret)
11064 endif
11065
11066" call Dret("s:ComposePath ".ret)
11067 return ret
11068endfun
11069
11070" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011071" s:DeleteBookmark: deletes a file/directory from Netrw's bookmark system {{{2
11072" Related Functions: s:MakeBookmark() s:NetrwBookHistHandler() s:NetrwBookmark()
11073fun! s:DeleteBookmark(fname)
11074" call Dfunc("s:DeleteBookmark(fname<".a:fname.">)")
11075 call s:MergeBookmarks()
11076
11077 if exists("g:netrw_bookmarklist")
11078 let indx= index(g:netrw_bookmarklist,a:fname)
11079 if indx == -1
11080 let indx= 0
11081 while indx < len(g:netrw_bookmarklist)
11082 if g:netrw_bookmarklist[indx] =~ a:fname
11083 call remove(g:netrw_bookmarklist,indx)
11084 let indx= indx - 1
11085 endif
11086 let indx= indx + 1
11087 endwhile
11088 else
11089 " remove exact match
11090 call remove(g:netrw_bookmarklist,indx)
11091 endif
11092 endif
11093
11094" call Dret("s:DeleteBookmark")
11095endfun
11096
11097" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000011098" s:FileReadable: o/s independent filereadable {{{2
11099fun! s:FileReadable(fname)
11100" call Dfunc("s:FileReadable(fname<".a:fname.">)")
11101
11102 if g:netrw_cygwin
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011103 let ret= filereadable(s:NetrwFile(substitute(a:fname,g:netrw_cygdrive.'/\(.\)','\1:/','')))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011104 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011105 let ret= filereadable(s:NetrwFile(a:fname))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011106 endif
11107
11108" call Dret("s:FileReadable ".ret)
11109 return ret
11110endfun
11111
11112" ---------------------------------------------------------------------
11113" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
11114" Places correct suffix on end of temporary filename,
11115" using the suffix provided with fname
11116fun! s:GetTempfile(fname)
11117" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
11118
11119 if !exists("b:netrw_tmpfile")
11120 " get a brand new temporary filename
11121 let tmpfile= tempname()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011122" call Decho("tmpfile<".tmpfile."> : from tempname()",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011123
Bram Moolenaarc236c162008-07-13 17:41:49 +000011124 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011125" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011126
Bram Moolenaar9964e462007-05-05 17:54:07 +000011127 " sanity check -- does the temporary file's directory exist?
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011128 if !isdirectory(s:NetrwFile(substitute(tmpfile,'[^/]\+$','','e')))
11129" 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 +010011130 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +000011131" call Dret("s:GetTempfile getcwd<".getcwd().">")
11132 return ""
11133 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011134
Bram Moolenaar9964e462007-05-05 17:54:07 +000011135 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011136 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#BrowseX()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011137" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011138
Bram Moolenaar9964e462007-05-05 17:54:07 +000011139 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +000011140 if g:netrw_cygwin != 0
Bram Moolenaar8d043172014-01-23 14:24:41 +010011141 let tmpfile = substitute(tmpfile,'^\(\a\):',g:netrw_cygdrive.'/\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011142 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +000011143 if !exists("+shellslash") || !&ssl
11144 let tmpfile = substitute(tmpfile,'/','\','g')
11145 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011146 else
Bram Moolenaar446cb832008-06-24 21:56:24 +000011147 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +000011148 endif
11149 let b:netrw_tmpfile= tmpfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011150" call Decho("o/s dependent fixed tempname<".tmpfile.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011151 else
11152 " re-use temporary filename
11153 let tmpfile= b:netrw_tmpfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011154" call Decho("tmpfile<".tmpfile."> re-using",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011155 endif
11156
11157 " use fname's suffix for the temporary file
11158 if a:fname != ""
11159 if a:fname =~ '\.[^./]\+$'
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011160" call Decho("using fname<".a:fname.">'s suffix",'~'.expand("<slnum>"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020011161 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +000011162 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020011163 elseif a:fname =~ '.txz$'
11164 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011165 else
11166 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
11167 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011168" call Decho("suffix<".suffix.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011169 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011170" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011171 let tmpfile .= suffix
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011172" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011173 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
11174 endif
11175 endif
11176
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011177" 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 +000011178" call Dret("s:GetTempfile <".tmpfile.">")
11179 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +000011180endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +000011181
11182" ---------------------------------------------------------------------
11183" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +000011184" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +000011185fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011186" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar13600302014-05-22 18:26:40 +020011187 if s:user == ""
11188 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:machine,'')
11189 else
11190 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user."@".s:machine,'')
11191 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011192 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +000011193 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011194 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +000011195 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +000011196 else
11197 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
11198 endif
11199" call Dret("s:MakeSshCmd <".sshcmd.">")
11200 return sshcmd
11201endfun
11202
11203" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011204" s:MakeBookmark: enters a bookmark into Netrw's bookmark system {{{2
11205fun! s:MakeBookmark(fname)
11206" call Dfunc("s:MakeBookmark(fname<".a:fname.">)")
11207
11208 if !exists("g:netrw_bookmarklist")
11209 let g:netrw_bookmarklist= []
11210 endif
11211
11212 if index(g:netrw_bookmarklist,a:fname) == -1
11213 " curdir not currently in g:netrw_bookmarklist, so include it
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011214 if isdirectory(s:NetrwFile(a:fname)) && a:fname !~ '/$'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011215 call add(g:netrw_bookmarklist,a:fname.'/')
11216 elseif a:fname !~ '/'
11217 call add(g:netrw_bookmarklist,getcwd()."/".a:fname)
11218 else
11219 call add(g:netrw_bookmarklist,a:fname)
11220 endif
11221 call sort(g:netrw_bookmarklist)
11222 endif
11223
11224" call Dret("s:MakeBookmark")
11225endfun
11226
11227" ---------------------------------------------------------------------
11228" s:MergeBookmarks: merge current bookmarks with saved bookmarks {{{2
11229fun! s:MergeBookmarks()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011230" call Dfunc("s:MergeBookmarks() : merge current bookmarks into .netrwbook")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011231 " get bookmarks from .netrwbook file
11232 let savefile= s:NetrwHome()."/.netrwbook"
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011233 if filereadable(s:NetrwFile(savefile))
11234" call Decho("merge bookmarks (active and file)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011235 NetrwKeepj call s:NetrwBookHistSave()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011236" call Decho("bookmark delete savefile<".savefile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011237 NetrwKeepj call delete(savefile)
11238 endif
11239" call Dret("s:MergeBookmarks")
11240endfun
11241
11242" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011243" s:NetrwBMShow: {{{2
11244fun! s:NetrwBMShow()
11245" call Dfunc("s:NetrwBMShow()")
11246 redir => bmshowraw
11247 menu
11248 redir END
11249 let bmshowlist = split(bmshowraw,'\n')
11250 if bmshowlist != []
11251 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
11252 if bmshowfuncs != []
11253 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
11254 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011255 exe "sil! NetrwKeepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +000011256 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011257 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011258 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000011259" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
11260endfun
11261
11262" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +020011263" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
11264fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011265 if !exists("w:netrw_liststyle")
11266 let w:netrw_liststyle= g:netrw_liststyle
11267 endif
Bram Moolenaar15146672011-10-20 22:22:38 +020011268" 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 +020011269
11270 if &ft != "netrw"
11271 " if the current window isn't a netrw directory listing window, then use user cursorline/column
11272 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011273" call Decho("case ft!=netrw: use user cul,cuc",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011274 let &l:cursorline = s:netrw_usercul
11275 let &l:cursorcolumn = s:netrw_usercuc
11276
11277 elseif g:netrw_cursor == 4
11278 " all styles: cursorline, cursorcolumn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011279" call Decho("case g:netrw_cursor==4: setl cul cuc",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020011280 setl cursorline
11281 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +020011282
11283 elseif g:netrw_cursor == 3
11284 " thin-long-tree: cursorline, user's cursorcolumn
11285 " wide : cursorline, cursorcolumn
11286 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011287" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc",'~'.expand("<slnum>"))
Bram Moolenaar15146672011-10-20 22:22:38 +020011288 setl cursorline
11289 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +020011290 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011291" 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 +020011292 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +020011293 let &l:cursorcolumn = s:netrw_usercuc
11294 endif
11295
11296 elseif g:netrw_cursor == 2
11297 " thin-long-tree: cursorline, user's cursorcolumn
11298 " wide : cursorline, user's cursorcolumn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011299" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011300 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +020011301 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +020011302
11303 elseif g:netrw_cursor == 1
11304 " thin-long-tree: user's cursorline, user's cursorcolumn
11305 " wide : cursorline, user's cursorcolumn
11306 let &l:cursorcolumn = s:netrw_usercuc
11307 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011308" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
Bram Moolenaar8d043172014-01-23 14:24:41 +010011309 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +020011310 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011311" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011312 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011313 endif
11314
11315 else
Bram Moolenaaradc21822011-04-01 18:03:16 +020011316 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011317" call Decho("default: (use user's cul,cuc)",'~'.expand("<slnum>"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011318 let &l:cursorline = s:netrw_usercul
11319 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011320 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +020011321
11322" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011323endfun
11324
11325" ---------------------------------------------------------------------
11326" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
11327fun! s:RestoreCursorline()
Bram Moolenaar8d043172014-01-23 14:24:41 +010011328" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +020011329 if exists("s:netrw_usercul")
11330 let &l:cursorline = s:netrw_usercul
11331 endif
11332 if exists("s:netrw_usercuc")
11333 let &l:cursorcolumn = s:netrw_usercuc
11334 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011335" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
11336endfun
11337
11338" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011339" s:NetrwDelete: Deletes a file. {{{2
11340" Uses Steve Hall's idea to insure that Windows paths stay
11341" acceptable. No effect on Unix paths.
11342" Examples of use: let result= s:NetrwDelete(path)
11343fun! s:NetrwDelete(path)
11344" call Dfunc("s:NetrwDelete(path<".a:path.">)")
11345
Bram Moolenaar5c736222010-01-06 20:54:52 +010011346 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +000011347 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
11348 if exists("+shellslash")
11349 let sskeep= &shellslash
Bram Moolenaarff034192013-04-24 18:51:19 +020011350 setl noshellslash
Bram Moolenaarc236c162008-07-13 17:41:49 +000011351 let result = delete(path)
11352 let &shellslash = sskeep
11353 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011354" call Decho("exe let result= ".a:cmd."('".path."')",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011355 let result= delete(path)
11356 endif
11357 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011358" call Decho("let result= delete(".path.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011359 let result= delete(path)
11360 endif
11361 if result < 0
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011362 NetrwKeepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +000011363 endif
11364
11365" call Dret("s:NetrwDelete ".result)
11366 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +000011367endfun
11368
11369" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000011370" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +010011371fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011372" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011373" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011374
Bram Moolenaar446cb832008-06-24 21:56:24 +000011375 " grab a function-local-variable copy of buffer variables
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011376" call Decho("make function-local copy of netrw variables",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011377 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
11378 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
11379 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
11380 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
11381 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
11382 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
11383 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
11384 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
11385 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
11386 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
11387 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
11388 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
11389 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
11390 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
11391 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
11392 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
11393
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011394 NetrwKeepj call s:NetrwOptionRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011395" call Decho("generate a buffer with NetrwKeepj keepalt enew!",'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011396 " when tree listing uses file TreeListing... a new buffer is made.
11397 " Want the old buffer to be unlisted.
11398 setl nobl
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020011399 let netrw_keepdiff= &l:diff
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011400 noswapfile NetrwKeepj keepalt enew!
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +020011401 let &l:diff= netrw_keepdiff
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011402" call Decho("bufnr($)=".bufnr("$")." winnr($)=".winnr("$"),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011403 NetrwKeepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +000011404
Bram Moolenaar446cb832008-06-24 21:56:24 +000011405 " copy function-local-variables to buffer variable equivalents
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011406" call Decho("copy function-local variables back to buffer netrw variables",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011407 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
11408 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
11409 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
11410 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
11411 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
11412 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
11413 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
11414 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
11415 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
11416 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
11417 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
11418 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
11419 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
11420 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
11421 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
11422 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
11423
Bram Moolenaar5c736222010-01-06 20:54:52 +010011424 if a:0 > 0
11425 let b:netrw_curdir= a:1
11426 if b:netrw_curdir =~ '/$'
11427 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011428 setl nobl
Bram Moolenaar5c736222010-01-06 20:54:52 +010011429 file NetrwTreeListing
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011430 setl nobl bt=nowrite bh=hide
Bram Moolenaaradc21822011-04-01 18:03:16 +020011431 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
11432 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +010011433 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +020011434 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +010011435 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011436 endif
11437 endif
11438
Bram Moolenaar8d043172014-01-23 14:24:41 +010011439" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh." win#".winnr()." winnr($)#".winnr("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011440endfun
11441
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011442" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011443" s:NetrwExe: executes a string using "!" {{{2
11444fun! s:NetrwExe(cmd)
11445" call Dfunc("s:NetrwExe(a:cmd)")
11446 if has("win32") && &shell !~? 'cmd' && !g:netrw_cygwin
11447 let savedShell=[&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash]
11448 set shell& shellcmdflag& shellxquote& shellxescape&
11449 set shellquote& shellpipe& shellredir& shellslash&
11450 exe a:cmd
11451 let [&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash] = savedShell
11452 else
11453 exe a:cmd
11454 endif
11455" call Dret("s:NetrwExe")
11456endfun
11457
11458" ---------------------------------------------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011459" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
11460fun! s:NetrwInsureWinVars()
Bram Moolenaar97d62492012-11-15 21:28:22 +010011461" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011462 if !exists("w:netrw_liststyle")
11463 let curbuf = bufnr("%")
11464 let curwin = winnr()
11465 let iwin = 1
11466 while iwin <= winnr("$")
11467 exe iwin."wincmd w"
11468 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
11469 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
11470 let winvars= w:
11471 break
11472 endif
11473 let iwin= iwin + 1
11474 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +020011475 exe "keepalt ".curwin."wincmd w"
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011476 if exists("winvars")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011477" call Decho("copying w#".iwin." window variables to w#".curwin,'~'.expand("<slnum>"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011478 for k in keys(winvars)
11479 let w:{k}= winvars[k]
11480 endfor
11481 endif
11482 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010011483" call Dret("s:NetrwInsureWinVars win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011484endfun
11485
Bram Moolenaara6878372014-03-22 21:02:50 +010011486" ---------------------------------------------------------------------
11487" s:NetrwLcd: handles changing the (local) directory {{{2
11488fun! s:NetrwLcd(newdir)
11489" call Dfunc("s:NetrwLcd(newdir<".a:newdir.">)")
11490
11491 try
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011492 exe 'NetrwKeepj sil lcd '.fnameescape(a:newdir)
Bram Moolenaara6878372014-03-22 21:02:50 +010011493 catch /^Vim\%((\a\+)\)\=:E344/
11494 " Vim's lcd fails with E344 when attempting to go above the 'root' of a Windows share.
11495 " Therefore, detect if a Windows share is present, and if E344 occurs, just settle at
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011496 " 'root' (ie. '\'). The share name may start with either backslashes ('\\Foo') or
Bram Moolenaara6878372014-03-22 21:02:50 +010011497 " forward slashes ('//Foo'), depending on whether backslashes have been converted to
11498 " forward slashes by earlier code; so check for both.
11499 if (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
11500 if a:newdir =~ '^\\\\\w\+' || a:newdir =~ '^//\w\+'
11501 let dirname = '\'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011502 exe 'NetrwKeepj sil lcd '.fnameescape(dirname)
Bram Moolenaara6878372014-03-22 21:02:50 +010011503 endif
11504 endif
11505 catch /^Vim\%((\a\+)\)\=:E472/
11506 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".a:newdir."> (permissions?)",61)
11507 if exists("w:netrw_prvdir")
11508 let a:newdir= w:netrw_prvdir
11509 else
11510 call s:NetrwOptionRestore("w:")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011511" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
Bram Moolenaar13600302014-05-22 18:26:40 +020011512 exe "setl ".g:netrw_bufsettings
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011513" 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 +010011514 let a:newdir= dirname
11515" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
11516 return
11517 endif
11518 endtry
11519
11520" call Dret("s:NetrwLcd")
11521endfun
11522
Bram Moolenaar9964e462007-05-05 17:54:07 +000011523" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011524" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
11525" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
11526fun! s:NetrwSaveWordPosn()
11527" call Dfunc("NetrwSaveWordPosn()")
11528 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
11529" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
11530endfun
11531
11532" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011533" s:NetrwHumanReadable: takes a number and makes it "human readable" {{{2
11534" 1000 -> 1K, 1000000 -> 1M, 1000000000 -> 1G
11535fun! s:NetrwHumanReadable(sz)
11536" call Dfunc("s:NetrwHumanReadable(sz=".a:sz.") type=".type(a:sz)." style=".g:netrw_sizestyle )
11537
11538 if g:netrw_sizestyle == 'h'
11539 if a:sz >= 1000000000
11540 let sz = printf("%.1f",a:sz/1000000000.0)."g"
11541 elseif a:sz >= 10000000
11542 let sz = printf("%d",a:sz/1000000)."m"
11543 elseif a:sz >= 1000000
11544 let sz = printf("%.1f",a:sz/1000000.0)."m"
11545 elseif a:sz >= 10000
11546 let sz = printf("%d",a:sz/1000)."k"
11547 elseif a:sz >= 1000
11548 let sz = printf("%.1f",a:sz/1000.0)."k"
11549 else
11550 let sz= a:sz
11551 endif
11552
11553 elseif g:netrw_sizestyle == 'H'
11554 if a:sz >= 1073741824
11555 let sz = printf("%.1f",a:sz/1073741824.0)."G"
11556 elseif a:sz >= 10485760
11557 let sz = printf("%d",a:sz/1048576)."M"
11558 elseif a:sz >= 1048576
11559 let sz = printf("%.1f",a:sz/1048576.0)."M"
11560 elseif a:sz >= 10240
11561 let sz = printf("%d",a:sz/1024)."K"
11562 elseif a:sz >= 1024
11563 let sz = printf("%.1f",a:sz/1024.0)."K"
11564 else
11565 let sz= a:sz
11566 endif
11567
11568 else
11569 let sz= a:sz
11570 endif
11571
11572" call Dret("s:NetrwHumanReadable ".sz)
11573 return sz
11574endfun
11575
11576" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011577" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
11578" changed sorting, etc. Also see s:NetrwSaveWordPosn().
11579fun! s:NetrwRestoreWordPosn()
11580" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +020011581 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +000011582" call Dret("NetrwRestoreWordPosn")
11583endfun
11584
11585" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011586" s:RestoreBufVars: {{{2
11587fun! s:RestoreBufVars()
11588" call Dfunc("s:RestoreBufVars()")
11589
11590 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
11591 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
11592 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
11593 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
11594 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
11595 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
11596
11597" call Dret("s:RestoreBufVars")
11598endfun
11599
11600" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000011601" s:RemotePathAnalysis: {{{2
11602fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +020011603" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +000011604
Bram Moolenaara6878372014-03-22 21:02:50 +010011605 " method :// user @ machine :port /path
Bram Moolenaar8d043172014-01-23 14:24:41 +010011606 let dirpat = '^\(\w\{-}\)://\(\(\w\+\)@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar9964e462007-05-05 17:54:07 +000011607 let s:method = substitute(a:dirname,dirpat,'\1','')
Bram Moolenaar8d043172014-01-23 14:24:41 +010011608 let s:user = substitute(a:dirname,dirpat,'\3','')
11609 let s:machine = substitute(a:dirname,dirpat,'\4','')
11610 let s:port = substitute(a:dirname,dirpat,'\5','')
11611 let s:path = substitute(a:dirname,dirpat,'\6','')
Bram Moolenaar13600302014-05-22 18:26:40 +020011612 let s:fname = substitute(s:path,'^.*/\ze.','','')
Bram Moolenaara6878372014-03-22 21:02:50 +010011613 if s:machine =~ '@'
11614 let dirpat = '^\(.*\)@\(.\{-}\)$'
11615 let s:user = s:user.'@'.substitute(s:machine,dirpat,'\1','')
11616 let s:machine = substitute(s:machine,dirpat,'\2','')
11617 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011618
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011619" call Decho("set up s:method <".s:method .">",'~'.expand("<slnum>"))
11620" call Decho("set up s:user <".s:user .">",'~'.expand("<slnum>"))
11621" call Decho("set up s:machine<".s:machine.">",'~'.expand("<slnum>"))
11622" call Decho("set up s:port <".s:port.">",'~'.expand("<slnum>"))
11623" call Decho("set up s:path <".s:path .">",'~'.expand("<slnum>"))
11624" call Decho("set up s:fname <".s:fname .">",'~'.expand("<slnum>"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011625
11626" call Dret("s:RemotePathAnalysis")
11627endfun
11628
11629" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011630" s:RemoteSystem: runs a command on a remote host using ssh {{{2
11631" Returns status
11632" Runs system() on
11633" [cd REMOTEDIRPATH;] a:cmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011634" Note that it doesn't do s:ShellEscape(a:cmd)!
Bram Moolenaarc236c162008-07-13 17:41:49 +000011635fun! s:RemoteSystem(cmd)
11636" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
11637 if !executable(g:netrw_ssh_cmd)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011638 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 +000011639 elseif !exists("b:netrw_curdir")
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011640 NetrwKeepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +000011641 else
11642 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
11643 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
11644 if remotedir != ""
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011645 let cmd= cmd.' cd '.s:ShellEscape(remotedir).";"
Bram Moolenaarc236c162008-07-13 17:41:49 +000011646 else
11647 let cmd= cmd.' '
11648 endif
11649 let cmd= cmd.a:cmd
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011650" call Decho("call system(".cmd.")",'~'.expand("<slnum>"))
Bram Moolenaarc236c162008-07-13 17:41:49 +000011651 let ret= system(cmd)
11652 endif
11653" call Dret("s:RemoteSystem ".ret)
11654 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +000011655endfun
11656
11657" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011658" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +000011659fun! s:RestoreWinVars()
11660" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +000011661 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011662 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
11663 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
11664 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
11665 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
11666 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
11667 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
11668 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
11669 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
11670 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
11671 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
11672 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
11673 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +000011674 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
11675 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000011676 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
11677 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
11678 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
11679" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +000011680endfun
11681
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000011682" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011683" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
11684"
11685" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
11686" is true) and a command, :Rexplore, which call this function.
11687"
11688" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011689"
11690" s:rexposn_BUFNR used to save/restore cursor position
Bram Moolenaar446cb832008-06-24 21:56:24 +000011691fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +020011692 if exists("s:netrwdrag")
11693 return
11694 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011695" 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 +010011696" call Decho("currently in bufname<".bufname("%").">",'~'.expand("<slnum>"))
11697" 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 +010011698
11699 if &ft == "netrw" && exists("w:netrw_rexfile") && w:netrw_rexfile != ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011700 " a :Rex while in a netrw buffer means: edit the file in w:netrw_rexfile
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011701" call Decho("in netrw buffer, will edit file<".w:netrw_rexfile.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011702 exe "NetrwKeepj e ".w:netrw_rexfile
Bram Moolenaara6878372014-03-22 21:02:50 +010011703 unlet w:netrw_rexfile
11704" call Dret("s:NetrwRexplore returning from netrw to buf#".bufnr("%")."<".bufname("%")."> (ft=".&ft.")")
Bram Moolenaar15146672011-10-20 22:22:38 +020011705 return
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011706" else " Decho
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011707" call Decho("treating as not-netrw-buffer: ft=".&ft.((&ft == "netrw")? " == netrw" : "!= netrw"),'~'.expand("<slnum>"))
11708" 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 +020011709 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010011710
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011711 " ---------------------------
11712 " :Rex issued while in a file
11713 " ---------------------------
11714
Bram Moolenaara6878372014-03-22 21:02:50 +010011715 " record current file so :Rex can return to it from netrw
11716 let w:netrw_rexfile= expand("%")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011717" call Decho("set w:netrw_rexfile<".w:netrw_rexfile."> (win#".winnr().")",'~'.expand("<slnum>"))
Bram Moolenaara6878372014-03-22 21:02:50 +010011718
11719 if !exists("w:netrw_rexlocal")
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011720" call Dret("s:NetrwRexplore w:netrw_rexlocal doesn't exist (".&ft." win#".winnr().")")
Bram Moolenaara6878372014-03-22 21:02:50 +010011721 return
11722 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011723" 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 +020011724 if w:netrw_rexlocal
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011725 NetrwKeepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011726 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011727 NetrwKeepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011728 endif
Bram Moolenaar15146672011-10-20 22:22:38 +020011729 if exists("s:initbeval")
Bram Moolenaara6878372014-03-22 21:02:50 +010011730 setl beval
Bram Moolenaar15146672011-10-20 22:22:38 +020011731 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011732 if exists("s:rexposn_".bufnr("%"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011733" call Decho("restore posn, then unlet s:rexposn_".bufnr('%')."<".bufname("%").">",'~'.expand("<slnum>"))
11734 " restore position in directory listing
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011735" call Decho("restoring posn to s:rexposn_".bufnr('%')."<".string(s:rexposn_{bufnr('%')}).">",'~'.expand("<slnum>"))
11736 NetrwKeepj call winrestview(s:rexposn_{bufnr('%')})
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011737 if exists("s:rexposn_".bufnr('%'))
11738 unlet s:rexposn_{bufnr('%')}
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011739 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +020011740 else
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011741" call Decho("s:rexposn_".bufnr('%')."<".bufname("%")."> doesn't exist",'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011742 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010011743
Bram Moolenaar5c736222010-01-06 20:54:52 +010011744 if exists("s:explore_match")
11745 exe "2match netrwMarkFile /".s:explore_match."/"
11746 endif
Bram Moolenaara6878372014-03-22 21:02:50 +010011747
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011748" 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 +010011749" call Dret("s:NetrwRexplore : ft=".&ft)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011750endfun
11751
11752" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +010011753" s:SaveBufVars: save selected b: variables to s: variables {{{2
11754" use s:RestoreBufVars() to restore b: variables from s: variables
Bram Moolenaar9964e462007-05-05 17:54:07 +000011755fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +010011756" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +000011757
11758 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
11759 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
11760 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
11761 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
11762 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
11763 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
11764
11765" call Dret("s:SaveBufVars")
11766endfun
11767
11768" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011769" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +000011770fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +010011771" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +000011772 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
11773 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
11774 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
11775 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
11776 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
11777 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
11778 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
11779 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
11780 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
11781 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
11782 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
11783 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
11784 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
11785 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
11786 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
11787 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
11788 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
11789 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
11790" call Dret("s:SaveWinVars")
11791endfun
11792
11793" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011794" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000011795" To allow separate windows to have their own activities, such as
11796" Explore **/pattern, several variables have been made window-oriented.
11797" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +000011798" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000011799" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +000011800fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +010011801" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +000011802 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
11803 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
11804 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
11805 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
11806 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
11807 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
11808 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
11809 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
11810 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
11811 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
11812" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000011813endfun
11814
11815" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011816" s:SetRexDir: set directory for :Rexplore {{{2
11817fun! s:SetRexDir(islocal,dirname)
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011818" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">) win#".winnr())
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011819 let w:netrw_rexdir = a:dirname
11820 let w:netrw_rexlocal = a:islocal
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011821 let s:rexposn_{bufnr("%")} = winsaveview()
11822" call Decho("setting w:netrw_rexdir =".w:netrw_rexdir)
11823" call Decho("setting w:netrw_rexlocal=".w:netrw_rexlocal)
11824" call Decho("saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011825" call Decho("setting s:rexposn_".bufnr("%")."<".bufname("%")."> to SavePosn",'~'.expand("<slnum>"))
Bram Moolenaar97d62492012-11-15 21:28:22 +010011826" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011827endfun
11828
11829" ---------------------------------------------------------------------
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011830" s:ShowLink: used to modify thin and tree listings to show links {{{2
11831fun! s:ShowLink()
11832" " call Dfunc("s:ShowLink()")
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011833" " call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">",'~'.expand("<slnum>"))
11834" " call Decho(printf("line#%4d: %s",line("."),getline(".")),'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011835 if exists("b:netrw_curdir")
11836 norm! $?\a
11837 let fname = b:netrw_curdir.'/'.s:NetrwGetWord()
11838 let resname = resolve(fname)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011839" " call Decho("fname <".fname.">",'~'.expand("<slnum>"))
11840" " call Decho("resname <".resname.">",'~'.expand("<slnum>"))
11841" " call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
11842 if resname =~ '^\M'.b:netrw_curdir.'/'
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011843 let dirlen = strlen(b:netrw_curdir)
11844 let resname = strpart(resname,dirlen+1)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011845" " call Decho("resname<".resname."> (b:netrw_curdir elided)",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011846 endif
11847 let modline = getline(".")."\t --> ".resname
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011848" " call Decho("fname <".fname.">",'~'.expand("<slnum>"))
11849" " call Decho("modline<".modline.">",'~'.expand("<slnum>"))
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011850 setl noro ma
11851 call setline(".",modline)
11852 setl ro noma nomod
11853 endif
11854" " call Dret("s:ShowLink".((exists("fname")? ' : '.fname : 'n/a')))
11855endfun
11856
11857" ---------------------------------------------------------------------
11858" s:ShowStyle: {{{2
11859fun! s:ShowStyle()
11860 if !exists("w:netrw_liststyle")
11861 let liststyle= g:netrw_liststyle
11862 else
11863 let liststyle= w:netrw_liststyle
11864 endif
11865 if liststyle == s:THINLIST
11866 return s:THINLIST.":thin"
11867 elseif liststyle == s:LONGLIST
11868 return s:LONGLIST.":long"
11869 elseif liststyle == s:WIDELIST
11870 return s:WIDELIST.":wide"
11871 elseif liststyle == s:TREELIST
11872 return s:TREELIST.":tree"
11873 else
11874 return 'n/a'
11875 endif
11876endfun
11877
11878" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +010011879" s:Strlen: this function returns the length of a string, even if its using multi-byte characters. {{{2
11880" Solution from Nicolai Weibull, vim docs (:help strlen()),
11881" Tony Mechelynck, and my own invention.
Bram Moolenaar446cb832008-06-24 21:56:24 +000011882fun! s:Strlen(x)
Bram Moolenaar8d043172014-01-23 14:24:41 +010011883" "" call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen.")")
11884
11885 if v:version >= 703 && exists("*strdisplaywidth")
11886 let ret= strdisplaywidth(a:x)
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011887
Bram Moolenaar8d043172014-01-23 14:24:41 +010011888 elseif type(g:Align_xstrlen) == 1
11889 " allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc")
11890 exe "let ret= ".g:Align_xstrlen."('".substitute(a:x,"'","''","g")."')"
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011891
Bram Moolenaar8d043172014-01-23 14:24:41 +010011892 elseif g:Align_xstrlen == 1
Bram Moolenaar446cb832008-06-24 21:56:24 +000011893 " number of codepoints (Latin a + combining circumflex is two codepoints)
11894 " (comment from TM, solution from NW)
11895 let ret= strlen(substitute(a:x,'.','c','g'))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011896
Bram Moolenaar8d043172014-01-23 14:24:41 +010011897 elseif g:Align_xstrlen == 2
11898 " number of spacing codepoints (Latin a + combining circumflex is one spacing
Bram Moolenaar446cb832008-06-24 21:56:24 +000011899 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
11900 " (comment from TM, solution from TM)
Bram Moolenaar8d043172014-01-23 14:24:41 +010011901 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011902
Bram Moolenaar8d043172014-01-23 14:24:41 +010011903 elseif g:Align_xstrlen == 3
11904 " virtual length (counting, for instance, tabs as anything between 1 and
11905 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
Bram Moolenaar446cb832008-06-24 21:56:24 +000011906 " preceded by lam, one otherwise, etc.)
11907 " (comment from TM, solution from me)
Bram Moolenaar8d043172014-01-23 14:24:41 +010011908 let modkeep= &l:mod
11909 exe "norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +000011910 call setline(line("."),a:x)
11911 let ret= virtcol("$") - 1
Bram Moolenaar8d043172014-01-23 14:24:41 +010011912 d
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011913 NetrwKeepj norm! k
Bram Moolenaar8d043172014-01-23 14:24:41 +010011914 let &l:mod= modkeep
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011915
Bram Moolenaar446cb832008-06-24 21:56:24 +000011916 else
11917 " at least give a decent default
Bram Moolenaar8d043172014-01-23 14:24:41 +010011918 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011919 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010011920" "" call Dret("s:Strlen ".ret)
Bram Moolenaar446cb832008-06-24 21:56:24 +000011921 return ret
11922endfun
11923
11924" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011925" s:ShellEscape: shellescape(), or special windows handling {{{2
11926fun! s:ShellEscape(s, ...)
11927 if (has('win32') || has('win64')) && $SHELL == '' && &shellslash
11928 return printf('"%s"', substitute(a:s, '"', '""', 'g'))
11929 endif
11930 let f = a:0 > 0 ? a:1 : 0
11931 return shellescape(a:s, f)
11932endfun
11933
11934" ---------------------------------------------------------------------
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011935" s:TreeListMove: supports [[, ]], [], and ][ in tree mode {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +000011936fun! s:TreeListMove(dir)
11937" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011938 let curline = getline('.')
11939 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
11940 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
11941 let curindent = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
11942 let indentm1 = substitute(curindent,'^'.s:treedepthstring,'','')
11943 let treedepthchr = substitute(s:treedepthstring,' ','','g')
11944 let stopline = exists("w:netrw_bannercnt")? w:netrw_bannercnt : 1
11945" call Decho("prvline <".prvline."> #".(line(".")-1), '~'.expand("<slnum>"))
11946" call Decho("curline <".curline."> #".line(".") , '~'.expand("<slnum>"))
11947" call Decho("nxtline <".nxtline."> #".(line(".")+1), '~'.expand("<slnum>"))
11948" call Decho("curindent<".curindent.">" , '~'.expand("<slnum>"))
11949" call Decho("indentm1 <".indentm1.">" , '~'.expand("<slnum>"))
11950 " COMBAK : need to handle when on a directory
11951 " COMBAK : need to handle ]] and ][. In general, needs work!!!
Bram Moolenaar446cb832008-06-24 21:56:24 +000011952 if curline !~ '/$'
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011953 if a:dir == '[[' && prvline != ''
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011954 NetrwKeepj norm! 0
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011955 let nl = search('^'.indentm1.'\%('.s:treedepthstring.'\)\@!','bWe',stopline) " search backwards
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011956" call Decho("regfile srch back: ".nl,'~'.expand("<slnum>"))
Bram Moolenaare0fa3742016-02-20 15:47:01 +010011957 elseif a:dir == '[]' && nxtline != ''
11958 NetrwKeepj norm! 0
11959" call Decho('srchpat<'.'^\%('.curindent.'\)\@!'.'>')
11960 let nl = search('^\%('.curindent.'\)\@!','We') " search forwards
11961 if nl != 0
11962 NetrwKeepj norm! k
11963 else
11964 NetrwKeepj norm! G
11965 endif
Bram Moolenaara0f849e2015-10-30 14:37:44 +010011966" call Decho("regfile srch fwd: ".nl,'~'.expand("<slnum>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +000011967 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000011968 endif
11969
11970" call Dret("s:TreeListMove")
11971endfun
11972
11973" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000011974" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
11975" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
11976" can't be called except via emenu. But due to locale, that menu line may not be called
11977" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
11978fun! s:UpdateBuffersMenu()
11979" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +020011980 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +000011981 try
Bram Moolenaaradc21822011-04-01 18:03:16 +020011982 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +000011983 catch /^Vim\%((\a\+)\)\=:E/
11984 let v:errmsg= ""
Bram Moolenaar8feef4f2015-01-07 16:57:10 +010011985 sil NetrwKeepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +000011986 endtry
11987 endif
11988" call Dret("s:UpdateBuffersMenu")
11989endfun
11990
11991" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000011992" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +020011993" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000011994fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +000011995" call Dfunc("s:UseBufWinVars()")
11996 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000011997 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
11998 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
11999 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
12000 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
12001 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
12002 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
12003 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
12004 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
12005 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 +000012006" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000012007endfun
12008
Bram Moolenaar1afcace2005-11-25 19:54:28 +000012009" ---------------------------------------------------------------------
Bram Moolenaara0f849e2015-10-30 14:37:44 +010012010" s:UserMaps: supports user-defined UserMaps {{{2
12011" * calls a user-supplied funcref(islocal,curdir)
12012" * interprets result
12013" See netrw#UserMaps()
12014fun! s:UserMaps(islocal,funcname)
12015" call Dfunc("s:UserMaps(islocal=".a:islocal.",funcname<".a:funcname.">)")
12016
12017 if !exists("b:netrw_curdir")
12018 let b:netrw_curdir= getcwd()
12019 endif
12020 let Funcref = function(a:funcname)
12021 let result = Funcref(a:islocal)
12022
12023 if type(result) == 1
12024 " if result from user's funcref is a string...
12025" call Decho("result string from user funcref<".result.">",'~'.expand("<slnum>"))
12026 if result == "refresh"
12027" call Decho("refreshing display",'~'.expand("<slnum>"))
12028 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
12029 elseif result != ""
12030" call Decho("executing result<".result.">",'~'.expand("<slnum>"))
12031 exe result
12032 endif
12033
12034 elseif type(result) == 3
12035 " if result from user's funcref is a List...
12036" call Decho("result List from user funcref<".string(result).">",'~'.expand("<slnum>"))
12037 for action in result
12038 if action == "refresh"
12039" call Decho("refreshing display",'~'.expand("<slnum>"))
12040 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
12041 elseif action != ""
12042" call Decho("executing action<".action.">",'~'.expand("<slnum>"))
12043 exe action
12044 endif
12045 endfor
12046 endif
12047
12048" call Dret("s:UserMaps")
12049endfun
12050
12051" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +020012052" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +000012053let &cpo= s:keepcpo
12054unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000012055
Bram Moolenaar071d4272004-06-13 20:20:40 +000012056" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +000012057" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000012058" vim:ts=8 fdm=marker