blob: b077bb73bb73f0cfb142f057bd2768b4746019a7 [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 Moolenaare6ae6222013-05-21 21:01:10 +02003" Date: May 18, 2013
4" Version: 149
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 Moolenaarff034192013-04-24 18:51:19 +02007" Copyright: Copyright (C) 1999-2012 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 Moolenaare6ae6222013-05-21 21:01:10 +020025let g:loaded_netrw = "v149"
Bram Moolenaarff034192013-04-24 18:51:19 +020026if v:version < 703 || (v:version == 703 && !has("patch465"))
Bram Moolenaar5c736222010-01-06 20:54:52 +010027 echohl WarningMsg
Bram Moolenaarff034192013-04-24 18:51:19 +020028 echo "***warning*** this version of netrw needs vim 7.3.465 or later"
Bram Moolenaar5c736222010-01-06 20:54:52 +010029 echohl Normal
30 finish
31endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000032if !exists("s:NOTE")
33 let s:NOTE = 0
34 let s:WARNING = 1
35 let s:ERROR = 2
36endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000037
Bram Moolenaar1afcace2005-11-25 19:54:28 +000038let s:keepcpo= &cpo
Bram Moolenaar5b435d62012-04-05 17:33:26 +020039set cpo&vim
Bram Moolenaar9964e462007-05-05 17:54:07 +000040"DechoTabOn
41"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000043" ======================
44" Netrw Variables: {{{1
45" ======================
46
Bram Moolenaar071d4272004-06-13 20:20:40 +000047" ---------------------------------------------------------------------
Bram Moolenaar5b435d62012-04-05 17:33:26 +020048" netrw#ErrorMsg: {{{2
49" 0=note = s:NOTE
50" 1=warning = s:WARNING
51" 2=error = s:ERROR
Bram Moolenaare6ae6222013-05-21 21:01:10 +020052" May 01, 2013 : max errnum currently is 93
Bram Moolenaar5b435d62012-04-05 17:33:26 +020053fun! netrw#ErrorMsg(level,msg,errnum)
54" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
55
56 if a:level < g:netrw_errorlvl
Bram Moolenaare6ae6222013-05-21 21:01:10 +020057" call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl)
Bram Moolenaar5b435d62012-04-05 17:33:26 +020058 return
59 endif
60
61 if a:level == 1
62 let level= "**warning** (netrw) "
63 elseif a:level == 2
64 let level= "**error** (netrw) "
65 else
66 let level= "**note** (netrw) "
67 endif
68" call Decho("level=".level)
69
70 if g:netrw_use_errorwindow
71 " (default) netrw creates a one-line window to show error/warning
72 " messages (reliably displayed)
73
74 " record current window number for NetrwRestorePosn()'s benefit
75 let s:winBeforeErr= winnr()
76" call Decho("s:winBeforeErr=".s:winBeforeErr)
77
78 " getting messages out reliably is just plain difficult!
79 " This attempt splits the current window, creating a one line window.
80 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
81" call Decho("write to NetrwMessage buffer")
82 exe bufwinnr("NetrwMessage")."wincmd w"
83" call Decho("setl ma noro")
84 setl ma noro
85 keepj call setline(line("$")+1,level.a:msg)
86 keepj $
87 else
88" call Decho("create a NetrwMessage buffer window")
89 bo 1split
90 sil! call s:NetrwEnew()
91 sil! keepj call s:NetrwSafeOptions()
92 setl bt=nofile
93 keepj file NetrwMessage
Bram Moolenaarff034192013-04-24 18:51:19 +020094" call Decho("setl ma noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +020095 setl ma noro
96 call setline(line("$"),level.a:msg)
97 endif
98" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
99 if &fo !~ '[ta]'
100 syn clear
101 syn match netrwMesgNote "^\*\*note\*\*"
102 syn match netrwMesgWarning "^\*\*warning\*\*"
103 syn match netrwMesgError "^\*\*error\*\*"
104 hi link netrwMesgWarning WarningMsg
105 hi link netrwMesgError Error
106 endif
107" call Decho("(ErrorMsg) setl noma ro bh=wipe")
108 setl noma ro bh=wipe
109
110 else
111 " (optional) netrw will show messages using echomsg. Even if the
112 " message doesn't appear, at least it'll be recallable via :messages
113" redraw!
114 if a:level == s:WARNING
115 echohl WarningMsg
116 elseif a:level == s:ERROR
117 echohl Error
118 endif
119 echomsg level.a:msg
120" call Decho("echomsg ***netrw*** ".a:msg)
121 echohl None
122 endif
123
124" call Dret("netrw#ErrorMsg")
125endfun
126
127" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +0100128" NetrwInit: initializes variables if they haven't been defined {{{2
129" Loosely, varname = value.
130fun s:NetrwInit(varname,value)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200131" call Decho("varname<".a:varname."> value=".a:value)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100132 if !exists(a:varname)
133 if type(a:value) == 0
134 exe "let ".a:varname."=".a:value
Bram Moolenaarff034192013-04-24 18:51:19 +0200135 elseif type(a:value) == 1 && a:value =~ '^[{[]'
136 exe "let ".a:varname."=".a:value
Bram Moolenaar5c736222010-01-06 20:54:52 +0100137 elseif type(a:value) == 1
138 exe "let ".a:varname."="."'".a:value."'"
139 else
140 exe "let ".a:varname."=".a:value
141 endif
142 endif
143endfun
144
145" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +0000146" Netrw Constants: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100147call s:NetrwInit("g:netrw_dirhist_cnt",0)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000148if !exists("s:LONGLIST")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100149 call s:NetrwInit("s:THINLIST",0)
150 call s:NetrwInit("s:LONGLIST",1)
151 call s:NetrwInit("s:WIDELIST",2)
152 call s:NetrwInit("s:TREELIST",3)
153 call s:NetrwInit("s:MAXLIST" ,4)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000154endif
155
156" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000157" Default values for netrw's global protocol variables {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +0200158call s:NetrwInit("g:netrw_use_errorwindow",1)
159
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000160if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100161 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000162 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100163 elseif executable("curl")
164 let g:netrw_dav_cmd = "curl"
165 else
166 let g:netrw_dav_cmd = ""
167 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000169if !exists("g:netrw_fetch_cmd")
170 if executable("fetch")
171 let g:netrw_fetch_cmd = "fetch -o"
172 else
173 let g:netrw_fetch_cmd = ""
174 endif
175endif
176if !exists("g:netrw_ftp_cmd")
177 let g:netrw_ftp_cmd = "ftp"
178endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200179let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200180if !exists("g:netrw_ftp_options")
181 let g:netrw_ftp_options= "-i -n"
182endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000183if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000184 if executable("elinks")
185 let g:netrw_http_cmd = "elinks"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100186 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000187 elseif executable("links")
188 let g:netrw_http_cmd = "links"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100189 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000190 elseif executable("curl")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100191 let g:netrw_http_cmd = "curl"
192 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000193 elseif executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100194 let g:netrw_http_cmd = "wget"
195 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000196 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100197 let g:netrw_http_cmd = "fetch"
198 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000199 else
200 let g:netrw_http_cmd = ""
201 endif
202endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100203call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
204call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200205if !exists("g:netrw_scp_cmd")
206 if executable("scp")
207 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
208 elseif executable("pscp")
209 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk')
210 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk')
211 else
212 call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q')
213 endif
214 else
215 call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
216 endif
217endif
218
Bram Moolenaar5c736222010-01-06 20:54:52 +0100219call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
220call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000221
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000222if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000223 \ && exists("g:netrw_use_nt_rcp")
224 \ && g:netrw_use_nt_rcp
225 \ && executable( $SystemRoot .'/system32/rcp.exe')
226 let s:netrw_has_nt_rcp = 1
227 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000228else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000229 let s:netrw_has_nt_rcp = 0
230 let s:netrw_rcpmode = ''
231endif
232
233" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000234" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000235" Cygwin Detection ------- {{{3
236if !exists("g:netrw_cygwin")
237 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100238 if has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000239 let g:netrw_cygwin= 1
240 else
241 let g:netrw_cygwin= 0
242 endif
243 else
244 let g:netrw_cygwin= 0
245 endif
246endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000247" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100248call s:NetrwInit("g:netrw_alto" , &sb)
249call s:NetrwInit("g:netrw_altv" , &spr)
250call s:NetrwInit("g:netrw_banner" , 1)
251call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200252call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100253call s:NetrwInit("g:netrw_chgwin" , -1)
254call s:NetrwInit("g:netrw_compress" , "gzip")
255call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200256if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
257 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
258 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000259endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200260call s:NetrwInit("g:netrw_cursor" , 2)
261let s:netrw_usercul = &cursorline
262let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar446cb832008-06-24 21:56:24 +0000263" Default values - d-g ---------- {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +0200264call s:NetrwInit("s:didstarstar",0)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100265call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200266call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100267call s:NetrwInit("g:netrw_dirhistmax" , 10)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200268call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100269call s:NetrwInit("g:netrw_fastbrowse" , 1)
270call 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 +0000271if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000272 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
273 let g:netrw_ftp_list_cmd = "ls -lF"
274 let g:netrw_ftp_timelist_cmd = "ls -tlF"
275 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000276 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000277 let g:netrw_ftp_list_cmd = "dir"
278 let g:netrw_ftp_timelist_cmd = "dir"
279 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000280 endif
281endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100282call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000283" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100284call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000285if !exists("g:netrw_ignorenetrc")
286 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
287 let g:netrw_ignorenetrc= 1
288 else
289 let g:netrw_ignorenetrc= 0
290 endif
291endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100292call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000293if !exists("g:netrw_list_cmd")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200294
Bram Moolenaar9964e462007-05-05 17:54:07 +0000295 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000296 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200297 " provide a pscp-based listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000298 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
299 endif
300 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200301
Bram Moolenaar9964e462007-05-05 17:54:07 +0000302 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200303 " provide a scp-based default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000304 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200305
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000306 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000307" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000308 let g:netrw_list_cmd= ""
309 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200310
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000311endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100312call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000313" Default values - lh-lz ---------- {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200314if exists("g:netrw_local_copycmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200315 let g:netrw_localcopycmd= g:netrw_local_copycmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200316 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
317endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100318if !exists("g:netrw_localcmdshell")
319 let g:netrw_localcmdshell= ""
320endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000321if !exists("g:netrw_localcopycmd")
322 if has("win32") || has("win95") || has("win64") || has("win16")
323 if g:netrw_cygwin
324 let g:netrw_localcopycmd= "cp"
325 else
Bram Moolenaar97d62492012-11-15 21:28:22 +0100326 let g:netrw_localcopycmd= "cmd /c copy"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000327 endif
328 elseif has("unix") || has("macunix")
329 let g:netrw_localcopycmd= "cp"
330 else
331 let g:netrw_localcopycmd= ""
332 endif
333endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200334if exists("g:netrw_local_mkdir")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100335 let g:netrw_localmkdir= g:netrw_local_mkdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200336 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
337endif
338call s:NetrwInit("g:netrw_localmkdir","mkdir")
Bram Moolenaar15146672011-10-20 22:22:38 +0200339call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200340if exists("g:netrw_local_movecmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200341 let g:netrw_localmovecmd= g:netrw_local_movecmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200342 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
343endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000344if !exists("g:netrw_localmovecmd")
345 if has("win32") || has("win95") || has("win64") || has("win16")
346 if g:netrw_cygwin
347 let g:netrw_localmovecmd= "mv"
348 else
Bram Moolenaar97d62492012-11-15 21:28:22 +0100349 let g:netrw_localmovecmd= "cmd /c move"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000350 endif
351 elseif has("unix") || has("macunix")
352 let g:netrw_localmovecmd= "mv"
353 else
354 let g:netrw_localmovecmd= ""
355 endif
356endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200357call s:NetrwInit("g:netrw_localrmdir", "rmdir")
358if exists("g:netrw_local_rmdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200359 let g:netrw_localrmdir= g:netrw_local_rmdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200360 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
361endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100362call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
363" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000364if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000365 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000366endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000367if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000368 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
369endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000370" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100371call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
372call s:NetrwInit("g:netrw_maxfilenamelen", 32)
373call s:NetrwInit("g:netrw_menu" , 1)
374call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200375call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~ '[anh]'))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100376call s:NetrwInit("g:netrw_retmap" , 0)
377if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
378 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
379elseif has("win32") || has("win95") || has("win64") || has("win16")
380 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
381else
382 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000383endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100384call s:NetrwInit("g:netrw_preview" , 0)
385call s:NetrwInit("g:netrw_scpport" , "-P")
386call s:NetrwInit("g:netrw_sshport" , "-p")
387call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
388call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
389call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
390call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000391" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100392" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
393call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200394call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100395call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
396call s:NetrwInit("g:netrw_sort_options" , "")
397call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000398if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100399 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200400 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100401 else
402 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000403 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000404endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100405call s:NetrwInit("g:netrw_special_syntax" , 0)
406call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
407call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000408" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100409call s:NetrwInit("g:netrw_timefmt","%c")
Bram Moolenaarff034192013-04-24 18:51:19 +0200410if !exists("g:netrw_xstrlen")
411 if exists("g:Align_xstrlen")
412 let g:netrw_xstrlen= g:Align_xstrlen
413 elseif exists("g:drawit_xstrlen")
414 let g:netrw_xstrlen= g:drawit_xstrlen
415 elseif &enc == "latin1" || !has("multi_byte")
416 let g:netrw_xstrlen= 0
417 else
418 let g:netrw_xstrlen= 1
419 endif
420endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100421call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100422call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200423call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200424if g:netrw_winsize == 0|let g:netrw_winsize= -1|endif
425if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000426" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000427" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100428call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200429if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarff034192013-04-24 18:51:19 +0200430 call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200431else
Bram Moolenaarff034192013-04-24 18:51:19 +0200432 call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200433endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200434call s:NetrwInit("g:netrw_menu_escape",'.&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100435call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
436call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000437
438" BufEnter event ignored by decho when following variable is true
439" Has a side effect that doau BufReadPost doesn't work, so
440" files read by network transfer aren't appropriately highlighted.
441"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442
Bram Moolenaaradc21822011-04-01 18:03:16 +0200443" ======================
444" Netrw Initialization: {{{1
445" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200446if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
447 let s:initbeval = &beval
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200448" let s:initbexpr = &l:bexpr
Bram Moolenaar15146672011-10-20 22:22:38 +0200449 let &l:bexpr = "netrw#NetrwBalloonHelp()"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200450 set beval
Bram Moolenaar15146672011-10-20 22:22:38 +0200451 au BufWinEnter,WinEnter * if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200452endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200453au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200454
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000455" ==============================
456" Netrw Utility Functions: {{{1
457" ==============================
458
Bram Moolenaaradc21822011-04-01 18:03:16 +0200459" ---------------------------------------------------------------------
460" netrw#NetrwBalloonHelp: {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +0200461if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200462 fun! netrw#NetrwBalloonHelp()
Bram Moolenaar15146672011-10-20 22:22:38 +0200463 if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200464 let mesg= ""
465 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
Bram Moolenaar15146672011-10-20 22:22:38 +0200466 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200467 elseif getline(v:beval_lnum) =~ '^"\s*/'
468 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
469 elseif v:beval_text == "Sorted" || v:beval_text == "by"
470 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
471 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
472 let mesg = "S: edit sorting sequence"
473 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
474 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
475 elseif v:beval_text == "Quick" || v:beval_text == "Help"
476 let mesg = "Help: press <F1>"
477 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
478 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
479 else
480 let mesg= ""
481 endif
482 return mesg
483 endfun
484endif
485
Bram Moolenaar071d4272004-06-13 20:20:40 +0000486" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200487" s:NetrwOptionSave: save options prior to setting to "netrw-buffer-standard" form {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000488" 06/08/07 : removed call to NetrwSafeOptions(), either placed
489" immediately after NetrwOptionSave() calls in NetRead
490" and NetWrite, or after the s:NetrwEnew() call in
491" NetrwBrowse.
492" vt: normally its "w:" or "s:" (a variable type)
493fun! s:NetrwOptionSave(vt)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200494" 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 +0000495" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200496
Bram Moolenaar446cb832008-06-24 21:56:24 +0000497 if !exists("{a:vt}netrw_optionsave")
498 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000499 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000500" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000501 return
502 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200503" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000504
505 " Save current settings and current directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200506" call Decho("saving current settings and current directory")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000507 let s:yykeep = @@
Bram Moolenaar15146672011-10-20 22:22:38 +0200508 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000509 let {a:vt}netrw_aikeep = &l:ai
510 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar15146672011-10-20 22:22:38 +0200511 let {a:vt}netrw_bhkeep = &l:bh
512 let {a:vt}netrw_blkeep = &l:bl
513 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200514 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaarff034192013-04-24 18:51:19 +0200515 let {a:vt}netrw_cedit = &cedit
Bram Moolenaar446cb832008-06-24 21:56:24 +0000516 let {a:vt}netrw_cikeep = &l:ci
517 let {a:vt}netrw_cinkeep = &l:cin
518 let {a:vt}netrw_cinokeep = &l:cino
519 let {a:vt}netrw_comkeep = &l:com
520 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200521 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar15146672011-10-20 22:22:38 +0200522 let {a:vt}netrw_fenkeep = &l:fen
523 let {a:vt}netrw_ffkeep = &l:ff
Bram Moolenaar446cb832008-06-24 21:56:24 +0000524 let {a:vt}netrw_fokeep = &l:fo " formatoptions
525 let {a:vt}netrw_gdkeep = &l:gd " gdefault
526 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200527 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar15146672011-10-20 22:22:38 +0200528 let {a:vt}netrw_iskkeep = &l:isk
529 let {a:vt}netrw_lskeep = &l:ls
530 let {a:vt}netrw_makeep = &l:ma
Bram Moolenaar446cb832008-06-24 21:56:24 +0000531 let {a:vt}netrw_magickeep = &l:magic
Bram Moolenaar15146672011-10-20 22:22:38 +0200532 let {a:vt}netrw_modkeep = &l:mod
533 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar446cb832008-06-24 21:56:24 +0000534 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar15146672011-10-20 22:22:38 +0200535 let {a:vt}netrw_rokeep = &l:ro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200536 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000537 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar15146672011-10-20 22:22:38 +0200538 let {a:vt}netrw_tskeep = &l:ts
Bram Moolenaar446cb832008-06-24 21:56:24 +0000539 let {a:vt}netrw_twkeep = &l:tw " textwidth
540 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar15146672011-10-20 22:22:38 +0200541 let {a:vt}netrw_wrapkeep = &l:wrap
542 let {a:vt}netrw_writekeep = &l:write
543 if g:netrw_use_noswf && has("win32") && !has("win95")
544 let {a:vt}netrw_swfkeep = &l:swf
545 endif
546
547 " save a few selected netrw-related variables
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200548" call Decho("saving a few selected netrw-related variables")
Bram Moolenaar15146672011-10-20 22:22:38 +0200549 if g:netrw_keepdir
550 let {a:vt}netrw_dirkeep = getcwd()
551 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000552 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000553 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000554 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200555 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
556 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000557
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200558" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000559endfun
560
561" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000562" s:NetrwOptionRestore: restore options {{{2
563fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200564" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000565 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar15146672011-10-20 22:22:38 +0200566 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200567" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200568 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200569" call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
570" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
571 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200572 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200573" call Decho("(NetrwOptionRestore) no previous position")
Bram Moolenaar15146672011-10-20 22:22:38 +0200574 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200575" 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 +0000576" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000577 return
578 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000579 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000580
Bram Moolenaarff034192013-04-24 18:51:19 +0200581 if exists("+acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000582 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200583" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000584 let curdir = getcwd()
585 let &l:acd = {a:vt}netrw_acdkeep
586 unlet {a:vt}netrw_acdkeep
587 if &l:acd
Bram Moolenaar15146672011-10-20 22:22:38 +0200588" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
Bram Moolenaar446cb832008-06-24 21:56:24 +0000589 try
590 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200591 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000592 endif
593 catch /^Vim\%((\a\+)\)\=:E472/
594 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
595 endtry
596 endif
597 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000598 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000599 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
600 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 +0200601 if g:netrw_liststyle != s:TREELIST
602 if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif
603 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200604 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
605 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 +0200606 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 +0200607 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 +0000608 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
609 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
610 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
611 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
612 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 +0200613 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 +0200614 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
615 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 +0000616 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
617 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
618 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 +0200619 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 +0200620 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
621 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
622 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
623 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
624 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
625 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 +0000626 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 +0200627 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 +0200628 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 +0000629 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100630 " Problem: start with liststyle=0; press <i> : result, following line resets l:ts.
631" 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 +0000632 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
633 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 +0200634 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
635 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 +0000636 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
637 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000638 if &directory == ""
639 " user hasn't specified a swapfile directory;
640 " netrw will temporarily set the swapfile directory
641 " to the current directory as returned by getcwd().
642 let &l:directory = getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200643 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaarff034192013-04-24 18:51:19 +0200644 setl directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000645 unlet {a:vt}netrw_swfkeep
646 elseif &l:swf != {a:vt}netrw_swfkeep
647 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200648 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000649 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000650 endif
651 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200652 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
653 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
654 if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
655 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200656 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
657 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 +0200658 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200659" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200660 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200661" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
662 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200663 else
664" call Decho("no previous position")
665 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000666
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200667" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaarff034192013-04-24 18:51:19 +0200668" call Decho("(NetrwOptionRestore) fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200669" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
670" 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 +0100671" call Decho("(NetrwOptionRestore) ts=".&l:ts)
Bram Moolenaarff034192013-04-24 18:51:19 +0200672 " Moved the filetype detect here from NetrwGetFile() because remote files
673 " were having their filetype detect-generated settings overwritten by
674 " NetrwOptionRestore.
675 if &ft != "netrw"
676" call Decho("(NetrwOptionRestore) filetype detect (ft=".&ft.")")
677 filetype detect
678 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200679" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000680endfun
681
682" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000683" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +0200684" Use s:NetrwSaveOptions() to save user settings
685" Use s:NetrwOptionRestore() to restore user settings
Bram Moolenaar9964e462007-05-05 17:54:07 +0000686fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100687" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
688" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaarff034192013-04-24 18:51:19 +0200689 if exists("+acd") | setl noacd | endif
690 setl noai
691 setl noaw
692 setl nobomb
693 setl noci
694 setl nocin
695 if g:netrw_liststyle == s:TREELIST
696 setl bh=hide
697 endif
698 setl cino=
699 setl com=
700 setl cpo-=a
701 setl cpo-=A
702 setl fo=nroql2
703 setl nohid
704 setl noim
705 setl isk+=@ isk+=* isk+=/
706 setl magic
707 setl report=10000
708 setl sel=inclusive
709 setl nospell
710 setl tw=0
711 setl wig=
712 set cedit&
Bram Moolenaar9964e462007-05-05 17:54:07 +0000713 if g:netrw_use_noswf && has("win32") && !has("win95")
Bram Moolenaarff034192013-04-24 18:51:19 +0200714 setl noswf
Bram Moolenaar9964e462007-05-05 17:54:07 +0000715 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200716 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100717
718 " allow the user to override safe options
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200719" call Decho("ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100720 if &ft == "netrw"
Bram Moolenaarff034192013-04-24 18:51:19 +0200721" call Decho("do any netrw FileType autocmds (doau FileType netrw)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200722 sil! keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100723 endif
724
Bram Moolenaarff034192013-04-24 18:51:19 +0200725" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000726" call Dret("s:NetrwSafeOptions")
727endfun
728
Bram Moolenaar446cb832008-06-24 21:56:24 +0000729" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200730" netrw#Explore: launch the local browser in the directory of the current file {{{2
731" indx: == -1: Nexplore
732" == -2: Pexplore
733" == +: this is overloaded:
734" * If Nexplore/Pexplore is in use, then this refers to the
735" indx'th item in the w:netrw_explore_list[] of items which
736" matched the */pattern **/pattern *//pattern **//pattern
737" * If Hexplore or Vexplore, then this will override
738" g:netrw_winsize to specify the qty of rows or columns the
739" newly split window should have.
740" dosplit==0: the window will be split iff the current file has been modified
741" dosplit==1: the window will be split before running the local browser
742" style == 0: Explore style == 1: Explore!
743" == 2: Hexplore style == 3: Hexplore!
744" == 4: Vexplore style == 5: Vexplore!
745" == 6: Texplore
746fun! netrw#Explore(indx,dosplit,style,...)
747" 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("%"))
748 if !exists("b:netrw_curdir")
749 let b:netrw_curdir= getcwd()
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200750 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
751 let b:netrw_curdir= substitute(b:netrw_curdir,'\','/','g')
752 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200753" call Decho("(Explore) set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
754 endif
755 let curdir = simplify(b:netrw_curdir)
756 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200757 if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
758 let curdir= substitute(curdir,'\','/','g')
759 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200760" call Decho("(Explore) curdir<".curdir."> curfiledir<".curfiledir.">")
761
762 " save registers
763 sil! let keepregstar = @*
764 sil! let keepregplus = @+
765 sil! let keepregslash= @/
766
767 " if dosplit or file has been modified
768 if a:dosplit || &modified || a:style == 6
769" call Decho("(Explore) case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified")
770 call s:SaveWinVars()
771 let winsz= g:netrw_winsize
772 if a:indx > 0
773 let winsz= a:indx
774 endif
775
776 if a:style == 0 " Explore, Sexplore
777" call Decho("(Explore) style=0: Explore or Sexplore")
778 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
779 exe winsz."wincmd s"
780
781 elseif a:style == 1 "Explore!, Sexplore!
782" call Decho("(Explore) style=1: Explore! or Sexplore!")
783 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
784 exe "keepalt ".winsz."wincmd v"
785
786 elseif a:style == 2 " Hexplore
787" call Decho("(Explore) style=2: Hexplore")
788 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
789 exe "keepalt bel ".winsz."wincmd s"
790
791 elseif a:style == 3 " Hexplore!
792" call Decho("(Explore) style=3: Hexplore!")
793 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
794 exe "keepalt abo ".winsz."wincmd s"
795
796 elseif a:style == 4 " Vexplore
797" call Decho("(Explore) style=4: Vexplore")
798 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
799 exe "keepalt lefta ".winsz."wincmd v"
800
801 elseif a:style == 5 " Vexplore!
802" call Decho("(Explore) style=5: Vexplore!")
803 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
804 exe "keepalt rightb ".winsz."wincmd v"
805
806 elseif a:style == 6 " Texplore
807 call s:SaveBufVars()
808" call Decho("(Explore) style = 6: Texplore")
809 exe "keepalt tabnew ".fnameescape(curdir)
810 call s:RestoreBufVars()
811 endif
812 call s:RestoreWinVars()
813" else " Decho
814" call Decho("(Explore) case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6")
815 endif
816 keepj norm! 0
817
818 if a:0 > 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200819" call Decho("(Explore) case [a:0=".a:0."] > 0: a:1<".a:1.">")
Bram Moolenaarff034192013-04-24 18:51:19 +0200820 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
821" call Decho("(Explore) ..case a:1<".a:1.">: starts with ~ and unix or cygwin")
822 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
823" call Decho("(Explore) ..using dirname<".dirname."> (case: ~ && unix||cygwin)")
824 elseif a:1 == '.'
825" call Decho("(Explore) ..case a:1<".a:1.">: matches .")
826 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
827 if dirname !~ '/$'
828 let dirname= dirname."/"
829 endif
830" call Decho("(Explore) ..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
831 elseif a:1 =~ '\$'
832" call Decho("(Explore) ..case a:1<".a:1.">: matches ending $")
833 let dirname= simplify(expand(a:1))
834" call Decho("(Explore) ..using user-specified dirname<".dirname."> with $env-var")
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200835 elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://'
Bram Moolenaarff034192013-04-24 18:51:19 +0200836" call Decho("(Explore) ..case a:1<".a:1.">: other, not pattern or filepattern")
837 let dirname= simplify(a:1)
838" call Decho("(Explore) ..using user-specified dirname<".dirname.">")
839 else
840" call Decho("(Explore) ..case a:1: pattern or filepattern")
841 let dirname= a:1
842 endif
843 else
844 " clear explore
845" call Decho("(Explore) case a:0=".a:0.": clearing Explore list")
846 call s:NetrwClearExplore()
847" call Dret("netrw#Explore : cleared list")
848 return
849 endif
850
851" call Decho("(Explore) dirname<".dirname.">")
852 if dirname =~ '\.\./\=$'
853 let dirname= simplify(fnamemodify(dirname,':p:h'))
854 elseif dirname =~ '\.\.' || dirname == '.'
855 let dirname= simplify(fnamemodify(dirname,':p'))
856 endif
857" call Decho("(Explore) dirname<".dirname."> (after simplify)")
858
859 if dirname =~ '^\*//'
860 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200861" call Decho("(Explore) case starpat=1: Explore *//pattern")
Bram Moolenaarff034192013-04-24 18:51:19 +0200862 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
863 let starpat= 1
864" call Decho("(Explore) ..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
865 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
866
867 elseif dirname =~ '^\*\*//'
868 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200869" call Decho("(Explore) case starpat=2: Explore **//pattern")
Bram Moolenaarff034192013-04-24 18:51:19 +0200870 let pattern= substitute(dirname,'^\*\*//','','')
871 let starpat= 2
872" call Decho("(Explore) ..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
873
874 elseif dirname =~ '/\*\*/'
875 " handle .../**/.../filepat
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200876" call Decho("(Explore) case starpat=4: Explore .../**/.../filepat")
Bram Moolenaarff034192013-04-24 18:51:19 +0200877 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
878 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
879 let b:netrw_curdir = prefixdir
880 else
881 let b:netrw_curdir= getcwd().'/'.prefixdir
882 endif
883 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
884 let starpat= 4
885" call Decho("(Explore) ..pwd<".getcwd()."> dirname<".dirname.">")
886" call Decho("(Explore) ..case Explore ../**/../filepat (starpat=".starpat.")")
887
888 elseif dirname =~ '^\*/'
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200889 " case starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaarff034192013-04-24 18:51:19 +0200890 let starpat= 3
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200891" call Decho("(Explore) case starpat=3: Explore */filepat (starpat=".starpat.")")
Bram Moolenaarff034192013-04-24 18:51:19 +0200892
893 elseif dirname=~ '^\*\*/'
894 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
895 let starpat= 4
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200896" call Decho("(Explore) case starpat=4: Explore **/filepat (starpat=".starpat.")")
Bram Moolenaarff034192013-04-24 18:51:19 +0200897
898 else
899 let starpat= 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200900" call Decho("(Explore) case starpat=0: default")
Bram Moolenaarff034192013-04-24 18:51:19 +0200901 endif
902
903 if starpat == 0 && a:indx >= 0
904 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200905" call Decho("(Explore) case starpat==0 && a:indx=".a:indx.": dirname<".dirname.">, handles Explore Hexplore Vexplore Sexplore")
Bram Moolenaarff034192013-04-24 18:51:19 +0200906 if dirname == ""
907 let dirname= curfiledir
908" call Decho("(Explore) ..empty dirname, using current file's directory<".dirname.">")
909 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200910 if dirname =~ '^scp://' || dirname =~ '^ftp://'
911 call netrw#Nread(2,dirname)
912 "call s:NetrwBrowse(0,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200913 else
Bram Moolenaare6ae6222013-05-21 21:01:10 +0200914 if dirname == ""
915 let dirname= getcwd()
916 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
917 if dirname !~ '^[a-zA-Z]:'
918 let dirname= b:netrw_curdir."/".dirname
919 endif
920 elseif dirname !~ '^/'
921 let dirname= b:netrw_curdir."/".dirname
922 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200923" call Decho("(Explore) ..calling LocalBrowseCheck(dirname<".dirname.">)")
924 call netrw#LocalBrowseCheck(dirname)
925" call Decho("(Explore) win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
926 endif
927 if exists("w:netrw_bannercnt")
928 " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
929 " If one wants to return the same place in the netrw window, use :Rex instead.
930 exe w:netrw_bannercnt
931 endif
932
933" call Decho("(Explore) curdir<".curdir.">")
934 " ---------------------------------------------------------------------
935 " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest
936" if has("win32") || has("win95") || has("win64") || has("win16")
937" keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
938" else
939" keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
940" endif
941 " ---------------------------------------------------------------------
942
943 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
944 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
945 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
946 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
947 elseif a:indx <= 0
948 " Nexplore, Pexplore, Explore: handle starpat
949" call Decho("(Explore) case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx)
950 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
951" call Decho("(Explore) ..set up <s-up> and <s-down> maps")
952 let s:didstarstar= 1
953 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
954 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
955 endif
956
957 if has("path_extra")
958" call Decho("(Explore) ..starpat=".starpat.": has +path_extra")
959 if !exists("w:netrw_explore_indx")
960 let w:netrw_explore_indx= 0
961 endif
962
963 let indx = a:indx
964" call Decho("(Explore) ..starpat=".starpat.": set indx= [a:indx=".indx."]")
965
966 if indx == -1
967 " Nexplore
968" call Decho("(Explore) ..case Nexplore with starpat=".starpat.": (indx=".indx.")")
969 if !exists("w:netrw_explore_list") " sanity check
970 keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
971 sil! let @* = keepregstar
972 sil! let @+ = keepregstar
973 sil! let @/ = keepregslash
974" call Dret("netrw#Explore")
975 return
976 endif
977 let indx= w:netrw_explore_indx
978 if indx < 0 | let indx= 0 | endif
979 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
980 let curfile= w:netrw_explore_list[indx]
981" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
982 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
983 let indx= indx + 1
984" call Decho("(Explore) ....indx=".indx." (Nexplore while loop)")
985 endwhile
986 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
987" call Decho("(Explore) ....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
988
989 elseif indx == -2
990 " Pexplore
991" call Decho("(Explore) case Pexplore with starpat=".starpat.": (indx=".indx.")")
992 if !exists("w:netrw_explore_list") " sanity check
993 keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
994 sil! let @* = keepregstar
995 sil! let @+ = keepregstar
996 sil! let @/ = keepregslash
997" call Dret("netrw#Explore")
998 return
999 endif
1000 let indx= w:netrw_explore_indx
1001 if indx < 0 | let indx= 0 | endif
1002 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
1003 let curfile= w:netrw_explore_list[indx]
1004" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
1005 while indx >= 0 && curfile == w:netrw_explore_list[indx]
1006 let indx= indx - 1
1007" call Decho("(Explore) ....indx=".indx." (Pexplore while loop)")
1008 endwhile
1009 if indx < 0 | let indx= 0 | endif
1010" call Decho("(Explore) ....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
1011
1012 else
1013 " Explore -- initialize
1014 " build list of files to Explore with Nexplore/Pexplore
1015" call Decho("(Explore) ..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
1016 keepj keepalt call s:NetrwClearExplore()
1017 let w:netrw_explore_indx= 0
1018 if !exists("b:netrw_curdir")
1019 let b:netrw_curdir= getcwd()
1020 endif
1021" call Decho("(Explore) ....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
1022
1023 " switch on starpat to build the w:netrw_explore_list of files
1024 if starpat == 1
1025 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
1026" call Decho("(Explore) ..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls)
1027" call Decho("(Explore) ....pattern<".pattern.">")
1028 try
1029 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
1030 catch /^Vim\%((\a\+)\)\=:E480/
1031 keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
1032" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
1033 return
1034 endtry
1035 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
1036 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1037
1038 elseif starpat == 2
1039 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
1040" call Decho("(Explore) ..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)")
1041" call Decho("(Explore) ....pattern<".pattern.">")
1042 try
1043 exe "sil keepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
1044 catch /^Vim\%((\a\+)\)\=:E480/
1045 keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
1046 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1047 sil! let @* = keepregstar
1048 sil! let @+ = keepregstar
1049 sil! let @/ = keepregslash
1050" call Dret("netrw#Explore : no files matched pattern")
1051 return
1052 endtry
1053 let s:netrw_curdir = b:netrw_curdir
1054 let w:netrw_explore_list = getqflist()
1055 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
1056 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1057
1058 elseif starpat == 3
1059 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
1060" call Decho("(Explore) ..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls)
1061 let filepat= substitute(dirname,'^\*/','','')
1062 let filepat= substitute(filepat,'^[%#<]','\\&','')
1063" call Decho("(Explore) ....b:netrw_curdir<".b:netrw_curdir.">")
1064" call Decho("(Explore) ....filepat<".filepat.">")
1065 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
1066 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
1067
1068 elseif starpat == 4
1069 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
1070" call Decho("(Explore) ..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls)
1071 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
1072 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
1073 endif " switch on starpat to build w:netrw_explore_list
1074
1075 let w:netrw_explore_listlen = len(w:netrw_explore_list)
1076" call Decho("(Explore) ....w:netrw_explore_list<".string(w:netrw_explore_list).">")
1077" call Decho("(Explore) ....w:netrw_explore_listlen=".w:netrw_explore_listlen)
1078
1079 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
1080 keepalt keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
1081 sil! let @* = keepregstar
1082 sil! let @+ = keepregstar
1083 sil! let @/ = keepregslash
1084" call Dret("netrw#Explore : no files matched")
1085 return
1086 endif
1087 endif " if indx ... endif
1088
1089 " NetrwStatusLine support - for exploring support
1090 let w:netrw_explore_indx= indx
1091" call Decho("(Explore) ....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
1092
1093 " wrap the indx around, but issue a note
1094 if indx >= w:netrw_explore_listlen || indx < 0
1095" call Decho("(Explore) ....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
1096 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
1097 let w:netrw_explore_indx= indx
1098 keepalt keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
1099 endif
1100
1101 exe "let dirfile= w:netrw_explore_list[".indx."]"
1102" call Decho("(Explore) ....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
1103 let newdir= substitute(dirfile,'/[^/]*$','','e')
1104" call Decho("(Explore) ....newdir<".newdir.">")
1105
1106" call Decho("(Explore) ....calling LocalBrowseCheck(newdir<".newdir.">)")
1107 call netrw#LocalBrowseCheck(newdir)
1108 if !exists("w:netrw_liststyle")
1109 let w:netrw_liststyle= g:netrw_liststyle
1110 endif
1111 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
1112 keepalt keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
1113 else
1114 keepalt keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
1115 endif
1116 let w:netrw_explore_mtchcnt = indx + 1
1117 let w:netrw_explore_bufnr = bufnr("%")
1118 let w:netrw_explore_line = line(".")
1119 keepalt keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
1120" call Decho("(Explore) ....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
1121
1122 else
1123" call Decho("(Explore) ..your vim does not have +path_extra")
1124 if !exists("g:netrw_quiet")
1125 keepalt keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
1126 endif
1127 sil! let @* = keepregstar
1128 sil! let @+ = keepregstar
1129 sil! let @/ = keepregslash
1130" call Dret("netrw#Explore : missing +path_extra")
1131 return
1132 endif
1133
1134 else
1135" call Decho("(Explore) ..default case: Explore newdir<".dirname.">")
1136 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
1137 sil! unlet w:netrw_treedict
1138 sil! unlet w:netrw_treetop
1139 endif
1140 let newdir= dirname
1141 if !exists("b:netrw_curdir")
1142 keepj call netrw#LocalBrowseCheck(getcwd())
1143 else
1144 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
1145 endif
1146 endif
1147
1148 " visual display of **/ **// */ Exploration files
1149" call Decho("(Explore) w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
1150" call Decho("(Explore) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
1151 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
1152" call Decho("(Explore) s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
1153 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
1154 " only update match list if current directory isn't the same as before
1155" call Decho("(Explore) only update match list if current directory not the same as before")
1156 let s:explore_prvdir = b:netrw_curdir
1157 let s:explore_match = ""
1158 let dirlen = s:Strlen(b:netrw_curdir)
1159 if b:netrw_curdir !~ '/$'
1160 let dirlen= dirlen + 1
1161 endif
1162 let prvfname= ""
1163 for fname in w:netrw_explore_list
1164" call Decho("(Explore) fname<".fname.">")
1165 if fname =~ '^'.b:netrw_curdir
1166 if s:explore_match == ""
1167 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1168 else
1169 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1170 endif
1171 elseif fname !~ '^/' && fname != prvfname
1172 if s:explore_match == ""
1173 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
1174 else
1175 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
1176 endif
1177 endif
1178 let prvfname= fname
1179 endfor
1180" call Decho("(Explore) explore_match<".s:explore_match.">")
1181 exe "2match netrwMarkFile /".s:explore_match."/"
1182 endif
1183 echo "<s-up>==Pexplore <s-down>==Nexplore"
1184 else
1185 2match none
1186 if exists("s:explore_match") | unlet s:explore_match | endif
1187 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
1188 echo " "
1189" call Decho("(Explore) cleared explore match list")
1190 endif
1191
1192 sil! let @* = keepregstar
1193 sil! let @+ = keepregstar
1194 sil! let @/ = keepregslash
1195" call Dret("netrw#Explore : @/<".@/.">")
1196endfun
1197
1198" ---------------------------------------------------------------------
1199" netrw#NetrwMakeTgt: make a target out of the directory name provided {{{2
1200fun! netrw#NetrwMakeTgt(dname)
1201" call Dfunc("netrw#NetrwMakeTgt(dname<".a:dname.">)")
1202 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
1203 let svpos = netrw#NetrwSavePosn()
1204 let s:netrwmftgt_islocal= (a:dname !~ '^\a\+://')
1205" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal)
1206 if s:netrwmftgt_islocal
1207 let netrwmftgt= simplify(a:dname)
1208 else
1209 let netrwmftgt= a:dname
1210 endif
1211 if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
1212 " re-selected target, so just clear it
1213 unlet s:netrwmftgt s:netrwmftgt_islocal
1214 else
1215 let s:netrwmftgt= netrwmftgt
1216 endif
1217 if g:netrw_fastbrowse <= 1
1218 call s:NetrwRefresh((b:netrw_curdir !~ '\a\+://'),b:netrw_curdir)
1219 endif
1220 call netrw#NetrwRestorePosn(svpos)
1221" call Dret("netrw#NetrwMakeTgt")
1222endfun
1223
1224" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001225" netrw#NetrwClean: remove netrw {{{2
1226" supports :NetrwClean -- remove netrw from first directory on runtimepath
1227" :NetrwClean! -- remove netrw from all directories on runtimepath
1228fun! netrw#NetrwClean(sys)
1229" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
1230
1231 if a:sys
1232 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
1233 else
1234 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
1235 endif
1236" call Decho("choice=".choice)
1237 let diddel= 0
1238 let diddir= ""
1239
1240 if choice == 1
1241 for dir in split(&rtp,',')
1242 if filereadable(dir."/plugin/netrwPlugin.vim")
1243" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001244 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
1245 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
1246 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
1247 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
1248 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
1249 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 +00001250 let diddir= dir
1251 let diddel= diddel + 1
1252 if !a:sys|break|endif
1253 endif
1254 endfor
1255 endif
1256
1257 echohl WarningMsg
1258 if diddel == 0
1259 echomsg "netrw is either not installed or not removable"
1260 elseif diddel == 1
1261 echomsg "removed one copy of netrw from <".diddir.">"
1262 else
1263 echomsg "removed ".diddel." copies of netrw"
1264 endif
1265 echohl None
1266
1267" call Dret("netrw#NetrwClean")
1268endfun
1269
Bram Moolenaar5c736222010-01-06 20:54:52 +01001270" ---------------------------------------------------------------------
1271" netrw#Nread: {{{2
1272fun! netrw#Nread(mode,fname)
1273" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
1274 call netrw#NetrwSavePosn()
1275 call netrw#NetRead(a:mode,a:fname)
1276 call netrw#NetrwRestorePosn()
1277" call Dret("netrw#Nread")
1278endfun
1279
Bram Moolenaar9964e462007-05-05 17:54:07 +00001280" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02001281" netrw#NetrwObtain: {{{2
1282" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
1283" islocal=0 obtain from remote source
1284" =1 obtain from local source
1285" fname : a filename or a list of filenames
1286" tgtdir : optional place where files are to go (not present, uses getcwd())
1287fun! netrw#NetrwObtain(islocal,fname,...)
1288" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
1289 " NetrwStatusLine support - for obtaining support
1290
1291 if type(a:fname) == 1
1292 let fnamelist= [ a:fname ]
1293 elseif type(a:fname) == 3
1294 let fnamelist= a:fname
1295 else
1296 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
1297" call Dret("netrw#NetrwObtain")
1298 return
1299 endif
1300" call Decho("fnamelist<".string(fnamelist).">")
1301 if a:0 > 0
1302 let tgtdir= a:1
1303 else
1304 let tgtdir= getcwd()
1305 endif
1306" call Decho("tgtdir<".tgtdir.">")
1307
1308 if exists("b:netrw_islocal") && b:netrw_islocal
1309 " obtain a file from local b:netrw_curdir to (local) tgtdir
1310" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
1311 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
1312 let topath= s:ComposePath(tgtdir,"")
1313 if (has("win32") || has("win95") || has("win64") || has("win16"))
1314 " transfer files one at time
1315" call Decho("transfer files one at a time")
1316 for fname in fnamelist
1317" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
1318 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1319 if v:shell_error != 0
1320 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1321" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1322 return
1323 endif
1324 endfor
1325 else
1326 " transfer files with one command
1327" call Decho("transfer files with one command")
1328 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
1329" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
1330 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1331 if v:shell_error != 0
1332 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1333" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1334 return
1335 endif
1336 endif
1337 elseif !exists("b:netrw_curdir")
1338 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
1339 else
1340 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
1341 endif
1342
1343 else
1344 " obtain files from remote b:netrw_curdir to local tgtdir
1345" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
1346 if type(a:fname) == 1
1347 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
1348 endif
1349 call s:NetrwMethod(b:netrw_curdir)
1350
1351 if b:netrw_method == 4
1352 " obtain file using scp
1353" call Decho("obtain via scp (method#4)")
1354 if exists("g:netrw_port") && g:netrw_port != ""
1355 let useport= " ".g:netrw_scpport." ".g:netrw_port
1356 else
1357 let useport= ""
1358 endif
1359 if b:netrw_fname =~ '/'
1360 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
1361 else
1362 let path= ""
1363 endif
1364 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
1365" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
1366 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
1367
1368 elseif b:netrw_method == 2
1369 " obtain file using ftp + .netrc
1370" call Decho("obtain via ftp+.netrc (method #2)")
1371 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1372 let tmpbufnr= bufnr("%")
1373 setl ff=unix
1374 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1375 keepj put =g:netrw_ftpmode
1376" call Decho("filter input: ".getline('$'))
1377 endif
1378
1379 if exists("b:netrw_fname") && b:netrw_fname != ""
1380 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1381" call Decho("filter input: ".getline('$'))
1382 endif
1383
1384 if exists("g:netrw_ftpextracmd")
1385 keepj put =g:netrw_ftpextracmd
1386" call Decho("filter input: ".getline('$'))
1387 endif
1388 for fname in fnamelist
1389 call setline(line("$")+1,'get "'.fname.'"')
1390" call Decho("filter input: ".getline('$'))
1391 endfor
1392 if exists("g:netrw_port") && g:netrw_port != ""
1393" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1394 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
1395 else
1396" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1397 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
1398 endif
1399 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1400 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1401 let debugkeep= &debug
1402 setl debug=msg
1403 call netrw#ErrorMsg(s:ERROR,getline(1),4)
1404 let &debug= debugkeep
1405 endif
1406
1407 elseif b:netrw_method == 3
1408 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
1409" call Decho("obtain via ftp+mipf (method #3)")
1410 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1411 let tmpbufnr= bufnr("%")
1412 setl ff=unix
1413
1414 if exists("g:netrw_port") && g:netrw_port != ""
1415 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
1416" call Decho("filter input: ".getline('$'))
1417 else
1418 keepj put ='open '.g:netrw_machine
1419" call Decho("filter input: ".getline('$'))
1420 endif
1421
1422 if exists("g:netrw_uid") && g:netrw_uid != ""
1423 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1424 keepj put =g:netrw_uid
1425" call Decho("filter input: ".getline('$'))
1426 if exists("s:netrw_passwd") && s:netrw_passwd != ""
1427 keepj put ='\"'.s:netrw_passwd.'\"'
1428 endif
1429" call Decho("filter input: ".getline('$'))
1430 elseif exists("s:netrw_passwd")
1431 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1432" call Decho("filter input: ".getline('$'))
1433 endif
1434 endif
1435
1436 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1437 keepj put =g:netrw_ftpmode
1438" call Decho("filter input: ".getline('$'))
1439 endif
1440
1441 if exists("b:netrw_fname") && b:netrw_fname != ""
1442 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1443" call Decho("filter input: ".getline('$'))
1444 endif
1445
1446 if exists("g:netrw_ftpextracmd")
1447 keepj put =g:netrw_ftpextracmd
1448" call Decho("filter input: ".getline('$'))
1449 endif
1450
1451 if exists("g:netrw_ftpextracmd")
1452 keepj put =g:netrw_ftpextracmd
1453" call Decho("filter input: ".getline('$'))
1454 endif
1455 for fname in fnamelist
1456 keepj call setline(line("$")+1,'get "'.fname.'"')
1457 endfor
1458" call Decho("filter input: ".getline('$'))
1459
1460 " perform ftp:
1461 " -i : turns off interactive prompting from ftp
1462 " -n unix : DON'T use <.netrc>, even though it exists
1463 " -n win32: quit being obnoxious about password
1464 keepj norm! 1Gdd
1465" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1466 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
1467 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1468 if getline(1) !~ "^$"
1469" call Decho("error<".getline(1).">")
1470 if !exists("g:netrw_quiet")
1471 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
1472 endif
1473 endif
1474 elseif !exists("b:netrw_method") || b:netrw_method < 0
1475" call Dfunc("netrw#NetrwObtain : unsupported method")
1476 return
1477 endif
1478
1479 " restore status line
1480 if type(a:fname) == 1 && exists("s:netrw_users_stl")
1481 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
1482 endif
1483
1484 endif
1485
1486 " cleanup
1487 if exists("tmpbufnr")
1488 if bufnr("%") != tmpbufnr
1489 exe tmpbufnr."bw!"
1490 else
1491 q!
1492 endif
1493 endif
1494
1495" call Dret("netrw#NetrwObtain")
1496endfun
1497
1498" ---------------------------------------------------------------------
1499" NetrwStatusLine: {{{2
1500fun! NetrwStatusLine()
1501
1502" vvv NetrwStatusLine() debugging vvv
1503" let g:stlmsg=""
1504" if !exists("w:netrw_explore_bufnr")
1505" let g:stlmsg="!X<explore_bufnr>"
1506" elseif w:netrw_explore_bufnr != bufnr("%")
1507" let g:stlmsg="explore_bufnr!=".bufnr("%")
1508" endif
1509" if !exists("w:netrw_explore_line")
1510" let g:stlmsg=" !X<explore_line>"
1511" elseif w:netrw_explore_line != line(".")
1512" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
1513" endif
1514" if !exists("w:netrw_explore_list")
1515" let g:stlmsg=" !X<explore_list>"
1516" endif
1517" ^^^ NetrwStatusLine() debugging ^^^
1518
1519 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")
1520 " restore user's status line
1521 let &stl = s:netrw_users_stl
1522 let &laststatus = s:netrw_users_ls
1523 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
1524 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
1525 return ""
1526 else
1527 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
1528 endif
1529endfun
1530
1531" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001532" Netrw Transfer Functions: {{{1
1533" ===============================
1534
Bram Moolenaar071d4272004-06-13 20:20:40 +00001535" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001536" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001537" mode: =0 read remote file and insert before current line
1538" =1 read remote file and insert after current line
1539" =2 replace with remote file
1540" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001541fun! netrw#NetRead(mode,...)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001542" 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 +00001543
Bram Moolenaar5c736222010-01-06 20:54:52 +01001544 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001545 call s:NetrwOptionSave("w:")
1546 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001547 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001548
Bram Moolenaar5c736222010-01-06 20:54:52 +01001549 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001550 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001551 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001552 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001553 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001554 elseif a:mode == 2 " replace with remote file
1555 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +00001556 elseif a:mode == 3 " skip read of file (leave as temporary)
1557 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001558 else
1559 exe a:mode
1560 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001561 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001562 let ichoice = (a:0 == 0)? 0 : 1
1563" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
1564
Bram Moolenaar5c736222010-01-06 20:54:52 +01001565 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001566 let tmpfile= s:GetTempfile("")
1567 if tmpfile == ""
1568" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001569 return
1570 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001571
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001572 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001573
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001574 " attempt to repeat with previous host-file-etc
1575 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001576" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001577 let choice = b:netrw_lastfile
1578 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001579
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001580 else
1581 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001582" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001583
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001584 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001585 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001586 echomsg 'NetRead Usage:'
1587 echomsg ':Nread machine:path uses rcp'
1588 echomsg ':Nread "machine path" uses ftp with <.netrc>'
1589 echomsg ':Nread "machine id password path" uses ftp'
1590 echomsg ':Nread dav://machine[:port]/path uses cadaver'
1591 echomsg ':Nread fetch://machine/path uses fetch'
1592 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1593 echomsg ':Nread http://[user@]machine/path uses http wget'
1594 echomsg ':Nread rcp://[user@]machine/path uses rcp'
1595 echomsg ':Nread rsync://machine[:port]/path uses rsync'
1596 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
1597 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001598 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001599 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001600
Bram Moolenaar9964e462007-05-05 17:54:07 +00001601 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001602 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001603" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001604 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001605 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +02001606 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001607 else
1608 " case "... ... ..."
1609 let choice = strpart(choice,1,strlen(choice)-1)
1610 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001611
Bram Moolenaar9964e462007-05-05 17:54:07 +00001612 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001613 let wholechoice = wholechoice . " " . choice
1614 let ichoice = ichoice + 1
1615 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001616 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001617 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001618 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001619" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001620 return
1621 endif
1622 let choice= a:{ichoice}
1623 endwhile
1624 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1625 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001626 endif
1627 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001628
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001629" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001630 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001631
Bram Moolenaar5c736222010-01-06 20:54:52 +01001632 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001633 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001634 if !exists("b:netrw_method") || b:netrw_method < 0
1635" call Dfunc("netrw#NetRead : unsupported method")
1636 return
1637 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001638 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001639
Bram Moolenaar446cb832008-06-24 21:56:24 +00001640 " Check if NetrwBrowse() should be handling this request
1641" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02001642 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001643" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001644 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001645" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001646 return
Bram Moolenaar071d4272004-06-13 20:20:40 +00001647 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001648
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001649 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001650 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001651 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001652 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1653 echo "(netrw) Processing your read request..."
1654 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001655
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001656 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001657 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001658 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001659" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +00001660 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001661 " ER: on Win2K" rcp machine[.user]:file tmpfile
1662 " ER: if machine contains '.' adding .user is required (use $USERNAME)
1663 " ER: the tmpfile is full path: rcp sees C:\... as host C
1664 if s:netrw_has_nt_rcp == 1
1665 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1666 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1667 else
1668 " Any way needed it machine contains a '.'
1669 let uid_machine = g:netrw_machine .'.'. $USERNAME
1670 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001671 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001672 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1673 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1674 else
1675 let uid_machine = g:netrw_machine
1676 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001677 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001678" 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 +01001679 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 +00001680 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001681 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001682
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001683 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001684 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001685 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001686" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +00001687 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02001688 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001689 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02001690 setl ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001691 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001692" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001693 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001694 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001695" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001696 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001697 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
1698" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001699 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001700" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1701 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 +00001702 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02001703" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1704 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001705 endif
1706 " 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 +00001707 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +00001708 let debugkeep = &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02001709 setl debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +02001710 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001711 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001712 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +00001713 call s:SaveBufVars()
1714 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01001715 if bufname("%") == "" && getline("$") == "" && line('$') == 1
1716 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +00001717 q!
1718 endif
1719 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001720 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001721 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001722
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001723 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001724 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001725 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
1726 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001727" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001728 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001729 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001730 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02001731 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001732 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001733 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001734" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001735 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001736 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001737" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001738 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001739
Bram Moolenaar97d62492012-11-15 21:28:22 +01001740 if exists("g:netrw_uid") && g:netrw_uid != ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001741 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1742 keepj put =g:netrw_uid
1743" call Decho("filter input: ".getline('.'))
1744 if exists("s:netrw_passwd")
1745 keepj put ='\"'.s:netrw_passwd.'\"'
1746 endif
1747" call Decho("filter input: ".getline('.'))
1748 elseif exists("s:netrw_passwd")
1749 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1750" call Decho("filter input: ".getline('.'))
1751 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001752 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001753
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001754 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001755 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00001756" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001757 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001758 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001759 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001760" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001761 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001762 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001763" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001764
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001765 " perform ftp:
1766 " -i : turns off interactive prompting from ftp
1767 " -n unix : DON'T use <.netrc>, even though it exists
1768 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +02001769 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001770" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1771 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001772 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1773 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001774" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001775 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001776 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001777 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001778 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001779 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
1780 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001781 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001782
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001783 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001784 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001785 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001786" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001787 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00001788 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001789 else
1790 let useport= ""
1791 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001792" 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 +00001793 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 +00001794 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001795 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001796
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001797 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001798 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001799 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001800" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001801 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001802 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001803 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001804 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001805" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001806 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001807 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001808
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001809 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
1810 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001811" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001812 if exists("g:netrw_http_xcmd")
1813" 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))
1814 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
1815 else
1816" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
1817 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
1818 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001819 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001820
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001821 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001822 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001823" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001824 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
1825 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001826" call Decho("netrw_html<".netrw_html.">")
1827" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001828" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
1829 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 +00001830 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001831" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001832 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001833 endif
1834 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001835" call Decho("(NetRead) setl ro")
1836 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001837
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001838 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001839 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001840 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001841" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001842
Bram Moolenaar5c736222010-01-06 20:54:52 +01001843 if !executable(g:netrw_dav_cmd)
1844 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
1845" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
1846 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001847 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001848 if g:netrw_dav_cmd =~ "curl"
1849" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
1850 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
1851 else
1852 " Construct execution string (four lines) which will be passed through filter
1853 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1854 new
Bram Moolenaarff034192013-04-24 18:51:19 +02001855 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001856 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001857 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01001858 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001859 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01001860 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001861 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
1862 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
1863 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001864 keepj put ='get '.netrw_fname.' '.tmpfile
1865 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001866
Bram Moolenaar5c736222010-01-06 20:54:52 +01001867 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001868 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001869" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001870 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1871 bd!
1872 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001873 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001874 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001875
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001876 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001877 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001878 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001879" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001880" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1881 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 +00001882 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001883 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001884
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001885 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001886 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001887 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001888 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +00001889" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001890 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001891 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001892 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001893 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001894" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001895 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001896 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02001897 if exists("g:netrw_option") && g:netrw_option == ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001898 let netrw_option= "http"
1899 else
1900 let netrw_option= "ftp"
1901 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001902" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001903
Bram Moolenaar446cb832008-06-24 21:56:24 +00001904 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001905" 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))
1906 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 +00001907 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00001908" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
1909 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 +00001910 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001911
Bram Moolenaar446cb832008-06-24 21:56:24 +00001912 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001913 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001914" call Decho("(NetRead) setl ro")
1915 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001916
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001917 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001918 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001919 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001920" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001921" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1922 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001923 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001924 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001925
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001926 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001927 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001928 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001929 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001930 endif
1931 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001932
Bram Moolenaar5c736222010-01-06 20:54:52 +01001933 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001934 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001935" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001936 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001937 unlet b:netrw_fname
1938 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001939 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 +00001940" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001941 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001942 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001943 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001944
Bram Moolenaar9964e462007-05-05 17:54:07 +00001945" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001946endfun
1947
1948" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001949" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001950fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00001951" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001952
Bram Moolenaar5c736222010-01-06 20:54:52 +01001953 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001954 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001955 call s:NetrwOptionSave("w:")
1956 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001957
Bram Moolenaar5c736222010-01-06 20:54:52 +01001958 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001959 let tmpfile= s:GetTempfile("")
1960 if tmpfile == ""
1961" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001962 return
1963 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001964
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001965 if a:0 == 0
1966 let ichoice = 0
1967 else
1968 let ichoice = 1
1969 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001970
Bram Moolenaar9964e462007-05-05 17:54:07 +00001971 let curbufname= expand("%")
1972" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001973 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00001974 " For binary writes, always write entire file.
1975 " (line numbers don't really make sense for that).
1976 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02001977" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1978 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001979 elseif g:netrw_cygwin
1980 " write (selected portion of) file to temporary
1981 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001982" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001983 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001984 else
1985 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02001986" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001987 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001988 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001989
Bram Moolenaar9964e462007-05-05 17:54:07 +00001990 if curbufname == ""
1991 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1992 " on the temporary file's name. Deletion of the temporary file during
1993 " cleanup then causes an error message.
1994 0file!
1995 endif
1996
Bram Moolenaar5c736222010-01-06 20:54:52 +01001997 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001998 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001999
Bram Moolenaar9964e462007-05-05 17:54:07 +00002000 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002001 " attempt to repeat with previous host-file-etc
2002 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002003" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002004 let choice = b:netrw_lastfile
2005 let ichoice= ichoice + 1
2006 else
2007 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002008
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002009 " Reconstruct Choice if choice starts with '"'
2010 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002011 echomsg 'NetWrite Usage:"'
2012 echomsg ':Nwrite machine:path uses rcp'
2013 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
2014 echomsg ':Nwrite "machine id password path" uses ftp'
2015 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
2016 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
2017 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
2018 echomsg ':Nwrite rcp://machine/path uses rcp'
2019 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
2020 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
2021 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002022 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002023 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002024
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002025 elseif match(choice,"^\"") != -1
2026 if match(choice,"\"$") != -1
2027 " case "..."
2028 let choice=strpart(choice,1,strlen(choice)-2)
2029 else
2030 " case "... ... ..."
2031 let choice = strpart(choice,1,strlen(choice)-1)
2032 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002033
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002034 while match(choice,"\"$") == -1
2035 let wholechoice= wholechoice . " " . choice
2036 let ichoice = ichoice + 1
2037 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002038 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002039 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002040 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002041" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002042 return
2043 endif
2044 let choice= a:{ichoice}
2045 endwhile
2046 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2047 endif
2048 endif
2049 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002050 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002051" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002052
Bram Moolenaar9964e462007-05-05 17:54:07 +00002053 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02002054 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002055 if !exists("b:netrw_method") || b:netrw_method < 0
2056" call Dfunc("netrw#NetWrite : unsupported method")
2057 return
2058 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002059
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002060 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01002061 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002062 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002063 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2064 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00002065" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002066 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002067
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002068 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002069 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002070 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002071" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002072 if s:netrw_has_nt_rcp == 1
2073 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2074 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2075 else
2076 let uid_machine = g:netrw_machine .'.'. $USERNAME
2077 endif
2078 else
2079 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2080 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2081 else
2082 let uid_machine = g:netrw_machine
2083 endif
2084 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00002085" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
2086 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 +00002087 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002088
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002089 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002090 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002091 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002092" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002093 let netrw_fname = b:netrw_fname
2094
2095 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2096 let bhkeep = &l:bh
2097 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002098 setl bh=hide
2099 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002100
Bram Moolenaar446cb832008-06-24 21:56:24 +00002101" call Decho("filter input window#".winnr())
Bram Moolenaarff034192013-04-24 18:51:19 +02002102 setl ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002103 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002104" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002105 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002106 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002107" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002108 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002109 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002110" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002111 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02002112" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
2113 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 +00002114 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002115" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02002116" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
2117 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002118 endif
2119 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2120 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002121 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002122 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002123 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002124 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002125 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002126
2127 " remove enew buffer (quietly)
2128 let filtbuf= bufnr("%")
2129 exe curbuf."b!"
2130 let &l:bh = bhkeep
2131 exe filtbuf."bw!"
2132
Bram Moolenaar071d4272004-06-13 20:20:40 +00002133 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002134
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002135 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002136 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002137 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002138 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00002139" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002140 let netrw_fname = b:netrw_fname
2141 let bhkeep = &l:bh
2142
2143 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2144 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002145 setl bh=hide
2146 keepalt enew
2147 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002148
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002149 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002150 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00002151" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002152 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002153 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00002154" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002155 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002156 if exists("g:netrw_uid") && g:netrw_uid != ""
2157 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2158 keepj put =g:netrw_uid
2159" call Decho("filter input: ".getline('.'))
2160 if exists("s:netrw_passwd") && s:netrw_passwd != ""
2161 keepj put ='\"'.s:netrw_passwd.'\"'
2162 endif
2163" call Decho("filter input: ".getline('.'))
2164 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
2165 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
2166" call Decho("filter input: ".getline('.'))
2167 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002168 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002169 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01002170" call Decho("filter input: ".getline('$'))
2171 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002172 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002173" call Decho("filter input: ".getline("$"))
2174 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002175 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002176" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002177 " save choice/id/password for future use
2178 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002179
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002180 " perform ftp:
2181 " -i : turns off interactive prompting from ftp
2182 " -n unix : DON'T use <.netrc>, even though it exists
2183 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002184 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002185" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
2186 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002187 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2188 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002189 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002190 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002191 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002192 let mod=1
2193 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002194
2195 " remove enew buffer (quietly)
2196 let filtbuf= bufnr("%")
2197 exe curbuf."b!"
2198 let &l:bh= bhkeep
2199 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002200
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002201 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002202 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002203 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00002204" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002205 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00002206 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002207 else
2208 let useport= ""
2209 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00002210" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2211 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 +00002212 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002213
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002214 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002215 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002216 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00002217" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002218 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002219 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002220 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002221
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002222 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002223 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002224 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002225" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002226
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002227 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01002228 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
2229 let bhkeep = &l:bh
2230
2231 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2232 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002233 setl bh=hide
2234 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002235
Bram Moolenaarff034192013-04-24 18:51:19 +02002236 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002237 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002238 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002239 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002240 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002241 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002242 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002243 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00002244 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002245 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002246
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002247 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002248 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002249" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002250 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
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!"
2257
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002258 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002259
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002260 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002261 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002262 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00002263" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002264" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2265 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 +00002266 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002267
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002268 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002269 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002270 elseif b:netrw_method == 9
Bram Moolenaar97d62492012-11-15 21:28:22 +01002271" call Decho("write via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002272 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002273 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2274 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2275 else
2276 let uid_machine = g:netrw_machine
2277 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002278
2279 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2280 let bhkeep = &l:bh
2281 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002282 setl bh=hide
2283 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002284
Bram Moolenaarff034192013-04-24 18:51:19 +02002285 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002286 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002287" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002288" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01002289 let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
2290 exe s:netrw_silentxfer."%!".sftpcmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002291 let filtbuf= bufnr("%")
2292 exe curbuf."b!"
2293 let &l:bh = bhkeep
2294 exe filtbuf."bw!"
2295 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002296
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002297 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002298 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002299 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002300 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002301 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002302 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002303 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002304
Bram Moolenaar5c736222010-01-06 20:54:52 +01002305 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002306" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002307 if s:FileReadable(tmpfile)
2308" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002309 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002310 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002311 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002312
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002313 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002314 " restore modifiability; usually equivalent to set nomod
2315 let &mod= mod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002316" 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 +02002317 elseif !exists("leavemod")
2318 " indicate that the buffer has not been modified since last written
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002319" call Decho("(NetWrite) set nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002320 set nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002321" 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 +00002322 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002323
Bram Moolenaar9964e462007-05-05 17:54:07 +00002324" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002325endfun
2326
2327" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002328" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002329" uses NetRead to get a copy of the file into a temporarily file,
2330" then sources that file,
2331" then removes that file.
2332fun! netrw#NetSource(...)
2333" call Dfunc("netrw#NetSource() a:0=".a:0)
2334 if a:0 > 0 && a:1 == '?'
2335 " give help
2336 echomsg 'NetSource Usage:'
2337 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
2338 echomsg ':Nsource fetch://machine/path uses fetch'
2339 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02002340 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002341 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
2342 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
2343 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
2344 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
2345 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002346 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002347 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002348 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002349 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002350" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002351 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002352" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
2353 exe "so ".fnameescape(s:netrw_tmpfile)
2354" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002355 call delete(s:netrw_tmpfile)
2356 unlet s:netrw_tmpfile
2357 else
2358 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
2359 endif
2360 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002361 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00002362 endif
2363" call Dret("netrw#NetSource")
2364endfun
2365
2366" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00002367" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002368" readcmd == %r : replace buffer with newly read file
2369" == 0r : read file at top of buffer
2370" == r : read file after current line
2371" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002372fun! s:NetrwGetFile(readcmd, tfile, method)
2373" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002374
2375 " readcmd=='t': simply do nothing
2376 if a:readcmd == 't'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002377" 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 +00002378" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002379 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002380 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002381
Bram Moolenaar9964e462007-05-05 17:54:07 +00002382 " get name of remote filename (ie. url and all)
2383 let rfile= bufname("%")
2384" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002385
Bram Moolenaar9964e462007-05-05 17:54:07 +00002386 if exists("*NetReadFixup")
2387 " for the use of NetReadFixup (not otherwise used internally)
2388 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002389 endif
2390
Bram Moolenaar9964e462007-05-05 17:54:07 +00002391 if a:readcmd[0] == '%'
2392 " get file into buffer
2393" call Decho("get file into buffer")
2394
2395 " rename the current buffer to the temp file (ie. tfile)
2396 if g:netrw_cygwin
2397 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
2398 else
2399 let tfile= a:tfile
2400 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002401" call Decho("exe sil! keepalt file ".fnameescape(tfile))
2402 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002403
2404 " edit temporary file (ie. read the temporary file in)
2405 if rfile =~ '\.zip$'
2406" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
2407 call zip#Browse(tfile)
2408 elseif rfile =~ '\.tar$'
2409" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
2410 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002411 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002412" call Decho("handling remote gzip-compressed tar file")
2413 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002414 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002415" call Decho("handling remote bz2-compressed tar file")
2416 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002417 elseif rfile =~ '\.tar\.xz$'
2418" call Decho("handling remote xz-compressed tar file")
2419 call tar#Browse(tfile)
2420 elseif rfile =~ '\.txz$'
2421" call Decho("handling remote xz-compressed tar file (.txz)")
2422 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002423 else
2424" call Decho("edit temporary file")
2425 e!
2426 endif
2427
2428 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002429" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002430 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002431
Bram Moolenaar97d62492012-11-15 21:28:22 +01002432 " Detect filetype of local version of remote file.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002433 " Note that isk must not include a "/" for scripts.vim
2434 " to process this detection correctly.
2435" call Decho("detect filetype of local version of remote file")
Bram Moolenaar97d62492012-11-15 21:28:22 +01002436 let iskkeep= &l:isk
2437 setl isk-=/
Bram Moolenaar97d62492012-11-15 21:28:22 +01002438 let &l:isk= iskkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00002439" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
2440 let line1 = 1
2441 let line2 = line("$")
2442
2443 elseif s:FileReadable(a:tfile)
2444 " read file after current line
2445" call Decho("read file<".a:tfile."> after current line")
2446 let curline = line(".")
2447 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002448" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002449 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002450 let line1= curline + 1
2451 let line2= line("$") - lastline + 1
2452
2453 else
2454 " not readable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002455" 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 +00002456" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002457 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002458" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002459 return
2460 endif
2461
2462 " User-provided (ie. optional) fix-it-up command
2463 if exists("*NetReadFixup")
2464" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002465 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002466" else " Decho
2467" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
2468 endif
2469
Bram Moolenaaradc21822011-04-01 18:03:16 +02002470 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00002471 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02002472 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002473 endif
2474
2475" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
2476
2477 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00002478" redraw!
2479
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002480" 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 +00002481" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002482endfun
2483
Bram Moolenaar9964e462007-05-05 17:54:07 +00002484" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002485" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01002486" Input:
2487" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
2488" Output:
2489" b:netrw_method= 1: rcp
2490" 2: ftp + <.netrc>
2491" 3: ftp + machine, id, password, and [path]filename
2492" 4: scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002493" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002494" 6: dav
2495" 7: rsync
2496" 8: fetch
2497" 9: sftp
2498" g:netrw_machine= hostname
2499" b:netrw_fname = filename
2500" g:netrw_port = optional port number (for ftp)
2501" g:netrw_choice = copy of input url (choice)
2502fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002503" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002504
Bram Moolenaar251e1912011-06-19 05:09:16 +02002505 " sanity check: choice should have at least three slashes in it
2506 if strlen(substitute(a:choice,'[^/]','','g')) < 3
2507 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
2508 let b:netrw_method = -1
2509" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
2510 return
2511 endif
2512
Bram Moolenaar5c736222010-01-06 20:54:52 +01002513 " record current g:netrw_machine, if any
2514 " curmachine used if protocol == ftp and no .netrc
2515 if exists("g:netrw_machine")
2516 let curmachine= g:netrw_machine
2517" call Decho("curmachine<".curmachine.">")
2518 else
2519 let curmachine= "N O T A HOST"
2520 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002521 if exists("g:netrw_port")
2522 let netrw_port= g:netrw_port
2523 endif
2524
2525 " insure that netrw_ftp_cmd starts off every method determination
2526 " with the current g:netrw_ftp_cmd
2527 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002528
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002529 " initialization
2530 let b:netrw_method = 0
2531 let g:netrw_machine = ""
2532 let b:netrw_fname = ""
2533 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002534 let g:netrw_choice = a:choice
2535
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002536 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002537 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00002538 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
2539 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002540 " rcpurm : rcp://[user@]host/filename Use rcp
2541 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002542 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002543 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01002544 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002545 " rsyncurm : rsync://host[:port]/path Use rsync
2546 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2547 " sftpurm : sftp://[user@]host/filename Use scp
2548 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2549 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002550" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2551" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2552" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2553 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2554 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002555 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002556 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002557 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002558 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002559 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002560 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002561 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002562
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002563" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002564 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02002565 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002566 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002567" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002568 let b:netrw_method = 1
2569 let userid = substitute(a:choice,rcpurm,'\1',"")
2570 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2571 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002572 if userid != ""
2573 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002574 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002575
Bram Moolenaaradc21822011-04-01 18:03:16 +02002576 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002577 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002578" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002579 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002580 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2581 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2582 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002583
Bram Moolenaar15146672011-10-20 22:22:38 +02002584 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002585 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002586" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002587 let b:netrw_method = 5
2588 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2589 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002590
Bram Moolenaaradc21822011-04-01 18:03:16 +02002591 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002592 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002593" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002594 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02002595 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002596 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2597 else
2598 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2599 endif
2600 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002601
Bram Moolenaaradc21822011-04-01 18:03:16 +02002602 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002603 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002604" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002605 let b:netrw_method = 7
2606 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2607 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002608
Bram Moolenaaradc21822011-04-01 18:03:16 +02002609 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002610 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002611" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002612 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002613 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2614 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2615 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002616" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002617 if userid != ""
2618 let g:netrw_uid= userid
2619 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002620
Bram Moolenaaradc21822011-04-01 18:03:16 +02002621 if curmachine != g:netrw_machine
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002622 if exists("s:netwr_hup[".g:netrw_machine."]")
2623 call NetUserPass("ftp:".g:netrw_machine)
2624 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002625 " if there's a change in hostname, require password re-entry
2626 unlet s:netrw_passwd
2627 endif
2628 if exists("netrw_port")
2629 unlet netrw_port
2630 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002631 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002632
Bram Moolenaar446cb832008-06-24 21:56:24 +00002633 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002634 let b:netrw_method = 3
2635 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002636 let host= substitute(g:netrw_machine,'\..*$','','')
2637 if exists("s:netrw_hup[host]")
2638 call NetUserPass("ftp:".host)
2639
2640 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02002641" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2642" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
2643 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
Bram Moolenaare6ae6222013-05-21 21:01:10 +02002644 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',g:netrw_machine,'')
Bram Moolenaaradc21822011-04-01 18:03:16 +02002645" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2646 endif
2647 let b:netrw_method= 2
2648 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
2649" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002650 let b:netrw_method= 2
2651 else
2652 if !exists("g:netrw_uid") || g:netrw_uid == ""
2653 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002654 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002655 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002656 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002657 endif
2658 let b:netrw_method= 3
2659 endif
2660 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002661
Bram Moolenaaradc21822011-04-01 18:03:16 +02002662 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002663 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002664" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002665 let b:netrw_method = 8
2666 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2667 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2668 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2669 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002670
Bram Moolenaaradc21822011-04-01 18:03:16 +02002671 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002672 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002673" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002674 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002675 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2676 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002677 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002678 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002679 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002680
Bram Moolenaaradc21822011-04-01 18:03:16 +02002681 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002682 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002683" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002684 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002685 let b:netrw_method = 3
2686 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2687 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002688
Bram Moolenaar9964e462007-05-05 17:54:07 +00002689 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002690 let b:netrw_method = 2
2691 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2692 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2693 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002694
Bram Moolenaaradc21822011-04-01 18:03:16 +02002695 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002696 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002697" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002698 let b:netrw_method = 9
2699 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2700 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002701
Bram Moolenaaradc21822011-04-01 18:03:16 +02002702 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002703 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002704" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002705 let b:netrw_method = 1
2706 let userid = substitute(a:choice,rcphf,'\2',"")
2707 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
2708 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002709" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2710" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2711" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2712" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002713 if userid != ""
2714 let g:netrw_uid= userid
2715 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002716
Bram Moolenaaradc21822011-04-01 18:03:16 +02002717 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002718 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002719 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002720 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002721 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002722 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002723 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002724 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00002725
Bram Moolenaar81695252004-12-29 20:58:21 +00002726 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02002727 " remove any leading [:#] from port number
2728 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2729 elseif exists("netrw_port")
2730 " retain port number as implicit for subsequent ftp operations
2731 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00002732 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002733
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002734" call Decho("a:choice <".a:choice.">")
2735" call Decho("b:netrw_method <".b:netrw_method.">")
2736" call Decho("g:netrw_machine<".g:netrw_machine.">")
2737" call Decho("g:netrw_port <".g:netrw_port.">")
2738" if exists("g:netrw_uid") "Decho
2739" call Decho("g:netrw_uid <".g:netrw_uid.">")
2740" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00002741" if exists("s:netrw_passwd") "Decho
2742" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002743" endif "Decho
2744" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002745" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002746endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002747
2748" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00002749" NetReadFixup: this sort of function is typically written by the user {{{2
2750" to handle extra junk that their system's ftp dumps
2751" into the transfer. This function is provided as an
2752" example and as a fix for a Windows 95 problem: in my
2753" experience, win95's ftp always dumped four blank lines
2754" at the end of the transfer.
2755if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
2756 fun! NetReadFixup(method, line1, line2)
2757" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002758
2759 " sanity checks -- attempt to convert inputs to integers
2760 let method = a:method + 0
2761 let line1 = a:line1 + 0
2762 let line2 = a:line2 + 0
2763 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
2764" call Dret("NetReadFixup")
2765 return
2766 endif
2767
Bram Moolenaar9964e462007-05-05 17:54:07 +00002768 if method == 3 " ftp (no <.netrc>)
2769 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002770 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002771 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01002772 call histdel("/",-1)
2773 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002774 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002775
Bram Moolenaar9964e462007-05-05 17:54:07 +00002776" call Dret("NetReadFixup")
2777 endfun
2778endif
2779
2780" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002781" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002782" Usage: :call NetUserPass() -- will prompt for userid and password
2783" :call NetUserPass("uid") -- will prompt for password
2784" :call NetUserPass("uid","password") -- sets global userid and password
2785" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
2786" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00002787fun! NetUserPass(...)
2788
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002789" call Dfunc("NetUserPass() a:0=".a:0)
2790
2791 if !exists('s:netrw_hup')
2792 let s:netrw_hup= {}
2793 endif
2794
Bram Moolenaar071d4272004-06-13 20:20:40 +00002795 if a:0 == 0
Bram Moolenaar97d62492012-11-15 21:28:22 +01002796 " case: no input arguments
2797
2798 " change host and username if not previously entered; get new password
2799 if !exists("g:netrw_machine")
2800 let g:netrw_machine= input('Enter hostname: ')
2801 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002802 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01002803 " get username (user-id) via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00002804 let g:netrw_uid= input('Enter username: ')
2805 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002806 " get password via prompting
Bram Moolenaar446cb832008-06-24 21:56:24 +00002807 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002808
2809 " set up hup database
2810 let host = substitute(g:netrw_machine,'\..*$','','')
2811 if !exists('s:netrw_hup[host]')
2812 let s:netrw_hup[host]= {}
2813 endif
2814 let s:netrw_hup[host].uid = g:netrw_uid
2815 let s:netrw_hup[host].passwd = s:netrw_passwd
2816
2817 elseif a:0 == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01002818 " case: one input argument
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002819
2820 if a:1 =~ '^ftp:'
Bram Moolenaar97d62492012-11-15 21:28:22 +01002821 " get host from ftp:... url
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002822 " access userid and password from hup (host-user-passwd) dictionary
2823 let host = substitute(a:1,'^ftp:','','')
2824 let host = substitute(host,'\..*','','')
2825 if exists("s:netrw_hup[host]")
2826 let g:netrw_uid = s:netrw_hup[host].uid
2827 let s:netrw_passwd = s:netrw_hup[host].passwd
2828" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2829" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2830 else
2831 let g:netrw_uid = input("Enter UserId: ")
2832 let s:netrw_passwd = inputsecret("Enter Password: ")
2833 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002834
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002835 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01002836 " case: one input argument, not an url. Using it as a new user-id.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002837 if exists("g:netrw_machine")
2838 let host= substitute(g:netrw_machine,'\..*$','','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01002839 else
2840 let g:netrw_machine= input('Enter hostname: ')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002841 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002842 let g:netrw_uid = a:1
2843" call Decho("set g:netrw_uid= <".g:netrw_uid.">")
2844 if exists("g:netrw_passwd")
2845 " ask for password if one not previously entered
2846 let s:netrw_passwd= g:netrw_passwd
2847 else
2848 let s:netrw_passwd = inputsecret("Enter Password: ")
2849 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002850 endif
2851
2852" call Decho("host<".host.">")
2853 if exists("host")
2854 if !exists('s:netrw_hup[host]')
2855 let s:netrw_hup[host]= {}
2856 endif
2857 let s:netrw_hup[host].uid = g:netrw_uid
2858 let s:netrw_hup[host].passwd = s:netrw_passwd
2859 endif
2860
2861 elseif a:0 == 2
2862 let g:netrw_uid = a:1
2863 let s:netrw_passwd = a:2
2864
2865 elseif a:0 == 3
2866 " enter hostname, user-id, and password into the hup dictionary
2867 let host = substitute(a:1,'^\a\+:','','')
2868 let host = substitute(host,'\..*$','','')
2869 if !exists('s:netrw_hup[host]')
2870 let s:netrw_hup[host]= {}
2871 endif
2872 let s:netrw_hup[host].uid = a:2
2873 let s:netrw_hup[host].passwd = a:3
2874 let g:netrw_uid = s:netrw_hup[host].uid
2875 let s:netrw_passwd = s:netrw_hup[host].passwd
2876" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2877" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002878 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002879
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002880" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002881endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002882
Bram Moolenaar9964e462007-05-05 17:54:07 +00002883" ===========================================
2884" Shared Browsing Support: {{{1
2885" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00002886
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002887" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002888" s:NetrwMaps: {{{2
2889fun! s:NetrwMaps(islocal)
2890" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002891
2892 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
Bram Moolenaarff034192013-04-24 18:51:19 +02002893" call Decho("(NetrwMaps) set up Rexplore command")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002894 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 +02002895 if g:netrw_mousemaps && g:netrw_retmap
Bram Moolenaarff034192013-04-24 18:51:19 +02002896" call Decho("(NetrwMaps) set up Rexplore 2-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002897 if !hasmapto("<Plug>NetrwReturn")
2898 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
Bram Moolenaarff034192013-04-24 18:51:19 +02002899" call Decho("(NetrwMaps) making map for 2-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002900 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
2901 elseif maparg("<c-leftmouse>","n") == ""
Bram Moolenaarff034192013-04-24 18:51:19 +02002902" call Decho("(NetrwMaps) making map for c-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002903 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
2904 endif
2905 endif
2906 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002907" call Decho("(NetrwMaps) made <Plug>NetrwReturn map")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002908 endif
2909
Bram Moolenaar9964e462007-05-05 17:54:07 +00002910 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02002911" call Decho("(NetrwMaps) make local maps")
Bram Moolenaar15146672011-10-20 22:22:38 +02002912 " local normal-mode maps
2913 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
2914 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
2915 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2916 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
2917 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2918 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
2919 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2920 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2921 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
2922 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
2923 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
2924 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2925 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
2926 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
2927 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2928 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2929 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2930 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2931 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2932 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002933 nnoremap <buffer> <silent> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002934 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2935 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2936 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2937 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2938 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2939 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2940 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2941 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2942 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2943 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
2944 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
2945 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
2946 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
2947 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
2948 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2949 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
2950 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2951 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002952 nnoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002953 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>
2954 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
2955 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002956 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002957 nnoremap <buffer> <silent> Tb :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
2958 nnoremap <buffer> <silent> Th :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002959 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2960 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2961 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
2962 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01002963 nnoremap <buffer> <silent> X :call <SID>NetrwLocalExecute(expand("<cword>"))"<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002964 " local insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002965 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002966 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2967 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2968 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
2969 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2970 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2971 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
2972 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2973 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
2974 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2975 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2976 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002977 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002978 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002979 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2980 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2981 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2982 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2983 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2984 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2985 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2986 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2987 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2988 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2989 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2990 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2991 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2992 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002993 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002994 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002995 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002996 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002997 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2998 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2999 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003000 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003001 inoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003002 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>
3003 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
3004 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003005 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003006 inoremap <buffer> <silent> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3007 inoremap <buffer> <silent> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003008 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
3009 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
3010 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
3011 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003012 if !hasmapto('<Plug>NetrwHideEdit')
3013 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003014 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00003015 endif
3016 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
3017 if !hasmapto('<Plug>NetrwRefresh')
3018 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003019 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00003020 endif
3021 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003022 if s:didstarstar || !mapcheck("<s-down>","n")
3023 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003024 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003025 endif
3026 if s:didstarstar || !mapcheck("<s-up>","n")
3027 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003028 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003029 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003030 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003031 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02003032 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
3033 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003034 nmap <buffer> <s-rightdrag> <Plug>NetrwRightdrag
3035 nno <buffer> <silent> <Plug>NetrwRightdrag <leftmouse>:call <SID>NetrwRightdrag(1)<cr>
Bram Moolenaar251e1912011-06-19 05:09:16 +02003036 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
3037 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
3038 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3039 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
3040 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3041 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
3042 imap <buffer> <leftmouse> <Plug>ILeftmouse
3043 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
3044 imap <buffer> <middlemouse> <Plug>IMiddlemouse
3045 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
3046 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3047 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003048 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3049 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003050 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003051 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003052 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003053 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003054 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003055 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003056 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3057 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3058 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3059 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3060 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3061 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3062 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003063 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003064
Bram Moolenaar9964e462007-05-05 17:54:07 +00003065 else " remote
Bram Moolenaarff034192013-04-24 18:51:19 +02003066" call Decho("(NetrwMaps) make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003067 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar15146672011-10-20 22:22:38 +02003068 " remote normal-mode maps
Bram Moolenaar446cb832008-06-24 21:56:24 +00003069 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3070 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3071 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3072 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003073 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003074 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3075 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3076 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3077 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003078 nnoremap <buffer> <silent> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003079 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3080 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3081 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3082 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3083 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3084 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003085 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003086 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003087 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3088 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003089 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003090 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003091 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003092 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
3093 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003094 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003095 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003096 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003097 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003098 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003099 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
3100 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
3101 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3102 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003103 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3104 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003105 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003106 nnoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003107 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>
3108 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003109 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003110 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003111 nnoremap <buffer> <silent> Tb :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3112 nnoremap <buffer> <silent> Th :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003113 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3114 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003115 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
3116 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00003117 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003118 " remote insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003119 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3120 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3121 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3122 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
3123 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
3124 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3125 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3126 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3127 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3128 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3129 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3130 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3131 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3132 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3133 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003134 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003135 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003136 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3137 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003138 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003139 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003140 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003141 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
3142 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
3143 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
3144 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
3145 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
3146 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
3147 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
3148 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3149 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3150 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3151 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
3152 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003153 inoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003154 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>
3155 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
3156 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
3157 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003158 inoremap <buffer> <silent> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3159 inoremap <buffer> <silent> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003160 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3161 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
3162 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
3163 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
3164 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003165 if !hasmapto('<Plug>NetrwHideEdit')
3166 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003167 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00003168 endif
3169 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
3170 if !hasmapto('<Plug>NetrwRefresh')
3171 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003172 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00003173 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003174
3175 let mapsafepath = escape(s:path, s:netrw_map_escape)
3176 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
3177
Bram Moolenaar251e1912011-06-19 05:09:16 +02003178 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003179 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02003180 nmap <leftmouse> <Plug>NetrwLeftmouse
3181 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003182 nmap <buffer> <leftdrag> <Plug>NetrwLeftdrag
3183 nno <buffer> <silent> <Plug>NetrwLeftdrag :call <SID>NetrwLeftdrag(0)<cr>
Bram Moolenaar251e1912011-06-19 05:09:16 +02003184 nmap <middlemouse> <Plug>NetrwMiddlemouse
3185 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
3186 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3187 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3188 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3189 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
3190 imap <buffer> <leftmouse> <Plug>ILeftmouse
3191 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
3192 imap <buffer> <middlemouse> <Plug>IMiddlemouse
3193 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3194 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3195 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003196 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3197 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003198 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003199 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003200 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003201 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3202 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3203 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003204 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003205 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3206 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3207 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3208 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3209 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3210 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00003211 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003212 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003213 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003214
Bram Moolenaaradc21822011-04-01 18:03:16 +02003215 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02003216
Bram Moolenaaradc21822011-04-01 18:03:16 +02003217" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003218endfun
3219
3220" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003221" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
3222fun! s:ExplorePatHls(pattern)
3223" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
3224 let repat= substitute(a:pattern,'^**/\{1,2}','','')
3225" call Decho("repat<".repat.">")
3226 let repat= escape(repat,'][.\')
3227" call Decho("repat<".repat.">")
3228 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
3229" call Dret("s:ExplorePatHls repat<".repat.">")
3230 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00003231endfun
3232
3233" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003234" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003235" 0: (user: <mb>) bookmark current directory
3236" 1: (user: <gb>) change to the bookmarked directory
3237" 2: (user: <qb>) list bookmarks
3238" 3: (browsing) record current directory history
3239" 4: (user: <u>) go up (previous) bookmark
3240" 5: (user: <U>) go down (next) bookmark
3241" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01003242fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003243" 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 +02003244 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3245" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
3246 return
3247 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003248
Bram Moolenaar97d62492012-11-15 21:28:22 +01003249 let ykeep= @@
Bram Moolenaar9964e462007-05-05 17:54:07 +00003250 if a:chg == 0
3251 " bookmark the current directory
3252" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003253 if !exists("g:netrw_bookmarklist")
3254 let g:netrw_bookmarklist= []
3255 endif
3256 if index(g:netrw_bookmarklist,a:curdir) == -1
3257 " curdir not currently in g:netrw_bookmarklist, so include it
3258 call add(g:netrw_bookmarklist,a:curdir)
3259 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003260 endif
3261 echo "bookmarked the current directory"
3262
3263 elseif a:chg == 1
3264 " change to the bookmarked directory
Bram Moolenaarff034192013-04-24 18:51:19 +02003265" call Decho("(user: <".v:count."gb>) change to the bookmarked directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003266 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaarff034192013-04-24 18:51:19 +02003267" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003268 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00003269 else
3270 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3271 endif
3272
3273 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003274" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00003275 let didwork= 0
3276 " list user's bookmarks
3277" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003278 if exists("g:netrw_bookmarklist")
3279" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
3280 let cnt= 1
3281 for bmd in g:netrw_bookmarklist
3282" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
Bram Moolenaarff034192013-04-24 18:51:19 +02003283 echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
Bram Moolenaar5c736222010-01-06 20:54:52 +01003284 let didwork = 1
3285 let cnt = cnt + 1
3286 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00003287 endif
3288
3289 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01003290 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00003291 let first = 1
3292 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003293 if g:netrw_dirhistmax > 0
3294 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01003295" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003296 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003297" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaarff034192013-04-24 18:51:19 +02003298 echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003299 let didwork= 1
3300 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003301 let histcnt = histcnt + 1
3302 let first = 0
3303 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003304 if cnt < 0
3305 let cnt= cnt + g:netrw_dirhistmax
3306 endif
3307 endwhile
3308 else
3309 let g:netrw_dirhist_cnt= 0
3310 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003311 if didwork
3312 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3313 endif
3314
3315 elseif a:chg == 3
3316 " saves most recently visited directories (when they differ)
3317" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003318 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 +02003319 if g:netrw_dirhistmax > 0
3320 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3321 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
3322 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003323" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003324 endif
3325
3326 elseif a:chg == 4
3327 " u: change to the previous directory stored on the history list
3328" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003329 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003330 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003331 if g:netrw_dirhist_cnt < 0
3332 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3333 endif
3334 else
3335 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003336 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003337 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
3338" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003339 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003340 setl ma noro
3341" call Decho("(NetrwBookHistHandler) setl ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003342 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003343 setl nomod
3344" call Decho("(NetrwBookHistHandler) setl nomod")
3345" 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 +00003346 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003347" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003348 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00003349 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003350 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003351 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003352 else
3353 let g:netrw_dirhist_cnt= 0
3354 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003355 echo "Sorry, no predecessor directory exists yet"
3356 endif
3357
3358 elseif a:chg == 5
3359 " U: change to the subsequent directory stored on the history list
3360" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003361 if g:netrw_dirhistmax > 0
3362 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3363 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003364" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003365 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003366" call Decho("(NetrwBookHistHandler) setl ma noro")
3367 setl ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02003368 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003369" call Decho("removed all lines from buffer (%d)")
3370" call Decho("(NetrwBookHistHandler) setl nomod")
3371 setl nomod
3372" 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 +02003373 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003374" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003375 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
3376 else
3377 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
3378 if g:netrw_dirhist_cnt < 0
3379 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3380 endif
3381 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003382 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003383 else
3384 let g:netrw_dirhist_cnt= 0
3385 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003386 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003387
3388 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01003389 " delete the v:count'th bookmark
3390" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
3391 let savefile= s:NetrwHome()."/.netrwbook"
3392 if filereadable(savefile)
Bram Moolenaarff034192013-04-24 18:51:19 +02003393" call Decho("merge bookmarks (active and file)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003394 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
Bram Moolenaarff034192013-04-24 18:51:19 +02003395" call Decho("bookmark delete savefile<".savefile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003396 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003397 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003398" call Decho("remove g:netrw_bookmarklist[".(v:count-1)."]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003399 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaarff034192013-04-24 18:51:19 +02003400" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003401 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003402 call s:NetrwBookmarkMenu()
Bram Moolenaarff034192013-04-24 18:51:19 +02003403 call s:NetrwTgtMenu()
Bram Moolenaar97d62492012-11-15 21:28:22 +01003404 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003405" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003406endfun
3407
3408" ---------------------------------------------------------------------
3409" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
3410" Sister function: s:NetrwBookHistSave()
3411fun! s:NetrwBookHistRead()
3412" call Dfunc("s:NetrwBookHistRead()")
Bram Moolenaarff034192013-04-24 18:51:19 +02003413 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3414" " call Dret("s:NetrwBookHistRead - suppressed due to g:netrw_dirhistmax")
3415 return
3416 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003417 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01003418 if !exists("s:netrw_initbookhist")
3419 let home = s:NetrwHome()
3420 let savefile= home."/.netrwbook"
3421 if filereadable(savefile)
3422" call Decho("sourcing .netrwbook")
Bram Moolenaarff034192013-04-24 18:51:19 +02003423 exe "keepalt keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003424 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003425 if g:netrw_dirhistmax > 0
3426 let savefile= home."/.netrwhist"
3427 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003428" call Decho("sourcing .netrwhist")
Bram Moolenaarff034192013-04-24 18:51:19 +02003429 exe "keepalt keepj so ".savefile
Bram Moolenaaradc21822011-04-01 18:03:16 +02003430 endif
3431 let s:netrw_initbookhist= 1
3432 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003433 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003434 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003435 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01003436" call Dret("s:NetrwBookHistRead")
3437endfun
3438
3439" ---------------------------------------------------------------------
3440" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
3441" Sister function: s:NetrwBookHistRead()
3442" I used to do this via viminfo but that appears to
3443" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01003444fun! s:NetrwBookHistSave()
3445" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaarff034192013-04-24 18:51:19 +02003446 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003447" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
3448 return
3449 endif
3450
Bram Moolenaar5c736222010-01-06 20:54:52 +01003451 let savefile= s:NetrwHome()."/.netrwhist"
3452 1split
3453 call s:NetrwEnew()
Bram Moolenaarff034192013-04-24 18:51:19 +02003454 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
3455 setl nocin noai noci magic nospell nohid wig= noaw
3456 setl ma noro write
3457 if exists("+acd") | setl noacd | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003458 sil! keepj keepalt %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01003459
3460 " save .netrwhist -- no attempt to merge
Bram Moolenaarff034192013-04-24 18:51:19 +02003461 sil! keepalt file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01003462 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
3463 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
3464 let lastline = line("$")
3465 let cnt = 1
3466 while cnt <= g:netrw_dirhist_cnt
3467 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
3468 let cnt= cnt + 1
3469 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003470 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003471
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003472 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01003473 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3474 " merge and write .netrwbook
3475 let savefile= s:NetrwHome()."/.netrwbook"
3476
3477 if filereadable(savefile)
3478 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaarff034192013-04-24 18:51:19 +02003479 exe "sil keepj keepalt so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003480 for bdm in booklist
3481 if index(g:netrw_bookmarklist,bdm) == -1
3482 call add(g:netrw_bookmarklist,bdm)
3483 endif
3484 endfor
3485 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003486 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003487 endif
3488
3489 " construct and save .netrwbook
3490 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003491 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003492 endif
3493 let bgone= bufnr("%")
3494 q!
Bram Moolenaarff034192013-04-24 18:51:19 +02003495 exe "keepalt ".bgone."bwipe!"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003496
3497" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003498endfun
3499
3500" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003501" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
3502" list of the contents of a local or remote directory. It is assumed that the
3503" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
3504" with the requested remote hostname first.
3505fun! s:NetrwBrowse(islocal,dirname)
3506 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003507" 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 +02003508" call Decho("(NetrwBrowse) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar97d62492012-11-15 21:28:22 +01003509 " s:NetrwBrowse: initialize history {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003510 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003511 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003512 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003513
Bram Moolenaar97d62492012-11-15 21:28:22 +01003514 " s:NetrwBrowse: simplify the dirname (especially for ".."s in dirnames) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003515 if a:dirname !~ '^\a\+://'
3516 let dirname= simplify(a:dirname)
3517 else
3518 let dirname= a:dirname
3519 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003520
3521 if exists("s:netrw_skipbrowse")
3522 unlet s:netrw_skipbrowse
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003523" 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 +00003524" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
3525 return
3526 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003527
3528 " s:NetrwBrowse: sanity checks: {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003529 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003530 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003531" call Dret("s:NetrwBrowse : missing shellescape()")
3532 return
3533 endif
3534 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003535 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003536" call Dret("s:NetrwBrowse : missing fnameescape()")
3537 return
3538 endif
3539
Bram Moolenaar97d62492012-11-15 21:28:22 +01003540 " s:NetrwBrowse: save options: {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003541 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003542
Bram Moolenaar97d62492012-11-15 21:28:22 +01003543 " s:NetrwBrowse: re-instate any marked files {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003544 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaarff034192013-04-24 18:51:19 +02003545" call Decho("(NetrwBrowse) clearing marked files")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003546 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3547 endif
3548
3549 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
Bram Moolenaar97d62492012-11-15 21:28:22 +01003550 " s:NetrwBrowse: set up "safe" options for local directory/file {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003551" call Decho("(NetrwBrowse) handle w:netrw_acdkeep:")
3552" call Decho("(NetrwBrowse) keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003553 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003554 call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02003555" call Decho("(NetrwBrowse) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003556
Bram Moolenaar5c736222010-01-06 20:54:52 +01003557 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar97d62492012-11-15 21:28:22 +01003558 " s:NetrwBrowse: looks like a remote regular file, attempt transfer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003559" call Decho("(NetrwBrowse) attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003560
Bram Moolenaar97d62492012-11-15 21:28:22 +01003561 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaar446cb832008-06-24 21:56:24 +00003562 " "this is a directory" indicator (/).
3563 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01003564 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +02003565" call Decho("(NetrwBrowse) new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003566 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003567
Bram Moolenaar97d62492012-11-15 21:28:22 +01003568 " s:NetrwBrowse: remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003569 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01003570 call s:NetrwEnew(dirname)
3571 call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02003572 setl ma noro
3573" call Decho("(NetrwBrowse) setl ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02003574 let b:netrw_curdir = dirname
3575 let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
Bram Moolenaarff034192013-04-24 18:51:19 +02003576" call Decho("(NetrwBrowse) exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
Bram Moolenaar15146672011-10-20 22:22:38 +02003577 exe "sil! keepj keepalt file ".fnameescape(url)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003578 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02003579 sil call netrw#NetRead(2,url)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003580 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003581 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02003582 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003583 endif
3584
Bram Moolenaar97d62492012-11-15 21:28:22 +01003585 " s:NetrwBrowse: save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003586 call s:SetBufWinVars()
3587 call s:NetrwOptionRestore("w:")
Bram Moolenaarff034192013-04-24 18:51:19 +02003588" call Decho("(NetrwBrowse) setl ma nomod")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003589 setl ma nomod
3590" 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 +00003591
Bram Moolenaar446cb832008-06-24 21:56:24 +00003592" call Dret("s:NetrwBrowse : file<".s:fname.">")
3593 return
3594 endif
3595
Bram Moolenaaradc21822011-04-01 18:03:16 +02003596 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003597 call s:UseBufWinVars()
3598
3599 " set up some variables {{{3
3600 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003601 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003602 let s:last_sort_by = g:netrw_sort_by
3603
3604 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02003605 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003606
Bram Moolenaar97d62492012-11-15 21:28:22 +01003607 " get/set-up buffer {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003608 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
3609 " maintain markfile highlighting
3610 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
Bram Moolenaarff034192013-04-24 18:51:19 +02003611" call Decho("(NetrwBrowse) bufnr(%)=".bufnr('%'))
3612" call Decho("(NetrwBrowse) exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003613 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3614 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003615" call Decho("(NetrwBrowse) 2match none")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003616 2match none
3617 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003618 if reusing && line("$") > 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003619 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003620" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3621 setl noma nomod nowrap
Bram Moolenaarff034192013-04-24 18:51:19 +02003622" 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 +00003623" call Dret("s:NetrwBrowse : re-using buffer")
3624 return
3625 endif
3626
3627 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003628" call Decho("(NetrwBrowse) set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003629 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003630 if b:netrw_curdir =~ '[/\\]$'
3631 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
3632 endif
3633 if b:netrw_curdir == ''
3634 if has("amiga")
3635 " On the Amiga, the empty string connotes the current directory
3636 let b:netrw_curdir= getcwd()
3637 else
3638 " under unix, when the root directory is encountered, the result
3639 " from the preceding substitute is an empty string.
3640 let b:netrw_curdir= '/'
3641 endif
3642 endif
3643 if !a:islocal && b:netrw_curdir !~ '/$'
3644 let b:netrw_curdir= b:netrw_curdir.'/'
3645 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003646" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003647
3648 " ------------
3649 " (local only) {{{3
3650 " ------------
3651 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02003652" call Decho("(NetrwBrowse) local only:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003653
3654 " Set up ShellCmdPost handling. Append current buffer to browselist
3655 call s:LocalFastBrowser()
3656
3657 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
3658 if !g:netrw_keepdir
Bram Moolenaarff034192013-04-24 18:51:19 +02003659" call Decho("(NetrwBrowse) handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
3660" call Decho("(NetrwBrowse) l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003661 if !exists("&l:acd") || !&l:acd
3662" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
3663 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003664 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003665 catch /^Vim\%((\a\+)\)\=:E472/
3666 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
3667 if exists("w:netrw_prvdir")
3668 let b:netrw_curdir= w:netrw_prvdir
3669 else
3670 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003671" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3672 setl noma nomod nowrap
3673" 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 +00003674 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003675" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
3676 return
3677 endif
3678 endtry
3679 endif
3680 endif
3681
3682 " --------------------------------
3683 " remote handling: {{{3
3684 " --------------------------------
3685 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003686" call Decho("(NetrwBrowse) remote only:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003687
Bram Moolenaar97d62492012-11-15 21:28:22 +01003688 " analyze dirname and g:netrw_list_cmd {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003689" 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 +01003690 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003691 let dirname= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02003692" call Decho("(NetrwBrowse) (dirname was <NetrwTreeListing>) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003693 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3694 let dirname= substitute(b:netrw_curdir,'\\','/','g')
3695 if dirname !~ '/$'
3696 let dirname= dirname.'/'
3697 endif
3698 let b:netrw_curdir = dirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003699" call Decho("(NetrwBrowse) (liststyle is TREELIST) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003700 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003701 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaarff034192013-04-24 18:51:19 +02003702" call Decho("(NetrwBrowse) (normal) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003703 endif
3704
3705 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
3706 if dirname !~ dirpat
3707 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003708 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003709 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003710 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003711" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3712 setl noma nomod nowrap
3713" 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 +00003714" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
3715 return
3716 endif
3717 let b:netrw_curdir= dirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003718" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir."> (remote)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003719 endif " (additional remote handling)
3720
3721 " -----------------------
3722 " Directory Listing: {{{3
3723 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02003724 keepj call s:NetrwMaps(a:islocal)
3725 keepj call s:PerformListing(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02003726 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003727 let &l:bexpr= "netrw#NetrwBalloonHelp()"
Bram Moolenaarff034192013-04-24 18:51:19 +02003728" call Decho("(NetrwBrowse) set up balloon help: l:bexpr=".&l:bexpr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003729 set beval
3730 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003731 call s:NetrwOptionRestore("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003732
3733 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
3734 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
3735 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
3736 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
3737 " function gets called due to that autocmd; it notices that the following variable is set
3738 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
3739 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003740
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003741" 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 +02003742" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003743 return
3744endfun
3745
3746" ---------------------------------------------------------------------
3747" s:NetrwFileInfo: supports qf (query for file information) {{{2
3748fun! s:NetrwFileInfo(islocal,fname)
3749" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01003750 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00003751 if a:islocal
3752 if (has("unix") || has("macunix")) && executable("/bin/ls")
3753 if exists("b:netrw_curdir")
3754" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
3755 if b:netrw_curdir =~ '/$'
3756 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
3757 else
3758 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
3759 endif
3760 else
3761" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
3762 echo system("/bin/ls -lsad ".shellescape(a:fname))
3763 endif
3764 else
3765 " use vim functions to return information about file below cursor
3766" call Decho("using vim functions to query for file info")
3767 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
3768 let fname= substitute(a:fname,".$","","")
3769 else
3770 let fname= a:fname
3771 endif
3772 let t = getftime(fname)
3773 let sz = getfsize(fname)
3774 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
3775" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
3776 endif
3777 else
3778 echo "sorry, \"qf\" not supported yet for remote files"
3779 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003780 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00003781" call Dret("s:NetrwFileInfo")
3782endfun
3783
3784" ---------------------------------------------------------------------
3785" s:NetrwGetBuffer: {{{2
3786" returns 0=cleared buffer
3787" 1=re-used buffer
3788fun! s:NetrwGetBuffer(islocal,dirname)
3789" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02003790" call Decho("(NetrwGetBuffer) modiable=".&mod." modifiable=".&ma." readonly=".&ro)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003791 let dirname= a:dirname
3792
3793 " re-use buffer if possible {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003794" call Decho("(NetrwGetBuffer) --re-use a buffer if possible--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003795 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3796 " find NetrwTreeList buffer if there is one
Bram Moolenaarff034192013-04-24 18:51:19 +02003797" call Decho("(NetrwGetBuffer) case liststyle=treelist: find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003798 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +02003799" call Decho("(NetrwGetBuffer) re-using w:netrw_treebufnr=".w:netrw_treebufnr)
3800 setl mod
3801 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003802 let eikeep= &ei
3803 set ei=all
Bram Moolenaarff034192013-04-24 18:51:19 +02003804 exe "sil! keepalt b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00003805 let &ei= eikeep
Bram Moolenaarff034192013-04-24 18:51:19 +02003806" call Dret("s:NetrwGetBuffer 0<buffer cleared> : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
3807 return 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003808 endif
3809 let bufnum= -1
Bram Moolenaarff034192013-04-24 18:51:19 +02003810" call Decho("(NetrwGetBuffer) liststyle=TREE but w:netrw_treebufnr doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003811
3812 else
3813 " find buffer number of buffer named precisely the same as dirname {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003814" call Decho("(NetrwGetBuffer) case listtyle not treelist: find buffer numnber of buffer named precisely the same as dirname--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003815
3816 " get dirname and associated buffer number
3817 let bufnum = bufnr(escape(dirname,'\'))
Bram Moolenaarff034192013-04-24 18:51:19 +02003818" call Decho("(NetrwGetBuffer) find buffer<".dirname.">'s number ")
3819" call Decho("(NetrwGetBuffer) bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003820
3821 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003822 " try appending a trailing /
Bram Moolenaarff034192013-04-24 18:51:19 +02003823" call Decho("(NetrwGetBuffer) try appending a trailing / to dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003824 let bufnum= bufnr(escape(dirname.'/','\'))
3825 if bufnum > 0
3826 let dirname= dirname.'/'
3827 endif
3828 endif
3829
3830 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003831 " try removing a trailing /
Bram Moolenaarff034192013-04-24 18:51:19 +02003832" call Decho("(NetrwGetBuffer) try removing a trailing / from dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003833 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
3834 if bufnum > 0
3835 let dirname= substitute(dirname,'/$','','')
3836 endif
3837 endif
3838
Bram Moolenaarff034192013-04-24 18:51:19 +02003839" call Decho("(NetrwGetBuffer) findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003840 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
3841 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
3842 " handle approximate matches
Bram Moolenaarff034192013-04-24 18:51:19 +02003843" 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 +00003844 let ibuf = 1
3845 let buflast = bufnr("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02003846" call Decho("(NetrwGetBuffer) findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003847 while ibuf <= buflast
3848 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00003849 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02003850" call Decho("(NetrwGetBuffer) findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003851 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
3852 " bname is not empty
3853 " dirname ends with bname,
3854 " dirname doesn't start with /, so its not a absolute path
Bram Moolenaarff034192013-04-24 18:51:19 +02003855" call Decho("(NetrwGetBuffer) findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003856 break
3857 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003858 if bname =~ '^'.dirname.'/\=$'
3859 " bname begins with dirname
3860" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003861 break
3862 endif
3863 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003864" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
3865 break
3866 endif
3867 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
3868" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003869 break
3870 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003871 let ibuf= ibuf + 1
3872 endwhile
3873 if ibuf > buflast
3874 let bufnum= -1
3875 else
3876 let bufnum= ibuf
3877 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003878" call Decho("(NetrwGetBuffer) findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003879 endif
3880 endif
3881
3882 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003883" call Decho("(NetrwGetBuffer) get enew buffer and name it OR re-use buffer")
3884 sil! keepj keepalt mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00003885 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaarff034192013-04-24 18:51:19 +02003886" 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 +00003887 call s:NetrwEnew(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02003888" call Decho("(NetrwGetBuffer) got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003889 " name the buffer
3890 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3891 " Got enew buffer; transform into a NetrwTreeListing
Bram Moolenaarff034192013-04-24 18:51:19 +02003892" call Decho("(NetrwGetBuffer) --transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003893 if !exists("s:netrw_treelistnum")
3894 let s:netrw_treelistnum= 1
3895 else
3896 let s:netrw_treelistnum= s:netrw_treelistnum + 1
3897 endif
3898 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02003899" call Decho("(NetrwGetBuffer) exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003900 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
3901 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02003902 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
3903 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
3904 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
3905 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003906" call Decho("(NetrwGetBuffer) tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003907 else
3908" let v:errmsg= "" " Decho
3909 let escdirname= fnameescape(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02003910" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003911" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003912" let v:errmsg= "" " Decho
3913 exe 'sil! keepalt file '.escdirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003914" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003915 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003916" call Decho("(NetrwGetBuffer) named enew buffer#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003917
3918 else " Re-use the buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02003919" call Decho("(NetrwGetBuffer) --re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003920 let eikeep= &ei
3921 set ei=all
3922 if getline(2) =~ '^" Netrw Directory Listing'
Bram Moolenaarff034192013-04-24 18:51:19 +02003923" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003924 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003925 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003926" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum)
3927 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003928 endif
3929 if bufname("%") == '.'
Bram Moolenaarff034192013-04-24 18:51:19 +02003930" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003931 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00003932 endif
3933 let &ei= eikeep
3934 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02003935 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar97d62492012-11-15 21:28:22 +01003936" call Dret("s:NetrwGetBuffer 0<buffer empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
3937 return 0
3938 elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
3939 keepj call s:NetrwListSettings(a:islocal)
3940 sil keepj %d
3941" 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 +00003942 return 0
3943 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02003944" call Decho("(NetrwGetBuffer) --re-use tree listing--")
3945" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003946 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02003947 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar97d62492012-11-15 21:28:22 +01003948" 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 +00003949 return 0
3950 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01003951" call Dret("s:NetrwGetBuffer 1<buffer not cleared> : buf#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003952 return 1
3953 endif
3954 endif
3955
3956 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
3957 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
3958 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
3959 " med 1 D H
3960 " fast 2 H H
Bram Moolenaarff034192013-04-24 18:51:19 +02003961" 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 +00003962 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003963 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02003964" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003965 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003966
3967 " delete all lines from buffer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003968" call Decho("(NetrwGetBuffer) --delete all lines from buffer--")
3969" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003970 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003971
Bram Moolenaar97d62492012-11-15 21:28:22 +01003972" call Dret("s:NetrwGetBuffer 0<cleared buffer> : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003973 return 0
3974endfun
3975
3976" ---------------------------------------------------------------------
3977" s:NetrwGetcwd: get the current directory. {{{2
3978" Change backslashes to forward slashes, if any.
3979" If doesc is true, escape certain troublesome characters
3980fun! s:NetrwGetcwd(doesc)
3981" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
3982 let curdir= substitute(getcwd(),'\\','/','ge')
3983 if curdir !~ '[\/]$'
3984 let curdir= curdir.'/'
3985 endif
3986 if a:doesc
3987 let curdir= fnameescape(curdir)
3988 endif
3989" call Dret("NetrwGetcwd <".curdir.">")
3990 return curdir
3991endfun
3992
3993" ---------------------------------------------------------------------
3994" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
3995fun! s:NetrwGetWord()
3996" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
3997 call s:UseBufWinVars()
3998
3999 " insure that w:netrw_liststyle is set up
4000 if !exists("w:netrw_liststyle")
4001 if exists("g:netrw_liststyle")
4002 let w:netrw_liststyle= g:netrw_liststyle
4003 else
4004 let w:netrw_liststyle= s:THINLIST
4005 endif
4006" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
4007 endif
4008
4009 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
4010 " Active Banner support
4011" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004012 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004013 let dirname= "./"
4014 let curline= getline('.')
4015
4016 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004017 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00004018 let s:netrw_skipbrowse= 1
4019 echo 'Pressing "s" also works'
4020
4021 elseif curline =~ '"\s*Sort sequence:'
4022 let s:netrw_skipbrowse= 1
4023 echo 'Press "S" to edit sorting sequence'
4024
4025 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004026 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00004027 let s:netrw_skipbrowse= 1
4028 echo 'Pressing "?" also works'
4029
4030 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004031 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00004032 let s:netrw_skipbrowse= 1
4033 echo 'Pressing "a" also works'
4034
4035 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004036 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004037 endif
4038
4039 elseif w:netrw_liststyle == s:THINLIST
4040" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004041 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004042 let dirname= getline('.')
4043
4044 elseif w:netrw_liststyle == s:LONGLIST
4045" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004046 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004047 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
4048
4049 elseif w:netrw_liststyle == s:TREELIST
4050" call Decho("treelist handling")
4051 let dirname= substitute(getline('.'),'^\(| \)*','','e')
4052
4053 else
4054" call Decho("obtain word from wide listing")
4055 let dirname= getline('.')
4056
4057 if !exists("b:netrw_cpf")
4058 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004059 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 +01004060 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004061" call Decho("computed cpf=".b:netrw_cpf)
4062 endif
4063
4064" call Decho("buf#".bufnr("%")."<".bufname("%").">")
4065 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
4066" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
4067" call Decho("1: dirname<".dirname.">")
4068 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004069 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004070 else
4071 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004072 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004073 endif
4074 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004075 let eofname= filestart + b:netrw_cpf + 1
4076 if eofname <= col("$")
4077 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004078 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004079 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004080 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00004081 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004082 let dirname = @a
4083 let @a = rega
4084" call Decho("2: dirname<".dirname.">")
4085 let dirname= substitute(dirname,'\s\+$','','e')
4086" call Decho("3: dirname<".dirname.">")
4087 endif
4088
4089 " symlinks are indicated by a trailing "@". Remove it before further processing.
4090 let dirname= substitute(dirname,"@$","","")
4091
4092 " executables are indicated by a trailing "*". Remove it before further processing.
4093 let dirname= substitute(dirname,"\*$","","")
4094
4095" call Dret("s:NetrwGetWord <".dirname.">")
4096 return dirname
4097endfun
4098
4099" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004100" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004101fun! s:NetrwListSettings(islocal)
4102" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
4103 let fname= bufname("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02004104" call Decho("(NetrwListSettings) setl bt=nofile nobl ma nonu nowrap noro")
4105 setl bt=nofile nobl ma nonu nowrap noro
4106" call Decho("(NetrwListSettings) exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004107 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004108 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004109 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004110 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004111" call Decho("(NetrwListSettings) exe setl ts=".(g:netrw_maxfilenamelen+1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004112 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaarff034192013-04-24 18:51:19 +02004113 setl isk+=.,~,-
Bram Moolenaar446cb832008-06-24 21:56:24 +00004114 if g:netrw_fastbrowse > a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004115 setl bh=hide
Bram Moolenaar446cb832008-06-24 21:56:24 +00004116 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004117 setl bh=delete
Bram Moolenaar446cb832008-06-24 21:56:24 +00004118 endif
4119" call Dret("s:NetrwListSettings")
4120endfun
4121
4122" ---------------------------------------------------------------------
4123" s:NetrwListStyle: {{{2
4124" islocal=0: remote browsing
4125" =1: local browsing
4126fun! s:NetrwListStyle(islocal)
4127" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004128 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004129 let fname = s:NetrwGetWord()
4130 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
4131 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
4132" call Decho("fname<".fname.">")
4133" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
4134" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
4135
4136 if w:netrw_liststyle == s:THINLIST
4137 " use one column listing
4138" call Decho("use one column list")
4139 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4140
4141 elseif w:netrw_liststyle == s:LONGLIST
4142 " use long list
4143" call Decho("use long list")
4144 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4145
4146 elseif w:netrw_liststyle == s:WIDELIST
4147 " give wide list
4148" call Decho("use wide list")
4149 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4150
4151 elseif w:netrw_liststyle == s:TREELIST
4152" call Decho("use tree list")
4153 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4154
4155 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004156 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004157 let g:netrw_liststyle = s:THINLIST
4158 let w:netrw_liststyle = g:netrw_liststyle
4159 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4160 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004161 setl ma noro
4162" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004163
4164 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
4165" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004166 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004167 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004168" call Decho("(NetrwListStyle) setl nomod")
4169 setl nomod
4170" 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 +00004171
4172 " refresh the listing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004173" call Decho("(NetrwListStyle) refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004174 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004175 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4176 keepj call netrw#NetrwRestorePosn(svpos)
4177 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004178
4179 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004180 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00004181 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4182" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4183 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004184 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004185 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004186 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004187
4188" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4189endfun
4190
4191" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004192" s:NetrwBannerCtrl: toggles the display of the banner {{{2
4193fun! s:NetrwBannerCtrl(islocal)
4194" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
4195
Bram Moolenaar97d62492012-11-15 21:28:22 +01004196 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004197 " toggle the banner (enable/suppress)
4198 let g:netrw_banner= !g:netrw_banner
4199
4200 " refresh the listing
4201 let svpos= netrw#NetrwSavePosn()
4202 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4203
4204 " keep cursor on the filename
4205 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004206 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01004207 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4208" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4209 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004210 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01004211 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004212 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004213" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
4214endfun
4215
4216" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004217" s:NetrwBookmarkMenu: Uses menu priorities {{{2
4218" .2.[cnt] for bookmarks, and
4219" .3.[cnt] for history
4220" (see s:NetrwMenu())
4221fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004222 if !exists("s:netrw_menucnt")
4223 return
4224 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004225" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004226
4227 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02004228 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00004229 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004230" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004231 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4232 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004233 endif
4234 if !exists("s:netrw_initbookhist")
4235 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004236 endif
4237
4238 " show bookmarked places
Bram Moolenaarff034192013-04-24 18:51:19 +02004239 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004240 let cnt= 1
4241 for bmd in g:netrw_bookmarklist
Bram Moolenaare6ae6222013-05-21 21:01:10 +02004242 let ebmd= escape(bmd,g:netrw_menu_escape)
4243" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.ebmd.' :e '.bmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004244
4245 " show bookmarks for goto menu
Bram Moolenaare6ae6222013-05-21 21:01:10 +02004246 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.ebmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004247
4248 " show bookmarks for deletion menu
Bram Moolenaare6ae6222013-05-21 21:01:10 +02004249 exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.ebmd.' '.cnt."mB"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004250 let cnt= cnt + 1
4251 endfor
4252
4253 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004254
4255 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02004256 if g:netrw_dirhistmax > 0
4257 let cnt = g:netrw_dirhist_cnt
4258 let first = 1
4259 let histcnt = 0
4260 while ( first || cnt != g:netrw_dirhist_cnt )
4261 let histcnt = histcnt + 1
4262 let priority = g:netrw_dirhist_cnt + histcnt
4263 if exists("g:netrw_dirhist_{cnt}")
4264 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
4265" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
4266 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
4267 endif
4268 let first = 0
4269 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4270 if cnt < 0
4271 let cnt= cnt + g:netrw_dirhistmax
4272 endif
4273 endwhile
4274 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004275
Bram Moolenaar9964e462007-05-05 17:54:07 +00004276 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004277" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004278endfun
4279
4280" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004281" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
4282" directory and a new directory name. Also, if the
4283" "new directory name" is actually a file,
4284" NetrwBrowseChgDir() edits the file.
4285fun! s:NetrwBrowseChgDir(islocal,newdir,...)
4286" 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 +00004287
Bram Moolenaar97d62492012-11-15 21:28:22 +01004288 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004289 if !exists("b:netrw_curdir")
4290 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
4291 " and the current window is the NetrwMessage window.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004292 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004293" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004294" call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004295" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004296 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004297 endif
4298
Bram Moolenaar97d62492012-11-15 21:28:22 +01004299 " NetrwBrowseChgDir: save options and initialize {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02004300 keepj call s:NetrwOptionSave("s:")
4301 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004302 let nbcd_curpos = netrw#NetrwSavePosn()
4303 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004304" call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004305 if (has("win32") || has("win95") || has("win64") || has("win16"))
4306 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
4307 else
4308 let dirname= b:netrw_curdir
4309 endif
4310 let newdir = a:newdir
4311 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00004312
Bram Moolenaar446cb832008-06-24 21:56:24 +00004313 " set up o/s-dependent directory recognition pattern
4314 if has("amiga")
4315 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00004316 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004317 let dirpat= '[\/]$'
4318 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004319" call Decho("(NetrwBrowseChgDir) dirname<".dirname."> dirpat<".dirpat.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004320
4321 if dirname !~ dirpat
4322 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02004323 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004324 let dirname= dirname.'/'
Bram Moolenaarff034192013-04-24 18:51:19 +02004325" call Decho("(NetrwBrowseChgDir) adjusting dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004326 endif
4327
4328 if newdir !~ dirpat
Bram Moolenaar97d62492012-11-15 21:28:22 +01004329 " ------------------------------
4330 " NetrwBrowseChgDir: edit a file {{{3
4331 " ------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004332" call Decho('(NetrwBrowseChgDir:edit-a-file) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004333
Bram Moolenaar97d62492012-11-15 21:28:22 +01004334 " save position for benefit of Rexplore
4335 let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn()
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004336
Bram Moolenaarff034192013-04-24 18:51:19 +02004337" call Decho("(NetrwBrowseChgDir:edit-a-file) setting s:rexposn_".bufnr("%")." to SavePosn")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004338 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
4339 let dirname= s:NetrwTreeDir()
4340 if dirname =~ '/$'
4341 let dirname= dirname.newdir
4342 else
4343 let dirname= s:NetrwTreeDir()."/".newdir
4344 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004345" call Decho("(NetrwBrowseChgDir:edit-a-file) dirname<".dirname.">")
4346" call Decho("(NetrwBrowseChgDir:edit-a-file) tree listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004347 elseif newdir =~ '^\(/\|\a:\)'
4348 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004349 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004350 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004351 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004352" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file: dirname<".dirname."> (a:0=".a:0.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004353 " this lets NetrwBrowseX avoid the edit
4354 if a:0 < 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004355" 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 +02004356 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004357 if !exists("s:didsplit")
Bram Moolenaarff034192013-04-24 18:51:19 +02004358" 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 +00004359 if g:netrw_browse_split == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01004360 " horizontally splitting the window first
Bram Moolenaarff034192013-04-24 18:51:19 +02004361 keepalt new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004362 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004363 keepalt wincmd _
Bram Moolenaar5c736222010-01-06 20:54:52 +01004364 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004365 elseif g:netrw_browse_split == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01004366 " vertically splitting the window first
Bram Moolenaarff034192013-04-24 18:51:19 +02004367 keepalt rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004368 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004369 keepalt wincmd |
Bram Moolenaar5c736222010-01-06 20:54:52 +01004370 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004371 elseif g:netrw_browse_split == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004372 " open file in new tab
Bram Moolenaarff034192013-04-24 18:51:19 +02004373 keepalt tabnew
Bram Moolenaar446cb832008-06-24 21:56:24 +00004374 elseif g:netrw_browse_split == 4
Bram Moolenaar97d62492012-11-15 21:28:22 +01004375 " act like "P" (ie. open previous window)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004376 if s:NetrwPrevWinOpen(2) == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004377 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004378" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004379 return
4380 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004381 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004382 " handling a file, didn't split, so remove menu
Bram Moolenaarff034192013-04-24 18:51:19 +02004383" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file+didn't split, so remove menu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004384 call s:NetrwMenu(0)
4385 " optional change to window
4386 if g:netrw_chgwin >= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004387 exe "keepj keepalt ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004388 endif
4389 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004390 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004391
Bram Moolenaar446cb832008-06-24 21:56:24 +00004392 " the point where netrw actually edits the (local) file
4393 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
4394 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004395" call Decho("(NetrwBrowseChgDir:edit-a-file) edit local file: exe e! ".fnameescape(dirname))
4396 exe "keepj keepalt e! ".fnameescape(dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004397 call s:NetrwCursor()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004398 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004399" call Decho("(NetrwBrowseChgDir:edit-a-file) remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004400 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004401 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01004402
4403 " handle g:Netrw_funcref -- call external-to-netrw functions
4404 " This code will handle g:Netrw_funcref as an individual function reference
4405 " or as a list of function references. It will ignore anything that's not
4406 " a function reference. See :help Funcref for information about function references.
4407 if exists("g:Netrw_funcref")
Bram Moolenaarff034192013-04-24 18:51:19 +02004408" call Decho("(NetrwBrowseChgDir:edit-a-file) handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004409 if type(g:Netrw_funcref) == 2
Bram Moolenaarff034192013-04-24 18:51:19 +02004410" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004411 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004412 elseif type(g:Netrw_funcref) == 3
Bram Moolenaarff034192013-04-24 18:51:19 +02004413" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004414 for Fncref in g:Netrw_funcref
4415 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02004416 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004417 endif
4418 endfor
4419 endif
4420 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004421 endif
4422
4423 elseif newdir =~ '^/'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004424 " ----------------------------------------------------
4425 " NetrwBrowseChgDir: just go to the new directory spec {{{3
4426 " ----------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004427" call Decho('(NetrwBrowseChgDir:goto-newdir) case "just go to new directory spec": newdir<'.newdir.'>')
Bram Moolenaar97d62492012-11-15 21:28:22 +01004428 let dirname = newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02004429 keepj call s:SetRexDir(a:islocal,dirname)
4430 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004431
4432 elseif newdir == './'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004433 " ---------------------------------------------
4434 " NetrwBrowseChgDir: refresh the directory list {{{3
4435 " ---------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004436" call Decho('(NetrwBrowseChgDir:refresh-dirlist) case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004437 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004438
4439 elseif newdir == '../'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004440 " --------------------------------------
4441 " NetrwBrowseChgDir: go up one directory {{{3
4442 " --------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004443" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004444
4445 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
4446 " force a refresh
Bram Moolenaarff034192013-04-24 18:51:19 +02004447" call Decho("(NetrwBrowseChgDir:go-up) clear buffer<".expand("%")."> with :%d")
4448" call Decho("(NetrwBrowseChgDir:go-up) setl noro ma")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004449 setl noro ma
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004450 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004451 endif
4452
4453 if has("amiga")
4454 " amiga
Bram Moolenaarff034192013-04-24 18:51:19 +02004455" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and amiga')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004456 if a:islocal
4457 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
4458 let dirname= substitute(dirname,'/$','','')
4459 else
4460 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
4461 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004462" call Decho("(NetrwBrowseChgDir:go-up) amiga: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004463
4464 else
4465 " unix or cygwin
Bram Moolenaarff034192013-04-24 18:51:19 +02004466" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and unix or cygwin')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004467 if a:islocal
4468 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4469 if dirname == ""
4470 let dirname= '/'
4471 endif
4472 else
4473 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
4474 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004475" call Decho("(NetrwBrowseChgDir:go-up) unix: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004476 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004477 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004478
4479 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004480 " --------------------------------------
4481 " NetrwBrowseChgDir: Handle Tree Listing {{{3
4482 " --------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004483" call Decho('(NetrwBrowseChgDir:tree-list) case liststyle is TREELIST and w:netrw_treedict exists')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004484 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
Bram Moolenaarff034192013-04-24 18:51:19 +02004485" call Decho("(NetrwBrowseChgDir) (treelist) setl noro ma")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004486 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004487 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004488" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004489 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004490 endif
4491 let treedir = s:NetrwTreeDir()
4492 let s:treecurpos = nbcd_curpos
4493 let haskey= 0
Bram Moolenaarff034192013-04-24 18:51:19 +02004494" call Decho("(NetrwBrowseChgDir:tree-list) w:netrw_treedict<".string(w:netrw_treedict).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004495
4496 " search treedict for tree dir as-is
4497 if has_key(w:netrw_treedict,treedir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004498" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004499 let haskey= 1
4500 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004501" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004502 endif
4503
4504 " search treedict for treedir with a / appended
4505 if !haskey && treedir !~ '/$'
4506 if has_key(w:netrw_treedict,treedir."/")
4507 let treedir= treedir."/"
Bram Moolenaarff034192013-04-24 18:51:19 +02004508" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004509 let haskey = 1
4510 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004511" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'/> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004512 endif
4513 endif
4514
4515 " search treedict for treedir with any trailing / elided
4516 if !haskey && treedir =~ '/$'
4517 let treedir= substitute(treedir,'/$','','')
4518 if has_key(w:netrw_treedict,treedir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004519" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004520 let haskey = 1
4521 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004522" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004523 endif
4524 endif
4525
4526 if haskey
4527 " close tree listing for selected subdirectory
Bram Moolenaarff034192013-04-24 18:51:19 +02004528" call Decho("(NetrwBrowseChgDir:tree-list) closing selected subdirectory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004529 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004530" call Decho("(NetrwBrowseChgDir) removed entry<".treedir."> from treedict")
4531" call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004532 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00004533 else
4534 " go down one directory
4535 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaarff034192013-04-24 18:51:19 +02004536" call Decho("(NetrwBrowseChgDir:tree-list) go down one dir: treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004537 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004538 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004539 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004540
4541 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004542 " ----------------------------------------
4543 " NetrwBrowseChgDir: Go down one directory {{{3
4544 " ----------------------------------------
4545 let dirname = s:ComposePath(dirname,newdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004546" call Decho("(NetrwBrowseChgDir:go-down) go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004547 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004548 endif
4549
Bram Moolenaar97d62492012-11-15 21:28:22 +01004550 " --------------------------------------
4551 " NetrwBrowseChgDir: Restore and Cleanup {{{3
4552 " --------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004553 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004554 if dolockout
Bram Moolenaarff034192013-04-24 18:51:19 +02004555" call Decho("(NetrwBrowseChgDir:restore) filewritable(dirname<".dirname.">)=".filewritable(dirname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004556 if filewritable(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004557" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod noro")
4558" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004559 setl ma nomod noro
Bram Moolenaarff034192013-04-24 18:51:19 +02004560" 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 +02004561 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004562" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod ro")
4563" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004564 setl ma nomod ro
Bram Moolenaarff034192013-04-24 18:51:19 +02004565" 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 +02004566 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004567 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004568 let @@= ykeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00004569
Bram Moolenaar446cb832008-06-24 21:56:24 +00004570" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
4571 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00004572endfun
4573
4574" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004575" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
4576" given filename; typically this means given their extension.
4577" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00004578fun! netrw#NetrwBrowseX(fname,remote)
4579" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
4580
Bram Moolenaar97d62492012-11-15 21:28:22 +01004581 let ykeep = @@
4582 let screenposn = netrw#NetrwSavePosn()
4583
Bram Moolenaar5c736222010-01-06 20:54:52 +01004584 " special core dump handler
4585 if a:fname =~ '/core\(\.\d\+\)\=$'
4586 if exists("g:Netrw_corehandler")
4587 if type(g:Netrw_corehandler) == 2
4588 " g:Netrw_corehandler is a function reference (see :help Funcref)
4589" call Decho("g:Netrw_corehandler is a funcref")
4590 call g:Netrw_corehandler(a:fname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004591 elseif type(g:Netrw_corehandler) == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01004592 " g:Netrw_corehandler is a List of function references (see :help Funcref)
4593" call Decho("g:Netrw_corehandler is a List")
4594 for Fncref in g:Netrw_corehandler
4595 if type(FncRef) == 2
4596 call FncRef(a:fname)
4597 endif
4598 endfor
4599 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004600 call netrw#NetrwRestorePosn(screenposn)
4601 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004602" call Dret("NetrwBrowseX : coredump handler invoked")
4603 return
4604 endif
4605 endif
4606
Bram Moolenaar446cb832008-06-24 21:56:24 +00004607 " set up the filename
4608 " (lower case the extension, make a local copy of a remote file)
4609 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
4610 if has("win32") || has("win95") || has("win64") || has("win16")
4611 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00004612 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004613" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004614
4615 " seems kde systems often have gnome-open due to dependencies, even though
4616 " gnome-open's subsidiary display tools are largely absent. Kde systems
4617 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
4618 if !exists("s:haskdeinit")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004619 if has("unix") && executable("ps") && !has("win32unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004620 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004621 if v:shell_error
4622 let s:haskdeinit = 0
4623 endif
4624 else
4625 let s:haskdeinit= 0
4626 endif
4627" call Decho("setting s:haskdeinit=".s:haskdeinit)
4628 endif
4629
4630 if a:remote == 1
4631 " create a local copy
Bram Moolenaar97d62492012-11-15 21:28:22 +01004632" call Decho("(remote) a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaarff034192013-04-24 18:51:19 +02004633 setl bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01004634 call netrw#NetRead(3,a:fname)
4635 " attempt to rename tempfile
4636 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01004637 let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004638" call Decho("basename<".basename.">")
4639" call Decho("newname <".newname.">")
4640 if rename(s:netrw_tmpfile,newname) == 0
4641 " renaming succeeded
4642 let fname= newname
4643 else
4644 " renaming failed
4645 let fname= s:netrw_tmpfile
4646 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00004647 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004648" call Decho("(local) a:remote=".a:remote.": handling local copy of <".a:fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004649 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004650 " special ~ handler for local
4651 if fname =~ '^\~' && expand("$HOME") != ""
4652" call Decho('invoking special ~ handler')
4653 let fname= substitute(fname,'^\~',expand("$HOME"),'')
4654 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004655 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004656" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004657" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
4658
4659 " set up redirection
4660 if &srr =~ "%s"
4661 if (has("win32") || has("win95") || has("win64") || has("win16"))
4662 let redir= substitute(&srr,"%s","nul","")
4663 else
4664 let redir= substitute(&srr,"%s","/dev/null","")
4665 endif
4666 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
4667 let redir= &srr . "nul"
4668 else
4669 let redir= &srr . "/dev/null"
4670 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004671" call Decho("set up redirection: redir{".redir."} srr{".&srr."}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004672
4673 " extract any viewing options. Assumes that they're set apart by quotes.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004674" call Decho("extract any viewing options")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004675 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004676" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004677 if g:netrw_browsex_viewer =~ '\s'
4678 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
4679 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
4680 let oviewer = ''
4681 let cnt = 1
4682 while !executable(viewer) && viewer != oviewer
4683 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
4684 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
4685 let cnt = cnt + 1
4686 let oviewer = viewer
4687" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
4688 endwhile
4689 else
4690 let viewer = g:netrw_browsex_viewer
4691 let viewopt = ""
4692 endif
4693" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
4694 endif
4695
4696 " execute the file handler
Bram Moolenaar97d62492012-11-15 21:28:22 +01004697" call Decho("execute the file handler (if any)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004698 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
4699" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
4700 let ret= netrwFileHandlers#Invoke(exten,fname)
4701
4702 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
4703" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004704" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
4705 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004706 let ret= v:shell_error
4707
4708 elseif has("win32") || has("win64")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004709" call Decho("windows")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004710 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004711" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4712 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004713 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004714" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4715 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004716 else
4717 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4718 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004719 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4720 let ret= v:shell_error
4721
Bram Moolenaar97d62492012-11-15 21:28:22 +01004722 elseif has("win32unix")
4723 let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
4724" call Decho("cygwin: winfname<".shellescape(winfname,1).">")
4725 if executable("start")
4726" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4727 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4728 elseif executable("rundll32")
4729" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4730 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4731 else
4732 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4733 endif
4734 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4735 let ret= v:shell_error
4736
4737 elseif has("unix") && executable("xdg-open") && !s:haskdeinit
4738" call Decho("unix and xdg-open")
4739" call Decho("exe sil !xdg-open ".shellescape(fname,1)." ".redir)
4740 exe "sil !xdg-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004741 let ret= v:shell_error
4742
4743 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar97d62492012-11-15 21:28:22 +01004744" call Decho("unix and kfmclient")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004745" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004746 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004747 let ret= v:shell_error
4748
4749 elseif has("macunix") && executable("open")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004750" call Decho("macunix and open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004751" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004752 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004753 let ret= v:shell_error
4754
4755 else
4756 " netrwFileHandlers#Invoke() always returns 0
4757 let ret= netrwFileHandlers#Invoke(exten,fname)
4758 endif
4759
4760 " if unsuccessful, attempt netrwFileHandlers#Invoke()
4761 if ret
4762 let ret= netrwFileHandlers#Invoke(exten,fname)
4763 endif
4764
Bram Moolenaarc236c162008-07-13 17:41:49 +00004765 " restoring redraw! after external file handlers
4766 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00004767
4768 " cleanup: remove temporary file,
4769 " delete current buffer if success with handler,
4770 " return to prior buffer (directory listing)
4771 " Feb 12, 2008: had to de-activiate removal of
4772 " temporary file because it wasn't getting seen.
4773" if a:remote == 1 && fname != a:fname
Bram Moolenaar97d62492012-11-15 21:28:22 +01004774"" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004775" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004776" endif
4777
4778 if a:remote == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004779 setl bh=delete bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00004780 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004781 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004782 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004783 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004784" redraw!
4785 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004786 call netrw#NetrwRestorePosn(screenposn)
4787 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004788
4789" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004790endfun
4791
4792" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004793" s:NetrwChgPerm: (implements "gp") change file permission {{{2
4794fun! s:NetrwChgPerm(islocal,curdir)
4795" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004796 let ykeep = @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004797 call inputsave()
4798 let newperm= input("Enter new permission: ")
4799 call inputrestore()
4800 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
4801 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
4802" call Decho("chgperm<".chgperm.">")
4803 call system(chgperm)
4804 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004805 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004806 endif
4807 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02004808 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004809 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004810 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004811" call Dret("s:NetrwChgPerm")
4812endfun
4813
4814" ---------------------------------------------------------------------
4815" s:NetrwClearExplore: clear explore variables (if any) {{{2
4816fun! s:NetrwClearExplore()
4817" call Dfunc("s:NetrwClearExplore()")
4818 2match none
4819 if exists("s:explore_match") |unlet s:explore_match |endif
4820 if exists("s:explore_indx") |unlet s:explore_indx |endif
4821 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
4822 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
4823 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
4824 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
4825 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
4826 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
4827 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
4828" redraw!
4829 echo " "
4830 echo " "
4831" call Dret("s:NetrwClearExplore")
4832endfun
4833
4834" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004835" s:NetrwExploreListUniq: {{{2
4836fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02004837" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004838
4839 " this assumes that the list is already sorted
4840 let newexplist= []
4841 for member in a:explist
4842 if !exists("uniqmember") || member != uniqmember
4843 let uniqmember = member
4844 let newexplist = newexplist + [ member ]
4845 endif
4846 endfor
4847
Bram Moolenaar15146672011-10-20 22:22:38 +02004848" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004849 return newexplist
4850endfun
4851
4852" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004853" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4854fun! s:NetrwForceChgDir(islocal,newdir)
4855" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004856 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02004857 if a:newdir !~ '/$'
4858 " ok, looks like force is needed to get directory-style treatment
4859 if a:newdir =~ '@$'
4860 let newdir= substitute(a:newdir,'@$','/','')
4861 elseif a:newdir =~ '[*=|\\]$'
4862 let newdir= substitute(a:newdir,'.$','/','')
4863 else
4864 let newdir= a:newdir.'/'
4865 endif
4866" call Decho("adjusting newdir<".newdir."> due to gd")
4867 else
4868 " should already be getting treatment as a directory
4869 let newdir= a:newdir
4870 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004871 let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004872 call s:NetrwBrowse(a:islocal,newdir)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004873 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02004874" call Dret("s:NetrwForceChgDir")
4875endfun
4876
4877" ---------------------------------------------------------------------
4878" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4879fun! s:NetrwForceFile(islocal,newfile)
Bram Moolenaarff034192013-04-24 18:51:19 +02004880" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004881 if a:newfile =~ '[/@*=|\\]$'
4882 let newfile= substitute(a:newfile,'.$','','')
4883 else
4884 let newfile= a:newfile
4885 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004886 if a:islocal
4887 call s:NetrwBrowseChgDir(a:islocal,newfile)
4888 else
4889 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
4890 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004891" call Dret("s:NetrwForceFile")
4892endfun
4893
4894" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004895" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4896" and switches the hiding mode. The actual hiding is done by
4897" s:NetrwListHide().
4898" g:netrw_hide= 0: show all
4899" 1: show not-hidden files
4900" 2: show hidden files only
4901fun! s:NetrwHide(islocal)
4902" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004903 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004904 let svpos= netrw#NetrwSavePosn()
4905
4906 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4907" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4908" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4909
4910 " hide the files in the markfile list
4911 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02004912" 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 +00004913 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4914 " remove fname from hiding list
4915 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4916 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4917 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4918" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4919 else
4920 " append fname to hiding list
4921 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4922 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4923 else
4924 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4925 endif
4926" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4927 endif
4928 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004929 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004930 let g:netrw_hide= 1
4931
4932 else
4933
4934 " switch between show-all/show-not-hidden/show-hidden
4935 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004936 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004937 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004938 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004939 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004940" call Dret("NetrwHide")
4941 return
4942 endif
4943 endif
4944
Bram Moolenaaradc21822011-04-01 18:03:16 +02004945 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4946 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004947 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004948" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004949endfun
4950
4951" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004952" s:NetrwHidden: invoked by "gh" {{{2
4953fun! s:NetrwHidden(islocal)
4954" call Dfunc("s:NetrwHidden()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004955 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004956 " save current position
4957 let svpos= netrw#NetrwSavePosn()
4958
4959 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4960 " remove pattern from hiding list
4961 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004962 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004963 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4964 else
4965 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4966 endif
4967
4968 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004969 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4970 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004971 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004972" call Dret("s:NetrwHidden")
4973endfun
4974
4975" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004976" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4977fun! s:NetrwHome()
4978 if exists("g:netrw_home")
4979 let home= g:netrw_home
4980 else
4981 " go to vim plugin home
4982 for home in split(&rtp,',') + ['']
4983 if isdirectory(home) && filewritable(home) | break | endif
4984 let basehome= substitute(home,'[/\\]\.vim$','','')
4985 if isdirectory(basehome) && filewritable(basehome)
4986 let home= basehome."/.vim"
4987 break
4988 endif
4989 endfor
4990 if home == ""
4991 " just pick the first directory
4992 let home= substitute(&rtp,',.*$','','')
4993 endif
4994 if (has("win32") || has("win95") || has("win64") || has("win16"))
4995 let home= substitute(home,'/','\\','g')
4996 endif
4997 endif
4998 " insure that the home directory exists
Bram Moolenaarff034192013-04-24 18:51:19 +02004999 if g:netrw_dirhistmax > 0 && !isdirectory(home)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005000 if exists("g:netrw_mkdir")
5001 call system(g:netrw_mkdir." ".shellescape(home))
5002 else
5003 call mkdir(home)
5004 endif
5005 endif
5006 let g:netrw_home= home
5007 return home
5008endfun
5009
5010" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005011" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
5012fun! s:NetrwLeftmouse(islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02005013 if exists("s:netrwdrag")
5014 return
5015 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005016" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005017
Bram Moolenaar97d62492012-11-15 21:28:22 +01005018 let ykeep= @@
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005019 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02005020 while getchar(0) != 0
5021 "clear the input stream
5022 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005023 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005024 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005025 let mouse_lnum = v:mouse_lnum
5026 let wlastline = line('w$')
5027 let lastline = line('$')
5028" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
5029" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
5030 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
5031 " appears to be a status bar leftmouse click
Bram Moolenaar97d62492012-11-15 21:28:22 +01005032 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005033" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
5034 return
5035 endif
5036 if v:mouse_col != col('.')
Bram Moolenaar97d62492012-11-15 21:28:22 +01005037 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005038" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
5039 return
5040 endif
5041
Bram Moolenaar446cb832008-06-24 21:56:24 +00005042 if a:islocal
5043 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005044 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005045 endif
5046 else
5047 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005048 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005049 endif
5050 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005051 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005052" call Dret("s:NetrwLeftmouse")
5053endfun
5054
5055" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02005056" s:NetrwRightdrag: {{{2
5057"DechoTabOn
5058fun! s:NetrwRightdrag(islocal)
5059" call Dfunc("s:NetrwRightdrag(islocal=".a:islocal.")")
5060 if !exists("s:netrwdrag")
5061 let s:netrwdrag = winnr()
5062 call s:NetrwMarkFile(a:islocal,s:NetrwGetWord())
5063 if a:islocal
5064 nno <silent> <s-rightrelease> <leftmouse>:<c-u>call <SID>NetrwRightrelease(1)<cr>
5065 else
5066 nno <silent> <s-rightrelease> <leftmouse>:<c-u>call <SID>NetrwRightrelease(0)<cr>
5067 endif
5068 endif
5069" call Dret("s:NetrwRightdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5070endfun
5071
5072" ---------------------------------------------------------------------
5073" s:NetrwRightrelease: {{{2
5074fun! s:NetrwRightrelease(islocal)
5075" call Dfunc("s:NetrwRightrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5076 if exists("s:netrwdrag")
5077 nunmap <s-rightrelease>
5078 let tgt = s:NetrwGetWord()
5079" call Decho("target#1: ".tgt)
5080 if tgt =~ '/$' && tgt !~ '^\./$'
5081 let tgt = b:netrw_curdir."/".tgt
5082 else
5083 let tgt= b:netrw_curdir
5084 endif
5085" call Decho("target#2: ".tgt)
5086 call netrw#NetrwMakeTgt(tgt)
5087 let curwin= winnr()
5088 exe s:netrwdrag."wincmd w"
5089 call s:NetrwMarkFileMove(a:islocal)
5090 exe curwin."wincmd w"
5091 unlet s:netrwdrag
5092 endif
5093" call Dret("s:NetrwRightrelease")
5094endfun
5095
5096" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005097" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
5098" separated patterns given in g:netrw_list_hide
5099fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005100" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005101 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005102
5103 " find a character not in the "hide" string to use as a separator for :g and :v commands
5104 " How-it-works: take the hiding command, convert it into a range. Duplicate
5105 " characters don't matter. Remove all such characters from the '/~...90'
5106 " string. Use the first character left as a separator character.
5107 let listhide= g:netrw_list_hide
5108 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
5109" call Decho("sep=".sep)
5110
5111 while listhide != ""
5112 if listhide =~ ','
5113 let hide = substitute(listhide,',.*$','','e')
5114 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
5115 else
5116 let hide = listhide
5117 let listhide = ""
5118 endif
5119
5120 " Prune the list by hiding any files which match
5121 if g:netrw_hide == 1
5122" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005123 exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005124 elseif g:netrw_hide == 2
5125" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005126 exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005127 endif
5128 endwhile
5129 if g:netrw_hide == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01005130 exe 'sil! keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
5131 exe 'sil! keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005132 endif
5133
Bram Moolenaaradc21822011-04-01 18:03:16 +02005134 " remove any blank lines that have somehow remained.
5135 " This seems to happen under Windows.
5136 exe 'sil! keepj 1,$g@^\s*$@d'
5137
Bram Moolenaar97d62492012-11-15 21:28:22 +01005138 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005139" call Dret("NetrwListHide")
5140endfun
5141
5142" ---------------------------------------------------------------------
5143" NetrwHideEdit: allows user to edit the file/directory hiding list
5144fun! s:NetrwHideEdit(islocal)
5145" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
5146
Bram Moolenaar97d62492012-11-15 21:28:22 +01005147 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005148 " save current cursor position
5149 let svpos= netrw#NetrwSavePosn()
5150
5151 " get new hiding list from user
5152 call inputsave()
5153 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
5154 call inputrestore()
5155 let g:netrw_list_hide= newhide
5156" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
5157
5158 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005159 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005160
5161 " restore cursor position
5162 call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005163 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005164
5165" call Dret("NetrwHideEdit")
5166endfun
5167
5168" ---------------------------------------------------------------------
5169" NetSortSequence: allows user to edit the sorting sequence
5170fun! s:NetSortSequence(islocal)
5171" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
5172
Bram Moolenaar97d62492012-11-15 21:28:22 +01005173 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005174 let svpos= netrw#NetrwSavePosn()
5175 call inputsave()
5176 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
5177 call inputrestore()
5178
5179 " refresh the listing
5180 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02005181 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5182 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005183 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005184
5185" call Dret("NetSortSequence")
5186endfun
5187
5188" ---------------------------------------------------------------------
5189" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
5190fun! s:NetrwMakeDir(usrhost)
5191" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
5192
Bram Moolenaar97d62492012-11-15 21:28:22 +01005193 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005194 " get name of new directory from user. A bare <CR> will skip.
5195 " if its currently a directory, also request will be skipped, but with
5196 " a message.
5197 call inputsave()
5198 let newdirname= input("Please give directory name: ")
5199 call inputrestore()
5200" call Decho("newdirname<".newdirname.">")
5201
5202 if newdirname == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01005203 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005204" call Dret("NetrwMakeDir : user aborted with bare <cr>")
5205 return
5206 endif
5207
5208 if a:usrhost == ""
5209" call Decho("local mkdir")
5210
5211 " Local mkdir:
5212 " sanity checks
5213 let fullnewdir= b:netrw_curdir.'/'.newdirname
5214" call Decho("fullnewdir<".fullnewdir.">")
5215 if isdirectory(fullnewdir)
5216 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005217 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005218 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005219 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005220" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
5221 return
5222 endif
5223 if s:FileReadable(fullnewdir)
5224 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005225 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005226 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005227 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005228" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
5229 return
5230 endif
5231
5232 " requested new local directory is neither a pre-existing file or
5233 " directory, so make it!
5234 if exists("*mkdir")
5235 call mkdir(fullnewdir,"p")
5236 else
5237 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005238 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005239" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005240" call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5241 exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005242 if v:shell_error != 0
5243 let @@= ykeep
5244 call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5245" call Dret("NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5246 return
5247 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005248 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005249 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005250" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
5251 endif
5252 endif
5253
5254 if v:shell_error == 0
5255 " refresh listing
5256" call Decho("refresh listing")
5257 let svpos= netrw#NetrwSavePosn()
5258 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
5259 call netrw#NetrwRestorePosn(svpos)
5260 elseif !exists("g:netrw_quiet")
5261 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
5262 endif
5263" redraw!
5264
5265 elseif !exists("b:netrw_method") || b:netrw_method == 4
5266 " Remote mkdir:
5267" call Decho("remote mkdir")
5268 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
5269 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02005270" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005271 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005272 if v:shell_error == 0
5273 " refresh listing
5274 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005275 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5276 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005277 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005278 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005279 endif
5280" redraw!
5281
5282 elseif b:netrw_method == 2
Bram Moolenaar15146672011-10-20 22:22:38 +02005283 let svpos= netrw#NetrwSavePosn()
5284 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5285 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5286 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005287 elseif b:netrw_method == 3
Bram Moolenaar15146672011-10-20 22:22:38 +02005288 let svpos= netrw#NetrwSavePosn()
5289 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5290 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5291 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005292 endif
5293
Bram Moolenaar97d62492012-11-15 21:28:22 +01005294 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005295" call Dret("NetrwMakeDir")
5296endfun
5297
5298" ---------------------------------------------------------------------
5299" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
5300" mark and unmark files. If a markfile list exists,
5301" then the rename and delete functions will use it instead
5302" of whatever may happen to be under the cursor at that
5303" moment. When the mouse and gui are available,
5304" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005305"
5306" Creates two lists
5307" s:netrwmarkfilelist -- holds complete paths to all marked files
5308" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
5309"
5310" Creates a marked file match string
5311" s:netrwmarfilemtch_# -- used with 2match to display marked files
5312"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005313" Creates a buffer version of islocal
5314" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00005315fun! s:NetrwMarkFile(islocal,fname)
5316" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaarff034192013-04-24 18:51:19 +02005317
5318 " sanity check
5319 if empty(a:fname)
5320" call Dret("s:NetrwMarkFile : emtpy fname")
5321 return
5322 endif
5323
Bram Moolenaar97d62492012-11-15 21:28:22 +01005324 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005325 let curbufnr= bufnr("%")
5326 let curdir = b:netrw_curdir
Bram Moolenaar97d62492012-11-15 21:28:22 +01005327 let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)'
Bram Moolenaaradc21822011-04-01 18:03:16 +02005328
Bram Moolenaar446cb832008-06-24 21:56:24 +00005329 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005330 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00005331" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5332" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005333 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00005334
5335 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005336 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005337" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5338 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005339 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005340
5341 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005342 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005343" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5344 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
5345 if s:netrwmarkfilelist_{curbufnr} == []
5346 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01005347" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005348 call s:NetrwUnmarkList(curbufnr,curdir)
5349 else
5350 " rebuild match list to display markings correctly
5351" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
5352 let s:netrwmarkfilemtch_{curbufnr}= ""
5353 let first = 1
5354 for fname in s:netrwmarkfilelist_{curbufnr}
5355 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01005356 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005357 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005358 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005359 endif
5360 let first= 0
5361 endfor
Bram Moolenaar15146672011-10-20 22:22:38 +02005362" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005363 endif
5364 endif
5365
5366 else
5367 " initialize new markfilelist
5368
5369" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
5370 let s:netrwmarkfilelist_{curbufnr}= []
5371 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
5372" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5373
5374 " build initial markfile matching pattern
5375 if a:fname =~ '/$'
5376 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
5377 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005378 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005379 endif
5380" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
5381 endif
5382
5383 " handle global markfilelist
5384 if exists("s:netrwmarkfilelist")
5385 let dname= s:ComposePath(b:netrw_curdir,a:fname)
5386 if index(s:netrwmarkfilelist,dname) == -1
5387 " append new filename to global markfilelist
5388 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5389" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
5390 else
5391 " remove new filename from global markfilelist
5392" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
5393 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
5394" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
5395 if s:netrwmarkfilelist == []
5396 unlet s:netrwmarkfilelist
5397 endif
5398 endif
5399 else
5400 " initialize new global-directory markfilelist
5401 let s:netrwmarkfilelist= []
5402 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5403" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
5404 endif
5405
5406 " set up 2match'ing to netrwmarkfilemtch list
5407 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
5408" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005409 if exists("g:did_drchip_netrwlist_syntax")
5410 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
5411 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005412 else
5413" call Decho("2match none")
5414 2match none
5415 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005416 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02005417" 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 +00005418endfun
5419
5420" ---------------------------------------------------------------------
5421" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
5422" compress/decompress files using the programs
5423" in g:netrw_compress and g:netrw_uncompress,
5424" using g:netrw_compress_suffix to know which to
5425" do. By default:
5426" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005427" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00005428fun! s:NetrwMarkFileCompress(islocal)
5429" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
5430 let svpos = netrw#NetrwSavePosn()
5431 let curdir = b:netrw_curdir
5432 let curbufnr = bufnr("%")
5433
Bram Moolenaarff034192013-04-24 18:51:19 +02005434 " sanity check
5435 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5436 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5437" call Dret("s:NetrwMarkFileCompress")
5438 return
5439 endif
5440" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5441
Bram Moolenaar446cb832008-06-24 21:56:24 +00005442 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
Bram Moolenaarff034192013-04-24 18:51:19 +02005443
5444 " for every filename in the marked list
Bram Moolenaar446cb832008-06-24 21:56:24 +00005445 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaarff034192013-04-24 18:51:19 +02005446 let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
5447" call Decho("extracted sfx<".sfx.">")
5448 if exists("g:netrw_decompress['".sfx."']")
5449 " fname has a suffix indicating that its compressed; apply associated decompression routine
5450 let exe= g:netrw_decompress[sfx]
5451" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
5452 let exe= netrw#WinPath(exe)
5453 if a:islocal
5454 if g:netrw_keepdir
5455 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005456 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005457 else
5458 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005459 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005460 if executable(exe)
5461 if a:islocal
5462 call system(exe." ".fname)
5463 else
5464 keepj call s:RemoteSystem(exe." ".fname)
5465 endif
5466 else
5467 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
5468 endif
5469 endif
5470 unlet sfx
5471
Bram Moolenaar446cb832008-06-24 21:56:24 +00005472 if exists("exe")
5473 unlet exe
5474 elseif a:islocal
5475 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01005476 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005477 else
5478 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02005479 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005480 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005481 endfor " for every file in the marked list
5482
Bram Moolenaar446cb832008-06-24 21:56:24 +00005483 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005484 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5485 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005486 endif
5487" call Dret("s:NetrwMarkFileCompress")
5488endfun
5489
5490" ---------------------------------------------------------------------
5491" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
5492" If no marked files, then set up directory as the
5493" target. Currently does not support copying entire
5494" directories. Uses the local-buffer marked file list.
5495" Returns 1=success (used by NetrwMarkFileMove())
5496" 0=failure
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005497fun! s:NetrwMarkFileCopy(islocal,...)
5498" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0)
5499
5500 if !exists("b:netrw_curdir")
5501 let b:netrw_curdir= getcwd()
5502" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
5503 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005504 let curdir = b:netrw_curdir
5505 let curbufnr = bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005506
Bram Moolenaarff034192013-04-24 18:51:19 +02005507 " sanity check
5508 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5509 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5510" call Dret("s:NetrwMarkFileCopy")
5511 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005512 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005513" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5514
Bram Moolenaar446cb832008-06-24 21:56:24 +00005515 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02005516 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005517" call Dret("s:NetrwMarkFileCopy 0")
5518 return 0
5519 endif
5520" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005521
5522 if a:islocal && s:netrwmftgt_islocal
5523 " Copy marked files, local directory to local directory
5524" call Decho("copy from local to local")
Bram Moolenaarff034192013-04-24 18:51:19 +02005525 if !executable(g:netrw_localcopycmd) && g:netrw_localcopycmd !~ '\<cmd\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01005526 call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
5527" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
5528 return
5529 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005530
5531 " copy marked files while within the same directory (ie. allow renaming)
5532 if simplify(s:netrwmftgt) == simplify(b:netrw_curdir)
5533 if len(s:netrwmarkfilelist_{bufnr('%')}) == 1
5534 " only one marked file
5535 let args = shellescape(b:netrw_curdir."/".s:netrwmarkfilelist_{bufnr('%')}[0])
5536 let oldname = s:netrwmarkfilelist_{bufnr('%')}[0]
5537 elseif a:0 == 1
5538 " this happens when the next case was used to recursively call s:NetrwMarkFileCopy()
5539 let args = shellescape(b:netrw_curdir."/".a:1)
5540 let oldname = a:1
5541 else
5542 " copy multiple marked files inside the same directory
5543 let s:recursive= 1
5544 for oldname in s:netrwmarkfilelist_{bufnr("%")}
5545 let ret= s:NetrwMarkFileCopy(a:islocal,oldname)
5546 if ret == 0
5547 break
5548 endif
5549 endfor
5550 unlet s:recursive
5551 call s:NetrwUnmarkList(curbufnr,curdir)
5552" call Dret("s:NetrwMarkFileCopy ".ret)
5553 return ret
5554 endif
5555
5556 call inputsave()
5557 let newname= input("Copy ".oldname." to : ",oldname,"file")
5558 call inputrestore()
5559 if newname == ""
5560" call Dret("s:NetrwMarkFileCopy 0")
5561 return 0
5562 endif
5563 let args= shellescape(oldname)
5564 let tgt = shellescape(s:netrwmftgt.'/'.newname)
5565 else
5566 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
5567 let tgt = shellescape(s:netrwmftgt)
5568 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005569 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
5570 let args= substitute(args,'/','\\','g')
5571 let tgt = substitute(tgt, '/','\\','g')
5572 endif
5573 if g:netrw_localcopycmd =~ '\s'
5574 let copycmd = substitute(g:netrw_localcopycmd,'\s.*$','','')
5575 let copycmdargs = substitute(g:netrw_localcopycmd,'^.\{-}\(\s.*\)$','\1','')
5576 let copycmd = netrw#WinPath(copycmd).copycmdargs
5577 else
5578 let copycmd = netrw#WinPath(g:netrw_localcopycmd)
5579 endif
5580" call Decho("args <".args.">")
5581" call Decho("tgt <".tgt.">")
5582" call Decho("copycmd<".copycmd.">")
5583" call Decho("system(".copycmd." ".args." ".tgt.")")
5584 call system(copycmd." ".args." ".tgt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005585 if v:shell_error != 0
Bram Moolenaarff034192013-04-24 18:51:19 +02005586 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 +01005587" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt))
5588 return 0
5589 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005590
5591 elseif a:islocal && !s:netrwmftgt_islocal
5592 " Copy marked files, local directory to remote directory
5593" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005594 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005595
5596 elseif !a:islocal && s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005597 " Copy marked files, remote directory to local directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00005598" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005599 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005600
5601 elseif !a:islocal && !s:netrwmftgt_islocal
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005602 " Copy marked files, remote directory to remote directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00005603" call Decho("copy from remote to remote")
5604 let curdir = getcwd()
5605 let tmpdir = s:GetTempfile("")
5606 if tmpdir !~ '/'
5607 let tmpdir= curdir."/".tmpdir
5608 endif
5609 if exists("*mkdir")
5610 call mkdir(tmpdir)
5611 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005612 exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005613 if v:shell_error != 0
5614 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5615" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1) )
5616 return
5617 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005618 endif
5619 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005620 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005621 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005622 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02005623 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005624 if getcwd() == tmpdir
5625 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005626 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005627 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005628 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005629 exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005630 if v:shell_error != 0
5631 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",80)
5632" call Dret("s:NetrwMarkFileCopy : failed: sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1) )
5633 return
5634 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005635 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005636 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005637 endif
5638 endif
5639 endif
5640
5641 " -------
5642 " cleanup
5643 " -------
Bram Moolenaare6ae6222013-05-21 21:01:10 +02005644" call Decho("cleanup")
5645 if !exists("s:recursive")
5646 " remove markings from local buffer
5647 call s:NetrwUnmarkList(curbufnr,curdir)
5648 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005649
5650 " refresh buffers
5651 if !s:netrwmftgt_islocal
5652 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
5653 endif
5654 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005655 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005656 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005657 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005658 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005659 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005660
5661" call Dret("s:NetrwMarkFileCopy 1")
5662 return 1
5663endfun
5664
5665" ---------------------------------------------------------------------
5666" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
5667" invoke vim's diff mode on the marked files.
5668" Either two or three files can be so handled.
5669" Uses the global marked file list.
5670fun! s:NetrwMarkFileDiff(islocal)
5671" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
5672 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005673
Bram Moolenaarff034192013-04-24 18:51:19 +02005674 " sanity check
5675 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5676 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5677" call Dret("s:NetrwMarkFileDiff")
5678 return
5679 endif
5680" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5681
5682 if exists("s:netrwmarkfilelist_{."curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005683 let cnt = 0
5684 let curdir = b:netrw_curdir
5685 for fname in s:netrwmarkfilelist
5686 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005687 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005688" call Decho("diffthis: fname<".fname.">")
5689 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005690 diffthis
5691 elseif cnt == 2 || cnt == 3
5692 vsplit
5693 wincmd l
5694" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005695 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005696 diffthis
5697 else
5698 break
5699 endif
5700 endfor
5701 call s:NetrwUnmarkList(curbufnr,curdir)
5702 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005703
Bram Moolenaar446cb832008-06-24 21:56:24 +00005704" call Dret("s:NetrwMarkFileDiff")
5705endfun
5706
5707" ---------------------------------------------------------------------
5708" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
5709" Uses global markfilelist
5710fun! s:NetrwMarkFileEdit(islocal)
5711" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
5712
5713 let curdir = b:netrw_curdir
5714 let curbufnr = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02005715
5716 " sanity check
5717 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5718 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5719" call Dret("s:NetrwMarkFileEdit")
5720 return
5721 endif
5722" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5723
Bram Moolenaar446cb832008-06-24 21:56:24 +00005724 if exists("s:netrwmarkfilelist_{curbufnr}")
5725 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005726 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005727 " unmark markedfile list
5728" call s:NetrwUnmarkList(curbufnr,curdir)
5729 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005730" call Decho("exe sil args ".flist)
5731 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005732 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005733 echo "(use :bn, :bp to navigate files; :Rex to return)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005734
5735" call Dret("s:NetrwMarkFileEdit")
5736endfun
5737
5738" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02005739" s:NetrwMarkFileQFEL: convert a quickfix-error list into a marked file list {{{2
5740fun! s:NetrwMarkFileQFEL(islocal,qfel)
5741" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
5742 call s:NetrwUnmarkAll()
5743 let curbufnr= bufnr("%")
5744
5745 if !empty(a:qfel)
5746 for entry in a:qfel
5747 let bufnmbr= entry["bufnr"]
5748" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"])
5749 if !exists("s:netrwmarkfilelist_{curbufnr}")
5750" call Decho("case: no marked file list")
5751 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5752 elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
5753 " s:NetrwMarkFile will remove duplicate entries from the marked file list.
5754 " So, this test lets two or more hits on the same pattern to be ignored.
5755" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list")
5756 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5757 else
5758" call Decho("case: ".bufname(bufnmbr)." already in marked file list")
5759 endif
5760 endfor
5761 echo "(use me to edit marked files)"
5762 else
5763 call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
5764 endif
5765
5766" call Dret("s:NetrwMarkFileQFEL")
5767endfun
5768
5769" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005770" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005771" Uses the local marked-file list.
5772fun! s:NetrwMarkFileExe(islocal)
5773" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
5774 let svpos = netrw#NetrwSavePosn()
5775 let curdir = b:netrw_curdir
5776 let curbufnr = bufnr("%")
5777
Bram Moolenaarff034192013-04-24 18:51:19 +02005778 " sanity check
5779 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5780 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5781" call Dret("s:NetrwMarkFileExe")
5782 return
5783 endif
5784" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5785
Bram Moolenaar446cb832008-06-24 21:56:24 +00005786 if exists("s:netrwmarkfilelist_{curbufnr}")
5787 " get the command
5788 call inputsave()
5789 let cmd= input("Enter command: ","","file")
5790 call inputrestore()
5791" call Decho("cmd<".cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02005792 if cmd == ""
5793" " call Dret("s:NetrwMarkFileExe : early exit, empty command")
5794 return
5795 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005796
5797 " apply command to marked files. Substitute: filename -> %
5798 " If no %, then append a space and the filename to the command
5799 for fname in s:netrwmarkfilelist_{curbufnr}
5800 if a:islocal
5801 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01005802 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005803 endif
5804 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005805 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005806 endif
5807 if cmd =~ '%'
5808 let xcmd= substitute(cmd,'%',fname,'g')
5809 else
5810 let xcmd= cmd.' '.fname
5811 endif
5812 if a:islocal
5813" call Decho("local: xcmd<".xcmd.">")
5814 let ret= system(xcmd)
5815 else
5816" call Decho("remote: xcmd<".xcmd.">")
5817 let ret= s:RemoteSystem(xcmd)
5818 endif
5819 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02005820 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005821 break
5822 else
5823 echo ret
5824 endif
5825 endfor
5826
5827 " unmark marked file list
5828 call s:NetrwUnmarkList(curbufnr,curdir)
5829
5830 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005831 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5832 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005833 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005834 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005835 endif
5836
5837" call Dret("s:NetrwMarkFileExe")
5838endfun
5839
5840" ---------------------------------------------------------------------
5841" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5842" as the marked file(s) (toggles suffix presence)
5843" Uses the local marked file list.
5844fun! s:NetrwMarkHideSfx(islocal)
5845" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5846 let svpos = netrw#NetrwSavePosn()
5847 let curbufnr = bufnr("%")
5848
5849 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5850 if exists("s:netrwmarkfilelist_{curbufnr}")
5851
5852 for fname in s:netrwmarkfilelist_{curbufnr}
5853" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5854 " construct suffix pattern
5855 if fname =~ '\.'
5856 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5857 else
5858 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5859 endif
5860 " determine if its in the hiding list or not
5861 let inhidelist= 0
5862 if g:netrw_list_hide != ""
5863 let itemnum = 0
5864 let hidelist= split(g:netrw_list_hide,',')
5865 for hidepat in hidelist
5866 if sfxpat == hidepat
5867 let inhidelist= 1
5868 break
5869 endif
5870 let itemnum= itemnum + 1
5871 endfor
5872 endif
5873" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5874 if inhidelist
5875 " remove sfxpat from list
5876 call remove(hidelist,itemnum)
5877 let g:netrw_list_hide= join(hidelist,",")
5878 elseif g:netrw_list_hide != ""
5879 " append sfxpat to non-empty list
5880 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5881 else
5882 " set hiding list to sfxpat
5883 let g:netrw_list_hide= sfxpat
5884 endif
5885 endfor
5886
5887 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005888 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5889 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005890 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005891 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005892 endif
5893
5894" call Dret("s:NetrwMarkHideSfx")
5895endfun
5896
5897" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005898" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
5899" Uses the local marked-file list.
5900fun! s:NetrwMarkFileVimCmd(islocal)
5901" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
5902 let svpos = netrw#NetrwSavePosn()
5903 let curdir = b:netrw_curdir
5904 let curbufnr = bufnr("%")
5905
Bram Moolenaarff034192013-04-24 18:51:19 +02005906 " sanity check
5907 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5908 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5909" call Dret("s:NetrwMarkFileVimCmd")
5910 return
5911 endif
5912" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5913
Bram Moolenaar15146672011-10-20 22:22:38 +02005914 if exists("s:netrwmarkfilelist_{curbufnr}")
5915 " get the command
5916 call inputsave()
5917 let cmd= input("Enter vim command: ","","file")
5918 call inputrestore()
5919" call Decho("cmd<".cmd.">")
5920 if cmd == ""
5921" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
5922 return
5923 endif
5924
5925 " apply command to marked files. Substitute: filename -> %
5926 " If no %, then append a space and the filename to the command
5927 for fname in s:netrwmarkfilelist_{curbufnr}
5928" call Decho("fname<".fname.">")
5929 if a:islocal
5930 1split
5931 exe "sil! keepalt e ".fnameescape(fname)
5932" call Decho("local<".fname.">: exe ".cmd)
5933 exe cmd
5934 exe "sil! keepalt wq!"
5935 else
Bram Moolenaar15146672011-10-20 22:22:38 +02005936" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
5937 echo "sorry, \"mX\" not supported yet for remote files"
5938 endif
5939 endfor
5940
5941 " unmark marked file list
5942 call s:NetrwUnmarkList(curbufnr,curdir)
5943
5944 " refresh the listing
5945 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5946 keepj call netrw#NetrwRestorePosn(svpos)
5947 else
5948 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5949 endif
5950
5951" call Dret("s:NetrwMarkFileVimCmd")
5952endfun
5953
5954" ---------------------------------------------------------------------
5955" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5956" as the marked file(s) (toggles suffix presence)
5957" Uses the local marked file list.
5958fun! s:NetrwMarkHideSfx(islocal)
5959" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5960 let svpos = netrw#NetrwSavePosn()
5961 let curbufnr = bufnr("%")
5962
5963 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5964 if exists("s:netrwmarkfilelist_{curbufnr}")
5965
5966 for fname in s:netrwmarkfilelist_{curbufnr}
5967" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5968 " construct suffix pattern
5969 if fname =~ '\.'
5970 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5971 else
5972 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5973 endif
5974 " determine if its in the hiding list or not
5975 let inhidelist= 0
5976 if g:netrw_list_hide != ""
5977 let itemnum = 0
5978 let hidelist= split(g:netrw_list_hide,',')
5979 for hidepat in hidelist
5980 if sfxpat == hidepat
5981 let inhidelist= 1
5982 break
5983 endif
5984 let itemnum= itemnum + 1
5985 endfor
5986 endif
5987" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5988 if inhidelist
5989 " remove sfxpat from list
5990 call remove(hidelist,itemnum)
5991 let g:netrw_list_hide= join(hidelist,",")
5992 elseif g:netrw_list_hide != ""
5993 " append sfxpat to non-empty list
5994 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5995 else
5996 " set hiding list to sfxpat
5997 let g:netrw_list_hide= sfxpat
5998 endif
5999 endfor
6000
6001 " refresh the listing
6002 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6003 keepj call netrw#NetrwRestorePosn(svpos)
6004 else
6005 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
6006 endif
6007
6008" call Dret("s:NetrwMarkHideSfx")
6009endfun
6010
6011" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006012" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
6013" Uses the global markfilelist
6014fun! s:NetrwMarkFileGrep(islocal)
6015" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
6016 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006017 let curbufnr = bufnr("%")
6018
6019 if exists("s:netrwmarkfilelist")
6020" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006021 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006022 call s:NetrwUnmarkAll()
Bram Moolenaarff034192013-04-24 18:51:19 +02006023 else
6024" call Decho('no marked files, using "*"')
6025 let netrwmarkfilelist= "*"
6026 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006027
Bram Moolenaarff034192013-04-24 18:51:19 +02006028 " ask user for pattern
6029 call inputsave()
6030 let pat= input("Enter pattern: ","")
6031 call inputrestore()
6032 let patbang = ""
6033 if pat =~ '^!'
6034 let patbang = "!"
6035 let pat= strpart(pat,2)
6036 endif
6037 if pat =~ '^\i'
6038 let pat = escape(pat,'/')
6039 let pat = '/'.pat.'/'
6040 else
6041 let nonisi = pat[0]
6042 endif
6043
6044 " use vimgrep for both local and remote
6045" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist)
6046 try
6047 exe "keepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
6048 catch /^Vim\%((\a\+)\)\=:E480/
6049 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
6050" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
6051 return
6052 endtry
6053 echo "(use :cn, :cp to navigate, :Rex to return)"
6054
6055 2match none
6056 keepj call netrw#NetrwRestorePosn(svpos)
6057
6058 if exists("nonisi")
6059 " original, user-supplied pattern did not begin with a character from isident
6060" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg")
6061 if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
6062 call s:NetrwMarkFileQFEL(a:islocal,getqflist())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006063 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006064 endif
6065
6066" call Dret("s:NetrwMarkFileGrep")
6067endfun
6068
6069" ---------------------------------------------------------------------
6070" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
6071" uses the global marked file list
6072" s:netrwmfloc= 0: target directory is remote
6073" = 1: target directory is local
6074fun! s:NetrwMarkFileMove(islocal)
6075" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
6076 let curdir = b:netrw_curdir
6077 let curbufnr = bufnr("%")
6078
6079 " sanity check
Bram Moolenaarff034192013-04-24 18:51:19 +02006080 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaaradc21822011-04-01 18:03:16 +02006081 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006082" call Dret("s:NetrwMarkFileMove")
6083 return
6084 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006085" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6086
Bram Moolenaar446cb832008-06-24 21:56:24 +00006087 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006088 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006089" call Dret("s:NetrwMarkFileCopy 0")
6090 return 0
6091 endif
6092" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
6093
6094 if a:islocal && s:netrwmftgt_islocal
6095 " move: local -> local
6096" call Decho("move from local to local")
6097" call Decho("(s:NetrwMarkFileMove) local to local move")
Bram Moolenaarff034192013-04-24 18:51:19 +02006098 if !executable(g:netrw_localmovecmd) && g:netrw_localmovecmd !~ '\<cmd\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01006099 call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
6100" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
6101 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006102 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006103 let tgt = shellescape(s:netrwmftgt)
6104" call Decho("tgt<".tgt.">")
6105 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6106 let tgt = substitute(tgt, '/','\\','g')
6107" call Decho("windows exception: tgt<".tgt.">")
6108 if g:netrw_localmovecmd =~ '\s'
6109 let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','')
6110 let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
6111 let movecmd = netrw#WinPath(movecmd).movecmdargs
6112" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)")
6113 else
6114 let movecmd = netrw#WinPath(movecmd)
6115" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)")
6116 endif
6117 else
6118 let movecmd = netrw#WinPath(g:netrw_localmovecmd)
6119" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)")
6120 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006121 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02006122" call Decho("system(".movecmd." ".shellescape(fname)." ".tgt.")")
6123 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6124 let fname= substitute(fname,'/','\\','g')
6125 endif
6126 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".tgt)
6127 if v:shell_error != 0
6128 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 +01006129 break
6130 endif
6131 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00006132
6133 elseif a:islocal && !s:netrwmftgt_islocal
6134 " move: local -> remote
6135" call Decho("move from local to remote")
6136" call Decho("copy")
6137 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006138 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006139" call Decho("remove")
6140 for fname in mflist
6141 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6142 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
6143 endfor
6144 unlet mflist
6145
6146 elseif !a:islocal && s:netrwmftgt_islocal
6147 " move: remote -> local
6148" call Decho("move from remote to local")
6149" call Decho("copy")
6150 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006151 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006152" call Decho("remove")
6153 for fname in mflist
6154 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6155 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6156 endfor
6157 unlet mflist
6158
6159 elseif !a:islocal && !s:netrwmftgt_islocal
6160 " move: remote -> remote
6161" call Decho("move from remote to remote")
6162" call Decho("copy")
6163 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006164 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006165" call Decho("remove")
6166 for fname in mflist
6167 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6168 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6169 endfor
6170 unlet mflist
6171 endif
6172
6173 " -------
6174 " cleanup
6175 " -------
6176" call Decho("cleanup")
6177
6178 " remove markings from local buffer
6179 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
6180
6181 " refresh buffers
6182 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006183" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
6184 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006185 endif
6186 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006187" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
6188 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006189 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006190 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006191" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
6192 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006193 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006194
6195" call Dret("s:NetrwMarkFileMove")
6196endfun
6197
6198" ---------------------------------------------------------------------
6199" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
6200" using the hardcopy command. Local marked-file list only.
6201fun! s:NetrwMarkFilePrint(islocal)
6202" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
6203 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006204
6205 " sanity check
6206 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6207 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6208" call Dret("s:NetrwMarkFilePrint")
6209 return
6210 endif
6211" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006212 if exists("s:netrwmarkfilelist_{curbufnr}")
6213 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
6214 let curdir = b:netrw_curdir
6215 call s:NetrwUnmarkList(curbufnr,curdir)
6216 for fname in netrwmarkfilelist
6217 if a:islocal
6218 if g:netrw_keepdir
6219 let fname= s:ComposePath(curdir,fname)
6220 endif
6221 else
6222 let fname= curdir.fname
6223 endif
6224 1split
6225 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02006226" call Decho("exe sil e ".escape(fname,' '))
6227 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006228" call Decho("hardcopy")
6229 hardcopy
6230 q
6231 endfor
6232 2match none
6233 endif
6234" call Dret("s:NetrwMarkFilePrint")
6235endfun
6236
6237" ---------------------------------------------------------------------
6238" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
6239" files when given a regexp (for which a prompt is
Bram Moolenaarff034192013-04-24 18:51:19 +02006240" issued) (matches to name of files).
Bram Moolenaar446cb832008-06-24 21:56:24 +00006241fun! s:NetrwMarkFileRegexp(islocal)
6242" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
6243
6244 " get the regular expression
6245 call inputsave()
6246 let regexp= input("Enter regexp: ","","file")
6247 call inputrestore()
6248
6249 if a:islocal
6250 " get the matching list of files using local glob()
6251" call Decho("handle local regexp")
Bram Moolenaarff034192013-04-24 18:51:19 +02006252 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6253 let files = glob(s:ComposePath(dirname,regexp))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006254" call Decho("files<".files.">")
6255 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006256
6257 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01006258 for fname in filelist
6259" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006260 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006261 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00006262
6263 else
6264" call Decho("handle remote regexp")
6265
6266 " convert displayed listing into a filelist
6267 let eikeep = &ei
6268 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006269 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00006270 set ei=all ma
6271" call Decho("set ei=all ma")
6272 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02006273 keepj call s:NetrwEnew()
6274 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006275 sil keepj norm! "ap
6276 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006277 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006278 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006279 set bt=nofile
6280 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006281 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006282 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006283 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006284 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01006285 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006286 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006287 sil keepj %s/^| //e
6288 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006289 call histdel("/",-1)
6290 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006291 endif
6292 " convert regexp into the more usual glob-style format
6293 let regexp= substitute(regexp,'\*','.*','g')
6294" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006295 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01006296 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006297 let filelist= getline(1,line("$"))
6298 q!
6299 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02006300 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006301 endfor
6302 unlet filelist
6303 let @a = areg
6304 let &ei = eikeep
6305 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006306 echo " (use me to edit marked files)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006307
6308" call Dret("s:NetrwMarkFileRegexp")
6309endfun
6310
6311" ---------------------------------------------------------------------
6312" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
6313" Uses the local marked file list.
6314fun! s:NetrwMarkFileSource(islocal)
6315" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
6316 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006317
6318 " sanity check
6319 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6320 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6321" call Dret("s:NetrwMarkFileSource")
6322 return
6323 endif
6324" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006325 if exists("s:netrwmarkfilelist_{curbufnr}")
6326 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
6327 let curdir = b:netrw_curdir
6328 call s:NetrwUnmarkList(curbufnr,curdir)
6329 for fname in netrwmarkfilelist
6330 if a:islocal
6331 if g:netrw_keepdir
6332 let fname= s:ComposePath(curdir,fname)
6333 endif
6334 else
6335 let fname= curdir.fname
6336 endif
6337 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00006338" call Decho("exe so ".fnameescape(fname))
6339 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006340 endfor
6341 2match none
6342 endif
6343" call Dret("s:NetrwMarkFileSource")
6344endfun
6345
6346" ---------------------------------------------------------------------
6347" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
6348" Uses the global markfilelist
6349fun! s:NetrwMarkFileTag(islocal)
6350" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
6351 let svpos = netrw#NetrwSavePosn()
6352 let curdir = b:netrw_curdir
6353 let curbufnr = bufnr("%")
6354
Bram Moolenaarff034192013-04-24 18:51:19 +02006355 " sanity check
6356 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6357 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6358" call Dret("s:NetrwMarkFileTag")
6359 return
6360 endif
6361" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6362
Bram Moolenaar446cb832008-06-24 21:56:24 +00006363 if exists("s:netrwmarkfilelist")
6364" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006365 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006366 call s:NetrwUnmarkAll()
6367
6368 if a:islocal
6369 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006370" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
6371 call system(g:netrw_ctags." ".netrwmarkfilelist)
6372 else
6373 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
6374 endif
6375 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006376 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006377 call netrw#NetrwObtain(a:islocal,"tags")
6378 let curdir= b:netrw_curdir
6379 1split
6380 e tags
6381 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
6382" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006383 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006384 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006385 wq!
6386 endif
6387 2match none
6388 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6389 call netrw#NetrwRestorePosn(svpos)
6390 endif
6391
6392" call Dret("s:NetrwMarkFileTag")
6393endfun
6394
6395" ---------------------------------------------------------------------
6396" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
6397" Sets up two variables,
Bram Moolenaarff034192013-04-24 18:51:19 +02006398" s:netrwmftgt : holds the target directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00006399" s:netrwmftgt_islocal : 0=target directory is remote
Bram Moolenaarff034192013-04-24 18:51:19 +02006400" 1=target directory is local
Bram Moolenaar446cb832008-06-24 21:56:24 +00006401fun! s:NetrwMarkFileTgt(islocal)
6402" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
6403 let svpos = netrw#NetrwSavePosn()
6404 let curdir = b:netrw_curdir
6405 let hadtgt = exists("s:netrwmftgt")
6406 if !exists("w:netrw_bannercnt")
6407 let w:netrw_bannercnt= b:netrw_bannercnt
6408 endif
6409
6410 " set up target
6411 if line(".") < w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02006412 " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
6413 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
6414" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target")
6415 unlet s:netrwmftgt s:netrwmftgt_islocal
6416 if g:netrw_fastbrowse <= 1
6417 call s:LocalBrowseShellCmdRefresh()
6418 endif
6419 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6420 call netrw#NetrwRestorePosn(svpos)
6421" call Dret("s:NetrwMarkFileTgt : removed target")
6422 return
6423 else
6424 let s:netrwmftgt= b:netrw_curdir
6425" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
6426 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006427
6428 else
6429 " get word under cursor.
6430 " * If directory, use it for the target.
6431 " * If file, use b:netrw_curdir for the target
6432 let curword= s:NetrwGetWord()
6433 let tgtdir = s:ComposePath(curdir,curword)
6434 if a:islocal && isdirectory(tgtdir)
6435 let s:netrwmftgt = tgtdir
6436" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
6437 elseif !a:islocal && tgtdir =~ '/$'
6438 let s:netrwmftgt = tgtdir
6439" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
6440 else
6441 let s:netrwmftgt = curdir
6442" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
6443 endif
6444 endif
6445 if a:islocal
6446 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
6447 let s:netrwmftgt= simplify(s:netrwmftgt)
6448" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
6449 endif
6450 if g:netrw_cygwin
6451 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
6452 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
6453 endif
6454 let s:netrwmftgt_islocal= a:islocal
6455
Bram Moolenaar5c736222010-01-06 20:54:52 +01006456 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006457 call s:LocalBrowseShellCmdRefresh()
6458 endif
6459 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6460 call netrw#NetrwRestorePosn(svpos)
6461 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006462 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00006463 endif
6464
6465" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
6466endfun
6467
6468" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00006469" s:NetrwOpenFile: query user for a filename and open it {{{2
6470fun! s:NetrwOpenFile(islocal)
6471" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006472 let ykeep= @@
Bram Moolenaarc236c162008-07-13 17:41:49 +00006473 call inputsave()
6474 let fname= input("Enter filename: ")
6475 call inputrestore()
6476 if fname !~ '[/\\]'
6477 if exists("b:netrw_curdir")
6478 if exists("g:netrw_quiet")
6479 let netrw_quiet_keep = g:netrw_quiet
6480 endif
6481 let g:netrw_quiet = 1
6482 if b:netrw_curdir =~ '/$'
6483 exe "e ".fnameescape(b:netrw_curdir.fname)
6484 else
6485 exe "e ".fnameescape(b:netrw_curdir."/".fname)
6486 endif
6487 if exists("netrw_quiet_keep")
6488 let g:netrw_quiet= netrw_quiet_keep
6489 else
6490 unlet g:netrw_quiet
6491 endif
6492 endif
6493 else
6494 exe "e ".fnameescape(fname)
6495 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006496 let @@= ykeep
Bram Moolenaarc236c162008-07-13 17:41:49 +00006497" call Dret("s:NetrwOpenFile")
6498endfun
6499
6500" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006501" 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 +02006502" User access provided by the <mu> mapping. (see :help netrw-mu)
6503" Used by many MarkFile functions.
Bram Moolenaar446cb832008-06-24 21:56:24 +00006504fun! s:NetrwUnmarkList(curbufnr,curdir)
6505" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
6506
6507 " remove all files in local marked-file list from global list
6508 if exists("s:netrwmarkfilelist_{a:curbufnr}")
6509 for mfile in s:netrwmarkfilelist_{a:curbufnr}
6510 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
6511 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
6512 call remove(s:netrwmarkfilelist,idx) " remove from global list
6513 endfor
6514 if s:netrwmarkfilelist == []
6515 unlet s:netrwmarkfilelist
6516 endif
6517
6518 " getting rid of the local marked-file lists is easy
6519 unlet s:netrwmarkfilelist_{a:curbufnr}
6520 endif
6521 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
6522 unlet s:netrwmarkfilemtch_{a:curbufnr}
6523 endif
6524 2match none
6525" call Dret("s:NetrwUnmarkList")
6526endfun
6527
6528" ---------------------------------------------------------------------
6529" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
6530fun! s:NetrwUnmarkAll()
6531" call Dfunc("s:NetrwUnmarkAll()")
6532 if exists("s:netrwmarkfilelist")
6533 unlet s:netrwmarkfilelist
6534 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006535 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006536 2match none
6537" call Dret("s:NetrwUnmarkAll")
6538endfun
6539
6540" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02006541" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006542fun! s:NetrwUnmarkAll2()
6543" call Dfunc("s:NetrwUnmarkAll2()")
6544 redir => netrwmarkfilelist_let
6545 let
6546 redir END
6547 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
6548 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
6549 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
6550 for flist in netrwmarkfilelist_list
6551 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
6552 unlet s:netrwmarkfilelist_{curbufnr}
6553 unlet s:netrwmarkfilemtch_{curbufnr}
6554 endfor
6555" call Dret("s:NetrwUnmarkAll2")
6556endfun
6557
6558" ---------------------------------------------------------------------
6559" s:NetrwUnMarkFile: {{{2
6560fun! s:NetrwUnMarkFile(islocal)
6561" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
6562 let svpos = netrw#NetrwSavePosn()
6563 let curbufnr = bufnr("%")
6564
6565 " unmark marked file list (although I expect s:NetrwUpload()
6566 " to do it, I'm just making sure)
6567 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6568" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
6569 unlet s:netrwmarkfilelist
6570 unlet s:netrwmarkfilelist_{curbufnr}
6571 unlet s:netrwmarkfilemtch_{curbufnr}
6572 2match none
6573 endif
6574
6575" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6576 call netrw#NetrwRestorePosn(svpos)
6577" call Dret("s:NetrwUnMarkFile")
6578endfun
6579
6580" ---------------------------------------------------------------------
6581" s:NetrwMenu: generates the menu for gvim and netrw {{{2
6582fun! s:NetrwMenu(domenu)
6583
6584 if !exists("g:NetrwMenuPriority")
6585 let g:NetrwMenuPriority= 80
6586 endif
6587
Bram Moolenaaradc21822011-04-01 18:03:16 +02006588 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00006589" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
6590
6591 if !exists("s:netrw_menu_enabled") && a:domenu
6592" call Decho("initialize menu")
6593 let s:netrw_menu_enabled= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02006594 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
6595 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
6596 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
6597 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
6598 if g:netrw_dirhistmax > 0
6599 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
6600 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
6601 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
6602 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
6603 else
6604 exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\<cr>"
6605 endif
6606 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o o'
6607 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v v'
6608 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
6609 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p p'
6610 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
6611 exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
6612 exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
6613 exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
6614 exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
6615 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
6616 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
6617 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
6618 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
6619 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
6620 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
6621 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
6622 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
6623 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
6624 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
6625 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
6626 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
6627 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
6628 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
6629 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
6630 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
6631 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
6632 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
6633 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
6634 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
6635 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
6636 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
6637 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
6638 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
6639 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
6640 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
6641 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
6642 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
6643 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
6644 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
6645 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
6646 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
6647 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
6648 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
6649 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
6650 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>'
6651 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>'
6652 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>'
6653 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
6654 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>'
6655 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>'
6656 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>'
6657 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
6658 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006659 let s:netrw_menucnt= 28
Bram Moolenaarff034192013-04-24 18:51:19 +02006660 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
6661 call s:NetrwTgtMenu() " let bookmarks and history be easy targets
Bram Moolenaar446cb832008-06-24 21:56:24 +00006662
6663 elseif !a:domenu
6664 let s:netrwcnt = 0
6665 let curwin = winnr()
6666 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
6667 exe curwin."wincmd w"
6668
6669 if s:netrwcnt <= 1
6670" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006671 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02006672" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006673 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00006674 endif
6675 endif
6676" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006677 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006678 endif
6679
6680endfun
6681
6682" ---------------------------------------------------------------------
6683" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
6684" Used by the O maps (as <SID>NetrwObtain())
6685fun! s:NetrwObtain(islocal)
6686" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
6687
Bram Moolenaar97d62492012-11-15 21:28:22 +01006688 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006689 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006690 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
6691 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00006692 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
6693 else
6694 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
6695 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006696 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006697
6698" call Dret("NetrwObtain")
6699endfun
6700
6701" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006702" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
6703" If there's only one window, then the window will first be split.
6704" Returns:
6705" choice = 0 : didn't have to choose
6706" choice = 1 : saved modified file in window first
6707" choice = 2 : didn't save modified file, opened window
6708" choice = 3 : cancel open
6709fun! s:NetrwPrevWinOpen(islocal)
6710" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
6711
Bram Moolenaar97d62492012-11-15 21:28:22 +01006712 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006713 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
6714 let curdir = b:netrw_curdir
6715
6716 " get last window number and the word currently under the cursor
6717 let lastwinnr = winnr("$")
6718 let curword = s:NetrwGetWord()
6719 let choice = 0
6720" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
6721
6722 let didsplit = 0
6723 if lastwinnr == 1
6724 " if only one window, open a new one first
6725" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
6726 if g:netrw_preview
Bram Moolenaar15146672011-10-20 22:22:38 +02006727 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6728" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
6729 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006730 else
Bram Moolenaar15146672011-10-20 22:22:38 +02006731 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6732" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
6733 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006734 endif
6735 let didsplit = 1
6736
6737 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006738 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006739" call Decho("wincmd p")
6740 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02006741 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006742 " if the previous window's buffer has been changed (is modified),
6743 " and it doesn't appear in any other extant window, then ask the
6744 " user if s/he wants to abandon modifications therein.
6745 let bnr = winbufnr(0)
6746 let bnrcnt = 0
6747 if &mod
6748" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
6749 let eikeep= &ei
6750 set ei=all
6751 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
6752 exe bnr."wincmd p"
6753 let &ei= eikeep
6754" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
6755 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006756 let bufname = bufname(winbufnr(winnr()))
6757 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006758" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
6759
6760 if choice == 1
6761 " Yes -- write file & then browse
6762 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006763 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00006764 if v:errmsg != ""
6765 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
6766 if didsplit
6767 q
6768 else
6769 wincmd p
6770 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006771 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006772" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
6773 return choice
6774 endif
6775
6776 elseif choice == 2
6777 " No -- don't worry about changed file, just browse anyway
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006778" call Decho("(NetrwPrevWinOpen) setl nomod")
6779 setl nomod
6780" call Decho("(NetrwPrevWinOpen) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006781 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006782 wincmd p
6783
6784 else
6785 " Cancel -- don't do this
6786 if didsplit
6787 q
6788 else
6789 wincmd p
6790 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006791 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006792" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
6793 return choice
6794 endif
6795 endif
6796 endif
6797 endif
6798
6799 " restore b:netrw_curdir (window split/enew may have lost it)
6800 let b:netrw_curdir= curdir
6801 if a:islocal < 2
6802 if a:islocal
6803 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
6804 else
6805 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
6806 endif
6807 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006808 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006809" call Dret("NetrwPrevWinOpen ".choice)
6810 return choice
6811endfun
6812
6813" ---------------------------------------------------------------------
6814" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
6815" Always assumed to be local -> remote
6816" call s:NetrwUpload(filename, target)
6817" call s:NetrwUpload(filename, target, fromdirectory)
6818fun! s:NetrwUpload(fname,tgt,...)
6819" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6820
6821 if a:tgt =~ '^\a\+://'
6822 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
6823 else
6824 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
6825 endif
6826" call Decho("tgtdir<".tgtdir.">")
6827
6828 if a:0 > 0
6829 let fromdir= a:1
6830 else
6831 let fromdir= getcwd()
6832 endif
6833" call Decho("fromdir<".fromdir.">")
6834
6835 if type(a:fname) == 1
6836 " handle uploading a single file using NetWrite
6837" call Decho("handle uploading a single file via NetWrite")
6838 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006839" call Decho("exe e ".fnameescape(a:fname))
6840 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006841" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
6842 if a:tgt =~ '/$'
6843 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006844" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006845 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006846 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006847" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
6848 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006849" call Decho("done writing local->remote")
6850 endif
6851 q!
6852
6853 elseif type(a:fname) == 3
6854 " handle uploading a list of files via scp
6855" call Decho("handle uploading a list of files via scp")
6856 let curdir= getcwd()
6857 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006858 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006859 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
6860 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006861 if exists("g:netrw_port") && g:netrw_port != ""
6862 let useport= " ".g:netrw_scpport." ".g:netrw_port
6863 else
6864 let useport= ""
6865 endif
6866 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
6867 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006868" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
6869 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006870 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006871
6872 elseif a:tgt =~ '^ftp:'
6873 call s:NetrwMethod(a:tgt)
6874
6875 if b:netrw_method == 2
6876 " handle uploading a list of files via ftp+.netrc
6877 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006878 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00006879" call Decho("filter input window#".winnr())
6880
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006881 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006882" call Decho("filter input: ".getline('$'))
6883
6884 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006885 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006886" call Decho("filter input: ".getline('$'))
6887 endif
6888
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006889 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006890" call Decho("filter input: ".getline('$'))
6891
Bram Moolenaaradc21822011-04-01 18:03:16 +02006892 if tgtdir == ""
6893 let tgtdir= '/'
6894 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006895 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006896" call Decho("filter input: ".getline('$'))
6897
6898 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006899 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006900" call Decho("filter input: ".getline('$'))
6901 endfor
6902
6903 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006904" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6905 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 +00006906 else
6907" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02006908" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6909 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006910 endif
6911 " 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 +02006912 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006913 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006914 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6915 call netrw#ErrorMsg(s:ERROR,getline(1),14)
6916 else
6917 bw!|q
6918 endif
6919
6920 elseif b:netrw_method == 3
6921 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
6922 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02006923 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006924 let tmpbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006925 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00006926
6927 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006928 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006929" call Decho("filter input: ".getline('$'))
6930 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006931 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006932" call Decho("filter input: ".getline('$'))
6933 endif
6934
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006935 if exists("g:netrw_uid") && g:netrw_uid != ""
6936 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6937 keepj put =g:netrw_uid
6938" call Decho("filter input: ".getline('$'))
6939 if exists("s:netrw_passwd")
6940 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
6941 endif
6942" call Decho("filter input: ".getline('$'))
6943 elseif exists("s:netrw_passwd")
6944 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6945" call Decho("filter input: ".getline('$'))
6946 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006947 endif
6948
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006949 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006950" call Decho("filter input: ".getline('$'))
6951
6952 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006953 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006954" call Decho("filter input: ".getline('$'))
6955 endif
6956
6957 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006958 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006959" call Decho("filter input: ".getline('$'))
6960 endif
6961
6962 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006963 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006964" call Decho("filter input: ".getline('$'))
6965 endfor
6966
6967 " perform ftp:
6968 " -i : turns off interactive prompting from ftp
6969 " -n unix : DON'T use <.netrc>, even though it exists
6970 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006971 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006972" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6973 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006974 " 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 +02006975 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006976 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006977 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6978 let debugkeep= &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02006979 setl debug=msg
Bram Moolenaar446cb832008-06-24 21:56:24 +00006980 call netrw#ErrorMsg(s:ERROR,getline(1),15)
6981 let &debug = debugkeep
6982 let mod = 1
6983 else
6984 bw!|q
6985 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006986 elseif !exists("b:netrw_method") || b:netrw_method < 0
6987" call Dfunc("netrw#NetrwUpload : unsupported method")
6988 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006989 endif
6990 else
6991 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
6992 endif
6993 endif
6994
6995" call Dret("s:NetrwUpload")
6996endfun
6997
6998" ---------------------------------------------------------------------
6999" s:NetrwPreview: {{{2
7000fun! s:NetrwPreview(path) range
7001" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007002 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02007003 keepj call s:NetrwOptionSave("s:")
7004 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007005 if has("quickfix")
7006 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007007 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02007008 let pvhkeep = &pvh
7009 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7010 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007011 endif
7012 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
7013 if exists("pvhkeep")
7014 let &pvh= pvhkeep
7015 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007016 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007017 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007018 endif
7019 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007020 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 +00007021 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007022 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007023 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007024" call Dret("NetrwPreview")
7025endfun
7026
7027" ---------------------------------------------------------------------
7028" s:NetrwRefresh: {{{2
7029fun! s:NetrwRefresh(islocal,dirname)
7030" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
7031 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
Bram Moolenaar97d62492012-11-15 21:28:22 +01007032 " (defunct) NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
7033 " (defunct) Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
Bram Moolenaarff034192013-04-24 18:51:19 +02007034 setl ma noro
7035" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007036" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar97d62492012-11-15 21:28:22 +01007037 let ykeep = @@
7038 let screenposn = netrw#NetrwSavePosn()
Bram Moolenaarff034192013-04-24 18:51:19 +02007039" call Decho("clearing buffer prior to refresh")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007040 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007041 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007042 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007043 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007044 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007045 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01007046 keepj call netrw#NetrwRestorePosn(screenposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007047
7048 " restore file marks
7049 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
7050" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
7051 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
7052 else
7053" call Decho("2match none")
7054 2match none
7055 endif
7056
Bram Moolenaar97d62492012-11-15 21:28:22 +01007057" restore
7058 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007059" call Dret("NetrwRefresh")
7060endfun
7061
7062" ---------------------------------------------------------------------
7063" s:NetrwRefreshDir: refreshes a directory by name {{{2
7064" Called by NetrwMarkFileCopy()
7065" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
7066fun! s:NetrwRefreshDir(islocal,dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007067" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007068 if g:netrw_fastbrowse == 0
7069 " slowest mode (keep buffers refreshed, local or remote)
7070" call Decho("slowest mode: keep buffers refreshed, local or remote")
7071 let tgtwin= bufwinnr(a:dirname)
7072" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
7073
7074 if tgtwin > 0
7075 " tgtwin is being displayed, so refresh it
7076 let curwin= winnr()
7077" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
7078 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007079 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007080 exe curwin."wincmd w"
7081
7082 elseif bufnr(a:dirname) > 0
7083 let bn= bufnr(a:dirname)
7084" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007085 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00007086 endif
7087
7088 elseif g:netrw_fastbrowse <= 1
7089" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007090 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007091 endif
7092" call Dret("s:NetrwRefreshDir")
7093endfun
7094
7095" ---------------------------------------------------------------------
7096" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
7097" What this function does is to compute a priority for the patterns
7098" in the g:netrw_sort_sequence. It applies a substitute to any
7099" "files" that satisfy each pattern, putting the priority / in
7100" front. An "*" pattern handles the default priority.
7101fun! s:NetrwSetSort()
7102" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007103 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00007104 if w:netrw_liststyle == s:LONGLIST
7105 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
7106 else
7107 let seqlist = g:netrw_sort_sequence
7108 endif
7109 " sanity check -- insure that * appears somewhere
7110 if seqlist == ""
7111 let seqlist= '*'
7112 elseif seqlist !~ '\*'
7113 let seqlist= seqlist.',*'
7114 endif
7115 let priority = 1
7116 while seqlist != ""
7117 if seqlist =~ ','
7118 let seq = substitute(seqlist,',.*$','','e')
7119 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
7120 else
7121 let seq = seqlist
7122 let seqlist = ""
7123 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007124 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01007125 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007126 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01007127 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007128 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01007129 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007130 endif
7131" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
7132
7133 " sanity check
7134 if w:netrw_bannercnt > line("$")
7135 " apparently no files were left after a Hiding pattern was used
7136" call Dret("SetSort : no files left after hiding")
7137 return
7138 endif
7139 if seq == '*'
7140 let starpriority= spriority
7141 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007142 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007143 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007144 " sometimes multiple sorting patterns will match the same file or directory.
7145 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007146 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 +02007147 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007148 endif
7149 let priority = priority + 1
7150 endwhile
7151 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007152 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007153 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007154 endif
7155
7156 " Following line associated with priority -- items that satisfy a priority
7157 " pattern get prefixed by ###/ which permits easy sorting by priority.
7158 " Sometimes files can satisfy multiple priority patterns -- only the latest
7159 " priority pattern needs to be retained. So, at this point, these excess
7160 " priority prefixes need to be removed, but not directories that happen to
7161 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007162 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 +02007163 keepj call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007164 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007165
7166" call Dret("SetSort")
7167endfun
7168
Bram Moolenaarff034192013-04-24 18:51:19 +02007169" ---------------------------------------------------------------------
7170" s:NetrwSetTgt: sets the target to the specified choice index {{{2
7171" Implements [count]Tb (bookhist<b>)
7172" [count]Th (bookhist<h>)
7173" See :help netrw-qb for how to make the choice.
7174fun! s:NetrwSetTgt(bookhist,choice)
7175" call Dfunc("s:NetrwSetTgt(bookhist<".a:bookhist."> choice#".a:choice.")")
7176
7177 if a:bookhist == 'b'
7178 " supports choosing a bookmark as a target using a qb-generated list
7179 let choice= a:choice - 1
7180 if exists("g:netrw_bookmarklist[".choice."]")
7181 call netrw#NetrwMakeTgt(g:netrw_bookmarklist[choice])
7182 else
7183 echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
7184 endif
7185
7186 elseif a:bookhist == 'h'
7187 " supports choosing a history stack entry as a target using a qb-generated list
7188 let choice= (a:choice % g:netrw_dirhistmax) + 1
7189 if exists("g:netrw_dirhist_".choice)
7190 let histentry = g:netrw_dirhist_{choice}
7191 call netrw#NetrwMakeTgt(histentry)
7192 else
7193 echomsg "Sorry, history#".a:choice." not available!"
7194 endif
7195 endif
7196
7197" call Dret("s:NetrwSetTgt")
7198endfun
7199
Bram Moolenaar446cb832008-06-24 21:56:24 +00007200" =====================================================================
7201" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
7202fun! s:NetrwSortStyle(islocal)
7203" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007204 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007205 let svpos= netrw#NetrwSavePosn()
7206
7207 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 +02007208 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007209 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
7210 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007211
7212" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
7213endfun
7214
7215" ---------------------------------------------------------------------
7216" s:NetrwSplit: mode {{{2
7217" =0 : net and o
7218" =1 : net and t
7219" =2 : net and v
7220" =3 : local and o
7221" =4 : local and t
7222" =5 : local and v
7223fun! s:NetrwSplit(mode)
7224" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
7225
Bram Moolenaar97d62492012-11-15 21:28:22 +01007226 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00007227 call s:SaveWinVars()
7228
7229 if a:mode == 0
7230 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02007231 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7232" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007233 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007234 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007235 keepj call s:RestoreWinVars()
7236 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007237 unlet s:didsplit
7238
7239 elseif a:mode == 1
7240 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01007241 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00007242" call Decho("tabnew")
7243 tabnew
7244 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007245 keepj call s:RestoreWinVars()
7246 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007247 unlet s:didsplit
7248
7249 elseif a:mode == 2
7250 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02007251 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7252" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007253 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007254 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007255 keepj call s:RestoreWinVars()
7256 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007257 unlet s:didsplit
7258
7259 elseif a:mode == 3
7260 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02007261 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7262" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007263 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007264 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007265 keepj call s:RestoreWinVars()
7266 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007267 unlet s:didsplit
7268
7269 elseif a:mode == 4
7270 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007271 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007272 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007273" call Decho("tabnew")
7274 tabnew
7275 let b:netrw_curdir= netrw_curdir
7276 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007277 keepj call s:RestoreWinVars()
7278 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007279 unlet s:didsplit
7280
7281 elseif a:mode == 5
7282 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02007283 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7284" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007285 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007286 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007287 keepj call s:RestoreWinVars()
7288 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007289 unlet s:didsplit
7290
7291 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007292 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007293 endif
7294
Bram Moolenaar97d62492012-11-15 21:28:22 +01007295 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007296" call Dret("s:NetrwSplit")
7297endfun
7298
7299" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02007300" s:NetrwTgtMenu: {{{2
7301fun! s:NetrwTgtMenu()
7302 if !exists("s:netrw_menucnt")
7303 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007304 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007305" call Dfunc("s:NetrwTgtMenu()")
7306
7307 " the following test assures that gvim is running, has menus available, and has menus enabled.
7308 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
7309 if exists("g:NetrwTopLvlMenu")
7310" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
7311 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
7312 endif
7313 if !exists("s:netrw_initbookhist")
7314 call s:NetrwBookHistRead()
7315 endif
7316
7317 " target bookmarked places
7318 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
7319" call Decho("installing bookmarks as easy targets")
7320 let cnt= 1
7321 for bmd in g:netrw_bookmarklist
7322 let ebmd= escape(bmd,g:netrw_menu_escape)
7323 " show bookmarks for goto menu
7324" call Decho("menu: Targets: ".bmd)
7325 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#NetrwMakeTgt('".bmd."')\<cr>"
7326 let cnt= cnt + 1
7327 endfor
7328 endif
7329
7330 " target directory browsing history
7331 if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
7332" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")")
7333 let histcnt = 1
7334 while histcnt <= g:netrw_dirhistmax
7335 let priority = g:netrw_dirhist_cnt + histcnt
7336 if exists("g:netrw_dirhist_{histcnt}")
7337 let histentry = g:netrw_dirhist_{histcnt}
7338 let ehistentry = escape(histentry,g:netrw_menu_escape)
7339" call Decho("menu: Targets: ".histentry)
7340 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#NetrwMakeTgt('".histentry."')\<cr>"
7341 endif
7342 let histcnt = histcnt + 1
7343 endwhile
7344 endif
7345 endif
7346" call Dret("s:NetrwTgtMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007347endfun
7348
7349" ---------------------------------------------------------------------
7350" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
7351" (full path directory with trailing slash returned)
7352fun! s:NetrwTreeDir()
7353" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
7354
7355 let treedir= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02007356" call Decho("(NetrwTreeDir) set initial treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007357 let s:treecurpos= netrw#NetrwSavePosn()
7358
7359 if w:netrw_liststyle == s:TREELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02007360" call Decho("(NetrwTreeDir) w:netrw_liststyle is TREELIST:")
7361" call Decho("(NetrwTreeDir) line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007362
7363 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007364 if getline('.') =~ '/$'
7365 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
7366 else
7367 let treedir= ""
7368 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007369" call Decho("(NetrwTreeDir) treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007370
7371 " detect user attempting to close treeroot
7372 if getline('.') !~ '|' && getline('.') != '..'
7373" call Decho("user attempted to close treeroot")
7374 " now force a refresh
Bram Moolenaarff034192013-04-24 18:51:19 +02007375" call Decho("(NetrwTreeDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007376 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007377" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
7378 return b:netrw_curdir
7379 endif
7380
7381 " elide all non-depth information
7382 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaarff034192013-04-24 18:51:19 +02007383" call Decho("(NetrwTreeDir) depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007384
7385 " elide first depth
7386 let depth = substitute(depth,'^| ','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02007387" call Decho("(NetrwTreeDir) depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007388
7389 " construct treedir by searching backwards at correct depth
Bram Moolenaarff034192013-04-24 18:51:19 +02007390" call Decho("(NetrwTreeDir) constructing treedir<".treedir."> depth<".depth.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007391 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
7392 let dirname= substitute(getline('.'),'^\(| \)*','','e')
7393 let treedir= dirname.treedir
7394 let depth = substitute(depth,'^| ','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02007395" call Decho("(NetrwTreeDir) constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007396 endwhile
7397 if w:netrw_treetop =~ '/$'
7398 let treedir= w:netrw_treetop.treedir
7399 else
7400 let treedir= w:netrw_treetop.'/'.treedir
7401 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007402" call Decho("(NetrwTreeDir) bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007403 endif
7404 let treedir= substitute(treedir,'//$','/','')
7405
Bram Moolenaar446cb832008-06-24 21:56:24 +00007406" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
7407 return treedir
7408endfun
7409
7410" ---------------------------------------------------------------------
7411" s:NetrwTreeDisplay: recursive tree display {{{2
7412fun! s:NetrwTreeDisplay(dir,depth)
7413" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
7414
7415 " insure that there are no folds
Bram Moolenaarff034192013-04-24 18:51:19 +02007416 setl nofen
Bram Moolenaar446cb832008-06-24 21:56:24 +00007417
7418 " install ../ and shortdir
7419 if a:depth == ""
7420 call setline(line("$")+1,'../')
7421" call Decho("setline#".line("$")." ../ (depth is zero)")
7422 endif
7423 if a:dir =~ '^\a\+://'
7424 if a:dir == w:netrw_treetop
7425 let shortdir= a:dir
7426 else
7427 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
7428 endif
7429 call setline(line("$")+1,a:depth.shortdir)
7430 else
7431 let shortdir= substitute(a:dir,'^.*/','','e')
7432 call setline(line("$")+1,a:depth.shortdir.'/')
7433 endif
7434" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
7435
7436 " append a / to dir if its missing one
7437 let dir= a:dir
7438 if dir !~ '/$'
7439 let dir= dir.'/'
7440 endif
7441
7442 " display subtrees (if any)
7443 let depth= "| ".a:depth
7444
7445" call Decho("display subtrees with depth<".depth."> and current leaves")
7446 for entry in w:netrw_treedict[a:dir]
7447 let direntry= substitute(dir.entry,'/$','','e')
7448" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
7449 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
7450" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007451 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007452 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
7453" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007454 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007455 else
7456" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007457 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007458 endif
7459 endfor
7460" call Dret("NetrwTreeDisplay")
7461endfun
7462
7463" ---------------------------------------------------------------------
7464" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
7465fun! s:NetrwTreeListing(dirname)
7466 if w:netrw_liststyle == s:TREELIST
7467" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
7468" call Decho("curdir<".a:dirname.">")
7469" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exit")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"))
7470
7471 " update the treetop
7472" call Decho("update the treetop")
7473 if !exists("w:netrw_treetop")
7474 let w:netrw_treetop= a:dirname
7475" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
7476 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
7477 let w:netrw_treetop= a:dirname
7478" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
7479 endif
7480
7481 " insure that we have at least an empty treedict
7482 if !exists("w:netrw_treedict")
7483 let w:netrw_treedict= {}
7484 endif
7485
7486 " update the directory listing for the current directory
7487" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
7488" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007489 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007490 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007491" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007492 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007493
7494 " if past banner, record word
7495 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
7496 let fname= expand("<cword>")
7497 else
7498 let fname= ""
7499 endif
7500" call Decho("fname<".fname.">")
7501
7502 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02007503 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007504
7505" call Dret("NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007506 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007507 endif
7508endfun
7509
7510" ---------------------------------------------------------------------
7511" s:NetrwWideListing: {{{2
7512fun! s:NetrwWideListing()
7513
7514 if w:netrw_liststyle == s:WIDELIST
7515" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
7516 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007517 " cpf: characters per filename
7518 " fpl: filenames per line
7519 " fpc: filenames per column
Bram Moolenaarff034192013-04-24 18:51:19 +02007520 setl ma noro
7521" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007522 let b:netrw_cpf= 0
7523 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007524 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 +02007525 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007526 else
7527" call Dret("NetrwWideListing")
7528 return
7529 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007530 let b:netrw_cpf= b:netrw_cpf + 2
7531" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007532
7533 " determine qty files per line (fpl)
7534 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
7535 if w:netrw_fpl <= 0
7536 let w:netrw_fpl= 1
7537 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007538" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007539
7540 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007541 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007542 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007543 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
7544 let newcolstart = w:netrw_bannercnt + fpc
7545 let newcolend = newcolstart + fpc - 1
7546" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007547 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00007548 while line("$") >= newcolstart
7549 if newcolend > line("$") | let newcolend= line("$") | endif
7550 let newcolqty= newcolend - newcolstart
7551 exe newcolstart
7552 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007553 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007554 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007555 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007556 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007557 exe "sil! keepj ".newcolstart.','.newcolend.'d'
7558 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007559 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02007560 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007561 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007562 keepj call histdel("/",-1)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007563 exe "nmap <buffer> <silent> w /^\\\\|\\s\\s\\zs\\S/\<cr>"
7564 exe "nmap <buffer> <silent> b ?^\\\\|\\s\\s\\zs\\S?\<cr>"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007565" call Decho("NetrwWideListing) setl noma nomod ro")
7566 setl noma nomod ro
7567" 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 +00007568" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007569 return
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007570 else
7571 if hasmapto("w","n")
7572 sil! nunmap <buffer> w
7573 endif
7574 if hasmapto("b","n")
7575 sil! nunmap <buffer> b
7576 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007577 endif
7578
7579endfun
7580
7581" ---------------------------------------------------------------------
7582" s:PerformListing: {{{2
7583fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007584" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007585
Bram Moolenaar15146672011-10-20 22:22:38 +02007586 " set up syntax highlighting {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02007587" call Decho("(PerformListing) set up syntax highlighting")
Bram Moolenaar15146672011-10-20 22:22:38 +02007588 if has("syntax")
7589 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaarff034192013-04-24 18:51:19 +02007590" call Decho("(PerformListing) but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
7591 setl ft=
Bram Moolenaar15146672011-10-20 22:22:38 +02007592 elseif &ft != "netrw"
Bram Moolenaarff034192013-04-24 18:51:19 +02007593 setl ft=netrw
Bram Moolenaar15146672011-10-20 22:22:38 +02007594 endif
7595 endif
7596
Bram Moolenaaradc21822011-04-01 18:03:16 +02007597 keepj call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02007598 set noro ma
7599" call Decho("(PerformListing) setl noro ma bh=".&bh)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007600
7601" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
Bram Moolenaarff034192013-04-24 18:51:19 +02007602" call Decho("(PerformListing) (netrw) Processing your browsing request...")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007603" endif " Decho
7604
7605" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
7606 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
7607 " force a refresh for tree listings
Bram Moolenaarff034192013-04-24 18:51:19 +02007608" call Decho("(PerformListing) force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007609 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007610 endif
7611
7612 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02007613 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007614
7615 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007616 if g:netrw_banner
Bram Moolenaarff034192013-04-24 18:51:19 +02007617" call Decho("(PerformListing) set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007618 keepj call setline(1,'" ============================================================================')
7619 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007620 if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash
7621 keepj call setline(3,'" '.substitute(b:netrw_curdir,'/','\\','g'))
7622 else
7623 keepj call setline(3,'" '.b:netrw_curdir)
7624 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007625 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007626 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007627 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007628 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01007629 let w:netrw_bannercnt= 1
7630 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007631
7632 let sortby= g:netrw_sort_by
7633 if g:netrw_sort_direction =~ "^r"
7634 let sortby= sortby." reversed"
7635 endif
7636
7637 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007638 if g:netrw_banner
Bram Moolenaarff034192013-04-24 18:51:19 +02007639" call Decho("(PerformListing) handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007640 if g:netrw_sort_by =~ "^n"
Bram Moolenaarff034192013-04-24 18:51:19 +02007641" call Decho("(PerformListing) directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007642 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007643 keepj put ='\" Sorted by '.sortby
7644 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01007645 let w:netrw_bannercnt= w:netrw_bannercnt + 2
7646 else
Bram Moolenaarff034192013-04-24 18:51:19 +02007647" call Decho("(PerformListing) directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007648 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007649 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01007650 let w:netrw_bannercnt= w:netrw_bannercnt + 1
7651 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007652 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007653 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007654
7655 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01007656 if g:netrw_banner
7657 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
Bram Moolenaarff034192013-04-24 18:51:19 +02007658" call Decho("(PerformListing) show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007659 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01007660 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007661 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007662 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007663 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007664 endif
7665 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007666 else
Bram Moolenaarff034192013-04-24 18:51:19 +02007667" call Decho("(PerformListing) s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007668 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007669 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007670 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007671
7672 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007673 if g:netrw_banner
Bram Moolenaarff034192013-04-24 18:51:19 +02007674" call Decho("(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 +01007675 if g:netrw_list_hide != "" && g:netrw_hide
7676 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007677 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007678 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007679 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007680 endif
7681 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007682 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007683 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007684 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
7685 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007686 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00007687 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007688
7689 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01007690 if g:netrw_banner
7691 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007692 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007693" call Decho("(PerformListing) w:netrw_bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007694 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007695
Bram Moolenaar446cb832008-06-24 21:56:24 +00007696 " get list of files
Bram Moolenaarff034192013-04-24 18:51:19 +02007697" call Decho("(PerformListing) Get list of files - islocal=".a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007698 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007699 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007700 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02007701 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007702 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007703
7704 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007705 if !exists("w:netrw_bannercnt")
7706 let w:netrw_bannercnt= 0
7707 endif
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007708" call Decho("(PerformListing) g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
7709
Bram Moolenaar5c736222010-01-06 20:54:52 +01007710 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02007711" call Decho("(PerformListing) manipulate directory listing (hide)")
7712" call Decho("(PerformListing) g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007713 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007714 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007715 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007716 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02007717" call Decho("(PerformListing) manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007718
7719 if g:netrw_sort_by =~ "^n"
7720 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02007721 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007722
Bram Moolenaar5c736222010-01-06 20:54:52 +01007723 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02007724" call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007725 if g:netrw_sort_direction =~ 'n'
7726 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007727 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007728 else
7729 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007730 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007731 endif
7732 endif
7733 " remove priority pattern prefix
Bram Moolenaarff034192013-04-24 18:51:19 +02007734" call Decho("(PerformListing) remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007735 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007736 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007737
7738 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01007739 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02007740" call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007741 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007742" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007743 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007744 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007745" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007746 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007747 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007748 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007749 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007750 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007751 endif
7752
7753 elseif g:netrw_sort_direction =~ 'r'
7754" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007755 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007756 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007757 call histdel("/",-1)
7758 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007759 endif
7760 endif
7761
7762 " convert to wide/tree listing {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02007763" call Decho("(PerformListing) modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007764 keepj call s:NetrwWideListing()
7765 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007766
Bram Moolenaar5c736222010-01-06 20:54:52 +01007767 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007768 " place cursor on the top-left corner of the file listing
Bram Moolenaarff034192013-04-24 18:51:19 +02007769" call Decho("(PerformListing) place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007770 exe 'sil! keepj '.w:netrw_bannercnt
7771 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007772 endif
7773
7774 " record previous current directory
7775 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02007776" call Decho("(PerformListing) record netrw_prvdir<".w:netrw_prvdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007777
7778 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007779 keepj call s:SetBufWinVars()
7780 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007781
7782 " set display to netrw display settings
Bram Moolenaarff034192013-04-24 18:51:19 +02007783" call Decho("(PerformListing) set display to netrw display settings (".g:netrw_bufsettings.")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007784 exe "setl ".g:netrw_bufsettings
Bram Moolenaar97d62492012-11-15 21:28:22 +01007785 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaarff034192013-04-24 18:51:19 +02007786" call Decho("(PerformListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01007787 exe "setl ts=".(g:netrw_maxfilenamelen+1)
7788 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007789 if exists("s:treecurpos")
7790
Bram Moolenaaradc21822011-04-01 18:03:16 +02007791 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007792 unlet s:treecurpos
7793 endif
7794
7795" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
7796endfun
7797
7798" ---------------------------------------------------------------------
7799" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007800fun! s:SetupNetrwStatusLine(statline)
7801" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
7802
7803 if !exists("s:netrw_setup_statline")
7804 let s:netrw_setup_statline= 1
7805" call Decho("do first-time status line setup")
7806
7807 if !exists("s:netrw_users_stl")
7808 let s:netrw_users_stl= &stl
7809 endif
7810 if !exists("s:netrw_users_ls")
7811 let s:netrw_users_ls= &laststatus
7812 endif
7813
7814 " set up User9 highlighting as needed
7815 let keepa= @a
7816 redir @a
7817 try
7818 hi User9
7819 catch /^Vim\%((\a\+)\)\=:E411/
7820 if &bg == "dark"
7821 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
7822 else
7823 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
7824 endif
7825 endtry
7826 redir END
7827 let @a= keepa
7828 endif
7829
7830 " set up status line (may use User9 highlighting)
7831 " insure that windows have a statusline
7832 " make sure statusline is displayed
7833 let &stl=a:statline
Bram Moolenaarff034192013-04-24 18:51:19 +02007834 setl laststatus=2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007835" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007836 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00007837
7838" call Dret("SetupNetrwStatusLine : stl=".&stl)
7839endfun
7840
7841" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007842" Remote Directory Browsing Support: {{{1
7843" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00007844
7845" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007846" s:NetrwRemoteListing: {{{2
7847fun! s:NetrwRemoteListing()
7848" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00007849
Bram Moolenaar446cb832008-06-24 21:56:24 +00007850 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007851" call Decho("b:netrw_method#".(exists("b:netrw_method")? b:netrw_method : 'n/a'))
7852" call Decho("g:netrw_list_cmd<".(exists("g:netrw_list_cmd")? g:netrw_list_cmd : 'n/a').">")
7853" call Decho("ssh is ".(executable("ssh")? "" : "not ")."executable")
7854" call Decho("ftp is ".(executable("ftp")? "" : "not ")."executable")
7855" call Decho("sftp is ".(executable("sftp")? "" : "not ")."executable")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007856
Bram Moolenaar446cb832008-06-24 21:56:24 +00007857 " sanity check:
7858 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007859 " b:netrw_method = 2: ftp+.netrc
7860 " b:netrw_method = 3: ftp+machine,id,p/w,filename (ie. no .netrc)
7861 " b:netrw_method = 5: wget (http)
7862" call Decho("b:netrw_method=".b:netrw_method." (for ".s:method.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007863 if !executable("ftp")
7864 if !exists("g:netrw_quiet")
7865 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
7866 endif
7867 call s:NetrwOptionRestore("w:")
7868" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00007869 return
7870 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007871
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007872 elseif s:method == "scp" && (!exists("g:netrw_list_cmd") || g:netrw_list_cmd == '')
7873" call Decho("g:netrw_list_cmd<".(exists("g:netrw_list_cmd")? g:netrw_list_cmd : 'n/a').">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007874 if !exists("g:netrw_quiet")
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007875 if !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ""
7876 keepj call netrw#ErrorMsg(s:ERROR,"neither ssh nor ftp"." is executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007877 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007878 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 +00007879 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007880 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007881
Bram Moolenaaradc21822011-04-01 18:03:16 +02007882 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007883" call Dret("s:NetrwRemoteListing")
7884 return
7885 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007886
Bram Moolenaar446cb832008-06-24 21:56:24 +00007887 if exists("b:netrw_method")
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007888" call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007889 let w:netrw_method= b:netrw_method
7890 endif
7891
7892 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007893 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007894" call Decho("use ftp to get remote file listing")
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007895 let s:method = "ftp"
7896 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007897 if g:netrw_sort_by =~ '^t'
7898 let listcmd= g:netrw_ftp_timelist_cmd
7899 elseif g:netrw_sort_by =~ '^s'
7900 let listcmd= g:netrw_ftp_sizelist_cmd
7901 endif
7902" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
7903 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007904" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007905
7906 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
7907 " shorten the listing
7908" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007909 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007910
7911 " cleanup
7912 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007913 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007914 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007915 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007916 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007917 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007918
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007919 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +00007920 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007921 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar97d62492012-11-15 21:28:22 +01007922 let line2= search('\.\.\/\%(\s\|$\)','cnW')
7923" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007924 if line2 == 0
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007925" call Decho("netrw is putting ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007926 sil! keepj put='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007927 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007928 exe "sil! keepj ".line1
7929 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007930
7931" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
7932 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7933" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007934 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 +02007935 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007936 else " normal ftp cleanup
7937" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007938 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
7939 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
7940 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007941 keepj call histdel("/",-1)
7942 keepj call histdel("/",-1)
7943 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007944 endif
7945 endif
7946
7947 else
7948 " use ssh to get remote file listing {{{3
7949" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
7950 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
7951" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
7952 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007953" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007954 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007955 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007956 sil! keepj g/^Listing directory/keepj d
7957 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
7958 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007959 keepj call histdel("/",-1)
7960 keepj call histdel("/",-1)
7961 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007962 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007963 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007964 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007965 endif
7966 else
7967 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007968" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar15146672011-10-20 22:22:38 +02007969 exe "sil! keepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007970 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02007971" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007972 exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007973" call Decho("listcmd<".listcmd."> path<".s:path.">")
7974 endif
7975 endif
7976
7977 " cleanup
7978 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007979" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007980 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007981 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007982 endif
7983 endif
7984
7985 if w:netrw_liststyle == s:LONGLIST
7986 " do a long listing; these substitutions need to be done prior to sorting {{{3
7987" call Decho("fix long listing:")
7988
7989 if s:method == "ftp"
7990 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007991 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007992 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007993 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007994 endwhile
Bram Moolenaare6ae6222013-05-21 21:01:10 +02007995 " if there's no ../ listed, then put ../ in
Bram Moolenaar446cb832008-06-24 21:56:24 +00007996 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007997 sil! keepj 1
7998 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007999 let line2= line(".")
8000 if line2 == 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008001 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008002 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008003 endif
8004 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008005 exe "sil! keepj ".line1
8006 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008007 endif
8008
8009 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
8010" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008011 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 +00008012 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
8013" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008014 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
8015 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
8016 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02008017 keepj call histdel("/",-1)
8018 keepj call histdel("/",-1)
8019 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008020 endif
8021 endif
8022
8023" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008024" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008025" endif " Decho
8026" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00008027endfun
8028
Bram Moolenaar446cb832008-06-24 21:56:24 +00008029" ---------------------------------------------------------------------
8030" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
8031fun! s:NetrwRemoteRm(usrhost,path) range
8032" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
8033" call Decho("firstline=".a:firstline." lastline=".a:lastline)
8034 let svpos= netrw#NetrwSavePosn()
8035
8036 let all= 0
8037 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8038 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01008039" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008040 for fname in s:netrwmarkfilelist_{bufnr("%")}
8041 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
8042 if ok =~ 'q\%[uit]'
8043 break
8044 elseif ok =~ 'a\%[ll]'
8045 let all= 1
8046 endif
8047 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01008048 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008049
8050 else
8051 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01008052" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008053
8054 " preparation for removing multiple files/directories
8055 let ctr= a:firstline
8056
8057 " remove multiple files and directories
8058 while ctr <= a:lastline
Bram Moolenaar15146672011-10-20 22:22:38 +02008059 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008060 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
8061 if ok =~ 'q\%[uit]'
8062 break
8063 elseif ok =~ 'a\%[ll]'
8064 let all= 1
8065 endif
8066 let ctr= ctr + 1
8067 endwhile
8068 endif
8069
8070 " refresh the (remote) directory listing
8071" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008072 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8073 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008074
8075" call Dret("s:NetrwRemoteRm")
8076endfun
8077
8078" ---------------------------------------------------------------------
8079" s:NetrwRemoteRmFile: {{{2
8080fun! s:NetrwRemoteRmFile(path,rmfile,all)
8081" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
8082
8083 let all= a:all
8084 let ok = ""
8085
8086 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
8087 " attempt to remove file
8088" call Decho("attempt to remove file (all=".all.")")
8089 if !all
8090 echohl Statement
8091" call Decho("case all=0:")
8092 call inputsave()
8093 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8094 call inputrestore()
8095 echohl NONE
8096 if ok == ""
8097 let ok="no"
8098 endif
8099 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8100 if ok =~ 'a\%[ll]'
8101 let all= 1
8102 endif
8103 endif
8104
8105 if all || ok =~ 'y\%[es]' || ok == ""
8106" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
8107 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8108" call Decho("case ftp:")
8109 let path= a:path
8110 if path =~ '^\a\+://'
8111 let path= substitute(path,'^\a\+://[^/]\+/','','')
8112 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008113 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008114 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
8115 else
8116" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
8117 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
8118" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8119 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008120 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008121 let ok="q"
8122 else
8123 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8124" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8125" call Decho("remotedir<".remotedir.">")
8126" call Decho("rmfile<".a:rmfile.">")
8127 if remotedir != ""
8128 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
8129 else
8130 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
8131 endif
8132" call Decho("call system(".netrw_rm_cmd.")")
8133 let ret= system(netrw_rm_cmd)
8134 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008135 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008136 endif
8137" call Decho("returned=".ret." errcode=".v:shell_error)
8138 endif
8139 endif
8140 elseif ok =~ 'q\%[uit]'
8141" call Decho("ok==".ok)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008142 endif
8143
8144 else
8145 " attempt to remove directory
8146" call Decho("attempt to remove directory")
8147 if !all
8148 call inputsave()
8149 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8150 call inputrestore()
8151 if ok == ""
8152 let ok="no"
8153 endif
8154 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8155 if ok =~ 'a\%[ll]'
8156 let all= 1
8157 endif
8158 endif
8159
8160 if all || ok =~ 'y\%[es]' || ok == ""
8161 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008162 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008163 else
8164 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01008165 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008166" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008167 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008168" call Decho("returned=".ret." errcode=".v:shell_error)
8169
8170 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008171" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008172 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 +00008173" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
8174 let ret= system(netrw_rmf_cmd)
8175" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008176
8177 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008178 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008179 endif
8180 endif
8181 endif
8182
8183 elseif ok =~ 'q\%[uit]'
Bram Moolenaarff034192013-04-24 18:51:19 +02008184" call Decho("ok==".ok)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008185 endif
8186 endif
8187
8188" call Dret("s:NetrwRemoteRmFile ".ok)
8189 return ok
8190endfun
8191
8192" ---------------------------------------------------------------------
8193" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
8194" This function assumes that a long listing will be received. Size, time,
8195" and reverse sorts will be requested of the server but not otherwise
8196" enforced here.
8197fun! s:NetrwRemoteFtpCmd(path,listcmd)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008198" 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 : "???")))
8199" call Decho("line($)=".line("$")." w:netrw_bannercnt=".w:netrw_bannercnt)
8200 if !exists("w:netrw_method")
8201 if exists("b:netrw_method")
8202 let w:netrw_method= b:netrw_method
8203 else
8204 call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93)
8205" call Dret("NetrwRemoteFtpCmd")
8206 return
8207 endif
8208 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008209
8210 " because WinXX ftp uses unix style input
8211 let ffkeep= &ff
Bram Moolenaarff034192013-04-24 18:51:19 +02008212 setl ma ff=unix noro
8213" call Decho("setl ma ff=unix noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008214
8215 " clear off any older non-banner lines
8216 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02008217" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
8218 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008219
8220 ".........................................
8221 if w:netrw_method == 2 || w:netrw_method == 5
8222 " ftp + <.netrc>: Method #2
8223 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008224 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008225 endif
8226 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008227 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008228" call Decho("filter input: ".getline('.'))
8229 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008230 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008231" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
8232 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008233" 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 +02008234 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 +00008235 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008236" 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 +02008237 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 +00008238 endif
8239
8240 ".........................................
8241 elseif w:netrw_method == 3
8242 " ftp + machine,id,passwd,filename: Method #3
Bram Moolenaarff034192013-04-24 18:51:19 +02008243 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00008244 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008245 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00008246 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008247 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00008248 endif
8249
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008250 " handle userid and password
8251 let host= substitute(g:netrw_machine,'\..*$','','')
8252" call Decho("host<".host.">")
8253 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
8254 call NetUserPass("ftp:".host)
8255 endif
8256 if exists("g:netrw_uid") && g:netrw_uid != ""
8257 if exists("g:netrw_ftp") && g:netrw_ftp == 1
8258 keepj put =g:netrw_uid
8259 if exists("s:netrw_passwd") && s:netrw_passwd != ""
8260 keepj put ='\"'.s:netrw_passwd.'\"'
8261 endif
8262 elseif exists("s:netrw_passwd")
8263 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
8264 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008265 endif
8266
8267 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008268 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008269 endif
8270 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008271 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008272" call Decho("filter input: ".getline('.'))
8273 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008274 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008275
8276 " perform ftp:
8277 " -i : turns off interactive prompting from ftp
8278 " -n unix : DON'T use <.netrc>, even though it exists
8279 " -n win32: quit being obnoxious about password
8280" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008281" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
8282 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00008283
8284 ".........................................
8285 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008286 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008287 endif
8288
8289 " cleanup for Windows
8290 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008291 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02008292 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008293 endif
8294 if a:listcmd == "dir"
8295 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008296 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
8297 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02008298 keepj call histdel("/",-1)
8299 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008300 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008301 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008302 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008303 endif
8304 endif
8305
8306 " ftp's listing doesn't seem to include ./ or ../
8307 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008308 exe 'keepj '.w:netrw_bannercnt
8309 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008310 endif
8311 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008312 exe 'keepj '.w:netrw_bannercnt
8313 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008314 endif
8315
8316 " restore settings
8317 let &ff= ffkeep
8318" call Dret("NetrwRemoteFtpCmd")
8319endfun
8320
8321" ---------------------------------------------------------------------
8322" s:NetrwRemoteRename: rename a remote file or directory {{{2
8323fun! s:NetrwRemoteRename(usrhost,path) range
8324" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
8325
8326 " preparation for removing multiple files/directories
8327 let svpos = netrw#NetrwSavePosn()
8328 let ctr = a:firstline
8329 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
8330
8331 " rename files given by the markfilelist
8332 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8333 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8334" call Decho("oldname<".oldname.">")
8335 if exists("subfrom")
8336 let newname= substitute(oldname,subfrom,subto,'')
8337" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8338 else
8339 call inputsave()
8340 let newname= input("Moving ".oldname." to : ",oldname)
8341 call inputrestore()
8342 if newname =~ '^s/'
8343 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8344 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8345 let newname = substitute(oldname,subfrom,subto,'')
8346" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8347 endif
8348 endif
8349
8350 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008351 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008352 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008353 let oldname= shellescape(a:path.oldname)
8354 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008355" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8356 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008357 endif
8358
8359 endfor
8360 call s:NetrwUnMarkFile(1)
8361
8362 else
8363
8364 " attempt to rename files/directories
8365 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008366 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008367
8368 let oldname= s:NetrwGetWord()
8369" call Decho("oldname<".oldname.">")
8370
8371 call inputsave()
8372 let newname= input("Moving ".oldname." to : ",oldname)
8373 call inputrestore()
8374
8375 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8376 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
8377 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008378 let oldname= shellescape(a:path.oldname)
8379 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008380" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8381 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008382 endif
8383
8384 let ctr= ctr + 1
8385 endwhile
8386 endif
8387
8388 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02008389 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8390 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008391
8392" call Dret("NetrwRemoteRename")
8393endfun
8394
8395" ---------------------------------------------------------------------
8396" Local Directory Browsing Support: {{{1
8397" ==========================================
8398
8399" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +01008400" netrw#FileUrlRead: handles reading file://* files {{{2
8401" Should accept: file://localhost/etc/fstab
8402" file:///etc/fstab
8403" file:///c:/WINDOWS/clock.avi
8404" file:///c|/WINDOWS/clock.avi
8405" file://localhost/c:/WINDOWS/clock.avi
8406" file://localhost/c|/WINDOWS/clock.avi
8407" file://c:/foo.txt
8408" file:///c:/foo.txt
8409" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
8410fun! netrw#FileUrlRead(fname)
8411" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8412 let fname = a:fname
8413 if fname =~ '^file://localhost/'
8414" call Decho('converting file://localhost/ -to- file:///')
8415 let fname= substitute(fname,'^file://localhost/','file:///','')
8416" call Decho("fname<".fname.">")
8417 endif
8418 if (has("win32") || has("win95") || has("win64") || has("win16"))
8419 if fname =~ '^file:///\=\a[|:]/'
8420" call Decho('converting file:///\a|/ -to- file://\a:/')
8421 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8422" call Decho("fname<".fname.">")
8423 endif
8424 endif
8425 let fname2396 = netrw#RFC2396(fname)
8426 let fname2396e= fnameescape(fname2396)
8427 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
8428 if (has("win32") || has("win95") || has("win64") || has("win16"))
8429" call Decho("windows exception for plainfname")
8430 if plainfname =~ '^/\+\a:'
8431" call Decho('removing leading "/"s')
8432 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8433 endif
8434 endif
8435" call Decho("fname2396<".fname2396.">")
8436" call Decho("plainfname<".plainfname.">")
8437 exe "sil doau BufReadPre ".fname2396e
8438 exe 'keepj r '.plainfname
Bram Moolenaarff034192013-04-24 18:51:19 +02008439 exe 'sil! bdelete '.plainfname
8440 exe 'keepalt file! '.plainfname
Bram Moolenaar97d62492012-11-15 21:28:22 +01008441 keepj 1d
8442" call Decho("(FileUrlRead) setl nomod")
8443 setl nomod
8444" call Decho("(FileUrlRead) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8445" call Dret("netrw#FileUrlRead")
8446 exe "sil doau BufReadPost ".fname2396e
8447endfun
8448
8449" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008450" netrw#LocalBrowseCheck: {{{2
8451fun! netrw#LocalBrowseCheck(dirname)
8452 " unfortunate interaction -- split window debugging can't be
8453 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
8454 " event triggers another call to LocalBrowseCheck() when attempts
8455 " to write to the DBG buffer are made.
8456 " The &ft == "netrw" test was installed because the BufEnter event
8457 " would hit when re-entering netrw windows, creating unexpected
8458 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaarff034192013-04-24 18:51:19 +02008459" call Decho("(LocalBrowseCheck) isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008460" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01008461 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008462 if isdirectory(a:dirname)
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008463" 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 +01008464 let svposn= netrw#NetrwSavePosn()
8465 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008466 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8467 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008468 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008469 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8470 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008471 elseif exists("s:treeforceredraw")
8472 unlet s:treeforceredraw
Bram Moolenaarff034192013-04-24 18:51:19 +02008473 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8474 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008475 endif
8476 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008477 " following code wipes out currently unused netrw buffers
8478 " IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
8479 " AND IF the listing style is not a tree listing
8480 if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
8481 let ibuf = 1
8482 let buflast = bufnr("$")
8483 while ibuf <= buflast
8484 if bufwinnr(ibuf) == -1 && isdirectory(bufname(ibuf))
Bram Moolenaarff034192013-04-24 18:51:19 +02008485 exe "sil! keepalt ".ibuf."bw!"
Bram Moolenaar97d62492012-11-15 21:28:22 +01008486 endif
8487 let ibuf= ibuf + 1
8488 endwhile
8489 endif
8490 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008491 " not a directory, ignore it
8492endfun
8493
8494" ---------------------------------------------------------------------
8495" s:LocalListing: does the job of "ls" for local directories {{{2
8496fun! s:LocalListing()
8497" call Dfunc("s:LocalListing()")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008498" call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8499" call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008500
Bram Moolenaarff034192013-04-24 18:51:19 +02008501" 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
8502" 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 Moolenaar446cb832008-06-24 21:56:24 +00008503
8504 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02008505 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01008506 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02008507 let filelist = glob(s:ComposePath(dirname,"*"),0,1)
8508 let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1)
8509" call Decho("(LocalListing) filelist=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008510
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008511 if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16"))
8512" call Decho("(LocalListing) filelist=".string(filelist))
8513 elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008514 " include ../ in the glob() entry if its missing
Bram Moolenaare6ae6222013-05-21 21:01:10 +02008515" call Decho("(LocalListing) forcibly including on \"..\"")
Bram Moolenaarff034192013-04-24 18:51:19 +02008516 let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
8517" call Decho("(LocalListing) filelist=".string(filelist))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008518 endif
8519
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008520" call Decho("(LocalListing) (before while) dirname<".dirname.">")
8521" call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">")
Bram Moolenaarff034192013-04-24 18:51:19 +02008522" call Decho("(LocalListing) (before while) filelist=".string(filelist))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008523
8524 if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
Bram Moolenaarff034192013-04-24 18:51:19 +02008525 let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
8526 let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
8527" call Decho("(LocalListing) dynamic_maxfilenamelen: filenames =".string(filelistcopy))
8528" call Decho("(LocalListing) dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008529 endif
8530
Bram Moolenaarff034192013-04-24 18:51:19 +02008531 for filename in filelist
8532" call Decho("(LocalListing) ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008533" call Decho("(LocalListing) (while) filename<".filename.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008534
8535 if getftype(filename) == "link"
8536 " indicate a symbolic link
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008537" call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008538 let pfile= filename."@"
8539
8540 elseif getftype(filename) == "socket"
8541 " indicate a socket
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008542" call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008543 let pfile= filename."="
8544
8545 elseif getftype(filename) == "fifo"
8546 " indicate a fifo
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008547" call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008548 let pfile= filename."|"
8549
8550 elseif isdirectory(filename)
8551 " indicate a directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008552" call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008553 let pfile= filename."/"
8554
8555 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
8556 if (has("win32") || has("win95") || has("win64") || has("win16"))
8557 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
8558 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008559" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008560 let pfile= filename."*"
8561 else
8562 " normal file
8563 let pfile= filename
8564 endif
8565 elseif executable(filename)
8566 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008567" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008568 let pfile= filename."*"
8569 else
8570 " normal file
8571 let pfile= filename
8572 endif
8573
8574 else
8575 " normal file
8576 let pfile= filename
8577 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008578" call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008579
8580 if pfile =~ '//$'
8581 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008582" call Decho("(LocalListing) change // to /: pfile<".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008583 endif
8584 let pfile= strpart(pfile,dirnamelen)
8585 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008586" call Decho("(LocalListing) filename<".filename.">")
8587" call Decho("(LocalListing) pfile <".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008588
8589 if w:netrw_liststyle == s:LONGLIST
8590 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008591 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00008592 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008593" call Decho("(LocalListing) sz=".sz." fsz=".fsz)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008594 endif
8595
8596 if g:netrw_sort_by =~ "^t"
8597 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaarff034192013-04-24 18:51:19 +02008598" call Decho("(LocalListing) getftime(".filename.")=".getftime(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008599 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008600 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008601" call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008602 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008603 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008604
8605 elseif g:netrw_sort_by =~ "^s"
8606 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008607" call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008608 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008609 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008610" call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008611 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008612 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008613
8614 else
8615 " sort by name
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008616" call Decho("(LocalListing) exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008617 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008618 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02008619 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00008620
8621 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008622 sil! keepj g/^$/d
8623 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01008624 call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008625" call Decho("(LocalListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
8626 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008627
8628" call Dret("s:LocalListing")
8629endfun
8630
8631" ---------------------------------------------------------------------
8632" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
8633" performed any shell command. The idea is to cause all local-browsing
8634" buffers to be refreshed after a user has executed some shell command,
8635" on the chance that s/he removed/created a file/directory with it.
8636fun! s:LocalBrowseShellCmdRefresh()
8637" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
8638 " determine which buffers currently reside in a tab
8639 if !exists("s:netrw_browselist")
8640" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
8641 return
8642 endif
8643 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008644" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008645 return
8646 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008647 if exists("s:locbrowseshellcmd")
8648 if s:locbrowseshellcmd
8649 let s:locbrowseshellcmd= 0
8650" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
8651 return
8652 endif
8653 let s:locbrowseshellcmd= 0
8654 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008655 let itab = 1
8656 let buftablist = []
Bram Moolenaar97d62492012-11-15 21:28:22 +01008657 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008658 while itab <= tabpagenr("$")
8659 let buftablist = buftablist + tabpagebuflist()
8660 let itab = itab + 1
8661 tabn
8662 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +02008663" call Decho("(LocalBrowseShellCmdRefresh) buftablist".string(buftablist))
8664" call Decho("(LocalBrowseShellCmdRefresh) s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008665 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
8666 " | refresh any netrw window
8667 " | wipe out any non-displaying netrw buffer
8668 let curwin = winnr()
8669 let ibl = 0
8670 for ibuf in s:netrw_browselist
Bram Moolenaarff034192013-04-24 18:51:19 +02008671" call Decho("(LocalBrowseShellCmdRefresh) bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008672 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
8673 " wipe out any non-displaying netrw buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02008674" call Decho("(LocalBrowseShellCmdRefresh) wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008675 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008676 call remove(s:netrw_browselist,ibl)
Bram Moolenaarff034192013-04-24 18:51:19 +02008677" call Decho("(LocalBrowseShellCmdRefresh) browselist=".string(s:netrw_browselist))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008678 continue
8679 elseif index(tabpagebuflist(),ibuf) != -1
8680 " refresh any netrw buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02008681" call Decho("(LocalBrowseShellCmdRefresh) refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008682 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008683 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008684 endif
8685 let ibl= ibl + 1
8686 endfor
8687 exe curwin."wincmd w"
Bram Moolenaar97d62492012-11-15 21:28:22 +01008688 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008689
8690" call Dret("LocalBrowseShellCmdRefresh")
8691endfun
8692
8693" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +01008694" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
8695"
8696" g:netrw_ Directory Is
8697" fastbrowse Local Remote
8698" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
8699" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
8700" fast 2 H H
8701"
8702" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
8703" Hiding a buffer means that it will be re-used when examined, hence "fast".
8704" (re-using a buffer may not be as accurate)
8705fun! s:LocalFastBrowser()
8706" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse." s:netrw_browser_shellcmd ".(exists("s:netrw_browser_shellcmd")? "exists" : "does not exist"))
8707
8708 " initialize browselist, a list of buffer numbers that the local browser has used
8709 if !exists("s:netrw_browselist")
Bram Moolenaarff034192013-04-24 18:51:19 +02008710" call Decho("(LocalFastBrowser) initialize s:netrw_browselist")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008711 let s:netrw_browselist= []
8712 endif
8713
8714 " append current buffer to fastbrowse list
8715 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
Bram Moolenaarff034192013-04-24 18:51:19 +02008716" call Decho("(LocalFastBrowser) appendng current buffer to browselist")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008717 call add(s:netrw_browselist,bufnr("%"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008718" call Decho("(LocalFastBrowser) browselist=".string(s:netrw_browselist))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008719 endif
8720
8721 " enable autocmd events to handle refreshing/removing local browser buffers
8722 " If local browse buffer is currently showing: refresh it
8723 " If local browse buffer is currently hidden : wipe it
8724 " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing
8725 " =1 : medium speed, re-use directory listing for remote only
8726 " =2 : fast speed, always re-use directory listing when possible
8727 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008728" call Decho("(LocalFastBrowser) setting up local-browser shell command refresh")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008729 let s:netrw_browser_shellcmd= 1
8730 augroup AuNetrwShellCmd
8731 au!
8732 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008733" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008734 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
8735 else
8736 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaarff034192013-04-24 18:51:19 +02008737" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008738 endif
8739 augroup END
8740 endif
8741
8742 " user must have changed fastbrowse to its fast setting, so remove
8743 " the associated autocmd events
8744 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
Bram Moolenaarff034192013-04-24 18:51:19 +02008745" call Decho("(LocalFastBrowser) remove AuNetrwShellCmd autcmd group")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008746 unlet s:netrw_browser_shellcmd
8747 augroup AuNetrwShellCmd
8748 au!
8749 augroup END
8750 augroup! AuNetrwShellCmd
8751 endif
8752
8753" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
8754endfun
8755
8756" ---------------------------------------------------------------------
8757" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
8758fun! s:NetrwLocalExecute(cmd)
8759" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
8760 let ykeep= @@
8761 " sanity check
8762 if !executable(a:cmd)
8763 call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
8764 let @@= ykeep
8765" call Dret("s:NetrwLocalExecute")
8766 return
8767 endif
8768
8769 let optargs= input(":!".a:cmd,"","file")
8770" call Decho("optargs<".optargs.">")
8771 let result= system(a:cmd.optargs)
8772" call Decho(result)
8773
8774 " strip any ansi escape sequences off
8775 let result = substitute(result,"\e\\[[0-9;]*m","","g")
8776
8777 " show user the result(s)
8778 echomsg result
8779 let @@= ykeep
8780
8781" call Dret("s:NetrwLocalExecute")
8782endfun
8783
8784" ---------------------------------------------------------------------
8785" s:NetrwLocalRename: rename a remote file or directory {{{2
8786fun! s:NetrwLocalRename(path) range
8787" call Dfunc("NetrwLocalRename(path<".a:path.">)")
8788
8789 " preparation for removing multiple files/directories
8790 let ykeep = @@
8791 let ctr = a:firstline
8792 let svpos = netrw#NetrwSavePosn()
8793
8794 " rename files given by the markfilelist
8795 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8796 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8797" call Decho("oldname<".oldname.">")
8798 if exists("subfrom")
8799 let newname= substitute(oldname,subfrom,subto,'')
8800" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8801 else
8802 call inputsave()
8803 let newname= input("Moving ".oldname." to : ",oldname)
8804 call inputrestore()
8805 if newname =~ '^s/'
8806 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8807 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8808" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8809 let newname = substitute(oldname,subfrom,subto,'')
8810 endif
8811 endif
8812 call rename(oldname,newname)
8813 endfor
8814 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
8815
8816 else
8817
8818 " attempt to rename files/directories
8819 while ctr <= a:lastline
8820 exe "keepj ".ctr
8821
8822 " sanity checks
8823 if line(".") < w:netrw_bannercnt
8824 let ctr= ctr + 1
8825 continue
8826 endif
8827 let curword= s:NetrwGetWord()
8828 if curword == "./" || curword == "../"
8829 let ctr= ctr + 1
8830 continue
8831 endif
8832
8833 keepj norm! 0
8834 let oldname= s:ComposePath(a:path,curword)
8835" call Decho("oldname<".oldname.">")
8836
8837 call inputsave()
8838 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
8839 call inputrestore()
8840
8841 call rename(oldname,newname)
8842" call Decho("renaming <".oldname."> to <".newname.">")
8843
8844 let ctr= ctr + 1
8845 endwhile
8846 endif
8847
8848 " refresh the directory
8849" call Decho("refresh the directory listing")
8850 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8851 keepj call netrw#NetrwRestorePosn(svpos)
8852 let @@= ykeep
8853
8854" call Dret("NetrwLocalRename")
8855endfun
8856
8857" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008858" s:NetrwLocalRm: {{{2
8859fun! s:NetrwLocalRm(path) range
8860" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
8861" call Decho("firstline=".a:firstline." lastline=".a:lastline)
8862
8863 " preparation for removing multiple files/directories
Bram Moolenaar97d62492012-11-15 21:28:22 +01008864 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008865 let ret = 0
8866 let all = 0
8867 let svpos = netrw#NetrwSavePosn()
8868
8869 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8870 " remove all marked files
8871" call Decho("remove all marked files")
8872 for fname in s:netrwmarkfilelist_{bufnr("%")}
8873 let ok= s:NetrwLocalRmFile(a:path,fname,all)
8874 if ok =~ 'q\%[uit]' || ok == "no"
8875 break
8876 elseif ok =~ 'a\%[ll]'
8877 let all= 1
8878 endif
8879 endfor
8880 call s:NetrwUnMarkFile(1)
8881
8882 else
8883 " remove (multiple) files and directories
8884" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
8885
8886 let ctr = a:firstline
8887 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008888 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008889
8890 " sanity checks
8891 if line(".") < w:netrw_bannercnt
8892 let ctr= ctr + 1
8893 continue
8894 endif
8895 let curword= s:NetrwGetWord()
8896 if curword == "./" || curword == "../"
8897 let ctr= ctr + 1
8898 continue
8899 endif
8900 let ok= s:NetrwLocalRmFile(a:path,curword,all)
8901 if ok =~ 'q\%[uit]' || ok == "no"
8902 break
8903 elseif ok =~ 'a\%[ll]'
8904 let all= 1
8905 endif
8906 let ctr= ctr + 1
8907 endwhile
8908 endif
8909
8910 " refresh the directory
8911" call Decho("bufname<".bufname("%").">")
8912 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008913 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8914 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008915 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008916 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008917
8918" call Dret("s:NetrwLocalRm")
8919endfun
8920
8921" ---------------------------------------------------------------------
8922" s:NetrwLocalRmFile: remove file fname given the path {{{2
8923" Give confirmation prompt unless all==1
8924fun! s:NetrwLocalRmFile(path,fname,all)
8925" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
8926
8927 let all= a:all
8928 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008929 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008930 let rmfile= s:ComposePath(a:path,a:fname)
8931" call Decho("rmfile<".rmfile.">")
8932
8933 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
8934 " attempt to remove file
8935" call Decho("attempt to remove file<".rmfile.">")
8936 if !all
8937 echohl Statement
8938 call inputsave()
8939 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8940 call inputrestore()
8941 echohl NONE
8942 if ok == ""
8943 let ok="no"
8944 endif
8945" call Decho("response: ok<".ok.">")
8946 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8947" call Decho("response: ok<".ok."> (after sub)")
8948 if ok =~ 'a\%[ll]'
8949 let all= 1
8950 endif
8951 endif
8952
8953 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00008954 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008955" call Decho("errcode=".v:shell_error." ret=".ret)
8956 endif
8957
8958 else
8959 " attempt to remove directory
8960 if !all
8961 echohl Statement
8962 call inputsave()
8963 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8964 call inputrestore()
8965 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8966 if ok == ""
8967 let ok="no"
8968 endif
8969 if ok =~ 'a\%[ll]'
8970 let all= 1
8971 endif
8972 endif
8973 let rmfile= substitute(rmfile,'[\/]$','','e')
8974
8975 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008976" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')')
8977 call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008978" call Decho("v:shell_error=".v:shell_error)
8979
8980 if v:shell_error != 0
8981" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008982 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008983" call Decho("errcode=".errcode)
8984
8985 if errcode != 0
8986 if has("unix")
8987" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008988 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008989 if v:shell_error != 0 && !exists("g:netrw_quiet")
8990 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
8991 let ok="no"
8992 endif
8993 elseif !exists("g:netrw_quiet")
8994 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
8995 let ok="no"
8996 endif
8997 endif
8998 endif
8999 endif
9000 endif
9001
9002" call Dret("s:NetrwLocalRmFile ".ok)
9003 return ok
9004endfun
9005
9006" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009007" Support Functions: {{{1
9008
Bram Moolenaar488c6512005-08-11 20:09:58 +00009009" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009010" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
9011fun! netrw#WinPath(path)
9012" call Dfunc("netrw#WinPath(path<".a:path.">)")
9013 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
9014 " remove cygdrive prefix, if present
9015 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
9016 " remove trailing slash (Win95)
9017 let path = substitute(path, '\(\\\|/\)$', '', 'g')
9018 " remove escaped spaces
9019 let path = substitute(path, '\ ', ' ', 'g')
9020 " convert slashes to backslashes
9021 let path = substitute(path, '/', '\', 'g')
9022 else
9023 let path= a:path
9024 endif
9025" call Dret("netrw#WinPath <".path.">")
9026 return path
9027endfun
9028
9029" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009030" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
9031fun! netrw#NetrwRestorePosn(...)
9032" 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))
9033 let eikeep= &ei
9034 set ei=all
9035 if expand("%") == "NetrwMessage"
Bram Moolenaarff034192013-04-24 18:51:19 +02009036 if exists("s:winBeforeErr")
9037 exe s:winBeforeErr."wincmd w"
9038 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00009039 endif
9040
9041 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02009042 exe "keepj ".a:1
Bram Moolenaarc236c162008-07-13 17:41:49 +00009043 endif
9044
9045 " restore window
9046 if exists("w:netrw_winnr")
Bram Moolenaarff034192013-04-24 18:51:19 +02009047" call Decho("(NetrwRestorePosn) restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009048 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00009049 endif
9050 if v:shell_error == 0
9051 " as suggested by Bram M: redraw on no error
9052 " allows protocol error messages to remain visible
9053" redraw!
9054 endif
9055
9056 " restore top-of-screen line
9057 if exists("w:netrw_hline")
Bram Moolenaarff034192013-04-24 18:51:19 +02009058" call Decho("(NetrwRestorePosn) restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009059 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00009060 endif
9061
9062 " restore position
9063 if exists("w:netrw_line") && exists("w:netrw_col")
Bram Moolenaarff034192013-04-24 18:51:19 +02009064" call Decho("(NetrwRestorePosn) restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009065 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00009066 endif
9067
9068 let &ei= eikeep
Bram Moolenaarff034192013-04-24 18:51:19 +02009069" call Dret("netrw#NetrwRestorePosn : line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
Bram Moolenaarc236c162008-07-13 17:41:49 +00009070endfun
9071
9072" ---------------------------------------------------------------------
9073" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
9074fun! netrw#NetrwSavePosn()
Bram Moolenaarff034192013-04-24 18:51:19 +02009075" call Dfunc("netrw#NetrwSavePosn() line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
Bram Moolenaarc236c162008-07-13 17:41:49 +00009076 " Save current line and column
9077 let w:netrw_winnr= winnr()
9078 let w:netrw_line = line(".")
9079 let w:netrw_col = virtcol(".")
Bram Moolenaarff034192013-04-24 18:51:19 +02009080" call Decho("(NetrwSavePosn) currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009081
9082 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009083 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00009084 let w:netrw_hline= line(".")
9085
9086 " set up string holding position parameters
9087 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
9088
Bram Moolenaaradc21822011-04-01 18:03:16 +02009089 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00009090" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
9091 return ret
9092endfun
9093
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009094" ---------------------------------------------------------------------
9095" netrw#NetrwAccess: intended to provide access to variable values for netrw's test suite {{{2
9096" 0: marked file list of current buffer
9097" 1: marked file target
9098fun! netrw#NetrwAccess(ilist)
9099 if a:ilist == 0
9100 if exists("s:netrwmarkfilelist_".bufnr('%'))
9101 return s:netrwmarkfilelist_{bufnr('%')}
9102 else
9103 return "no-list-buf#".bufnr('%')
9104 endif
9105 elseif a:ilist == 1
9106 return s:netrwmftgt
9107endfun
9108
Bram Moolenaarc236c162008-07-13 17:41:49 +00009109" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009110" netrw#RFC2396: converts %xx into characters {{{2
9111fun! netrw#RFC2396(fname)
9112" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
9113 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
9114" call Dret("netrw#RFC2396 ".fname)
9115 return fname
9116endfun
9117
9118" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009119" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
9120fun! s:ComposePath(base,subdir)
9121" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
9122
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009123 if has("amiga")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009124" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01009125 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00009126 if ec != '/' && ec != ':'
9127 let ret = a:base . "/" . a:subdir
9128 else
9129 let ret = a:base . a:subdir
9130 endif
9131
9132 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
9133" call Decho("windows")
9134 let ret= a:subdir
9135
Bram Moolenaar5c736222010-01-06 20:54:52 +01009136 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
9137" call Decho("windows")
9138 if a:base =~ '[/\\]$'
9139 let ret= a:base.a:subdir
9140 else
9141 let ret= a:base."/".a:subdir
9142 endif
9143
Bram Moolenaarc236c162008-07-13 17:41:49 +00009144 elseif a:base =~ '^\a\+://'
9145" call Decho("remote linux/macos")
9146 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
9147 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
9148 if a:subdir == '../'
9149 if curpath =~ '[^/]/[^/]\+/$'
9150 let curpath= substitute(curpath,'[^/]\+/$','','')
9151 else
9152 let curpath=""
9153 endif
9154 let ret= urlbase.curpath
9155 else
9156 let ret= urlbase.curpath.a:subdir
9157 endif
9158" call Decho("urlbase<".urlbase.">")
9159" call Decho("curpath<".curpath.">")
9160" call Decho("ret<".ret.">")
9161
9162 else
9163" call Decho("local linux/macos")
9164 let ret = substitute(a:base."/".a:subdir,"//","/","g")
9165 if a:base =~ '^//'
9166 " keeping initial '//' for the benefit of network share listing support
9167 let ret= '/'.ret
9168 endif
9169 let ret= simplify(ret)
9170 endif
9171
9172" call Dret("s:ComposePath ".ret)
9173 return ret
9174endfun
9175
9176" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009177" s:FileReadable: o/s independent filereadable {{{2
9178fun! s:FileReadable(fname)
9179" call Dfunc("s:FileReadable(fname<".a:fname.">)")
9180
9181 if g:netrw_cygwin
9182 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
9183 else
9184 let ret= filereadable(a:fname)
9185 endif
9186
9187" call Dret("s:FileReadable ".ret)
9188 return ret
9189endfun
9190
9191" ---------------------------------------------------------------------
9192" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
9193" Places correct suffix on end of temporary filename,
9194" using the suffix provided with fname
9195fun! s:GetTempfile(fname)
9196" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
9197
9198 if !exists("b:netrw_tmpfile")
9199 " get a brand new temporary filename
9200 let tmpfile= tempname()
9201" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009202
Bram Moolenaarc236c162008-07-13 17:41:49 +00009203 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009204" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009205
Bram Moolenaar9964e462007-05-05 17:54:07 +00009206 " sanity check -- does the temporary file's directory exist?
9207 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009208" 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 +02009209 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00009210" call Dret("s:GetTempfile getcwd<".getcwd().">")
9211 return ""
9212 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009213
Bram Moolenaar9964e462007-05-05 17:54:07 +00009214 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01009215 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009216" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009217
Bram Moolenaar9964e462007-05-05 17:54:07 +00009218 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00009219 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00009220 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
9221 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009222 if !exists("+shellslash") || !&ssl
9223 let tmpfile = substitute(tmpfile,'/','\','g')
9224 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009225 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00009226 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00009227 endif
9228 let b:netrw_tmpfile= tmpfile
9229" call Decho("o/s dependent fixed tempname<".tmpfile.">")
9230 else
9231 " re-use temporary filename
9232 let tmpfile= b:netrw_tmpfile
9233" call Decho("tmpfile<".tmpfile."> re-using")
9234 endif
9235
9236 " use fname's suffix for the temporary file
9237 if a:fname != ""
9238 if a:fname =~ '\.[^./]\+$'
9239" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009240 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00009241 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009242 elseif a:fname =~ '.txz$'
9243 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009244 else
9245 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
9246 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009247" call Decho("suffix<".suffix.">")
9248 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
9249" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
9250 let tmpfile .= suffix
9251" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
9252 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
9253 endif
9254 endif
9255
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009256" 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 +00009257" call Dret("s:GetTempfile <".tmpfile.">")
9258 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00009259endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00009260
9261" ---------------------------------------------------------------------
9262" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00009263" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00009264fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009265" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009266 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
9267 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00009268 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009269 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00009270 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009271 else
9272 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
9273 endif
9274" call Dret("s:MakeSshCmd <".sshcmd.">")
9275 return sshcmd
9276endfun
9277
9278" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009279" s:NetrwBMShow: {{{2
9280fun! s:NetrwBMShow()
9281" call Dfunc("s:NetrwBMShow()")
9282 redir => bmshowraw
9283 menu
9284 redir END
9285 let bmshowlist = split(bmshowraw,'\n')
9286 if bmshowlist != []
9287 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
9288 if bmshowfuncs != []
9289 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
9290 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02009291 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00009292 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009293 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009294 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00009295" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
9296endfun
9297
9298" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02009299" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
9300fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009301 if !exists("w:netrw_liststyle")
9302 let w:netrw_liststyle= g:netrw_liststyle
9303 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02009304" 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 +02009305
9306 if &ft != "netrw"
9307 " if the current window isn't a netrw directory listing window, then use user cursorline/column
9308 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaar15146672011-10-20 22:22:38 +02009309" call Decho("case ft!=netrw: use user cul,cuc")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009310 let &l:cursorline = s:netrw_usercul
9311 let &l:cursorcolumn = s:netrw_usercuc
9312
9313 elseif g:netrw_cursor == 4
9314 " all styles: cursorline, cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02009315" call Decho("case g:netrw_cursor==4: setl cul cuc")
9316 setl cursorline
9317 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02009318
9319 elseif g:netrw_cursor == 3
9320 " thin-long-tree: cursorline, user's cursorcolumn
9321 " wide : cursorline, cursorcolumn
9322 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02009323" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc")
Bram Moolenaar15146672011-10-20 22:22:38 +02009324 setl cursorline
9325 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02009326 else
Bram Moolenaarff034192013-04-24 18:51:19 +02009327" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)")
Bram Moolenaar15146672011-10-20 22:22:38 +02009328 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009329 let &l:cursorcolumn = s:netrw_usercuc
9330 endif
9331
9332 elseif g:netrw_cursor == 2
9333 " thin-long-tree: cursorline, user's cursorcolumn
9334 " wide : cursorline, user's cursorcolumn
Bram Moolenaarff034192013-04-24 18:51:19 +02009335" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009336 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +02009337 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009338
9339 elseif g:netrw_cursor == 1
9340 " thin-long-tree: user's cursorline, user's cursorcolumn
9341 " wide : cursorline, user's cursorcolumn
9342 let &l:cursorcolumn = s:netrw_usercuc
9343 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02009344" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)")
Bram Moolenaar15146672011-10-20 22:22:38 +02009345 set cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009346 else
Bram Moolenaar15146672011-10-20 22:22:38 +02009347" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009348 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009349 endif
9350
9351 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02009352 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02009353" call Decho("default: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009354 let &l:cursorline = s:netrw_usercul
9355 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009356 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009357
9358" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009359endfun
9360
9361" ---------------------------------------------------------------------
9362" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
9363fun! s:RestoreCursorline()
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009364" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%")." mod=".&mod)
Bram Moolenaaradc21822011-04-01 18:03:16 +02009365 if exists("s:netrw_usercul")
9366 let &l:cursorline = s:netrw_usercul
9367 endif
9368 if exists("s:netrw_usercuc")
9369 let &l:cursorcolumn = s:netrw_usercuc
9370 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009371" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
9372endfun
9373
9374" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009375" s:NetrwDelete: Deletes a file. {{{2
9376" Uses Steve Hall's idea to insure that Windows paths stay
9377" acceptable. No effect on Unix paths.
9378" Examples of use: let result= s:NetrwDelete(path)
9379fun! s:NetrwDelete(path)
9380" call Dfunc("s:NetrwDelete(path<".a:path.">)")
9381
Bram Moolenaar5c736222010-01-06 20:54:52 +01009382 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009383 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
9384 if exists("+shellslash")
9385 let sskeep= &shellslash
Bram Moolenaarff034192013-04-24 18:51:19 +02009386 setl noshellslash
Bram Moolenaarc236c162008-07-13 17:41:49 +00009387 let result = delete(path)
9388 let &shellslash = sskeep
9389 else
9390" call Decho("exe let result= ".a:cmd."('".path."')")
9391 let result= delete(path)
9392 endif
9393 else
9394" call Decho("let result= delete(".path.")")
9395 let result= delete(path)
9396 endif
9397 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02009398 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009399 endif
9400
9401" call Dret("s:NetrwDelete ".result)
9402 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00009403endfun
9404
9405" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009406" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01009407fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009408" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009409" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009410
Bram Moolenaar446cb832008-06-24 21:56:24 +00009411 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009412" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009413 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
9414 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
9415 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
9416 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
9417 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9418 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
9419 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
9420 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
9421 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
9422 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9423 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
9424 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
9425 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
9426 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
9427 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
9428 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
9429
Bram Moolenaaradc21822011-04-01 18:03:16 +02009430 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009431" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009432 let netrw_keepdiff= &l:diff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009433 keepj keepalt enew!
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009434 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009435" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02009436 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009437
Bram Moolenaar446cb832008-06-24 21:56:24 +00009438 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009439" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009440 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
9441 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
9442 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
9443 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
9444 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
9445 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
9446 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
9447 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
9448 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
9449 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
9450 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
9451 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
9452 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
9453 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
9454 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
9455 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
9456
Bram Moolenaar5c736222010-01-06 20:54:52 +01009457 if a:0 > 0
9458 let b:netrw_curdir= a:1
9459 if b:netrw_curdir =~ '/$'
9460 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
9461 file NetrwTreeListing
Bram Moolenaarff034192013-04-24 18:51:19 +02009462 set bt=nowrite noswf bh=hide
Bram Moolenaaradc21822011-04-01 18:03:16 +02009463 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
9464 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01009465 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009466 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009467 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009468 endif
9469 endif
9470
Bram Moolenaarff034192013-04-24 18:51:19 +02009471" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh)
Bram Moolenaar9964e462007-05-05 17:54:07 +00009472endfun
9473
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009474" ---------------------------------------------------------------------
9475" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
9476fun! s:NetrwInsureWinVars()
Bram Moolenaar97d62492012-11-15 21:28:22 +01009477" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009478 if !exists("w:netrw_liststyle")
9479 let curbuf = bufnr("%")
9480 let curwin = winnr()
9481 let iwin = 1
9482 while iwin <= winnr("$")
9483 exe iwin."wincmd w"
9484 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
9485 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
9486 let winvars= w:
9487 break
9488 endif
9489 let iwin= iwin + 1
9490 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +02009491 exe "keepalt ".curwin."wincmd w"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009492 if exists("winvars")
9493" call Decho("copying w#".iwin." window variables to w#".curwin)
9494 for k in keys(winvars)
9495 let w:{k}= winvars[k]
9496 endfor
9497 endif
9498 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01009499" call Dret("s:NetrwInsureWinVars win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009500endfun
9501
Bram Moolenaar9964e462007-05-05 17:54:07 +00009502" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009503" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
9504" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
9505fun! s:NetrwSaveWordPosn()
9506" call Dfunc("NetrwSaveWordPosn()")
9507 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
9508" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
9509endfun
9510
9511" ---------------------------------------------------------------------
9512" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
9513" changed sorting, etc. Also see s:NetrwSaveWordPosn().
9514fun! s:NetrwRestoreWordPosn()
9515" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009516 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00009517" call Dret("NetrwRestoreWordPosn")
9518endfun
9519
9520" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009521" s:RestoreBufVars: {{{2
9522fun! s:RestoreBufVars()
9523" call Dfunc("s:RestoreBufVars()")
9524
9525 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
9526 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
9527 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
9528 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
9529 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
9530 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
9531
9532" call Dret("s:RestoreBufVars")
9533endfun
9534
9535" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009536" s:RemotePathAnalysis: {{{2
9537fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02009538" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009539
9540 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
9541 let s:method = substitute(a:dirname,dirpat,'\1','')
9542 let s:user = substitute(a:dirname,dirpat,'\2','')
9543 let s:machine = substitute(a:dirname,dirpat,'\3','')
9544 let s:port = substitute(a:dirname,dirpat,'\4','')
9545 let s:path = substitute(a:dirname,dirpat,'\5','')
9546 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
9547
9548" call Decho("set up s:method <".s:method .">")
9549" call Decho("set up s:user <".s:user .">")
9550" call Decho("set up s:machine<".s:machine.">")
9551" call Decho("set up s:port <".s:port.">")
9552" call Decho("set up s:path <".s:path .">")
9553" call Decho("set up s:fname <".s:fname .">")
9554
9555" call Dret("s:RemotePathAnalysis")
9556endfun
9557
9558" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009559" s:RemoteSystem: runs a command on a remote host using ssh {{{2
9560" Returns status
9561" Runs system() on
9562" [cd REMOTEDIRPATH;] a:cmd
9563" Note that it doesn't do shellescape(a:cmd)!
9564fun! s:RemoteSystem(cmd)
9565" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
9566 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02009567 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 +00009568 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009569 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009570 else
9571 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
9572 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
9573 if remotedir != ""
9574 let cmd= cmd.' cd '.shellescape(remotedir).";"
9575 else
9576 let cmd= cmd.' '
9577 endif
9578 let cmd= cmd.a:cmd
9579" call Decho("call system(".cmd.")")
9580 let ret= system(cmd)
9581 endif
9582" call Dret("s:RemoteSystem ".ret)
9583 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00009584endfun
9585
9586" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009587" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009588fun! s:RestoreWinVars()
9589" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00009590 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009591 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
9592 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
9593 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
9594 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
9595 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
9596 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
9597 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
9598 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
9599 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
9600 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
9601 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
9602 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00009603 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
9604 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009605 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
9606 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
9607 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
9608" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00009609endfun
9610
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009611" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009612" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
9613"
9614" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
9615" is true) and a command, :Rexplore, which call this function.
9616"
9617" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
9618fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02009619 if exists("s:netrwdrag")
9620 return
9621 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009622" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02009623 if !exists("w:netrw_rexlocal")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009624" " call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
Bram Moolenaar15146672011-10-20 22:22:38 +02009625 return
9626 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009627 if w:netrw_rexlocal
9628 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009629 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02009630 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009631 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02009632 if exists("s:initbeval")
9633 set beval
9634 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009635 if exists("s:rexposn_".bufnr("%"))
9636" call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%'))
9637 keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')})
9638 unlet s:rexposn_{bufnr('%')}
9639 else
9640" call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009641 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009642 if exists("s:explore_match")
9643 exe "2match netrwMarkFile /".s:explore_match."/"
9644 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009645" call Dret("s:NetrwRexplore")
9646endfun
9647
9648" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009649" s:SaveBufVars: {{{2
9650fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009651" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00009652
9653 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
9654 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
9655 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
9656 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
9657 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
9658 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
9659
9660" call Dret("s:SaveBufVars")
9661endfun
9662
9663" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009664" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009665fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009666" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00009667 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
9668 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
9669 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
9670 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
9671 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
9672 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
9673 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
9674 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
9675 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
9676 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
9677 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
9678 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
9679 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
9680 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
9681 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
9682 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
9683 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
9684 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
9685" call Dret("s:SaveWinVars")
9686endfun
9687
9688" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009689" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009690" To allow separate windows to have their own activities, such as
9691" Explore **/pattern, several variables have been made window-oriented.
9692" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009693" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009694" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009695fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009696" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00009697 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
9698 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
9699 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
9700 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
9701 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
9702 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
9703 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
9704 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
9705 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
9706 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
9707" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009708endfun
9709
9710" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009711" s:SetRexDir: set directory for :Rexplore {{{2
9712fun! s:SetRexDir(islocal,dirname)
9713" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009714 let w:netrw_rexdir = a:dirname
9715 let w:netrw_rexlocal = a:islocal
Bram Moolenaar97d62492012-11-15 21:28:22 +01009716" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009717endfun
9718
9719" ---------------------------------------------------------------------
9720" s:Strlen: this function returns the length of a string, even if its {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +02009721" using multiple-byte characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01009722" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
9723" and a bit from me.
9724" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00009725fun! s:Strlen(x)
9726" call Dfunc("s:Strlen(x<".a:x.">")
9727 if g:netrw_xstrlen == 1
9728 " number of codepoints (Latin a + combining circumflex is two codepoints)
9729 " (comment from TM, solution from NW)
9730 let ret= strlen(substitute(a:x,'.','c','g'))
9731
9732 elseif g:netrw_xstrlen == 2
9733 " number of spacing codepoints (Latin a + combining circumflex is one spacing
9734 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
9735 " (comment from TM, solution from TM)
9736 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
9737
9738 elseif g:netrw_xstrlen == 3
9739 " virtual length (counting, for instance, tabs as anything between 1 and
9740 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
9741 " preceded by lam, one otherwise, etc.)
9742 " (comment from TM, solution from me)
9743 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009744 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009745 call setline(line("."),a:x)
9746 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009747 keepj d
Bram Moolenaarff034192013-04-24 18:51:19 +02009748 keepj norm! k
Bram Moolenaar446cb832008-06-24 21:56:24 +00009749 let &mod= modkeep
9750
9751 else
9752 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01009753 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009754 endif
9755" call Dret("s:Strlen ".ret)
9756 return ret
9757endfun
9758
9759" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009760" s:TreeListMove: {{{2
9761fun! s:TreeListMove(dir)
9762" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
9763 let curline = getline('.')
9764 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
9765 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
9766 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
9767 let indentm1 = substitute(curindent,'^| ','','')
9768" call Decho("prvline <".prvline."> #".line(".")-1)
9769" call Decho("curline <".curline."> #".line("."))
9770" call Decho("nxtline <".nxtline."> #".line(".")+1)
9771" call Decho("curindent<".curindent.">")
9772" call Decho("indentm1 <".indentm1.">")
9773
9774 if curline !~ '/$'
9775" call Decho('regfile')
9776 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009777 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009778 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
9779" call Decho("regfile srch back: ".nl)
9780 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009781 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009782 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
9783" call Decho("regfile srch fwd: ".nl)
9784 endif
9785
9786 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009787 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009788 let curline= line(".")
9789 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
9790" call Decho("dir srch back ind: ".nl)
9791 if nl != 0
9792 if line(".") == curline-1
9793 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
9794" call Decho("dir srch back ind-1: ".nl)
9795 endif
9796 endif
9797
9798 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009799 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009800 let curline = line(".")
9801 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
9802" call Decho("dir srch fwd ind: ".nl)
9803 if nl != 0
9804 if line(".") == curline+1
9805 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
9806" call Decho("dir srch fwd ind-1: ".nl)
9807 endif
9808 endif
9809
9810 endif
9811
9812" call Dret("s:TreeListMove")
9813endfun
9814
9815" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009816" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
9817" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
9818" can't be called except via emenu. But due to locale, that menu line may not be called
9819" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
9820fun! s:UpdateBuffersMenu()
9821" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009822 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009823 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02009824 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009825 catch /^Vim\%((\a\+)\)\=:E/
9826 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02009827 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00009828 endtry
9829 endif
9830" call Dret("s:UpdateBuffersMenu")
9831endfun
9832
9833" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009834" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02009835" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009836fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009837" call Dfunc("s:UseBufWinVars()")
9838 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009839 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
9840 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
9841 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
9842 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
9843 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
9844 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9845 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9846 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
9847 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 +00009848" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009849endfun
9850
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009851" ---------------------------------------------------------------------
Bram Moolenaare6ae6222013-05-21 21:01:10 +02009852" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00009853let &cpo= s:keepcpo
9854unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00009855
Bram Moolenaar071d4272004-06-13 20:20:40 +00009856" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00009857" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00009858" vim:ts=8 fdm=marker