blob: 4634a343c551465344f544bc236def7f9d0cf0a1 [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 Moolenaar8d043172014-01-23 14:24:41 +01003" Date: Jan 21, 2014
4" Version: 150
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 Moolenaar8d043172014-01-23 14:24:41 +01007" Copyright: Copyright (C) 1999-2013 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 Moolenaar446cb832008-06-24 21:56:24 +000016"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar071d4272004-06-13 20:20:40 +000017"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000018" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000019" (James 1:22 RSV)
20" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar9964e462007-05-05 17:54:07 +000021" Load Once: {{{1
Bram Moolenaar1afcace2005-11-25 19:54:28 +000022if &cp || exists("g:loaded_netrw")
23 finish
24endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010025let g:loaded_netrw = "v150"
Bram Moolenaar9964e462007-05-05 17:54:07 +000026if !exists("s:NOTE")
27 let s:NOTE = 0
28 let s:WARNING = 1
29 let s:ERROR = 2
30endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000031
Bram Moolenaar1afcace2005-11-25 19:54:28 +000032let s:keepcpo= &cpo
Bram Moolenaar5b435d62012-04-05 17:33:26 +020033set cpo&vim
Bram Moolenaar8d043172014-01-23 14:24:41 +010034"DechoRemOn
Bram Moolenaar9964e462007-05-05 17:54:07 +000035"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
Bram Moolenaar071d4272004-06-13 20:20:40 +000036
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000037" ======================
38" Netrw Variables: {{{1
39" ======================
40
Bram Moolenaar071d4272004-06-13 20:20:40 +000041" ---------------------------------------------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +020042" netrw#ErrorMsg: {{{2
43" 0=note = s:NOTE
44" 1=warning = s:WARNING
45" 2=error = s:ERROR
Bram Moolenaar8d043172014-01-23 14:24:41 +010046" Jan 03, 2014 : max errnum currently is 95
Bram Moolenaar5b435d62012-04-05 17:33:26 +020047fun! netrw#ErrorMsg(level,msg,errnum)
48" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
49
50 if a:level < g:netrw_errorlvl
Bram Moolenaare6ae6222013-05-21 21:01:10 +020051" call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl)
Bram Moolenaar5b435d62012-04-05 17:33:26 +020052 return
53 endif
54
55 if a:level == 1
56 let level= "**warning** (netrw) "
57 elseif a:level == 2
58 let level= "**error** (netrw) "
59 else
60 let level= "**note** (netrw) "
61 endif
62" call Decho("level=".level)
63
64 if g:netrw_use_errorwindow
65 " (default) netrw creates a one-line window to show error/warning
66 " messages (reliably displayed)
67
68 " record current window number for NetrwRestorePosn()'s benefit
69 let s:winBeforeErr= winnr()
70" call Decho("s:winBeforeErr=".s:winBeforeErr)
71
72 " getting messages out reliably is just plain difficult!
73 " This attempt splits the current window, creating a one line window.
74 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
75" call Decho("write to NetrwMessage buffer")
76 exe bufwinnr("NetrwMessage")."wincmd w"
77" call Decho("setl ma noro")
78 setl ma noro
79 keepj call setline(line("$")+1,level.a:msg)
80 keepj $
81 else
82" call Decho("create a NetrwMessage buffer window")
83 bo 1split
84 sil! call s:NetrwEnew()
85 sil! keepj call s:NetrwSafeOptions()
86 setl bt=nofile
87 keepj file NetrwMessage
Bram Moolenaarff034192013-04-24 18:51:19 +020088" call Decho("setl ma noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +020089 setl ma noro
90 call setline(line("$"),level.a:msg)
91 endif
92" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
93 if &fo !~ '[ta]'
94 syn clear
95 syn match netrwMesgNote "^\*\*note\*\*"
96 syn match netrwMesgWarning "^\*\*warning\*\*"
97 syn match netrwMesgError "^\*\*error\*\*"
98 hi link netrwMesgWarning WarningMsg
99 hi link netrwMesgError Error
100 endif
101" call Decho("(ErrorMsg) setl noma ro bh=wipe")
102 setl noma ro bh=wipe
103
104 else
105 " (optional) netrw will show messages using echomsg. Even if the
106 " message doesn't appear, at least it'll be recallable via :messages
107" redraw!
108 if a:level == s:WARNING
109 echohl WarningMsg
110 elseif a:level == s:ERROR
111 echohl Error
112 endif
113 echomsg level.a:msg
114" call Decho("echomsg ***netrw*** ".a:msg)
115 echohl None
116 endif
117
118" call Dret("netrw#ErrorMsg")
119endfun
120
121" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +0100122" NetrwInit: initializes variables if they haven't been defined {{{2
123" Loosely, varname = value.
124fun s:NetrwInit(varname,value)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200125" call Decho("varname<".a:varname."> value=".a:value)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100126 if !exists(a:varname)
127 if type(a:value) == 0
128 exe "let ".a:varname."=".a:value
Bram Moolenaarff034192013-04-24 18:51:19 +0200129 elseif type(a:value) == 1 && a:value =~ '^[{[]'
130 exe "let ".a:varname."=".a:value
Bram Moolenaar5c736222010-01-06 20:54:52 +0100131 elseif type(a:value) == 1
132 exe "let ".a:varname."="."'".a:value."'"
133 else
134 exe "let ".a:varname."=".a:value
135 endif
136 endif
137endfun
138
139" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +0000140" Netrw Constants: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100141call s:NetrwInit("g:netrw_dirhist_cnt",0)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000142if !exists("s:LONGLIST")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100143 call s:NetrwInit("s:THINLIST",0)
144 call s:NetrwInit("s:LONGLIST",1)
145 call s:NetrwInit("s:WIDELIST",2)
146 call s:NetrwInit("s:TREELIST",3)
147 call s:NetrwInit("s:MAXLIST" ,4)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000148endif
149
150" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000151" Default values for netrw's global protocol variables {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +0200152call s:NetrwInit("g:netrw_use_errorwindow",1)
153
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000154if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100155 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000156 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100157 elseif executable("curl")
158 let g:netrw_dav_cmd = "curl"
159 else
160 let g:netrw_dav_cmd = ""
161 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000162endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000163if !exists("g:netrw_fetch_cmd")
164 if executable("fetch")
165 let g:netrw_fetch_cmd = "fetch -o"
166 else
167 let g:netrw_fetch_cmd = ""
168 endif
169endif
170if !exists("g:netrw_ftp_cmd")
171 let g:netrw_ftp_cmd = "ftp"
172endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200173let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200174if !exists("g:netrw_ftp_options")
175 let g:netrw_ftp_options= "-i -n"
176endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000177if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000178 if executable("elinks")
179 let g:netrw_http_cmd = "elinks"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100180 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000181 elseif executable("links")
182 let g:netrw_http_cmd = "links"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100183 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000184 elseif executable("curl")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100185 let g:netrw_http_cmd = "curl"
186 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000187 elseif executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100188 let g:netrw_http_cmd = "wget"
189 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000190 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100191 let g:netrw_http_cmd = "fetch"
192 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000193 else
194 let g:netrw_http_cmd = ""
195 endif
196endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100197call s:NetrwInit("g:netrw_http_put_cmd","curl -T")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100198call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
199call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200200if !exists("g:netrw_scp_cmd")
201 if executable("scp")
202 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
203 elseif executable("pscp")
204 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk')
205 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk')
206 else
207 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q')
208 endif
209 else
210 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
211 endif
212endif
213
Bram Moolenaar5c736222010-01-06 20:54:52 +0100214call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
215call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000216
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000217if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000218 \ && exists("g:netrw_use_nt_rcp")
219 \ && g:netrw_use_nt_rcp
220 \ && executable( $SystemRoot .'/system32/rcp.exe')
221 let s:netrw_has_nt_rcp = 1
222 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000223else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000224 let s:netrw_has_nt_rcp = 0
225 let s:netrw_rcpmode = ''
226endif
227
228" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000229" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000230" Cygwin Detection ------- {{{3
231if !exists("g:netrw_cygwin")
232 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100233 if has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000234 let g:netrw_cygwin= 1
235 else
236 let g:netrw_cygwin= 0
237 endif
238 else
239 let g:netrw_cygwin= 0
240 endif
241endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000242" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100243call s:NetrwInit("g:netrw_alto" , &sb)
244call s:NetrwInit("g:netrw_altv" , &spr)
245call s:NetrwInit("g:netrw_banner" , 1)
246call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200247call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100248call s:NetrwInit("g:netrw_chgwin" , -1)
249call s:NetrwInit("g:netrw_compress" , "gzip")
250call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200251if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
252 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
253 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000254endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200255call s:NetrwInit("g:netrw_cursor" , 2)
256let s:netrw_usercul = &cursorline
257let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar8d043172014-01-23 14:24:41 +0100258call s:NetrwInit("g:netrw_cygdrive","/cygdrive")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000259" Default values - d-g ---------- {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +0200260call s:NetrwInit("s:didstarstar",0)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100261call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200262call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100263call s:NetrwInit("g:netrw_dirhistmax" , 10)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200264call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100265call s:NetrwInit("g:netrw_fastbrowse" , 1)
266call 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 +0000267if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000268 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
269 let g:netrw_ftp_list_cmd = "ls -lF"
270 let g:netrw_ftp_timelist_cmd = "ls -tlF"
271 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000272 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000273 let g:netrw_ftp_list_cmd = "dir"
274 let g:netrw_ftp_timelist_cmd = "dir"
275 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000276 endif
277endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100278call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000279" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100280call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000281if !exists("g:netrw_ignorenetrc")
282 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
283 let g:netrw_ignorenetrc= 1
284 else
285 let g:netrw_ignorenetrc= 0
286 endif
287endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100288call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000289if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000290 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000291 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200292 " provide a pscp-based listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000293 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
294 endif
295 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
296 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200297 " provide a scp-based default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000298 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000299 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000300" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000301 let g:netrw_list_cmd= ""
302 endif
303endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100304call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000305" Default values - lh-lz ---------- {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200306if exists("g:netrw_local_copycmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200307 let g:netrw_localcopycmd= g:netrw_local_copycmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200308 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
309endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100310if !exists("g:netrw_localcmdshell")
311 let g:netrw_localcmdshell= ""
312endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000313if !exists("g:netrw_localcopycmd")
314 if has("win32") || has("win95") || has("win64") || has("win16")
315 if g:netrw_cygwin
316 let g:netrw_localcopycmd= "cp"
317 else
Bram Moolenaar97d62492012-11-15 21:28:22 +0100318 let g:netrw_localcopycmd= "cmd /c copy"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000319 endif
320 elseif has("unix") || has("macunix")
321 let g:netrw_localcopycmd= "cp"
322 else
323 let g:netrw_localcopycmd= ""
324 endif
325endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200326if exists("g:netrw_local_mkdir")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100327 let g:netrw_localmkdir= g:netrw_local_mkdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200328 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
329endif
330call s:NetrwInit("g:netrw_localmkdir","mkdir")
Bram Moolenaar15146672011-10-20 22:22:38 +0200331call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200332if exists("g:netrw_local_movecmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200333 let g:netrw_localmovecmd= g:netrw_local_movecmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200334 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
335endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000336if !exists("g:netrw_localmovecmd")
337 if has("win32") || has("win95") || has("win64") || has("win16")
338 if g:netrw_cygwin
339 let g:netrw_localmovecmd= "mv"
340 else
Bram Moolenaar97d62492012-11-15 21:28:22 +0100341 let g:netrw_localmovecmd= "cmd /c move"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000342 endif
343 elseif has("unix") || has("macunix")
344 let g:netrw_localmovecmd= "mv"
345 else
346 let g:netrw_localmovecmd= ""
347 endif
348endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200349call s:NetrwInit("g:netrw_localrmdir", "rmdir")
350if exists("g:netrw_local_rmdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200351 let g:netrw_localrmdir= g:netrw_local_rmdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200352 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
353endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100354call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
355" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000356if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000357 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000358endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000359if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000360 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
361endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000362" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100363call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
364call s:NetrwInit("g:netrw_maxfilenamelen", 32)
365call s:NetrwInit("g:netrw_menu" , 1)
366call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200367call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~ '[anh]'))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100368call s:NetrwInit("g:netrw_retmap" , 0)
369if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
370 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
371elseif has("win32") || has("win95") || has("win64") || has("win16")
372 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
373else
374 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000375endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100376call s:NetrwInit("g:netrw_preview" , 0)
377call s:NetrwInit("g:netrw_scpport" , "-P")
378call s:NetrwInit("g:netrw_sshport" , "-p")
379call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
380call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
381call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
382call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000383" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100384" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
385call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200386call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100387call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
388call s:NetrwInit("g:netrw_sort_options" , "")
389call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000390if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100391 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200392 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100393 else
394 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000395 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000396endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100397call s:NetrwInit("g:netrw_special_syntax" , 0)
398call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
399call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000400" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100401call s:NetrwInit("g:netrw_timefmt","%c")
Bram Moolenaarff034192013-04-24 18:51:19 +0200402if !exists("g:netrw_xstrlen")
403 if exists("g:Align_xstrlen")
404 let g:netrw_xstrlen= g:Align_xstrlen
405 elseif exists("g:drawit_xstrlen")
406 let g:netrw_xstrlen= g:drawit_xstrlen
407 elseif &enc == "latin1" || !has("multi_byte")
408 let g:netrw_xstrlen= 0
409 else
410 let g:netrw_xstrlen= 1
411 endif
412endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100413call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100414call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200415call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200416if g:netrw_winsize == 0|let g:netrw_winsize= -1|endif
417if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000418" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000419" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100420call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200421if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarff034192013-04-24 18:51:19 +0200422 call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200423else
Bram Moolenaarff034192013-04-24 18:51:19 +0200424 call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200425endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200426call s:NetrwInit("g:netrw_menu_escape",'.&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100427call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
428call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8d043172014-01-23 14:24:41 +0100429if &enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4'
430 let s:treedepthstring= "│ "
431else
432 let s:treedepthstring= "| "
433endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000434
435" BufEnter event ignored by decho when following variable is true
436" Has a side effect that doau BufReadPost doesn't work, so
437" files read by network transfer aren't appropriately highlighted.
438"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439
Bram Moolenaaradc21822011-04-01 18:03:16 +0200440" ======================
441" Netrw Initialization: {{{1
442" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200443if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
Bram Moolenaar8d043172014-01-23 14:24:41 +0100444" call Decho("installed beval events")
445 let &l:bexpr = "netrw#NetrwBalloonHelp()"
446 au FileType netrw set beval
447 au WinLeave * if &ft == "netrw" && exists("s:initbeval")|let &beval= s:initbeval|endif
448 au VimEnter * let s:initbeval= &beval
449"else " Decho
450" if v:version < 700 | call Decho("did not install beval events: v:version=".v:version." < 700") | endif
451" if !has("balloon_eval") | call Decho("did not install beval events: does not have balloon_eval") | endif
452" if exists("s:initbeval") | call Decho("did not install beval events: s:initbeval exists") | endif
453" if exists("g:netrw_nobeval") | call Decho("did not install beval events: g:netrw_nobeval exists") | endif
454" if !has("syntax") | call Decho("did not install beval events: does not have syntax highlighting") | endif
455" if exists("g:syntax_on") | call Decho("did not install beval events: g:syntax_on exists") | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200456endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200457au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200458
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000459" ==============================
460" Netrw Utility Functions: {{{1
461" ==============================
462
Bram Moolenaaradc21822011-04-01 18:03:16 +0200463" ---------------------------------------------------------------------
464" netrw#NetrwBalloonHelp: {{{2
Bram Moolenaar8d043172014-01-23 14:24:41 +0100465if v:version >= 700 && has("balloon_eval") && has("syntax") && exists("g:syntax_on") && !exists("g:netrw_nobeval")
466" call Decho("loading netrw#BalloonHelp()")
467 fun! netrw#NetrwBalloonHelp()
468 if &ft != "netrw"
469 return ""
470 endif
471 if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
472 let mesg= ""
473 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
474 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
475 elseif getline(v:beval_lnum) =~ '^"\s*/'
476 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
477 elseif v:beval_text == "Sorted" || v:beval_text == "by"
478 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
479 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
480 let mesg = "S: edit sorting sequence"
481 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
482 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
483 elseif v:beval_text == "Quick" || v:beval_text == "Help"
484 let mesg = "Help: press <F1>"
485 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
486 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
487 else
488 let mesg= ""
489 endif
490 return mesg
491 endfun
492"else " Decho
493" if v:version < 700 |call Decho("did not load netrw#BalloonHelp(): vim version ".v:version." < 700 -")|endif
494" if !has("balloon_eval") |call Decho("did not load netrw#BalloonHelp(): does not have balloon eval") |endif
495" if !has("syntax") |call Decho("did not load netrw#BalloonHelp(): syntax disabled") |endif
496" if !exists("g:syntax_on") |call Decho("did not load netrw#BalloonHelp(): g:syntax_on=".g:syntax_on) |endif
497" if exists("g:netrw_nobeval") |call Decho("did not load netrw#BalloonHelp(): g:netrw_nobeval exists") |endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200498endif
499
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200501" s:NetrwOptionSave: save options prior to setting to "netrw-buffer-standard" form {{{2
Bram Moolenaar8d043172014-01-23 14:24:41 +0100502" Options get restored by s:NetrwOptionRestore()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000503" 06/08/07 : removed call to NetrwSafeOptions(), either placed
504" immediately after NetrwOptionSave() calls in NetRead
505" and NetWrite, or after the s:NetrwEnew() call in
506" NetrwBrowse.
507" vt: normally its "w:" or "s:" (a variable type)
508fun! s:NetrwOptionSave(vt)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200509" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000510" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
Bram Moolenaar8d043172014-01-23 14:24:41 +0100511" call Decho("(s:NetrwOptionSave) 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)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200512
Bram Moolenaar446cb832008-06-24 21:56:24 +0000513 if !exists("{a:vt}netrw_optionsave")
514 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000515 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000516" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000517 return
518 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100519" call Decho("(s:NetrwOptionSave) prior to save: fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000520
521 " Save current settings and current directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200522" call Decho("saving current settings and current directory")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000523 let s:yykeep = @@
Bram Moolenaar15146672011-10-20 22:22:38 +0200524 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000525 let {a:vt}netrw_aikeep = &l:ai
526 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar15146672011-10-20 22:22:38 +0200527 let {a:vt}netrw_bhkeep = &l:bh
528 let {a:vt}netrw_blkeep = &l:bl
529 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200530 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaarff034192013-04-24 18:51:19 +0200531 let {a:vt}netrw_cedit = &cedit
Bram Moolenaar446cb832008-06-24 21:56:24 +0000532 let {a:vt}netrw_cikeep = &l:ci
533 let {a:vt}netrw_cinkeep = &l:cin
534 let {a:vt}netrw_cinokeep = &l:cino
535 let {a:vt}netrw_comkeep = &l:com
536 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200537 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar15146672011-10-20 22:22:38 +0200538 let {a:vt}netrw_fenkeep = &l:fen
539 let {a:vt}netrw_ffkeep = &l:ff
Bram Moolenaar446cb832008-06-24 21:56:24 +0000540 let {a:vt}netrw_fokeep = &l:fo " formatoptions
541 let {a:vt}netrw_gdkeep = &l:gd " gdefault
542 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200543 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar15146672011-10-20 22:22:38 +0200544 let {a:vt}netrw_iskkeep = &l:isk
545 let {a:vt}netrw_lskeep = &l:ls
546 let {a:vt}netrw_makeep = &l:ma
Bram Moolenaar446cb832008-06-24 21:56:24 +0000547 let {a:vt}netrw_magickeep = &l:magic
Bram Moolenaar15146672011-10-20 22:22:38 +0200548 let {a:vt}netrw_modkeep = &l:mod
549 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar446cb832008-06-24 21:56:24 +0000550 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar15146672011-10-20 22:22:38 +0200551 let {a:vt}netrw_rokeep = &l:ro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200552 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000553 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar8d043172014-01-23 14:24:41 +0100554 let {a:vt}netrw_starkeep = @*
Bram Moolenaar15146672011-10-20 22:22:38 +0200555 let {a:vt}netrw_tskeep = &l:ts
Bram Moolenaar446cb832008-06-24 21:56:24 +0000556 let {a:vt}netrw_twkeep = &l:tw " textwidth
557 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar15146672011-10-20 22:22:38 +0200558 let {a:vt}netrw_wrapkeep = &l:wrap
559 let {a:vt}netrw_writekeep = &l:write
560 if g:netrw_use_noswf && has("win32") && !has("win95")
561 let {a:vt}netrw_swfkeep = &l:swf
562 endif
563
564 " save a few selected netrw-related variables
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200565" call Decho("saving a few selected netrw-related variables")
Bram Moolenaar15146672011-10-20 22:22:38 +0200566 if g:netrw_keepdir
567 let {a:vt}netrw_dirkeep = getcwd()
568 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000569 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000570 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000571 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200572 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
573 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000574
Bram Moolenaar8d043172014-01-23 14:24:41 +0100575" call Decho("(s:NetrwOptionSave) 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)
576" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +0000577endfun
578
579" ------------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +0100580" s:NetrwOptionRestore: restore options (based on prior s:NetrwOptionSave) {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000581fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200582" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaar8d043172014-01-23 14:24:41 +0100583" call Decho("(NetrwOptionRestore) 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)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000584 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar15146672011-10-20 22:22:38 +0200585 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200586" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200587 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200588" call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
589" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
590 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200591 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200592" call Decho("(NetrwOptionRestore) no previous position")
Bram Moolenaar15146672011-10-20 22:22:38 +0200593 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100594" call Decho("(NetrwOptionRestore) 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)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200595" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000596" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000597 return
598 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000599 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000600
Bram Moolenaarff034192013-04-24 18:51:19 +0200601 if exists("+acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000602 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200603" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000604 let curdir = getcwd()
605 let &l:acd = {a:vt}netrw_acdkeep
606 unlet {a:vt}netrw_acdkeep
607 if &l:acd
Bram Moolenaar15146672011-10-20 22:22:38 +0200608" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
Bram Moolenaar446cb832008-06-24 21:56:24 +0000609 try
610 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200611 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000612 endif
613 catch /^Vim\%((\a\+)\)\=:E472/
614 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
615 endtry
616 endif
617 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000618 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000619 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
620 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200621 if g:netrw_liststyle != s:TREELIST
622 if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif
623 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200624 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
625 if exists("{a:vt}netrw_btkeep") |let &l:bt = {a:vt}netrw_btkeep |unlet {a:vt}netrw_btkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200626 if exists("{a:vt}netrw_bombkeep") |let &l:bomb = {a:vt}netrw_bombkeep |unlet {a:vt}netrw_bombkeep |endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200627 if exists("{a:vt}netrw_cedit") |let &cedit = {a:vt}netrw_cedit |unlet {a:vt}netrw_cedit |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000628 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
629 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
630 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
631 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
632 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200633 if exists("{a:vt}netrw_diffkeep") |let &l:diff = {a:vt}netrw_diffkeep |unlet {a:vt}netrw_diffkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200634 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
635 if exists("{a:vt}netrw_ffkeep") |let &l:ff = {a:vt}netrw_ffkeep |unlet {a:vt}netrw_ffkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000636 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
637 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
638 if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200639 if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200640 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
641 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
642 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
643 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
644 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
645 if exists("{a:vt}netrw_nukeep") |let &l:nu = {a:vt}netrw_nukeep |unlet {a:vt}netrw_nukeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000646 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200647 if exists("{a:vt}netrw_rokeep") |let &l:ro = {a:vt}netrw_rokeep |unlet {a:vt}netrw_rokeep |endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200648 if exists("{a:vt}netrw_selkeep") |let &l:sel = {a:vt}netrw_selkeep |unlet {a:vt}netrw_selkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000649 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100650 if exists("{a:vt}netrw_starkeep") |let @* = {a:vt}netrw_starkeep |unlet {a:vt}netrw_starkeep |endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100651 " Problem: start with liststyle=0; press <i> : result, following line resets l:ts.
652" if exists("{a:vt}netrw_tskeep") |let &l:ts = {a:vt}netrw_tskeep |unlet {a:vt}netrw_tskeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000653 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
654 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200655 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
656 if exists("{a:vt}netrw_writekeep")|let &l:write = {a:vt}netrw_writekeep |unlet {a:vt}netrw_writekeep|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000657 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
658 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000659 if &directory == ""
660 " user hasn't specified a swapfile directory;
661 " netrw will temporarily set the swapfile directory
662 " to the current directory as returned by getcwd().
Bram Moolenaar8d043172014-01-23 14:24:41 +0100663 let &l:directory= getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200664 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaarff034192013-04-24 18:51:19 +0200665 setl directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000666 unlet {a:vt}netrw_swfkeep
667 elseif &l:swf != {a:vt}netrw_swfkeep
668 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200669 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000670 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000671 endif
672 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200673 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
674 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
675 if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
676 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200677 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
678 if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200679 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200680" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200681 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200682" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
Bram Moolenaar8d043172014-01-23 14:24:41 +0100683 if exists("s:nbcd_curpos_".bufnr('%'))
684 unlet s:nbcd_curpos_{bufnr('%')}
685 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200686 else
687" call Decho("no previous position")
688 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000689
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200690" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaarff034192013-04-24 18:51:19 +0200691" call Decho("(NetrwOptionRestore) fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200692" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
693" call Decho("(NetrwOptionRestore) diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"))
Bram Moolenaar97d62492012-11-15 21:28:22 +0100694" call Decho("(NetrwOptionRestore) ts=".&l:ts)
Bram Moolenaarff034192013-04-24 18:51:19 +0200695 " Moved the filetype detect here from NetrwGetFile() because remote files
696 " were having their filetype detect-generated settings overwritten by
697 " NetrwOptionRestore.
698 if &ft != "netrw"
699" call Decho("(NetrwOptionRestore) filetype detect (ft=".&ft.")")
700 filetype detect
701 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +0100702" call Decho("(s:NetrwOptionRestore) 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)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200703" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000704endfun
705
706" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000707" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +0200708" Use s:NetrwSaveOptions() to save user settings
709" Use s:NetrwOptionRestore() to restore user settings
Bram Moolenaar9964e462007-05-05 17:54:07 +0000710fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100711" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
Bram Moolenaar8d043172014-01-23 14:24:41 +0100712" call Decho("(s:NetrwSafeOptions) win#".winnr()."'s ft=".&ft)
713" call Decho("(s:NetrwSafeOptions) 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)
Bram Moolenaarff034192013-04-24 18:51:19 +0200714 if exists("+acd") | setl noacd | endif
715 setl noai
716 setl noaw
Bram Moolenaar8d043172014-01-23 14:24:41 +0100717 setl nobl
Bram Moolenaarff034192013-04-24 18:51:19 +0200718 setl nobomb
719 setl noci
720 setl nocin
721 if g:netrw_liststyle == s:TREELIST
722 setl bh=hide
723 endif
724 setl cino=
725 setl com=
726 setl cpo-=a
727 setl cpo-=A
728 setl fo=nroql2
Bram Moolenaar8d043172014-01-23 14:24:41 +0100729 setl nohid
Bram Moolenaarff034192013-04-24 18:51:19 +0200730 setl noim
731 setl isk+=@ isk+=* isk+=/
732 setl magic
733 setl report=10000
734 setl sel=inclusive
735 setl nospell
736 setl tw=0
737 setl wig=
738 set cedit&
Bram Moolenaar9964e462007-05-05 17:54:07 +0000739 if g:netrw_use_noswf && has("win32") && !has("win95")
Bram Moolenaarff034192013-04-24 18:51:19 +0200740 setl noswf
Bram Moolenaar9964e462007-05-05 17:54:07 +0000741 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200742 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100743
744 " allow the user to override safe options
Bram Moolenaar8d043172014-01-23 14:24:41 +0100745" call Decho("(s:NetrwSafeOptions) ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100746 if &ft == "netrw"
Bram Moolenaar8d043172014-01-23 14:24:41 +0100747" call Decho("(s:NetrwSafeOptions) do any netrw FileType autocmds (doau FileType netrw)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200748 sil! keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100749 endif
750
Bram Moolenaar8d043172014-01-23 14:24:41 +0100751" call Decho("(s:NetrwSafeOptions) fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh)
752" call Decho("(s:NetrwSafeOptions) 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)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000753" call Dret("s:NetrwSafeOptions")
754endfun
755
Bram Moolenaar446cb832008-06-24 21:56:24 +0000756" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200757" netrw#Explore: launch the local browser in the directory of the current file {{{2
758" indx: == -1: Nexplore
759" == -2: Pexplore
760" == +: this is overloaded:
761" * If Nexplore/Pexplore is in use, then this refers to the
762" indx'th item in the w:netrw_explore_list[] of items which
763" matched the */pattern **/pattern *//pattern **//pattern
764" * If Hexplore or Vexplore, then this will override
765" g:netrw_winsize to specify the qty of rows or columns the
766" newly split window should have.
Bram Moolenaar8d043172014-01-23 14:24:41 +0100767" 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 +0200768" dosplit==1: the window will be split before running the local browser
769" style == 0: Explore style == 1: Explore!
770" == 2: Hexplore style == 3: Hexplore!
771" == 4: Vexplore style == 5: Vexplore!
772" == 6: Texplore
773fun! netrw#Explore(indx,dosplit,style,...)
774" 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("%"))
775 if !exists("b:netrw_curdir")
776 let b:netrw_curdir= getcwd()
777" call Decho("(Explore) set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
778 endif
779 let curdir = simplify(b:netrw_curdir)
780 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200781 if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
782 let curdir= substitute(curdir,'\','/','g')
783 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200784" call Decho("(Explore) curdir<".curdir."> curfiledir<".curfiledir.">")
785
786 " save registers
787 sil! let keepregstar = @*
788 sil! let keepregplus = @+
789 sil! let keepregslash= @/
790
Bram Moolenaar8d043172014-01-23 14:24:41 +0100791 " if dosplit
792 " -or- file has been modified AND file not hidden when abandoned
793 " -or- Texplore used
794 if a:dosplit || (&modified && &hidden == 0 && &bufhidden != "hide") || a:style == 6
Bram Moolenaarff034192013-04-24 18:51:19 +0200795" call Decho("(Explore) case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified")
796 call s:SaveWinVars()
797 let winsz= g:netrw_winsize
798 if a:indx > 0
799 let winsz= a:indx
800 endif
801
802 if a:style == 0 " Explore, Sexplore
803" call Decho("(Explore) style=0: Explore or Sexplore")
804 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
805 exe winsz."wincmd s"
806
807 elseif a:style == 1 "Explore!, Sexplore!
808" call Decho("(Explore) style=1: Explore! or Sexplore!")
809 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
810 exe "keepalt ".winsz."wincmd v"
811
812 elseif a:style == 2 " Hexplore
813" call Decho("(Explore) style=2: Hexplore")
814 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
815 exe "keepalt bel ".winsz."wincmd s"
816
817 elseif a:style == 3 " Hexplore!
818" call Decho("(Explore) style=3: Hexplore!")
819 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
820 exe "keepalt abo ".winsz."wincmd s"
821
822 elseif a:style == 4 " Vexplore
823" call Decho("(Explore) style=4: Vexplore")
824 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
825 exe "keepalt lefta ".winsz."wincmd v"
826
827 elseif a:style == 5 " Vexplore!
828" call Decho("(Explore) style=5: Vexplore!")
829 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
830 exe "keepalt rightb ".winsz."wincmd v"
831
832 elseif a:style == 6 " Texplore
833 call s:SaveBufVars()
834" call Decho("(Explore) style = 6: Texplore")
835 exe "keepalt tabnew ".fnameescape(curdir)
836 call s:RestoreBufVars()
837 endif
838 call s:RestoreWinVars()
839" else " Decho
840" call Decho("(Explore) case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6")
841 endif
842 keepj norm! 0
843
844 if a:0 > 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200845" call Decho("(Explore) case [a:0=".a:0."] > 0: a:1<".a:1.">")
Bram Moolenaarff034192013-04-24 18:51:19 +0200846 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
847" call Decho("(Explore) ..case a:1<".a:1.">: starts with ~ and unix or cygwin")
848 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
849" call Decho("(Explore) ..using dirname<".dirname."> (case: ~ && unix||cygwin)")
850 elseif a:1 == '.'
851" call Decho("(Explore) ..case a:1<".a:1.">: matches .")
852 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
853 if dirname !~ '/$'
854 let dirname= dirname."/"
855 endif
856" call Decho("(Explore) ..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
857 elseif a:1 =~ '\$'
858" call Decho("(Explore) ..case a:1<".a:1.">: matches ending $")
859 let dirname= simplify(expand(a:1))
860" call Decho("(Explore) ..using user-specified dirname<".dirname."> with $env-var")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200861 elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://'
Bram Moolenaarff034192013-04-24 18:51:19 +0200862" call Decho("(Explore) ..case a:1<".a:1.">: other, not pattern or filepattern")
863 let dirname= simplify(a:1)
864" call Decho("(Explore) ..using user-specified dirname<".dirname.">")
865 else
866" call Decho("(Explore) ..case a:1: pattern or filepattern")
867 let dirname= a:1
868 endif
869 else
870 " clear explore
871" call Decho("(Explore) case a:0=".a:0.": clearing Explore list")
872 call s:NetrwClearExplore()
873" call Dret("netrw#Explore : cleared list")
874 return
875 endif
876
877" call Decho("(Explore) dirname<".dirname.">")
878 if dirname =~ '\.\./\=$'
879 let dirname= simplify(fnamemodify(dirname,':p:h'))
880 elseif dirname =~ '\.\.' || dirname == '.'
881 let dirname= simplify(fnamemodify(dirname,':p'))
882 endif
883" call Decho("(Explore) dirname<".dirname."> (after simplify)")
884
885 if dirname =~ '^\*//'
886 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200887" call Decho("(Explore) case starpat=1: Explore *//pattern")
Bram Moolenaarff034192013-04-24 18:51:19 +0200888 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
889 let starpat= 1
890" call Decho("(Explore) ..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
891 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
892
893 elseif dirname =~ '^\*\*//'
894 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200895" call Decho("(Explore) case starpat=2: Explore **//pattern")
Bram Moolenaarff034192013-04-24 18:51:19 +0200896 let pattern= substitute(dirname,'^\*\*//','','')
897 let starpat= 2
898" call Decho("(Explore) ..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
899
900 elseif dirname =~ '/\*\*/'
901 " handle .../**/.../filepat
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200902" call Decho("(Explore) case starpat=4: Explore .../**/.../filepat")
Bram Moolenaarff034192013-04-24 18:51:19 +0200903 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
904 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
905 let b:netrw_curdir = prefixdir
906 else
907 let b:netrw_curdir= getcwd().'/'.prefixdir
908 endif
909 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
910 let starpat= 4
911" call Decho("(Explore) ..pwd<".getcwd()."> dirname<".dirname.">")
912" call Decho("(Explore) ..case Explore ../**/../filepat (starpat=".starpat.")")
913
914 elseif dirname =~ '^\*/'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200915 " case starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaarff034192013-04-24 18:51:19 +0200916 let starpat= 3
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200917" call Decho("(Explore) case starpat=3: Explore */filepat (starpat=".starpat.")")
Bram Moolenaarff034192013-04-24 18:51:19 +0200918
919 elseif dirname=~ '^\*\*/'
920 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
921 let starpat= 4
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200922" call Decho("(Explore) case starpat=4: Explore **/filepat (starpat=".starpat.")")
Bram Moolenaarff034192013-04-24 18:51:19 +0200923
924 else
925 let starpat= 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200926" call Decho("(Explore) case starpat=0: default")
Bram Moolenaarff034192013-04-24 18:51:19 +0200927 endif
928
929 if starpat == 0 && a:indx >= 0
930 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200931" call Decho("(Explore) case starpat==0 && a:indx=".a:indx.": dirname<".dirname.">, handles Explore Hexplore Vexplore Sexplore")
Bram Moolenaarff034192013-04-24 18:51:19 +0200932 if dirname == ""
933 let dirname= curfiledir
934" call Decho("(Explore) ..empty dirname, using current file's directory<".dirname.">")
935 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200936 if dirname =~ '^scp://' || dirname =~ '^ftp://'
937 call netrw#Nread(2,dirname)
938 "call s:NetrwBrowse(0,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200939 else
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200940 if dirname == ""
941 let dirname= getcwd()
942 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
943 if dirname !~ '^[a-zA-Z]:'
944 let dirname= b:netrw_curdir."/".dirname
945 endif
946 elseif dirname !~ '^/'
947 let dirname= b:netrw_curdir."/".dirname
948 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200949" call Decho("(Explore) ..calling LocalBrowseCheck(dirname<".dirname.">)")
950 call netrw#LocalBrowseCheck(dirname)
951" call Decho("(Explore) win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
952 endif
953 if exists("w:netrw_bannercnt")
954 " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
955 " If one wants to return the same place in the netrw window, use :Rex instead.
956 exe w:netrw_bannercnt
957 endif
958
959" call Decho("(Explore) curdir<".curdir.">")
960 " ---------------------------------------------------------------------
961 " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest
962" if has("win32") || has("win95") || has("win64") || has("win16")
963" keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
964" else
965" keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
966" endif
967 " ---------------------------------------------------------------------
968
969 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
970 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
971 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
972 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
973 elseif a:indx <= 0
974 " Nexplore, Pexplore, Explore: handle starpat
975" call Decho("(Explore) case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx)
976 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
977" call Decho("(Explore) ..set up <s-up> and <s-down> maps")
978 let s:didstarstar= 1
979 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
980 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
981 endif
982
983 if has("path_extra")
984" call Decho("(Explore) ..starpat=".starpat.": has +path_extra")
985 if !exists("w:netrw_explore_indx")
986 let w:netrw_explore_indx= 0
987 endif
988
989 let indx = a:indx
990" call Decho("(Explore) ..starpat=".starpat.": set indx= [a:indx=".indx."]")
991
992 if indx == -1
993 " Nexplore
994" call Decho("(Explore) ..case Nexplore with starpat=".starpat.": (indx=".indx.")")
995 if !exists("w:netrw_explore_list") " sanity check
996 keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
997 sil! let @* = keepregstar
998 sil! let @+ = keepregstar
999 sil! let @/ = keepregslash
1000" call Dret("netrw#Explore")
1001 return
1002 endif
1003 let indx= w:netrw_explore_indx
1004 if indx < 0 | let indx= 0 | endif
1005 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
1006 let curfile= w:netrw_explore_list[indx]
1007" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
1008 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
1009 let indx= indx + 1
1010" call Decho("(Explore) ....indx=".indx." (Nexplore while loop)")
1011 endwhile
1012 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
1013" call Decho("(Explore) ....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
1014
1015 elseif indx == -2
1016 " Pexplore
1017" call Decho("(Explore) case Pexplore with starpat=".starpat.": (indx=".indx.")")
1018 if !exists("w:netrw_explore_list") " sanity check
1019 keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
1020 sil! let @* = keepregstar
1021 sil! let @+ = keepregstar
1022 sil! let @/ = keepregslash
1023" call Dret("netrw#Explore")
1024 return
1025 endif
1026 let indx= w:netrw_explore_indx
1027 if indx < 0 | let indx= 0 | endif
1028 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
1029 let curfile= w:netrw_explore_list[indx]
1030" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
1031 while indx >= 0 && curfile == w:netrw_explore_list[indx]
1032 let indx= indx - 1
1033" call Decho("(Explore) ....indx=".indx." (Pexplore while loop)")
1034 endwhile
1035 if indx < 0 | let indx= 0 | endif
1036" call Decho("(Explore) ....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
1037
1038 else
1039 " Explore -- initialize
1040 " build list of files to Explore with Nexplore/Pexplore
1041" call Decho("(Explore) ..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
1042 keepj keepalt call s:NetrwClearExplore()
1043 let w:netrw_explore_indx= 0
1044 if !exists("b:netrw_curdir")
1045 let b:netrw_curdir= getcwd()
1046 endif
1047" call Decho("(Explore) ....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
1048
1049 " switch on starpat to build the w:netrw_explore_list of files
1050 if starpat == 1
1051 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
1052" call Decho("(Explore) ..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls)
1053" call Decho("(Explore) ....pattern<".pattern.">")
1054 try
1055 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
1056 catch /^Vim\%((\a\+)\)\=:E480/
1057 keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
1058" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
1059 return
1060 endtry
1061 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
1062 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1063
1064 elseif starpat == 2
1065 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
1066" call Decho("(Explore) ..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)")
1067" call Decho("(Explore) ....pattern<".pattern.">")
1068 try
1069 exe "sil keepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
1070 catch /^Vim\%((\a\+)\)\=:E480/
1071 keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
1072 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1073 sil! let @* = keepregstar
1074 sil! let @+ = keepregstar
1075 sil! let @/ = keepregslash
1076" call Dret("netrw#Explore : no files matched pattern")
1077 return
1078 endtry
1079 let s:netrw_curdir = b:netrw_curdir
1080 let w:netrw_explore_list = getqflist()
1081 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
1082 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1083
1084 elseif starpat == 3
1085 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
1086" call Decho("(Explore) ..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls)
1087 let filepat= substitute(dirname,'^\*/','','')
1088 let filepat= substitute(filepat,'^[%#<]','\\&','')
1089" call Decho("(Explore) ....b:netrw_curdir<".b:netrw_curdir.">")
1090" call Decho("(Explore) ....filepat<".filepat.">")
1091 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
1092 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
1093
1094 elseif starpat == 4
1095 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
1096" call Decho("(Explore) ..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls)
1097 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
1098 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
1099 endif " switch on starpat to build w:netrw_explore_list
1100
1101 let w:netrw_explore_listlen = len(w:netrw_explore_list)
1102" call Decho("(Explore) ....w:netrw_explore_list<".string(w:netrw_explore_list).">")
1103" call Decho("(Explore) ....w:netrw_explore_listlen=".w:netrw_explore_listlen)
1104
1105 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
1106 keepalt keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
1107 sil! let @* = keepregstar
1108 sil! let @+ = keepregstar
1109 sil! let @/ = keepregslash
1110" call Dret("netrw#Explore : no files matched")
1111 return
1112 endif
1113 endif " if indx ... endif
1114
1115 " NetrwStatusLine support - for exploring support
1116 let w:netrw_explore_indx= indx
1117" call Decho("(Explore) ....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
1118
1119 " wrap the indx around, but issue a note
1120 if indx >= w:netrw_explore_listlen || indx < 0
1121" call Decho("(Explore) ....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
1122 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
1123 let w:netrw_explore_indx= indx
1124 keepalt keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
1125 endif
1126
1127 exe "let dirfile= w:netrw_explore_list[".indx."]"
1128" call Decho("(Explore) ....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
1129 let newdir= substitute(dirfile,'/[^/]*$','','e')
1130" call Decho("(Explore) ....newdir<".newdir.">")
1131
1132" call Decho("(Explore) ....calling LocalBrowseCheck(newdir<".newdir.">)")
1133 call netrw#LocalBrowseCheck(newdir)
1134 if !exists("w:netrw_liststyle")
1135 let w:netrw_liststyle= g:netrw_liststyle
1136 endif
1137 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
1138 keepalt keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
1139 else
1140 keepalt keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
1141 endif
1142 let w:netrw_explore_mtchcnt = indx + 1
1143 let w:netrw_explore_bufnr = bufnr("%")
1144 let w:netrw_explore_line = line(".")
1145 keepalt keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
1146" call Decho("(Explore) ....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
1147
1148 else
1149" call Decho("(Explore) ..your vim does not have +path_extra")
1150 if !exists("g:netrw_quiet")
1151 keepalt keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
1152 endif
1153 sil! let @* = keepregstar
1154 sil! let @+ = keepregstar
1155 sil! let @/ = keepregslash
1156" call Dret("netrw#Explore : missing +path_extra")
1157 return
1158 endif
1159
1160 else
1161" call Decho("(Explore) ..default case: Explore newdir<".dirname.">")
1162 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
1163 sil! unlet w:netrw_treedict
1164 sil! unlet w:netrw_treetop
1165 endif
1166 let newdir= dirname
1167 if !exists("b:netrw_curdir")
1168 keepj call netrw#LocalBrowseCheck(getcwd())
1169 else
1170 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
1171 endif
1172 endif
1173
1174 " visual display of **/ **// */ Exploration files
1175" call Decho("(Explore) w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
1176" call Decho("(Explore) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
1177 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
1178" call Decho("(Explore) s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
1179 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01001180 " only update match list when current directory isn't the same as before
1181" call Decho("(Explore) only update match list when current directory not the same as before")
Bram Moolenaarff034192013-04-24 18:51:19 +02001182 let s:explore_prvdir = b:netrw_curdir
1183 let s:explore_match = ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01001184 let dirlen = strlen(b:netrw_curdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02001185 if b:netrw_curdir !~ '/$'
1186 let dirlen= dirlen + 1
1187 endif
1188 let prvfname= ""
1189 for fname in w:netrw_explore_list
1190" call Decho("(Explore) fname<".fname.">")
1191 if fname =~ '^'.b:netrw_curdir
1192 if s:explore_match == ""
1193 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1194 else
1195 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1196 endif
1197 elseif fname !~ '^/' && fname != prvfname
1198 if s:explore_match == ""
1199 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
1200 else
1201 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
1202 endif
1203 endif
1204 let prvfname= fname
1205 endfor
1206" call Decho("(Explore) explore_match<".s:explore_match.">")
1207 exe "2match netrwMarkFile /".s:explore_match."/"
1208 endif
1209 echo "<s-up>==Pexplore <s-down>==Nexplore"
1210 else
1211 2match none
1212 if exists("s:explore_match") | unlet s:explore_match | endif
1213 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
1214 echo " "
1215" call Decho("(Explore) cleared explore match list")
1216 endif
1217
1218 sil! let @* = keepregstar
1219 sil! let @+ = keepregstar
1220 sil! let @/ = keepregslash
1221" call Dret("netrw#Explore : @/<".@/.">")
1222endfun
1223
1224" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01001225" netrw#Lexplore: toggle Explorer window, keeping it on the left of the current tab {{{2
1226fun! netrw#Lexplore(...)
1227" call Dfunc("netrw#Lexplore() a:0=".a:0)
1228 if exists("t:netrw_lexbufnr")
1229 " close down netrw explorer window
1230 let lexwinnr = bufwinnr(t:netrw_lexbufnr)
1231 if lexwinnr != -1
1232 let curwin = winnr()
1233 exe lexwinnr."wincmd w"
1234 close
1235 exe curwin."wincmd w"
1236 endif
1237 unlet t:netrw_lexbufnr
1238
1239 else
1240 " open netrw explorer window
1241 exe "1wincmd w"
1242 let keep_altv = g:netrw_altv
1243 let g:netrw_altv = 0
1244 if a:0 > 0 && a:1 != ""
1245 Vexplore a:1
1246 else
1247 Vexplore .
1248 endif
1249 let g:netrw_altv = keep_altv
1250 let t:netrw_lexbufnr = bufnr("%")
1251 endif
1252" call Dret("netrw#Lexplore")
1253endfun
1254
1255" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02001256" netrw#NetrwMakeTgt: make a target out of the directory name provided {{{2
1257fun! netrw#NetrwMakeTgt(dname)
1258" call Dfunc("netrw#NetrwMakeTgt(dname<".a:dname.">)")
1259 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
1260 let svpos = netrw#NetrwSavePosn()
1261 let s:netrwmftgt_islocal= (a:dname !~ '^\a\+://')
1262" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal)
1263 if s:netrwmftgt_islocal
1264 let netrwmftgt= simplify(a:dname)
1265 else
1266 let netrwmftgt= a:dname
1267 endif
1268 if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
1269 " re-selected target, so just clear it
1270 unlet s:netrwmftgt s:netrwmftgt_islocal
1271 else
1272 let s:netrwmftgt= netrwmftgt
1273 endif
1274 if g:netrw_fastbrowse <= 1
1275 call s:NetrwRefresh((b:netrw_curdir !~ '\a\+://'),b:netrw_curdir)
1276 endif
1277 call netrw#NetrwRestorePosn(svpos)
1278" call Dret("netrw#NetrwMakeTgt")
1279endfun
1280
1281" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001282" netrw#NetrwClean: remove netrw {{{2
1283" supports :NetrwClean -- remove netrw from first directory on runtimepath
1284" :NetrwClean! -- remove netrw from all directories on runtimepath
1285fun! netrw#NetrwClean(sys)
1286" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
1287
1288 if a:sys
1289 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
1290 else
1291 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
1292 endif
1293" call Decho("choice=".choice)
1294 let diddel= 0
1295 let diddir= ""
1296
1297 if choice == 1
1298 for dir in split(&rtp,',')
1299 if filereadable(dir."/plugin/netrwPlugin.vim")
1300" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001301 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
1302 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
1303 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
1304 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
1305 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
1306 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 +00001307 let diddir= dir
1308 let diddel= diddel + 1
1309 if !a:sys|break|endif
1310 endif
1311 endfor
1312 endif
1313
1314 echohl WarningMsg
1315 if diddel == 0
1316 echomsg "netrw is either not installed or not removable"
1317 elseif diddel == 1
1318 echomsg "removed one copy of netrw from <".diddir.">"
1319 else
1320 echomsg "removed ".diddel." copies of netrw"
1321 endif
1322 echohl None
1323
1324" call Dret("netrw#NetrwClean")
1325endfun
1326
Bram Moolenaar5c736222010-01-06 20:54:52 +01001327" ---------------------------------------------------------------------
1328" netrw#Nread: {{{2
1329fun! netrw#Nread(mode,fname)
1330" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
1331 call netrw#NetrwSavePosn()
1332 call netrw#NetRead(a:mode,a:fname)
1333 call netrw#NetrwRestorePosn()
1334" call Dret("netrw#Nread")
1335endfun
1336
Bram Moolenaar9964e462007-05-05 17:54:07 +00001337" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02001338" netrw#NetrwObtain: {{{2
1339" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
1340" islocal=0 obtain from remote source
1341" =1 obtain from local source
1342" fname : a filename or a list of filenames
1343" tgtdir : optional place where files are to go (not present, uses getcwd())
1344fun! netrw#NetrwObtain(islocal,fname,...)
1345" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
1346 " NetrwStatusLine support - for obtaining support
1347
1348 if type(a:fname) == 1
1349 let fnamelist= [ a:fname ]
1350 elseif type(a:fname) == 3
1351 let fnamelist= a:fname
1352 else
1353 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
1354" call Dret("netrw#NetrwObtain")
1355 return
1356 endif
1357" call Decho("fnamelist<".string(fnamelist).">")
1358 if a:0 > 0
1359 let tgtdir= a:1
1360 else
1361 let tgtdir= getcwd()
1362 endif
1363" call Decho("tgtdir<".tgtdir.">")
1364
1365 if exists("b:netrw_islocal") && b:netrw_islocal
1366 " obtain a file from local b:netrw_curdir to (local) tgtdir
1367" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
1368 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
1369 let topath= s:ComposePath(tgtdir,"")
1370 if (has("win32") || has("win95") || has("win64") || has("win16"))
1371 " transfer files one at time
1372" call Decho("transfer files one at a time")
1373 for fname in fnamelist
1374" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
1375 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1376 if v:shell_error != 0
1377 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1378" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1379 return
1380 endif
1381 endfor
1382 else
1383 " transfer files with one command
1384" call Decho("transfer files with one command")
1385 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
1386" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
1387 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1388 if v:shell_error != 0
1389 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1390" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1391 return
1392 endif
1393 endif
1394 elseif !exists("b:netrw_curdir")
1395 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
1396 else
1397 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
1398 endif
1399
1400 else
1401 " obtain files from remote b:netrw_curdir to local tgtdir
1402" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
1403 if type(a:fname) == 1
1404 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
1405 endif
1406 call s:NetrwMethod(b:netrw_curdir)
1407
1408 if b:netrw_method == 4
1409 " obtain file using scp
1410" call Decho("obtain via scp (method#4)")
1411 if exists("g:netrw_port") && g:netrw_port != ""
1412 let useport= " ".g:netrw_scpport." ".g:netrw_port
1413 else
1414 let useport= ""
1415 endif
1416 if b:netrw_fname =~ '/'
1417 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
1418 else
1419 let path= ""
1420 endif
1421 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
1422" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
1423 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
1424
1425 elseif b:netrw_method == 2
1426 " obtain file using ftp + .netrc
1427" call Decho("obtain via ftp+.netrc (method #2)")
1428 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1429 let tmpbufnr= bufnr("%")
1430 setl ff=unix
1431 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1432 keepj put =g:netrw_ftpmode
1433" call Decho("filter input: ".getline('$'))
1434 endif
1435
1436 if exists("b:netrw_fname") && b:netrw_fname != ""
1437 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1438" call Decho("filter input: ".getline('$'))
1439 endif
1440
1441 if exists("g:netrw_ftpextracmd")
1442 keepj put =g:netrw_ftpextracmd
1443" call Decho("filter input: ".getline('$'))
1444 endif
1445 for fname in fnamelist
1446 call setline(line("$")+1,'get "'.fname.'"')
1447" call Decho("filter input: ".getline('$'))
1448 endfor
1449 if exists("g:netrw_port") && g:netrw_port != ""
1450" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1451 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
1452 else
1453" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1454 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
1455 endif
1456 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1457 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1458 let debugkeep= &debug
1459 setl debug=msg
1460 call netrw#ErrorMsg(s:ERROR,getline(1),4)
1461 let &debug= debugkeep
1462 endif
1463
1464 elseif b:netrw_method == 3
1465 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
1466" call Decho("obtain via ftp+mipf (method #3)")
1467 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1468 let tmpbufnr= bufnr("%")
1469 setl ff=unix
1470
1471 if exists("g:netrw_port") && g:netrw_port != ""
1472 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
1473" call Decho("filter input: ".getline('$'))
1474 else
1475 keepj put ='open '.g:netrw_machine
1476" call Decho("filter input: ".getline('$'))
1477 endif
1478
1479 if exists("g:netrw_uid") && g:netrw_uid != ""
1480 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1481 keepj put =g:netrw_uid
1482" call Decho("filter input: ".getline('$'))
1483 if exists("s:netrw_passwd") && s:netrw_passwd != ""
1484 keepj put ='\"'.s:netrw_passwd.'\"'
1485 endif
1486" call Decho("filter input: ".getline('$'))
1487 elseif exists("s:netrw_passwd")
1488 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1489" call Decho("filter input: ".getline('$'))
1490 endif
1491 endif
1492
1493 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1494 keepj put =g:netrw_ftpmode
1495" call Decho("filter input: ".getline('$'))
1496 endif
1497
1498 if exists("b:netrw_fname") && b:netrw_fname != ""
1499 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1500" call Decho("filter input: ".getline('$'))
1501 endif
1502
1503 if exists("g:netrw_ftpextracmd")
1504 keepj put =g:netrw_ftpextracmd
1505" call Decho("filter input: ".getline('$'))
1506 endif
1507
1508 if exists("g:netrw_ftpextracmd")
1509 keepj put =g:netrw_ftpextracmd
1510" call Decho("filter input: ".getline('$'))
1511 endif
1512 for fname in fnamelist
1513 keepj call setline(line("$")+1,'get "'.fname.'"')
1514 endfor
1515" call Decho("filter input: ".getline('$'))
1516
1517 " perform ftp:
1518 " -i : turns off interactive prompting from ftp
1519 " -n unix : DON'T use <.netrc>, even though it exists
1520 " -n win32: quit being obnoxious about password
1521 keepj norm! 1Gdd
1522" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1523 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
1524 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1525 if getline(1) !~ "^$"
1526" call Decho("error<".getline(1).">")
1527 if !exists("g:netrw_quiet")
1528 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
1529 endif
1530 endif
1531 elseif !exists("b:netrw_method") || b:netrw_method < 0
1532" call Dfunc("netrw#NetrwObtain : unsupported method")
1533 return
1534 endif
1535
1536 " restore status line
1537 if type(a:fname) == 1 && exists("s:netrw_users_stl")
1538 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
1539 endif
1540
1541 endif
1542
1543 " cleanup
1544 if exists("tmpbufnr")
1545 if bufnr("%") != tmpbufnr
1546 exe tmpbufnr."bw!"
1547 else
1548 q!
1549 endif
1550 endif
1551
1552" call Dret("netrw#NetrwObtain")
1553endfun
1554
1555" ---------------------------------------------------------------------
1556" NetrwStatusLine: {{{2
1557fun! NetrwStatusLine()
1558
1559" vvv NetrwStatusLine() debugging vvv
1560" let g:stlmsg=""
1561" if !exists("w:netrw_explore_bufnr")
1562" let g:stlmsg="!X<explore_bufnr>"
1563" elseif w:netrw_explore_bufnr != bufnr("%")
1564" let g:stlmsg="explore_bufnr!=".bufnr("%")
1565" endif
1566" if !exists("w:netrw_explore_line")
1567" let g:stlmsg=" !X<explore_line>"
1568" elseif w:netrw_explore_line != line(".")
1569" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
1570" endif
1571" if !exists("w:netrw_explore_list")
1572" let g:stlmsg=" !X<explore_list>"
1573" endif
1574" ^^^ NetrwStatusLine() debugging ^^^
1575
1576 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")
1577 " restore user's status line
1578 let &stl = s:netrw_users_stl
1579 let &laststatus = s:netrw_users_ls
1580 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
1581 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
1582 return ""
1583 else
1584 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
1585 endif
1586endfun
1587
1588" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001589" Netrw Transfer Functions: {{{1
1590" ===============================
1591
Bram Moolenaar071d4272004-06-13 20:20:40 +00001592" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001593" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001594" mode: =0 read remote file and insert before current line
1595" =1 read remote file and insert after current line
1596" =2 replace with remote file
1597" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001598fun! netrw#NetRead(mode,...)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001599" 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 +00001600
Bram Moolenaar5c736222010-01-06 20:54:52 +01001601 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001602 call s:NetrwOptionSave("w:")
1603 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001604 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001605
Bram Moolenaar5c736222010-01-06 20:54:52 +01001606 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001607 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001608 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001609 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001610 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001611 elseif a:mode == 2 " replace with remote file
1612 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +00001613 elseif a:mode == 3 " skip read of file (leave as temporary)
1614 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001615 else
1616 exe a:mode
1617 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001618 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001619 let ichoice = (a:0 == 0)? 0 : 1
1620" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
1621
Bram Moolenaar5c736222010-01-06 20:54:52 +01001622 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001623 let tmpfile= s:GetTempfile("")
1624 if tmpfile == ""
1625" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001626 return
1627 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001628
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001629 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001630
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001631 " attempt to repeat with previous host-file-etc
1632 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001633" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001634 let choice = b:netrw_lastfile
1635 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001636
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001637 else
1638 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001639" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001640
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001641 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001642 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001643 echomsg 'NetRead Usage:'
1644 echomsg ':Nread machine:path uses rcp'
1645 echomsg ':Nread "machine path" uses ftp with <.netrc>'
1646 echomsg ':Nread "machine id password path" uses ftp'
1647 echomsg ':Nread dav://machine[:port]/path uses cadaver'
1648 echomsg ':Nread fetch://machine/path uses fetch'
1649 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1650 echomsg ':Nread http://[user@]machine/path uses http wget'
1651 echomsg ':Nread rcp://[user@]machine/path uses rcp'
1652 echomsg ':Nread rsync://machine[:port]/path uses rsync'
1653 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
1654 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001655 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001656 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001657
Bram Moolenaar9964e462007-05-05 17:54:07 +00001658 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001659 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001660" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001661 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001662 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +02001663 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001664 else
1665 " case "... ... ..."
1666 let choice = strpart(choice,1,strlen(choice)-1)
1667 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001668
Bram Moolenaar9964e462007-05-05 17:54:07 +00001669 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001670 let wholechoice = wholechoice . " " . choice
1671 let ichoice = ichoice + 1
1672 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001673 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001674 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001675 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001676" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001677 return
1678 endif
1679 let choice= a:{ichoice}
1680 endwhile
1681 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1682 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001683 endif
1684 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001685
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001686" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001687 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001688
Bram Moolenaar5c736222010-01-06 20:54:52 +01001689 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001690 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001691 if !exists("b:netrw_method") || b:netrw_method < 0
1692" call Dfunc("netrw#NetRead : unsupported method")
1693 return
1694 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001695 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001696
Bram Moolenaar8d043172014-01-23 14:24:41 +01001697 " Check whether or not NetrwBrowse() should be handling this request
Bram Moolenaar446cb832008-06-24 21:56:24 +00001698" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02001699 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001700" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001701 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001702" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001703 return
Bram Moolenaar071d4272004-06-13 20:20:40 +00001704 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001705
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001706 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001707 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001708 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001709 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1710 echo "(netrw) Processing your read request..."
1711 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001712
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001713 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001714 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001715 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001716" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +00001717 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001718 " ER: on Win2K" rcp machine[.user]:file tmpfile
Bram Moolenaar8d043172014-01-23 14:24:41 +01001719 " ER: when machine contains '.' adding .user is required (use $USERNAME)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001720 " ER: the tmpfile is full path: rcp sees C:\... as host C
1721 if s:netrw_has_nt_rcp == 1
1722 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1723 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1724 else
1725 " Any way needed it machine contains a '.'
1726 let uid_machine = g:netrw_machine .'.'. $USERNAME
1727 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001728 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001729 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1730 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1731 else
1732 let uid_machine = g:netrw_machine
1733 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001734 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001735" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01001736 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001737 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001738 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001739
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001740 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001741 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001742 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001743" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +00001744 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02001745 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001746 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02001747 setl ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001748 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001749" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001750 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001751 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001752" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001753 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001754 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
1755" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001756 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001757" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1758 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001759 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02001760" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1761 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001762 endif
1763 " 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 +00001764 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +00001765 let debugkeep = &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02001766 setl debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +02001767 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001768 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001769 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +00001770 call s:SaveBufVars()
1771 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01001772 if bufname("%") == "" && getline("$") == "" && line('$') == 1
1773 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +00001774 q!
1775 endif
1776 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001777 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001778 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001779
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001780 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001781 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001782 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
1783 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001784" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001785 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001786 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001787 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02001788 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001789 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001790 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001791" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001792 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001793 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001794" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001795 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001796
Bram Moolenaar97d62492012-11-15 21:28:22 +01001797 if exists("g:netrw_uid") && g:netrw_uid != ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001798 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1799 keepj put =g:netrw_uid
1800" call Decho("filter input: ".getline('.'))
1801 if exists("s:netrw_passwd")
1802 keepj put ='\"'.s:netrw_passwd.'\"'
1803 endif
1804" call Decho("filter input: ".getline('.'))
1805 elseif exists("s:netrw_passwd")
1806 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1807" call Decho("filter input: ".getline('.'))
1808 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001809 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001810
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001811 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001812 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00001813" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001814 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001815 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001816 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001817" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001818 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001819 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001820" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001821
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001822 " perform ftp:
1823 " -i : turns off interactive prompting from ftp
1824 " -n unix : DON'T use <.netrc>, even though it exists
1825 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +02001826 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001827" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1828 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001829 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1830 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001831" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001832 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001833 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001834 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001835 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001836 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
1837 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001838 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001839
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001840 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001841 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001842 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001843" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001844 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00001845 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001846 else
1847 let useport= ""
1848 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001849" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001850 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001851 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001852 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001853
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001854 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001855 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001856 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001857" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001858 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001859 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001860 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001861 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001862" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001863 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001864 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001865
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001866 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
1867 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001868" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001869 if exists("g:netrw_http_xcmd")
1870" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1))
1871 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
1872 else
1873" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
1874 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
1875 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001876 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001877
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001878 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001879 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001880" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001881 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
1882 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001883" call Decho("netrw_html<".netrw_html.">")
1884" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001885" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
1886 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001887 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001888" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001889 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001890 endif
1891 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001892" call Decho("(NetRead) setl ro")
1893 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001894
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001895 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001896 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001897 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001898" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001899
Bram Moolenaar5c736222010-01-06 20:54:52 +01001900 if !executable(g:netrw_dav_cmd)
1901 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
1902" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
1903 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001904 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001905 if g:netrw_dav_cmd =~ "curl"
1906" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
1907 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
1908 else
1909 " Construct execution string (four lines) which will be passed through filter
1910 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1911 new
Bram Moolenaarff034192013-04-24 18:51:19 +02001912 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001913 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001914 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01001915 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001916 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01001917 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001918 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
1919 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
1920 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001921 keepj put ='get '.netrw_fname.' '.tmpfile
1922 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001923
Bram Moolenaar5c736222010-01-06 20:54:52 +01001924 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001925 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001926" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001927 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1928 bd!
1929 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001930 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001931 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001932
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001933 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001934 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001935 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001936" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001937" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1938 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001939 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001940 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001941
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001942 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001943 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001944 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001945 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +00001946" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001947 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001948 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001949 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001950 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001951" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001952 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001953 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02001954 if exists("g:netrw_option") && g:netrw_option == ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001955 let netrw_option= "http"
1956 else
1957 let netrw_option= "ftp"
1958 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001959" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001960
Bram Moolenaar446cb832008-06-24 21:56:24 +00001961 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001962" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1))
1963 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001964 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00001965" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
1966 exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001967 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001968
Bram Moolenaar446cb832008-06-24 21:56:24 +00001969 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001970 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001971" call Decho("(NetRead) setl ro")
1972 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001973
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001974 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001975 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001976 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001977" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001978" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1979 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001980 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001981 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001982
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001983 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001984 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001985 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001986 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001987 endif
1988 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001989
Bram Moolenaar5c736222010-01-06 20:54:52 +01001990 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001991 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001992" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001993 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001994 unlet b:netrw_fname
1995 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001996 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001997" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001998 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001999 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002000 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002001
Bram Moolenaar9964e462007-05-05 17:54:07 +00002002" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002003endfun
2004
2005" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002006" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002007fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00002008" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002009
Bram Moolenaar5c736222010-01-06 20:54:52 +01002010 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002011 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002012 call s:NetrwOptionSave("w:")
2013 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002014
Bram Moolenaar5c736222010-01-06 20:54:52 +01002015 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00002016 let tmpfile= s:GetTempfile("")
2017 if tmpfile == ""
2018" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002019 return
2020 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002021
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002022 if a:0 == 0
2023 let ichoice = 0
2024 else
2025 let ichoice = 1
2026 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002027
Bram Moolenaar9964e462007-05-05 17:54:07 +00002028 let curbufname= expand("%")
2029" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002030 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00002031 " For binary writes, always write entire file.
2032 " (line numbers don't really make sense for that).
2033 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02002034" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
2035 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002036 elseif g:netrw_cygwin
2037 " write (selected portion of) file to temporary
Bram Moolenaar8d043172014-01-23 14:24:41 +01002038 let cygtmpfile= substitute(tmpfile,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02002039" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002040 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002041 else
2042 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02002043" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002044 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002045 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002046
Bram Moolenaar9964e462007-05-05 17:54:07 +00002047 if curbufname == ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01002048 " when the file is [No Name], and one attempts to Nwrite it, the buffer takes
Bram Moolenaar9964e462007-05-05 17:54:07 +00002049 " on the temporary file's name. Deletion of the temporary file during
2050 " cleanup then causes an error message.
2051 0file!
2052 endif
2053
Bram Moolenaar5c736222010-01-06 20:54:52 +01002054 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002055 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002056
Bram Moolenaar9964e462007-05-05 17:54:07 +00002057 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002058 " attempt to repeat with previous host-file-etc
2059 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002060" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002061 let choice = b:netrw_lastfile
2062 let ichoice= ichoice + 1
2063 else
2064 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002065
Bram Moolenaar8d043172014-01-23 14:24:41 +01002066 " Reconstruct Choice when choice starts with '"'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002067 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002068 echomsg 'NetWrite Usage:"'
2069 echomsg ':Nwrite machine:path uses rcp'
2070 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
2071 echomsg ':Nwrite "machine id password path" uses ftp'
2072 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
2073 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
2074 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
2075 echomsg ':Nwrite rcp://machine/path uses rcp'
2076 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
2077 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
2078 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002079 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002080 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002081
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002082 elseif match(choice,"^\"") != -1
2083 if match(choice,"\"$") != -1
2084 " case "..."
2085 let choice=strpart(choice,1,strlen(choice)-2)
2086 else
2087 " case "... ... ..."
2088 let choice = strpart(choice,1,strlen(choice)-1)
2089 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002090
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002091 while match(choice,"\"$") == -1
2092 let wholechoice= wholechoice . " " . choice
2093 let ichoice = ichoice + 1
2094 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002095 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002096 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002097 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002098" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002099 return
2100 endif
2101 let choice= a:{ichoice}
2102 endwhile
2103 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2104 endif
2105 endif
2106 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002107 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002108" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002109
Bram Moolenaar9964e462007-05-05 17:54:07 +00002110 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02002111 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002112 if !exists("b:netrw_method") || b:netrw_method < 0
2113" call Dfunc("netrw#NetWrite : unsupported method")
2114 return
2115 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002116
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002117 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01002118 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002119 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002120 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2121 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00002122" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002123 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002124
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002125 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002126 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002127 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002128" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002129 if s:netrw_has_nt_rcp == 1
2130 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2131 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2132 else
2133 let uid_machine = g:netrw_machine .'.'. $USERNAME
2134 endif
2135 else
2136 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2137 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2138 else
2139 let uid_machine = g:netrw_machine
2140 endif
2141 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00002142" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
2143 exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002144 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002145
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002146 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002147 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002148 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002149" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002150 let netrw_fname = b:netrw_fname
2151
2152 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2153 let bhkeep = &l:bh
2154 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002155 setl bh=hide
2156 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002157
Bram Moolenaar446cb832008-06-24 21:56:24 +00002158" call Decho("filter input window#".winnr())
Bram Moolenaarff034192013-04-24 18:51:19 +02002159 setl ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002160 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002161" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002162 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002163 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002164" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002165 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002166 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002167" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002168 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02002169" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
2170 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002171 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002172" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02002173" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
2174 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002175 endif
2176 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2177 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002178 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002179 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002180 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002181 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002182 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002183
2184 " remove enew buffer (quietly)
2185 let filtbuf= bufnr("%")
2186 exe curbuf."b!"
2187 let &l:bh = bhkeep
2188 exe filtbuf."bw!"
2189
Bram Moolenaar071d4272004-06-13 20:20:40 +00002190 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002191
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002192 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002193 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002194 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002195 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00002196" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002197 let netrw_fname = b:netrw_fname
2198 let bhkeep = &l:bh
2199
2200 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2201 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002202 setl bh=hide
2203 keepalt enew
2204 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002205
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002206 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002207 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00002208" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002209 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002210 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00002211" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002212 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002213 if exists("g:netrw_uid") && g:netrw_uid != ""
2214 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2215 keepj put =g:netrw_uid
2216" call Decho("filter input: ".getline('.'))
2217 if exists("s:netrw_passwd") && s:netrw_passwd != ""
2218 keepj put ='\"'.s:netrw_passwd.'\"'
2219 endif
2220" call Decho("filter input: ".getline('.'))
2221 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
2222 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
2223" call Decho("filter input: ".getline('.'))
2224 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002225 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002226 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01002227" call Decho("filter input: ".getline('$'))
2228 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002229 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002230" call Decho("filter input: ".getline("$"))
2231 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002232 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002233" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002234 " save choice/id/password for future use
2235 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002236
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002237 " perform ftp:
2238 " -i : turns off interactive prompting from ftp
2239 " -n unix : DON'T use <.netrc>, even though it exists
2240 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002241 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002242" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
2243 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002244 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2245 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002246 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002247 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002248 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002249 let mod=1
2250 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002251
2252 " remove enew buffer (quietly)
2253 let filtbuf= bufnr("%")
2254 exe curbuf."b!"
2255 let &l:bh= bhkeep
2256 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002257
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002258 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002259 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002260 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00002261" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002262 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00002263 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002264 else
2265 let useport= ""
2266 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00002267" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2268 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002269 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002270
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002271 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002272 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002273 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00002274" call Decho("write via http (method #5)")
Bram Moolenaar8d043172014-01-23 14:24:41 +01002275 let curl= substitute(g:netrw_http_put_cmd,'\s\+.*$',"","")
2276 if executable(curl)
2277 let url= g:netrw_choice
2278" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_put_cmd." ".shellescape(tmpfile,1)." ".shellescape(url,1) )
2279 exe s:netrw_silentxfer."!".g:netrw_http_put_cmd." ".shellescape(tmpfile,1)." ".shellescape(url,1)
2280 elseif !exists("g:netrw_quiet")
2281 call netrw#ErrorMsg(s:ERROR,"can't write to http using <".g:netrw_http_put_cmd".">".",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002282 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002283
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002284 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002285 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002286 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002287" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002288
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002289 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01002290 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
2291 let bhkeep = &l:bh
2292
2293 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2294 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002295 setl bh=hide
2296 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002297
Bram Moolenaarff034192013-04-24 18:51:19 +02002298 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002299 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002300 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002301 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002302 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002303 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002304 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002305 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00002306 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002307 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002308
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002309 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002310 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002311" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002312 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002313
2314 " remove enew buffer (quietly)
2315 let filtbuf= bufnr("%")
2316 exe curbuf."b!"
2317 let &l:bh = bhkeep
2318 exe filtbuf."bw!"
2319
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002320 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002321
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002322 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002323 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002324 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00002325" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002326" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2327 exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002328 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002329
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002330 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002331 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002332 elseif b:netrw_method == 9
Bram Moolenaar97d62492012-11-15 21:28:22 +01002333" call Decho("write via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002334 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002335 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2336 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2337 else
2338 let uid_machine = g:netrw_machine
2339 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002340
2341 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2342 let bhkeep = &l:bh
2343 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002344 setl bh=hide
2345 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002346
Bram Moolenaarff034192013-04-24 18:51:19 +02002347 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002348 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002349" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002350" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01002351 let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
2352 exe s:netrw_silentxfer."%!".sftpcmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002353 let filtbuf= bufnr("%")
2354 exe curbuf."b!"
2355 let &l:bh = bhkeep
2356 exe filtbuf."bw!"
2357 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002358
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002359 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002360 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002361 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002362 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002363 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002364 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002365 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002366
Bram Moolenaar5c736222010-01-06 20:54:52 +01002367 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002368" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002369 if s:FileReadable(tmpfile)
2370" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002371 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002372 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002373 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002374
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002375 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002376 " restore modifiability; usually equivalent to set nomod
2377 let &mod= mod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002378" call Decho("(NetWrite) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002379 elseif !exists("leavemod")
2380 " indicate that the buffer has not been modified since last written
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002381" call Decho("(NetWrite) set nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002382 set nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002383" call Decho("(NetWrite) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002384 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002385
Bram Moolenaar9964e462007-05-05 17:54:07 +00002386" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002387endfun
2388
2389" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002390" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002391" uses NetRead to get a copy of the file into a temporarily file,
2392" then sources that file,
2393" then removes that file.
2394fun! netrw#NetSource(...)
2395" call Dfunc("netrw#NetSource() a:0=".a:0)
2396 if a:0 > 0 && a:1 == '?'
2397 " give help
2398 echomsg 'NetSource Usage:'
2399 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
2400 echomsg ':Nsource fetch://machine/path uses fetch'
2401 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02002402 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002403 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
2404 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
2405 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
2406 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
2407 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002408 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002409 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002410 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002411 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002412" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002413 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002414" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
2415 exe "so ".fnameescape(s:netrw_tmpfile)
2416" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002417 call delete(s:netrw_tmpfile)
2418 unlet s:netrw_tmpfile
2419 else
2420 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
2421 endif
2422 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002423 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00002424 endif
2425" call Dret("netrw#NetSource")
2426endfun
2427
Bram Moolenaar8d043172014-01-23 14:24:41 +01002428" ---------------------------------------------------------------------
2429" netrw#NetrwSetTreetop: resets the tree top to the current directory/specified directory {{{2
2430fun! netrw#NetrwSetTreetop(...)
2431" call Dfunc("netrw#NetrwSetTreetop(".((a:0 > 0)? a:1 : "").") a:0=".a:0)
2432 " clear out the current tree
2433 if exists("w:netrw_treetop")
2434 let inittreetop= w:netrw_treetop
2435 unlet w:netrw_treetop
2436 endif
2437 if exists("w:netrw_treedict")
2438 unlet w:netrw_treedict
2439 endif
2440 if a:1 == ""
2441 let treedir= s:NetrwTreePath(inittreetop)
2442 else
2443 if isdirectory(a:1)
2444 let treedir= a:1
2445 elseif exists("b:netrw_curdir") && isdirectory(b:netrw_curdir."/".a:1)
2446 let treedir= b:netrw_curdir."/".a:1
2447 else
2448 call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95)
2449" call Dret("netrw#NetrwSetTreetop")
2450 return
2451 endif
2452 endif
2453" call Decho("treedir<".treedir.">")
2454 sil! call netrw#LocalBrowseCheck(treedir)
2455" call Dret("netrw#NetrwSetTreetop")
2456endfun
2457
Bram Moolenaar9964e462007-05-05 17:54:07 +00002458" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00002459" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002460" readcmd == %r : replace buffer with newly read file
2461" == 0r : read file at top of buffer
2462" == r : read file after current line
2463" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002464fun! s:NetrwGetFile(readcmd, tfile, method)
2465" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002466
2467 " readcmd=='t': simply do nothing
2468 if a:readcmd == 't'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002469" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002470" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002471 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002472 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002473
Bram Moolenaar9964e462007-05-05 17:54:07 +00002474 " get name of remote filename (ie. url and all)
2475 let rfile= bufname("%")
2476" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002477
Bram Moolenaar9964e462007-05-05 17:54:07 +00002478 if exists("*NetReadFixup")
2479 " for the use of NetReadFixup (not otherwise used internally)
2480 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002481 endif
2482
Bram Moolenaar9964e462007-05-05 17:54:07 +00002483 if a:readcmd[0] == '%'
2484 " get file into buffer
2485" call Decho("get file into buffer")
2486
2487 " rename the current buffer to the temp file (ie. tfile)
2488 if g:netrw_cygwin
Bram Moolenaar8d043172014-01-23 14:24:41 +01002489 let tfile= substitute(a:tfile,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00002490 else
2491 let tfile= a:tfile
2492 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002493" call Decho("exe sil! keepalt file ".fnameescape(tfile))
2494 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002495
2496 " edit temporary file (ie. read the temporary file in)
2497 if rfile =~ '\.zip$'
2498" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
2499 call zip#Browse(tfile)
2500 elseif rfile =~ '\.tar$'
2501" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
2502 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002503 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002504" call Decho("handling remote gzip-compressed tar file")
2505 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002506 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002507" call Decho("handling remote bz2-compressed tar file")
2508 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002509 elseif rfile =~ '\.tar\.xz$'
2510" call Decho("handling remote xz-compressed tar file")
2511 call tar#Browse(tfile)
2512 elseif rfile =~ '\.txz$'
2513" call Decho("handling remote xz-compressed tar file (.txz)")
2514 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002515 else
2516" call Decho("edit temporary file")
2517 e!
2518 endif
2519
2520 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002521" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002522 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002523
Bram Moolenaar97d62492012-11-15 21:28:22 +01002524 " Detect filetype of local version of remote file.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002525 " Note that isk must not include a "/" for scripts.vim
2526 " to process this detection correctly.
2527" call Decho("detect filetype of local version of remote file")
Bram Moolenaar97d62492012-11-15 21:28:22 +01002528 let iskkeep= &l:isk
2529 setl isk-=/
Bram Moolenaar8d043172014-01-23 14:24:41 +01002530 " filetype detect " COMBAK - trying filetype detect in NetrwOptionRestore Jan 24, 2013
Bram Moolenaar97d62492012-11-15 21:28:22 +01002531 let &l:isk= iskkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00002532" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
2533 let line1 = 1
2534 let line2 = line("$")
2535
Bram Moolenaar8d043172014-01-23 14:24:41 +01002536 elseif !&ma
2537 " attempting to read a file after the current line in the file, but the buffer is not modifiable
2538 keepj call netrw#ErrorMsg(s:WARNING,"attempt to read<".a:tfile."> into a non-modifiable buffer!",94)
2539" call Dret("NetrwGetFile : attempt to read<".a:tfile."> into a non-modifiable buffer!")
2540 return
2541
Bram Moolenaar9964e462007-05-05 17:54:07 +00002542 elseif s:FileReadable(a:tfile)
2543 " read file after current line
2544" call Decho("read file<".a:tfile."> after current line")
2545 let curline = line(".")
2546 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002547" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002548 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002549 let line1= curline + 1
2550 let line2= line("$") - lastline + 1
2551
2552 else
2553 " not readable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002554" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002555" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002556 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002557" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002558 return
2559 endif
2560
2561 " User-provided (ie. optional) fix-it-up command
2562 if exists("*NetReadFixup")
2563" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002564 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002565" else " Decho
2566" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
2567 endif
2568
Bram Moolenaaradc21822011-04-01 18:03:16 +02002569 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00002570 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02002571 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002572 endif
2573
2574" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
2575
2576 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00002577" redraw!
2578
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002579" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002580" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002581endfun
2582
Bram Moolenaar9964e462007-05-05 17:54:07 +00002583" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002584" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01002585" Input:
2586" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
2587" Output:
2588" b:netrw_method= 1: rcp
2589" 2: ftp + <.netrc>
2590" 3: ftp + machine, id, password, and [path]filename
2591" 4: scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002592" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002593" 6: dav
2594" 7: rsync
2595" 8: fetch
2596" 9: sftp
2597" g:netrw_machine= hostname
2598" b:netrw_fname = filename
2599" g:netrw_port = optional port number (for ftp)
2600" g:netrw_choice = copy of input url (choice)
2601fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002602" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002603
Bram Moolenaar251e1912011-06-19 05:09:16 +02002604 " sanity check: choice should have at least three slashes in it
2605 if strlen(substitute(a:choice,'[^/]','','g')) < 3
2606 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
2607 let b:netrw_method = -1
2608" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
2609 return
2610 endif
2611
Bram Moolenaar5c736222010-01-06 20:54:52 +01002612 " record current g:netrw_machine, if any
2613 " curmachine used if protocol == ftp and no .netrc
2614 if exists("g:netrw_machine")
2615 let curmachine= g:netrw_machine
2616" call Decho("curmachine<".curmachine.">")
2617 else
2618 let curmachine= "N O T A HOST"
2619 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002620 if exists("g:netrw_port")
2621 let netrw_port= g:netrw_port
2622 endif
2623
2624 " insure that netrw_ftp_cmd starts off every method determination
2625 " with the current g:netrw_ftp_cmd
2626 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002627
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002628 " initialization
2629 let b:netrw_method = 0
2630 let g:netrw_machine = ""
2631 let b:netrw_fname = ""
2632 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002633 let g:netrw_choice = a:choice
2634
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002635 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002636 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00002637 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
2638 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002639 " rcpurm : rcp://[user@]host/filename Use rcp
2640 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002641 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002642 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01002643 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002644 " rsyncurm : rsync://host[:port]/path Use rsync
2645 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2646 " sftpurm : sftp://[user@]host/filename Use scp
2647 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2648 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002649" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2650" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2651" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2652 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2653 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002654 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002655 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002656 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002657 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002658 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002659 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002660 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002661
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002662" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002663 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02002664 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002665 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002666" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002667 let b:netrw_method = 1
2668 let userid = substitute(a:choice,rcpurm,'\1',"")
2669 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2670 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002671 if userid != ""
2672 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002673 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002674
Bram Moolenaaradc21822011-04-01 18:03:16 +02002675 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002676 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002677" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002678 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002679 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2680 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2681 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002682
Bram Moolenaar15146672011-10-20 22:22:38 +02002683 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002684 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002685" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002686 let b:netrw_method = 5
2687 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2688 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002689
Bram Moolenaaradc21822011-04-01 18:03:16 +02002690 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002691 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002692" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002693 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02002694 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002695 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2696 else
2697 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2698 endif
2699 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002700
Bram Moolenaaradc21822011-04-01 18:03:16 +02002701 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002702 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002703" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002704 let b:netrw_method = 7
2705 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2706 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002707
Bram Moolenaaradc21822011-04-01 18:03:16 +02002708 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002709 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002710" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002711 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002712 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2713 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2714 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002715" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002716 if userid != ""
2717 let g:netrw_uid= userid
2718 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002719
Bram Moolenaaradc21822011-04-01 18:03:16 +02002720 if curmachine != g:netrw_machine
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002721 if exists("s:netwr_hup[".g:netrw_machine."]")
2722 call NetUserPass("ftp:".g:netrw_machine)
2723 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002724 " if there's a change in hostname, require password re-entry
2725 unlet s:netrw_passwd
2726 endif
2727 if exists("netrw_port")
2728 unlet netrw_port
2729 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002730 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002731
Bram Moolenaar446cb832008-06-24 21:56:24 +00002732 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002733 let b:netrw_method = 3
2734 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002735 let host= substitute(g:netrw_machine,'\..*$','','')
2736 if exists("s:netrw_hup[host]")
2737 call NetUserPass("ftp:".host)
2738
2739 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02002740" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2741" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
2742 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
Bram Moolenaare6ae6222013-05-21 21:01:10 +02002743 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',g:netrw_machine,'')
Bram Moolenaaradc21822011-04-01 18:03:16 +02002744" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2745 endif
2746 let b:netrw_method= 2
2747 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
2748" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002749 let b:netrw_method= 2
2750 else
2751 if !exists("g:netrw_uid") || g:netrw_uid == ""
2752 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002753 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002754 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002755 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002756 endif
2757 let b:netrw_method= 3
2758 endif
2759 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002760
Bram Moolenaaradc21822011-04-01 18:03:16 +02002761 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002762 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002763" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002764 let b:netrw_method = 8
2765 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2766 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2767 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2768 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002769
Bram Moolenaaradc21822011-04-01 18:03:16 +02002770 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002771 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002772" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002773 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002774 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2775 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002776 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002777 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002778 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002779
Bram Moolenaaradc21822011-04-01 18:03:16 +02002780 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002781 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002782" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002783 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002784 let b:netrw_method = 3
2785 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2786 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002787
Bram Moolenaar9964e462007-05-05 17:54:07 +00002788 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002789 let b:netrw_method = 2
2790 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2791 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2792 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002793
Bram Moolenaaradc21822011-04-01 18:03:16 +02002794 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002795 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002796" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002797 let b:netrw_method = 9
2798 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2799 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002800
Bram Moolenaaradc21822011-04-01 18:03:16 +02002801 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002802 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002803" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002804 let b:netrw_method = 1
2805 let userid = substitute(a:choice,rcphf,'\2',"")
2806 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
2807 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002808" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2809" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2810" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2811" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002812 if userid != ""
2813 let g:netrw_uid= userid
2814 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002815
Bram Moolenaaradc21822011-04-01 18:03:16 +02002816 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002817 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002818 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002819 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002820 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002821 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002822 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002823 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00002824
Bram Moolenaar81695252004-12-29 20:58:21 +00002825 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02002826 " remove any leading [:#] from port number
2827 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2828 elseif exists("netrw_port")
2829 " retain port number as implicit for subsequent ftp operations
2830 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00002831 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002832
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002833" call Decho("a:choice <".a:choice.">")
2834" call Decho("b:netrw_method <".b:netrw_method.">")
2835" call Decho("g:netrw_machine<".g:netrw_machine.">")
2836" call Decho("g:netrw_port <".g:netrw_port.">")
2837" if exists("g:netrw_uid") "Decho
2838" call Decho("g:netrw_uid <".g:netrw_uid.">")
2839" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00002840" if exists("s:netrw_passwd") "Decho
2841" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002842" endif "Decho
2843" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002844" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002845endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002846
2847" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00002848" NetReadFixup: this sort of function is typically written by the user {{{2
2849" to handle extra junk that their system's ftp dumps
2850" into the transfer. This function is provided as an
2851" example and as a fix for a Windows 95 problem: in my
2852" experience, win95's ftp always dumped four blank lines
2853" at the end of the transfer.
2854if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
2855 fun! NetReadFixup(method, line1, line2)
2856" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002857
2858 " sanity checks -- attempt to convert inputs to integers
2859 let method = a:method + 0
2860 let line1 = a:line1 + 0
2861 let line2 = a:line2 + 0
2862 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
2863" call Dret("NetReadFixup")
2864 return
2865 endif
2866
Bram Moolenaar9964e462007-05-05 17:54:07 +00002867 if method == 3 " ftp (no <.netrc>)
2868 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002869 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002870 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01002871 call histdel("/",-1)
2872 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002873 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002874
Bram Moolenaar9964e462007-05-05 17:54:07 +00002875" call Dret("NetReadFixup")
2876 endfun
2877endif
2878
2879" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002880" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002881" Usage: :call NetUserPass() -- will prompt for userid and password
2882" :call NetUserPass("uid") -- will prompt for password
2883" :call NetUserPass("uid","password") -- sets global userid and password
2884" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
2885" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00002886fun! NetUserPass(...)
2887
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002888" call Dfunc("NetUserPass() a:0=".a:0)
2889
2890 if !exists('s:netrw_hup')
2891 let s:netrw_hup= {}
2892 endif
2893
Bram Moolenaar071d4272004-06-13 20:20:40 +00002894 if a:0 == 0
Bram Moolenaar97d62492012-11-15 21:28:22 +01002895 " case: no input arguments
2896
2897 " change host and username if not previously entered; get new password
2898 if !exists("g:netrw_machine")
2899 let g:netrw_machine= input('Enter hostname: ')
2900 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002901 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01002902 " get username (user-id) via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00002903 let g:netrw_uid= input('Enter username: ')
2904 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002905 " get password via prompting
Bram Moolenaar446cb832008-06-24 21:56:24 +00002906 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002907
2908 " set up hup database
2909 let host = substitute(g:netrw_machine,'\..*$','','')
2910 if !exists('s:netrw_hup[host]')
2911 let s:netrw_hup[host]= {}
2912 endif
2913 let s:netrw_hup[host].uid = g:netrw_uid
2914 let s:netrw_hup[host].passwd = s:netrw_passwd
2915
2916 elseif a:0 == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01002917 " case: one input argument
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002918
2919 if a:1 =~ '^ftp:'
Bram Moolenaar97d62492012-11-15 21:28:22 +01002920 " get host from ftp:... url
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002921 " access userid and password from hup (host-user-passwd) dictionary
2922 let host = substitute(a:1,'^ftp:','','')
2923 let host = substitute(host,'\..*','','')
2924 if exists("s:netrw_hup[host]")
2925 let g:netrw_uid = s:netrw_hup[host].uid
2926 let s:netrw_passwd = s:netrw_hup[host].passwd
2927" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2928" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2929 else
2930 let g:netrw_uid = input("Enter UserId: ")
2931 let s:netrw_passwd = inputsecret("Enter Password: ")
2932 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002933
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002934 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01002935 " case: one input argument, not an url. Using it as a new user-id.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002936 if exists("g:netrw_machine")
2937 let host= substitute(g:netrw_machine,'\..*$','','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01002938 else
2939 let g:netrw_machine= input('Enter hostname: ')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002940 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002941 let g:netrw_uid = a:1
2942" call Decho("set g:netrw_uid= <".g:netrw_uid.">")
2943 if exists("g:netrw_passwd")
2944 " ask for password if one not previously entered
2945 let s:netrw_passwd= g:netrw_passwd
2946 else
2947 let s:netrw_passwd = inputsecret("Enter Password: ")
2948 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002949 endif
2950
2951" call Decho("host<".host.">")
2952 if exists("host")
2953 if !exists('s:netrw_hup[host]')
2954 let s:netrw_hup[host]= {}
2955 endif
2956 let s:netrw_hup[host].uid = g:netrw_uid
2957 let s:netrw_hup[host].passwd = s:netrw_passwd
2958 endif
2959
2960 elseif a:0 == 2
2961 let g:netrw_uid = a:1
2962 let s:netrw_passwd = a:2
2963
2964 elseif a:0 == 3
2965 " enter hostname, user-id, and password into the hup dictionary
2966 let host = substitute(a:1,'^\a\+:','','')
2967 let host = substitute(host,'\..*$','','')
2968 if !exists('s:netrw_hup[host]')
2969 let s:netrw_hup[host]= {}
2970 endif
2971 let s:netrw_hup[host].uid = a:2
2972 let s:netrw_hup[host].passwd = a:3
2973 let g:netrw_uid = s:netrw_hup[host].uid
2974 let s:netrw_passwd = s:netrw_hup[host].passwd
2975" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2976" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002977 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002978
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002979" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002980endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002981
Bram Moolenaar9964e462007-05-05 17:54:07 +00002982" ===========================================
2983" Shared Browsing Support: {{{1
2984" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00002985
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002986" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002987" s:NetrwMaps: {{{2
2988fun! s:NetrwMaps(islocal)
2989" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002990
2991 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
Bram Moolenaarff034192013-04-24 18:51:19 +02002992" call Decho("(NetrwMaps) set up Rexplore command")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002993 com! Rexplore if exists("w:netrw_rexlocal")|call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")|else|call netrw#ErrorMsg(s:WARNING,"not a former netrw window",79)|endif
Bram Moolenaar251e1912011-06-19 05:09:16 +02002994 if g:netrw_mousemaps && g:netrw_retmap
Bram Moolenaarff034192013-04-24 18:51:19 +02002995" call Decho("(NetrwMaps) set up Rexplore 2-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002996 if !hasmapto("<Plug>NetrwReturn")
2997 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
Bram Moolenaarff034192013-04-24 18:51:19 +02002998" call Decho("(NetrwMaps) making map for 2-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002999 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
3000 elseif maparg("<c-leftmouse>","n") == ""
Bram Moolenaarff034192013-04-24 18:51:19 +02003001" call Decho("(NetrwMaps) making map for c-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003002 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
3003 endif
3004 endif
3005 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003006" call Decho("(NetrwMaps) made <Plug>NetrwReturn map")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003007 endif
3008
Bram Moolenaar9964e462007-05-05 17:54:07 +00003009 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02003010" call Decho("(NetrwMaps) make local maps")
Bram Moolenaar15146672011-10-20 22:22:38 +02003011 " local normal-mode maps
3012 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
3013 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
Bram Moolenaar8d043172014-01-23 14:24:41 +01003014 nnoremap <buffer> <silent> c :exe "keepj lcd ".fnameescape(b:netrw_curdir)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003015 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
3016 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
3017 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
3018 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
3019 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
3020 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
3021 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
3022 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
3023 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
3024 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
3025 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
3026 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
3027 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
3028 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
3029 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
3030 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
3031 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003032 nnoremap <buffer> <silent> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003033 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
3034 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
3035 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
3036 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
3037 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
3038 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
3039 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
3040 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
3041 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
3042 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
3043 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
3044 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
3045 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
3046 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
3047 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3048 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
3049 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3050 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003051 nnoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003052 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
3053 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
3054 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003055 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003056 nnoremap <buffer> <silent> Tb :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3057 nnoremap <buffer> <silent> Th :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003058 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
3059 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
3060 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
3061 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003062 nnoremap <buffer> <silent> X :call <SID>NetrwLocalExecute(expand("<cword>"))"<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003063 " local insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003064 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003065 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
3066 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
3067 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
3068 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
3069 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
3070 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
3071 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
3072 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
3073 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
3074 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
3075 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003076 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003077 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003078 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
3079 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
3080 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
3081 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
3082 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
3083 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
3084 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
3085 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
3086 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
3087 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
3088 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
3089 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
3090 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
3091 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003092 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003093 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003094 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003095 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003096 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3097 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
3098 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003099 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003100 inoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003101 inoremap <buffer> <silent> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
3102 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
3103 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003104 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003105 inoremap <buffer> <silent> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3106 inoremap <buffer> <silent> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003107 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
3108 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
3109 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
3110 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003111 if !hasmapto('<Plug>NetrwHideEdit')
3112 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003113 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00003114 endif
3115 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
3116 if !hasmapto('<Plug>NetrwRefresh')
3117 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003118 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00003119 endif
3120 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003121 if s:didstarstar || !mapcheck("<s-down>","n")
3122 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003123 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003124 endif
3125 if s:didstarstar || !mapcheck("<s-up>","n")
3126 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003127 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003128 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003129 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003130 if g:netrw_mousemaps == 1
Bram Moolenaar8d043172014-01-23 14:24:41 +01003131 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
3132 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
3133 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
3134 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
3135 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3136 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(1)<cr>
3137 nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
3138 nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(1)<cr>
3139 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3140 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
3141 imap <buffer> <leftmouse> <Plug>ILeftmouse
3142 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
3143 imap <buffer> <middlemouse> <Plug>IMiddlemouse
3144 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
3145 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3146 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003147 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3148 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003149 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003150 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003151 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003152 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003153 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar8d043172014-01-23 14:24:41 +01003154 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003155 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3156 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3157 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3158 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3159 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3160 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar8d043172014-01-23 14:24:41 +01003161 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>'
3162 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003163
Bram Moolenaar9964e462007-05-05 17:54:07 +00003164 else " remote
Bram Moolenaarff034192013-04-24 18:51:19 +02003165" call Decho("(NetrwMaps) make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003166 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar15146672011-10-20 22:22:38 +02003167 " remote normal-mode maps
Bram Moolenaar446cb832008-06-24 21:56:24 +00003168 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3169 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3170 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3171 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003172 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003173 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3174 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3175 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3176 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003177 nnoremap <buffer> <silent> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003178 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3179 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3180 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3181 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3182 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3183 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003184 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003185 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003186 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3187 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003188 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003189 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003190 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003191 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
3192 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003193 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003194 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003195 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003196 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003197 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003198 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
3199 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
3200 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3201 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003202 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3203 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003204 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003205 nnoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003206 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3207 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003208 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003209 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003210 nnoremap <buffer> <silent> Tb :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3211 nnoremap <buffer> <silent> Th :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003212 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3213 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003214 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
3215 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00003216 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003217 " remote insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003218 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3219 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3220 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3221 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
3222 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
3223 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3224 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3225 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3226 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3227 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3228 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3229 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3230 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3231 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3232 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003233 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003234 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003235 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3236 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003237 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003238 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003239 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003240 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
3241 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
3242 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
3243 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
3244 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
3245 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
3246 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
3247 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3248 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3249 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3250 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
3251 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003252 inoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003253 inoremap <buffer> <silent> r <c-o>:let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3254 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
3255 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
3256 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003257 inoremap <buffer> <silent> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3258 inoremap <buffer> <silent> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003259 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3260 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
3261 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
3262 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
3263 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003264 if !hasmapto('<Plug>NetrwHideEdit')
3265 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003266 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00003267 endif
3268 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
3269 if !hasmapto('<Plug>NetrwRefresh')
3270 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003271 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00003272 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003273
3274 let mapsafepath = escape(s:path, s:netrw_map_escape)
3275 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
3276
Bram Moolenaar251e1912011-06-19 05:09:16 +02003277 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003278 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02003279 nmap <leftmouse> <Plug>NetrwLeftmouse
3280 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003281 nmap <buffer> <leftdrag> <Plug>NetrwLeftdrag
3282 nno <buffer> <silent> <Plug>NetrwLeftdrag :call <SID>NetrwLeftdrag(0)<cr>
Bram Moolenaar8d043172014-01-23 14:24:41 +01003283 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3284 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(0)<cr>
3285 nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
3286 nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(0)<cr>
Bram Moolenaar251e1912011-06-19 05:09:16 +02003287 nmap <middlemouse> <Plug>NetrwMiddlemouse
3288 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar251e1912011-06-19 05:09:16 +02003289 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3290 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
3291 imap <buffer> <leftmouse> <Plug>ILeftmouse
3292 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
3293 imap <buffer> <middlemouse> <Plug>IMiddlemouse
3294 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3295 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3296 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003297 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3298 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003299 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003300 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003301 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003302 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3303 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3304 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003305 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003306 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3307 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3308 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3309 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3310 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3311 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00003312 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003313 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003314 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003315
Bram Moolenaaradc21822011-04-01 18:03:16 +02003316 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02003317
Bram Moolenaaradc21822011-04-01 18:03:16 +02003318" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003319endfun
3320
3321" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003322" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
3323fun! s:ExplorePatHls(pattern)
3324" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
3325 let repat= substitute(a:pattern,'^**/\{1,2}','','')
3326" call Decho("repat<".repat.">")
3327 let repat= escape(repat,'][.\')
3328" call Decho("repat<".repat.">")
3329 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
3330" call Dret("s:ExplorePatHls repat<".repat.">")
3331 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00003332endfun
3333
3334" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003335" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003336" 0: (user: <mb>) bookmark current directory
3337" 1: (user: <gb>) change to the bookmarked directory
3338" 2: (user: <qb>) list bookmarks
3339" 3: (browsing) record current directory history
3340" 4: (user: <u>) go up (previous) bookmark
3341" 5: (user: <U>) go down (next) bookmark
3342" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01003343fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003344" 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 +02003345 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3346" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
3347 return
3348 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003349
Bram Moolenaar97d62492012-11-15 21:28:22 +01003350 let ykeep= @@
Bram Moolenaar9964e462007-05-05 17:54:07 +00003351 if a:chg == 0
3352 " bookmark the current directory
3353" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003354 if !exists("g:netrw_bookmarklist")
3355 let g:netrw_bookmarklist= []
3356 endif
3357 if index(g:netrw_bookmarklist,a:curdir) == -1
3358 " curdir not currently in g:netrw_bookmarklist, so include it
3359 call add(g:netrw_bookmarklist,a:curdir)
3360 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003361 endif
3362 echo "bookmarked the current directory"
3363
3364 elseif a:chg == 1
3365 " change to the bookmarked directory
Bram Moolenaarff034192013-04-24 18:51:19 +02003366" call Decho("(user: <".v:count."gb>) change to the bookmarked directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003367 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaarff034192013-04-24 18:51:19 +02003368" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003369 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00003370 else
3371 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3372 endif
3373
3374 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003375" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00003376 let didwork= 0
3377 " list user's bookmarks
3378" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003379 if exists("g:netrw_bookmarklist")
3380" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
3381 let cnt= 1
3382 for bmd in g:netrw_bookmarklist
3383" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
Bram Moolenaarff034192013-04-24 18:51:19 +02003384 echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
Bram Moolenaar5c736222010-01-06 20:54:52 +01003385 let didwork = 1
3386 let cnt = cnt + 1
3387 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00003388 endif
3389
3390 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01003391 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00003392 let first = 1
3393 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003394 if g:netrw_dirhistmax > 0
3395 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01003396" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003397 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003398" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaarff034192013-04-24 18:51:19 +02003399 echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003400 let didwork= 1
3401 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003402 let histcnt = histcnt + 1
3403 let first = 0
3404 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003405 if cnt < 0
3406 let cnt= cnt + g:netrw_dirhistmax
3407 endif
3408 endwhile
3409 else
3410 let g:netrw_dirhist_cnt= 0
3411 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003412 if didwork
3413 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3414 endif
3415
3416 elseif a:chg == 3
3417 " saves most recently visited directories (when they differ)
3418" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003419 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 +02003420 if g:netrw_dirhistmax > 0
3421 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3422 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
3423 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003424" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003425 endif
3426
3427 elseif a:chg == 4
3428 " u: change to the previous directory stored on the history list
3429" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003430 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003431 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003432 if g:netrw_dirhist_cnt < 0
3433 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3434 endif
3435 else
3436 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003437 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003438 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
3439" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003440 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003441 setl ma noro
3442" call Decho("(NetrwBookHistHandler) setl ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003443 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003444 setl nomod
3445" call Decho("(NetrwBookHistHandler) setl nomod")
3446" call Decho("(NetrwBookHistHandler) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003447 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01003448" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003449 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00003450 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003451 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003452 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003453 else
3454 let g:netrw_dirhist_cnt= 0
3455 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003456 echo "Sorry, no predecessor directory exists yet"
3457 endif
3458
3459 elseif a:chg == 5
3460 " U: change to the subsequent directory stored on the history list
3461" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003462 if g:netrw_dirhistmax > 0
3463 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3464 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003465" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003466 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003467" call Decho("(NetrwBookHistHandler) setl ma noro")
3468 setl ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02003469 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003470" call Decho("removed all lines from buffer (%d)")
3471" call Decho("(NetrwBookHistHandler) setl nomod")
3472 setl nomod
3473" call Decho("(set nomod) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003474 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003475" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003476 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
3477 else
3478 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
3479 if g:netrw_dirhist_cnt < 0
3480 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3481 endif
3482 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003483 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003484 else
3485 let g:netrw_dirhist_cnt= 0
3486 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003487 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003488
3489 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01003490 " delete the v:count'th bookmark
3491" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
3492 let savefile= s:NetrwHome()."/.netrwbook"
3493 if filereadable(savefile)
Bram Moolenaarff034192013-04-24 18:51:19 +02003494" call Decho("merge bookmarks (active and file)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003495 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
Bram Moolenaarff034192013-04-24 18:51:19 +02003496" call Decho("bookmark delete savefile<".savefile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003497 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003498 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003499" call Decho("remove g:netrw_bookmarklist[".(v:count-1)."]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003500 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaarff034192013-04-24 18:51:19 +02003501" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003502 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003503 call s:NetrwBookmarkMenu()
Bram Moolenaarff034192013-04-24 18:51:19 +02003504 call s:NetrwTgtMenu()
Bram Moolenaar97d62492012-11-15 21:28:22 +01003505 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003506" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003507endfun
3508
3509" ---------------------------------------------------------------------
3510" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
3511" Sister function: s:NetrwBookHistSave()
3512fun! s:NetrwBookHistRead()
3513" call Dfunc("s:NetrwBookHistRead()")
Bram Moolenaarff034192013-04-24 18:51:19 +02003514 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3515" " call Dret("s:NetrwBookHistRead - suppressed due to g:netrw_dirhistmax")
3516 return
3517 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003518 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01003519 if !exists("s:netrw_initbookhist")
3520 let home = s:NetrwHome()
3521 let savefile= home."/.netrwbook"
3522 if filereadable(savefile)
3523" call Decho("sourcing .netrwbook")
Bram Moolenaarff034192013-04-24 18:51:19 +02003524 exe "keepalt keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003525 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003526 if g:netrw_dirhistmax > 0
3527 let savefile= home."/.netrwhist"
3528 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003529" call Decho("sourcing .netrwhist")
Bram Moolenaarff034192013-04-24 18:51:19 +02003530 exe "keepalt keepj so ".savefile
Bram Moolenaaradc21822011-04-01 18:03:16 +02003531 endif
3532 let s:netrw_initbookhist= 1
3533 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003534 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003535 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003536 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01003537" call Dret("s:NetrwBookHistRead")
3538endfun
3539
3540" ---------------------------------------------------------------------
3541" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
3542" Sister function: s:NetrwBookHistRead()
3543" I used to do this via viminfo but that appears to
3544" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01003545fun! s:NetrwBookHistSave()
3546" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaarff034192013-04-24 18:51:19 +02003547 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003548" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
3549 return
3550 endif
3551
Bram Moolenaar5c736222010-01-06 20:54:52 +01003552 let savefile= s:NetrwHome()."/.netrwhist"
3553 1split
3554 call s:NetrwEnew()
Bram Moolenaarff034192013-04-24 18:51:19 +02003555 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
3556 setl nocin noai noci magic nospell nohid wig= noaw
3557 setl ma noro write
3558 if exists("+acd") | setl noacd | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003559 sil! keepj keepalt %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01003560
3561 " save .netrwhist -- no attempt to merge
Bram Moolenaarff034192013-04-24 18:51:19 +02003562 sil! keepalt file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01003563 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
3564 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
3565 let lastline = line("$")
3566 let cnt = 1
3567 while cnt <= g:netrw_dirhist_cnt
3568 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
3569 let cnt= cnt + 1
3570 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003571 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003572
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003573 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01003574 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3575 " merge and write .netrwbook
3576 let savefile= s:NetrwHome()."/.netrwbook"
3577
3578 if filereadable(savefile)
3579 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaarff034192013-04-24 18:51:19 +02003580 exe "sil keepj keepalt so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003581 for bdm in booklist
3582 if index(g:netrw_bookmarklist,bdm) == -1
3583 call add(g:netrw_bookmarklist,bdm)
3584 endif
3585 endfor
3586 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003587 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003588 endif
3589
3590 " construct and save .netrwbook
3591 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003592 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003593 endif
3594 let bgone= bufnr("%")
3595 q!
Bram Moolenaarff034192013-04-24 18:51:19 +02003596 exe "keepalt ".bgone."bwipe!"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003597
3598" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003599endfun
3600
3601" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003602" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
3603" list of the contents of a local or remote directory. It is assumed that the
3604" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
3605" with the requested remote hostname first.
3606fun! s:NetrwBrowse(islocal,dirname)
3607 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003608" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
Bram Moolenaarff034192013-04-24 18:51:19 +02003609" call Decho("(NetrwBrowse) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar8d043172014-01-23 14:24:41 +01003610" call Dredir("ls!")
Bram Moolenaar97d62492012-11-15 21:28:22 +01003611 " s:NetrwBrowse: initialize history {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003612 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003613 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003614 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003615
Bram Moolenaar97d62492012-11-15 21:28:22 +01003616 " s:NetrwBrowse: simplify the dirname (especially for ".."s in dirnames) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003617 if a:dirname !~ '^\a\+://'
3618 let dirname= simplify(a:dirname)
3619 else
3620 let dirname= a:dirname
3621 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003622
3623 if exists("s:netrw_skipbrowse")
3624 unlet s:netrw_skipbrowse
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003625" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003626" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
3627 return
3628 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003629
3630 " s:NetrwBrowse: sanity checks: {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003631 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003632 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003633" call Dret("s:NetrwBrowse : missing shellescape()")
3634 return
3635 endif
3636 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003637 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003638" call Dret("s:NetrwBrowse : missing fnameescape()")
3639 return
3640 endif
3641
Bram Moolenaar97d62492012-11-15 21:28:22 +01003642 " s:NetrwBrowse: save options: {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003643 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003644
Bram Moolenaar97d62492012-11-15 21:28:22 +01003645 " s:NetrwBrowse: re-instate any marked files {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003646 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaarff034192013-04-24 18:51:19 +02003647" call Decho("(NetrwBrowse) clearing marked files")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003648 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3649 endif
3650
3651 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
Bram Moolenaar97d62492012-11-15 21:28:22 +01003652 " s:NetrwBrowse: set up "safe" options for local directory/file {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003653" call Decho("(NetrwBrowse) handle w:netrw_acdkeep:")
3654" call Decho("(NetrwBrowse) keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003655 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003656 call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02003657" call Decho("(NetrwBrowse) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003658
Bram Moolenaar5c736222010-01-06 20:54:52 +01003659 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar97d62492012-11-15 21:28:22 +01003660 " s:NetrwBrowse: looks like a remote regular file, attempt transfer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003661" call Decho("(NetrwBrowse) attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003662
Bram Moolenaar97d62492012-11-15 21:28:22 +01003663 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaar446cb832008-06-24 21:56:24 +00003664 " "this is a directory" indicator (/).
3665 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01003666 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +02003667" call Decho("(NetrwBrowse) new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003668 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003669
Bram Moolenaar97d62492012-11-15 21:28:22 +01003670 " s:NetrwBrowse: remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003671 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01003672 call s:NetrwEnew(dirname)
3673 call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02003674 setl ma noro
3675" call Decho("(NetrwBrowse) setl ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02003676 let b:netrw_curdir = dirname
3677 let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
Bram Moolenaarff034192013-04-24 18:51:19 +02003678" call Decho("(NetrwBrowse) exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
Bram Moolenaar15146672011-10-20 22:22:38 +02003679 exe "sil! keepj keepalt file ".fnameescape(url)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003680 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02003681 sil call netrw#NetRead(2,url)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003682 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003683 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02003684 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003685 endif
3686
Bram Moolenaar97d62492012-11-15 21:28:22 +01003687 " s:NetrwBrowse: save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003688 call s:SetBufWinVars()
3689 call s:NetrwOptionRestore("w:")
Bram Moolenaarff034192013-04-24 18:51:19 +02003690" call Decho("(NetrwBrowse) setl ma nomod")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003691 setl ma nomod
3692" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003693
Bram Moolenaar446cb832008-06-24 21:56:24 +00003694" call Dret("s:NetrwBrowse : file<".s:fname.">")
3695 return
3696 endif
3697
Bram Moolenaaradc21822011-04-01 18:03:16 +02003698 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003699 call s:UseBufWinVars()
3700
3701 " set up some variables {{{3
3702 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003703 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003704 let s:last_sort_by = g:netrw_sort_by
3705
3706 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02003707 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003708
Bram Moolenaar97d62492012-11-15 21:28:22 +01003709 " get/set-up buffer {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003710 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
3711 " maintain markfile highlighting
3712 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
Bram Moolenaarff034192013-04-24 18:51:19 +02003713" call Decho("(NetrwBrowse) bufnr(%)=".bufnr('%'))
3714" call Decho("(NetrwBrowse) exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003715 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3716 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003717" call Decho("(NetrwBrowse) 2match none")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003718 2match none
3719 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003720 if reusing && line("$") > 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003721 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003722" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3723 setl noma nomod nowrap
Bram Moolenaarff034192013-04-24 18:51:19 +02003724" call Decho("(NetrwBrowse) (set noma nomod nowrap) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003725" call Dret("s:NetrwBrowse : re-using buffer")
3726 return
3727 endif
3728
3729 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar8d043172014-01-23 14:24:41 +01003730" call Decho("(NetrwBrowse) set b:netrw_curdir to the new directory name<".dirname."> (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003731 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003732 if b:netrw_curdir =~ '[/\\]$'
3733 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
3734 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01003735 if b:netrw_curdir =~ '\a:$' && (has("win32") || has("win95") || has("win64") || has("win16"))
3736 let b:netrw_curdir= b:netrw_curdir."/"
3737 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003738 if b:netrw_curdir == ''
3739 if has("amiga")
3740 " On the Amiga, the empty string connotes the current directory
3741 let b:netrw_curdir= getcwd()
3742 else
3743 " under unix, when the root directory is encountered, the result
3744 " from the preceding substitute is an empty string.
3745 let b:netrw_curdir= '/'
3746 endif
3747 endif
3748 if !a:islocal && b:netrw_curdir !~ '/$'
3749 let b:netrw_curdir= b:netrw_curdir.'/'
3750 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003751" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003752
3753 " ------------
3754 " (local only) {{{3
3755 " ------------
3756 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02003757" call Decho("(NetrwBrowse) local only:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003758
3759 " Set up ShellCmdPost handling. Append current buffer to browselist
3760 call s:LocalFastBrowser()
3761
3762 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
3763 if !g:netrw_keepdir
Bram Moolenaarff034192013-04-24 18:51:19 +02003764" call Decho("(NetrwBrowse) handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
3765" call Decho("(NetrwBrowse) l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003766 if !exists("&l:acd") || !&l:acd
Bram Moolenaar8d043172014-01-23 14:24:41 +01003767" call Decho('(NetrwBrowse) exe keepj lcd '.fnameescape(b:netrw_curdir))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003768 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003769 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003770 catch /^Vim\%((\a\+)\)\=:E472/
3771 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
3772 if exists("w:netrw_prvdir")
3773 let b:netrw_curdir= w:netrw_prvdir
3774 else
3775 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003776" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3777 setl noma nomod nowrap
3778" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003779 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003780" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
3781 return
3782 endif
3783 endtry
3784 endif
3785 endif
3786
3787 " --------------------------------
3788 " remote handling: {{{3
3789 " --------------------------------
3790 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003791" call Decho("(NetrwBrowse) remote only:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003792
Bram Moolenaar97d62492012-11-15 21:28:22 +01003793 " analyze dirname and g:netrw_list_cmd {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003794" call Decho("(NetrwBrowse) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003795 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003796 let dirname= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02003797" call Decho("(NetrwBrowse) (dirname was <NetrwTreeListing>) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003798 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3799 let dirname= substitute(b:netrw_curdir,'\\','/','g')
3800 if dirname !~ '/$'
3801 let dirname= dirname.'/'
3802 endif
3803 let b:netrw_curdir = dirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003804" call Decho("(NetrwBrowse) (liststyle is TREELIST) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003805 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003806 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaarff034192013-04-24 18:51:19 +02003807" call Decho("(NetrwBrowse) (normal) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003808 endif
3809
3810 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
3811 if dirname !~ dirpat
3812 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003813 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003814 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003815 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003816" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3817 setl noma nomod nowrap
3818" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003819" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
3820 return
3821 endif
3822 let b:netrw_curdir= dirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003823" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir."> (remote)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003824 endif " (additional remote handling)
3825
3826 " -----------------------
3827 " Directory Listing: {{{3
3828 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02003829 keepj call s:NetrwMaps(a:islocal)
3830 keepj call s:PerformListing(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02003831 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003832 let &l:bexpr= "netrw#NetrwBalloonHelp()"
Bram Moolenaarff034192013-04-24 18:51:19 +02003833" call Decho("(NetrwBrowse) set up balloon help: l:bexpr=".&l:bexpr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003834 set beval
3835 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003836 call s:NetrwOptionRestore("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003837
3838 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
3839 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
3840 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
3841 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
3842 " function gets called due to that autocmd; it notices that the following variable is set
3843 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
3844 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003845
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003846" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003847" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003848 return
3849endfun
3850
3851" ---------------------------------------------------------------------
3852" s:NetrwFileInfo: supports qf (query for file information) {{{2
3853fun! s:NetrwFileInfo(islocal,fname)
Bram Moolenaar8d043172014-01-23 14:24:41 +01003854" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">) b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01003855 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00003856 if a:islocal
3857 if (has("unix") || has("macunix")) && executable("/bin/ls")
Bram Moolenaar8d043172014-01-23 14:24:41 +01003858
3859 if getline(".") == "../"
3860 echo system("/bin/ls -lsad ".shellescape(".."))
3861" call Decho("#1: echo system(/bin/ls -lsad ".shellescape(..).")")
3862
3863 elseif getline(".") !~ '^'.s:treedepthstring
3864 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir))
3865" call Decho("#2: echo system(/bin/ls -lsad ".shellescape(b:netrw_curdir).")")
3866
3867 elseif exists("b:netrw_curdir")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003868 if b:netrw_curdir =~ '/$'
3869 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003870" call Decho("#3: echo system(/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname).")")
3871
Bram Moolenaar446cb832008-06-24 21:56:24 +00003872 else
3873 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003874" call Decho("#4: echo system(/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003875 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01003876
Bram Moolenaar446cb832008-06-24 21:56:24 +00003877 else
3878" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
3879 echo system("/bin/ls -lsad ".shellescape(a:fname))
Bram Moolenaar8d043172014-01-23 14:24:41 +01003880" call Decho("#5: echo system(/bin/ls -lsad ".shellescape(a:fname).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003881 endif
3882 else
3883 " use vim functions to return information about file below cursor
3884" call Decho("using vim functions to query for file info")
3885 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
3886 let fname= substitute(a:fname,".$","","")
3887 else
3888 let fname= a:fname
3889 endif
3890 let t = getftime(fname)
3891 let sz = getfsize(fname)
3892 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
3893" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
3894 endif
3895 else
3896 echo "sorry, \"qf\" not supported yet for remote files"
3897 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003898 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00003899" call Dret("s:NetrwFileInfo")
3900endfun
3901
3902" ---------------------------------------------------------------------
3903" s:NetrwGetBuffer: {{{2
3904" returns 0=cleared buffer
3905" 1=re-used buffer
3906fun! s:NetrwGetBuffer(islocal,dirname)
3907" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
Bram Moolenaar8d043172014-01-23 14:24:41 +01003908" call Decho("(NetrwGetBuffer) 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)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003909 let dirname= a:dirname
3910
3911 " re-use buffer if possible {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003912" call Decho("(NetrwGetBuffer) --re-use a buffer if possible--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003913 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3914 " find NetrwTreeList buffer if there is one
Bram Moolenaarff034192013-04-24 18:51:19 +02003915" call Decho("(NetrwGetBuffer) case liststyle=treelist: find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003916 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +02003917" call Decho("(NetrwGetBuffer) re-using w:netrw_treebufnr=".w:netrw_treebufnr)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003918 let eikeep= &ei
3919 set ei=all
Bram Moolenaarff034192013-04-24 18:51:19 +02003920 exe "sil! keepalt b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00003921 let &ei= eikeep
Bram Moolenaar8d043172014-01-23 14:24:41 +01003922 setl ma
3923 sil! keepj %d
3924" call Decho("(NetrwGetBuffer) 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)
Bram Moolenaarff034192013-04-24 18:51:19 +02003925" call Dret("s:NetrwGetBuffer 0<buffer cleared> : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
3926 return 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003927 endif
3928 let bufnum= -1
Bram Moolenaarff034192013-04-24 18:51:19 +02003929" call Decho("(NetrwGetBuffer) liststyle=TREE but w:netrw_treebufnr doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003930
3931 else
3932 " find buffer number of buffer named precisely the same as dirname {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003933" call Decho("(NetrwGetBuffer) case listtyle not treelist: find buffer numnber of buffer named precisely the same as dirname--")
Bram Moolenaar8d043172014-01-23 14:24:41 +01003934" call Dredir("(NetrwGetBuffer) ls!","ls!")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003935
3936 " get dirname and associated buffer number
3937 let bufnum = bufnr(escape(dirname,'\'))
Bram Moolenaarff034192013-04-24 18:51:19 +02003938" call Decho("(NetrwGetBuffer) find buffer<".dirname.">'s number ")
3939" call Decho("(NetrwGetBuffer) bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003940
3941 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003942 " try appending a trailing /
Bram Moolenaarff034192013-04-24 18:51:19 +02003943" call Decho("(NetrwGetBuffer) try appending a trailing / to dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003944 let bufnum= bufnr(escape(dirname.'/','\'))
3945 if bufnum > 0
3946 let dirname= dirname.'/'
3947 endif
3948 endif
3949
3950 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003951 " try removing a trailing /
Bram Moolenaarff034192013-04-24 18:51:19 +02003952" call Decho("(NetrwGetBuffer) try removing a trailing / from dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003953 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
3954 if bufnum > 0
3955 let dirname= substitute(dirname,'/$','','')
3956 endif
3957 endif
3958
Bram Moolenaarff034192013-04-24 18:51:19 +02003959" call Decho("(NetrwGetBuffer) findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003960 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
3961 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
3962 " handle approximate matches
Bram Moolenaarff034192013-04-24 18:51:19 +02003963" call Decho("(NetrwGetBuffer) handling approx match: bufnum#".bufnum.">0 AND bufname<".bufname(bufnum).">!=dirname<".dirname."> AND bufname(".bufnum.")!='.'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003964 let ibuf = 1
3965 let buflast = bufnr("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02003966" call Decho("(NetrwGetBuffer) findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003967 while ibuf <= buflast
3968 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00003969 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02003970" call Decho("(NetrwGetBuffer) findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003971 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
3972 " bname is not empty
3973 " dirname ends with bname,
3974 " dirname doesn't start with /, so its not a absolute path
Bram Moolenaarff034192013-04-24 18:51:19 +02003975" call Decho("(NetrwGetBuffer) findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003976 break
3977 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003978 if bname =~ '^'.dirname.'/\=$'
3979 " bname begins with dirname
3980" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003981 break
3982 endif
3983 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003984" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
3985 break
3986 endif
3987 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
3988" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003989 break
3990 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003991 let ibuf= ibuf + 1
3992 endwhile
3993 if ibuf > buflast
3994 let bufnum= -1
3995 else
3996 let bufnum= ibuf
3997 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003998" call Decho("(NetrwGetBuffer) findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003999 endif
4000 endif
4001
4002 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02004003" call Decho("(NetrwGetBuffer) get enew buffer and name it OR re-use buffer")
4004 sil! keepj keepalt mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00004005 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaarff034192013-04-24 18:51:19 +02004006" call Decho("(NetrwGetBuffer) --get enew buffer and name it (bufnum#".bufnum."<0 OR bufexists(".bufnum.")=".bufexists(bufnum)."==0)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004007 call s:NetrwEnew(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004008" call Decho("(NetrwGetBuffer) got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004009 " name the buffer
4010 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
4011 " Got enew buffer; transform into a NetrwTreeListing
Bram Moolenaarff034192013-04-24 18:51:19 +02004012" call Decho("(NetrwGetBuffer) --transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004013 if !exists("s:netrw_treelistnum")
4014 let s:netrw_treelistnum= 1
4015 else
4016 let s:netrw_treelistnum= s:netrw_treelistnum + 1
4017 endif
4018 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02004019" call Decho("(NetrwGetBuffer) exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004020 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
4021 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02004022 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
4023 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
4024 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
4025 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02004026" call Decho("(NetrwGetBuffer) tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004027 else
4028" let v:errmsg= "" " Decho
4029 let escdirname= fnameescape(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004030" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004031" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004032" let v:errmsg= "" " Decho
4033 exe 'sil! keepalt file '.escdirname
Bram Moolenaarff034192013-04-24 18:51:19 +02004034" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004035 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004036" call Decho("(NetrwGetBuffer) named enew buffer#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004037
4038 else " Re-use the buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02004039" call Decho("(NetrwGetBuffer) --re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004040 let eikeep= &ei
4041 set ei=all
4042 if getline(2) =~ '^" Netrw Directory Listing'
Bram Moolenaarff034192013-04-24 18:51:19 +02004043" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004044 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00004045 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004046" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum)
4047 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00004048 endif
4049 if bufname("%") == '.'
Bram Moolenaarff034192013-04-24 18:51:19 +02004050" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004051 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00004052 endif
4053 let &ei= eikeep
4054 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02004055 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar8d043172014-01-23 14:24:41 +01004056" call Decho("(NetrwGetBuffer) 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)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004057" call Dret("s:NetrwGetBuffer 0<buffer empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
4058 return 0
4059 elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
4060 keepj call s:NetrwListSettings(a:islocal)
4061 sil keepj %d
Bram Moolenaar8d043172014-01-23 14:24:41 +01004062" call Decho("(NetrwGetBuffer) 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)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004063" 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 +00004064 return 0
4065 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02004066" call Decho("(NetrwGetBuffer) --re-use tree listing--")
4067" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004068 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02004069 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar8d043172014-01-23 14:24:41 +01004070" call Decho("(NetrwGetBuffer) 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)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004071" 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 +00004072 return 0
4073 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01004074" call Decho("(NetrwGetBuffer) 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)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004075" call Dret("s:NetrwGetBuffer 1<buffer not cleared> : buf#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004076 return 1
4077 endif
4078 endif
4079
4080 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
4081 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
4082 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
4083 " med 1 D H
4084 " fast 2 H H
Bram Moolenaarff034192013-04-24 18:51:19 +02004085" call Decho("(NetrwGetBuffer) --do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004086 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004087 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02004088" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02004089 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004090
4091 " delete all lines from buffer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02004092" call Decho("(NetrwGetBuffer) --delete all lines from buffer--")
4093" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004094 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004095
Bram Moolenaar8d043172014-01-23 14:24:41 +01004096" call Decho("(NetrwGetBuffer) 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)
4097" call Dret("s:NetrwGetBuffer 0<cleared buffer> : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004098 return 0
4099endfun
4100
4101" ---------------------------------------------------------------------
4102" s:NetrwGetcwd: get the current directory. {{{2
4103" Change backslashes to forward slashes, if any.
4104" If doesc is true, escape certain troublesome characters
4105fun! s:NetrwGetcwd(doesc)
4106" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
4107 let curdir= substitute(getcwd(),'\\','/','ge')
4108 if curdir !~ '[\/]$'
4109 let curdir= curdir.'/'
4110 endif
4111 if a:doesc
4112 let curdir= fnameescape(curdir)
4113 endif
4114" call Dret("NetrwGetcwd <".curdir.">")
4115 return curdir
4116endfun
4117
4118" ---------------------------------------------------------------------
4119" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
4120fun! s:NetrwGetWord()
4121" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
4122 call s:UseBufWinVars()
4123
4124 " insure that w:netrw_liststyle is set up
4125 if !exists("w:netrw_liststyle")
4126 if exists("g:netrw_liststyle")
4127 let w:netrw_liststyle= g:netrw_liststyle
4128 else
4129 let w:netrw_liststyle= s:THINLIST
4130 endif
4131" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
4132 endif
4133
4134 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
4135 " Active Banner support
4136" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004137 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004138 let dirname= "./"
4139 let curline= getline('.')
4140
4141 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004142 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00004143 let s:netrw_skipbrowse= 1
4144 echo 'Pressing "s" also works'
4145
4146 elseif curline =~ '"\s*Sort sequence:'
4147 let s:netrw_skipbrowse= 1
4148 echo 'Press "S" to edit sorting sequence'
4149
4150 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004151 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00004152 let s:netrw_skipbrowse= 1
4153 echo 'Pressing "?" also works'
4154
4155 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004156 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00004157 let s:netrw_skipbrowse= 1
4158 echo 'Pressing "a" also works'
4159
4160 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004161 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004162 endif
4163
4164 elseif w:netrw_liststyle == s:THINLIST
4165" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004166 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004167 let dirname= getline('.')
4168
4169 elseif w:netrw_liststyle == s:LONGLIST
4170" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004171 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004172 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
4173
4174 elseif w:netrw_liststyle == s:TREELIST
4175" call Decho("treelist handling")
Bram Moolenaar8d043172014-01-23 14:24:41 +01004176 let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004177
4178 else
4179" call Decho("obtain word from wide listing")
4180 let dirname= getline('.')
4181
4182 if !exists("b:netrw_cpf")
4183 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004184 exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004185 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004186" call Decho("computed cpf=".b:netrw_cpf)
4187 endif
4188
4189" call Decho("buf#".bufnr("%")."<".bufname("%").">")
4190 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
4191" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
4192" call Decho("1: dirname<".dirname.">")
4193 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004194 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004195 else
4196 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004197 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004198 endif
4199 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004200 let eofname= filestart + b:netrw_cpf + 1
4201 if eofname <= col("$")
4202 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004203 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004204 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004205 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00004206 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004207 let dirname = @a
4208 let @a = rega
4209" call Decho("2: dirname<".dirname.">")
4210 let dirname= substitute(dirname,'\s\+$','','e')
4211" call Decho("3: dirname<".dirname.">")
4212 endif
4213
4214 " symlinks are indicated by a trailing "@". Remove it before further processing.
4215 let dirname= substitute(dirname,"@$","","")
4216
4217 " executables are indicated by a trailing "*". Remove it before further processing.
4218 let dirname= substitute(dirname,"\*$","","")
4219
4220" call Dret("s:NetrwGetWord <".dirname.">")
4221 return dirname
4222endfun
4223
4224" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004225" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004226fun! s:NetrwListSettings(islocal)
4227" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
Bram Moolenaar8d043172014-01-23 14:24:41 +01004228" call Decho("(s:NetrwListSettings) 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)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004229 let fname= bufname("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02004230" call Decho("(NetrwListSettings) setl bt=nofile nobl ma nonu nowrap noro")
4231 setl bt=nofile nobl ma nonu nowrap noro
4232" call Decho("(NetrwListSettings) exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004233 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004234 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004235 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004236 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01004237" call Dredir("ls!")
Bram Moolenaarff034192013-04-24 18:51:19 +02004238" call Decho("(NetrwListSettings) exe setl ts=".(g:netrw_maxfilenamelen+1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004239 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaarff034192013-04-24 18:51:19 +02004240 setl isk+=.,~,-
Bram Moolenaar446cb832008-06-24 21:56:24 +00004241 if g:netrw_fastbrowse > a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004242 setl bh=hide
Bram Moolenaar446cb832008-06-24 21:56:24 +00004243 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004244 setl bh=delete
Bram Moolenaar446cb832008-06-24 21:56:24 +00004245 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01004246" call Decho("(s:NetrwListSettings) 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)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004247" call Dret("s:NetrwListSettings")
4248endfun
4249
4250" ---------------------------------------------------------------------
4251" s:NetrwListStyle: {{{2
4252" islocal=0: remote browsing
4253" =1: local browsing
4254fun! s:NetrwListStyle(islocal)
4255" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004256 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004257 let fname = s:NetrwGetWord()
4258 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
4259 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
4260" call Decho("fname<".fname.">")
4261" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
4262" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
4263
4264 if w:netrw_liststyle == s:THINLIST
4265 " use one column listing
4266" call Decho("use one column list")
4267 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4268
4269 elseif w:netrw_liststyle == s:LONGLIST
4270 " use long list
4271" call Decho("use long list")
4272 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4273
4274 elseif w:netrw_liststyle == s:WIDELIST
4275 " give wide list
4276" call Decho("use wide list")
4277 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4278
4279 elseif w:netrw_liststyle == s:TREELIST
4280" call Decho("use tree list")
4281 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4282
4283 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004284 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004285 let g:netrw_liststyle = s:THINLIST
4286 let w:netrw_liststyle = g:netrw_liststyle
4287 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4288 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004289 setl ma noro
4290" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004291
4292 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
4293" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004294 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004295 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004296" call Decho("(NetrwListStyle) setl nomod")
4297 setl nomod
4298" call Decho("(NetrwListStyle) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004299
4300 " refresh the listing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004301" call Decho("(NetrwListStyle) refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004302 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004303 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4304 keepj call netrw#NetrwRestorePosn(svpos)
4305 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004306
4307 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004308 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00004309 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4310" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4311 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004312 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004313 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004314 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004315
4316" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4317endfun
4318
4319" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004320" s:NetrwBannerCtrl: toggles the display of the banner {{{2
4321fun! s:NetrwBannerCtrl(islocal)
4322" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
4323
Bram Moolenaar97d62492012-11-15 21:28:22 +01004324 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004325 " toggle the banner (enable/suppress)
4326 let g:netrw_banner= !g:netrw_banner
4327
4328 " refresh the listing
4329 let svpos= netrw#NetrwSavePosn()
4330 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4331
4332 " keep cursor on the filename
4333 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004334 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01004335 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4336" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4337 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004338 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01004339 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004340 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004341" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
4342endfun
4343
4344" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004345" s:NetrwBookmarkMenu: Uses menu priorities {{{2
4346" .2.[cnt] for bookmarks, and
4347" .3.[cnt] for history
4348" (see s:NetrwMenu())
4349fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004350 if !exists("s:netrw_menucnt")
4351 return
4352 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004353" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004354
4355 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02004356 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00004357 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004358" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004359 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4360 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004361 endif
4362 if !exists("s:netrw_initbookhist")
4363 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004364 endif
4365
4366 " show bookmarked places
Bram Moolenaarff034192013-04-24 18:51:19 +02004367 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004368 let cnt= 1
4369 for bmd in g:netrw_bookmarklist
Bram Moolenaar8d043172014-01-23 14:24:41 +01004370" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
4371 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004372
4373 " show bookmarks for goto menu
Bram Moolenaar8d043172014-01-23 14:24:41 +01004374 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004375
4376 " show bookmarks for deletion menu
Bram Moolenaar8d043172014-01-23 14:24:41 +01004377 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 +01004378 let cnt= cnt + 1
4379 endfor
4380
4381 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004382
4383 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02004384 if g:netrw_dirhistmax > 0
4385 let cnt = g:netrw_dirhist_cnt
4386 let first = 1
4387 let histcnt = 0
4388 while ( first || cnt != g:netrw_dirhist_cnt )
4389 let histcnt = histcnt + 1
4390 let priority = g:netrw_dirhist_cnt + histcnt
4391 if exists("g:netrw_dirhist_{cnt}")
4392 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
4393" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
4394 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
4395 endif
4396 let first = 0
4397 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4398 if cnt < 0
4399 let cnt= cnt + g:netrw_dirhistmax
4400 endif
4401 endwhile
4402 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004403
Bram Moolenaar9964e462007-05-05 17:54:07 +00004404 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004405" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004406endfun
4407
4408" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004409" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
4410" directory and a new directory name. Also, if the
4411" "new directory name" is actually a file,
4412" NetrwBrowseChgDir() edits the file.
4413fun! s:NetrwBrowseChgDir(islocal,newdir,...)
4414" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004415
Bram Moolenaar97d62492012-11-15 21:28:22 +01004416 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004417 if !exists("b:netrw_curdir")
4418 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
4419 " and the current window is the NetrwMessage window.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004420 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004421" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004422" call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">")
Bram Moolenaar8d043172014-01-23 14:24:41 +01004423" call Dredir("ls!")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004424" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004425 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004426 endif
4427
Bram Moolenaar97d62492012-11-15 21:28:22 +01004428 " NetrwBrowseChgDir: save options and initialize {{{3
Bram Moolenaar8d043172014-01-23 14:24:41 +01004429" call Decho("(NetrwBrowseChgDir) saving options")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004430 keepj call s:NetrwOptionSave("s:")
4431 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004432 let nbcd_curpos = netrw#NetrwSavePosn()
4433 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004434" call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004435 if (has("win32") || has("win95") || has("win64") || has("win16"))
4436 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
4437 else
4438 let dirname= b:netrw_curdir
4439 endif
4440 let newdir = a:newdir
4441 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00004442
Bram Moolenaar446cb832008-06-24 21:56:24 +00004443 " set up o/s-dependent directory recognition pattern
Bram Moolenaar8d043172014-01-23 14:24:41 +01004444" call Decho("(NetrwBrowseChgDir) set up o/s-dependent directory recognition pattern")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004445 if has("amiga")
4446 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00004447 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004448 let dirpat= '[\/]$'
4449 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004450" call Decho("(NetrwBrowseChgDir) dirname<".dirname."> dirpat<".dirpat.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004451
4452 if dirname !~ dirpat
4453 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02004454 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004455 let dirname= dirname.'/'
Bram Moolenaarff034192013-04-24 18:51:19 +02004456" call Decho("(NetrwBrowseChgDir) adjusting dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004457 endif
4458
4459 if newdir !~ dirpat
Bram Moolenaar97d62492012-11-15 21:28:22 +01004460 " ------------------------------
4461 " NetrwBrowseChgDir: edit a file {{{3
4462 " ------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004463" call Decho('(NetrwBrowseChgDir:edit-a-file) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004464
Bram Moolenaar97d62492012-11-15 21:28:22 +01004465 " save position for benefit of Rexplore
4466 let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn()
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004467
Bram Moolenaarff034192013-04-24 18:51:19 +02004468" call Decho("(NetrwBrowseChgDir:edit-a-file) setting s:rexposn_".bufnr("%")." to SavePosn")
Bram Moolenaar8d043172014-01-23 14:24:41 +01004469" call Decho("(NetrwBrowseChgDir:edit-a-file) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004470 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
Bram Moolenaar8d043172014-01-23 14:24:41 +01004471" call Decho("(NetrwBrowseChgDir:edit-a-file) handle tree listing: w:netrw_treedict<".(exists("w:netrw_treedict")? string(w:netrw_treedict) : 'n/a').">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004472 let dirname= s:NetrwTreeDir()
4473 if dirname =~ '/$'
4474 let dirname= dirname.newdir
4475 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01004476 let dirname= dirname."/".newdir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004477 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004478" call Decho("(NetrwBrowseChgDir:edit-a-file) dirname<".dirname.">")
4479" call Decho("(NetrwBrowseChgDir:edit-a-file) tree listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004480 elseif newdir =~ '^\(/\|\a:\)'
4481 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004482 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004483 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004484 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004485" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file: dirname<".dirname."> (a:0=".a:0.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004486 " this lets NetrwBrowseX avoid the edit
4487 if a:0 < 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004488" call Decho("(NetrwBrowseChgDir:edit-a-file) set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02004489 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004490 if !exists("s:didsplit")
Bram Moolenaarff034192013-04-24 18:51:19 +02004491" call Decho("(NetrwBrowseChgDir:edit-a-file) s:didsplit does not exist; g:netrw_browse_split=".g:netrw_browse_split." win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00004492 if g:netrw_browse_split == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01004493 " horizontally splitting the window first
Bram Moolenaarff034192013-04-24 18:51:19 +02004494 keepalt new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004495 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004496 keepalt wincmd _
Bram Moolenaar5c736222010-01-06 20:54:52 +01004497 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004498 elseif g:netrw_browse_split == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01004499 " vertically splitting the window first
Bram Moolenaarff034192013-04-24 18:51:19 +02004500 keepalt rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004501 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004502 keepalt wincmd |
Bram Moolenaar5c736222010-01-06 20:54:52 +01004503 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004504 elseif g:netrw_browse_split == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004505 " open file in new tab
Bram Moolenaarff034192013-04-24 18:51:19 +02004506 keepalt tabnew
Bram Moolenaar446cb832008-06-24 21:56:24 +00004507 elseif g:netrw_browse_split == 4
Bram Moolenaar97d62492012-11-15 21:28:22 +01004508 " act like "P" (ie. open previous window)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004509 if s:NetrwPrevWinOpen(2) == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004510 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004511" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004512 return
4513 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004514 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004515 " handling a file, didn't split, so remove menu
Bram Moolenaarff034192013-04-24 18:51:19 +02004516" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file+didn't split, so remove menu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004517 call s:NetrwMenu(0)
4518 " optional change to window
4519 if g:netrw_chgwin >= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004520 exe "keepj keepalt ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004521 endif
4522 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004523 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004524
Bram Moolenaar446cb832008-06-24 21:56:24 +00004525 " the point where netrw actually edits the (local) file
4526 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
Bram Moolenaar8d043172014-01-23 14:24:41 +01004527 " no keepalt to support :e # to return to a directory listing
Bram Moolenaar446cb832008-06-24 21:56:24 +00004528 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004529" call Decho("(NetrwBrowseChgDir:edit-a-file) edit local file: exe e! ".fnameescape(dirname))
Bram Moolenaar8d043172014-01-23 14:24:41 +01004530 " some like c-^ to return to the last edited file
4531 " others like c-^ to return to the netrw buffer
4532 if exists("g:netrw_altfile") && g:netrw_altfile
4533 exe "keepj keepalt e! ".fnameescape(dirname)
4534 else
4535 exe "keepj e! ".fnameescape(dirname)
4536 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004537 call s:NetrwCursor()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004538 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004539" call Decho("(NetrwBrowseChgDir:edit-a-file) remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004540 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004541 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01004542
4543 " handle g:Netrw_funcref -- call external-to-netrw functions
4544 " This code will handle g:Netrw_funcref as an individual function reference
4545 " or as a list of function references. It will ignore anything that's not
4546 " a function reference. See :help Funcref for information about function references.
4547 if exists("g:Netrw_funcref")
Bram Moolenaarff034192013-04-24 18:51:19 +02004548" call Decho("(NetrwBrowseChgDir:edit-a-file) handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004549 if type(g:Netrw_funcref) == 2
Bram Moolenaarff034192013-04-24 18:51:19 +02004550" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004551 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004552 elseif type(g:Netrw_funcref) == 3
Bram Moolenaarff034192013-04-24 18:51:19 +02004553" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004554 for Fncref in g:Netrw_funcref
4555 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02004556 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004557 endif
4558 endfor
4559 endif
4560 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004561 endif
4562
4563 elseif newdir =~ '^/'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004564 " ----------------------------------------------------
4565 " NetrwBrowseChgDir: just go to the new directory spec {{{3
4566 " ----------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004567" call Decho('(NetrwBrowseChgDir:goto-newdir) case "just go to new directory spec": newdir<'.newdir.'>')
Bram Moolenaar97d62492012-11-15 21:28:22 +01004568 let dirname = newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02004569 keepj call s:SetRexDir(a:islocal,dirname)
4570 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004571
4572 elseif newdir == './'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004573 " ---------------------------------------------
4574 " NetrwBrowseChgDir: refresh the directory list {{{3
4575 " ---------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004576" call Decho('(NetrwBrowseChgDir:refresh-dirlist) case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004577 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004578
4579 elseif newdir == '../'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004580 " --------------------------------------
4581 " NetrwBrowseChgDir: go up one directory {{{3
4582 " --------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004583" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004584
4585 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
4586 " force a refresh
Bram Moolenaarff034192013-04-24 18:51:19 +02004587" call Decho("(NetrwBrowseChgDir:go-up) clear buffer<".expand("%")."> with :%d")
4588" call Decho("(NetrwBrowseChgDir:go-up) setl noro ma")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004589 setl noro ma
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004590 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004591 endif
4592
4593 if has("amiga")
4594 " amiga
Bram Moolenaarff034192013-04-24 18:51:19 +02004595" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and amiga')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004596 if a:islocal
4597 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
4598 let dirname= substitute(dirname,'/$','','')
4599 else
4600 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
4601 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004602" call Decho("(NetrwBrowseChgDir:go-up) amiga: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004603
Bram Moolenaar8d043172014-01-23 14:24:41 +01004604 elseif !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
4605 " windows
4606 if a:islocal
4607 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4608 if dirname == ""
4609 let dirname= '/'
4610 endif
4611 else
4612 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
4613 endif
4614 if dirname =~ '^\a:$'
4615 let dirname= dirname.'/'
4616 endif
4617" call Decho("(NetrwBrowseChgDir:go-up) windows: dirname<".dirname."> (go up one dir)")
4618
Bram Moolenaar446cb832008-06-24 21:56:24 +00004619 else
4620 " unix or cygwin
Bram Moolenaarff034192013-04-24 18:51:19 +02004621" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and unix or cygwin')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004622 if a:islocal
4623 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4624 if dirname == ""
4625 let dirname= '/'
4626 endif
4627 else
4628 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
4629 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004630" call Decho("(NetrwBrowseChgDir:go-up) unix: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004631 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004632 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004633
4634 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004635 " --------------------------------------
4636 " NetrwBrowseChgDir: Handle Tree Listing {{{3
4637 " --------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004638" call Decho('(NetrwBrowseChgDir:tree-list) case liststyle is TREELIST and w:netrw_treedict exists')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004639 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
Bram Moolenaarff034192013-04-24 18:51:19 +02004640" call Decho("(NetrwBrowseChgDir) (treelist) setl noro ma")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004641 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004642 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004643" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004644 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004645 endif
4646 let treedir = s:NetrwTreeDir()
4647 let s:treecurpos = nbcd_curpos
4648 let haskey= 0
Bram Moolenaarff034192013-04-24 18:51:19 +02004649" call Decho("(NetrwBrowseChgDir:tree-list) w:netrw_treedict<".string(w:netrw_treedict).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004650
4651 " search treedict for tree dir as-is
4652 if has_key(w:netrw_treedict,treedir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004653" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004654 let haskey= 1
4655 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004656" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004657 endif
4658
4659 " search treedict for treedir with a / appended
4660 if !haskey && treedir !~ '/$'
4661 if has_key(w:netrw_treedict,treedir."/")
4662 let treedir= treedir."/"
Bram Moolenaarff034192013-04-24 18:51:19 +02004663" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004664 let haskey = 1
4665 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004666" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'/> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004667 endif
4668 endif
4669
4670 " search treedict for treedir with any trailing / elided
4671 if !haskey && treedir =~ '/$'
4672 let treedir= substitute(treedir,'/$','','')
4673 if has_key(w:netrw_treedict,treedir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004674" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004675 let haskey = 1
4676 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004677" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004678 endif
4679 endif
4680
4681 if haskey
4682 " close tree listing for selected subdirectory
Bram Moolenaarff034192013-04-24 18:51:19 +02004683" call Decho("(NetrwBrowseChgDir:tree-list) closing selected subdirectory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004684 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004685" call Decho("(NetrwBrowseChgDir) removed entry<".treedir."> from treedict")
4686" call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004687 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00004688 else
4689 " go down one directory
4690 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaarff034192013-04-24 18:51:19 +02004691" call Decho("(NetrwBrowseChgDir:tree-list) go down one dir: treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004692 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004693 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004694 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004695
4696 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004697 " ----------------------------------------
4698 " NetrwBrowseChgDir: Go down one directory {{{3
4699 " ----------------------------------------
4700 let dirname = s:ComposePath(dirname,newdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004701" call Decho("(NetrwBrowseChgDir:go-down) go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004702 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004703 endif
4704
Bram Moolenaar97d62492012-11-15 21:28:22 +01004705 " --------------------------------------
4706 " NetrwBrowseChgDir: Restore and Cleanup {{{3
4707 " --------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004708 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004709 if dolockout
Bram Moolenaarff034192013-04-24 18:51:19 +02004710" call Decho("(NetrwBrowseChgDir:restore) filewritable(dirname<".dirname.">)=".filewritable(dirname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004711 if filewritable(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004712" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod noro")
4713" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004714 setl ma nomod noro
Bram Moolenaarff034192013-04-24 18:51:19 +02004715" call Decho("(NetrwBrowseChgDir:restore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004716 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004717" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod ro")
4718" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004719 setl ma nomod ro
Bram Moolenaarff034192013-04-24 18:51:19 +02004720" call Decho("(NetrwBrowseChgDir:restore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004721 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004722 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004723 let @@= ykeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00004724
Bram Moolenaar446cb832008-06-24 21:56:24 +00004725" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
4726 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00004727endfun
4728
4729" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004730" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
4731" given filename; typically this means given their extension.
4732" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00004733fun! netrw#NetrwBrowseX(fname,remote)
4734" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
4735
Bram Moolenaar97d62492012-11-15 21:28:22 +01004736 let ykeep = @@
4737 let screenposn = netrw#NetrwSavePosn()
4738
Bram Moolenaar5c736222010-01-06 20:54:52 +01004739 " special core dump handler
4740 if a:fname =~ '/core\(\.\d\+\)\=$'
4741 if exists("g:Netrw_corehandler")
4742 if type(g:Netrw_corehandler) == 2
4743 " g:Netrw_corehandler is a function reference (see :help Funcref)
4744" call Decho("g:Netrw_corehandler is a funcref")
4745 call g:Netrw_corehandler(a:fname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004746 elseif type(g:Netrw_corehandler) == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01004747 " g:Netrw_corehandler is a List of function references (see :help Funcref)
4748" call Decho("g:Netrw_corehandler is a List")
4749 for Fncref in g:Netrw_corehandler
4750 if type(FncRef) == 2
4751 call FncRef(a:fname)
4752 endif
4753 endfor
4754 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004755 call netrw#NetrwRestorePosn(screenposn)
4756 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004757" call Dret("NetrwBrowseX : coredump handler invoked")
4758 return
4759 endif
4760 endif
4761
Bram Moolenaar446cb832008-06-24 21:56:24 +00004762 " set up the filename
4763 " (lower case the extension, make a local copy of a remote file)
4764 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
4765 if has("win32") || has("win95") || has("win64") || has("win16")
4766 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00004767 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004768" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004769
4770 " seems kde systems often have gnome-open due to dependencies, even though
4771 " gnome-open's subsidiary display tools are largely absent. Kde systems
4772 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
4773 if !exists("s:haskdeinit")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004774 if has("unix") && executable("ps") && !has("win32unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004775 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004776 if v:shell_error
4777 let s:haskdeinit = 0
4778 endif
4779 else
4780 let s:haskdeinit= 0
4781 endif
4782" call Decho("setting s:haskdeinit=".s:haskdeinit)
4783 endif
4784
4785 if a:remote == 1
4786 " create a local copy
Bram Moolenaar97d62492012-11-15 21:28:22 +01004787" call Decho("(remote) a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaarff034192013-04-24 18:51:19 +02004788 setl bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01004789 call netrw#NetRead(3,a:fname)
4790 " attempt to rename tempfile
4791 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01004792 let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004793" call Decho("basename<".basename.">")
4794" call Decho("newname <".newname.">")
4795 if rename(s:netrw_tmpfile,newname) == 0
4796 " renaming succeeded
4797 let fname= newname
4798 else
4799 " renaming failed
4800 let fname= s:netrw_tmpfile
4801 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00004802 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004803" call Decho("(local) a:remote=".a:remote.": handling local copy of <".a:fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004804 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004805 " special ~ handler for local
4806 if fname =~ '^\~' && expand("$HOME") != ""
4807" call Decho('invoking special ~ handler')
4808 let fname= substitute(fname,'^\~',expand("$HOME"),'')
4809 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004810 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004811" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004812" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
4813
4814 " set up redirection
4815 if &srr =~ "%s"
4816 if (has("win32") || has("win95") || has("win64") || has("win16"))
4817 let redir= substitute(&srr,"%s","nul","")
4818 else
4819 let redir= substitute(&srr,"%s","/dev/null","")
4820 endif
4821 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
4822 let redir= &srr . "nul"
4823 else
4824 let redir= &srr . "/dev/null"
4825 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004826" call Decho("set up redirection: redir{".redir."} srr{".&srr."}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004827
4828 " extract any viewing options. Assumes that they're set apart by quotes.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004829" call Decho("extract any viewing options")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004830 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004831" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004832 if g:netrw_browsex_viewer =~ '\s'
4833 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
4834 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
4835 let oviewer = ''
4836 let cnt = 1
4837 while !executable(viewer) && viewer != oviewer
4838 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
4839 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
4840 let cnt = cnt + 1
4841 let oviewer = viewer
4842" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
4843 endwhile
4844 else
4845 let viewer = g:netrw_browsex_viewer
4846 let viewopt = ""
4847 endif
4848" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
4849 endif
4850
4851 " execute the file handler
Bram Moolenaar97d62492012-11-15 21:28:22 +01004852" call Decho("execute the file handler (if any)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004853 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
4854" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
4855 let ret= netrwFileHandlers#Invoke(exten,fname)
4856
4857 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
4858" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004859" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
4860 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004861 let ret= v:shell_error
4862
4863 elseif has("win32") || has("win64")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004864" call Decho("windows")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004865 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004866" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4867 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004868 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004869" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4870 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004871 else
4872 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4873 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004874 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4875 let ret= v:shell_error
4876
Bram Moolenaar97d62492012-11-15 21:28:22 +01004877 elseif has("win32unix")
4878 let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
4879" call Decho("cygwin: winfname<".shellescape(winfname,1).">")
4880 if executable("start")
4881" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4882 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4883 elseif executable("rundll32")
4884" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4885 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4886 else
4887 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4888 endif
4889 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4890 let ret= v:shell_error
4891
4892 elseif has("unix") && executable("xdg-open") && !s:haskdeinit
4893" call Decho("unix and xdg-open")
4894" call Decho("exe sil !xdg-open ".shellescape(fname,1)." ".redir)
4895 exe "sil !xdg-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004896 let ret= v:shell_error
4897
4898 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar97d62492012-11-15 21:28:22 +01004899" call Decho("unix and kfmclient")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004900" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004901 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004902 let ret= v:shell_error
4903
4904 elseif has("macunix") && executable("open")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004905" call Decho("macunix and open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004906" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004907 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004908 let ret= v:shell_error
4909
4910 else
4911 " netrwFileHandlers#Invoke() always returns 0
4912 let ret= netrwFileHandlers#Invoke(exten,fname)
4913 endif
4914
4915 " if unsuccessful, attempt netrwFileHandlers#Invoke()
4916 if ret
4917 let ret= netrwFileHandlers#Invoke(exten,fname)
4918 endif
4919
Bram Moolenaarc236c162008-07-13 17:41:49 +00004920 " restoring redraw! after external file handlers
4921 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00004922
4923 " cleanup: remove temporary file,
4924 " delete current buffer if success with handler,
4925 " return to prior buffer (directory listing)
4926 " Feb 12, 2008: had to de-activiate removal of
4927 " temporary file because it wasn't getting seen.
4928" if a:remote == 1 && fname != a:fname
Bram Moolenaar97d62492012-11-15 21:28:22 +01004929"" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004930" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004931" endif
4932
4933 if a:remote == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004934 setl bh=delete bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00004935 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004936 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004937 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004938 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004939" redraw!
4940 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004941 call netrw#NetrwRestorePosn(screenposn)
4942 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004943
4944" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004945endfun
4946
4947" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004948" s:NetrwChgPerm: (implements "gp") change file permission {{{2
4949fun! s:NetrwChgPerm(islocal,curdir)
4950" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004951 let ykeep = @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004952 call inputsave()
4953 let newperm= input("Enter new permission: ")
4954 call inputrestore()
4955 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
4956 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
4957" call Decho("chgperm<".chgperm.">")
4958 call system(chgperm)
4959 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004960 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004961 endif
4962 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02004963 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004964 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004965 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004966" call Dret("s:NetrwChgPerm")
4967endfun
4968
4969" ---------------------------------------------------------------------
4970" s:NetrwClearExplore: clear explore variables (if any) {{{2
4971fun! s:NetrwClearExplore()
4972" call Dfunc("s:NetrwClearExplore()")
4973 2match none
4974 if exists("s:explore_match") |unlet s:explore_match |endif
4975 if exists("s:explore_indx") |unlet s:explore_indx |endif
4976 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
4977 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
4978 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
4979 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
4980 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
4981 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
4982 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
4983" redraw!
4984 echo " "
4985 echo " "
4986" call Dret("s:NetrwClearExplore")
4987endfun
4988
4989" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004990" s:NetrwExploreListUniq: {{{2
4991fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02004992" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004993
4994 " this assumes that the list is already sorted
4995 let newexplist= []
4996 for member in a:explist
4997 if !exists("uniqmember") || member != uniqmember
4998 let uniqmember = member
4999 let newexplist = newexplist + [ member ]
5000 endif
5001 endfor
5002
Bram Moolenaar15146672011-10-20 22:22:38 +02005003" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005004 return newexplist
5005endfun
5006
5007" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02005008" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
5009fun! s:NetrwForceChgDir(islocal,newdir)
5010" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005011 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02005012 if a:newdir !~ '/$'
5013 " ok, looks like force is needed to get directory-style treatment
5014 if a:newdir =~ '@$'
5015 let newdir= substitute(a:newdir,'@$','/','')
5016 elseif a:newdir =~ '[*=|\\]$'
5017 let newdir= substitute(a:newdir,'.$','/','')
5018 else
5019 let newdir= a:newdir.'/'
5020 endif
5021" call Decho("adjusting newdir<".newdir."> due to gd")
5022 else
5023 " should already be getting treatment as a directory
5024 let newdir= a:newdir
5025 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005026 let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005027 call s:NetrwBrowse(a:islocal,newdir)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005028 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02005029" call Dret("s:NetrwForceChgDir")
5030endfun
5031
5032" ---------------------------------------------------------------------
5033" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
5034fun! s:NetrwForceFile(islocal,newfile)
Bram Moolenaarff034192013-04-24 18:51:19 +02005035" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005036 if a:newfile =~ '[/@*=|\\]$'
5037 let newfile= substitute(a:newfile,'.$','','')
5038 else
5039 let newfile= a:newfile
5040 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005041 if a:islocal
5042 call s:NetrwBrowseChgDir(a:islocal,newfile)
5043 else
5044 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
5045 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005046" call Dret("s:NetrwForceFile")
5047endfun
5048
5049" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005050" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
5051" and switches the hiding mode. The actual hiding is done by
5052" s:NetrwListHide().
5053" g:netrw_hide= 0: show all
5054" 1: show not-hidden files
5055" 2: show hidden files only
5056fun! s:NetrwHide(islocal)
5057" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005058 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005059 let svpos= netrw#NetrwSavePosn()
5060
5061 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5062" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
5063" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
5064
5065 " hide the files in the markfile list
5066 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02005067" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." l:isk=".&l:isk)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005068 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
5069 " remove fname from hiding list
5070 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
5071 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
5072 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
5073" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
5074 else
5075 " append fname to hiding list
5076 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
5077 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
5078 else
5079 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
5080 endif
5081" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
5082 endif
5083 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02005084 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005085 let g:netrw_hide= 1
5086
5087 else
5088
5089 " switch between show-all/show-not-hidden/show-hidden
5090 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005091 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005092 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005093 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005094 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005095" call Dret("NetrwHide")
5096 return
5097 endif
5098 endif
5099
Bram Moolenaaradc21822011-04-01 18:03:16 +02005100 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5101 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005102 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005103" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00005104endfun
5105
5106" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005107" s:NetrwHidden: invoked by "gh" {{{2
5108fun! s:NetrwHidden(islocal)
5109" call Dfunc("s:NetrwHidden()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005110 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005111 " save current position
5112 let svpos= netrw#NetrwSavePosn()
5113
5114 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
5115 " remove pattern from hiding list
5116 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01005117 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005118 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
5119 else
5120 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
5121 endif
5122
5123 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02005124 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5125 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005126 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005127" call Dret("s:NetrwHidden")
5128endfun
5129
5130" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01005131" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
5132fun! s:NetrwHome()
5133 if exists("g:netrw_home")
5134 let home= g:netrw_home
5135 else
5136 " go to vim plugin home
5137 for home in split(&rtp,',') + ['']
5138 if isdirectory(home) && filewritable(home) | break | endif
5139 let basehome= substitute(home,'[/\\]\.vim$','','')
5140 if isdirectory(basehome) && filewritable(basehome)
5141 let home= basehome."/.vim"
5142 break
5143 endif
5144 endfor
5145 if home == ""
5146 " just pick the first directory
5147 let home= substitute(&rtp,',.*$','','')
5148 endif
5149 if (has("win32") || has("win95") || has("win64") || has("win16"))
5150 let home= substitute(home,'/','\\','g')
5151 endif
5152 endif
5153 " insure that the home directory exists
Bram Moolenaarff034192013-04-24 18:51:19 +02005154 if g:netrw_dirhistmax > 0 && !isdirectory(home)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005155 if exists("g:netrw_mkdir")
5156 call system(g:netrw_mkdir." ".shellescape(home))
5157 else
5158 call mkdir(home)
5159 endif
5160 endif
5161 let g:netrw_home= home
5162 return home
5163endfun
5164
5165" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005166" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
5167fun! s:NetrwLeftmouse(islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02005168 if exists("s:netrwdrag")
5169 return
5170 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005171" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005172
Bram Moolenaar97d62492012-11-15 21:28:22 +01005173 let ykeep= @@
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005174 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02005175 while getchar(0) != 0
5176 "clear the input stream
5177 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005178 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005179 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005180 let mouse_lnum = v:mouse_lnum
5181 let wlastline = line('w$')
5182 let lastline = line('$')
5183" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
5184" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
5185 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
5186 " appears to be a status bar leftmouse click
Bram Moolenaar97d62492012-11-15 21:28:22 +01005187 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005188" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
5189 return
5190 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01005191 " NOTE: following test is preventing leftmouse selection/deselection of directories and files in treelist mode (Dec 04, 2013)
5192 " Windows are separated by vertical separator bars - but the mouse seems to be doing what it should when dragging that bar
5193 " without this test.
5194" if v:mouse_col != col('.')
5195" let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005196" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
Bram Moolenaar8d043172014-01-23 14:24:41 +01005197" return
5198" endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005199
Bram Moolenaar446cb832008-06-24 21:56:24 +00005200 if a:islocal
5201 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005202 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005203 endif
5204 else
5205 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005206 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005207 endif
5208 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005209 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005210" call Dret("s:NetrwLeftmouse")
5211endfun
5212
5213" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01005214" s:NetrwSLeftmouse: marks the file under the cursor. May be dragged to select additional files {{{2
5215fun! s:NetrwSLeftmouse(islocal)
5216" call Dfunc("s:NetrwSLeftmouse(islocal=".a:islocal.")")
5217
5218 let s:ngw= s:NetrwGetWord()
5219 call s:NetrwMarkFile(a:islocal,s:ngw)
5220
5221" call Dret("s:NetrwSLeftmouse")
Bram Moolenaarff034192013-04-24 18:51:19 +02005222endfun
5223
5224" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01005225" s:NetrwSLeftdrag: invoked via a shift-leftmouse and dragging {{{2
5226" Used to mark multiple files.
5227fun! s:NetrwSLeftdrag(islocal)
5228" call Dfunc("s:NetrwSLeftdrag(islocal=".a:islocal.")")
5229 if !exists("s:netrwdrag")
5230 let s:netrwdrag = winnr()
5231 if a:islocal
5232 nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02005233 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01005234 nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(0)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02005235 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01005236 endif
5237 let ngw = s:NetrwGetWord()
5238 if !exists("s:ngw") || s:ngw != ngw
5239 call s:NetrwMarkFile(a:islocal,ngw)
5240 endif
5241 let s:ngw= ngw
5242" call Dret("s:NetrwSLeftdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5243endfun
5244
5245" ---------------------------------------------------------------------
5246" s:NetrwSLeftrelease: terminates shift-leftmouse dragging {{{2
5247fun! s:NetrwSLeftrelease(islocal)
5248" call Dfunc("s:NetrwSLeftrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5249 if exists("s:netrwdrag")
5250 nunmap <s-leftrelease>
5251 let ngw = s:NetrwGetWord()
5252 if !exists("s:ngw") || s:ngw != ngw
5253 call s:NetrwMarkFile(a:islocal,ngw)
5254 endif
5255 if exists("s:ngw")
5256 unlet s:ngw
5257 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005258 unlet s:netrwdrag
5259 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01005260" call Dret("s:NetrwSLeftrelease")
Bram Moolenaarff034192013-04-24 18:51:19 +02005261endfun
5262
5263" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005264" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
5265" separated patterns given in g:netrw_list_hide
5266fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005267" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005268 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005269
5270 " find a character not in the "hide" string to use as a separator for :g and :v commands
5271 " How-it-works: take the hiding command, convert it into a range. Duplicate
5272 " characters don't matter. Remove all such characters from the '/~...90'
5273 " string. Use the first character left as a separator character.
5274 let listhide= g:netrw_list_hide
5275 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
5276" call Decho("sep=".sep)
5277
5278 while listhide != ""
5279 if listhide =~ ','
5280 let hide = substitute(listhide,',.*$','','e')
5281 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
5282 else
5283 let hide = listhide
5284 let listhide = ""
5285 endif
5286
5287 " Prune the list by hiding any files which match
5288 if g:netrw_hide == 1
5289" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005290 exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005291 elseif g:netrw_hide == 2
5292" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005293 exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005294 endif
5295 endwhile
5296 if g:netrw_hide == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01005297 exe 'sil! keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
5298 exe 'sil! keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005299 endif
5300
Bram Moolenaaradc21822011-04-01 18:03:16 +02005301 " remove any blank lines that have somehow remained.
5302 " This seems to happen under Windows.
5303 exe 'sil! keepj 1,$g@^\s*$@d'
5304
Bram Moolenaar97d62492012-11-15 21:28:22 +01005305 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005306" call Dret("NetrwListHide")
5307endfun
5308
5309" ---------------------------------------------------------------------
5310" NetrwHideEdit: allows user to edit the file/directory hiding list
5311fun! s:NetrwHideEdit(islocal)
5312" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
5313
Bram Moolenaar97d62492012-11-15 21:28:22 +01005314 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005315 " save current cursor position
5316 let svpos= netrw#NetrwSavePosn()
5317
5318 " get new hiding list from user
5319 call inputsave()
5320 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
5321 call inputrestore()
5322 let g:netrw_list_hide= newhide
5323" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
5324
5325 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005326 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005327
5328 " restore cursor position
5329 call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005330 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005331
5332" call Dret("NetrwHideEdit")
5333endfun
5334
5335" ---------------------------------------------------------------------
5336" NetSortSequence: allows user to edit the sorting sequence
5337fun! s:NetSortSequence(islocal)
5338" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
5339
Bram Moolenaar97d62492012-11-15 21:28:22 +01005340 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005341 let svpos= netrw#NetrwSavePosn()
5342 call inputsave()
5343 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
5344 call inputrestore()
5345
5346 " refresh the listing
5347 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02005348 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5349 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005350 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005351
5352" call Dret("NetSortSequence")
5353endfun
5354
5355" ---------------------------------------------------------------------
5356" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
5357fun! s:NetrwMakeDir(usrhost)
5358" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
5359
Bram Moolenaar97d62492012-11-15 21:28:22 +01005360 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005361 " get name of new directory from user. A bare <CR> will skip.
5362 " if its currently a directory, also request will be skipped, but with
5363 " a message.
5364 call inputsave()
5365 let newdirname= input("Please give directory name: ")
5366 call inputrestore()
5367" call Decho("newdirname<".newdirname.">")
5368
5369 if newdirname == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01005370 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005371" call Dret("NetrwMakeDir : user aborted with bare <cr>")
5372 return
5373 endif
5374
5375 if a:usrhost == ""
5376" call Decho("local mkdir")
5377
5378 " Local mkdir:
5379 " sanity checks
5380 let fullnewdir= b:netrw_curdir.'/'.newdirname
5381" call Decho("fullnewdir<".fullnewdir.">")
5382 if isdirectory(fullnewdir)
5383 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005384 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005385 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005386 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005387" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
5388 return
5389 endif
5390 if s:FileReadable(fullnewdir)
5391 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005392 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005393 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005394 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005395" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
5396 return
5397 endif
5398
5399 " requested new local directory is neither a pre-existing file or
5400 " directory, so make it!
5401 if exists("*mkdir")
Bram Moolenaar8d043172014-01-23 14:24:41 +01005402 if has("unix")
5403 call mkdir(fullnewdir,"p",xor(0777, system("umask")))
5404 else
5405 call mkdir(fullnewdir,"p")
5406 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005407 else
5408 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005409 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005410" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005411" call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5412 exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005413 if v:shell_error != 0
5414 let @@= ykeep
5415 call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5416" call Dret("NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5417 return
5418 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005419 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005420 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005421" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
5422 endif
5423 endif
5424
5425 if v:shell_error == 0
5426 " refresh listing
5427" call Decho("refresh listing")
5428 let svpos= netrw#NetrwSavePosn()
5429 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
5430 call netrw#NetrwRestorePosn(svpos)
5431 elseif !exists("g:netrw_quiet")
5432 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
5433 endif
5434" redraw!
5435
5436 elseif !exists("b:netrw_method") || b:netrw_method == 4
5437 " Remote mkdir:
5438" call Decho("remote mkdir")
5439 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
5440 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02005441" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005442 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005443 if v:shell_error == 0
5444 " refresh listing
5445 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005446 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5447 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005448 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005449 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005450 endif
5451" redraw!
5452
5453 elseif b:netrw_method == 2
Bram Moolenaar15146672011-10-20 22:22:38 +02005454 let svpos= netrw#NetrwSavePosn()
5455 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5456 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5457 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005458 elseif b:netrw_method == 3
Bram Moolenaar15146672011-10-20 22:22:38 +02005459 let svpos= netrw#NetrwSavePosn()
5460 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5461 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5462 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005463 endif
5464
Bram Moolenaar97d62492012-11-15 21:28:22 +01005465 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005466" call Dret("NetrwMakeDir")
5467endfun
5468
5469" ---------------------------------------------------------------------
5470" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
5471" mark and unmark files. If a markfile list exists,
5472" then the rename and delete functions will use it instead
5473" of whatever may happen to be under the cursor at that
5474" moment. When the mouse and gui are available,
5475" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005476"
5477" Creates two lists
5478" s:netrwmarkfilelist -- holds complete paths to all marked files
5479" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
5480"
5481" Creates a marked file match string
5482" s:netrwmarfilemtch_# -- used with 2match to display marked files
5483"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005484" Creates a buffer version of islocal
5485" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00005486fun! s:NetrwMarkFile(islocal,fname)
5487" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaarff034192013-04-24 18:51:19 +02005488
5489 " sanity check
5490 if empty(a:fname)
5491" call Dret("s:NetrwMarkFile : emtpy fname")
5492 return
5493 endif
5494
Bram Moolenaar97d62492012-11-15 21:28:22 +01005495 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005496 let curbufnr= bufnr("%")
5497 let curdir = b:netrw_curdir
Bram Moolenaar97d62492012-11-15 21:28:22 +01005498 let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)'
Bram Moolenaaradc21822011-04-01 18:03:16 +02005499
Bram Moolenaar446cb832008-06-24 21:56:24 +00005500 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005501 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00005502" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5503" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005504 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00005505
5506 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005507 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005508" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5509 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005510 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005511
5512 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005513 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005514" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5515 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
5516 if s:netrwmarkfilelist_{curbufnr} == []
5517 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01005518" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005519 call s:NetrwUnmarkList(curbufnr,curdir)
5520 else
5521 " rebuild match list to display markings correctly
5522" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
5523 let s:netrwmarkfilemtch_{curbufnr}= ""
5524 let first = 1
5525 for fname in s:netrwmarkfilelist_{curbufnr}
5526 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01005527 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005528 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005529 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005530 endif
5531 let first= 0
5532 endfor
Bram Moolenaar15146672011-10-20 22:22:38 +02005533" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005534 endif
5535 endif
5536
5537 else
5538 " initialize new markfilelist
5539
5540" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
5541 let s:netrwmarkfilelist_{curbufnr}= []
5542 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
5543" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5544
5545 " build initial markfile matching pattern
5546 if a:fname =~ '/$'
5547 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
5548 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005549 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005550 endif
5551" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
5552 endif
5553
5554 " handle global markfilelist
5555 if exists("s:netrwmarkfilelist")
5556 let dname= s:ComposePath(b:netrw_curdir,a:fname)
5557 if index(s:netrwmarkfilelist,dname) == -1
5558 " append new filename to global markfilelist
5559 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5560" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
5561 else
5562 " remove new filename from global markfilelist
5563" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
5564 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
5565" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
5566 if s:netrwmarkfilelist == []
5567 unlet s:netrwmarkfilelist
5568 endif
5569 endif
5570 else
5571 " initialize new global-directory markfilelist
5572 let s:netrwmarkfilelist= []
5573 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5574" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
5575 endif
5576
5577 " set up 2match'ing to netrwmarkfilemtch list
5578 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
5579" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005580 if exists("g:did_drchip_netrwlist_syntax")
5581 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
5582 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005583 else
5584" call Decho("2match none")
5585 2match none
5586 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005587 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02005588" 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 +00005589endfun
5590
5591" ---------------------------------------------------------------------
5592" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
5593" compress/decompress files using the programs
5594" in g:netrw_compress and g:netrw_uncompress,
5595" using g:netrw_compress_suffix to know which to
5596" do. By default:
5597" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005598" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00005599fun! s:NetrwMarkFileCompress(islocal)
5600" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
5601 let svpos = netrw#NetrwSavePosn()
5602 let curdir = b:netrw_curdir
5603 let curbufnr = bufnr("%")
5604
Bram Moolenaarff034192013-04-24 18:51:19 +02005605 " sanity check
5606 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5607 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5608" call Dret("s:NetrwMarkFileCompress")
5609 return
5610 endif
5611" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5612
Bram Moolenaar446cb832008-06-24 21:56:24 +00005613 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
Bram Moolenaarff034192013-04-24 18:51:19 +02005614
5615 " for every filename in the marked list
Bram Moolenaar446cb832008-06-24 21:56:24 +00005616 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaarff034192013-04-24 18:51:19 +02005617 let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
5618" call Decho("extracted sfx<".sfx.">")
5619 if exists("g:netrw_decompress['".sfx."']")
5620 " fname has a suffix indicating that its compressed; apply associated decompression routine
5621 let exe= g:netrw_decompress[sfx]
5622" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
5623 let exe= netrw#WinPath(exe)
5624 if a:islocal
5625 if g:netrw_keepdir
5626 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005627 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005628 else
5629 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005630 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005631 if executable(exe)
5632 if a:islocal
5633 call system(exe." ".fname)
5634 else
5635 keepj call s:RemoteSystem(exe." ".fname)
5636 endif
5637 else
5638 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
5639 endif
5640 endif
5641 unlet sfx
5642
Bram Moolenaar446cb832008-06-24 21:56:24 +00005643 if exists("exe")
5644 unlet exe
5645 elseif a:islocal
5646 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01005647 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005648 else
5649 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02005650 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005651 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005652 endfor " for every file in the marked list
5653
Bram Moolenaar446cb832008-06-24 21:56:24 +00005654 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005655 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5656 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005657 endif
5658" call Dret("s:NetrwMarkFileCompress")
5659endfun
5660
5661" ---------------------------------------------------------------------
5662" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
5663" If no marked files, then set up directory as the
5664" target. Currently does not support copying entire
5665" directories. Uses the local-buffer marked file list.
5666" Returns 1=success (used by NetrwMarkFileMove())
5667" 0=failure
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005668fun! s:NetrwMarkFileCopy(islocal,...)
5669" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0)
5670
5671 if !exists("b:netrw_curdir")
5672 let b:netrw_curdir= getcwd()
5673" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
5674 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005675 let curdir = b:netrw_curdir
5676 let curbufnr = bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005677
Bram Moolenaarff034192013-04-24 18:51:19 +02005678 " sanity check
5679 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5680 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5681" call Dret("s:NetrwMarkFileCopy")
5682 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005683 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005684" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5685
Bram Moolenaar446cb832008-06-24 21:56:24 +00005686 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02005687 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005688" call Dret("s:NetrwMarkFileCopy 0")
5689 return 0
5690 endif
5691" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005692
5693 if a:islocal && s:netrwmftgt_islocal
5694 " Copy marked files, local directory to local directory
5695" call Decho("copy from local to local")
Bram Moolenaarff034192013-04-24 18:51:19 +02005696 if !executable(g:netrw_localcopycmd) && g:netrw_localcopycmd !~ '\<cmd\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01005697 call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
5698" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
5699 return
5700 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005701
5702 " copy marked files while within the same directory (ie. allow renaming)
5703 if simplify(s:netrwmftgt) == simplify(b:netrw_curdir)
5704 if len(s:netrwmarkfilelist_{bufnr('%')}) == 1
5705 " only one marked file
5706 let args = shellescape(b:netrw_curdir."/".s:netrwmarkfilelist_{bufnr('%')}[0])
5707 let oldname = s:netrwmarkfilelist_{bufnr('%')}[0]
5708 elseif a:0 == 1
5709 " this happens when the next case was used to recursively call s:NetrwMarkFileCopy()
5710 let args = shellescape(b:netrw_curdir."/".a:1)
5711 let oldname = a:1
5712 else
5713 " copy multiple marked files inside the same directory
5714 let s:recursive= 1
5715 for oldname in s:netrwmarkfilelist_{bufnr("%")}
5716 let ret= s:NetrwMarkFileCopy(a:islocal,oldname)
5717 if ret == 0
5718 break
5719 endif
5720 endfor
5721 unlet s:recursive
5722 call s:NetrwUnmarkList(curbufnr,curdir)
5723" call Dret("s:NetrwMarkFileCopy ".ret)
5724 return ret
5725 endif
5726
5727 call inputsave()
5728 let newname= input("Copy ".oldname." to : ",oldname,"file")
5729 call inputrestore()
5730 if newname == ""
5731" call Dret("s:NetrwMarkFileCopy 0")
5732 return 0
5733 endif
5734 let args= shellescape(oldname)
5735 let tgt = shellescape(s:netrwmftgt.'/'.newname)
5736 else
5737 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
5738 let tgt = shellescape(s:netrwmftgt)
5739 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005740 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
5741 let args= substitute(args,'/','\\','g')
5742 let tgt = substitute(tgt, '/','\\','g')
5743 endif
5744 if g:netrw_localcopycmd =~ '\s'
5745 let copycmd = substitute(g:netrw_localcopycmd,'\s.*$','','')
5746 let copycmdargs = substitute(g:netrw_localcopycmd,'^.\{-}\(\s.*\)$','\1','')
5747 let copycmd = netrw#WinPath(copycmd).copycmdargs
5748 else
5749 let copycmd = netrw#WinPath(g:netrw_localcopycmd)
5750 endif
5751" call Decho("args <".args.">")
5752" call Decho("tgt <".tgt.">")
5753" call Decho("copycmd<".copycmd.">")
5754" call Decho("system(".copycmd." ".args." ".tgt.")")
5755 call system(copycmd." ".args." ".tgt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005756 if v:shell_error != 0
Bram Moolenaarff034192013-04-24 18:51:19 +02005757 call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localcopycmd<".g:netrw_localcopycmd.">; it doesn't work!",80)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005758" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt))
5759 return 0
5760 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005761
5762 elseif a:islocal && !s:netrwmftgt_islocal
5763 " Copy marked files, local directory to remote directory
5764" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005765 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005766
5767 elseif !a:islocal && s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005768 " Copy marked files, remote directory to local directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00005769" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005770 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005771
5772 elseif !a:islocal && !s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005773 " Copy marked files, remote directory to remote directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00005774" call Decho("copy from remote to remote")
5775 let curdir = getcwd()
5776 let tmpdir = s:GetTempfile("")
5777 if tmpdir !~ '/'
5778 let tmpdir= curdir."/".tmpdir
5779 endif
5780 if exists("*mkdir")
5781 call mkdir(tmpdir)
5782 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005783 exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005784 if v:shell_error != 0
5785 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5786" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1) )
5787 return
5788 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005789 endif
5790 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005791 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005792 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005793 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02005794 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005795 if getcwd() == tmpdir
5796 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005797 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005798 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005799 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005800 exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005801 if v:shell_error != 0
5802 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",80)
5803" call Dret("s:NetrwMarkFileCopy : failed: sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1) )
5804 return
5805 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005806 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005807 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005808 endif
5809 endif
5810 endif
5811
5812 " -------
5813 " cleanup
5814 " -------
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005815" call Decho("cleanup")
5816 if !exists("s:recursive")
5817 " remove markings from local buffer
5818 call s:NetrwUnmarkList(curbufnr,curdir)
5819 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005820
5821 " refresh buffers
5822 if !s:netrwmftgt_islocal
5823 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
5824 endif
5825 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005826 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005827 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005828 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005829 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005830 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005831
5832" call Dret("s:NetrwMarkFileCopy 1")
5833 return 1
5834endfun
5835
5836" ---------------------------------------------------------------------
5837" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
5838" invoke vim's diff mode on the marked files.
5839" Either two or three files can be so handled.
5840" Uses the global marked file list.
5841fun! s:NetrwMarkFileDiff(islocal)
5842" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
5843 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005844
Bram Moolenaarff034192013-04-24 18:51:19 +02005845 " sanity check
5846 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5847 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5848" call Dret("s:NetrwMarkFileDiff")
5849 return
5850 endif
5851" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5852
5853 if exists("s:netrwmarkfilelist_{."curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005854 let cnt = 0
5855 let curdir = b:netrw_curdir
5856 for fname in s:netrwmarkfilelist
5857 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005858 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005859" call Decho("diffthis: fname<".fname.">")
5860 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005861 diffthis
5862 elseif cnt == 2 || cnt == 3
5863 vsplit
5864 wincmd l
5865" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005866 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005867 diffthis
5868 else
5869 break
5870 endif
5871 endfor
5872 call s:NetrwUnmarkList(curbufnr,curdir)
5873 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005874
Bram Moolenaar446cb832008-06-24 21:56:24 +00005875" call Dret("s:NetrwMarkFileDiff")
5876endfun
5877
5878" ---------------------------------------------------------------------
5879" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
5880" Uses global markfilelist
5881fun! s:NetrwMarkFileEdit(islocal)
5882" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
5883
5884 let curdir = b:netrw_curdir
5885 let curbufnr = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02005886
5887 " sanity check
5888 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5889 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5890" call Dret("s:NetrwMarkFileEdit")
5891 return
5892 endif
5893" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5894
Bram Moolenaar446cb832008-06-24 21:56:24 +00005895 if exists("s:netrwmarkfilelist_{curbufnr}")
5896 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005897 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005898 " unmark markedfile list
5899" call s:NetrwUnmarkList(curbufnr,curdir)
5900 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005901" call Decho("exe sil args ".flist)
5902 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005903 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005904 echo "(use :bn, :bp to navigate files; :Rex to return)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005905
5906" call Dret("s:NetrwMarkFileEdit")
5907endfun
5908
5909" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02005910" s:NetrwMarkFileQFEL: convert a quickfix-error list into a marked file list {{{2
5911fun! s:NetrwMarkFileQFEL(islocal,qfel)
5912" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
5913 call s:NetrwUnmarkAll()
5914 let curbufnr= bufnr("%")
5915
5916 if !empty(a:qfel)
5917 for entry in a:qfel
5918 let bufnmbr= entry["bufnr"]
5919" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"])
5920 if !exists("s:netrwmarkfilelist_{curbufnr}")
5921" call Decho("case: no marked file list")
5922 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5923 elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
5924 " s:NetrwMarkFile will remove duplicate entries from the marked file list.
5925 " So, this test lets two or more hits on the same pattern to be ignored.
5926" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list")
5927 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5928 else
5929" call Decho("case: ".bufname(bufnmbr)." already in marked file list")
5930 endif
5931 endfor
5932 echo "(use me to edit marked files)"
5933 else
5934 call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
5935 endif
5936
5937" call Dret("s:NetrwMarkFileQFEL")
5938endfun
5939
5940" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005941" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005942" Uses the local marked-file list.
5943fun! s:NetrwMarkFileExe(islocal)
5944" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
5945 let svpos = netrw#NetrwSavePosn()
5946 let curdir = b:netrw_curdir
5947 let curbufnr = bufnr("%")
5948
Bram Moolenaarff034192013-04-24 18:51:19 +02005949 " sanity check
5950 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5951 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5952" call Dret("s:NetrwMarkFileExe")
5953 return
5954 endif
5955" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5956
Bram Moolenaar446cb832008-06-24 21:56:24 +00005957 if exists("s:netrwmarkfilelist_{curbufnr}")
5958 " get the command
5959 call inputsave()
5960 let cmd= input("Enter command: ","","file")
5961 call inputrestore()
5962" call Decho("cmd<".cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02005963 if cmd == ""
5964" " call Dret("s:NetrwMarkFileExe : early exit, empty command")
5965 return
5966 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005967
5968 " apply command to marked files. Substitute: filename -> %
5969 " If no %, then append a space and the filename to the command
5970 for fname in s:netrwmarkfilelist_{curbufnr}
5971 if a:islocal
5972 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01005973 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005974 endif
5975 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005976 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005977 endif
5978 if cmd =~ '%'
5979 let xcmd= substitute(cmd,'%',fname,'g')
5980 else
5981 let xcmd= cmd.' '.fname
5982 endif
5983 if a:islocal
5984" call Decho("local: xcmd<".xcmd.">")
5985 let ret= system(xcmd)
5986 else
5987" call Decho("remote: xcmd<".xcmd.">")
5988 let ret= s:RemoteSystem(xcmd)
5989 endif
5990 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02005991 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005992 break
5993 else
5994 echo ret
5995 endif
5996 endfor
5997
5998 " unmark marked file list
5999 call s:NetrwUnmarkList(curbufnr,curdir)
6000
6001 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02006002 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6003 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006004 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006005 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006006 endif
6007
6008" call Dret("s:NetrwMarkFileExe")
6009endfun
6010
6011" ---------------------------------------------------------------------
6012" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
6013" as the marked file(s) (toggles suffix presence)
6014" Uses the local marked file list.
6015fun! s:NetrwMarkHideSfx(islocal)
6016" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
6017 let svpos = netrw#NetrwSavePosn()
6018 let curbufnr = bufnr("%")
6019
6020 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
6021 if exists("s:netrwmarkfilelist_{curbufnr}")
6022
6023 for fname in s:netrwmarkfilelist_{curbufnr}
6024" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
6025 " construct suffix pattern
6026 if fname =~ '\.'
6027 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
6028 else
6029 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
6030 endif
6031 " determine if its in the hiding list or not
6032 let inhidelist= 0
6033 if g:netrw_list_hide != ""
6034 let itemnum = 0
6035 let hidelist= split(g:netrw_list_hide,',')
6036 for hidepat in hidelist
6037 if sfxpat == hidepat
6038 let inhidelist= 1
6039 break
6040 endif
6041 let itemnum= itemnum + 1
6042 endfor
6043 endif
6044" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
6045 if inhidelist
6046 " remove sfxpat from list
6047 call remove(hidelist,itemnum)
6048 let g:netrw_list_hide= join(hidelist,",")
6049 elseif g:netrw_list_hide != ""
6050 " append sfxpat to non-empty list
6051 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
6052 else
6053 " set hiding list to sfxpat
6054 let g:netrw_list_hide= sfxpat
6055 endif
6056 endfor
6057
6058 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02006059 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6060 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006061 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006062 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006063 endif
6064
6065" call Dret("s:NetrwMarkHideSfx")
6066endfun
6067
6068" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02006069" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
6070" Uses the local marked-file list.
6071fun! s:NetrwMarkFileVimCmd(islocal)
6072" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
6073 let svpos = netrw#NetrwSavePosn()
6074 let curdir = b:netrw_curdir
6075 let curbufnr = bufnr("%")
6076
Bram Moolenaarff034192013-04-24 18:51:19 +02006077 " sanity check
6078 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6079 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6080" call Dret("s:NetrwMarkFileVimCmd")
6081 return
6082 endif
6083" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6084
Bram Moolenaar15146672011-10-20 22:22:38 +02006085 if exists("s:netrwmarkfilelist_{curbufnr}")
6086 " get the command
6087 call inputsave()
6088 let cmd= input("Enter vim command: ","","file")
6089 call inputrestore()
6090" call Decho("cmd<".cmd.">")
6091 if cmd == ""
6092" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
6093 return
6094 endif
6095
6096 " apply command to marked files. Substitute: filename -> %
6097 " If no %, then append a space and the filename to the command
6098 for fname in s:netrwmarkfilelist_{curbufnr}
6099" call Decho("fname<".fname.">")
6100 if a:islocal
6101 1split
6102 exe "sil! keepalt e ".fnameescape(fname)
6103" call Decho("local<".fname.">: exe ".cmd)
6104 exe cmd
6105 exe "sil! keepalt wq!"
6106 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01006107 " COMBAK -- not supported yet
Bram Moolenaar15146672011-10-20 22:22:38 +02006108" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
6109 echo "sorry, \"mX\" not supported yet for remote files"
6110 endif
6111 endfor
6112
6113 " unmark marked file list
6114 call s:NetrwUnmarkList(curbufnr,curdir)
6115
6116 " refresh the listing
6117 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6118 keepj call netrw#NetrwRestorePosn(svpos)
6119 else
6120 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
6121 endif
6122
6123" call Dret("s:NetrwMarkFileVimCmd")
6124endfun
6125
6126" ---------------------------------------------------------------------
6127" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
6128" as the marked file(s) (toggles suffix presence)
6129" Uses the local marked file list.
6130fun! s:NetrwMarkHideSfx(islocal)
6131" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
6132 let svpos = netrw#NetrwSavePosn()
6133 let curbufnr = bufnr("%")
6134
6135 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
6136 if exists("s:netrwmarkfilelist_{curbufnr}")
6137
6138 for fname in s:netrwmarkfilelist_{curbufnr}
6139" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
6140 " construct suffix pattern
6141 if fname =~ '\.'
6142 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
6143 else
6144 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
6145 endif
6146 " determine if its in the hiding list or not
6147 let inhidelist= 0
6148 if g:netrw_list_hide != ""
6149 let itemnum = 0
6150 let hidelist= split(g:netrw_list_hide,',')
6151 for hidepat in hidelist
6152 if sfxpat == hidepat
6153 let inhidelist= 1
6154 break
6155 endif
6156 let itemnum= itemnum + 1
6157 endfor
6158 endif
6159" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
6160 if inhidelist
6161 " remove sfxpat from list
6162 call remove(hidelist,itemnum)
6163 let g:netrw_list_hide= join(hidelist,",")
6164 elseif g:netrw_list_hide != ""
6165 " append sfxpat to non-empty list
6166 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
6167 else
6168 " set hiding list to sfxpat
6169 let g:netrw_list_hide= sfxpat
6170 endif
6171 endfor
6172
6173 " refresh the listing
6174 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6175 keepj call netrw#NetrwRestorePosn(svpos)
6176 else
6177 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
6178 endif
6179
6180" call Dret("s:NetrwMarkHideSfx")
6181endfun
6182
6183" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006184" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
6185" Uses the global markfilelist
6186fun! s:NetrwMarkFileGrep(islocal)
6187" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
6188 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006189 let curbufnr = bufnr("%")
6190
6191 if exists("s:netrwmarkfilelist")
6192" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006193 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006194 call s:NetrwUnmarkAll()
Bram Moolenaarff034192013-04-24 18:51:19 +02006195 else
6196" call Decho('no marked files, using "*"')
6197 let netrwmarkfilelist= "*"
6198 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006199
Bram Moolenaarff034192013-04-24 18:51:19 +02006200 " ask user for pattern
6201 call inputsave()
6202 let pat= input("Enter pattern: ","")
6203 call inputrestore()
6204 let patbang = ""
6205 if pat =~ '^!'
6206 let patbang = "!"
6207 let pat= strpart(pat,2)
6208 endif
6209 if pat =~ '^\i'
6210 let pat = escape(pat,'/')
6211 let pat = '/'.pat.'/'
6212 else
6213 let nonisi = pat[0]
6214 endif
6215
6216 " use vimgrep for both local and remote
6217" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist)
6218 try
6219 exe "keepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
6220 catch /^Vim\%((\a\+)\)\=:E480/
6221 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
6222" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
6223 return
6224 endtry
6225 echo "(use :cn, :cp to navigate, :Rex to return)"
6226
6227 2match none
6228 keepj call netrw#NetrwRestorePosn(svpos)
6229
6230 if exists("nonisi")
6231 " original, user-supplied pattern did not begin with a character from isident
6232" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg")
6233 if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
6234 call s:NetrwMarkFileQFEL(a:islocal,getqflist())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006235 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006236 endif
6237
6238" call Dret("s:NetrwMarkFileGrep")
6239endfun
6240
6241" ---------------------------------------------------------------------
6242" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
6243" uses the global marked file list
6244" s:netrwmfloc= 0: target directory is remote
6245" = 1: target directory is local
6246fun! s:NetrwMarkFileMove(islocal)
6247" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
6248 let curdir = b:netrw_curdir
6249 let curbufnr = bufnr("%")
6250
6251 " sanity check
Bram Moolenaarff034192013-04-24 18:51:19 +02006252 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaaradc21822011-04-01 18:03:16 +02006253 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006254" call Dret("s:NetrwMarkFileMove")
6255 return
6256 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006257" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6258
Bram Moolenaar446cb832008-06-24 21:56:24 +00006259 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006260 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006261" call Dret("s:NetrwMarkFileCopy 0")
6262 return 0
6263 endif
6264" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
6265
6266 if a:islocal && s:netrwmftgt_islocal
6267 " move: local -> local
6268" call Decho("move from local to local")
6269" call Decho("(s:NetrwMarkFileMove) local to local move")
Bram Moolenaarff034192013-04-24 18:51:19 +02006270 if !executable(g:netrw_localmovecmd) && g:netrw_localmovecmd !~ '\<cmd\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01006271 call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
6272" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
6273 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006274 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006275 let tgt = shellescape(s:netrwmftgt)
6276" call Decho("tgt<".tgt.">")
6277 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6278 let tgt = substitute(tgt, '/','\\','g')
6279" call Decho("windows exception: tgt<".tgt.">")
6280 if g:netrw_localmovecmd =~ '\s'
6281 let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','')
6282 let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
6283 let movecmd = netrw#WinPath(movecmd).movecmdargs
6284" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)")
6285 else
6286 let movecmd = netrw#WinPath(movecmd)
6287" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)")
6288 endif
6289 else
6290 let movecmd = netrw#WinPath(g:netrw_localmovecmd)
6291" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)")
6292 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006293 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02006294" call Decho("system(".movecmd." ".shellescape(fname)." ".tgt.")")
6295 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6296 let fname= substitute(fname,'/','\\','g')
6297 endif
6298 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".tgt)
6299 if v:shell_error != 0
6300 call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localmovecmd<".g:netrw_localmovecmd.">; it doesn't work!",54)
Bram Moolenaar97d62492012-11-15 21:28:22 +01006301 break
6302 endif
6303 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00006304
6305 elseif a:islocal && !s:netrwmftgt_islocal
6306 " move: local -> remote
6307" call Decho("move from local to remote")
6308" call Decho("copy")
6309 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006310 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006311" call Decho("remove")
6312 for fname in mflist
6313 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6314 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
6315 endfor
6316 unlet mflist
6317
6318 elseif !a:islocal && s:netrwmftgt_islocal
6319 " move: remote -> local
6320" call Decho("move from remote to local")
6321" call Decho("copy")
6322 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006323 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006324" call Decho("remove")
6325 for fname in mflist
6326 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6327 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6328 endfor
6329 unlet mflist
6330
6331 elseif !a:islocal && !s:netrwmftgt_islocal
6332 " move: remote -> remote
6333" call Decho("move from remote to remote")
6334" call Decho("copy")
6335 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006336 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006337" call Decho("remove")
6338 for fname in mflist
6339 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6340 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6341 endfor
6342 unlet mflist
6343 endif
6344
6345 " -------
6346 " cleanup
6347 " -------
6348" call Decho("cleanup")
6349
6350 " remove markings from local buffer
6351 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
6352
6353 " refresh buffers
6354 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006355" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
6356 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006357 endif
6358 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006359" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
6360 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006361 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006362 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006363" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
6364 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006365 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006366
6367" call Dret("s:NetrwMarkFileMove")
6368endfun
6369
6370" ---------------------------------------------------------------------
6371" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
6372" using the hardcopy command. Local marked-file list only.
6373fun! s:NetrwMarkFilePrint(islocal)
6374" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
6375 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006376
6377 " sanity check
6378 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6379 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6380" call Dret("s:NetrwMarkFilePrint")
6381 return
6382 endif
6383" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006384 if exists("s:netrwmarkfilelist_{curbufnr}")
6385 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
6386 let curdir = b:netrw_curdir
6387 call s:NetrwUnmarkList(curbufnr,curdir)
6388 for fname in netrwmarkfilelist
6389 if a:islocal
6390 if g:netrw_keepdir
6391 let fname= s:ComposePath(curdir,fname)
6392 endif
6393 else
6394 let fname= curdir.fname
6395 endif
6396 1split
6397 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02006398" call Decho("exe sil e ".escape(fname,' '))
6399 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006400" call Decho("hardcopy")
6401 hardcopy
6402 q
6403 endfor
6404 2match none
6405 endif
6406" call Dret("s:NetrwMarkFilePrint")
6407endfun
6408
6409" ---------------------------------------------------------------------
6410" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
6411" files when given a regexp (for which a prompt is
Bram Moolenaarff034192013-04-24 18:51:19 +02006412" issued) (matches to name of files).
Bram Moolenaar446cb832008-06-24 21:56:24 +00006413fun! s:NetrwMarkFileRegexp(islocal)
6414" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
6415
6416 " get the regular expression
6417 call inputsave()
6418 let regexp= input("Enter regexp: ","","file")
6419 call inputrestore()
6420
6421 if a:islocal
6422 " get the matching list of files using local glob()
6423" call Decho("handle local regexp")
Bram Moolenaarff034192013-04-24 18:51:19 +02006424 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6425 let files = glob(s:ComposePath(dirname,regexp))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006426" call Decho("files<".files.">")
6427 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006428
6429 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01006430 for fname in filelist
6431" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006432 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006433 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00006434
6435 else
6436" call Decho("handle remote regexp")
6437
6438 " convert displayed listing into a filelist
6439 let eikeep = &ei
6440 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006441 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00006442 set ei=all ma
6443" call Decho("set ei=all ma")
6444 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02006445 keepj call s:NetrwEnew()
6446 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006447 sil keepj norm! "ap
6448 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006449 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006450 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006451 set bt=nofile
6452 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006453 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006454 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006455 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006456 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01006457 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006458 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar8d043172014-01-23 14:24:41 +01006459 exe 'sil keepj %s/^'.s:treedepthstring.' //e'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006460 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006461 call histdel("/",-1)
6462 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006463 endif
6464 " convert regexp into the more usual glob-style format
6465 let regexp= substitute(regexp,'\*','.*','g')
6466" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006467 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01006468 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006469 let filelist= getline(1,line("$"))
6470 q!
6471 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02006472 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006473 endfor
6474 unlet filelist
6475 let @a = areg
6476 let &ei = eikeep
6477 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006478 echo " (use me to edit marked files)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006479
6480" call Dret("s:NetrwMarkFileRegexp")
6481endfun
6482
6483" ---------------------------------------------------------------------
6484" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
6485" Uses the local marked file list.
6486fun! s:NetrwMarkFileSource(islocal)
6487" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
6488 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006489
6490 " sanity check
6491 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6492 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6493" call Dret("s:NetrwMarkFileSource")
6494 return
6495 endif
6496" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006497 if exists("s:netrwmarkfilelist_{curbufnr}")
6498 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
6499 let curdir = b:netrw_curdir
6500 call s:NetrwUnmarkList(curbufnr,curdir)
6501 for fname in netrwmarkfilelist
6502 if a:islocal
6503 if g:netrw_keepdir
6504 let fname= s:ComposePath(curdir,fname)
6505 endif
6506 else
6507 let fname= curdir.fname
6508 endif
6509 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00006510" call Decho("exe so ".fnameescape(fname))
6511 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006512 endfor
6513 2match none
6514 endif
6515" call Dret("s:NetrwMarkFileSource")
6516endfun
6517
6518" ---------------------------------------------------------------------
6519" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
6520" Uses the global markfilelist
6521fun! s:NetrwMarkFileTag(islocal)
6522" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
6523 let svpos = netrw#NetrwSavePosn()
6524 let curdir = b:netrw_curdir
6525 let curbufnr = bufnr("%")
6526
Bram Moolenaarff034192013-04-24 18:51:19 +02006527 " sanity check
6528 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6529 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6530" call Dret("s:NetrwMarkFileTag")
6531 return
6532 endif
6533" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6534
Bram Moolenaar446cb832008-06-24 21:56:24 +00006535 if exists("s:netrwmarkfilelist")
6536" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006537 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006538 call s:NetrwUnmarkAll()
6539
6540 if a:islocal
6541 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006542" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
6543 call system(g:netrw_ctags." ".netrwmarkfilelist)
6544 else
6545 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
6546 endif
6547 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006548 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006549 call netrw#NetrwObtain(a:islocal,"tags")
6550 let curdir= b:netrw_curdir
6551 1split
6552 e tags
6553 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
6554" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006555 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006556 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006557 wq!
6558 endif
6559 2match none
6560 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6561 call netrw#NetrwRestorePosn(svpos)
6562 endif
6563
6564" call Dret("s:NetrwMarkFileTag")
6565endfun
6566
6567" ---------------------------------------------------------------------
6568" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
6569" Sets up two variables,
Bram Moolenaarff034192013-04-24 18:51:19 +02006570" s:netrwmftgt : holds the target directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00006571" s:netrwmftgt_islocal : 0=target directory is remote
Bram Moolenaarff034192013-04-24 18:51:19 +02006572" 1=target directory is local
Bram Moolenaar446cb832008-06-24 21:56:24 +00006573fun! s:NetrwMarkFileTgt(islocal)
6574" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
6575 let svpos = netrw#NetrwSavePosn()
6576 let curdir = b:netrw_curdir
6577 let hadtgt = exists("s:netrwmftgt")
6578 if !exists("w:netrw_bannercnt")
6579 let w:netrw_bannercnt= b:netrw_bannercnt
6580 endif
6581
6582 " set up target
6583 if line(".") < w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02006584 " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
6585 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
6586" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target")
6587 unlet s:netrwmftgt s:netrwmftgt_islocal
6588 if g:netrw_fastbrowse <= 1
6589 call s:LocalBrowseShellCmdRefresh()
6590 endif
6591 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6592 call netrw#NetrwRestorePosn(svpos)
6593" call Dret("s:NetrwMarkFileTgt : removed target")
6594 return
6595 else
6596 let s:netrwmftgt= b:netrw_curdir
6597" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
6598 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006599
6600 else
6601 " get word under cursor.
6602 " * If directory, use it for the target.
6603 " * If file, use b:netrw_curdir for the target
6604 let curword= s:NetrwGetWord()
6605 let tgtdir = s:ComposePath(curdir,curword)
6606 if a:islocal && isdirectory(tgtdir)
6607 let s:netrwmftgt = tgtdir
6608" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
6609 elseif !a:islocal && tgtdir =~ '/$'
6610 let s:netrwmftgt = tgtdir
6611" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
6612 else
6613 let s:netrwmftgt = curdir
6614" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
6615 endif
6616 endif
6617 if a:islocal
6618 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
6619 let s:netrwmftgt= simplify(s:netrwmftgt)
6620" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
6621 endif
6622 if g:netrw_cygwin
6623 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
6624 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
6625 endif
6626 let s:netrwmftgt_islocal= a:islocal
6627
Bram Moolenaar5c736222010-01-06 20:54:52 +01006628 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006629 call s:LocalBrowseShellCmdRefresh()
6630 endif
6631 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6632 call netrw#NetrwRestorePosn(svpos)
6633 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006634 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00006635 endif
6636
6637" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
6638endfun
6639
6640" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00006641" s:NetrwOpenFile: query user for a filename and open it {{{2
6642fun! s:NetrwOpenFile(islocal)
6643" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006644 let ykeep= @@
Bram Moolenaarc236c162008-07-13 17:41:49 +00006645 call inputsave()
6646 let fname= input("Enter filename: ")
6647 call inputrestore()
6648 if fname !~ '[/\\]'
6649 if exists("b:netrw_curdir")
6650 if exists("g:netrw_quiet")
6651 let netrw_quiet_keep = g:netrw_quiet
6652 endif
6653 let g:netrw_quiet = 1
6654 if b:netrw_curdir =~ '/$'
6655 exe "e ".fnameescape(b:netrw_curdir.fname)
6656 else
6657 exe "e ".fnameescape(b:netrw_curdir."/".fname)
6658 endif
6659 if exists("netrw_quiet_keep")
6660 let g:netrw_quiet= netrw_quiet_keep
6661 else
6662 unlet g:netrw_quiet
6663 endif
6664 endif
6665 else
6666 exe "e ".fnameescape(fname)
6667 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006668 let @@= ykeep
Bram Moolenaarc236c162008-07-13 17:41:49 +00006669" call Dret("s:NetrwOpenFile")
6670endfun
6671
6672" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006673" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +02006674" User access provided by the <mu> mapping. (see :help netrw-mu)
6675" Used by many MarkFile functions.
Bram Moolenaar446cb832008-06-24 21:56:24 +00006676fun! s:NetrwUnmarkList(curbufnr,curdir)
6677" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
6678
6679 " remove all files in local marked-file list from global list
6680 if exists("s:netrwmarkfilelist_{a:curbufnr}")
6681 for mfile in s:netrwmarkfilelist_{a:curbufnr}
6682 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
6683 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
6684 call remove(s:netrwmarkfilelist,idx) " remove from global list
6685 endfor
6686 if s:netrwmarkfilelist == []
6687 unlet s:netrwmarkfilelist
6688 endif
6689
6690 " getting rid of the local marked-file lists is easy
6691 unlet s:netrwmarkfilelist_{a:curbufnr}
6692 endif
6693 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
6694 unlet s:netrwmarkfilemtch_{a:curbufnr}
6695 endif
6696 2match none
6697" call Dret("s:NetrwUnmarkList")
6698endfun
6699
6700" ---------------------------------------------------------------------
6701" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
6702fun! s:NetrwUnmarkAll()
6703" call Dfunc("s:NetrwUnmarkAll()")
6704 if exists("s:netrwmarkfilelist")
6705 unlet s:netrwmarkfilelist
6706 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006707 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006708 2match none
6709" call Dret("s:NetrwUnmarkAll")
6710endfun
6711
6712" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02006713" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006714fun! s:NetrwUnmarkAll2()
6715" call Dfunc("s:NetrwUnmarkAll2()")
6716 redir => netrwmarkfilelist_let
6717 let
6718 redir END
6719 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
6720 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
6721 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
6722 for flist in netrwmarkfilelist_list
6723 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
6724 unlet s:netrwmarkfilelist_{curbufnr}
6725 unlet s:netrwmarkfilemtch_{curbufnr}
6726 endfor
6727" call Dret("s:NetrwUnmarkAll2")
6728endfun
6729
6730" ---------------------------------------------------------------------
6731" s:NetrwUnMarkFile: {{{2
6732fun! s:NetrwUnMarkFile(islocal)
6733" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
6734 let svpos = netrw#NetrwSavePosn()
6735 let curbufnr = bufnr("%")
6736
6737 " unmark marked file list (although I expect s:NetrwUpload()
6738 " to do it, I'm just making sure)
6739 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6740" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
6741 unlet s:netrwmarkfilelist
6742 unlet s:netrwmarkfilelist_{curbufnr}
6743 unlet s:netrwmarkfilemtch_{curbufnr}
6744 2match none
6745 endif
6746
6747" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6748 call netrw#NetrwRestorePosn(svpos)
6749" call Dret("s:NetrwUnMarkFile")
6750endfun
6751
6752" ---------------------------------------------------------------------
6753" s:NetrwMenu: generates the menu for gvim and netrw {{{2
6754fun! s:NetrwMenu(domenu)
6755
6756 if !exists("g:NetrwMenuPriority")
6757 let g:NetrwMenuPriority= 80
6758 endif
6759
Bram Moolenaaradc21822011-04-01 18:03:16 +02006760 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00006761" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
6762
6763 if !exists("s:netrw_menu_enabled") && a:domenu
6764" call Decho("initialize menu")
6765 let s:netrw_menu_enabled= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02006766 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
6767 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
6768 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
6769 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
6770 if g:netrw_dirhistmax > 0
6771 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
6772 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
6773 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
6774 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
6775 else
6776 exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\<cr>"
6777 endif
6778 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o o'
6779 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v v'
6780 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
6781 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p p'
6782 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
6783 exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
6784 exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
6785 exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
6786 exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
6787 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
6788 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
6789 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
6790 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
6791 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
6792 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
6793 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
6794 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
6795 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
6796 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
6797 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
6798 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
6799 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
6800 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
6801 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
6802 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
6803 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
6804 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
6805 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
6806 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
6807 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
6808 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
6809 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
6810 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
6811 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
6812 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
6813 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
6814 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
6815 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
6816 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
6817 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
6818 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
6819 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
6820 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
6821 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
6822 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>'
6823 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>'
6824 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>'
6825 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
6826 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>'
6827 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>'
6828 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>'
6829 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
6830 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006831 let s:netrw_menucnt= 28
Bram Moolenaarff034192013-04-24 18:51:19 +02006832 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
6833 call s:NetrwTgtMenu() " let bookmarks and history be easy targets
Bram Moolenaar446cb832008-06-24 21:56:24 +00006834
6835 elseif !a:domenu
6836 let s:netrwcnt = 0
6837 let curwin = winnr()
6838 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
6839 exe curwin."wincmd w"
6840
6841 if s:netrwcnt <= 1
6842" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006843 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02006844" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006845 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00006846 endif
6847 endif
6848" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006849 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006850 endif
6851
6852endfun
6853
6854" ---------------------------------------------------------------------
6855" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
6856" Used by the O maps (as <SID>NetrwObtain())
6857fun! s:NetrwObtain(islocal)
6858" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
6859
Bram Moolenaar97d62492012-11-15 21:28:22 +01006860 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006861 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006862 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
6863 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00006864 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
6865 else
6866 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
6867 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006868 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006869
6870" call Dret("NetrwObtain")
6871endfun
6872
6873" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006874" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
6875" If there's only one window, then the window will first be split.
6876" Returns:
6877" choice = 0 : didn't have to choose
6878" choice = 1 : saved modified file in window first
6879" choice = 2 : didn't save modified file, opened window
6880" choice = 3 : cancel open
6881fun! s:NetrwPrevWinOpen(islocal)
Bram Moolenaar8d043172014-01-23 14:24:41 +01006882" call Dfunc("s:NetrwPrevWinOpen(islocal=".a:islocal.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006883
Bram Moolenaar97d62492012-11-15 21:28:22 +01006884 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006885 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
6886 let curdir = b:netrw_curdir
6887
6888 " get last window number and the word currently under the cursor
Bram Moolenaar8d043172014-01-23 14:24:41 +01006889 let origwin = winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006890 let lastwinnr = winnr("$")
6891 let curword = s:NetrwGetWord()
6892 let choice = 0
Bram Moolenaar8d043172014-01-23 14:24:41 +01006893 let s:treedir = s:NetrwTreeDir()
6894" call Decho("(s:NetrwPrevWinOpen) winnr($)#".lastwinnr." curword<".curword.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006895
Bram Moolenaar8d043172014-01-23 14:24:41 +01006896 let didsplit = 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006897 if lastwinnr == 1
6898 " if only one window, open a new one first
Bram Moolenaar8d043172014-01-23 14:24:41 +01006899" call Decho("(s:NetrwPrevWinOpen) only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006900 if g:netrw_preview
Bram Moolenaar15146672011-10-20 22:22:38 +02006901 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
Bram Moolenaar8d043172014-01-23 14:24:41 +01006902" call Decho("(s:NetrwPrevWinOpen) exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
Bram Moolenaar15146672011-10-20 22:22:38 +02006903 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006904 else
Bram Moolenaar15146672011-10-20 22:22:38 +02006905 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
Bram Moolenaar8d043172014-01-23 14:24:41 +01006906" call Decho("(s:NetrwPrevWinOpen) exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar15146672011-10-20 22:22:38 +02006907 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006908 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01006909 let didsplit = 1
6910" call Decho("(s:NetrwPrevWinOpen) did split")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006911
6912 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006913 keepj call s:SaveBufVars()
Bram Moolenaar8d043172014-01-23 14:24:41 +01006914 let eikeep= &ei
6915 set ei=all
Bram Moolenaar446cb832008-06-24 21:56:24 +00006916 wincmd p
Bram Moolenaar8d043172014-01-23 14:24:41 +01006917" call Decho("(s:NetrwPrevWinOpen) wincmd p (now in win#".winnr().")")
6918
6919 " prevwinnr: the window number of the "prev" window
6920 " prevbufnr: the buffer number of the buffer in the "prev" window
6921 " bnrcnt : the qty of windows open on the "prev" buffer
6922 let prevwinnr = winnr()
6923 let prevbufnr = bufnr("%")
6924 let prevbufname = bufname("%")
6925 let prevmod = &mod
6926 let bnrcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006927 keepj call s:RestoreBufVars()
Bram Moolenaar8d043172014-01-23 14:24:41 +01006928" call Decho("(s:NetrwPrevWinOpen) after wincmd p: win#".winnr()." win($)#".winnr("$")." origwin#".origwin." &mod=".&mod." bufname(%)<".bufname("%")."> prevbufnr=".prevbufnr)
6929
6930 " if the previous window's buffer has been changed (ie. its modified flag is set),
Bram Moolenaar446cb832008-06-24 21:56:24 +00006931 " and it doesn't appear in any other extant window, then ask the
6932 " user if s/he wants to abandon modifications therein.
Bram Moolenaar8d043172014-01-23 14:24:41 +01006933 if prevmod
6934" call Decho("(s:NetrwPrevWinOpen) detected that prev window's buffer has been modified: prevbufnr=".prevbufnr." winnr()#".winnr())
6935 windo if winbufnr(0) == prevbufnr | let bnrcnt=bnrcnt+1 | endif
6936" call Decho("(s:NetrwPrevWinOpen) prevbufnr=".prevbufnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr()=".winnr()." prevwinnr#".prevwinnr)
6937 exe prevwinnr."wincmd w"
6938
6939 if bnrcnt == 1 && &hidden == 0
6940 " only one copy of the modified buffer in a window, and
6941 " hidden not set, so overwriting will lose the modified file. Ask first...
6942 let choice = confirm("Save modified buffer<".prevbufname."> first?","&Yes\n&No\n&Cancel")
6943" call Decho("(NetrwPrevWinOpen) prevbufname<".prevbufname."> choice=".choice." current-winnr#".winnr())
6944 let &ei= eikeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006945
6946 if choice == 1
6947 " Yes -- write file & then browse
6948 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006949 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00006950 if v:errmsg != ""
Bram Moolenaar8d043172014-01-23 14:24:41 +01006951 call netrw#ErrorMsg(s:ERROR,"unable to write <".prevbufname.">!",30)
6952 exe origwin."wincmd w"
6953 let &ei = eikeep
6954 let @@ = ykeep
6955" call Dret("s:NetrwPrevWinOpen ".choice." : unable to write <".prevbufname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006956 return choice
6957 endif
6958
6959 elseif choice == 2
6960 " No -- don't worry about changed file, just browse anyway
Bram Moolenaar8d043172014-01-23 14:24:41 +01006961" call Decho("(s:NetrwPrevWinOpen) don't worry about chgd file, just browse anyway (winnr($)#".winnr("$").")")
6962 echomsg "**note** changes to ".prevbufname." abandoned"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006963
6964 else
6965 " Cancel -- don't do this
Bram Moolenaar8d043172014-01-23 14:24:41 +01006966" call Decho("(s:NetrwPrevWinOpen) cancel, don't browse, switch to win#".origwin)
6967 exe origwin."wincmd w"
6968 let &ei= eikeep
6969 let @@ = ykeep
6970" call Dret("s:NetrwPrevWinOpen ".choice." : cancelled")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006971 return choice
6972 endif
6973 endif
6974 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01006975 let &ei= eikeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006976 endif
6977
6978 " restore b:netrw_curdir (window split/enew may have lost it)
6979 let b:netrw_curdir= curdir
6980 if a:islocal < 2
6981 if a:islocal
6982 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
6983 else
6984 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
6985 endif
6986 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006987 let @@= ykeep
Bram Moolenaar8d043172014-01-23 14:24:41 +01006988" call Dret("s:NetrwPrevWinOpen ".choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006989 return choice
6990endfun
6991
6992" ---------------------------------------------------------------------
6993" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
6994" Always assumed to be local -> remote
6995" call s:NetrwUpload(filename, target)
6996" call s:NetrwUpload(filename, target, fromdirectory)
6997fun! s:NetrwUpload(fname,tgt,...)
6998" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6999
7000 if a:tgt =~ '^\a\+://'
7001 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
7002 else
7003 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
7004 endif
7005" call Decho("tgtdir<".tgtdir.">")
7006
7007 if a:0 > 0
7008 let fromdir= a:1
7009 else
7010 let fromdir= getcwd()
7011 endif
7012" call Decho("fromdir<".fromdir.">")
7013
7014 if type(a:fname) == 1
7015 " handle uploading a single file using NetWrite
7016" call Decho("handle uploading a single file via NetWrite")
7017 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007018" call Decho("exe e ".fnameescape(a:fname))
7019 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007020" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
7021 if a:tgt =~ '/$'
7022 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00007023" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007024 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007025 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007026" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
7027 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007028" call Decho("done writing local->remote")
7029 endif
7030 q!
7031
7032 elseif type(a:fname) == 3
7033 " handle uploading a list of files via scp
7034" call Decho("handle uploading a list of files via scp")
7035 let curdir= getcwd()
7036 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007037 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007038 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
7039 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007040 if exists("g:netrw_port") && g:netrw_port != ""
7041 let useport= " ".g:netrw_scpport." ".g:netrw_port
7042 else
7043 let useport= ""
7044 endif
7045 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
7046 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00007047" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
7048 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007049 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007050
7051 elseif a:tgt =~ '^ftp:'
7052 call s:NetrwMethod(a:tgt)
7053
7054 if b:netrw_method == 2
7055 " handle uploading a list of files via ftp+.netrc
7056 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007057 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00007058" call Decho("filter input window#".winnr())
7059
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007060 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00007061" call Decho("filter input: ".getline('$'))
7062
7063 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007064 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007065" call Decho("filter input: ".getline('$'))
7066 endif
7067
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007068 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007069" call Decho("filter input: ".getline('$'))
7070
Bram Moolenaaradc21822011-04-01 18:03:16 +02007071 if tgtdir == ""
7072 let tgtdir= '/'
7073 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007074 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007075" call Decho("filter input: ".getline('$'))
7076
7077 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007078 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007079" call Decho("filter input: ".getline('$'))
7080 endfor
7081
7082 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007083" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
7084 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007085 else
7086" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02007087" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
7088 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007089 endif
7090 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007091 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01007092 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007093 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
7094 call netrw#ErrorMsg(s:ERROR,getline(1),14)
7095 else
7096 bw!|q
7097 endif
7098
7099 elseif b:netrw_method == 3
7100 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
7101 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02007102 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007103 let tmpbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02007104 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00007105
7106 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007107 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00007108" call Decho("filter input: ".getline('$'))
7109 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007110 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00007111" call Decho("filter input: ".getline('$'))
7112 endif
7113
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007114 if exists("g:netrw_uid") && g:netrw_uid != ""
7115 if exists("g:netrw_ftp") && g:netrw_ftp == 1
7116 keepj put =g:netrw_uid
7117" call Decho("filter input: ".getline('$'))
7118 if exists("s:netrw_passwd")
7119 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
7120 endif
7121" call Decho("filter input: ".getline('$'))
7122 elseif exists("s:netrw_passwd")
7123 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
7124" call Decho("filter input: ".getline('$'))
7125 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007126 endif
7127
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007128 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007129" call Decho("filter input: ".getline('$'))
7130
7131 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007132 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007133" call Decho("filter input: ".getline('$'))
7134 endif
7135
7136 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007137 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007138" call Decho("filter input: ".getline('$'))
7139 endif
7140
7141 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007142 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007143" call Decho("filter input: ".getline('$'))
7144 endfor
7145
7146 " perform ftp:
7147 " -i : turns off interactive prompting from ftp
7148 " -n unix : DON'T use <.netrc>, even though it exists
7149 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007150 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007151" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
7152 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007153 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007154 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01007155 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007156 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
7157 let debugkeep= &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02007158 setl debug=msg
Bram Moolenaar446cb832008-06-24 21:56:24 +00007159 call netrw#ErrorMsg(s:ERROR,getline(1),15)
7160 let &debug = debugkeep
7161 let mod = 1
7162 else
7163 bw!|q
7164 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007165 elseif !exists("b:netrw_method") || b:netrw_method < 0
7166" call Dfunc("netrw#NetrwUpload : unsupported method")
7167 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007168 endif
7169 else
7170 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
7171 endif
7172 endif
7173
7174" call Dret("s:NetrwUpload")
7175endfun
7176
7177" ---------------------------------------------------------------------
7178" s:NetrwPreview: {{{2
7179fun! s:NetrwPreview(path) range
7180" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007181 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02007182 keepj call s:NetrwOptionSave("s:")
7183 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007184 if has("quickfix")
7185 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007186 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02007187 let pvhkeep = &pvh
7188 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7189 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007190 endif
7191 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
7192 if exists("pvhkeep")
7193 let &pvh= pvhkeep
7194 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007195 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007196 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007197 endif
7198 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007199 keepj call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007200 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007201 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007202 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007203" call Dret("NetrwPreview")
7204endfun
7205
7206" ---------------------------------------------------------------------
7207" s:NetrwRefresh: {{{2
7208fun! s:NetrwRefresh(islocal,dirname)
7209" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
7210 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
Bram Moolenaar97d62492012-11-15 21:28:22 +01007211 " (defunct) NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
7212 " (defunct) Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
Bram Moolenaarff034192013-04-24 18:51:19 +02007213 setl ma noro
7214" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007215" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007216 let ykeep = @@
7217 let screenposn = netrw#NetrwSavePosn()
Bram Moolenaarff034192013-04-24 18:51:19 +02007218" call Decho("clearing buffer prior to refresh")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007219 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007220 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007221 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007222 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007223 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007224 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007225 keepj call netrw#NetrwRestorePosn(screenposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007226
7227 " restore file marks
7228 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
7229" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
7230 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
7231 else
7232" call Decho("2match none")
7233 2match none
7234 endif
7235
Bram Moolenaar97d62492012-11-15 21:28:22 +01007236" restore
7237 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007238" call Dret("NetrwRefresh")
7239endfun
7240
7241" ---------------------------------------------------------------------
7242" s:NetrwRefreshDir: refreshes a directory by name {{{2
7243" Called by NetrwMarkFileCopy()
7244" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
7245fun! s:NetrwRefreshDir(islocal,dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007246" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007247 if g:netrw_fastbrowse == 0
7248 " slowest mode (keep buffers refreshed, local or remote)
7249" call Decho("slowest mode: keep buffers refreshed, local or remote")
7250 let tgtwin= bufwinnr(a:dirname)
7251" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
7252
7253 if tgtwin > 0
7254 " tgtwin is being displayed, so refresh it
7255 let curwin= winnr()
7256" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
7257 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007258 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007259 exe curwin."wincmd w"
7260
7261 elseif bufnr(a:dirname) > 0
7262 let bn= bufnr(a:dirname)
7263" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007264 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00007265 endif
7266
7267 elseif g:netrw_fastbrowse <= 1
7268" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007269 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007270 endif
7271" call Dret("s:NetrwRefreshDir")
7272endfun
7273
7274" ---------------------------------------------------------------------
7275" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
7276" What this function does is to compute a priority for the patterns
7277" in the g:netrw_sort_sequence. It applies a substitute to any
7278" "files" that satisfy each pattern, putting the priority / in
7279" front. An "*" pattern handles the default priority.
7280fun! s:NetrwSetSort()
7281" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007282 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00007283 if w:netrw_liststyle == s:LONGLIST
7284 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
7285 else
7286 let seqlist = g:netrw_sort_sequence
7287 endif
7288 " sanity check -- insure that * appears somewhere
7289 if seqlist == ""
7290 let seqlist= '*'
7291 elseif seqlist !~ '\*'
7292 let seqlist= seqlist.',*'
7293 endif
7294 let priority = 1
7295 while seqlist != ""
7296 if seqlist =~ ','
7297 let seq = substitute(seqlist,',.*$','','e')
7298 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
7299 else
7300 let seq = seqlist
7301 let seqlist = ""
7302 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007303 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01007304 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007305 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01007306 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007307 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01007308 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007309 endif
7310" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
7311
7312 " sanity check
7313 if w:netrw_bannercnt > line("$")
7314 " apparently no files were left after a Hiding pattern was used
7315" call Dret("SetSort : no files left after hiding")
7316 return
7317 endif
7318 if seq == '*'
7319 let starpriority= spriority
7320 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007321 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007322 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007323 " sometimes multiple sorting patterns will match the same file or directory.
7324 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007325 exe 'sil keepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007326 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007327 endif
7328 let priority = priority + 1
7329 endwhile
7330 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007331 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007332 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007333 endif
7334
7335 " Following line associated with priority -- items that satisfy a priority
7336 " pattern get prefixed by ###/ which permits easy sorting by priority.
7337 " Sometimes files can satisfy multiple priority patterns -- only the latest
7338 " priority pattern needs to be retained. So, at this point, these excess
7339 " priority prefixes need to be removed, but not directories that happen to
7340 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007341 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007342 keepj call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007343 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007344
7345" call Dret("SetSort")
7346endfun
7347
Bram Moolenaarff034192013-04-24 18:51:19 +02007348" ---------------------------------------------------------------------
7349" s:NetrwSetTgt: sets the target to the specified choice index {{{2
7350" Implements [count]Tb (bookhist<b>)
7351" [count]Th (bookhist<h>)
7352" See :help netrw-qb for how to make the choice.
7353fun! s:NetrwSetTgt(bookhist,choice)
7354" call Dfunc("s:NetrwSetTgt(bookhist<".a:bookhist."> choice#".a:choice.")")
7355
7356 if a:bookhist == 'b'
7357 " supports choosing a bookmark as a target using a qb-generated list
7358 let choice= a:choice - 1
7359 if exists("g:netrw_bookmarklist[".choice."]")
7360 call netrw#NetrwMakeTgt(g:netrw_bookmarklist[choice])
7361 else
7362 echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
7363 endif
7364
7365 elseif a:bookhist == 'h'
7366 " supports choosing a history stack entry as a target using a qb-generated list
7367 let choice= (a:choice % g:netrw_dirhistmax) + 1
7368 if exists("g:netrw_dirhist_".choice)
7369 let histentry = g:netrw_dirhist_{choice}
7370 call netrw#NetrwMakeTgt(histentry)
7371 else
7372 echomsg "Sorry, history#".a:choice." not available!"
7373 endif
7374 endif
7375
7376" call Dret("s:NetrwSetTgt")
7377endfun
7378
Bram Moolenaar446cb832008-06-24 21:56:24 +00007379" =====================================================================
7380" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
7381fun! s:NetrwSortStyle(islocal)
7382" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007383 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007384 let svpos= netrw#NetrwSavePosn()
7385
7386 let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007387 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007388 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
7389 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007390
7391" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
7392endfun
7393
7394" ---------------------------------------------------------------------
7395" s:NetrwSplit: mode {{{2
7396" =0 : net and o
7397" =1 : net and t
7398" =2 : net and v
7399" =3 : local and o
7400" =4 : local and t
7401" =5 : local and v
7402fun! s:NetrwSplit(mode)
7403" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
7404
Bram Moolenaar97d62492012-11-15 21:28:22 +01007405 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00007406 call s:SaveWinVars()
7407
7408 if a:mode == 0
7409 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02007410 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7411" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007412 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007413 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007414 keepj call s:RestoreWinVars()
7415 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007416 unlet s:didsplit
7417
7418 elseif a:mode == 1
7419 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01007420 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00007421" call Decho("tabnew")
7422 tabnew
7423 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007424 keepj call s:RestoreWinVars()
7425 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007426 unlet s:didsplit
7427
7428 elseif a:mode == 2
7429 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02007430 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7431" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007432 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007433 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007434 keepj call s:RestoreWinVars()
7435 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007436 unlet s:didsplit
7437
7438 elseif a:mode == 3
7439 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02007440 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7441" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007442 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007443 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007444 keepj call s:RestoreWinVars()
7445 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007446 unlet s:didsplit
7447
7448 elseif a:mode == 4
7449 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007450 let cursorword = s:NetrwGetWord()
Bram Moolenaar8d043172014-01-23 14:24:41 +01007451 let eikeep = &ei
7452 let netrw_winnr = winnr()
7453 let netrw_line = line(".")
7454 let netrw_col = virtcol(".")
7455 keepj norm! H0
7456 let netrw_hline = line(".")
7457 set ei=all
7458 exe "keepj norm! ".netrw_hline."G0z\<CR>"
7459 exe "keepj norm! ".netrw_line."G0".netrw_col."\<bar>"
7460 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01007461 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007462" call Decho("tabnew")
7463 tabnew
Bram Moolenaar8d043172014-01-23 14:24:41 +01007464 let b:netrw_curdir = netrw_curdir
7465 let s:didsplit = 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007466 keepj call s:RestoreWinVars()
7467 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar8d043172014-01-23 14:24:41 +01007468 if &ft == "netrw"
7469 set ei=all
7470 exe "keepj norm! ".netrw_hline."G0z\<CR>"
7471 exe "keepj norm! ".netrw_line."G0".netrw_col."\<bar>"
7472 let &ei= eikeep
7473 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007474 unlet s:didsplit
7475
7476 elseif a:mode == 5
7477 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02007478 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7479" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007480 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007481 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007482 keepj call s:RestoreWinVars()
7483 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007484 unlet s:didsplit
7485
7486 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007487 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007488 endif
7489
Bram Moolenaar97d62492012-11-15 21:28:22 +01007490 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007491" call Dret("s:NetrwSplit")
7492endfun
7493
7494" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02007495" s:NetrwTgtMenu: {{{2
7496fun! s:NetrwTgtMenu()
7497 if !exists("s:netrw_menucnt")
7498 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007499 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007500" call Dfunc("s:NetrwTgtMenu()")
7501
7502 " the following test assures that gvim is running, has menus available, and has menus enabled.
7503 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
7504 if exists("g:NetrwTopLvlMenu")
7505" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
7506 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
7507 endif
7508 if !exists("s:netrw_initbookhist")
7509 call s:NetrwBookHistRead()
7510 endif
7511
7512 " target bookmarked places
7513 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
7514" call Decho("installing bookmarks as easy targets")
7515 let cnt= 1
7516 for bmd in g:netrw_bookmarklist
7517 let ebmd= escape(bmd,g:netrw_menu_escape)
7518 " show bookmarks for goto menu
7519" call Decho("menu: Targets: ".bmd)
7520 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#NetrwMakeTgt('".bmd."')\<cr>"
7521 let cnt= cnt + 1
7522 endfor
7523 endif
7524
7525 " target directory browsing history
7526 if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
7527" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")")
7528 let histcnt = 1
7529 while histcnt <= g:netrw_dirhistmax
7530 let priority = g:netrw_dirhist_cnt + histcnt
7531 if exists("g:netrw_dirhist_{histcnt}")
7532 let histentry = g:netrw_dirhist_{histcnt}
7533 let ehistentry = escape(histentry,g:netrw_menu_escape)
7534" call Decho("menu: Targets: ".histentry)
7535 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#NetrwMakeTgt('".histentry."')\<cr>"
7536 endif
7537 let histcnt = histcnt + 1
7538 endwhile
7539 endif
7540 endif
7541" call Dret("s:NetrwTgtMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007542endfun
7543
7544" ---------------------------------------------------------------------
7545" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
7546" (full path directory with trailing slash returned)
7547fun! s:NetrwTreeDir()
Bram Moolenaar8d043172014-01-23 14:24:41 +01007548" call Dfunc("s:NetrwTreeDir() getline(".line(".").")"."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007549
Bram Moolenaar8d043172014-01-23 14:24:41 +01007550 if exists("s:treedir")
7551 " s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early
7552 let treedir= s:treedir
7553 unlet s:treedir
7554" call Dret("s:NetrwTreeDir ".treedir)
7555 return treedir
7556 endif
7557 if !exists("b:netrw_curdir") || b:netrw_curdir == ""
7558 let b:netrw_curdir= getcwd()
7559 endif
7560 let treedir = b:netrw_curdir
7561" call Decho("(s:NetrwTreeDir) set initial treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007562 let s:treecurpos= netrw#NetrwSavePosn()
7563
7564 if w:netrw_liststyle == s:TREELIST
Bram Moolenaar8d043172014-01-23 14:24:41 +01007565" call Decho("(s:NetrwTreeDir) w:netrw_liststyle is TREELIST:")
7566" call Decho("(s:NetrwTreeDir) line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007567
7568 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007569 if getline('.') =~ '/$'
Bram Moolenaar8d043172014-01-23 14:24:41 +01007570" call Decho("extract tree subdirectory from current line")
7571 let treedir= substitute(getline('.'),'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
7572" call Decho("(s:NetrwTreeDir) treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007573 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01007574" call Decho("(s:NetrwTreeDir) do not extract tree subdirectory from current line and set treedir to empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007575 let treedir= ""
7576 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007577
7578 " detect user attempting to close treeroot
Bram Moolenaar8d043172014-01-23 14:24:41 +01007579" call Decho("(s:NetrwTreeDir) win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
7580" call Decho("(s:NetrwTreeDir) getline(".line(".").")<".getline('.').'> '.((getline('.') =~ '^'.s:treedepthstring)? '=~' : '!~').' ^'.s:treedepthstring)
7581 if getline('.') !~ '^'.s:treedepthstring && getline('.') != '..'
7582" call Decho("user may have attempted to close treeroot")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007583 " now force a refresh
Bram Moolenaar8d043172014-01-23 14:24:41 +01007584" call Decho("(s:NetrwTreeDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007585 sil! keepj %d
Bram Moolenaar8d043172014-01-23 14:24:41 +01007586" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007587 return b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01007588" else " Decho
7589" call Decho("user did not attempt to close treeroot")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007590 endif
7591
Bram Moolenaar8d043172014-01-23 14:24:41 +01007592 let treedir= s:NetrwTreePath(w:netrw_treetop)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007593 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01007594
7595 " sanity maintenance: keep those //s away...
Bram Moolenaar446cb832008-06-24 21:56:24 +00007596 let treedir= substitute(treedir,'//$','/','')
7597
Bram Moolenaar8d043172014-01-23 14:24:41 +01007598" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007599 return treedir
7600endfun
7601
7602" ---------------------------------------------------------------------
7603" s:NetrwTreeDisplay: recursive tree display {{{2
7604fun! s:NetrwTreeDisplay(dir,depth)
7605" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
7606
7607 " insure that there are no folds
Bram Moolenaarff034192013-04-24 18:51:19 +02007608 setl nofen
Bram Moolenaar446cb832008-06-24 21:56:24 +00007609
7610 " install ../ and shortdir
7611 if a:depth == ""
7612 call setline(line("$")+1,'../')
7613" call Decho("setline#".line("$")." ../ (depth is zero)")
7614 endif
7615 if a:dir =~ '^\a\+://'
7616 if a:dir == w:netrw_treetop
7617 let shortdir= a:dir
7618 else
7619 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
7620 endif
7621 call setline(line("$")+1,a:depth.shortdir)
7622 else
7623 let shortdir= substitute(a:dir,'^.*/','','e')
7624 call setline(line("$")+1,a:depth.shortdir.'/')
7625 endif
7626" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
7627
7628 " append a / to dir if its missing one
7629 let dir= a:dir
7630 if dir !~ '/$'
7631 let dir= dir.'/'
7632 endif
7633
7634 " display subtrees (if any)
Bram Moolenaar8d043172014-01-23 14:24:41 +01007635 let depth= s:treedepthstring.a:depth
Bram Moolenaar446cb832008-06-24 21:56:24 +00007636
7637" call Decho("display subtrees with depth<".depth."> and current leaves")
7638 for entry in w:netrw_treedict[a:dir]
7639 let direntry= substitute(dir.entry,'/$','','e')
7640" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
7641 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
7642" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007643 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007644 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
7645" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007646 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007647 else
7648" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007649 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007650 endif
7651 endfor
Bram Moolenaar8d043172014-01-23 14:24:41 +01007652
Bram Moolenaar446cb832008-06-24 21:56:24 +00007653" call Dret("NetrwTreeDisplay")
7654endfun
7655
7656" ---------------------------------------------------------------------
7657" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
7658fun! s:NetrwTreeListing(dirname)
7659 if w:netrw_liststyle == s:TREELIST
7660" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
Bram Moolenaar8d043172014-01-23 14:24:41 +01007661" call Decho("(s:NetrwTreeListing) curdir<".a:dirname.">")
7662" call Decho("(s:NetrwTreeListing) win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exist")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"))
7663" call Decho("(s:NetrwTreeListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007664
7665 " update the treetop
Bram Moolenaar8d043172014-01-23 14:24:41 +01007666" call Decho("(s:NetrwTreeListing) update the treetop")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007667 if !exists("w:netrw_treetop")
7668 let w:netrw_treetop= a:dirname
Bram Moolenaar8d043172014-01-23 14:24:41 +01007669" call Decho("(s:NetrwTreeListing) w:netrw_treetop<".w:netrw_treetop."> (reusing)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007670 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
7671 let w:netrw_treetop= a:dirname
Bram Moolenaar8d043172014-01-23 14:24:41 +01007672" call Decho("(s:NetrwTreeListing) w:netrw_treetop<".w:netrw_treetop."> (went up)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007673 endif
7674
7675 " insure that we have at least an empty treedict
7676 if !exists("w:netrw_treedict")
7677 let w:netrw_treedict= {}
7678 endif
7679
7680 " update the directory listing for the current directory
Bram Moolenaar8d043172014-01-23 14:24:41 +01007681" call Decho("(s:NetrwTreeListing) updating dictionary with ".a:dirname.":[..directory listing..]")
7682" call Decho("(s:NetrwTreeListing) w:netrw_bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007683 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007684 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01007685" call Decho("(s:NetrwTreeListing) w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007686 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007687
7688 " if past banner, record word
7689 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
7690 let fname= expand("<cword>")
7691 else
7692 let fname= ""
7693 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01007694" call Decho("(s:NetrwTreeListing) fname<".fname.">")
7695" call Decho("(s:NetrwTreeListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007696
7697 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02007698 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar8d043172014-01-23 14:24:41 +01007699" call Decho("s:NetrwTreeDisplay) setl noma nomod ro")
7700
7701 " remove any blank line remaining as line#1 (happens in treelisting mode with banner suppressed)
7702 while getline(1) =~ '^\s*$' && byte2line(1) > 0
7703" call Decho("(s:PerformListing) deleting blank line")
7704 1d
7705 endwhile
7706
7707 setl noma nomod ro
Bram Moolenaar446cb832008-06-24 21:56:24 +00007708
7709" call Dret("NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007710 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007711 endif
7712endfun
7713
7714" ---------------------------------------------------------------------
7715" s:NetrwWideListing: {{{2
7716fun! s:NetrwWideListing()
7717
7718 if w:netrw_liststyle == s:WIDELIST
7719" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
7720 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007721 " cpf: characters per filename
7722 " fpl: filenames per line
7723 " fpc: filenames per column
Bram Moolenaarff034192013-04-24 18:51:19 +02007724 setl ma noro
7725" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007726 let b:netrw_cpf= 0
7727 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007728 exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007729 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007730 else
7731" call Dret("NetrwWideListing")
7732 return
7733 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007734 let b:netrw_cpf= b:netrw_cpf + 2
7735" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007736
7737 " determine qty files per line (fpl)
7738 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
7739 if w:netrw_fpl <= 0
7740 let w:netrw_fpl= 1
7741 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007742" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007743
7744 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007745 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007746 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007747 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
7748 let newcolstart = w:netrw_bannercnt + fpc
7749 let newcolend = newcolstart + fpc - 1
7750" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007751 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00007752 while line("$") >= newcolstart
7753 if newcolend > line("$") | let newcolend= line("$") | endif
7754 let newcolqty= newcolend - newcolstart
7755 exe newcolstart
7756 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007757 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007758 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007759 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007760 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007761 exe "sil! keepj ".newcolstart.','.newcolend.'d'
7762 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007763 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02007764 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007765 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007766 keepj call histdel("/",-1)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007767 exe "nmap <buffer> <silent> w /^\\\\|\\s\\s\\zs\\S/\<cr>"
7768 exe "nmap <buffer> <silent> b ?^\\\\|\\s\\s\\zs\\S?\<cr>"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007769" call Decho("NetrwWideListing) setl noma nomod ro")
7770 setl noma nomod ro
7771" call Decho("(NetrwWideListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007772" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007773 return
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007774 else
7775 if hasmapto("w","n")
7776 sil! nunmap <buffer> w
7777 endif
7778 if hasmapto("b","n")
7779 sil! nunmap <buffer> b
7780 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007781 endif
7782
7783endfun
7784
7785" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01007786" s:NetrwTreePath: returns path to current file in tree listing {{{2
7787" Normally, treetop is w:netrw_treetop, but a
7788" user of this function ( netrw#NetrwSetTreetop() )
7789" wipes that out prior to calling this function
7790fun! s:NetrwTreePath(treetop)
7791" call Dfunc("s:NetrwTreePath()")
7792 let depth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
7793 let depth = substitute(depth,'^'.s:treedepthstring,'','')
7794" call Decho("(s:NetrwTreePath) depth<".depth."> 2nd subst (first depth removed)")
7795 if getline('.') =~ '/$'
7796" call Decho("extract tree directory from current line")
7797 let treedir= substitute(getline('.'),'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
7798" call Decho("(s:NetrwTreePath) treedir<".treedir.">")
7799 else
7800" call Decho("(s:NetrwTreePath) do not extract tree directory from current line and set treedir to empty")
7801 let treedir= ""
7802 endif
7803 " construct treedir by searching backwards at correct depth
7804" call Decho("(s:NetrwTreePath) initial treedir<".treedir."> depth<".depth.">")
7805 while depth != "" && search('^'.depth.'[^'.s:treedepthstring.'].\{-}/$','bW')
7806 let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
7807 let treedir= dirname.treedir
7808 let depth = substitute(depth,'^'.s:treedepthstring,'','')
7809" call Decho("(s:NetrwTreePath) constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
7810 endwhile
7811 if a:treetop =~ '/$'
7812 let treedir= a:treetop.treedir
7813 else
7814 let treedir= a:treetop.'/'.treedir
7815 endif
7816 let treedir= substitute(treedir,'//$','/','')
7817" call Dret("s:NetrwTreePath <".treedir.">")
7818 return treedir
7819endfun
7820
7821" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007822" s:PerformListing: {{{2
7823fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007824" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar8d043172014-01-23 14:24:41 +01007825" call Decho("(s:PerformListing) 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. " (enter)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007826
Bram Moolenaar15146672011-10-20 22:22:38 +02007827 " set up syntax highlighting {{{3
Bram Moolenaar8d043172014-01-23 14:24:41 +01007828" call Decho("(s:PerformListing) set up syntax highlighting")
Bram Moolenaar15146672011-10-20 22:22:38 +02007829 if has("syntax")
7830 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar8d043172014-01-23 14:24:41 +01007831" call Decho("(s:PerformListing) but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
Bram Moolenaarff034192013-04-24 18:51:19 +02007832 setl ft=
Bram Moolenaar15146672011-10-20 22:22:38 +02007833 elseif &ft != "netrw"
Bram Moolenaarff034192013-04-24 18:51:19 +02007834 setl ft=netrw
Bram Moolenaar15146672011-10-20 22:22:38 +02007835 endif
7836 endif
7837
Bram Moolenaaradc21822011-04-01 18:03:16 +02007838 keepj call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02007839 set noro ma
Bram Moolenaar8d043172014-01-23 14:24:41 +01007840" call Decho("(s:PerformListing) setl noro ma bh=".&bh)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007841
7842" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
Bram Moolenaar8d043172014-01-23 14:24:41 +01007843" call Decho("(s:PerformListing) (netrw) Processing your browsing request...")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007844" endif " Decho
7845
7846" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
7847 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
7848 " force a refresh for tree listings
Bram Moolenaar8d043172014-01-23 14:24:41 +01007849" call Decho("(s:PerformListing) force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007850 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007851 endif
7852
7853 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02007854 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007855
7856 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007857 if g:netrw_banner
Bram Moolenaar8d043172014-01-23 14:24:41 +01007858" call Decho("(s:PerformListing) set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007859 keepj call setline(1,'" ============================================================================')
7860 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007861 if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash
7862 keepj call setline(3,'" '.substitute(b:netrw_curdir,'/','\\','g'))
7863 else
7864 keepj call setline(3,'" '.b:netrw_curdir)
7865 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007866 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007867 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007868 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007869 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01007870 let w:netrw_bannercnt= 1
7871 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007872
7873 let sortby= g:netrw_sort_by
7874 if g:netrw_sort_direction =~ "^r"
7875 let sortby= sortby." reversed"
7876 endif
7877
7878 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007879 if g:netrw_banner
Bram Moolenaar8d043172014-01-23 14:24:41 +01007880" call Decho("(s:PerformListing) handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007881 if g:netrw_sort_by =~ "^n"
Bram Moolenaar8d043172014-01-23 14:24:41 +01007882" call Decho("(s:PerformListing) directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007883 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007884 keepj put ='\" Sorted by '.sortby
7885 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01007886 let w:netrw_bannercnt= w:netrw_bannercnt + 2
7887 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01007888" call Decho("(s:PerformListing) directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007889 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007890 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01007891 let w:netrw_bannercnt= w:netrw_bannercnt + 1
7892 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007893 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar8d043172014-01-23 14:24:41 +01007894" else " Decho
7895" call Decho("(s:PerformListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007896 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007897
7898 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01007899 if g:netrw_banner
7900 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
Bram Moolenaar8d043172014-01-23 14:24:41 +01007901" call Decho("(s:PerformListing) show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007902 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01007903 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007904 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007905 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007906 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007907 endif
7908 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007909 else
Bram Moolenaar8d043172014-01-23 14:24:41 +01007910" call Decho("(s:PerformListing) s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007911 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007912 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007913 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007914
7915 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007916 if g:netrw_banner
Bram Moolenaar8d043172014-01-23 14:24:41 +01007917" call Decho("(s:PerformListing) handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007918 if g:netrw_list_hide != "" && g:netrw_hide
7919 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007920 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007921 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007922 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007923 endif
7924 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007925 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007926 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007927 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
7928 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007929 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8d043172014-01-23 14:24:41 +01007930" else " Decho
7931" call Decho("(s:PerformListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007932 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007933
7934 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01007935 if g:netrw_banner
7936 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007937 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar8d043172014-01-23 14:24:41 +01007938" call Decho("(s:PerformListing) w:netrw_bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
7939" else " Decho
7940" call Decho("(s:PerformListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007941 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007942
Bram Moolenaar446cb832008-06-24 21:56:24 +00007943 " get list of files
Bram Moolenaar8d043172014-01-23 14:24:41 +01007944" call Decho("(s:PerformListing) Get list of files - islocal=".a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007945 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007946 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007947 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02007948 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007949 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01007950" call Decho("(s:PerformListing) g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
7951" call Decho("(s:PerformListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007952
7953 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007954 if !exists("w:netrw_bannercnt")
7955 let w:netrw_bannercnt= 0
7956 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007957 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar8d043172014-01-23 14:24:41 +01007958" call Decho("(s:PerformListing) manipulate directory listing (hide)")
7959" call Decho("(s:PerformListing) g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007960 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007961 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007962 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007963 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar8d043172014-01-23 14:24:41 +01007964" call Decho("(s:PerformListing) manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007965
7966 if g:netrw_sort_by =~ "^n"
7967 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02007968 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007969
Bram Moolenaar5c736222010-01-06 20:54:52 +01007970 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar8d043172014-01-23 14:24:41 +01007971" call Decho("(s:PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007972 if g:netrw_sort_direction =~ 'n'
7973 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007974 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007975 else
7976 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007977 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007978 endif
7979 endif
7980 " remove priority pattern prefix
Bram Moolenaar8d043172014-01-23 14:24:41 +01007981" call Decho("(s:PerformListing) remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007982 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007983 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007984
7985 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01007986 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar8d043172014-01-23 14:24:41 +01007987" call Decho("(s:PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007988 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007989" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007990 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007991 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007992" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007993 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007994 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007995 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007996 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007997 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007998 endif
7999
8000 elseif g:netrw_sort_direction =~ 'r'
Bram Moolenaar8d043172014-01-23 14:24:41 +01008001" call Decho('(s:PerformListing) reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01008002 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008003 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01008004 call histdel("/",-1)
8005 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008006 endif
8007 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008008" call Decho("(s:PerformListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008009
8010 " convert to wide/tree listing {{{3
Bram Moolenaar8d043172014-01-23 14:24:41 +01008011" call Decho("(s:PerformListing) modify display if wide/tree listing style")
8012" call Decho("(s:PerformListing) 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)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008013 keepj call s:NetrwWideListing()
Bram Moolenaar8d043172014-01-23 14:24:41 +01008014" call Decho("(s:PerformListing) 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)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008015 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008016" call Decho("(s:PerformListing) 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)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008017
Bram Moolenaar5c736222010-01-06 20:54:52 +01008018 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008019 " place cursor on the top-left corner of the file listing
Bram Moolenaar8d043172014-01-23 14:24:41 +01008020" call Decho("(s:PerformListing) place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008021 exe 'sil! keepj '.w:netrw_bannercnt
8022 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008023 endif
8024
8025 " record previous current directory
8026 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01008027" call Decho("(s:PerformListing) record netrw_prvdir<".w:netrw_prvdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008028
8029 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaar8d043172014-01-23 14:24:41 +01008030" call Decho("(s:PerformListing) 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)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008031 keepj call s:SetBufWinVars()
Bram Moolenaar8d043172014-01-23 14:24:41 +01008032" call Decho("(s:PerformListing) 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)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008033 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8d043172014-01-23 14:24:41 +01008034" call Decho("(s:PerformListing) 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)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008035
8036 " set display to netrw display settings
Bram Moolenaar8d043172014-01-23 14:24:41 +01008037" call Decho("(s:PerformListing) set display to netrw display settings (".g:netrw_bufsettings.")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008038 exe "setl ".g:netrw_bufsettings
Bram Moolenaar8d043172014-01-23 14:24:41 +01008039" call Decho("(s:PerformListing) 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)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008040 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar8d043172014-01-23 14:24:41 +01008041" call Decho("(s:PerformListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008042 exe "setl ts=".(g:netrw_maxfilenamelen+1)
8043 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008044
Bram Moolenaar8d043172014-01-23 14:24:41 +01008045 if exists("s:treecurpos")
8046" call Decho("(s:PerformListing) 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)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008047 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008048 unlet s:treecurpos
8049 endif
8050
Bram Moolenaar8d043172014-01-23 14:24:41 +01008051" call Decho("(s:PerformListing) 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)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008052" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
8053endfun
8054
8055" ---------------------------------------------------------------------
8056" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008057fun! s:SetupNetrwStatusLine(statline)
8058" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
8059
8060 if !exists("s:netrw_setup_statline")
8061 let s:netrw_setup_statline= 1
8062" call Decho("do first-time status line setup")
8063
8064 if !exists("s:netrw_users_stl")
8065 let s:netrw_users_stl= &stl
8066 endif
8067 if !exists("s:netrw_users_ls")
8068 let s:netrw_users_ls= &laststatus
8069 endif
8070
8071 " set up User9 highlighting as needed
8072 let keepa= @a
8073 redir @a
8074 try
8075 hi User9
8076 catch /^Vim\%((\a\+)\)\=:E411/
8077 if &bg == "dark"
8078 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
8079 else
8080 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
8081 endif
8082 endtry
8083 redir END
8084 let @a= keepa
8085 endif
8086
8087 " set up status line (may use User9 highlighting)
8088 " insure that windows have a statusline
8089 " make sure statusline is displayed
8090 let &stl=a:statline
Bram Moolenaarff034192013-04-24 18:51:19 +02008091 setl laststatus=2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008092" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008093 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00008094
8095" call Dret("SetupNetrwStatusLine : stl=".&stl)
8096endfun
8097
8098" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008099" Remote Directory Browsing Support: {{{1
8100" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00008101
8102" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008103" s:NetrwRemoteListing: {{{2
8104fun! s:NetrwRemoteListing()
8105" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00008106
Bram Moolenaar446cb832008-06-24 21:56:24 +00008107 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00008108
Bram Moolenaar446cb832008-06-24 21:56:24 +00008109 " sanity check:
8110 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
Bram Moolenaar8d043172014-01-23 14:24:41 +01008111" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008112 if !executable("ftp")
8113 if !exists("g:netrw_quiet")
8114 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
8115 endif
8116 call s:NetrwOptionRestore("w:")
8117" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00008118 return
8119 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008120
Bram Moolenaar8d043172014-01-23 14:24:41 +01008121 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaar446cb832008-06-24 21:56:24 +00008122 if !exists("g:netrw_quiet")
Bram Moolenaar8d043172014-01-23 14:24:41 +01008123 if g:netrw_list_cmd == ""
8124 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008125 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008126 keepj call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008127 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00008128 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00008129
Bram Moolenaaradc21822011-04-01 18:03:16 +02008130 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008131" call Dret("s:NetrwRemoteListing")
8132 return
8133 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00008134
Bram Moolenaar446cb832008-06-24 21:56:24 +00008135 if exists("b:netrw_method")
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008136" call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008137 let w:netrw_method= b:netrw_method
8138 endif
8139
Bram Moolenaar8d043172014-01-23 14:24:41 +01008140 if s:method == "ftp" || s:method == "sftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008141 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008142" call Decho("use ftp to get remote file listing")
Bram Moolenaar8d043172014-01-23 14:24:41 +01008143 let s:method = "ftp"
8144 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008145 if g:netrw_sort_by =~ '^t'
8146 let listcmd= g:netrw_ftp_timelist_cmd
8147 elseif g:netrw_sort_by =~ '^s'
8148 let listcmd= g:netrw_ftp_sizelist_cmd
8149 endif
8150" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
8151 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008152" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008153
8154 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
8155 " shorten the listing
8156" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008157 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00008158
8159 " cleanup
8160 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008161 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008162 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008163 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008164 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02008165 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008166
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008167 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +00008168 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008169 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar97d62492012-11-15 21:28:22 +01008170 let line2= search('\.\.\/\%(\s\|$\)','cnW')
8171" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008172 if line2 == 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008173" call Decho("netrw is putting ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008174 sil! keepj put='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008175 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008176 exe "sil! keepj ".line1
8177 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008178
8179" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
8180 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
8181" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008182 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008183 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008184 else " normal ftp cleanup
8185" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008186 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
8187 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
8188 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008189 keepj call histdel("/",-1)
8190 keepj call histdel("/",-1)
8191 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008192 endif
8193 endif
8194
8195 else
8196 " use ssh to get remote file listing {{{3
8197" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
8198 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
8199" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
8200 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008201" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008202 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008203 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008204 sil! keepj g/^Listing directory/keepj d
8205 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
8206 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02008207 keepj call histdel("/",-1)
8208 keepj call histdel("/",-1)
8209 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008210 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008211 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02008212 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008213 endif
8214 else
8215 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008216" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar15146672011-10-20 22:22:38 +02008217 exe "sil! keepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008218 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02008219" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
Bram Moolenaar15146672011-10-20 22:22:38 +02008220 exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008221" call Decho("listcmd<".listcmd."> path<".s:path.">")
8222 endif
8223 endif
8224
8225 " cleanup
8226 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008227" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008228 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008229 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008230 endif
8231 endif
8232
8233 if w:netrw_liststyle == s:LONGLIST
8234 " do a long listing; these substitutions need to be done prior to sorting {{{3
8235" call Decho("fix long listing:")
8236
8237 if s:method == "ftp"
8238 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008239 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00008240 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008241 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008242 endwhile
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008243 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +00008244 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008245 sil! keepj 1
8246 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008247 let line2= line(".")
8248 if line2 == 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008249 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008250 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008251 endif
8252 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008253 exe "sil! keepj ".line1
8254 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008255 endif
8256
8257 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
8258" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008259 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008260 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
8261" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008262 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
8263 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
8264 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02008265 keepj call histdel("/",-1)
8266 keepj call histdel("/",-1)
8267 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008268 endif
8269 endif
8270
8271" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008272" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008273" endif " Decho
8274" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00008275endfun
8276
Bram Moolenaar446cb832008-06-24 21:56:24 +00008277" ---------------------------------------------------------------------
8278" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
8279fun! s:NetrwRemoteRm(usrhost,path) range
8280" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
8281" call Decho("firstline=".a:firstline." lastline=".a:lastline)
8282 let svpos= netrw#NetrwSavePosn()
8283
8284 let all= 0
8285 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8286 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01008287" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008288 for fname in s:netrwmarkfilelist_{bufnr("%")}
8289 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
8290 if ok =~ 'q\%[uit]'
8291 break
8292 elseif ok =~ 'a\%[ll]'
8293 let all= 1
8294 endif
8295 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01008296 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008297
8298 else
8299 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01008300" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008301
8302 " preparation for removing multiple files/directories
8303 let ctr= a:firstline
8304
8305 " remove multiple files and directories
8306 while ctr <= a:lastline
Bram Moolenaar15146672011-10-20 22:22:38 +02008307 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008308 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
8309 if ok =~ 'q\%[uit]'
8310 break
8311 elseif ok =~ 'a\%[ll]'
8312 let all= 1
8313 endif
8314 let ctr= ctr + 1
8315 endwhile
8316 endif
8317
8318 " refresh the (remote) directory listing
8319" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008320 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8321 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008322
8323" call Dret("s:NetrwRemoteRm")
8324endfun
8325
8326" ---------------------------------------------------------------------
8327" s:NetrwRemoteRmFile: {{{2
8328fun! s:NetrwRemoteRmFile(path,rmfile,all)
8329" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
8330
8331 let all= a:all
8332 let ok = ""
8333
8334 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
8335 " attempt to remove file
8336" call Decho("attempt to remove file (all=".all.")")
8337 if !all
8338 echohl Statement
8339" call Decho("case all=0:")
8340 call inputsave()
8341 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8342 call inputrestore()
8343 echohl NONE
8344 if ok == ""
8345 let ok="no"
8346 endif
8347 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8348 if ok =~ 'a\%[ll]'
8349 let all= 1
8350 endif
8351 endif
8352
8353 if all || ok =~ 'y\%[es]' || ok == ""
8354" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
8355 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8356" call Decho("case ftp:")
8357 let path= a:path
8358 if path =~ '^\a\+://'
8359 let path= substitute(path,'^\a\+://[^/]\+/','','')
8360 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008361 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008362 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
8363 else
8364" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
8365 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
8366" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8367 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008368 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008369 let ok="q"
8370 else
8371 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8372" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8373" call Decho("remotedir<".remotedir.">")
8374" call Decho("rmfile<".a:rmfile.">")
8375 if remotedir != ""
8376 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
8377 else
8378 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
8379 endif
8380" call Decho("call system(".netrw_rm_cmd.")")
8381 let ret= system(netrw_rm_cmd)
8382 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008383 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008384 endif
8385" call Decho("returned=".ret." errcode=".v:shell_error)
8386 endif
8387 endif
8388 elseif ok =~ 'q\%[uit]'
8389" call Decho("ok==".ok)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008390 endif
8391
8392 else
8393 " attempt to remove directory
8394" call Decho("attempt to remove directory")
8395 if !all
8396 call inputsave()
8397 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8398 call inputrestore()
8399 if ok == ""
8400 let ok="no"
8401 endif
8402 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8403 if ok =~ 'a\%[ll]'
8404 let all= 1
8405 endif
8406 endif
8407
8408 if all || ok =~ 'y\%[es]' || ok == ""
8409 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008410 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008411 else
8412 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01008413 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008414" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008415 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008416" call Decho("returned=".ret." errcode=".v:shell_error)
8417
8418 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008419" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008420 let netrw_rmf_cmd= s:MakeSshCmd(netrw#WinPath(g:netrw_rmf_cmd)).' '.shellescape(netrw#WinPath(substitute(rmfile,'[\/]$','','e')))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008421" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
8422 let ret= system(netrw_rmf_cmd)
8423" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008424
8425 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008426 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008427 endif
8428 endif
8429 endif
8430
8431 elseif ok =~ 'q\%[uit]'
Bram Moolenaarff034192013-04-24 18:51:19 +02008432" call Decho("ok==".ok)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008433 endif
8434 endif
8435
8436" call Dret("s:NetrwRemoteRmFile ".ok)
8437 return ok
8438endfun
8439
8440" ---------------------------------------------------------------------
8441" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
8442" This function assumes that a long listing will be received. Size, time,
8443" and reverse sorts will be requested of the server but not otherwise
8444" enforced here.
8445fun! s:NetrwRemoteFtpCmd(path,listcmd)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008446" 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 : "???")))
8447" call Decho("line($)=".line("$")." w:netrw_bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008448 " sanity check: {{{3
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008449 if !exists("w:netrw_method")
8450 if exists("b:netrw_method")
8451 let w:netrw_method= b:netrw_method
8452 else
8453 call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93)
8454" call Dret("NetrwRemoteFtpCmd")
8455 return
8456 endif
8457 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008458
Bram Moolenaar8d043172014-01-23 14:24:41 +01008459 " WinXX ftp uses unix style input, so set ff to unix " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008460 let ffkeep= &ff
Bram Moolenaarff034192013-04-24 18:51:19 +02008461 setl ma ff=unix noro
8462" call Decho("setl ma ff=unix noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008463
Bram Moolenaar8d043172014-01-23 14:24:41 +01008464 " clear off any older non-banner lines " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008465 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02008466" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
8467 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008468
8469 ".........................................
Bram Moolenaar8d043172014-01-23 14:24:41 +01008470 if w:netrw_method == 2 || w:netrw_method == 5 " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008471 " ftp + <.netrc>: Method #2
8472 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008473 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008474 endif
8475 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008476 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008477" call Decho("filter input: ".getline('.'))
8478 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008479 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008480" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
8481 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008482" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
Bram Moolenaar15146672011-10-20 22:22:38 +02008483 exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008484 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008485" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
Bram Moolenaar15146672011-10-20 22:22:38 +02008486 exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008487 endif
8488
Bram Moolenaar8d043172014-01-23 14:24:41 +01008489 ".........................................
8490 elseif w:netrw_method == 3 " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008491 " ftp + machine,id,passwd,filename: Method #3
Bram Moolenaarff034192013-04-24 18:51:19 +02008492 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00008493 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008494 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00008495 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008496 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00008497 endif
8498
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008499 " handle userid and password
8500 let host= substitute(g:netrw_machine,'\..*$','','')
8501" call Decho("host<".host.">")
8502 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
8503 call NetUserPass("ftp:".host)
8504 endif
8505 if exists("g:netrw_uid") && g:netrw_uid != ""
8506 if exists("g:netrw_ftp") && g:netrw_ftp == 1
8507 keepj put =g:netrw_uid
8508 if exists("s:netrw_passwd") && s:netrw_passwd != ""
8509 keepj put ='\"'.s:netrw_passwd.'\"'
8510 endif
8511 elseif exists("s:netrw_passwd")
8512 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
8513 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008514 endif
8515
8516 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008517 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008518 endif
8519 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008520 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008521" call Decho("filter input: ".getline('.'))
8522 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008523 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008524
8525 " perform ftp:
8526 " -i : turns off interactive prompting from ftp
8527 " -n unix : DON'T use <.netrc>, even though it exists
8528 " -n win32: quit being obnoxious about password
8529" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008530" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
8531 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00008532
Bram Moolenaar8d043172014-01-23 14:24:41 +01008533 ".........................................
8534 elseif w:netrw_method == 9 " {{{3
8535 " sftp username@machine: Method #9
8536 " s:netrw_sftp_cmd
8537 setl ff=unix
8538" call Decho("COMBAK: still working on sftp remote listing")
8539
8540 " restore settings
8541 let &ff= ffkeep
8542" call Dret("NetrwRemoteFtpCmd")
8543 return
8544
8545 ".........................................
8546 else " {{{3
8547 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . bufname("%") . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008548 endif
8549
Bram Moolenaar8d043172014-01-23 14:24:41 +01008550 " cleanup for Windows " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008551 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008552 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02008553 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008554 endif
8555 if a:listcmd == "dir"
8556 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008557 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
8558 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02008559 keepj call histdel("/",-1)
8560 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008561 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008562 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008563 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008564 endif
8565 endif
8566
Bram Moolenaar8d043172014-01-23 14:24:41 +01008567 " ftp's listing doesn't seem to include ./ or ../ " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008568 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008569 exe 'keepj '.w:netrw_bannercnt
8570 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008571 endif
8572 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008573 exe 'keepj '.w:netrw_bannercnt
8574 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008575 endif
8576
Bram Moolenaar8d043172014-01-23 14:24:41 +01008577 " restore settings " {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00008578 let &ff= ffkeep
8579" call Dret("NetrwRemoteFtpCmd")
8580endfun
8581
8582" ---------------------------------------------------------------------
8583" s:NetrwRemoteRename: rename a remote file or directory {{{2
8584fun! s:NetrwRemoteRename(usrhost,path) range
8585" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
8586
8587 " preparation for removing multiple files/directories
8588 let svpos = netrw#NetrwSavePosn()
8589 let ctr = a:firstline
8590 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
8591
8592 " rename files given by the markfilelist
8593 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8594 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8595" call Decho("oldname<".oldname.">")
8596 if exists("subfrom")
8597 let newname= substitute(oldname,subfrom,subto,'')
8598" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8599 else
8600 call inputsave()
8601 let newname= input("Moving ".oldname." to : ",oldname)
8602 call inputrestore()
8603 if newname =~ '^s/'
8604 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8605 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8606 let newname = substitute(oldname,subfrom,subto,'')
8607" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8608 endif
8609 endif
8610
8611 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008612 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008613 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008614 let oldname= shellescape(a:path.oldname)
8615 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008616" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8617 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008618 endif
8619
8620 endfor
8621 call s:NetrwUnMarkFile(1)
8622
8623 else
8624
8625 " attempt to rename files/directories
8626 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008627 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008628
8629 let oldname= s:NetrwGetWord()
8630" call Decho("oldname<".oldname.">")
8631
8632 call inputsave()
8633 let newname= input("Moving ".oldname." to : ",oldname)
8634 call inputrestore()
8635
8636 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8637 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
8638 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008639 let oldname= shellescape(a:path.oldname)
8640 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008641" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8642 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008643 endif
8644
8645 let ctr= ctr + 1
8646 endwhile
8647 endif
8648
8649 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02008650 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8651 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008652
8653" call Dret("NetrwRemoteRename")
8654endfun
8655
8656" ---------------------------------------------------------------------
8657" Local Directory Browsing Support: {{{1
8658" ==========================================
8659
8660" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +01008661" netrw#FileUrlRead: handles reading file://* files {{{2
8662" Should accept: file://localhost/etc/fstab
8663" file:///etc/fstab
8664" file:///c:/WINDOWS/clock.avi
8665" file:///c|/WINDOWS/clock.avi
8666" file://localhost/c:/WINDOWS/clock.avi
8667" file://localhost/c|/WINDOWS/clock.avi
8668" file://c:/foo.txt
8669" file:///c:/foo.txt
8670" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
8671fun! netrw#FileUrlRead(fname)
8672" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8673 let fname = a:fname
8674 if fname =~ '^file://localhost/'
8675" call Decho('converting file://localhost/ -to- file:///')
8676 let fname= substitute(fname,'^file://localhost/','file:///','')
8677" call Decho("fname<".fname.">")
8678 endif
8679 if (has("win32") || has("win95") || has("win64") || has("win16"))
8680 if fname =~ '^file:///\=\a[|:]/'
8681" call Decho('converting file:///\a|/ -to- file://\a:/')
8682 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8683" call Decho("fname<".fname.">")
8684 endif
8685 endif
8686 let fname2396 = netrw#RFC2396(fname)
8687 let fname2396e= fnameescape(fname2396)
8688 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
8689 if (has("win32") || has("win95") || has("win64") || has("win16"))
8690" call Decho("windows exception for plainfname")
8691 if plainfname =~ '^/\+\a:'
8692" call Decho('removing leading "/"s')
8693 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8694 endif
8695 endif
8696" call Decho("fname2396<".fname2396.">")
8697" call Decho("plainfname<".plainfname.">")
8698 exe "sil doau BufReadPre ".fname2396e
8699 exe 'keepj r '.plainfname
Bram Moolenaarff034192013-04-24 18:51:19 +02008700 exe 'sil! bdelete '.plainfname
8701 exe 'keepalt file! '.plainfname
Bram Moolenaar97d62492012-11-15 21:28:22 +01008702 keepj 1d
8703" call Decho("(FileUrlRead) setl nomod")
8704 setl nomod
8705" call Decho("(FileUrlRead) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8706" call Dret("netrw#FileUrlRead")
8707 exe "sil doau BufReadPost ".fname2396e
8708endfun
8709
8710" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008711" netrw#LocalBrowseCheck: {{{2
8712fun! netrw#LocalBrowseCheck(dirname)
8713 " unfortunate interaction -- split window debugging can't be
8714 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
8715 " event triggers another call to LocalBrowseCheck() when attempts
8716 " to write to the DBG buffer are made.
8717 " The &ft == "netrw" test was installed because the BufEnter event
8718 " would hit when re-entering netrw windows, creating unexpected
8719 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaarff034192013-04-24 18:51:19 +02008720" call Decho("(LocalBrowseCheck) isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaar8d043172014-01-23 14:24:41 +01008721" call Decho("(LocalBrowseCheck) 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)
8722" call Dredir("(LocalBrowseCheck) ls!","ls!")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008723 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008724 if isdirectory(a:dirname)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008725" call Decho("(LocalBrowseCheck) 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)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008726 let svposn= netrw#NetrwSavePosn()
8727 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
Bram Moolenaar8d043172014-01-23 14:24:41 +01008728" call Decho("(LocalBrowseCheck) case 1 (ft!=netrw)")
Bram Moolenaarff034192013-04-24 18:51:19 +02008729 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8730 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008731
Bram Moolenaar446cb832008-06-24 21:56:24 +00008732 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaar8d043172014-01-23 14:24:41 +01008733" call Decho("(LocalBrowseCheck) case 2 (ft==netrw)")
Bram Moolenaarff034192013-04-24 18:51:19 +02008734 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8735 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar8d043172014-01-23 14:24:41 +01008736
Bram Moolenaar5c736222010-01-06 20:54:52 +01008737 elseif exists("s:treeforceredraw")
Bram Moolenaar8d043172014-01-23 14:24:41 +01008738" call Decho("(LocalBrowseCheck) case 3 (treeforceredraw)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008739 unlet s:treeforceredraw
Bram Moolenaarff034192013-04-24 18:51:19 +02008740 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8741 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008742 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008743
Bram Moolenaar446cb832008-06-24 21:56:24 +00008744 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008745
Bram Moolenaar97d62492012-11-15 21:28:22 +01008746 " following code wipes out currently unused netrw buffers
8747 " IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
8748 " AND IF the listing style is not a tree listing
8749 if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
8750 let ibuf = 1
8751 let buflast = bufnr("$")
8752 while ibuf <= buflast
8753 if bufwinnr(ibuf) == -1 && isdirectory(bufname(ibuf))
Bram Moolenaarff034192013-04-24 18:51:19 +02008754 exe "sil! keepalt ".ibuf."bw!"
Bram Moolenaar97d62492012-11-15 21:28:22 +01008755 endif
8756 let ibuf= ibuf + 1
8757 endwhile
8758 endif
8759 let @@= ykeep
Bram Moolenaar8d043172014-01-23 14:24:41 +01008760" call Decho("(LocalBrowseCheck) 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)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008761 " not a directory, ignore it
8762endfun
8763
8764" ---------------------------------------------------------------------
8765" s:LocalListing: does the job of "ls" for local directories {{{2
8766fun! s:LocalListing()
8767" call Dfunc("s:LocalListing()")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008768" call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8769" call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008770
Bram Moolenaarff034192013-04-24 18:51:19 +02008771" if exists("b:netrw_curdir") |call Decho('(LocalListing) b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("(LocalListing) b:netrw_curdir doesn't exist") |endif
8772" if exists("g:netrw_sort_by")|call Decho('(LocalListing) g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("(LocalListing) g:netrw_sort_by doesn't exist")|endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008773" call Decho("(s:LocalListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008774
8775 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02008776 let dirname = b:netrw_curdir
Bram Moolenaar8d043172014-01-23 14:24:41 +01008777 let dirnamelen = strlen(b:netrw_curdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02008778 let filelist = glob(s:ComposePath(dirname,"*"),0,1)
8779 let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1)
8780" call Decho("(LocalListing) filelist=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008781
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008782 if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16"))
8783" call Decho("(LocalListing) filelist=".string(filelist))
8784 elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008785 " include ../ in the glob() entry if its missing
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008786" call Decho("(LocalListing) forcibly including on \"..\"")
Bram Moolenaarff034192013-04-24 18:51:19 +02008787 let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
8788" call Decho("(LocalListing) filelist=".string(filelist))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008789 endif
8790
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008791" call Decho("(LocalListing) (before while) dirname<".dirname.">")
8792" call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">")
Bram Moolenaarff034192013-04-24 18:51:19 +02008793" call Decho("(LocalListing) (before while) filelist=".string(filelist))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008794
8795 if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
Bram Moolenaarff034192013-04-24 18:51:19 +02008796 let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
8797 let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
8798" call Decho("(LocalListing) dynamic_maxfilenamelen: filenames =".string(filelistcopy))
8799" call Decho("(LocalListing) dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008800 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01008801" call Decho("(s:LocalListing) g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008802
Bram Moolenaarff034192013-04-24 18:51:19 +02008803 for filename in filelist
8804" call Decho("(LocalListing) ")
Bram Moolenaar8d043172014-01-23 14:24:41 +01008805" call Decho("(LocalListing) for filename in filelist: filename<".filename.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008806
8807 if getftype(filename) == "link"
8808 " indicate a symbolic link
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008809" call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008810 let pfile= filename."@"
8811
8812 elseif getftype(filename) == "socket"
8813 " indicate a socket
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008814" call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008815 let pfile= filename."="
8816
8817 elseif getftype(filename) == "fifo"
8818 " indicate a fifo
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008819" call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008820 let pfile= filename."|"
8821
8822 elseif isdirectory(filename)
8823 " indicate a directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008824" call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008825 let pfile= filename."/"
8826
8827 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
8828 if (has("win32") || has("win95") || has("win64") || has("win16"))
8829 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
8830 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008831" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008832 let pfile= filename."*"
8833 else
8834 " normal file
8835 let pfile= filename
8836 endif
8837 elseif executable(filename)
8838 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008839" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008840 let pfile= filename."*"
8841 else
8842 " normal file
8843 let pfile= filename
8844 endif
8845
8846 else
8847 " normal file
8848 let pfile= filename
8849 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008850" call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008851
8852 if pfile =~ '//$'
8853 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008854" call Decho("(LocalListing) change // to /: pfile<".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008855 endif
8856 let pfile= strpart(pfile,dirnamelen)
8857 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008858" call Decho("(LocalListing) filename<".filename.">")
8859" call Decho("(LocalListing) pfile <".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008860
8861 if w:netrw_liststyle == s:LONGLIST
8862 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008863 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00008864 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008865" call Decho("(LocalListing) sz=".sz." fsz=".fsz)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008866 endif
8867
8868 if g:netrw_sort_by =~ "^t"
8869 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaarff034192013-04-24 18:51:19 +02008870" call Decho("(LocalListing) getftime(".filename.")=".getftime(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008871 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008872 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008873" call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008874 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008875 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008876
8877 elseif g:netrw_sort_by =~ "^s"
8878 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008879" call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008880 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008881 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008882" call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008883 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008884 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008885
8886 else
8887 " sort by name
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008888" call Decho("(LocalListing) exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008889 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008890 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02008891 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00008892
8893 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008894 sil! keepj g/^$/d
8895 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01008896 call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008897" call Decho("(LocalListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
8898 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008899
8900" call Dret("s:LocalListing")
8901endfun
8902
8903" ---------------------------------------------------------------------
8904" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
8905" performed any shell command. The idea is to cause all local-browsing
8906" buffers to be refreshed after a user has executed some shell command,
8907" on the chance that s/he removed/created a file/directory with it.
8908fun! s:LocalBrowseShellCmdRefresh()
8909" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
8910 " determine which buffers currently reside in a tab
8911 if !exists("s:netrw_browselist")
8912" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
8913 return
8914 endif
8915 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008916" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008917 return
8918 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008919 if exists("s:locbrowseshellcmd")
8920 if s:locbrowseshellcmd
8921 let s:locbrowseshellcmd= 0
8922" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
8923 return
8924 endif
8925 let s:locbrowseshellcmd= 0
8926 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008927 let itab = 1
8928 let buftablist = []
Bram Moolenaar97d62492012-11-15 21:28:22 +01008929 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008930 while itab <= tabpagenr("$")
8931 let buftablist = buftablist + tabpagebuflist()
8932 let itab = itab + 1
8933 tabn
8934 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +02008935" call Decho("(LocalBrowseShellCmdRefresh) buftablist".string(buftablist))
8936" call Decho("(LocalBrowseShellCmdRefresh) s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008937 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
8938 " | refresh any netrw window
8939 " | wipe out any non-displaying netrw buffer
8940 let curwin = winnr()
8941 let ibl = 0
8942 for ibuf in s:netrw_browselist
Bram Moolenaarff034192013-04-24 18:51:19 +02008943" call Decho("(LocalBrowseShellCmdRefresh) bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008944 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
8945 " wipe out any non-displaying netrw buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02008946" call Decho("(LocalBrowseShellCmdRefresh) wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008947 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008948 call remove(s:netrw_browselist,ibl)
Bram Moolenaarff034192013-04-24 18:51:19 +02008949" call Decho("(LocalBrowseShellCmdRefresh) browselist=".string(s:netrw_browselist))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008950 continue
8951 elseif index(tabpagebuflist(),ibuf) != -1
8952 " refresh any netrw buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02008953" call Decho("(LocalBrowseShellCmdRefresh) refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008954 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008955 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008956 endif
8957 let ibl= ibl + 1
8958 endfor
8959 exe curwin."wincmd w"
Bram Moolenaar97d62492012-11-15 21:28:22 +01008960 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008961
8962" call Dret("LocalBrowseShellCmdRefresh")
8963endfun
8964
8965" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +01008966" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
8967"
8968" g:netrw_ Directory Is
8969" fastbrowse Local Remote
8970" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
8971" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
8972" fast 2 H H
8973"
8974" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
8975" Hiding a buffer means that it will be re-used when examined, hence "fast".
8976" (re-using a buffer may not be as accurate)
8977fun! s:LocalFastBrowser()
8978" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse." s:netrw_browser_shellcmd ".(exists("s:netrw_browser_shellcmd")? "exists" : "does not exist"))
8979
8980 " initialize browselist, a list of buffer numbers that the local browser has used
8981 if !exists("s:netrw_browselist")
Bram Moolenaarff034192013-04-24 18:51:19 +02008982" call Decho("(LocalFastBrowser) initialize s:netrw_browselist")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008983 let s:netrw_browselist= []
8984 endif
8985
8986 " append current buffer to fastbrowse list
8987 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
Bram Moolenaarff034192013-04-24 18:51:19 +02008988" call Decho("(LocalFastBrowser) appendng current buffer to browselist")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008989 call add(s:netrw_browselist,bufnr("%"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008990" call Decho("(LocalFastBrowser) browselist=".string(s:netrw_browselist))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008991 endif
8992
8993 " enable autocmd events to handle refreshing/removing local browser buffers
8994 " If local browse buffer is currently showing: refresh it
8995 " If local browse buffer is currently hidden : wipe it
8996 " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing
8997 " =1 : medium speed, re-use directory listing for remote only
8998 " =2 : fast speed, always re-use directory listing when possible
8999 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02009000" call Decho("(LocalFastBrowser) setting up local-browser shell command refresh")
Bram Moolenaar97d62492012-11-15 21:28:22 +01009001 let s:netrw_browser_shellcmd= 1
9002 augroup AuNetrwShellCmd
9003 au!
9004 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarff034192013-04-24 18:51:19 +02009005" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01009006 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
9007 else
9008 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaarff034192013-04-24 18:51:19 +02009009" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01009010 endif
9011 augroup END
9012 endif
9013
9014 " user must have changed fastbrowse to its fast setting, so remove
9015 " the associated autocmd events
9016 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
Bram Moolenaarff034192013-04-24 18:51:19 +02009017" call Decho("(LocalFastBrowser) remove AuNetrwShellCmd autcmd group")
Bram Moolenaar97d62492012-11-15 21:28:22 +01009018 unlet s:netrw_browser_shellcmd
9019 augroup AuNetrwShellCmd
9020 au!
9021 augroup END
9022 augroup! AuNetrwShellCmd
9023 endif
9024
9025" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
9026endfun
9027
9028" ---------------------------------------------------------------------
9029" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
9030fun! s:NetrwLocalExecute(cmd)
9031" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
9032 let ykeep= @@
9033 " sanity check
9034 if !executable(a:cmd)
9035 call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
9036 let @@= ykeep
9037" call Dret("s:NetrwLocalExecute")
9038 return
9039 endif
9040
9041 let optargs= input(":!".a:cmd,"","file")
9042" call Decho("optargs<".optargs.">")
9043 let result= system(a:cmd.optargs)
9044" call Decho(result)
9045
9046 " strip any ansi escape sequences off
9047 let result = substitute(result,"\e\\[[0-9;]*m","","g")
9048
9049 " show user the result(s)
9050 echomsg result
9051 let @@= ykeep
9052
9053" call Dret("s:NetrwLocalExecute")
9054endfun
9055
9056" ---------------------------------------------------------------------
9057" s:NetrwLocalRename: rename a remote file or directory {{{2
9058fun! s:NetrwLocalRename(path) range
9059" call Dfunc("NetrwLocalRename(path<".a:path.">)")
9060
9061 " preparation for removing multiple files/directories
9062 let ykeep = @@
9063 let ctr = a:firstline
9064 let svpos = netrw#NetrwSavePosn()
9065
9066 " rename files given by the markfilelist
9067 if exists("s:netrwmarkfilelist_{bufnr('%')}")
9068 for oldname in s:netrwmarkfilelist_{bufnr("%")}
9069" call Decho("oldname<".oldname.">")
9070 if exists("subfrom")
9071 let newname= substitute(oldname,subfrom,subto,'')
9072" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
9073 else
9074 call inputsave()
9075 let newname= input("Moving ".oldname." to : ",oldname)
9076 call inputrestore()
9077 if newname =~ '^s/'
9078 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
9079 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
9080" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
9081 let newname = substitute(oldname,subfrom,subto,'')
9082 endif
9083 endif
9084 call rename(oldname,newname)
9085 endfor
9086 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
9087
9088 else
9089
9090 " attempt to rename files/directories
9091 while ctr <= a:lastline
9092 exe "keepj ".ctr
9093
9094 " sanity checks
9095 if line(".") < w:netrw_bannercnt
9096 let ctr= ctr + 1
9097 continue
9098 endif
9099 let curword= s:NetrwGetWord()
9100 if curword == "./" || curword == "../"
9101 let ctr= ctr + 1
9102 continue
9103 endif
9104
9105 keepj norm! 0
9106 let oldname= s:ComposePath(a:path,curword)
9107" call Decho("oldname<".oldname.">")
9108
9109 call inputsave()
9110 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
9111 call inputrestore()
9112
9113 call rename(oldname,newname)
9114" call Decho("renaming <".oldname."> to <".newname.">")
9115
9116 let ctr= ctr + 1
9117 endwhile
9118 endif
9119
9120 " refresh the directory
9121" call Decho("refresh the directory listing")
9122 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
9123 keepj call netrw#NetrwRestorePosn(svpos)
9124 let @@= ykeep
9125
9126" call Dret("NetrwLocalRename")
9127endfun
9128
9129" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009130" s:NetrwLocalRm: {{{2
9131fun! s:NetrwLocalRm(path) range
9132" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
9133" call Decho("firstline=".a:firstline." lastline=".a:lastline)
9134
9135 " preparation for removing multiple files/directories
Bram Moolenaar97d62492012-11-15 21:28:22 +01009136 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00009137 let ret = 0
9138 let all = 0
9139 let svpos = netrw#NetrwSavePosn()
9140
9141 if exists("s:netrwmarkfilelist_{bufnr('%')}")
9142 " remove all marked files
9143" call Decho("remove all marked files")
9144 for fname in s:netrwmarkfilelist_{bufnr("%")}
9145 let ok= s:NetrwLocalRmFile(a:path,fname,all)
9146 if ok =~ 'q\%[uit]' || ok == "no"
9147 break
9148 elseif ok =~ 'a\%[ll]'
9149 let all= 1
9150 endif
9151 endfor
9152 call s:NetrwUnMarkFile(1)
9153
9154 else
9155 " remove (multiple) files and directories
9156" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
9157
9158 let ctr = a:firstline
9159 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009160 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00009161
9162 " sanity checks
9163 if line(".") < w:netrw_bannercnt
9164 let ctr= ctr + 1
9165 continue
9166 endif
9167 let curword= s:NetrwGetWord()
9168 if curword == "./" || curword == "../"
9169 let ctr= ctr + 1
9170 continue
9171 endif
9172 let ok= s:NetrwLocalRmFile(a:path,curword,all)
9173 if ok =~ 'q\%[uit]' || ok == "no"
9174 break
9175 elseif ok =~ 'a\%[ll]'
9176 let all= 1
9177 endif
9178 let ctr= ctr + 1
9179 endwhile
9180 endif
9181
9182 " refresh the directory
9183" call Decho("bufname<".bufname("%").">")
9184 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02009185 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
9186 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009187 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01009188 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00009189
9190" call Dret("s:NetrwLocalRm")
9191endfun
9192
9193" ---------------------------------------------------------------------
9194" s:NetrwLocalRmFile: remove file fname given the path {{{2
9195" Give confirmation prompt unless all==1
9196fun! s:NetrwLocalRmFile(path,fname,all)
9197" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
9198
9199 let all= a:all
9200 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009201 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009202 let rmfile= s:ComposePath(a:path,a:fname)
9203" call Decho("rmfile<".rmfile.">")
9204
9205 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
9206 " attempt to remove file
9207" call Decho("attempt to remove file<".rmfile.">")
9208 if !all
9209 echohl Statement
9210 call inputsave()
9211 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
9212 call inputrestore()
9213 echohl NONE
9214 if ok == ""
9215 let ok="no"
9216 endif
9217" call Decho("response: ok<".ok.">")
9218 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
9219" call Decho("response: ok<".ok."> (after sub)")
9220 if ok =~ 'a\%[ll]'
9221 let all= 1
9222 endif
9223 endif
9224
9225 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00009226 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009227" call Decho("errcode=".v:shell_error." ret=".ret)
9228 endif
9229
9230 else
9231 " attempt to remove directory
9232 if !all
9233 echohl Statement
9234 call inputsave()
9235 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
9236 call inputrestore()
9237 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
9238 if ok == ""
9239 let ok="no"
9240 endif
9241 if ok =~ 'a\%[ll]'
9242 let all= 1
9243 endif
9244 endif
9245 let rmfile= substitute(rmfile,'[\/]$','','e')
9246
9247 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009248" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')')
9249 call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009250" call Decho("v:shell_error=".v:shell_error)
9251
9252 if v:shell_error != 0
9253" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009254 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009255" call Decho("errcode=".errcode)
9256
9257 if errcode != 0
9258 if has("unix")
9259" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009260 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00009261 if v:shell_error != 0 && !exists("g:netrw_quiet")
9262 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
9263 let ok="no"
9264 endif
9265 elseif !exists("g:netrw_quiet")
9266 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
9267 let ok="no"
9268 endif
9269 endif
9270 endif
9271 endif
9272 endif
9273
9274" call Dret("s:NetrwLocalRmFile ".ok)
9275 return ok
9276endfun
9277
9278" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009279" Support Functions: {{{1
9280
Bram Moolenaar488c6512005-08-11 20:09:58 +00009281" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009282" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
9283fun! netrw#WinPath(path)
9284" call Dfunc("netrw#WinPath(path<".a:path.">)")
9285 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
9286 " remove cygdrive prefix, if present
Bram Moolenaar8d043172014-01-23 14:24:41 +01009287 let path = substitute(a:path,g:netrw_cygdrive.'/\(.\)','\1:','')
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009288 " remove trailing slash (Win95)
9289 let path = substitute(path, '\(\\\|/\)$', '', 'g')
9290 " remove escaped spaces
9291 let path = substitute(path, '\ ', ' ', 'g')
9292 " convert slashes to backslashes
9293 let path = substitute(path, '/', '\', 'g')
9294 else
9295 let path= a:path
9296 endif
9297" call Dret("netrw#WinPath <".path.">")
9298 return path
9299endfun
9300
9301" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009302" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
9303fun! netrw#NetrwRestorePosn(...)
9304" call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1))
9305 let eikeep= &ei
9306 set ei=all
9307 if expand("%") == "NetrwMessage"
Bram Moolenaarff034192013-04-24 18:51:19 +02009308 if exists("s:winBeforeErr")
9309 exe s:winBeforeErr."wincmd w"
9310 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00009311 endif
9312
9313 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02009314 exe "keepj ".a:1
Bram Moolenaarc236c162008-07-13 17:41:49 +00009315 endif
9316
9317 " restore window
9318 if exists("w:netrw_winnr")
Bram Moolenaarff034192013-04-24 18:51:19 +02009319" call Decho("(NetrwRestorePosn) restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009320 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00009321 endif
9322 if v:shell_error == 0
9323 " as suggested by Bram M: redraw on no error
9324 " allows protocol error messages to remain visible
9325" redraw!
9326 endif
9327
9328 " restore top-of-screen line
9329 if exists("w:netrw_hline")
Bram Moolenaarff034192013-04-24 18:51:19 +02009330" call Decho("(NetrwRestorePosn) restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009331 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00009332 endif
9333
9334 " restore position
9335 if exists("w:netrw_line") && exists("w:netrw_col")
Bram Moolenaarff034192013-04-24 18:51:19 +02009336" call Decho("(NetrwRestorePosn) restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009337 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00009338 endif
9339
9340 let &ei= eikeep
Bram Moolenaarff034192013-04-24 18:51:19 +02009341" call Dret("netrw#NetrwRestorePosn : line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
Bram Moolenaarc236c162008-07-13 17:41:49 +00009342endfun
9343
9344" ---------------------------------------------------------------------
9345" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
9346fun! netrw#NetrwSavePosn()
Bram Moolenaarff034192013-04-24 18:51:19 +02009347" call Dfunc("netrw#NetrwSavePosn() line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
Bram Moolenaarc236c162008-07-13 17:41:49 +00009348 " Save current line and column
9349 let w:netrw_winnr= winnr()
9350 let w:netrw_line = line(".")
9351 let w:netrw_col = virtcol(".")
Bram Moolenaarff034192013-04-24 18:51:19 +02009352" call Decho("(NetrwSavePosn) currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009353
9354 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009355 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00009356 let w:netrw_hline= line(".")
9357
9358 " set up string holding position parameters
9359 let ret = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline
9360
Bram Moolenaaradc21822011-04-01 18:03:16 +02009361 keepj call netrw#NetrwRestorePosn()
Bram Moolenaar8d043172014-01-23 14:24:41 +01009362" call Dret("netrw#NetrwSavePosn : winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : "n/a")." line=".(exists("w:netrw_line")? w:netrw_line : "n/a")." col=".(exists("w:netrw_col")? w:netrw_col : "n/a")." hline=".(exists("w:netrw_hline")? w:netrw_hline : "n/a"))
Bram Moolenaarc236c162008-07-13 17:41:49 +00009363 return ret
9364endfun
9365
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009366" ---------------------------------------------------------------------
9367" netrw#NetrwAccess: intended to provide access to variable values for netrw's test suite {{{2
9368" 0: marked file list of current buffer
9369" 1: marked file target
9370fun! netrw#NetrwAccess(ilist)
9371 if a:ilist == 0
9372 if exists("s:netrwmarkfilelist_".bufnr('%'))
9373 return s:netrwmarkfilelist_{bufnr('%')}
9374 else
9375 return "no-list-buf#".bufnr('%')
9376 endif
9377 elseif a:ilist == 1
9378 return s:netrwmftgt
9379endfun
9380
Bram Moolenaarc236c162008-07-13 17:41:49 +00009381" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009382" netrw#RFC2396: converts %xx into characters {{{2
9383fun! netrw#RFC2396(fname)
9384" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
9385 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
9386" call Dret("netrw#RFC2396 ".fname)
9387 return fname
9388endfun
9389
9390" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009391" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
9392fun! s:ComposePath(base,subdir)
9393" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
9394
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009395 if has("amiga")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009396" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01009397 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00009398 if ec != '/' && ec != ':'
9399 let ret = a:base . "/" . a:subdir
9400 else
9401 let ret = a:base . a:subdir
9402 endif
9403
9404 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
9405" call Decho("windows")
9406 let ret= a:subdir
9407
Bram Moolenaar5c736222010-01-06 20:54:52 +01009408 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
9409" call Decho("windows")
9410 if a:base =~ '[/\\]$'
9411 let ret= a:base.a:subdir
9412 else
9413 let ret= a:base."/".a:subdir
9414 endif
9415
Bram Moolenaarc236c162008-07-13 17:41:49 +00009416 elseif a:base =~ '^\a\+://'
9417" call Decho("remote linux/macos")
9418 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
9419 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
9420 if a:subdir == '../'
9421 if curpath =~ '[^/]/[^/]\+/$'
9422 let curpath= substitute(curpath,'[^/]\+/$','','')
9423 else
9424 let curpath=""
9425 endif
9426 let ret= urlbase.curpath
9427 else
9428 let ret= urlbase.curpath.a:subdir
9429 endif
9430" call Decho("urlbase<".urlbase.">")
9431" call Decho("curpath<".curpath.">")
9432" call Decho("ret<".ret.">")
9433
9434 else
9435" call Decho("local linux/macos")
9436 let ret = substitute(a:base."/".a:subdir,"//","/","g")
9437 if a:base =~ '^//'
9438 " keeping initial '//' for the benefit of network share listing support
9439 let ret= '/'.ret
9440 endif
9441 let ret= simplify(ret)
9442 endif
9443
9444" call Dret("s:ComposePath ".ret)
9445 return ret
9446endfun
9447
9448" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009449" s:FileReadable: o/s independent filereadable {{{2
9450fun! s:FileReadable(fname)
9451" call Dfunc("s:FileReadable(fname<".a:fname.">)")
9452
9453 if g:netrw_cygwin
Bram Moolenaar8d043172014-01-23 14:24:41 +01009454 let ret= filereadable(substitute(a:fname,g:netrw_cygdrive.'/\(.\)','\1:/',''))
Bram Moolenaar9964e462007-05-05 17:54:07 +00009455 else
9456 let ret= filereadable(a:fname)
9457 endif
9458
9459" call Dret("s:FileReadable ".ret)
9460 return ret
9461endfun
9462
9463" ---------------------------------------------------------------------
9464" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
9465" Places correct suffix on end of temporary filename,
9466" using the suffix provided with fname
9467fun! s:GetTempfile(fname)
9468" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
9469
9470 if !exists("b:netrw_tmpfile")
9471 " get a brand new temporary filename
9472 let tmpfile= tempname()
9473" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009474
Bram Moolenaarc236c162008-07-13 17:41:49 +00009475 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009476" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009477
Bram Moolenaar9964e462007-05-05 17:54:07 +00009478 " sanity check -- does the temporary file's directory exist?
9479 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009480" call Decho("(GetTempfile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009481 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00009482" call Dret("s:GetTempfile getcwd<".getcwd().">")
9483 return ""
9484 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009485
Bram Moolenaar9964e462007-05-05 17:54:07 +00009486 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01009487 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009488" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009489
Bram Moolenaar9964e462007-05-05 17:54:07 +00009490 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00009491 if g:netrw_cygwin != 0
Bram Moolenaar8d043172014-01-23 14:24:41 +01009492 let tmpfile = substitute(tmpfile,'^\(\a\):',g:netrw_cygdrive.'/\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009493 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009494 if !exists("+shellslash") || !&ssl
9495 let tmpfile = substitute(tmpfile,'/','\','g')
9496 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009497 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00009498 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00009499 endif
9500 let b:netrw_tmpfile= tmpfile
9501" call Decho("o/s dependent fixed tempname<".tmpfile.">")
9502 else
9503 " re-use temporary filename
9504 let tmpfile= b:netrw_tmpfile
9505" call Decho("tmpfile<".tmpfile."> re-using")
9506 endif
9507
9508 " use fname's suffix for the temporary file
9509 if a:fname != ""
9510 if a:fname =~ '\.[^./]\+$'
9511" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009512 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00009513 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009514 elseif a:fname =~ '.txz$'
9515 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009516 else
9517 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
9518 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009519" call Decho("suffix<".suffix.">")
9520 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
9521" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
9522 let tmpfile .= suffix
9523" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
9524 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
9525 endif
9526 endif
9527
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009528" call Decho("(GetTempFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009529" call Dret("s:GetTempfile <".tmpfile.">")
9530 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00009531endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00009532
9533" ---------------------------------------------------------------------
9534" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00009535" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00009536fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009537" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009538 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
9539 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00009540 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009541 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00009542 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009543 else
9544 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
9545 endif
9546" call Dret("s:MakeSshCmd <".sshcmd.">")
9547 return sshcmd
9548endfun
9549
9550" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009551" s:NetrwBMShow: {{{2
9552fun! s:NetrwBMShow()
9553" call Dfunc("s:NetrwBMShow()")
9554 redir => bmshowraw
9555 menu
9556 redir END
9557 let bmshowlist = split(bmshowraw,'\n')
9558 if bmshowlist != []
9559 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
9560 if bmshowfuncs != []
9561 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
9562 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02009563 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00009564 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009565 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009566 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00009567" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
9568endfun
9569
9570" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02009571" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
9572fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009573 if !exists("w:netrw_liststyle")
9574 let w:netrw_liststyle= g:netrw_liststyle
9575 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02009576" 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 +02009577
9578 if &ft != "netrw"
9579 " if the current window isn't a netrw directory listing window, then use user cursorline/column
9580 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaar15146672011-10-20 22:22:38 +02009581" call Decho("case ft!=netrw: use user cul,cuc")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009582 let &l:cursorline = s:netrw_usercul
9583 let &l:cursorcolumn = s:netrw_usercuc
9584
9585 elseif g:netrw_cursor == 4
9586 " all styles: cursorline, cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02009587" call Decho("case g:netrw_cursor==4: setl cul cuc")
9588 setl cursorline
9589 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02009590
9591 elseif g:netrw_cursor == 3
9592 " thin-long-tree: cursorline, user's cursorcolumn
9593 " wide : cursorline, cursorcolumn
9594 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02009595" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc")
Bram Moolenaar15146672011-10-20 22:22:38 +02009596 setl cursorline
9597 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02009598 else
Bram Moolenaarff034192013-04-24 18:51:19 +02009599" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)")
Bram Moolenaar15146672011-10-20 22:22:38 +02009600 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009601 let &l:cursorcolumn = s:netrw_usercuc
9602 endif
9603
9604 elseif g:netrw_cursor == 2
9605 " thin-long-tree: cursorline, user's cursorcolumn
9606 " wide : cursorline, user's cursorcolumn
Bram Moolenaarff034192013-04-24 18:51:19 +02009607" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009608 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +02009609 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009610
9611 elseif g:netrw_cursor == 1
9612 " thin-long-tree: user's cursorline, user's cursorcolumn
9613 " wide : cursorline, user's cursorcolumn
9614 let &l:cursorcolumn = s:netrw_usercuc
9615 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02009616" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)")
Bram Moolenaar8d043172014-01-23 14:24:41 +01009617 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009618 else
Bram Moolenaar15146672011-10-20 22:22:38 +02009619" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009620 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009621 endif
9622
9623 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02009624 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02009625" call Decho("default: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009626 let &l:cursorline = s:netrw_usercul
9627 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009628 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009629
9630" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009631endfun
9632
9633" ---------------------------------------------------------------------
9634" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
9635fun! s:RestoreCursorline()
Bram Moolenaar8d043172014-01-23 14:24:41 +01009636" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02009637 if exists("s:netrw_usercul")
9638 let &l:cursorline = s:netrw_usercul
9639 endif
9640 if exists("s:netrw_usercuc")
9641 let &l:cursorcolumn = s:netrw_usercuc
9642 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009643" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
9644endfun
9645
9646" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009647" s:NetrwDelete: Deletes a file. {{{2
9648" Uses Steve Hall's idea to insure that Windows paths stay
9649" acceptable. No effect on Unix paths.
9650" Examples of use: let result= s:NetrwDelete(path)
9651fun! s:NetrwDelete(path)
9652" call Dfunc("s:NetrwDelete(path<".a:path.">)")
9653
Bram Moolenaar5c736222010-01-06 20:54:52 +01009654 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009655 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
9656 if exists("+shellslash")
9657 let sskeep= &shellslash
Bram Moolenaarff034192013-04-24 18:51:19 +02009658 setl noshellslash
Bram Moolenaarc236c162008-07-13 17:41:49 +00009659 let result = delete(path)
9660 let &shellslash = sskeep
9661 else
9662" call Decho("exe let result= ".a:cmd."('".path."')")
9663 let result= delete(path)
9664 endif
9665 else
9666" call Decho("let result= delete(".path.")")
9667 let result= delete(path)
9668 endif
9669 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02009670 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009671 endif
9672
9673" call Dret("s:NetrwDelete ".result)
9674 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00009675endfun
9676
9677" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009678" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01009679fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009680" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar8d043172014-01-23 14:24:41 +01009681" call Decho("(s:NetrwEnew) curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009682
Bram Moolenaar446cb832008-06-24 21:56:24 +00009683 " grab a function-local-variable copy of buffer variables
Bram Moolenaar8d043172014-01-23 14:24:41 +01009684" call Decho("(s:NetrwEnew) make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009685 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
9686 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
9687 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
9688 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
9689 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9690 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
9691 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
9692 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
9693 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
9694 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9695 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
9696 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
9697 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
9698 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
9699 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
9700 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
9701
Bram Moolenaaradc21822011-04-01 18:03:16 +02009702 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8d043172014-01-23 14:24:41 +01009703" call Decho("(s:NetrwEnew) generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009704 let netrw_keepdiff= &l:diff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009705 keepj keepalt enew!
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009706 let &l:diff= netrw_keepdiff
Bram Moolenaar8d043172014-01-23 14:24:41 +01009707" call Decho("(s:NetrwEnew) bufnr($)=".bufnr("$")." winnr($)=".winnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02009708 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009709
Bram Moolenaar446cb832008-06-24 21:56:24 +00009710 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar8d043172014-01-23 14:24:41 +01009711" call Decho("(s:NetrwEnew) copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009712 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
9713 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
9714 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
9715 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
9716 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
9717 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
9718 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
9719 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
9720 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
9721 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
9722 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
9723 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
9724 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
9725 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
9726 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
9727 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
9728
Bram Moolenaar5c736222010-01-06 20:54:52 +01009729 if a:0 > 0
9730 let b:netrw_curdir= a:1
9731 if b:netrw_curdir =~ '/$'
9732 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
9733 file NetrwTreeListing
Bram Moolenaarff034192013-04-24 18:51:19 +02009734 set bt=nowrite noswf bh=hide
Bram Moolenaaradc21822011-04-01 18:03:16 +02009735 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
9736 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01009737 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009738 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009739 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009740 endif
9741 endif
9742
Bram Moolenaar8d043172014-01-23 14:24:41 +01009743" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh." win#".winnr()." winnr($)#".winnr("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00009744endfun
9745
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009746" ---------------------------------------------------------------------
9747" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
9748fun! s:NetrwInsureWinVars()
Bram Moolenaar97d62492012-11-15 21:28:22 +01009749" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009750 if !exists("w:netrw_liststyle")
9751 let curbuf = bufnr("%")
9752 let curwin = winnr()
9753 let iwin = 1
9754 while iwin <= winnr("$")
9755 exe iwin."wincmd w"
9756 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
9757 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
9758 let winvars= w:
9759 break
9760 endif
9761 let iwin= iwin + 1
9762 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +02009763 exe "keepalt ".curwin."wincmd w"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009764 if exists("winvars")
9765" call Decho("copying w#".iwin." window variables to w#".curwin)
9766 for k in keys(winvars)
9767 let w:{k}= winvars[k]
9768 endfor
9769 endif
9770 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01009771" call Dret("s:NetrwInsureWinVars win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009772endfun
9773
Bram Moolenaar9964e462007-05-05 17:54:07 +00009774" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009775" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
9776" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
9777fun! s:NetrwSaveWordPosn()
9778" call Dfunc("NetrwSaveWordPosn()")
9779 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
9780" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
9781endfun
9782
9783" ---------------------------------------------------------------------
9784" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
9785" changed sorting, etc. Also see s:NetrwSaveWordPosn().
9786fun! s:NetrwRestoreWordPosn()
9787" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009788 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00009789" call Dret("NetrwRestoreWordPosn")
9790endfun
9791
9792" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009793" s:RestoreBufVars: {{{2
9794fun! s:RestoreBufVars()
9795" call Dfunc("s:RestoreBufVars()")
9796
9797 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
9798 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
9799 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
9800 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
9801 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
9802 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
9803
9804" call Dret("s:RestoreBufVars")
9805endfun
9806
9807" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009808" s:RemotePathAnalysis: {{{2
9809fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02009810" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009811
Bram Moolenaar8d043172014-01-23 14:24:41 +01009812 let dirpat = '^\(\w\{-}\)://\(\(\w\+\)@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00009813 let s:method = substitute(a:dirname,dirpat,'\1','')
Bram Moolenaar8d043172014-01-23 14:24:41 +01009814 let s:user = substitute(a:dirname,dirpat,'\3','')
9815 let s:machine = substitute(a:dirname,dirpat,'\4','')
9816 let s:port = substitute(a:dirname,dirpat,'\5','')
9817 let s:path = substitute(a:dirname,dirpat,'\6','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009818 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
9819
9820" call Decho("set up s:method <".s:method .">")
9821" call Decho("set up s:user <".s:user .">")
9822" call Decho("set up s:machine<".s:machine.">")
9823" call Decho("set up s:port <".s:port.">")
9824" call Decho("set up s:path <".s:path .">")
9825" call Decho("set up s:fname <".s:fname .">")
9826
9827" call Dret("s:RemotePathAnalysis")
9828endfun
9829
9830" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009831" s:RemoteSystem: runs a command on a remote host using ssh {{{2
9832" Returns status
9833" Runs system() on
9834" [cd REMOTEDIRPATH;] a:cmd
9835" Note that it doesn't do shellescape(a:cmd)!
9836fun! s:RemoteSystem(cmd)
9837" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
9838 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02009839 keepj call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009840 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009841 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009842 else
9843 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
9844 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
9845 if remotedir != ""
9846 let cmd= cmd.' cd '.shellescape(remotedir).";"
9847 else
9848 let cmd= cmd.' '
9849 endif
9850 let cmd= cmd.a:cmd
9851" call Decho("call system(".cmd.")")
9852 let ret= system(cmd)
9853 endif
9854" call Dret("s:RemoteSystem ".ret)
9855 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00009856endfun
9857
9858" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009859" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009860fun! s:RestoreWinVars()
9861" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00009862 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009863 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
9864 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
9865 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
9866 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
9867 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
9868 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
9869 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
9870 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
9871 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
9872 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
9873 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
9874 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00009875 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
9876 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009877 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
9878 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
9879 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
9880" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00009881endfun
9882
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009883" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009884" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
9885"
9886" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
9887" is true) and a command, :Rexplore, which call this function.
9888"
9889" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
9890fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02009891 if exists("s:netrwdrag")
9892 return
9893 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009894" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02009895 if !exists("w:netrw_rexlocal")
Bram Moolenaar8d043172014-01-23 14:24:41 +01009896" call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
Bram Moolenaar15146672011-10-20 22:22:38 +02009897 return
9898 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01009899" call Decho("(NetrwRexplore) 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)
Bram Moolenaaradc21822011-04-01 18:03:16 +02009900 if w:netrw_rexlocal
9901 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009902 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02009903 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009904 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02009905 if exists("s:initbeval")
9906 set beval
9907 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009908 if exists("s:rexposn_".bufnr("%"))
9909" call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%'))
9910 keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')})
9911 unlet s:rexposn_{bufnr('%')}
9912 else
9913" call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009914 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009915 if exists("s:explore_match")
9916 exe "2match netrwMarkFile /".s:explore_match."/"
9917 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +01009918" call Decho("(NetrwRexplore) 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)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009919" call Dret("s:NetrwRexplore")
9920endfun
9921
9922" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01009923" s:SaveBufVars: save selected b: variables to s: variables {{{2
9924" use s:RestoreBufVars() to restore b: variables from s: variables
Bram Moolenaar9964e462007-05-05 17:54:07 +00009925fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009926" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00009927
9928 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
9929 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
9930 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
9931 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
9932 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
9933 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
9934
9935" call Dret("s:SaveBufVars")
9936endfun
9937
9938" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009939" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009940fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009941" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00009942 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
9943 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
9944 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
9945 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
9946 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
9947 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
9948 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
9949 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
9950 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
9951 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
9952 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
9953 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
9954 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
9955 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
9956 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
9957 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
9958 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
9959 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
9960" call Dret("s:SaveWinVars")
9961endfun
9962
9963" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009964" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009965" To allow separate windows to have their own activities, such as
9966" Explore **/pattern, several variables have been made window-oriented.
9967" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009968" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009969" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009970fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009971" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00009972 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
9973 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
9974 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
9975 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
9976 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
9977 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
9978 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
9979 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
9980 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
9981 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
9982" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009983endfun
9984
9985" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009986" s:SetRexDir: set directory for :Rexplore {{{2
9987fun! s:SetRexDir(islocal,dirname)
9988" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009989 let w:netrw_rexdir = a:dirname
9990 let w:netrw_rexlocal = a:islocal
Bram Moolenaar97d62492012-11-15 21:28:22 +01009991" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009992endfun
9993
9994" ---------------------------------------------------------------------
Bram Moolenaar8d043172014-01-23 14:24:41 +01009995" s:Strlen: this function returns the length of a string, even if its using multi-byte characters. {{{2
9996" Solution from Nicolai Weibull, vim docs (:help strlen()),
9997" Tony Mechelynck, and my own invention.
Bram Moolenaar446cb832008-06-24 21:56:24 +00009998fun! s:Strlen(x)
Bram Moolenaar8d043172014-01-23 14:24:41 +01009999" "" call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen.")")
10000
10001 if v:version >= 703 && exists("*strdisplaywidth")
10002 let ret= strdisplaywidth(a:x)
10003
10004 elseif type(g:Align_xstrlen) == 1
10005 " allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc")
10006 exe "let ret= ".g:Align_xstrlen."('".substitute(a:x,"'","''","g")."')"
10007
10008 elseif g:Align_xstrlen == 1
Bram Moolenaar446cb832008-06-24 21:56:24 +000010009 " number of codepoints (Latin a + combining circumflex is two codepoints)
10010 " (comment from TM, solution from NW)
10011 let ret= strlen(substitute(a:x,'.','c','g'))
Bram Moolenaar8d043172014-01-23 14:24:41 +010010012
10013 elseif g:Align_xstrlen == 2
10014 " number of spacing codepoints (Latin a + combining circumflex is one spacing
Bram Moolenaar446cb832008-06-24 21:56:24 +000010015 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
10016 " (comment from TM, solution from TM)
Bram Moolenaar8d043172014-01-23 14:24:41 +010010017 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
10018
10019 elseif g:Align_xstrlen == 3
10020 " virtual length (counting, for instance, tabs as anything between 1 and
10021 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
Bram Moolenaar446cb832008-06-24 21:56:24 +000010022 " preceded by lam, one otherwise, etc.)
10023 " (comment from TM, solution from me)
Bram Moolenaar8d043172014-01-23 14:24:41 +010010024 let modkeep= &l:mod
10025 exe "norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +000010026 call setline(line("."),a:x)
10027 let ret= virtcol("$") - 1
Bram Moolenaar8d043172014-01-23 14:24:41 +010010028 d
Bram Moolenaarff034192013-04-24 18:51:19 +020010029 keepj norm! k
Bram Moolenaar8d043172014-01-23 14:24:41 +010010030 let &l:mod= modkeep
10031
Bram Moolenaar446cb832008-06-24 21:56:24 +000010032 else
10033 " at least give a decent default
Bram Moolenaar8d043172014-01-23 14:24:41 +010010034 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010035 endif
Bram Moolenaar8d043172014-01-23 14:24:41 +010010036" "" call Dret("s:Strlen ".ret)
Bram Moolenaar446cb832008-06-24 21:56:24 +000010037 return ret
10038endfun
10039
10040" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010041" s:TreeListMove: {{{2
10042fun! s:TreeListMove(dir)
10043" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
10044 let curline = getline('.')
10045 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
10046 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
10047 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
Bram Moolenaar8d043172014-01-23 14:24:41 +010010048 let indentm1 = substitute(curindent,'^'.s:treedepthstring.' ','','')
Bram Moolenaar446cb832008-06-24 21:56:24 +000010049" call Decho("prvline <".prvline."> #".line(".")-1)
10050" call Decho("curline <".curline."> #".line("."))
10051" call Decho("nxtline <".nxtline."> #".line(".")+1)
10052" call Decho("curindent<".curindent.">")
10053" call Decho("indentm1 <".indentm1.">")
10054
10055 if curline !~ '/$'
10056" call Decho('regfile')
10057 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +020010058 keepj norm! 0
Bram Moolenaar8d043172014-01-23 14:24:41 +010010059 let nl = search('^'.indentm1.'[^'.s:treedepthstring.']','bWe') " search backwards from regular file
Bram Moolenaar446cb832008-06-24 21:56:24 +000010060" call Decho("regfile srch back: ".nl)
10061 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +020010062 keepj norm! $
Bram Moolenaar8d043172014-01-23 14:24:41 +010010063 let nl = search('^'.indentm1.'[^'.s:treedepthstring.']','We') " search forwards from regular file
Bram Moolenaar446cb832008-06-24 21:56:24 +000010064" call Decho("regfile srch fwd: ".nl)
10065 endif
10066
10067 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +020010068 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +000010069 let curline= line(".")
Bram Moolenaar8d043172014-01-23 14:24:41 +010010070 let nl = search('^'.curindent.'[^'.s:treedepthstring.']','bWe') " search backwards From directory, same indentation
Bram Moolenaar446cb832008-06-24 21:56:24 +000010071" call Decho("dir srch back ind: ".nl)
10072 if nl != 0
10073 if line(".") == curline-1
Bram Moolenaar8d043172014-01-23 14:24:41 +010010074 let nl= search('^'.indentm1.'[^'.s:treedepthstring.']','bWe') " search backwards from directory, indentation - 1
Bram Moolenaar446cb832008-06-24 21:56:24 +000010075" call Decho("dir srch back ind-1: ".nl)
10076 endif
10077 endif
10078
10079 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +020010080 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +000010081 let curline = line(".")
Bram Moolenaar8d043172014-01-23 14:24:41 +010010082 let nl = search('^'.curindent.'[^'.s:treedepthstring.']','We') " search forwards from directory, same indentation
Bram Moolenaar446cb832008-06-24 21:56:24 +000010083" call Decho("dir srch fwd ind: ".nl)
10084 if nl != 0
10085 if line(".") == curline+1
Bram Moolenaar8d043172014-01-23 14:24:41 +010010086 let nl= search('^'.indentm1.'[^'.s:treedepthstring.']','We') " search forwards from directory, indentation - 1
Bram Moolenaar446cb832008-06-24 21:56:24 +000010087" call Decho("dir srch fwd ind-1: ".nl)
10088 endif
10089 endif
10090
10091 endif
10092
10093" call Dret("s:TreeListMove")
10094endfun
10095
10096" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +000010097" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
10098" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
10099" can't be called except via emenu. But due to locale, that menu line may not be called
10100" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
10101fun! s:UpdateBuffersMenu()
10102" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +020010103 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +000010104 try
Bram Moolenaaradc21822011-04-01 18:03:16 +020010105 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +000010106 catch /^Vim\%((\a\+)\)\=:E/
10107 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +020010108 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +000010109 endtry
10110 endif
10111" call Dret("s:UpdateBuffersMenu")
10112endfun
10113
10114" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +000010115" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +020010116" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000010117fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +000010118" call Dfunc("s:UseBufWinVars()")
10119 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000010120 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
10121 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
10122 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
10123 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
10124 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
10125 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
10126 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
10127 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
10128 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 +000010129" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +000010130endfun
10131
Bram Moolenaar1afcace2005-11-25 19:54:28 +000010132" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +020010133" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +000010134let &cpo= s:keepcpo
10135unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000010136
Bram Moolenaar071d4272004-06-13 20:20:40 +000010137" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +000010138" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000010139" vim:ts=8 fdm=marker