blob: 8422d9dea38c409e165fcb67ac963f4c0ea5adfe [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 Moolenaarff034192013-04-24 18:51:19 +02003" Date: Apr 16, 2013
4" Version: 148
5" 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 Moolenaarff034192013-04-24 18:51:19 +020025let g:loaded_netrw = "v148"
26if 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 Moolenaarff034192013-04-24 18:51:19 +020052" Apr 02, 2013 : max errnum currently is 92
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 Moolenaar97d62492012-11-15 21:28:22 +010057" 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 Moolenaarff034192013-04-24 18:51:19 +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")
205call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
206call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
207call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000208
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000209if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000210 \ && exists("g:netrw_use_nt_rcp")
211 \ && g:netrw_use_nt_rcp
212 \ && executable( $SystemRoot .'/system32/rcp.exe')
213 let s:netrw_has_nt_rcp = 1
214 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000215else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000216 let s:netrw_has_nt_rcp = 0
217 let s:netrw_rcpmode = ''
218endif
219
220" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000221" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000222" Cygwin Detection ------- {{{3
223if !exists("g:netrw_cygwin")
224 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100225 if has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000226 let g:netrw_cygwin= 1
227 else
228 let g:netrw_cygwin= 0
229 endif
230 else
231 let g:netrw_cygwin= 0
232 endif
233endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000234" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100235call s:NetrwInit("g:netrw_alto" , &sb)
236call s:NetrwInit("g:netrw_altv" , &spr)
237call s:NetrwInit("g:netrw_banner" , 1)
238call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200239call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100240call s:NetrwInit("g:netrw_chgwin" , -1)
241call s:NetrwInit("g:netrw_compress" , "gzip")
242call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200243if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
244 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
245 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000246endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200247call s:NetrwInit("g:netrw_cursor" , 2)
248let s:netrw_usercul = &cursorline
249let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar446cb832008-06-24 21:56:24 +0000250" Default values - d-g ---------- {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +0200251call s:NetrwInit("s:didstarstar",0)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100252call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200253call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100254call s:NetrwInit("g:netrw_dirhistmax" , 10)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200255call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100256call s:NetrwInit("g:netrw_fastbrowse" , 1)
257call 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 +0000258if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000259 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
260 let g:netrw_ftp_list_cmd = "ls -lF"
261 let g:netrw_ftp_timelist_cmd = "ls -tlF"
262 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000263 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000264 let g:netrw_ftp_list_cmd = "dir"
265 let g:netrw_ftp_timelist_cmd = "dir"
266 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000267 endif
268endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100269call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000270" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100271call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000272if !exists("g:netrw_ignorenetrc")
273 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
274 let g:netrw_ignorenetrc= 1
275 else
276 let g:netrw_ignorenetrc= 0
277 endif
278endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100279call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000280if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000281 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
282 " provide a 'pscp' listing command
283 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
284 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
285 endif
286 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
287 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000288 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000289 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000290 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000291" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000292 let g:netrw_list_cmd= ""
293 endif
294endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100295call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000296" Default values - lh-lz ---------- {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200297if exists("g:netrw_local_copycmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200298 let g:netrw_localcopycmd= g:netrw_local_copycmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200299 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
300endif
Bram Moolenaar97d62492012-11-15 21:28:22 +0100301if !exists("g:netrw_localcmdshell")
302 let g:netrw_localcmdshell= ""
303endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000304if !exists("g:netrw_localcopycmd")
305 if has("win32") || has("win95") || has("win64") || has("win16")
306 if g:netrw_cygwin
307 let g:netrw_localcopycmd= "cp"
308 else
Bram Moolenaar97d62492012-11-15 21:28:22 +0100309 let g:netrw_localcopycmd= "cmd /c copy"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000310 endif
311 elseif has("unix") || has("macunix")
312 let g:netrw_localcopycmd= "cp"
313 else
314 let g:netrw_localcopycmd= ""
315 endif
316endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200317if exists("g:netrw_local_mkdir")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100318 let g:netrw_localmkdir= g:netrw_local_mkdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200319 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
320endif
321call s:NetrwInit("g:netrw_localmkdir","mkdir")
Bram Moolenaar15146672011-10-20 22:22:38 +0200322call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200323if exists("g:netrw_local_movecmd")
Bram Moolenaarff034192013-04-24 18:51:19 +0200324 let g:netrw_localmovecmd= g:netrw_local_movecmd
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200325 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
326endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000327if !exists("g:netrw_localmovecmd")
328 if has("win32") || has("win95") || has("win64") || has("win16")
329 if g:netrw_cygwin
330 let g:netrw_localmovecmd= "mv"
331 else
Bram Moolenaar97d62492012-11-15 21:28:22 +0100332 let g:netrw_localmovecmd= "cmd /c move"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000333 endif
334 elseif has("unix") || has("macunix")
335 let g:netrw_localmovecmd= "mv"
336 else
337 let g:netrw_localmovecmd= ""
338 endif
339endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200340call s:NetrwInit("g:netrw_localrmdir", "rmdir")
341if exists("g:netrw_local_rmdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200342 let g:netrw_localrmdir= g:netrw_local_rmdir
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200343 call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
344endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100345call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
346" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000347if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000348 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000349endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000350if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000351 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
352endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000353" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100354call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
355call s:NetrwInit("g:netrw_maxfilenamelen", 32)
356call s:NetrwInit("g:netrw_menu" , 1)
357call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
Bram Moolenaarff034192013-04-24 18:51:19 +0200358call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~ '[anh]'))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100359call s:NetrwInit("g:netrw_retmap" , 0)
360if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
361 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
362elseif has("win32") || has("win95") || has("win64") || has("win16")
363 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
364else
365 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000366endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100367call s:NetrwInit("g:netrw_preview" , 0)
368call s:NetrwInit("g:netrw_scpport" , "-P")
369call s:NetrwInit("g:netrw_sshport" , "-p")
370call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
371call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
372call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
373call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000374" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100375" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
376call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200377call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100378call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
379call s:NetrwInit("g:netrw_sort_options" , "")
380call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000381if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100382 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200383 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100384 else
385 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000386 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000387endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100388call s:NetrwInit("g:netrw_special_syntax" , 0)
389call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
390call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000391" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100392call s:NetrwInit("g:netrw_timefmt","%c")
Bram Moolenaarff034192013-04-24 18:51:19 +0200393if !exists("g:netrw_xstrlen")
394 if exists("g:Align_xstrlen")
395 let g:netrw_xstrlen= g:Align_xstrlen
396 elseif exists("g:drawit_xstrlen")
397 let g:netrw_xstrlen= g:drawit_xstrlen
398 elseif &enc == "latin1" || !has("multi_byte")
399 let g:netrw_xstrlen= 0
400 else
401 let g:netrw_xstrlen= 1
402 endif
403endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100404call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100405call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200406call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200407if g:netrw_winsize == 0|let g:netrw_winsize= -1|endif
408if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000409" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000410" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100411call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200412if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarff034192013-04-24 18:51:19 +0200413 call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200414else
Bram Moolenaarff034192013-04-24 18:51:19 +0200415 call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200416endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200417call s:NetrwInit("g:netrw_menu_escape",'.&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100418call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
419call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000420
421" BufEnter event ignored by decho when following variable is true
422" Has a side effect that doau BufReadPost doesn't work, so
423" files read by network transfer aren't appropriately highlighted.
424"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425
Bram Moolenaaradc21822011-04-01 18:03:16 +0200426" ======================
427" Netrw Initialization: {{{1
428" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200429if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
430 let s:initbeval = &beval
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200431" let s:initbexpr = &l:bexpr
Bram Moolenaar15146672011-10-20 22:22:38 +0200432 let &l:bexpr = "netrw#NetrwBalloonHelp()"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200433 set beval
Bram Moolenaar15146672011-10-20 22:22:38 +0200434 au BufWinEnter,WinEnter * if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200435endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200436au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200437
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000438" ==============================
439" Netrw Utility Functions: {{{1
440" ==============================
441
Bram Moolenaaradc21822011-04-01 18:03:16 +0200442" ---------------------------------------------------------------------
443" netrw#NetrwBalloonHelp: {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +0200444if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200445 fun! netrw#NetrwBalloonHelp()
Bram Moolenaar15146672011-10-20 22:22:38 +0200446 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 +0200447 let mesg= ""
448 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
Bram Moolenaar15146672011-10-20 22:22:38 +0200449 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 +0200450 elseif getline(v:beval_lnum) =~ '^"\s*/'
451 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
452 elseif v:beval_text == "Sorted" || v:beval_text == "by"
453 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
454 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
455 let mesg = "S: edit sorting sequence"
456 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
457 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
458 elseif v:beval_text == "Quick" || v:beval_text == "Help"
459 let mesg = "Help: press <F1>"
460 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
461 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
462 else
463 let mesg= ""
464 endif
465 return mesg
466 endfun
467endif
468
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200470" s:NetrwOptionSave: save options prior to setting to "netrw-buffer-standard" form {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000471" 06/08/07 : removed call to NetrwSafeOptions(), either placed
472" immediately after NetrwOptionSave() calls in NetRead
473" and NetWrite, or after the s:NetrwEnew() call in
474" NetrwBrowse.
475" vt: normally its "w:" or "s:" (a variable type)
476fun! s:NetrwOptionSave(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100477" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000478" 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 +0200479
Bram Moolenaar446cb832008-06-24 21:56:24 +0000480 if !exists("{a:vt}netrw_optionsave")
481 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000482 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000483" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000484 return
485 endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200486" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000487
488 " Save current settings and current directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200489" call Decho("saving current settings and current directory")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000490 let s:yykeep = @@
Bram Moolenaar15146672011-10-20 22:22:38 +0200491 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000492 let {a:vt}netrw_aikeep = &l:ai
493 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar15146672011-10-20 22:22:38 +0200494 let {a:vt}netrw_bhkeep = &l:bh
495 let {a:vt}netrw_blkeep = &l:bl
496 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200497 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaarff034192013-04-24 18:51:19 +0200498 let {a:vt}netrw_cedit = &cedit
Bram Moolenaar446cb832008-06-24 21:56:24 +0000499 let {a:vt}netrw_cikeep = &l:ci
500 let {a:vt}netrw_cinkeep = &l:cin
501 let {a:vt}netrw_cinokeep = &l:cino
502 let {a:vt}netrw_comkeep = &l:com
503 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200504 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar15146672011-10-20 22:22:38 +0200505 let {a:vt}netrw_fenkeep = &l:fen
506 let {a:vt}netrw_ffkeep = &l:ff
Bram Moolenaar446cb832008-06-24 21:56:24 +0000507 let {a:vt}netrw_fokeep = &l:fo " formatoptions
508 let {a:vt}netrw_gdkeep = &l:gd " gdefault
509 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200510 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar15146672011-10-20 22:22:38 +0200511 let {a:vt}netrw_iskkeep = &l:isk
512 let {a:vt}netrw_lskeep = &l:ls
513 let {a:vt}netrw_makeep = &l:ma
Bram Moolenaar446cb832008-06-24 21:56:24 +0000514 let {a:vt}netrw_magickeep = &l:magic
Bram Moolenaar15146672011-10-20 22:22:38 +0200515 let {a:vt}netrw_modkeep = &l:mod
516 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar446cb832008-06-24 21:56:24 +0000517 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar15146672011-10-20 22:22:38 +0200518 let {a:vt}netrw_rokeep = &l:ro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200519 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000520 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar15146672011-10-20 22:22:38 +0200521 let {a:vt}netrw_tskeep = &l:ts
Bram Moolenaar446cb832008-06-24 21:56:24 +0000522 let {a:vt}netrw_twkeep = &l:tw " textwidth
523 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar15146672011-10-20 22:22:38 +0200524 let {a:vt}netrw_wrapkeep = &l:wrap
525 let {a:vt}netrw_writekeep = &l:write
526 if g:netrw_use_noswf && has("win32") && !has("win95")
527 let {a:vt}netrw_swfkeep = &l:swf
528 endif
529
530 " save a few selected netrw-related variables
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200531" call Decho("saving a few selected netrw-related variables")
Bram Moolenaar15146672011-10-20 22:22:38 +0200532 if g:netrw_keepdir
533 let {a:vt}netrw_dirkeep = getcwd()
534 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000535 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000536 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000537 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200538 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
539 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000540
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200541" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000542endfun
543
544" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000545" s:NetrwOptionRestore: restore options {{{2
546fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200547" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000548 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar15146672011-10-20 22:22:38 +0200549 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200550" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200551 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200552" call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
553" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
554 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200555 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200556" call Decho("(NetrwOptionRestore) no previous position")
Bram Moolenaar15146672011-10-20 22:22:38 +0200557 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200558" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000559" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000560 return
561 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000562 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000563
Bram Moolenaarff034192013-04-24 18:51:19 +0200564 if exists("+acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000565 if exists("{a:vt}netrw_acdkeep")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200566" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000567 let curdir = getcwd()
568 let &l:acd = {a:vt}netrw_acdkeep
569 unlet {a:vt}netrw_acdkeep
570 if &l:acd
Bram Moolenaar15146672011-10-20 22:22:38 +0200571" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
Bram Moolenaar446cb832008-06-24 21:56:24 +0000572 try
573 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200574 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000575 endif
576 catch /^Vim\%((\a\+)\)\=:E472/
577 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
578 endtry
579 endif
580 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000581 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000582 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
583 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaarff034192013-04-24 18:51:19 +0200584 if g:netrw_liststyle != s:TREELIST
585 if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif
586 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200587 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
588 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 +0200589 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 +0200590 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 +0000591 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
592 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
593 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
594 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
595 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 +0200596 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 +0200597 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
598 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 +0000599 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
600 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
601 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 +0200602 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 +0200603 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
604 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
605 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
606 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
607 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
608 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 +0000609 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 +0200610 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 +0200611 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 +0000612 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 +0100613 " Problem: start with liststyle=0; press <i> : result, following line resets l:ts.
614" 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 +0000615 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
616 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 +0200617 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
618 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 +0000619 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
620 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000621 if &directory == ""
622 " user hasn't specified a swapfile directory;
623 " netrw will temporarily set the swapfile directory
624 " to the current directory as returned by getcwd().
625 let &l:directory = getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200626 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaarff034192013-04-24 18:51:19 +0200627 setl directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000628 unlet {a:vt}netrw_swfkeep
629 elseif &l:swf != {a:vt}netrw_swfkeep
630 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200631 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000632 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000633 endif
634 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200635 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
636 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
637 if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
638 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200639 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
640 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 +0200641 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200642" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200643 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200644" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
645 unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar15146672011-10-20 22:22:38 +0200646 else
647" call Decho("no previous position")
648 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000649
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200650" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
Bram Moolenaarff034192013-04-24 18:51:19 +0200651" call Decho("(NetrwOptionRestore) fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200652" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
653" 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 +0100654" call Decho("(NetrwOptionRestore) ts=".&l:ts)
Bram Moolenaarff034192013-04-24 18:51:19 +0200655 " Moved the filetype detect here from NetrwGetFile() because remote files
656 " were having their filetype detect-generated settings overwritten by
657 " NetrwOptionRestore.
658 if &ft != "netrw"
659" call Decho("(NetrwOptionRestore) filetype detect (ft=".&ft.")")
660 filetype detect
661 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200662" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000663endfun
664
665" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000666" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +0200667" Use s:NetrwSaveOptions() to save user settings
668" Use s:NetrwOptionRestore() to restore user settings
Bram Moolenaar9964e462007-05-05 17:54:07 +0000669fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100670" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
671" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaarff034192013-04-24 18:51:19 +0200672 if exists("+acd") | setl noacd | endif
673 setl noai
674 setl noaw
675 setl nobomb
676 setl noci
677 setl nocin
678 if g:netrw_liststyle == s:TREELIST
679 setl bh=hide
680 endif
681 setl cino=
682 setl com=
683 setl cpo-=a
684 setl cpo-=A
685 setl fo=nroql2
686 setl nohid
687 setl noim
688 setl isk+=@ isk+=* isk+=/
689 setl magic
690 setl report=10000
691 setl sel=inclusive
692 setl nospell
693 setl tw=0
694 setl wig=
695 set cedit&
Bram Moolenaar9964e462007-05-05 17:54:07 +0000696 if g:netrw_use_noswf && has("win32") && !has("win95")
Bram Moolenaarff034192013-04-24 18:51:19 +0200697 setl noswf
Bram Moolenaar9964e462007-05-05 17:54:07 +0000698 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200699 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100700
701 " allow the user to override safe options
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200702" call Decho("ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100703 if &ft == "netrw"
Bram Moolenaarff034192013-04-24 18:51:19 +0200704" call Decho("do any netrw FileType autocmds (doau FileType netrw)")
Bram Moolenaar15146672011-10-20 22:22:38 +0200705 sil! keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100706 endif
707
Bram Moolenaarff034192013-04-24 18:51:19 +0200708" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000709" call Dret("s:NetrwSafeOptions")
710endfun
711
Bram Moolenaar446cb832008-06-24 21:56:24 +0000712" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +0200713" netrw#Explore: launch the local browser in the directory of the current file {{{2
714" indx: == -1: Nexplore
715" == -2: Pexplore
716" == +: this is overloaded:
717" * If Nexplore/Pexplore is in use, then this refers to the
718" indx'th item in the w:netrw_explore_list[] of items which
719" matched the */pattern **/pattern *//pattern **//pattern
720" * If Hexplore or Vexplore, then this will override
721" g:netrw_winsize to specify the qty of rows or columns the
722" newly split window should have.
723" dosplit==0: the window will be split iff the current file has been modified
724" dosplit==1: the window will be split before running the local browser
725" style == 0: Explore style == 1: Explore!
726" == 2: Hexplore style == 3: Hexplore!
727" == 4: Vexplore style == 5: Vexplore!
728" == 6: Texplore
729fun! netrw#Explore(indx,dosplit,style,...)
730" 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("%"))
731 if !exists("b:netrw_curdir")
732 let b:netrw_curdir= getcwd()
733" call Decho("(Explore) set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
734 endif
735 let curdir = simplify(b:netrw_curdir)
736 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
737" call Decho("(Explore) curdir<".curdir."> curfiledir<".curfiledir.">")
738
739 " save registers
740 sil! let keepregstar = @*
741 sil! let keepregplus = @+
742 sil! let keepregslash= @/
743
744 " if dosplit or file has been modified
745 if a:dosplit || &modified || a:style == 6
746" call Decho("(Explore) case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified")
747 call s:SaveWinVars()
748 let winsz= g:netrw_winsize
749 if a:indx > 0
750 let winsz= a:indx
751 endif
752
753 if a:style == 0 " Explore, Sexplore
754" call Decho("(Explore) style=0: Explore or Sexplore")
755 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
756 exe winsz."wincmd s"
757
758 elseif a:style == 1 "Explore!, Sexplore!
759" call Decho("(Explore) style=1: Explore! or Sexplore!")
760 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
761 exe "keepalt ".winsz."wincmd v"
762
763 elseif a:style == 2 " Hexplore
764" call Decho("(Explore) style=2: Hexplore")
765 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
766 exe "keepalt bel ".winsz."wincmd s"
767
768 elseif a:style == 3 " Hexplore!
769" call Decho("(Explore) style=3: Hexplore!")
770 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
771 exe "keepalt abo ".winsz."wincmd s"
772
773 elseif a:style == 4 " Vexplore
774" call Decho("(Explore) style=4: Vexplore")
775 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
776 exe "keepalt lefta ".winsz."wincmd v"
777
778 elseif a:style == 5 " Vexplore!
779" call Decho("(Explore) style=5: Vexplore!")
780 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
781 exe "keepalt rightb ".winsz."wincmd v"
782
783 elseif a:style == 6 " Texplore
784 call s:SaveBufVars()
785" call Decho("(Explore) style = 6: Texplore")
786 exe "keepalt tabnew ".fnameescape(curdir)
787 call s:RestoreBufVars()
788 endif
789 call s:RestoreWinVars()
790" else " Decho
791" call Decho("(Explore) case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6")
792 endif
793 keepj norm! 0
794
795 if a:0 > 0
796" call Decho("(Explore) case [a:0=".a:0."] > 0")
797 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
798" call Decho("(Explore) ..case a:1<".a:1.">: starts with ~ and unix or cygwin")
799 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
800" call Decho("(Explore) ..using dirname<".dirname."> (case: ~ && unix||cygwin)")
801 elseif a:1 == '.'
802" call Decho("(Explore) ..case a:1<".a:1.">: matches .")
803 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
804 if dirname !~ '/$'
805 let dirname= dirname."/"
806 endif
807" call Decho("(Explore) ..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
808 elseif a:1 =~ '\$'
809" call Decho("(Explore) ..case a:1<".a:1.">: matches ending $")
810 let dirname= simplify(expand(a:1))
811" call Decho("(Explore) ..using user-specified dirname<".dirname."> with $env-var")
812 elseif a:1 !~ '^\*\{1,2}/'
813" call Decho("(Explore) ..case a:1<".a:1.">: other, not pattern or filepattern")
814 let dirname= simplify(a:1)
815" call Decho("(Explore) ..using user-specified dirname<".dirname.">")
816 else
817" call Decho("(Explore) ..case a:1: pattern or filepattern")
818 let dirname= a:1
819 endif
820 else
821 " clear explore
822" call Decho("(Explore) case a:0=".a:0.": clearing Explore list")
823 call s:NetrwClearExplore()
824" call Dret("netrw#Explore : cleared list")
825 return
826 endif
827
828" call Decho("(Explore) dirname<".dirname.">")
829 if dirname =~ '\.\./\=$'
830 let dirname= simplify(fnamemodify(dirname,':p:h'))
831 elseif dirname =~ '\.\.' || dirname == '.'
832 let dirname= simplify(fnamemodify(dirname,':p'))
833 endif
834" call Decho("(Explore) dirname<".dirname."> (after simplify)")
835
836 if dirname =~ '^\*//'
837 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
838" call Decho("(Explore) case Explore *//pattern")
839 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
840 let starpat= 1
841" call Decho("(Explore) ..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
842 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
843
844 elseif dirname =~ '^\*\*//'
845 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
846" call Decho("(Explore) case Explore **//pattern")
847 let pattern= substitute(dirname,'^\*\*//','','')
848 let starpat= 2
849" call Decho("(Explore) ..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
850
851 elseif dirname =~ '/\*\*/'
852 " handle .../**/.../filepat
853" call Decho("(Explore) case Explore .../**/.../filepat")
854 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
855 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
856 let b:netrw_curdir = prefixdir
857 else
858 let b:netrw_curdir= getcwd().'/'.prefixdir
859 endif
860 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
861 let starpat= 4
862" call Decho("(Explore) ..pwd<".getcwd()."> dirname<".dirname.">")
863" call Decho("(Explore) ..case Explore ../**/../filepat (starpat=".starpat.")")
864
865 elseif dirname =~ '^\*/'
866 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
867 let starpat= 3
868" call Decho("(Explore) case Explore */filepat (starpat=".starpat.")")
869
870 elseif dirname=~ '^\*\*/'
871 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
872 let starpat= 4
873" call Decho("(Explore) case Explore **/filepat (starpat=".starpat.")")
874
875 else
876 let starpat= 0
877" call Decho("(Explore) default case: starpat=".starpat)
878 endif
879
880 if starpat == 0 && a:indx >= 0
881 " [Explore Hexplore Vexplore Sexplore] [dirname]
882" call Decho("(Explore) case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
883 if dirname == ""
884 let dirname= curfiledir
885" call Decho("(Explore) ..empty dirname, using current file's directory<".dirname.">")
886 endif
887 if dirname =~ '^scp:' || dirname =~ '^ftp:'
888" call Decho("(Explore) ..calling NetrwBrowse(0,dirname<".dirname.">)")
889 call s:NetrwBrowse(0,dirname)
890 else
891 if dirname == ""|let dirname= getcwd()|endif
892" call Decho("(Explore) ..calling LocalBrowseCheck(dirname<".dirname.">)")
893 call netrw#LocalBrowseCheck(dirname)
894" call Decho("(Explore) win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
895 endif
896 if exists("w:netrw_bannercnt")
897 " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
898 " If one wants to return the same place in the netrw window, use :Rex instead.
899 exe w:netrw_bannercnt
900 endif
901
902" call Decho("(Explore) curdir<".curdir.">")
903 " ---------------------------------------------------------------------
904 " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest
905" if has("win32") || has("win95") || has("win64") || has("win16")
906" keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
907" else
908" keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
909" endif
910 " ---------------------------------------------------------------------
911
912 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
913 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
914 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
915 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
916 elseif a:indx <= 0
917 " Nexplore, Pexplore, Explore: handle starpat
918" call Decho("(Explore) case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx)
919 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
920" call Decho("(Explore) ..set up <s-up> and <s-down> maps")
921 let s:didstarstar= 1
922 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
923 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
924 endif
925
926 if has("path_extra")
927" call Decho("(Explore) ..starpat=".starpat.": has +path_extra")
928 if !exists("w:netrw_explore_indx")
929 let w:netrw_explore_indx= 0
930 endif
931
932 let indx = a:indx
933" call Decho("(Explore) ..starpat=".starpat.": set indx= [a:indx=".indx."]")
934
935 if indx == -1
936 " Nexplore
937" call Decho("(Explore) ..case Nexplore with starpat=".starpat.": (indx=".indx.")")
938 if !exists("w:netrw_explore_list") " sanity check
939 keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
940 sil! let @* = keepregstar
941 sil! let @+ = keepregstar
942 sil! let @/ = keepregslash
943" call Dret("netrw#Explore")
944 return
945 endif
946 let indx= w:netrw_explore_indx
947 if indx < 0 | let indx= 0 | endif
948 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
949 let curfile= w:netrw_explore_list[indx]
950" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
951 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
952 let indx= indx + 1
953" call Decho("(Explore) ....indx=".indx." (Nexplore while loop)")
954 endwhile
955 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
956" call Decho("(Explore) ....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
957
958 elseif indx == -2
959 " Pexplore
960" call Decho("(Explore) case Pexplore with starpat=".starpat.": (indx=".indx.")")
961 if !exists("w:netrw_explore_list") " sanity check
962 keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
963 sil! let @* = keepregstar
964 sil! let @+ = keepregstar
965 sil! let @/ = keepregslash
966" call Dret("netrw#Explore")
967 return
968 endif
969 let indx= w:netrw_explore_indx
970 if indx < 0 | let indx= 0 | endif
971 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
972 let curfile= w:netrw_explore_list[indx]
973" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
974 while indx >= 0 && curfile == w:netrw_explore_list[indx]
975 let indx= indx - 1
976" call Decho("(Explore) ....indx=".indx." (Pexplore while loop)")
977 endwhile
978 if indx < 0 | let indx= 0 | endif
979" call Decho("(Explore) ....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
980
981 else
982 " Explore -- initialize
983 " build list of files to Explore with Nexplore/Pexplore
984" call Decho("(Explore) ..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
985 keepj keepalt call s:NetrwClearExplore()
986 let w:netrw_explore_indx= 0
987 if !exists("b:netrw_curdir")
988 let b:netrw_curdir= getcwd()
989 endif
990" call Decho("(Explore) ....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
991
992 " switch on starpat to build the w:netrw_explore_list of files
993 if starpat == 1
994 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
995" call Decho("(Explore) ..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls)
996" call Decho("(Explore) ....pattern<".pattern.">")
997 try
998 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
999 catch /^Vim\%((\a\+)\)\=:E480/
1000 keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
1001" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
1002 return
1003 endtry
1004 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
1005 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1006
1007 elseif starpat == 2
1008 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
1009" call Decho("(Explore) ..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)")
1010" call Decho("(Explore) ....pattern<".pattern.">")
1011 try
1012 exe "sil keepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
1013 catch /^Vim\%((\a\+)\)\=:E480/
1014 keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
1015 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1016 sil! let @* = keepregstar
1017 sil! let @+ = keepregstar
1018 sil! let @/ = keepregslash
1019" call Dret("netrw#Explore : no files matched pattern")
1020 return
1021 endtry
1022 let s:netrw_curdir = b:netrw_curdir
1023 let w:netrw_explore_list = getqflist()
1024 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
1025 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1026
1027 elseif starpat == 3
1028 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
1029" call Decho("(Explore) ..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls)
1030 let filepat= substitute(dirname,'^\*/','','')
1031 let filepat= substitute(filepat,'^[%#<]','\\&','')
1032" call Decho("(Explore) ....b:netrw_curdir<".b:netrw_curdir.">")
1033" call Decho("(Explore) ....filepat<".filepat.">")
1034 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
1035 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
1036
1037 elseif starpat == 4
1038 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
1039" call Decho("(Explore) ..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls)
1040 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
1041 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
1042 endif " switch on starpat to build w:netrw_explore_list
1043
1044 let w:netrw_explore_listlen = len(w:netrw_explore_list)
1045" call Decho("(Explore) ....w:netrw_explore_list<".string(w:netrw_explore_list).">")
1046" call Decho("(Explore) ....w:netrw_explore_listlen=".w:netrw_explore_listlen)
1047
1048 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
1049 keepalt keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
1050 sil! let @* = keepregstar
1051 sil! let @+ = keepregstar
1052 sil! let @/ = keepregslash
1053" call Dret("netrw#Explore : no files matched")
1054 return
1055 endif
1056 endif " if indx ... endif
1057
1058 " NetrwStatusLine support - for exploring support
1059 let w:netrw_explore_indx= indx
1060" call Decho("(Explore) ....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
1061
1062 " wrap the indx around, but issue a note
1063 if indx >= w:netrw_explore_listlen || indx < 0
1064" call Decho("(Explore) ....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
1065 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
1066 let w:netrw_explore_indx= indx
1067 keepalt keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
1068 endif
1069
1070 exe "let dirfile= w:netrw_explore_list[".indx."]"
1071" call Decho("(Explore) ....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
1072 let newdir= substitute(dirfile,'/[^/]*$','','e')
1073" call Decho("(Explore) ....newdir<".newdir.">")
1074
1075" call Decho("(Explore) ....calling LocalBrowseCheck(newdir<".newdir.">)")
1076 call netrw#LocalBrowseCheck(newdir)
1077 if !exists("w:netrw_liststyle")
1078 let w:netrw_liststyle= g:netrw_liststyle
1079 endif
1080 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
1081 keepalt keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
1082 else
1083 keepalt keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
1084 endif
1085 let w:netrw_explore_mtchcnt = indx + 1
1086 let w:netrw_explore_bufnr = bufnr("%")
1087 let w:netrw_explore_line = line(".")
1088 keepalt keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
1089" call Decho("(Explore) ....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
1090
1091 else
1092" call Decho("(Explore) ..your vim does not have +path_extra")
1093 if !exists("g:netrw_quiet")
1094 keepalt keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
1095 endif
1096 sil! let @* = keepregstar
1097 sil! let @+ = keepregstar
1098 sil! let @/ = keepregslash
1099" call Dret("netrw#Explore : missing +path_extra")
1100 return
1101 endif
1102
1103 else
1104" call Decho("(Explore) ..default case: Explore newdir<".dirname.">")
1105 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
1106 sil! unlet w:netrw_treedict
1107 sil! unlet w:netrw_treetop
1108 endif
1109 let newdir= dirname
1110 if !exists("b:netrw_curdir")
1111 keepj call netrw#LocalBrowseCheck(getcwd())
1112 else
1113 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
1114 endif
1115 endif
1116
1117 " visual display of **/ **// */ Exploration files
1118" call Decho("(Explore) w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
1119" call Decho("(Explore) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
1120 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
1121" call Decho("(Explore) s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
1122 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
1123 " only update match list if current directory isn't the same as before
1124" call Decho("(Explore) only update match list if current directory not the same as before")
1125 let s:explore_prvdir = b:netrw_curdir
1126 let s:explore_match = ""
1127 let dirlen = s:Strlen(b:netrw_curdir)
1128 if b:netrw_curdir !~ '/$'
1129 let dirlen= dirlen + 1
1130 endif
1131 let prvfname= ""
1132 for fname in w:netrw_explore_list
1133" call Decho("(Explore) fname<".fname.">")
1134 if fname =~ '^'.b:netrw_curdir
1135 if s:explore_match == ""
1136 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1137 else
1138 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1139 endif
1140 elseif fname !~ '^/' && fname != prvfname
1141 if s:explore_match == ""
1142 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
1143 else
1144 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
1145 endif
1146 endif
1147 let prvfname= fname
1148 endfor
1149" call Decho("(Explore) explore_match<".s:explore_match.">")
1150 exe "2match netrwMarkFile /".s:explore_match."/"
1151 endif
1152 echo "<s-up>==Pexplore <s-down>==Nexplore"
1153 else
1154 2match none
1155 if exists("s:explore_match") | unlet s:explore_match | endif
1156 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
1157 echo " "
1158" call Decho("(Explore) cleared explore match list")
1159 endif
1160
1161 sil! let @* = keepregstar
1162 sil! let @+ = keepregstar
1163 sil! let @/ = keepregslash
1164" call Dret("netrw#Explore : @/<".@/.">")
1165endfun
1166
1167" ---------------------------------------------------------------------
1168" netrw#NetrwMakeTgt: make a target out of the directory name provided {{{2
1169fun! netrw#NetrwMakeTgt(dname)
1170" call Dfunc("netrw#NetrwMakeTgt(dname<".a:dname.">)")
1171 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
1172 let svpos = netrw#NetrwSavePosn()
1173 let s:netrwmftgt_islocal= (a:dname !~ '^\a\+://')
1174" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal)
1175 if s:netrwmftgt_islocal
1176 let netrwmftgt= simplify(a:dname)
1177 else
1178 let netrwmftgt= a:dname
1179 endif
1180 if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
1181 " re-selected target, so just clear it
1182 unlet s:netrwmftgt s:netrwmftgt_islocal
1183 else
1184 let s:netrwmftgt= netrwmftgt
1185 endif
1186 if g:netrw_fastbrowse <= 1
1187 call s:NetrwRefresh((b:netrw_curdir !~ '\a\+://'),b:netrw_curdir)
1188 endif
1189 call netrw#NetrwRestorePosn(svpos)
1190" call Dret("netrw#NetrwMakeTgt")
1191endfun
1192
1193" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001194" netrw#NetrwClean: remove netrw {{{2
1195" supports :NetrwClean -- remove netrw from first directory on runtimepath
1196" :NetrwClean! -- remove netrw from all directories on runtimepath
1197fun! netrw#NetrwClean(sys)
1198" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
1199
1200 if a:sys
1201 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
1202 else
1203 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
1204 endif
1205" call Decho("choice=".choice)
1206 let diddel= 0
1207 let diddir= ""
1208
1209 if choice == 1
1210 for dir in split(&rtp,',')
1211 if filereadable(dir."/plugin/netrwPlugin.vim")
1212" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001213 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
1214 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
1215 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
1216 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
1217 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
1218 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 +00001219 let diddir= dir
1220 let diddel= diddel + 1
1221 if !a:sys|break|endif
1222 endif
1223 endfor
1224 endif
1225
1226 echohl WarningMsg
1227 if diddel == 0
1228 echomsg "netrw is either not installed or not removable"
1229 elseif diddel == 1
1230 echomsg "removed one copy of netrw from <".diddir.">"
1231 else
1232 echomsg "removed ".diddel." copies of netrw"
1233 endif
1234 echohl None
1235
1236" call Dret("netrw#NetrwClean")
1237endfun
1238
Bram Moolenaar5c736222010-01-06 20:54:52 +01001239" ---------------------------------------------------------------------
1240" netrw#Nread: {{{2
1241fun! netrw#Nread(mode,fname)
1242" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
1243 call netrw#NetrwSavePosn()
1244 call netrw#NetRead(a:mode,a:fname)
1245 call netrw#NetrwRestorePosn()
1246" call Dret("netrw#Nread")
1247endfun
1248
Bram Moolenaar9964e462007-05-05 17:54:07 +00001249" ------------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02001250" netrw#NetrwObtain: {{{2
1251" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
1252" islocal=0 obtain from remote source
1253" =1 obtain from local source
1254" fname : a filename or a list of filenames
1255" tgtdir : optional place where files are to go (not present, uses getcwd())
1256fun! netrw#NetrwObtain(islocal,fname,...)
1257" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
1258 " NetrwStatusLine support - for obtaining support
1259
1260 if type(a:fname) == 1
1261 let fnamelist= [ a:fname ]
1262 elseif type(a:fname) == 3
1263 let fnamelist= a:fname
1264 else
1265 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
1266" call Dret("netrw#NetrwObtain")
1267 return
1268 endif
1269" call Decho("fnamelist<".string(fnamelist).">")
1270 if a:0 > 0
1271 let tgtdir= a:1
1272 else
1273 let tgtdir= getcwd()
1274 endif
1275" call Decho("tgtdir<".tgtdir.">")
1276
1277 if exists("b:netrw_islocal") && b:netrw_islocal
1278 " obtain a file from local b:netrw_curdir to (local) tgtdir
1279" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
1280 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
1281 let topath= s:ComposePath(tgtdir,"")
1282 if (has("win32") || has("win95") || has("win64") || has("win16"))
1283 " transfer files one at time
1284" call Decho("transfer files one at a time")
1285 for fname in fnamelist
1286" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
1287 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1288 if v:shell_error != 0
1289 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1290" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1291 return
1292 endif
1293 endfor
1294 else
1295 " transfer files with one command
1296" call Decho("transfer files with one command")
1297 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
1298" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
1299 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1300 if v:shell_error != 0
1301 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1302" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1303 return
1304 endif
1305 endif
1306 elseif !exists("b:netrw_curdir")
1307 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
1308 else
1309 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
1310 endif
1311
1312 else
1313 " obtain files from remote b:netrw_curdir to local tgtdir
1314" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
1315 if type(a:fname) == 1
1316 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
1317 endif
1318 call s:NetrwMethod(b:netrw_curdir)
1319
1320 if b:netrw_method == 4
1321 " obtain file using scp
1322" call Decho("obtain via scp (method#4)")
1323 if exists("g:netrw_port") && g:netrw_port != ""
1324 let useport= " ".g:netrw_scpport." ".g:netrw_port
1325 else
1326 let useport= ""
1327 endif
1328 if b:netrw_fname =~ '/'
1329 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
1330 else
1331 let path= ""
1332 endif
1333 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
1334" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
1335 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
1336
1337 elseif b:netrw_method == 2
1338 " obtain file using ftp + .netrc
1339" call Decho("obtain via ftp+.netrc (method #2)")
1340 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1341 let tmpbufnr= bufnr("%")
1342 setl ff=unix
1343 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1344 keepj put =g:netrw_ftpmode
1345" call Decho("filter input: ".getline('$'))
1346 endif
1347
1348 if exists("b:netrw_fname") && b:netrw_fname != ""
1349 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1350" call Decho("filter input: ".getline('$'))
1351 endif
1352
1353 if exists("g:netrw_ftpextracmd")
1354 keepj put =g:netrw_ftpextracmd
1355" call Decho("filter input: ".getline('$'))
1356 endif
1357 for fname in fnamelist
1358 call setline(line("$")+1,'get "'.fname.'"')
1359" call Decho("filter input: ".getline('$'))
1360 endfor
1361 if exists("g:netrw_port") && g:netrw_port != ""
1362" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1363 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
1364 else
1365" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1366 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
1367 endif
1368 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1369 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1370 let debugkeep= &debug
1371 setl debug=msg
1372 call netrw#ErrorMsg(s:ERROR,getline(1),4)
1373 let &debug= debugkeep
1374 endif
1375
1376 elseif b:netrw_method == 3
1377 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
1378" call Decho("obtain via ftp+mipf (method #3)")
1379 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1380 let tmpbufnr= bufnr("%")
1381 setl ff=unix
1382
1383 if exists("g:netrw_port") && g:netrw_port != ""
1384 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
1385" call Decho("filter input: ".getline('$'))
1386 else
1387 keepj put ='open '.g:netrw_machine
1388" call Decho("filter input: ".getline('$'))
1389 endif
1390
1391 if exists("g:netrw_uid") && g:netrw_uid != ""
1392 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1393 keepj put =g:netrw_uid
1394" call Decho("filter input: ".getline('$'))
1395 if exists("s:netrw_passwd") && s:netrw_passwd != ""
1396 keepj put ='\"'.s:netrw_passwd.'\"'
1397 endif
1398" call Decho("filter input: ".getline('$'))
1399 elseif exists("s:netrw_passwd")
1400 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1401" call Decho("filter input: ".getline('$'))
1402 endif
1403 endif
1404
1405 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1406 keepj put =g:netrw_ftpmode
1407" call Decho("filter input: ".getline('$'))
1408 endif
1409
1410 if exists("b:netrw_fname") && b:netrw_fname != ""
1411 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1412" call Decho("filter input: ".getline('$'))
1413 endif
1414
1415 if exists("g:netrw_ftpextracmd")
1416 keepj put =g:netrw_ftpextracmd
1417" call Decho("filter input: ".getline('$'))
1418 endif
1419
1420 if exists("g:netrw_ftpextracmd")
1421 keepj put =g:netrw_ftpextracmd
1422" call Decho("filter input: ".getline('$'))
1423 endif
1424 for fname in fnamelist
1425 keepj call setline(line("$")+1,'get "'.fname.'"')
1426 endfor
1427" call Decho("filter input: ".getline('$'))
1428
1429 " perform ftp:
1430 " -i : turns off interactive prompting from ftp
1431 " -n unix : DON'T use <.netrc>, even though it exists
1432 " -n win32: quit being obnoxious about password
1433 keepj norm! 1Gdd
1434" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1435 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
1436 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1437 if getline(1) !~ "^$"
1438" call Decho("error<".getline(1).">")
1439 if !exists("g:netrw_quiet")
1440 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
1441 endif
1442 endif
1443 elseif !exists("b:netrw_method") || b:netrw_method < 0
1444" call Dfunc("netrw#NetrwObtain : unsupported method")
1445 return
1446 endif
1447
1448 " restore status line
1449 if type(a:fname) == 1 && exists("s:netrw_users_stl")
1450 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
1451 endif
1452
1453 endif
1454
1455 " cleanup
1456 if exists("tmpbufnr")
1457 if bufnr("%") != tmpbufnr
1458 exe tmpbufnr."bw!"
1459 else
1460 q!
1461 endif
1462 endif
1463
1464" call Dret("netrw#NetrwObtain")
1465endfun
1466
1467" ---------------------------------------------------------------------
1468" NetrwStatusLine: {{{2
1469fun! NetrwStatusLine()
1470
1471" vvv NetrwStatusLine() debugging vvv
1472" let g:stlmsg=""
1473" if !exists("w:netrw_explore_bufnr")
1474" let g:stlmsg="!X<explore_bufnr>"
1475" elseif w:netrw_explore_bufnr != bufnr("%")
1476" let g:stlmsg="explore_bufnr!=".bufnr("%")
1477" endif
1478" if !exists("w:netrw_explore_line")
1479" let g:stlmsg=" !X<explore_line>"
1480" elseif w:netrw_explore_line != line(".")
1481" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
1482" endif
1483" if !exists("w:netrw_explore_list")
1484" let g:stlmsg=" !X<explore_list>"
1485" endif
1486" ^^^ NetrwStatusLine() debugging ^^^
1487
1488 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")
1489 " restore user's status line
1490 let &stl = s:netrw_users_stl
1491 let &laststatus = s:netrw_users_ls
1492 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
1493 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
1494 return ""
1495 else
1496 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
1497 endif
1498endfun
1499
1500" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001501" Netrw Transfer Functions: {{{1
1502" ===============================
1503
Bram Moolenaar071d4272004-06-13 20:20:40 +00001504" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001505" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001506" mode: =0 read remote file and insert before current line
1507" =1 read remote file and insert after current line
1508" =2 replace with remote file
1509" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001510fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001511" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001512
Bram Moolenaar5c736222010-01-06 20:54:52 +01001513 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001514 call s:NetrwOptionSave("w:")
1515 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001516 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001517
Bram Moolenaar5c736222010-01-06 20:54:52 +01001518 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001519 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001520 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001521 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001522 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001523 elseif a:mode == 2 " replace with remote file
1524 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +00001525 elseif a:mode == 3 " skip read of file (leave as temporary)
1526 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001527 else
1528 exe a:mode
1529 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001530 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001531 let ichoice = (a:0 == 0)? 0 : 1
1532" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
1533
Bram Moolenaar5c736222010-01-06 20:54:52 +01001534 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001535 let tmpfile= s:GetTempfile("")
1536 if tmpfile == ""
1537" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001538 return
1539 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001540
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001541 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001542
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001543 " attempt to repeat with previous host-file-etc
1544 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001545" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001546 let choice = b:netrw_lastfile
1547 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001548
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001549 else
1550 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001551" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001552
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001553 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001554 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001555 echomsg 'NetRead Usage:'
1556 echomsg ':Nread machine:path uses rcp'
1557 echomsg ':Nread "machine path" uses ftp with <.netrc>'
1558 echomsg ':Nread "machine id password path" uses ftp'
1559 echomsg ':Nread dav://machine[:port]/path uses cadaver'
1560 echomsg ':Nread fetch://machine/path uses fetch'
1561 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1562 echomsg ':Nread http://[user@]machine/path uses http wget'
1563 echomsg ':Nread rcp://[user@]machine/path uses rcp'
1564 echomsg ':Nread rsync://machine[:port]/path uses rsync'
1565 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
1566 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001567 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001568 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001569
Bram Moolenaar9964e462007-05-05 17:54:07 +00001570 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001571 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001572" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001573 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001574 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +02001575 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001576 else
1577 " case "... ... ..."
1578 let choice = strpart(choice,1,strlen(choice)-1)
1579 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001580
Bram Moolenaar9964e462007-05-05 17:54:07 +00001581 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001582 let wholechoice = wholechoice . " " . choice
1583 let ichoice = ichoice + 1
1584 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001585 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001586 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001587 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001588" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001589 return
1590 endif
1591 let choice= a:{ichoice}
1592 endwhile
1593 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1594 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001595 endif
1596 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001597
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001598" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001599 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001600
Bram Moolenaar5c736222010-01-06 20:54:52 +01001601 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00001602 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001603 if !exists("b:netrw_method") || b:netrw_method < 0
1604" call Dfunc("netrw#NetRead : unsupported method")
1605 return
1606 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001607 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001608
Bram Moolenaar446cb832008-06-24 21:56:24 +00001609 " Check if NetrwBrowse() should be handling this request
1610" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02001611 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001612" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001613 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001614" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001615 return
Bram Moolenaar071d4272004-06-13 20:20:40 +00001616 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001617
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001618 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001619 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001620 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001621 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1622 echo "(netrw) Processing your read request..."
1623 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001624
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001625 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001626 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001627 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001628" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +00001629 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001630 " ER: on Win2K" rcp machine[.user]:file tmpfile
1631 " ER: if machine contains '.' adding .user is required (use $USERNAME)
1632 " ER: the tmpfile is full path: rcp sees C:\... as host C
1633 if s:netrw_has_nt_rcp == 1
1634 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1635 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1636 else
1637 " Any way needed it machine contains a '.'
1638 let uid_machine = g:netrw_machine .'.'. $USERNAME
1639 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001640 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001641 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1642 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1643 else
1644 let uid_machine = g:netrw_machine
1645 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001646 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001647" 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 +01001648 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 +00001649 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001650 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001651
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001652 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001653 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001654 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001655" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +00001656 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02001657 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001658 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02001659 setl ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001660 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001661" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001662 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001663 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001664" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001665 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001666 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
1667" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001668 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001669" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1670 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 +00001671 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02001672" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1673 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001674 endif
1675 " 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 +00001676 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +00001677 let debugkeep = &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02001678 setl debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +02001679 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001680 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001681 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +00001682 call s:SaveBufVars()
1683 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +01001684 if bufname("%") == "" && getline("$") == "" && line('$') == 1
1685 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +00001686 q!
1687 endif
1688 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001689 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001690 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001691
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001692 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001693 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001694 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
1695 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001696" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001697 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001698 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001699 let filtbuf= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02001700 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001701 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001702 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001703" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001704 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001705 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001706" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001707 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001708
Bram Moolenaar97d62492012-11-15 21:28:22 +01001709 if exists("g:netrw_uid") && g:netrw_uid != ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001710 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1711 keepj put =g:netrw_uid
1712" call Decho("filter input: ".getline('.'))
1713 if exists("s:netrw_passwd")
1714 keepj put ='\"'.s:netrw_passwd.'\"'
1715 endif
1716" call Decho("filter input: ".getline('.'))
1717 elseif exists("s:netrw_passwd")
1718 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1719" call Decho("filter input: ".getline('.'))
1720 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001721 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001722
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001723 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001724 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00001725" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001726 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001727 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001728 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001729" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001730 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001731 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001732" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001733
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001734 " perform ftp:
1735 " -i : turns off interactive prompting from ftp
1736 " -n unix : DON'T use <.netrc>, even though it exists
1737 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +02001738 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001739" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1740 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001741 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1742 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001743" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001744 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001745 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001746 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001747 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001748 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
1749 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001750 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001751
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001752 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001753 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001754 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001755" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001756 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00001757 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001758 else
1759 let useport= ""
1760 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001761" 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 +00001762 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 +00001763 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001764 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001765
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001766 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001767 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001768 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001769" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001770 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001771 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001772 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001773 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001774" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001775 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001776 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001777
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001778 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
1779 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +00001780" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001781 if exists("g:netrw_http_xcmd")
1782" 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))
1783 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
1784 else
1785" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
1786 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
1787 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001788 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001789
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001790 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001791 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001792" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001793 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
1794 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001795" call Decho("netrw_html<".netrw_html.">")
1796" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001797" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
1798 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 +00001799 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001800" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001801 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001802 endif
1803 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001804" call Decho("(NetRead) setl ro")
1805 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001806
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001807 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001808 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001809 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001810" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001811
Bram Moolenaar5c736222010-01-06 20:54:52 +01001812 if !executable(g:netrw_dav_cmd)
1813 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
1814" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
1815 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001816 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001817 if g:netrw_dav_cmd =~ "curl"
1818" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
1819 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
1820 else
1821 " Construct execution string (four lines) which will be passed through filter
1822 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1823 new
Bram Moolenaarff034192013-04-24 18:51:19 +02001824 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001825 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001826 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +01001827 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001828 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +01001829 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001830 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
1831 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
1832 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001833 keepj put ='get '.netrw_fname.' '.tmpfile
1834 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001835
Bram Moolenaar5c736222010-01-06 20:54:52 +01001836 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001837 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001838" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001839 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1840 bd!
1841 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001842 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001843 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001844
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001845 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001846 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001847 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001848" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001849" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1850 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 +00001851 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001852 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001853
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001854 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001855 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001856 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001857 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +00001858" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001859 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001860 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001861 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001862 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001863" call Dret("NetRead")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001864 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001865 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02001866 if exists("g:netrw_option") && g:netrw_option == ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001867 let netrw_option= "http"
1868 else
1869 let netrw_option= "ftp"
1870 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001871" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001872
Bram Moolenaar446cb832008-06-24 21:56:24 +00001873 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001874" 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))
1875 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 +00001876 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00001877" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
1878 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 +00001879 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001880
Bram Moolenaar446cb832008-06-24 21:56:24 +00001881 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001882 let b:netrw_lastfile = choice
Bram Moolenaar5b435d62012-04-05 17:33:26 +02001883" call Decho("(NetRead) setl ro")
1884 setl ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001885
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001886 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001887 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001888 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001889" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001890" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1891 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001892 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001893 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001894
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001895 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001896 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001897 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001898 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001899 endif
1900 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001901
Bram Moolenaar5c736222010-01-06 20:54:52 +01001902 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001903 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001904" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001905 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001906 unlet b:netrw_fname
1907 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001908 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 +00001909" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001910 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001911 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001912 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001913
Bram Moolenaar9964e462007-05-05 17:54:07 +00001914" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001915endfun
1916
1917" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001918" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001919fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00001920" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001921
Bram Moolenaar5c736222010-01-06 20:54:52 +01001922 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001923 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001924 call s:NetrwOptionSave("w:")
1925 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001926
Bram Moolenaar5c736222010-01-06 20:54:52 +01001927 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001928 let tmpfile= s:GetTempfile("")
1929 if tmpfile == ""
1930" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001931 return
1932 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001933
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001934 if a:0 == 0
1935 let ichoice = 0
1936 else
1937 let ichoice = 1
1938 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001939
Bram Moolenaar9964e462007-05-05 17:54:07 +00001940 let curbufname= expand("%")
1941" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001942 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00001943 " For binary writes, always write entire file.
1944 " (line numbers don't really make sense for that).
1945 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02001946" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1947 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001948 elseif g:netrw_cygwin
1949 " write (selected portion of) file to temporary
1950 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001951" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001952 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001953 else
1954 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02001955" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001956 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001957 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001958
Bram Moolenaar9964e462007-05-05 17:54:07 +00001959 if curbufname == ""
1960 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1961 " on the temporary file's name. Deletion of the temporary file during
1962 " cleanup then causes an error message.
1963 0file!
1964 endif
1965
Bram Moolenaar5c736222010-01-06 20:54:52 +01001966 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001967 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001968
Bram Moolenaar9964e462007-05-05 17:54:07 +00001969 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001970 " attempt to repeat with previous host-file-etc
1971 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001972" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001973 let choice = b:netrw_lastfile
1974 let ichoice= ichoice + 1
1975 else
1976 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001977
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001978 " Reconstruct Choice if choice starts with '"'
1979 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001980 echomsg 'NetWrite Usage:"'
1981 echomsg ':Nwrite machine:path uses rcp'
1982 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1983 echomsg ':Nwrite "machine id password path" uses ftp'
1984 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1985 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1986 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1987 echomsg ':Nwrite rcp://machine/path uses rcp'
1988 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1989 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1990 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001991 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001992 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001993
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001994 elseif match(choice,"^\"") != -1
1995 if match(choice,"\"$") != -1
1996 " case "..."
1997 let choice=strpart(choice,1,strlen(choice)-2)
1998 else
1999 " case "... ... ..."
2000 let choice = strpart(choice,1,strlen(choice)-1)
2001 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002002
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002003 while match(choice,"\"$") == -1
2004 let wholechoice= wholechoice . " " . choice
2005 let ichoice = ichoice + 1
2006 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002007 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002008 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002009 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002010" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002011 return
2012 endif
2013 let choice= a:{ichoice}
2014 endwhile
2015 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2016 endif
2017 endif
2018 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002019 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00002020" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002021
Bram Moolenaar9964e462007-05-05 17:54:07 +00002022 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02002023 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002024 if !exists("b:netrw_method") || b:netrw_method < 0
2025" call Dfunc("netrw#NetWrite : unsupported method")
2026 return
2027 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002028
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002029 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01002030 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002031 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002032 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2033 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00002034" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002035 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002036
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002037 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002038 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002039 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002040" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002041 if s:netrw_has_nt_rcp == 1
2042 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2043 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2044 else
2045 let uid_machine = g:netrw_machine .'.'. $USERNAME
2046 endif
2047 else
2048 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2049 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2050 else
2051 let uid_machine = g:netrw_machine
2052 endif
2053 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00002054" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
2055 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 +00002056 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002057
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002058 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002059 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002060 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002061" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002062 let netrw_fname = b:netrw_fname
2063
2064 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2065 let bhkeep = &l:bh
2066 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002067 setl bh=hide
2068 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002069
Bram Moolenaar446cb832008-06-24 21:56:24 +00002070" call Decho("filter input window#".winnr())
Bram Moolenaarff034192013-04-24 18:51:19 +02002071 setl ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002072 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002073" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002074 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002075 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002076" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00002077 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002078 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002079" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002080 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02002081" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
2082 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 +00002083 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00002084" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02002085" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
2086 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002087 endif
2088 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2089 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002090 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002091 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002092 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002093 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002094 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002095
2096 " remove enew buffer (quietly)
2097 let filtbuf= bufnr("%")
2098 exe curbuf."b!"
2099 let &l:bh = bhkeep
2100 exe filtbuf."bw!"
2101
Bram Moolenaar071d4272004-06-13 20:20:40 +00002102 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002103
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002104 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002105 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002106 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002107 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00002108" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002109 let netrw_fname = b:netrw_fname
2110 let bhkeep = &l:bh
2111
2112 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2113 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002114 setl bh=hide
2115 keepalt enew
2116 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002117
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002118 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002119 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00002120" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002121 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002122 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00002123" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002124 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002125 if exists("g:netrw_uid") && g:netrw_uid != ""
2126 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2127 keepj put =g:netrw_uid
2128" call Decho("filter input: ".getline('.'))
2129 if exists("s:netrw_passwd") && s:netrw_passwd != ""
2130 keepj put ='\"'.s:netrw_passwd.'\"'
2131 endif
2132" call Decho("filter input: ".getline('.'))
2133 elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
2134 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
2135" call Decho("filter input: ".getline('.'))
2136 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002137 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002138 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01002139" call Decho("filter input: ".getline('$'))
2140 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002141 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002142" call Decho("filter input: ".getline("$"))
2143 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002144 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002145" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002146 " save choice/id/password for future use
2147 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002148
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002149 " perform ftp:
2150 " -i : turns off interactive prompting from ftp
2151 " -n unix : DON'T use <.netrc>, even though it exists
2152 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002153 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002154" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
2155 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002156 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2157 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002158 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002159 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002160 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002161 let mod=1
2162 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002163
2164 " remove enew buffer (quietly)
2165 let filtbuf= bufnr("%")
2166 exe curbuf."b!"
2167 let &l:bh= bhkeep
2168 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002169
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002170 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002171 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002172 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00002173" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002174 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00002175 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002176 else
2177 let useport= ""
2178 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00002179" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2180 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 +00002181 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002182
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002183 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002184 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002185 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00002186" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002187 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002188 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002189 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002190
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002191 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002192 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002193 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002194" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002195
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002196 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01002197 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
2198 let bhkeep = &l:bh
2199
2200 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2201 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002202 setl bh=hide
2203 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002204
Bram Moolenaarff034192013-04-24 18:51:19 +02002205 setl ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002206 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002207 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002208 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002209 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002210 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002211 if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002212 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00002213 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002214 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002215
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002216 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002217 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002218" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002219 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002220
2221 " remove enew buffer (quietly)
2222 let filtbuf= bufnr("%")
2223 exe curbuf."b!"
2224 let &l:bh = bhkeep
2225 exe filtbuf."bw!"
2226
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002227 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002228
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002229 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002230 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002231 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00002232" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002233" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2234 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 +00002235 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002236
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002237 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002238 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002239 elseif b:netrw_method == 9
Bram Moolenaar97d62492012-11-15 21:28:22 +01002240" call Decho("write via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002241 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002242 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
2243 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2244 else
2245 let uid_machine = g:netrw_machine
2246 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002247
2248 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
2249 let bhkeep = &l:bh
2250 let curbuf = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02002251 setl bh=hide
2252 keepalt enew
Bram Moolenaar5c736222010-01-06 20:54:52 +01002253
Bram Moolenaarff034192013-04-24 18:51:19 +02002254 setl ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01002255 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002256" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00002257" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01002258 let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
2259 exe s:netrw_silentxfer."%!".sftpcmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002260 let filtbuf= bufnr("%")
2261 exe curbuf."b!"
2262 let &l:bh = bhkeep
2263 exe filtbuf."bw!"
2264 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002265
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002266 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01002267 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002268 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002269 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002270 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002271 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002272 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002273
Bram Moolenaar5c736222010-01-06 20:54:52 +01002274 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002275" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002276 if s:FileReadable(tmpfile)
2277" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002278 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002279 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002280 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002281
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002282 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002283 " restore modifiability; usually equivalent to set nomod
2284 let &mod= mod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002285" 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 +02002286 elseif !exists("leavemod")
2287 " indicate that the buffer has not been modified since last written
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002288" call Decho("(NetWrite) set nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002289 set nomod
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002290" 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 +00002291 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002292
Bram Moolenaar9964e462007-05-05 17:54:07 +00002293" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002294endfun
2295
2296" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002297" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002298" uses NetRead to get a copy of the file into a temporarily file,
2299" then sources that file,
2300" then removes that file.
2301fun! netrw#NetSource(...)
2302" call Dfunc("netrw#NetSource() a:0=".a:0)
2303 if a:0 > 0 && a:1 == '?'
2304 " give help
2305 echomsg 'NetSource Usage:'
2306 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
2307 echomsg ':Nsource fetch://machine/path uses fetch'
2308 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02002309 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002310 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
2311 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
2312 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
2313 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
2314 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002315 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002316 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002317 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002318 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002319" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002320 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002321" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
2322 exe "so ".fnameescape(s:netrw_tmpfile)
2323" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002324 call delete(s:netrw_tmpfile)
2325 unlet s:netrw_tmpfile
2326 else
2327 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
2328 endif
2329 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002330 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00002331 endif
2332" call Dret("netrw#NetSource")
2333endfun
2334
2335" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00002336" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00002337" readcmd == %r : replace buffer with newly read file
2338" == 0r : read file at top of buffer
2339" == r : read file after current line
2340" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002341fun! s:NetrwGetFile(readcmd, tfile, method)
2342" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002343
2344 " readcmd=='t': simply do nothing
2345 if a:readcmd == 't'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002346" 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 +00002347" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002348 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002349 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002350
Bram Moolenaar9964e462007-05-05 17:54:07 +00002351 " get name of remote filename (ie. url and all)
2352 let rfile= bufname("%")
2353" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002354
Bram Moolenaar9964e462007-05-05 17:54:07 +00002355 if exists("*NetReadFixup")
2356 " for the use of NetReadFixup (not otherwise used internally)
2357 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002358 endif
2359
Bram Moolenaar9964e462007-05-05 17:54:07 +00002360 if a:readcmd[0] == '%'
2361 " get file into buffer
2362" call Decho("get file into buffer")
2363
2364 " rename the current buffer to the temp file (ie. tfile)
2365 if g:netrw_cygwin
2366 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
2367 else
2368 let tfile= a:tfile
2369 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002370" call Decho("exe sil! keepalt file ".fnameescape(tfile))
2371 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002372
2373 " edit temporary file (ie. read the temporary file in)
2374 if rfile =~ '\.zip$'
2375" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
2376 call zip#Browse(tfile)
2377 elseif rfile =~ '\.tar$'
2378" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
2379 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002380 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002381" call Decho("handling remote gzip-compressed tar file")
2382 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002383 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00002384" call Decho("handling remote bz2-compressed tar file")
2385 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002386 elseif rfile =~ '\.tar\.xz$'
2387" call Decho("handling remote xz-compressed tar file")
2388 call tar#Browse(tfile)
2389 elseif rfile =~ '\.txz$'
2390" call Decho("handling remote xz-compressed tar file (.txz)")
2391 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002392 else
2393" call Decho("edit temporary file")
2394 e!
2395 endif
2396
2397 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002398" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002399 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002400
Bram Moolenaar97d62492012-11-15 21:28:22 +01002401 " Detect filetype of local version of remote file.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002402 " Note that isk must not include a "/" for scripts.vim
2403 " to process this detection correctly.
2404" call Decho("detect filetype of local version of remote file")
Bram Moolenaar97d62492012-11-15 21:28:22 +01002405 let iskkeep= &l:isk
2406 setl isk-=/
Bram Moolenaarff034192013-04-24 18:51:19 +02002407 " filetype detect " COMBAK - trying filetype detect in NetrwOptionRestore Jan 24, 2013
Bram Moolenaar97d62492012-11-15 21:28:22 +01002408 let &l:isk= iskkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00002409" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
2410 let line1 = 1
2411 let line2 = line("$")
2412
2413 elseif s:FileReadable(a:tfile)
2414 " read file after current line
2415" call Decho("read file<".a:tfile."> after current line")
2416 let curline = line(".")
2417 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002418" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002419 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002420 let line1= curline + 1
2421 let line2= line("$") - lastline + 1
2422
2423 else
2424 " not readable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002425" 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 +00002426" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002427 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002428" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002429 return
2430 endif
2431
2432 " User-provided (ie. optional) fix-it-up command
2433 if exists("*NetReadFixup")
2434" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002435 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002436" else " Decho
2437" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
2438 endif
2439
Bram Moolenaaradc21822011-04-01 18:03:16 +02002440 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00002441 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02002442 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002443 endif
2444
2445" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
2446
2447 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00002448" redraw!
2449
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002450" 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 +00002451" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002452endfun
2453
Bram Moolenaar9964e462007-05-05 17:54:07 +00002454" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002455" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01002456" Input:
2457" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
2458" Output:
2459" b:netrw_method= 1: rcp
2460" 2: ftp + <.netrc>
2461" 3: ftp + machine, id, password, and [path]filename
2462" 4: scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002463" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002464" 6: dav
2465" 7: rsync
2466" 8: fetch
2467" 9: sftp
2468" g:netrw_machine= hostname
2469" b:netrw_fname = filename
2470" g:netrw_port = optional port number (for ftp)
2471" g:netrw_choice = copy of input url (choice)
2472fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002473" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002474
Bram Moolenaar251e1912011-06-19 05:09:16 +02002475 " sanity check: choice should have at least three slashes in it
2476 if strlen(substitute(a:choice,'[^/]','','g')) < 3
2477 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
2478 let b:netrw_method = -1
2479" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
2480 return
2481 endif
2482
Bram Moolenaar5c736222010-01-06 20:54:52 +01002483 " record current g:netrw_machine, if any
2484 " curmachine used if protocol == ftp and no .netrc
2485 if exists("g:netrw_machine")
2486 let curmachine= g:netrw_machine
2487" call Decho("curmachine<".curmachine.">")
2488 else
2489 let curmachine= "N O T A HOST"
2490 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002491 if exists("g:netrw_port")
2492 let netrw_port= g:netrw_port
2493 endif
2494
2495 " insure that netrw_ftp_cmd starts off every method determination
2496 " with the current g:netrw_ftp_cmd
2497 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01002498
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002499 " initialization
2500 let b:netrw_method = 0
2501 let g:netrw_machine = ""
2502 let b:netrw_fname = ""
2503 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002504 let g:netrw_choice = a:choice
2505
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002506 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002507 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00002508 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
2509 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002510 " rcpurm : rcp://[user@]host/filename Use rcp
2511 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002512 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02002513 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01002514 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002515 " rsyncurm : rsync://host[:port]/path Use rsync
2516 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2517 " sftpurm : sftp://[user@]host/filename Use scp
2518 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2519 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002520" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2521" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2522" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2523 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2524 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002525 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002526 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002527 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002528 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002529 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02002530 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002531 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002532
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002533" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002534 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02002535 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002536 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002537" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002538 let b:netrw_method = 1
2539 let userid = substitute(a:choice,rcpurm,'\1',"")
2540 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2541 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002542 if userid != ""
2543 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002544 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002545
Bram Moolenaaradc21822011-04-01 18:03:16 +02002546 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002547 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002548" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002549 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002550 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2551 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2552 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002553
Bram Moolenaar15146672011-10-20 22:22:38 +02002554 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002555 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002556" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002557 let b:netrw_method = 5
2558 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2559 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002560
Bram Moolenaaradc21822011-04-01 18:03:16 +02002561 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002562 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002563" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002564 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02002565 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002566 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2567 else
2568 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2569 endif
2570 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002571
Bram Moolenaaradc21822011-04-01 18:03:16 +02002572 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002573 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002574" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002575 let b:netrw_method = 7
2576 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2577 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002578
Bram Moolenaaradc21822011-04-01 18:03:16 +02002579 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002580 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002581" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002582 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002583 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2584 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2585 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002586" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002587 if userid != ""
2588 let g:netrw_uid= userid
2589 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002590
Bram Moolenaaradc21822011-04-01 18:03:16 +02002591 if curmachine != g:netrw_machine
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002592 if exists("s:netwr_hup[".g:netrw_machine."]")
2593 call NetUserPass("ftp:".g:netrw_machine)
2594 elseif exists("s:netrw_passwd")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002595 " if there's a change in hostname, require password re-entry
2596 unlet s:netrw_passwd
2597 endif
2598 if exists("netrw_port")
2599 unlet netrw_port
2600 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002601 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002602
Bram Moolenaar446cb832008-06-24 21:56:24 +00002603 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002604 let b:netrw_method = 3
2605 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002606 let host= substitute(g:netrw_machine,'\..*$','','')
2607 if exists("s:netrw_hup[host]")
2608 call NetUserPass("ftp:".host)
2609
2610 elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02002611" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2612" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
2613 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
2614 let machine = substitute(g:netrw_machine,'\([^.]\+\)\.\S*','\1','')
2615 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',machine.".ftp",'')
2616" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2617 endif
2618 let b:netrw_method= 2
2619 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
2620" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002621 let b:netrw_method= 2
2622 else
2623 if !exists("g:netrw_uid") || g:netrw_uid == ""
2624 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002625 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002626 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002627 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002628 endif
2629 let b:netrw_method= 3
2630 endif
2631 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002632
Bram Moolenaaradc21822011-04-01 18:03:16 +02002633 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002634 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002635" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002636 let b:netrw_method = 8
2637 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2638 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2639 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2640 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002641
Bram Moolenaaradc21822011-04-01 18:03:16 +02002642 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002643 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002644" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002645 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002646 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2647 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002648 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002649 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002650 call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002651
Bram Moolenaaradc21822011-04-01 18:03:16 +02002652 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002653 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002654" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002655 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002656 let b:netrw_method = 3
2657 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2658 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002659
Bram Moolenaar9964e462007-05-05 17:54:07 +00002660 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002661 let b:netrw_method = 2
2662 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2663 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2664 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002665
Bram Moolenaaradc21822011-04-01 18:03:16 +02002666 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002667 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002668" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002669 let b:netrw_method = 9
2670 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2671 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002672
Bram Moolenaaradc21822011-04-01 18:03:16 +02002673 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002674 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002675" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002676 let b:netrw_method = 1
2677 let userid = substitute(a:choice,rcphf,'\2',"")
2678 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
2679 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002680" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2681" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2682" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2683" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002684 if userid != ""
2685 let g:netrw_uid= userid
2686 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002687
Bram Moolenaaradc21822011-04-01 18:03:16 +02002688 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002689 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002690 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002691 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002692 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002693 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002694 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002695 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00002696
Bram Moolenaar81695252004-12-29 20:58:21 +00002697 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02002698 " remove any leading [:#] from port number
2699 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2700 elseif exists("netrw_port")
2701 " retain port number as implicit for subsequent ftp operations
2702 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00002703 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002704
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002705" call Decho("a:choice <".a:choice.">")
2706" call Decho("b:netrw_method <".b:netrw_method.">")
2707" call Decho("g:netrw_machine<".g:netrw_machine.">")
2708" call Decho("g:netrw_port <".g:netrw_port.">")
2709" if exists("g:netrw_uid") "Decho
2710" call Decho("g:netrw_uid <".g:netrw_uid.">")
2711" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00002712" if exists("s:netrw_passwd") "Decho
2713" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002714" endif "Decho
2715" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002716" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002717endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002718
2719" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00002720" NetReadFixup: this sort of function is typically written by the user {{{2
2721" to handle extra junk that their system's ftp dumps
2722" into the transfer. This function is provided as an
2723" example and as a fix for a Windows 95 problem: in my
2724" experience, win95's ftp always dumped four blank lines
2725" at the end of the transfer.
2726if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
2727 fun! NetReadFixup(method, line1, line2)
2728" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002729
2730 " sanity checks -- attempt to convert inputs to integers
2731 let method = a:method + 0
2732 let line1 = a:line1 + 0
2733 let line2 = a:line2 + 0
2734 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
2735" call Dret("NetReadFixup")
2736 return
2737 endif
2738
Bram Moolenaar9964e462007-05-05 17:54:07 +00002739 if method == 3 " ftp (no <.netrc>)
2740 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01002741 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002742 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01002743 call histdel("/",-1)
2744 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002745 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002746
Bram Moolenaar9964e462007-05-05 17:54:07 +00002747" call Dret("NetReadFixup")
2748 endfun
2749endif
2750
2751" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00002752" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002753" Usage: :call NetUserPass() -- will prompt for userid and password
2754" :call NetUserPass("uid") -- will prompt for password
2755" :call NetUserPass("uid","password") -- sets global userid and password
2756" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
2757" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
Bram Moolenaar071d4272004-06-13 20:20:40 +00002758fun! NetUserPass(...)
2759
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002760" call Dfunc("NetUserPass() a:0=".a:0)
2761
2762 if !exists('s:netrw_hup')
2763 let s:netrw_hup= {}
2764 endif
2765
Bram Moolenaar071d4272004-06-13 20:20:40 +00002766 if a:0 == 0
Bram Moolenaar97d62492012-11-15 21:28:22 +01002767 " case: no input arguments
2768
2769 " change host and username if not previously entered; get new password
2770 if !exists("g:netrw_machine")
2771 let g:netrw_machine= input('Enter hostname: ')
2772 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002773 if !exists("g:netrw_uid") || g:netrw_uid == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01002774 " get username (user-id) via prompt
Bram Moolenaar071d4272004-06-13 20:20:40 +00002775 let g:netrw_uid= input('Enter username: ')
2776 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002777 " get password via prompting
Bram Moolenaar446cb832008-06-24 21:56:24 +00002778 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002779
2780 " set up hup database
2781 let host = substitute(g:netrw_machine,'\..*$','','')
2782 if !exists('s:netrw_hup[host]')
2783 let s:netrw_hup[host]= {}
2784 endif
2785 let s:netrw_hup[host].uid = g:netrw_uid
2786 let s:netrw_hup[host].passwd = s:netrw_passwd
2787
2788 elseif a:0 == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01002789 " case: one input argument
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002790
2791 if a:1 =~ '^ftp:'
Bram Moolenaar97d62492012-11-15 21:28:22 +01002792 " get host from ftp:... url
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002793 " access userid and password from hup (host-user-passwd) dictionary
2794 let host = substitute(a:1,'^ftp:','','')
2795 let host = substitute(host,'\..*','','')
2796 if exists("s:netrw_hup[host]")
2797 let g:netrw_uid = s:netrw_hup[host].uid
2798 let s:netrw_passwd = s:netrw_hup[host].passwd
2799" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2800" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2801 else
2802 let g:netrw_uid = input("Enter UserId: ")
2803 let s:netrw_passwd = inputsecret("Enter Password: ")
2804 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002805
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002806 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01002807 " case: one input argument, not an url. Using it as a new user-id.
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002808 if exists("g:netrw_machine")
2809 let host= substitute(g:netrw_machine,'\..*$','','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01002810 else
2811 let g:netrw_machine= input('Enter hostname: ')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002812 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01002813 let g:netrw_uid = a:1
2814" call Decho("set g:netrw_uid= <".g:netrw_uid.">")
2815 if exists("g:netrw_passwd")
2816 " ask for password if one not previously entered
2817 let s:netrw_passwd= g:netrw_passwd
2818 else
2819 let s:netrw_passwd = inputsecret("Enter Password: ")
2820 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002821 endif
2822
2823" call Decho("host<".host.">")
2824 if exists("host")
2825 if !exists('s:netrw_hup[host]')
2826 let s:netrw_hup[host]= {}
2827 endif
2828 let s:netrw_hup[host].uid = g:netrw_uid
2829 let s:netrw_hup[host].passwd = s:netrw_passwd
2830 endif
2831
2832 elseif a:0 == 2
2833 let g:netrw_uid = a:1
2834 let s:netrw_passwd = a:2
2835
2836 elseif a:0 == 3
2837 " enter hostname, user-id, and password into the hup dictionary
2838 let host = substitute(a:1,'^\a\+:','','')
2839 let host = substitute(host,'\..*$','','')
2840 if !exists('s:netrw_hup[host]')
2841 let s:netrw_hup[host]= {}
2842 endif
2843 let s:netrw_hup[host].uid = a:2
2844 let s:netrw_hup[host].passwd = a:3
2845 let g:netrw_uid = s:netrw_hup[host].uid
2846 let s:netrw_passwd = s:netrw_hup[host].passwd
2847" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">")
2848" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002849 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00002850
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002851" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002852endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002853
Bram Moolenaar9964e462007-05-05 17:54:07 +00002854" ===========================================
2855" Shared Browsing Support: {{{1
2856" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00002857
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002858" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002859" s:NetrwMaps: {{{2
2860fun! s:NetrwMaps(islocal)
2861" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002862
2863 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
Bram Moolenaarff034192013-04-24 18:51:19 +02002864" call Decho("(NetrwMaps) set up Rexplore command")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02002865 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 +02002866 if g:netrw_mousemaps && g:netrw_retmap
Bram Moolenaarff034192013-04-24 18:51:19 +02002867" call Decho("(NetrwMaps) set up Rexplore 2-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002868 if !hasmapto("<Plug>NetrwReturn")
2869 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
Bram Moolenaarff034192013-04-24 18:51:19 +02002870" call Decho("(NetrwMaps) making map for 2-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002871 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
2872 elseif maparg("<c-leftmouse>","n") == ""
Bram Moolenaarff034192013-04-24 18:51:19 +02002873" call Decho("(NetrwMaps) making map for c-leftmouse")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002874 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
2875 endif
2876 endif
2877 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002878" call Decho("(NetrwMaps) made <Plug>NetrwReturn map")
Bram Moolenaar251e1912011-06-19 05:09:16 +02002879 endif
2880
Bram Moolenaar9964e462007-05-05 17:54:07 +00002881 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02002882" call Decho("(NetrwMaps) make local maps")
Bram Moolenaar15146672011-10-20 22:22:38 +02002883 " local normal-mode maps
2884 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
2885 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
2886 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2887 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
2888 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2889 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
2890 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2891 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2892 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
2893 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
2894 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
2895 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2896 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
2897 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
2898 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2899 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2900 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2901 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2902 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2903 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002904 nnoremap <buffer> <silent> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002905 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2906 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2907 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2908 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2909 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2910 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2911 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2912 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2913 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2914 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
2915 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
2916 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
2917 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
2918 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
2919 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2920 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
2921 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2922 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002923 nnoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002924 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>
2925 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
2926 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002927 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002928 nnoremap <buffer> <silent> Tb :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
2929 nnoremap <buffer> <silent> Th :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002930 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2931 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2932 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
2933 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01002934 nnoremap <buffer> <silent> X :call <SID>NetrwLocalExecute(expand("<cword>"))"<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002935 " local insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002936 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002937 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2938 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2939 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
2940 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2941 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2942 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
2943 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2944 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
2945 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2946 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2947 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002948 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002949 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002950 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2951 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2952 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2953 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2954 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2955 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2956 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2957 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2958 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2959 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2960 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2961 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2962 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2963 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002964 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002965 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002966 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002967 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002968 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2969 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2970 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002971 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002972 inoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002973 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>
2974 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
2975 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002976 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02002977 inoremap <buffer> <silent> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
2978 inoremap <buffer> <silent> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002979 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2980 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2981 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
2982 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002983 if !hasmapto('<Plug>NetrwHideEdit')
2984 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002985 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002986 endif
2987 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
2988 if !hasmapto('<Plug>NetrwRefresh')
2989 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002990 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002991 endif
2992 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002993 if s:didstarstar || !mapcheck("<s-down>","n")
2994 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002995 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002996 endif
2997 if s:didstarstar || !mapcheck("<s-up>","n")
2998 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002999 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003000 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003001 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003002 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02003003 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
3004 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003005 nmap <buffer> <s-rightdrag> <Plug>NetrwRightdrag
3006 nno <buffer> <silent> <Plug>NetrwRightdrag <leftmouse>:call <SID>NetrwRightdrag(1)<cr>
Bram Moolenaar251e1912011-06-19 05:09:16 +02003007 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
3008 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
3009 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3010 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
3011 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3012 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
3013 imap <buffer> <leftmouse> <Plug>ILeftmouse
3014 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
3015 imap <buffer> <middlemouse> <Plug>IMiddlemouse
3016 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
3017 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3018 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003019 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3020 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003021 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003022 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003023 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003024 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003025 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003026 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003027 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3028 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3029 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3030 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3031 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3032 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3033 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003034 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00003035
Bram Moolenaar9964e462007-05-05 17:54:07 +00003036 else " remote
Bram Moolenaarff034192013-04-24 18:51:19 +02003037" call Decho("(NetrwMaps) make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003038 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar15146672011-10-20 22:22:38 +02003039 " remote normal-mode maps
Bram Moolenaar446cb832008-06-24 21:56:24 +00003040 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3041 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3042 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3043 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003044 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003045 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3046 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3047 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3048 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003049 nnoremap <buffer> <silent> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003050 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3051 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3052 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3053 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3054 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3055 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003056 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003057 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003058 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3059 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003060 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003061 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003062 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02003063 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
3064 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003065 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003066 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003067 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003068 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003069 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003070 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
3071 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
3072 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3073 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003074 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3075 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003076 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003077 nnoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003078 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>
3079 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003080 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003081 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003082 nnoremap <buffer> <silent> Tb :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3083 nnoremap <buffer> <silent> Th :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01003084 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3085 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003086 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
3087 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00003088 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003089 " remote insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003090 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3091 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3092 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3093 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
3094 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
3095 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3096 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3097 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3098 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3099 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3100 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3101 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3102 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3103 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3104 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003105 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003106 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003107 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3108 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02003109 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003110 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar97d62492012-11-15 21:28:22 +01003111 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003112 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
3113 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
3114 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
3115 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
3116 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
3117 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
3118 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
3119 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3120 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3121 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3122 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
3123 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003124 inoremap <buffer> <silent> qF :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003125 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>
3126 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
3127 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
3128 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003129 inoremap <buffer> <silent> Tb <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3130 inoremap <buffer> <silent> Th <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003131 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3132 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
3133 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
3134 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
3135 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003136 if !hasmapto('<Plug>NetrwHideEdit')
3137 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003138 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00003139 endif
3140 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
3141 if !hasmapto('<Plug>NetrwRefresh')
3142 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003143 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00003144 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003145
3146 let mapsafepath = escape(s:path, s:netrw_map_escape)
3147 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
3148
Bram Moolenaar251e1912011-06-19 05:09:16 +02003149 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00003150 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02003151 nmap <leftmouse> <Plug>NetrwLeftmouse
3152 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003153 nmap <buffer> <leftdrag> <Plug>NetrwLeftdrag
3154 nno <buffer> <silent> <Plug>NetrwLeftdrag :call <SID>NetrwLeftdrag(0)<cr>
Bram Moolenaar251e1912011-06-19 05:09:16 +02003155 nmap <middlemouse> <Plug>NetrwMiddlemouse
3156 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
3157 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3158 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3159 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3160 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
3161 imap <buffer> <leftmouse> <Plug>ILeftmouse
3162 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
3163 imap <buffer> <middlemouse> <Plug>IMiddlemouse
3164 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3165 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3166 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003167 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3168 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003169 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003170 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003171 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003172 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3173 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3174 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003175 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003176 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3177 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3178 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3179 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3180 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3181 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00003182 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003183 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00003184 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003185
Bram Moolenaaradc21822011-04-01 18:03:16 +02003186 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02003187
Bram Moolenaaradc21822011-04-01 18:03:16 +02003188" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003189endfun
3190
3191" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003192" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
3193fun! s:ExplorePatHls(pattern)
3194" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
3195 let repat= substitute(a:pattern,'^**/\{1,2}','','')
3196" call Decho("repat<".repat.">")
3197 let repat= escape(repat,'][.\')
3198" call Decho("repat<".repat.">")
3199 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
3200" call Dret("s:ExplorePatHls repat<".repat.">")
3201 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00003202endfun
3203
3204" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003205" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003206" 0: (user: <mb>) bookmark current directory
3207" 1: (user: <gb>) change to the bookmarked directory
3208" 2: (user: <qb>) list bookmarks
3209" 3: (browsing) record current directory history
3210" 4: (user: <u>) go up (previous) bookmark
3211" 5: (user: <U>) go down (next) bookmark
3212" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01003213fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003214" 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 +02003215 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3216" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
3217 return
3218 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003219
Bram Moolenaar97d62492012-11-15 21:28:22 +01003220 let ykeep= @@
Bram Moolenaar9964e462007-05-05 17:54:07 +00003221 if a:chg == 0
3222 " bookmark the current directory
3223" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003224 if !exists("g:netrw_bookmarklist")
3225 let g:netrw_bookmarklist= []
3226 endif
3227 if index(g:netrw_bookmarklist,a:curdir) == -1
3228 " curdir not currently in g:netrw_bookmarklist, so include it
3229 call add(g:netrw_bookmarklist,a:curdir)
3230 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003231 endif
3232 echo "bookmarked the current directory"
3233
3234 elseif a:chg == 1
3235 " change to the bookmarked directory
Bram Moolenaarff034192013-04-24 18:51:19 +02003236" call Decho("(user: <".v:count."gb>) change to the bookmarked directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003237 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaarff034192013-04-24 18:51:19 +02003238" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003239 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00003240 else
3241 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3242 endif
3243
3244 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003245" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00003246 let didwork= 0
3247 " list user's bookmarks
3248" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003249 if exists("g:netrw_bookmarklist")
3250" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
3251 let cnt= 1
3252 for bmd in g:netrw_bookmarklist
3253" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
Bram Moolenaarff034192013-04-24 18:51:19 +02003254 echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
Bram Moolenaar5c736222010-01-06 20:54:52 +01003255 let didwork = 1
3256 let cnt = cnt + 1
3257 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00003258 endif
3259
3260 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01003261 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00003262 let first = 1
3263 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003264 if g:netrw_dirhistmax > 0
3265 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01003266" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003267 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003268" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaarff034192013-04-24 18:51:19 +02003269 echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02003270 let didwork= 1
3271 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003272 let histcnt = histcnt + 1
3273 let first = 0
3274 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003275 if cnt < 0
3276 let cnt= cnt + g:netrw_dirhistmax
3277 endif
3278 endwhile
3279 else
3280 let g:netrw_dirhist_cnt= 0
3281 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003282 if didwork
3283 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3284 endif
3285
3286 elseif a:chg == 3
3287 " saves most recently visited directories (when they differ)
3288" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003289 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 +02003290 if g:netrw_dirhistmax > 0
3291 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3292 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
3293 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003294" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003295 endif
3296
3297 elseif a:chg == 4
3298 " u: change to the previous directory stored on the history list
3299" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003300 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003301 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003302 if g:netrw_dirhist_cnt < 0
3303 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3304 endif
3305 else
3306 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003307 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003308 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
3309" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003310 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003311 setl ma noro
3312" call Decho("(NetrwBookHistHandler) setl ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003313 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003314 setl nomod
3315" call Decho("(NetrwBookHistHandler) setl nomod")
3316" 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 +00003317 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003318" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003319 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00003320 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003321 if g:netrw_dirhistmax > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003322 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + v:count1 ) % g:netrw_dirhistmax
Bram Moolenaaradc21822011-04-01 18:03:16 +02003323 else
3324 let g:netrw_dirhist_cnt= 0
3325 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003326 echo "Sorry, no predecessor directory exists yet"
3327 endif
3328
3329 elseif a:chg == 5
3330 " U: change to the subsequent directory stored on the history list
3331" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003332 if g:netrw_dirhistmax > 0
3333 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3334 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003335" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003336 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003337" call Decho("(NetrwBookHistHandler) setl ma noro")
3338 setl ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02003339 sil! keepj %d
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003340" call Decho("removed all lines from buffer (%d)")
3341" call Decho("(NetrwBookHistHandler) setl nomod")
3342 setl nomod
3343" 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 +02003344 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003345" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003346 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
3347 else
3348 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
3349 if g:netrw_dirhist_cnt < 0
3350 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3351 endif
3352 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003353 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003354 else
3355 let g:netrw_dirhist_cnt= 0
3356 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003357 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003358
3359 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01003360 " delete the v:count'th bookmark
3361" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
3362 let savefile= s:NetrwHome()."/.netrwbook"
3363 if filereadable(savefile)
Bram Moolenaarff034192013-04-24 18:51:19 +02003364" call Decho("merge bookmarks (active and file)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003365 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
Bram Moolenaarff034192013-04-24 18:51:19 +02003366" call Decho("bookmark delete savefile<".savefile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003367 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003368 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003369" call Decho("remove g:netrw_bookmarklist[".(v:count-1)."]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003370 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaarff034192013-04-24 18:51:19 +02003371" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003372 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003373 call s:NetrwBookmarkMenu()
Bram Moolenaarff034192013-04-24 18:51:19 +02003374 call s:NetrwTgtMenu()
Bram Moolenaar97d62492012-11-15 21:28:22 +01003375 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003376" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003377endfun
3378
3379" ---------------------------------------------------------------------
3380" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
3381" Sister function: s:NetrwBookHistSave()
3382fun! s:NetrwBookHistRead()
3383" call Dfunc("s:NetrwBookHistRead()")
Bram Moolenaarff034192013-04-24 18:51:19 +02003384 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3385" " call Dret("s:NetrwBookHistRead - suppressed due to g:netrw_dirhistmax")
3386 return
3387 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003388 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01003389 if !exists("s:netrw_initbookhist")
3390 let home = s:NetrwHome()
3391 let savefile= home."/.netrwbook"
3392 if filereadable(savefile)
3393" call Decho("sourcing .netrwbook")
Bram Moolenaarff034192013-04-24 18:51:19 +02003394 exe "keepalt keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003395 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003396 if g:netrw_dirhistmax > 0
3397 let savefile= home."/.netrwhist"
3398 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003399" call Decho("sourcing .netrwhist")
Bram Moolenaarff034192013-04-24 18:51:19 +02003400 exe "keepalt keepj so ".savefile
Bram Moolenaaradc21822011-04-01 18:03:16 +02003401 endif
3402 let s:netrw_initbookhist= 1
3403 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003404 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003405 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003406 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01003407" call Dret("s:NetrwBookHistRead")
3408endfun
3409
3410" ---------------------------------------------------------------------
3411" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
3412" Sister function: s:NetrwBookHistRead()
3413" I used to do this via viminfo but that appears to
3414" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01003415fun! s:NetrwBookHistSave()
3416" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaarff034192013-04-24 18:51:19 +02003417 if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003418" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
3419 return
3420 endif
3421
Bram Moolenaar5c736222010-01-06 20:54:52 +01003422 let savefile= s:NetrwHome()."/.netrwhist"
3423 1split
3424 call s:NetrwEnew()
Bram Moolenaarff034192013-04-24 18:51:19 +02003425 setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
3426 setl nocin noai noci magic nospell nohid wig= noaw
3427 setl ma noro write
3428 if exists("+acd") | setl noacd | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003429 sil! keepj keepalt %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01003430
3431 " save .netrwhist -- no attempt to merge
Bram Moolenaarff034192013-04-24 18:51:19 +02003432 sil! keepalt file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01003433 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
3434 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
3435 let lastline = line("$")
3436 let cnt = 1
3437 while cnt <= g:netrw_dirhist_cnt
3438 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
3439 let cnt= cnt + 1
3440 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003441 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003442
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003443 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01003444 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3445 " merge and write .netrwbook
3446 let savefile= s:NetrwHome()."/.netrwbook"
3447
3448 if filereadable(savefile)
3449 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaarff034192013-04-24 18:51:19 +02003450 exe "sil keepj keepalt so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003451 for bdm in booklist
3452 if index(g:netrw_bookmarklist,bdm) == -1
3453 call add(g:netrw_bookmarklist,bdm)
3454 endif
3455 endfor
3456 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003457 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003458 endif
3459
3460 " construct and save .netrwbook
3461 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003462 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01003463 endif
3464 let bgone= bufnr("%")
3465 q!
Bram Moolenaarff034192013-04-24 18:51:19 +02003466 exe "keepalt ".bgone."bwipe!"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003467
3468" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003469endfun
3470
3471" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003472" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
3473" list of the contents of a local or remote directory. It is assumed that the
3474" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
3475" with the requested remote hostname first.
3476fun! s:NetrwBrowse(islocal,dirname)
3477 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003478" 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 +02003479" call Decho("(NetrwBrowse) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003480" call Dredir("ls!")
Bram Moolenaar97d62492012-11-15 21:28:22 +01003481 " s:NetrwBrowse: initialize history {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003482 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003483 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003484 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003485
Bram Moolenaar97d62492012-11-15 21:28:22 +01003486 " s:NetrwBrowse: simplify the dirname (especially for ".."s in dirnames) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01003487 if a:dirname !~ '^\a\+://'
3488 let dirname= simplify(a:dirname)
3489 else
3490 let dirname= a:dirname
3491 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003492
3493 if exists("s:netrw_skipbrowse")
3494 unlet s:netrw_skipbrowse
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003495" 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 +00003496" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
3497 return
3498 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003499
3500 " s:NetrwBrowse: sanity checks: {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003501 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003502 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003503" call Dret("s:NetrwBrowse : missing shellescape()")
3504 return
3505 endif
3506 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003507 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003508" call Dret("s:NetrwBrowse : missing fnameescape()")
3509 return
3510 endif
3511
Bram Moolenaar97d62492012-11-15 21:28:22 +01003512 " s:NetrwBrowse: save options: {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003513 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003514
Bram Moolenaar97d62492012-11-15 21:28:22 +01003515 " s:NetrwBrowse: re-instate any marked files {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003516 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaarff034192013-04-24 18:51:19 +02003517" call Decho("(NetrwBrowse) clearing marked files")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003518 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3519 endif
3520
3521 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
Bram Moolenaar97d62492012-11-15 21:28:22 +01003522 " s:NetrwBrowse: set up "safe" options for local directory/file {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003523" call Decho("(NetrwBrowse) handle w:netrw_acdkeep:")
3524" call Decho("(NetrwBrowse) keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003525 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003526 call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02003527" call Decho("(NetrwBrowse) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003528
Bram Moolenaar5c736222010-01-06 20:54:52 +01003529 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar97d62492012-11-15 21:28:22 +01003530 " s:NetrwBrowse: looks like a remote regular file, attempt transfer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003531" call Decho("(NetrwBrowse) attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003532
Bram Moolenaar97d62492012-11-15 21:28:22 +01003533 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaar446cb832008-06-24 21:56:24 +00003534 " "this is a directory" indicator (/).
3535 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01003536 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +02003537" call Decho("(NetrwBrowse) new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003538 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003539
Bram Moolenaar97d62492012-11-15 21:28:22 +01003540 " s:NetrwBrowse: remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003541 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01003542 call s:NetrwEnew(dirname)
3543 call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02003544 setl ma noro
3545" call Decho("(NetrwBrowse) setl ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02003546 let b:netrw_curdir = dirname
3547 let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
Bram Moolenaarff034192013-04-24 18:51:19 +02003548" call Decho("(NetrwBrowse) exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
Bram Moolenaar15146672011-10-20 22:22:38 +02003549 exe "sil! keepj keepalt file ".fnameescape(url)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003550 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02003551 sil call netrw#NetRead(2,url)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003552 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003553 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02003554 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003555 endif
3556
Bram Moolenaar97d62492012-11-15 21:28:22 +01003557 " s:NetrwBrowse: save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003558 call s:SetBufWinVars()
3559 call s:NetrwOptionRestore("w:")
Bram Moolenaarff034192013-04-24 18:51:19 +02003560" call Decho("(NetrwBrowse) setl ma nomod")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003561 setl ma nomod
3562" 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 +00003563
Bram Moolenaar446cb832008-06-24 21:56:24 +00003564" call Dret("s:NetrwBrowse : file<".s:fname.">")
3565 return
3566 endif
3567
Bram Moolenaaradc21822011-04-01 18:03:16 +02003568 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003569 call s:UseBufWinVars()
3570
3571 " set up some variables {{{3
3572 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003573 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003574 let s:last_sort_by = g:netrw_sort_by
3575
3576 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02003577 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003578
Bram Moolenaar97d62492012-11-15 21:28:22 +01003579 " get/set-up buffer {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00003580 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
3581 " maintain markfile highlighting
3582 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
Bram Moolenaarff034192013-04-24 18:51:19 +02003583" call Decho("(NetrwBrowse) bufnr(%)=".bufnr('%'))
3584" call Decho("(NetrwBrowse) exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003585 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3586 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003587" call Decho("(NetrwBrowse) 2match none")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003588 2match none
3589 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003590 if reusing && line("$") > 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003591 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003592" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3593 setl noma nomod nowrap
Bram Moolenaarff034192013-04-24 18:51:19 +02003594" 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 +00003595" call Dret("s:NetrwBrowse : re-using buffer")
3596 return
3597 endif
3598
3599 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003600" call Decho("(NetrwBrowse) set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003601 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003602 if b:netrw_curdir =~ '[/\\]$'
3603 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
3604 endif
3605 if b:netrw_curdir == ''
3606 if has("amiga")
3607 " On the Amiga, the empty string connotes the current directory
3608 let b:netrw_curdir= getcwd()
3609 else
3610 " under unix, when the root directory is encountered, the result
3611 " from the preceding substitute is an empty string.
3612 let b:netrw_curdir= '/'
3613 endif
3614 endif
3615 if !a:islocal && b:netrw_curdir !~ '/$'
3616 let b:netrw_curdir= b:netrw_curdir.'/'
3617 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003618" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003619
3620 " ------------
3621 " (local only) {{{3
3622 " ------------
3623 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02003624" call Decho("(NetrwBrowse) local only:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003625
3626 " Set up ShellCmdPost handling. Append current buffer to browselist
3627 call s:LocalFastBrowser()
3628
3629 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
3630 if !g:netrw_keepdir
Bram Moolenaarff034192013-04-24 18:51:19 +02003631" call Decho("(NetrwBrowse) handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
3632" call Decho("(NetrwBrowse) l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003633 if !exists("&l:acd") || !&l:acd
3634" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
3635 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003636 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003637 catch /^Vim\%((\a\+)\)\=:E472/
3638 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
3639 if exists("w:netrw_prvdir")
3640 let b:netrw_curdir= w:netrw_prvdir
3641 else
3642 call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003643" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3644 setl noma nomod nowrap
3645" 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 +00003646 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00003647" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
3648 return
3649 endif
3650 endtry
3651 endif
3652 endif
3653
3654 " --------------------------------
3655 " remote handling: {{{3
3656 " --------------------------------
3657 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003658" call Decho("(NetrwBrowse) remote only:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003659
Bram Moolenaar97d62492012-11-15 21:28:22 +01003660 " analyze dirname and g:netrw_list_cmd {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003661" 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 +01003662 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003663 let dirname= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02003664" call Decho("(NetrwBrowse) (dirname was <NetrwTreeListing>) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003665 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3666 let dirname= substitute(b:netrw_curdir,'\\','/','g')
3667 if dirname !~ '/$'
3668 let dirname= dirname.'/'
3669 endif
3670 let b:netrw_curdir = dirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003671" call Decho("(NetrwBrowse) (liststyle is TREELIST) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003672 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003673 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaarff034192013-04-24 18:51:19 +02003674" call Decho("(NetrwBrowse) (normal) dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003675 endif
3676
3677 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
3678 if dirname !~ dirpat
3679 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003680 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003681 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003682 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003683" call Decho("(NetrwBrowse) setl noma nomod nowrap")
3684 setl noma nomod nowrap
3685" 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 +00003686" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
3687 return
3688 endif
3689 let b:netrw_curdir= dirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003690" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir."> (remote)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003691 endif " (additional remote handling)
3692
3693 " -----------------------
3694 " Directory Listing: {{{3
3695 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02003696 keepj call s:NetrwMaps(a:islocal)
3697 keepj call s:PerformListing(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02003698 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003699 let &l:bexpr= "netrw#NetrwBalloonHelp()"
Bram Moolenaarff034192013-04-24 18:51:19 +02003700" call Decho("(NetrwBrowse) set up balloon help: l:bexpr=".&l:bexpr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02003701 set beval
3702 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003703 call s:NetrwOptionRestore("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003704
3705 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
3706 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
3707 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
3708 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
3709 " function gets called due to that autocmd; it notices that the following variable is set
3710 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
3711 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003712
Bram Moolenaar5b435d62012-04-05 17:33:26 +02003713" 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 +02003714" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003715 return
3716endfun
3717
3718" ---------------------------------------------------------------------
3719" s:NetrwFileInfo: supports qf (query for file information) {{{2
3720fun! s:NetrwFileInfo(islocal,fname)
3721" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01003722 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00003723 if a:islocal
3724 if (has("unix") || has("macunix")) && executable("/bin/ls")
3725 if exists("b:netrw_curdir")
3726" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
3727 if b:netrw_curdir =~ '/$'
3728 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
3729 else
3730 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
3731 endif
3732 else
3733" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
3734 echo system("/bin/ls -lsad ".shellescape(a:fname))
3735 endif
3736 else
3737 " use vim functions to return information about file below cursor
3738" call Decho("using vim functions to query for file info")
3739 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
3740 let fname= substitute(a:fname,".$","","")
3741 else
3742 let fname= a:fname
3743 endif
3744 let t = getftime(fname)
3745 let sz = getfsize(fname)
3746 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
3747" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
3748 endif
3749 else
3750 echo "sorry, \"qf\" not supported yet for remote files"
3751 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01003752 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00003753" call Dret("s:NetrwFileInfo")
3754endfun
3755
3756" ---------------------------------------------------------------------
3757" s:NetrwGetBuffer: {{{2
3758" returns 0=cleared buffer
3759" 1=re-used buffer
3760fun! s:NetrwGetBuffer(islocal,dirname)
3761" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
3762 let dirname= a:dirname
3763
3764 " re-use buffer if possible {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003765" call Decho("(NetrwGetBuffer) --re-use a buffer if possible--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003766 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3767 " find NetrwTreeList buffer if there is one
Bram Moolenaarff034192013-04-24 18:51:19 +02003768" call Decho("(NetrwGetBuffer) case liststyle=treelist: find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003769 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
Bram Moolenaarff034192013-04-24 18:51:19 +02003770" call Decho("(NetrwGetBuffer) re-use w:netrw_treebufnr=".w:netrw_treebufnr)
3771 sil keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003772 let eikeep= &ei
3773 set ei=all
Bram Moolenaarff034192013-04-24 18:51:19 +02003774 exe "sil! keepalt b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00003775 let &ei= eikeep
Bram Moolenaarff034192013-04-24 18:51:19 +02003776" call Dret("s:NetrwGetBuffer 0<buffer cleared> : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
3777 return 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003778 endif
3779 let bufnum= -1
Bram Moolenaarff034192013-04-24 18:51:19 +02003780" call Decho("(NetrwGetBuffer) liststyle=TREE but w:netrw_treebufnr doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003781
3782 else
3783 " find buffer number of buffer named precisely the same as dirname {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003784" 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 +00003785" call Dredir("ls!")
3786
3787 " get dirname and associated buffer number
3788 let bufnum = bufnr(escape(dirname,'\'))
Bram Moolenaarff034192013-04-24 18:51:19 +02003789" call Decho("(NetrwGetBuffer) find buffer<".dirname.">'s number ")
3790" call Decho("(NetrwGetBuffer) bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003791
3792 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003793 " try appending a trailing /
Bram Moolenaarff034192013-04-24 18:51:19 +02003794" call Decho("(NetrwGetBuffer) try appending a trailing / to dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003795 let bufnum= bufnr(escape(dirname.'/','\'))
3796 if bufnum > 0
3797 let dirname= dirname.'/'
3798 endif
3799 endif
3800
3801 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003802 " try removing a trailing /
Bram Moolenaarff034192013-04-24 18:51:19 +02003803" call Decho("(NetrwGetBuffer) try removing a trailing / from dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003804 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
3805 if bufnum > 0
3806 let dirname= substitute(dirname,'/$','','')
3807 endif
3808 endif
3809
Bram Moolenaarff034192013-04-24 18:51:19 +02003810" call Decho("(NetrwGetBuffer) findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003811 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
3812 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
3813 " handle approximate matches
Bram Moolenaarff034192013-04-24 18:51:19 +02003814" 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 +00003815 let ibuf = 1
3816 let buflast = bufnr("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02003817" call Decho("(NetrwGetBuffer) findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003818 while ibuf <= buflast
3819 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00003820 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02003821" call Decho("(NetrwGetBuffer) findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003822 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
3823 " bname is not empty
3824 " dirname ends with bname,
3825 " dirname doesn't start with /, so its not a absolute path
Bram Moolenaarff034192013-04-24 18:51:19 +02003826" call Decho("(NetrwGetBuffer) findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003827 break
3828 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003829 if bname =~ '^'.dirname.'/\=$'
3830 " bname begins with dirname
3831" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003832 break
3833 endif
3834 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003835" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
3836 break
3837 endif
3838 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
3839" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01003840 break
3841 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003842 let ibuf= ibuf + 1
3843 endwhile
3844 if ibuf > buflast
3845 let bufnum= -1
3846 else
3847 let bufnum= ibuf
3848 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003849" call Decho("(NetrwGetBuffer) findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003850 endif
3851 endif
3852
3853 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003854" call Decho("(NetrwGetBuffer) get enew buffer and name it OR re-use buffer")
3855 sil! keepj keepalt mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00003856 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaarff034192013-04-24 18:51:19 +02003857" 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 +00003858 call s:NetrwEnew(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02003859" call Decho("(NetrwGetBuffer) got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003860 " name the buffer
3861 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3862 " Got enew buffer; transform into a NetrwTreeListing
Bram Moolenaarff034192013-04-24 18:51:19 +02003863" call Decho("(NetrwGetBuffer) --transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003864 if !exists("s:netrw_treelistnum")
3865 let s:netrw_treelistnum= 1
3866 else
3867 let s:netrw_treelistnum= s:netrw_treelistnum + 1
3868 endif
3869 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02003870" call Decho("(NetrwGetBuffer) exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003871 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
3872 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02003873 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
3874 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
3875 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
3876 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaarff034192013-04-24 18:51:19 +02003877" call Decho("(NetrwGetBuffer) tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003878 else
3879" let v:errmsg= "" " Decho
3880 let escdirname= fnameescape(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02003881" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003882" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003883" let v:errmsg= "" " Decho
3884 exe 'sil! keepalt file '.escdirname
Bram Moolenaarff034192013-04-24 18:51:19 +02003885" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003886 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02003887" call Decho("(NetrwGetBuffer) named enew buffer#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003888
3889 else " Re-use the buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02003890" call Decho("(NetrwGetBuffer) --re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003891 let eikeep= &ei
3892 set ei=all
3893 if getline(2) =~ '^" Netrw Directory Listing'
Bram Moolenaarff034192013-04-24 18:51:19 +02003894" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003895 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003896 else
Bram Moolenaarff034192013-04-24 18:51:19 +02003897" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum)
3898 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00003899 endif
3900 if bufname("%") == '.'
Bram Moolenaarff034192013-04-24 18:51:19 +02003901" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003902 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00003903 endif
3904 let &ei= eikeep
3905 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02003906 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar97d62492012-11-15 21:28:22 +01003907" call Dret("s:NetrwGetBuffer 0<buffer empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
3908 return 0
3909 elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
3910 keepj call s:NetrwListSettings(a:islocal)
3911 sil keepj %d
3912" 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 +00003913 return 0
3914 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02003915" call Decho("(NetrwGetBuffer) --re-use tree listing--")
3916" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003917 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02003918 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar97d62492012-11-15 21:28:22 +01003919" 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 +00003920 return 0
3921 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01003922" call Dret("s:NetrwGetBuffer 1<buffer not cleared> : buf#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003923 return 1
3924 endif
3925 endif
3926
3927 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
3928 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
3929 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
3930 " med 1 D H
3931 " fast 2 H H
Bram Moolenaarff034192013-04-24 18:51:19 +02003932" 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 +00003933 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003934 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02003935" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003936 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003937
3938 " delete all lines from buffer {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02003939" call Decho("(NetrwGetBuffer) --delete all lines from buffer--")
3940" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003941 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003942
Bram Moolenaar97d62492012-11-15 21:28:22 +01003943" 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 +00003944 return 0
3945endfun
3946
3947" ---------------------------------------------------------------------
3948" s:NetrwGetcwd: get the current directory. {{{2
3949" Change backslashes to forward slashes, if any.
3950" If doesc is true, escape certain troublesome characters
3951fun! s:NetrwGetcwd(doesc)
3952" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
3953 let curdir= substitute(getcwd(),'\\','/','ge')
3954 if curdir !~ '[\/]$'
3955 let curdir= curdir.'/'
3956 endif
3957 if a:doesc
3958 let curdir= fnameescape(curdir)
3959 endif
3960" call Dret("NetrwGetcwd <".curdir.">")
3961 return curdir
3962endfun
3963
3964" ---------------------------------------------------------------------
3965" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
3966fun! s:NetrwGetWord()
3967" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
3968 call s:UseBufWinVars()
3969
3970 " insure that w:netrw_liststyle is set up
3971 if !exists("w:netrw_liststyle")
3972 if exists("g:netrw_liststyle")
3973 let w:netrw_liststyle= g:netrw_liststyle
3974 else
3975 let w:netrw_liststyle= s:THINLIST
3976 endif
3977" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
3978 endif
3979
3980 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
3981 " Active Banner support
3982" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003983 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00003984 let dirname= "./"
3985 let curline= getline('.')
3986
3987 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003988 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00003989 let s:netrw_skipbrowse= 1
3990 echo 'Pressing "s" also works'
3991
3992 elseif curline =~ '"\s*Sort sequence:'
3993 let s:netrw_skipbrowse= 1
3994 echo 'Press "S" to edit sorting sequence'
3995
3996 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003997 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00003998 let s:netrw_skipbrowse= 1
3999 echo 'Pressing "?" also works'
4000
4001 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004002 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00004003 let s:netrw_skipbrowse= 1
4004 echo 'Pressing "a" also works'
4005
4006 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004007 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004008 endif
4009
4010 elseif w:netrw_liststyle == s:THINLIST
4011" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004012 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004013 let dirname= getline('.')
4014
4015 elseif w:netrw_liststyle == s:LONGLIST
4016" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004017 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00004018 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
4019
4020 elseif w:netrw_liststyle == s:TREELIST
4021" call Decho("treelist handling")
4022 let dirname= substitute(getline('.'),'^\(| \)*','','e')
4023
4024 else
4025" call Decho("obtain word from wide listing")
4026 let dirname= getline('.')
4027
4028 if !exists("b:netrw_cpf")
4029 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004030 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 +01004031 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004032" call Decho("computed cpf=".b:netrw_cpf)
4033 endif
4034
4035" call Decho("buf#".bufnr("%")."<".bufname("%").">")
4036 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
4037" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
4038" call Decho("1: dirname<".dirname.">")
4039 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004040 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004041 else
4042 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004043 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004044 endif
4045 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004046 let eofname= filestart + b:netrw_cpf + 1
4047 if eofname <= col("$")
4048 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004049 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00004050 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004051 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00004052 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004053 let dirname = @a
4054 let @a = rega
4055" call Decho("2: dirname<".dirname.">")
4056 let dirname= substitute(dirname,'\s\+$','','e')
4057" call Decho("3: dirname<".dirname.">")
4058 endif
4059
4060 " symlinks are indicated by a trailing "@". Remove it before further processing.
4061 let dirname= substitute(dirname,"@$","","")
4062
4063 " executables are indicated by a trailing "*". Remove it before further processing.
4064 let dirname= substitute(dirname,"\*$","","")
4065
4066" call Dret("s:NetrwGetWord <".dirname.">")
4067 return dirname
4068endfun
4069
4070" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004071" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004072fun! s:NetrwListSettings(islocal)
4073" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
4074 let fname= bufname("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02004075" call Decho("(NetrwListSettings) setl bt=nofile nobl ma nonu nowrap noro")
4076 setl bt=nofile nobl ma nonu nowrap noro
4077" call Decho("(NetrwListSettings) exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004078 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004079 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004080 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004081 endif
4082" call Dredir("ls!")
Bram Moolenaarff034192013-04-24 18:51:19 +02004083" call Decho("(NetrwListSettings) exe setl ts=".(g:netrw_maxfilenamelen+1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01004084 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaarff034192013-04-24 18:51:19 +02004085 setl isk+=.,~,-
Bram Moolenaar446cb832008-06-24 21:56:24 +00004086 if g:netrw_fastbrowse > a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004087 setl bh=hide
Bram Moolenaar446cb832008-06-24 21:56:24 +00004088 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004089 setl bh=delete
Bram Moolenaar446cb832008-06-24 21:56:24 +00004090 endif
4091" call Dret("s:NetrwListSettings")
4092endfun
4093
4094" ---------------------------------------------------------------------
4095" s:NetrwListStyle: {{{2
4096" islocal=0: remote browsing
4097" =1: local browsing
4098fun! s:NetrwListStyle(islocal)
4099" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004100 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004101 let fname = s:NetrwGetWord()
4102 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
4103 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
4104" call Decho("fname<".fname.">")
4105" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
4106" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
4107
4108 if w:netrw_liststyle == s:THINLIST
4109 " use one column listing
4110" call Decho("use one column list")
4111 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4112
4113 elseif w:netrw_liststyle == s:LONGLIST
4114 " use long list
4115" call Decho("use long list")
4116 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4117
4118 elseif w:netrw_liststyle == s:WIDELIST
4119 " give wide list
4120" call Decho("use wide list")
4121 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4122
4123 elseif w:netrw_liststyle == s:TREELIST
4124" call Decho("use tree list")
4125 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4126
4127 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004128 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004129 let g:netrw_liststyle = s:THINLIST
4130 let w:netrw_liststyle = g:netrw_liststyle
4131 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4132 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004133 setl ma noro
4134" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004135
4136 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
4137" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004138 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004139 " following prevents tree listing buffer from being marked "modified"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004140" call Decho("(NetrwListStyle) setl nomod")
4141 setl nomod
4142" 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 +00004143
4144 " refresh the listing
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004145" call Decho("(NetrwListStyle) refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004146 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004147 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4148 keepj call netrw#NetrwRestorePosn(svpos)
4149 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004150
4151 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004152 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00004153 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4154" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4155 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004156 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00004157 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004158 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004159
4160" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4161endfun
4162
4163" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004164" s:NetrwBannerCtrl: toggles the display of the banner {{{2
4165fun! s:NetrwBannerCtrl(islocal)
4166" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
4167
Bram Moolenaar97d62492012-11-15 21:28:22 +01004168 let ykeep= @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004169 " toggle the banner (enable/suppress)
4170 let g:netrw_banner= !g:netrw_banner
4171
4172 " refresh the listing
4173 let svpos= netrw#NetrwSavePosn()
4174 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4175
4176 " keep cursor on the filename
4177 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004178 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01004179 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4180" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4181 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004182 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01004183 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004184 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004185" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
4186endfun
4187
4188" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004189" s:NetrwBookmarkMenu: Uses menu priorities {{{2
4190" .2.[cnt] for bookmarks, and
4191" .3.[cnt] for history
4192" (see s:NetrwMenu())
4193fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004194 if !exists("s:netrw_menucnt")
4195 return
4196 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004197" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004198
4199 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02004200 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00004201 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004202" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004203 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4204 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01004205 endif
4206 if !exists("s:netrw_initbookhist")
4207 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004208 endif
4209
4210 " show bookmarked places
Bram Moolenaarff034192013-04-24 18:51:19 +02004211 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01004212 let cnt= 1
4213 for bmd in g:netrw_bookmarklist
Bram Moolenaaradc21822011-04-01 18:03:16 +02004214" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004215 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004216
4217 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004218 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004219
4220 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004221 exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.' '.cnt."mB"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004222 let cnt= cnt + 1
4223 endfor
4224
4225 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004226
4227 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02004228 if g:netrw_dirhistmax > 0
4229 let cnt = g:netrw_dirhist_cnt
4230 let first = 1
4231 let histcnt = 0
4232 while ( first || cnt != g:netrw_dirhist_cnt )
4233 let histcnt = histcnt + 1
4234 let priority = g:netrw_dirhist_cnt + histcnt
4235 if exists("g:netrw_dirhist_{cnt}")
4236 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
4237" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
4238 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
4239 endif
4240 let first = 0
4241 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4242 if cnt < 0
4243 let cnt= cnt + g:netrw_dirhistmax
4244 endif
4245 endwhile
4246 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004247
Bram Moolenaar9964e462007-05-05 17:54:07 +00004248 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004249" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004250endfun
4251
4252" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004253" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
4254" directory and a new directory name. Also, if the
4255" "new directory name" is actually a file,
4256" NetrwBrowseChgDir() edits the file.
4257fun! s:NetrwBrowseChgDir(islocal,newdir,...)
4258" 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 +00004259
Bram Moolenaar97d62492012-11-15 21:28:22 +01004260 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004261 if !exists("b:netrw_curdir")
4262 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
4263 " and the current window is the NetrwMessage window.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004264 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004265" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004266" call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004267" call Dredir("ls!")
4268" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004269 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00004270 endif
4271
Bram Moolenaar97d62492012-11-15 21:28:22 +01004272 " NetrwBrowseChgDir: save options and initialize {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02004273 keepj call s:NetrwOptionSave("s:")
4274 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004275 let nbcd_curpos = netrw#NetrwSavePosn()
4276 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004277" call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004278 if (has("win32") || has("win95") || has("win64") || has("win16"))
4279 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
4280 else
4281 let dirname= b:netrw_curdir
4282 endif
4283 let newdir = a:newdir
4284 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00004285
Bram Moolenaar446cb832008-06-24 21:56:24 +00004286 " set up o/s-dependent directory recognition pattern
4287 if has("amiga")
4288 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00004289 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004290 let dirpat= '[\/]$'
4291 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004292" call Decho("(NetrwBrowseChgDir) dirname<".dirname."> dirpat<".dirpat.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004293
4294 if dirname !~ dirpat
4295 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02004296 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004297 let dirname= dirname.'/'
Bram Moolenaarff034192013-04-24 18:51:19 +02004298" call Decho("(NetrwBrowseChgDir) adjusting dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004299 endif
4300
4301 if newdir !~ dirpat
Bram Moolenaar97d62492012-11-15 21:28:22 +01004302 " ------------------------------
4303 " NetrwBrowseChgDir: edit a file {{{3
4304 " ------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004305" call Decho('(NetrwBrowseChgDir:edit-a-file) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004306
Bram Moolenaar97d62492012-11-15 21:28:22 +01004307 " save position for benefit of Rexplore
4308 let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn()
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004309
Bram Moolenaarff034192013-04-24 18:51:19 +02004310" call Decho("(NetrwBrowseChgDir:edit-a-file) setting s:rexposn_".bufnr("%")." to SavePosn")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004311 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
4312 let dirname= s:NetrwTreeDir()
4313 if dirname =~ '/$'
4314 let dirname= dirname.newdir
4315 else
4316 let dirname= s:NetrwTreeDir()."/".newdir
4317 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004318" call Decho("(NetrwBrowseChgDir:edit-a-file) dirname<".dirname.">")
4319" call Decho("(NetrwBrowseChgDir:edit-a-file) tree listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004320 elseif newdir =~ '^\(/\|\a:\)'
4321 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00004322 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004323 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004324 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004325" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file: dirname<".dirname."> (a:0=".a:0.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004326 " this lets NetrwBrowseX avoid the edit
4327 if a:0 < 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004328" 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 +02004329 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004330 if !exists("s:didsplit")
Bram Moolenaarff034192013-04-24 18:51:19 +02004331" 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 +00004332 if g:netrw_browse_split == 1
Bram Moolenaar97d62492012-11-15 21:28:22 +01004333 " horizontally splitting the window first
Bram Moolenaarff034192013-04-24 18:51:19 +02004334 keepalt new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004335 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004336 keepalt wincmd _
Bram Moolenaar5c736222010-01-06 20:54:52 +01004337 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004338 elseif g:netrw_browse_split == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01004339 " vertically splitting the window first
Bram Moolenaarff034192013-04-24 18:51:19 +02004340 keepalt rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01004341 if !&ea
Bram Moolenaarff034192013-04-24 18:51:19 +02004342 keepalt wincmd |
Bram Moolenaar5c736222010-01-06 20:54:52 +01004343 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004344 elseif g:netrw_browse_split == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004345 " open file in new tab
Bram Moolenaarff034192013-04-24 18:51:19 +02004346 keepalt tabnew
Bram Moolenaar446cb832008-06-24 21:56:24 +00004347 elseif g:netrw_browse_split == 4
Bram Moolenaar97d62492012-11-15 21:28:22 +01004348 " act like "P" (ie. open previous window)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004349 if s:NetrwPrevWinOpen(2) == 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01004350 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004351" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004352 return
4353 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004354 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004355 " handling a file, didn't split, so remove menu
Bram Moolenaarff034192013-04-24 18:51:19 +02004356" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file+didn't split, so remove menu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004357 call s:NetrwMenu(0)
4358 " optional change to window
4359 if g:netrw_chgwin >= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004360 exe "keepj keepalt ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00004361 endif
4362 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004363 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004364
Bram Moolenaar446cb832008-06-24 21:56:24 +00004365 " the point where netrw actually edits the (local) file
4366 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
4367 if a:islocal
Bram Moolenaarff034192013-04-24 18:51:19 +02004368" call Decho("(NetrwBrowseChgDir:edit-a-file) edit local file: exe e! ".fnameescape(dirname))
4369 exe "keepj keepalt e! ".fnameescape(dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004370 call s:NetrwCursor()
Bram Moolenaar9964e462007-05-05 17:54:07 +00004371 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004372" call Decho("(NetrwBrowseChgDir:edit-a-file) remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004373 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004374 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01004375
4376 " handle g:Netrw_funcref -- call external-to-netrw functions
4377 " This code will handle g:Netrw_funcref as an individual function reference
4378 " or as a list of function references. It will ignore anything that's not
4379 " a function reference. See :help Funcref for information about function references.
4380 if exists("g:Netrw_funcref")
Bram Moolenaarff034192013-04-24 18:51:19 +02004381" call Decho("(NetrwBrowseChgDir:edit-a-file) handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004382 if type(g:Netrw_funcref) == 2
Bram Moolenaarff034192013-04-24 18:51:19 +02004383" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004384 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004385 elseif type(g:Netrw_funcref) == 3
Bram Moolenaarff034192013-04-24 18:51:19 +02004386" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004387 for Fncref in g:Netrw_funcref
4388 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02004389 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004390 endif
4391 endfor
4392 endif
4393 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004394 endif
4395
4396 elseif newdir =~ '^/'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004397 " ----------------------------------------------------
4398 " NetrwBrowseChgDir: just go to the new directory spec {{{3
4399 " ----------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004400" call Decho('(NetrwBrowseChgDir:goto-newdir) case "just go to new directory spec": newdir<'.newdir.'>')
Bram Moolenaar97d62492012-11-15 21:28:22 +01004401 let dirname = newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02004402 keepj call s:SetRexDir(a:islocal,dirname)
4403 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004404
4405 elseif newdir == './'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004406 " ---------------------------------------------
4407 " NetrwBrowseChgDir: refresh the directory list {{{3
4408 " ---------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004409" call Decho('(NetrwBrowseChgDir:refresh-dirlist) case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004410 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004411
4412 elseif newdir == '../'
Bram Moolenaar97d62492012-11-15 21:28:22 +01004413 " --------------------------------------
4414 " NetrwBrowseChgDir: go up one directory {{{3
4415 " --------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004416" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004417
4418 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
4419 " force a refresh
Bram Moolenaarff034192013-04-24 18:51:19 +02004420" call Decho("(NetrwBrowseChgDir:go-up) clear buffer<".expand("%")."> with :%d")
4421" call Decho("(NetrwBrowseChgDir:go-up) setl noro ma")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004422 setl noro ma
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004423 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004424 endif
4425
4426 if has("amiga")
4427 " amiga
Bram Moolenaarff034192013-04-24 18:51:19 +02004428" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and amiga')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004429 if a:islocal
4430 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
4431 let dirname= substitute(dirname,'/$','','')
4432 else
4433 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
4434 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004435" call Decho("(NetrwBrowseChgDir:go-up) amiga: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004436
4437 else
4438 " unix or cygwin
Bram Moolenaarff034192013-04-24 18:51:19 +02004439" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and unix or cygwin')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004440 if a:islocal
4441 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4442 if dirname == ""
4443 let dirname= '/'
4444 endif
4445 else
4446 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
4447 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004448" call Decho("(NetrwBrowseChgDir:go-up) unix: dirname<".dirname."> (go up one dir)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004449 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004450 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004451
4452 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004453 " --------------------------------------
4454 " NetrwBrowseChgDir: Handle Tree Listing {{{3
4455 " --------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02004456" call Decho('(NetrwBrowseChgDir:tree-list) case liststyle is TREELIST and w:netrw_treedict exists')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004457 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
Bram Moolenaarff034192013-04-24 18:51:19 +02004458" call Decho("(NetrwBrowseChgDir) (treelist) setl noro ma")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004459 setl noro ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00004460 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004461" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004462 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00004463 endif
4464 let treedir = s:NetrwTreeDir()
4465 let s:treecurpos = nbcd_curpos
4466 let haskey= 0
Bram Moolenaarff034192013-04-24 18:51:19 +02004467" call Decho("(NetrwBrowseChgDir:tree-list) w:netrw_treedict<".string(w:netrw_treedict).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004468
4469 " search treedict for tree dir as-is
4470 if has_key(w:netrw_treedict,treedir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004471" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004472 let haskey= 1
4473 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004474" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004475 endif
4476
4477 " search treedict for treedir with a / appended
4478 if !haskey && treedir !~ '/$'
4479 if has_key(w:netrw_treedict,treedir."/")
4480 let treedir= treedir."/"
Bram Moolenaarff034192013-04-24 18:51:19 +02004481" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004482 let haskey = 1
4483 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004484" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'/> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004485 endif
4486 endif
4487
4488 " search treedict for treedir with any trailing / elided
4489 if !haskey && treedir =~ '/$'
4490 let treedir= substitute(treedir,'/$','','')
4491 if has_key(w:netrw_treedict,treedir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004492" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004493 let haskey = 1
4494 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004495" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004496 endif
4497 endif
4498
4499 if haskey
4500 " close tree listing for selected subdirectory
Bram Moolenaarff034192013-04-24 18:51:19 +02004501" call Decho("(NetrwBrowseChgDir:tree-list) closing selected subdirectory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004502 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004503" call Decho("(NetrwBrowseChgDir) removed entry<".treedir."> from treedict")
4504" call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004505 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00004506 else
4507 " go down one directory
4508 let dirname= substitute(treedir,'/*$','/','')
Bram Moolenaarff034192013-04-24 18:51:19 +02004509" call Decho("(NetrwBrowseChgDir:tree-list) go down one dir: treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004510 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004511 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004512 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004513
4514 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004515 " ----------------------------------------
4516 " NetrwBrowseChgDir: Go down one directory {{{3
4517 " ----------------------------------------
4518 let dirname = s:ComposePath(dirname,newdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02004519" call Decho("(NetrwBrowseChgDir:go-down) go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004520 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004521 endif
4522
Bram Moolenaar97d62492012-11-15 21:28:22 +01004523 " --------------------------------------
4524 " NetrwBrowseChgDir: Restore and Cleanup {{{3
4525 " --------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004526 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004527 if dolockout
Bram Moolenaarff034192013-04-24 18:51:19 +02004528" call Decho("(NetrwBrowseChgDir:restore) filewritable(dirname<".dirname.">)=".filewritable(dirname))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004529 if filewritable(dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004530" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod noro")
4531" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004532 setl ma nomod noro
Bram Moolenaarff034192013-04-24 18:51:19 +02004533" 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 +02004534 else
Bram Moolenaarff034192013-04-24 18:51:19 +02004535" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod ro")
4536" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02004537 setl ma nomod ro
Bram Moolenaarff034192013-04-24 18:51:19 +02004538" 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 +02004539 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004540 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004541 let @@= ykeep
Bram Moolenaar9964e462007-05-05 17:54:07 +00004542
Bram Moolenaar446cb832008-06-24 21:56:24 +00004543" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
4544 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00004545endfun
4546
4547" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004548" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
4549" given filename; typically this means given their extension.
4550" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00004551fun! netrw#NetrwBrowseX(fname,remote)
4552" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
4553
Bram Moolenaar97d62492012-11-15 21:28:22 +01004554 let ykeep = @@
4555 let screenposn = netrw#NetrwSavePosn()
4556
Bram Moolenaar5c736222010-01-06 20:54:52 +01004557 " special core dump handler
4558 if a:fname =~ '/core\(\.\d\+\)\=$'
4559 if exists("g:Netrw_corehandler")
4560 if type(g:Netrw_corehandler) == 2
4561 " g:Netrw_corehandler is a function reference (see :help Funcref)
4562" call Decho("g:Netrw_corehandler is a funcref")
4563 call g:Netrw_corehandler(a:fname)
Bram Moolenaarff034192013-04-24 18:51:19 +02004564 elseif type(g:Netrw_corehandler) == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01004565 " g:Netrw_corehandler is a List of function references (see :help Funcref)
4566" call Decho("g:Netrw_corehandler is a List")
4567 for Fncref in g:Netrw_corehandler
4568 if type(FncRef) == 2
4569 call FncRef(a:fname)
4570 endif
4571 endfor
4572 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004573 call netrw#NetrwRestorePosn(screenposn)
4574 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004575" call Dret("NetrwBrowseX : coredump handler invoked")
4576 return
4577 endif
4578 endif
4579
Bram Moolenaar446cb832008-06-24 21:56:24 +00004580 " set up the filename
4581 " (lower case the extension, make a local copy of a remote file)
4582 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
4583 if has("win32") || has("win95") || has("win64") || has("win16")
4584 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00004585 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004586" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004587
4588 " seems kde systems often have gnome-open due to dependencies, even though
4589 " gnome-open's subsidiary display tools are largely absent. Kde systems
4590 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
4591 if !exists("s:haskdeinit")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004592 if has("unix") && executable("ps") && !has("win32unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004593 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004594 if v:shell_error
4595 let s:haskdeinit = 0
4596 endif
4597 else
4598 let s:haskdeinit= 0
4599 endif
4600" call Decho("setting s:haskdeinit=".s:haskdeinit)
4601 endif
4602
4603 if a:remote == 1
4604 " create a local copy
Bram Moolenaar97d62492012-11-15 21:28:22 +01004605" call Decho("(remote) a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaarff034192013-04-24 18:51:19 +02004606 setl bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01004607 call netrw#NetRead(3,a:fname)
4608 " attempt to rename tempfile
4609 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
Bram Moolenaar97d62492012-11-15 21:28:22 +01004610 let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004611" call Decho("basename<".basename.">")
4612" call Decho("newname <".newname.">")
4613 if rename(s:netrw_tmpfile,newname) == 0
4614 " renaming succeeded
4615 let fname= newname
4616 else
4617 " renaming failed
4618 let fname= s:netrw_tmpfile
4619 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00004620 else
Bram Moolenaar97d62492012-11-15 21:28:22 +01004621" call Decho("(local) a:remote=".a:remote.": handling local copy of <".a:fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004622 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004623 " special ~ handler for local
4624 if fname =~ '^\~' && expand("$HOME") != ""
4625" call Decho('invoking special ~ handler')
4626 let fname= substitute(fname,'^\~',expand("$HOME"),'')
4627 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004628 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004629" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004630" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
4631
4632 " set up redirection
4633 if &srr =~ "%s"
4634 if (has("win32") || has("win95") || has("win64") || has("win16"))
4635 let redir= substitute(&srr,"%s","nul","")
4636 else
4637 let redir= substitute(&srr,"%s","/dev/null","")
4638 endif
4639 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
4640 let redir= &srr . "nul"
4641 else
4642 let redir= &srr . "/dev/null"
4643 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004644" call Decho("set up redirection: redir{".redir."} srr{".&srr."}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004645
4646 " extract any viewing options. Assumes that they're set apart by quotes.
Bram Moolenaar97d62492012-11-15 21:28:22 +01004647" call Decho("extract any viewing options")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004648 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004649" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004650 if g:netrw_browsex_viewer =~ '\s'
4651 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
4652 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
4653 let oviewer = ''
4654 let cnt = 1
4655 while !executable(viewer) && viewer != oviewer
4656 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
4657 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
4658 let cnt = cnt + 1
4659 let oviewer = viewer
4660" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
4661 endwhile
4662 else
4663 let viewer = g:netrw_browsex_viewer
4664 let viewopt = ""
4665 endif
4666" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
4667 endif
4668
4669 " execute the file handler
Bram Moolenaar97d62492012-11-15 21:28:22 +01004670" call Decho("execute the file handler (if any)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004671 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
4672" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
4673 let ret= netrwFileHandlers#Invoke(exten,fname)
4674
4675 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
4676" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004677" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
4678 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004679 let ret= v:shell_error
4680
4681 elseif has("win32") || has("win64")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004682" call Decho("windows")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004683 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004684" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4685 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004686 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004687" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4688 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004689 else
4690 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4691 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004692 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4693 let ret= v:shell_error
4694
Bram Moolenaar97d62492012-11-15 21:28:22 +01004695 elseif has("win32unix")
4696 let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
4697" call Decho("cygwin: winfname<".shellescape(winfname,1).">")
4698 if executable("start")
4699" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4700 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4701 elseif executable("rundll32")
4702" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4703 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4704 else
4705 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4706 endif
4707 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4708 let ret= v:shell_error
4709
4710 elseif has("unix") && executable("xdg-open") && !s:haskdeinit
4711" call Decho("unix and xdg-open")
4712" call Decho("exe sil !xdg-open ".shellescape(fname,1)." ".redir)
4713 exe "sil !xdg-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004714 let ret= v:shell_error
4715
4716 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaar97d62492012-11-15 21:28:22 +01004717" call Decho("unix and kfmclient")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004718" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004719 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004720 let ret= v:shell_error
4721
4722 elseif has("macunix") && executable("open")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004723" call Decho("macunix and open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004724" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004725 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00004726 let ret= v:shell_error
4727
4728 else
4729 " netrwFileHandlers#Invoke() always returns 0
4730 let ret= netrwFileHandlers#Invoke(exten,fname)
4731 endif
4732
4733 " if unsuccessful, attempt netrwFileHandlers#Invoke()
4734 if ret
4735 let ret= netrwFileHandlers#Invoke(exten,fname)
4736 endif
4737
Bram Moolenaarc236c162008-07-13 17:41:49 +00004738 " restoring redraw! after external file handlers
4739 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00004740
4741 " cleanup: remove temporary file,
4742 " delete current buffer if success with handler,
4743 " return to prior buffer (directory listing)
4744 " Feb 12, 2008: had to de-activiate removal of
4745 " temporary file because it wasn't getting seen.
4746" if a:remote == 1 && fname != a:fname
Bram Moolenaar97d62492012-11-15 21:28:22 +01004747"" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004748" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004749" endif
4750
4751 if a:remote == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02004752 setl bh=delete bt=nofile
Bram Moolenaar446cb832008-06-24 21:56:24 +00004753 if g:netrw_use_noswf
Bram Moolenaarff034192013-04-24 18:51:19 +02004754 setl noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00004755 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004756 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004757" redraw!
4758 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004759 call netrw#NetrwRestorePosn(screenposn)
4760 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004761
4762" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004763endfun
4764
4765" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004766" s:NetrwChgPerm: (implements "gp") change file permission {{{2
4767fun! s:NetrwChgPerm(islocal,curdir)
4768" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004769 let ykeep = @@
Bram Moolenaar5c736222010-01-06 20:54:52 +01004770 call inputsave()
4771 let newperm= input("Enter new permission: ")
4772 call inputrestore()
4773 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
4774 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
4775" call Decho("chgperm<".chgperm.">")
4776 call system(chgperm)
4777 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004778 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004779 endif
4780 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02004781 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01004782 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004783 let @@= ykeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01004784" call Dret("s:NetrwChgPerm")
4785endfun
4786
4787" ---------------------------------------------------------------------
4788" s:NetrwClearExplore: clear explore variables (if any) {{{2
4789fun! s:NetrwClearExplore()
4790" call Dfunc("s:NetrwClearExplore()")
4791 2match none
4792 if exists("s:explore_match") |unlet s:explore_match |endif
4793 if exists("s:explore_indx") |unlet s:explore_indx |endif
4794 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
4795 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
4796 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
4797 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
4798 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
4799 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
4800 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
4801" redraw!
4802 echo " "
4803 echo " "
4804" call Dret("s:NetrwClearExplore")
4805endfun
4806
4807" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004808" s:NetrwExploreListUniq: {{{2
4809fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02004810" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004811
4812 " this assumes that the list is already sorted
4813 let newexplist= []
4814 for member in a:explist
4815 if !exists("uniqmember") || member != uniqmember
4816 let uniqmember = member
4817 let newexplist = newexplist + [ member ]
4818 endif
4819 endfor
4820
Bram Moolenaar15146672011-10-20 22:22:38 +02004821" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004822 return newexplist
4823endfun
4824
4825" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004826" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4827fun! s:NetrwForceChgDir(islocal,newdir)
4828" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004829 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02004830 if a:newdir !~ '/$'
4831 " ok, looks like force is needed to get directory-style treatment
4832 if a:newdir =~ '@$'
4833 let newdir= substitute(a:newdir,'@$','/','')
4834 elseif a:newdir =~ '[*=|\\]$'
4835 let newdir= substitute(a:newdir,'.$','/','')
4836 else
4837 let newdir= a:newdir.'/'
4838 endif
4839" call Decho("adjusting newdir<".newdir."> due to gd")
4840 else
4841 " should already be getting treatment as a directory
4842 let newdir= a:newdir
4843 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01004844 let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004845 call s:NetrwBrowse(a:islocal,newdir)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004846 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02004847" call Dret("s:NetrwForceChgDir")
4848endfun
4849
4850" ---------------------------------------------------------------------
4851" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4852fun! s:NetrwForceFile(islocal,newfile)
Bram Moolenaarff034192013-04-24 18:51:19 +02004853" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004854 if a:newfile =~ '[/@*=|\\]$'
4855 let newfile= substitute(a:newfile,'.$','','')
4856 else
4857 let newfile= a:newfile
4858 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02004859 if a:islocal
4860 call s:NetrwBrowseChgDir(a:islocal,newfile)
4861 else
4862 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
4863 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004864" call Dret("s:NetrwForceFile")
4865endfun
4866
4867" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004868" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4869" and switches the hiding mode. The actual hiding is done by
4870" s:NetrwListHide().
4871" g:netrw_hide= 0: show all
4872" 1: show not-hidden files
4873" 2: show hidden files only
4874fun! s:NetrwHide(islocal)
4875" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004876 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004877 let svpos= netrw#NetrwSavePosn()
4878
4879 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4880" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4881" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4882
4883 " hide the files in the markfile list
4884 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02004885" 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 +00004886 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4887 " remove fname from hiding list
4888 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4889 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4890 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4891" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4892 else
4893 " append fname to hiding list
4894 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4895 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4896 else
4897 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4898 endif
4899" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4900 endif
4901 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004902 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004903 let g:netrw_hide= 1
4904
4905 else
4906
4907 " switch between show-all/show-not-hidden/show-hidden
4908 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004909 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004910 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004911 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004912 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004913" call Dret("NetrwHide")
4914 return
4915 endif
4916 endif
4917
Bram Moolenaaradc21822011-04-01 18:03:16 +02004918 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4919 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004920 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004921" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004922endfun
4923
4924" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004925" s:NetrwHidden: invoked by "gh" {{{2
4926fun! s:NetrwHidden(islocal)
4927" call Dfunc("s:NetrwHidden()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01004928 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00004929 " save current position
4930 let svpos= netrw#NetrwSavePosn()
4931
4932 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4933 " remove pattern from hiding list
4934 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004935 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004936 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4937 else
4938 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4939 endif
4940
4941 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004942 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4943 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01004944 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00004945" call Dret("s:NetrwHidden")
4946endfun
4947
4948" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004949" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4950fun! s:NetrwHome()
4951 if exists("g:netrw_home")
4952 let home= g:netrw_home
4953 else
4954 " go to vim plugin home
4955 for home in split(&rtp,',') + ['']
4956 if isdirectory(home) && filewritable(home) | break | endif
4957 let basehome= substitute(home,'[/\\]\.vim$','','')
4958 if isdirectory(basehome) && filewritable(basehome)
4959 let home= basehome."/.vim"
4960 break
4961 endif
4962 endfor
4963 if home == ""
4964 " just pick the first directory
4965 let home= substitute(&rtp,',.*$','','')
4966 endif
4967 if (has("win32") || has("win95") || has("win64") || has("win16"))
4968 let home= substitute(home,'/','\\','g')
4969 endif
4970 endif
4971 " insure that the home directory exists
Bram Moolenaarff034192013-04-24 18:51:19 +02004972 if g:netrw_dirhistmax > 0 && !isdirectory(home)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004973 if exists("g:netrw_mkdir")
4974 call system(g:netrw_mkdir." ".shellescape(home))
4975 else
4976 call mkdir(home)
4977 endif
4978 endif
4979 let g:netrw_home= home
4980 return home
4981endfun
4982
4983" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004984" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4985fun! s:NetrwLeftmouse(islocal)
Bram Moolenaarff034192013-04-24 18:51:19 +02004986 if exists("s:netrwdrag")
4987 return
4988 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004989" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004990
Bram Moolenaar97d62492012-11-15 21:28:22 +01004991 let ykeep= @@
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004992 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02004993 while getchar(0) != 0
4994 "clear the input stream
4995 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004996 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004997 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004998 let mouse_lnum = v:mouse_lnum
4999 let wlastline = line('w$')
5000 let lastline = line('$')
5001" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
5002" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
5003 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
5004 " appears to be a status bar leftmouse click
Bram Moolenaar97d62492012-11-15 21:28:22 +01005005 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005006" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
5007 return
5008 endif
5009 if v:mouse_col != col('.')
Bram Moolenaar97d62492012-11-15 21:28:22 +01005010 let @@= ykeep
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005011" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
5012 return
5013 endif
5014
Bram Moolenaar446cb832008-06-24 21:56:24 +00005015 if a:islocal
5016 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005017 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005018 endif
5019 else
5020 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005021 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005022 endif
5023 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005024 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005025" call Dret("s:NetrwLeftmouse")
5026endfun
5027
5028" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02005029" s:NetrwRightdrag: {{{2
5030"DechoTabOn
5031fun! s:NetrwRightdrag(islocal)
5032" call Dfunc("s:NetrwRightdrag(islocal=".a:islocal.")")
5033 if !exists("s:netrwdrag")
5034 let s:netrwdrag = winnr()
5035 call s:NetrwMarkFile(a:islocal,s:NetrwGetWord())
5036 if a:islocal
5037 nno <silent> <s-rightrelease> <leftmouse>:<c-u>call <SID>NetrwRightrelease(1)<cr>
5038 else
5039 nno <silent> <s-rightrelease> <leftmouse>:<c-u>call <SID>NetrwRightrelease(0)<cr>
5040 endif
5041 endif
5042" call Dret("s:NetrwRightdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5043endfun
5044
5045" ---------------------------------------------------------------------
5046" s:NetrwRightrelease: {{{2
5047fun! s:NetrwRightrelease(islocal)
5048" call Dfunc("s:NetrwRightrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5049 if exists("s:netrwdrag")
5050 nunmap <s-rightrelease>
5051 let tgt = s:NetrwGetWord()
5052" call Decho("target#1: ".tgt)
5053 if tgt =~ '/$' && tgt !~ '^\./$'
5054 let tgt = b:netrw_curdir."/".tgt
5055 else
5056 let tgt= b:netrw_curdir
5057 endif
5058" call Decho("target#2: ".tgt)
5059 call netrw#NetrwMakeTgt(tgt)
5060 let curwin= winnr()
5061 exe s:netrwdrag."wincmd w"
5062 call s:NetrwMarkFileMove(a:islocal)
5063 exe curwin."wincmd w"
5064 unlet s:netrwdrag
5065 endif
5066" call Dret("s:NetrwRightrelease")
5067endfun
5068
5069" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005070" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
5071" separated patterns given in g:netrw_list_hide
5072fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005073" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005074 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005075
5076 " find a character not in the "hide" string to use as a separator for :g and :v commands
5077 " How-it-works: take the hiding command, convert it into a range. Duplicate
5078 " characters don't matter. Remove all such characters from the '/~...90'
5079 " string. Use the first character left as a separator character.
5080 let listhide= g:netrw_list_hide
5081 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
5082" call Decho("sep=".sep)
5083
5084 while listhide != ""
5085 if listhide =~ ','
5086 let hide = substitute(listhide,',.*$','','e')
5087 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
5088 else
5089 let hide = listhide
5090 let listhide = ""
5091 endif
5092
5093 " Prune the list by hiding any files which match
5094 if g:netrw_hide == 1
5095" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005096 exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005097 elseif g:netrw_hide == 2
5098" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar97d62492012-11-15 21:28:22 +01005099 exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005100 endif
5101 endwhile
5102 if g:netrw_hide == 2
Bram Moolenaar97d62492012-11-15 21:28:22 +01005103 exe 'sil! keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
5104 exe 'sil! keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005105 endif
5106
Bram Moolenaaradc21822011-04-01 18:03:16 +02005107 " remove any blank lines that have somehow remained.
5108 " This seems to happen under Windows.
5109 exe 'sil! keepj 1,$g@^\s*$@d'
5110
Bram Moolenaar97d62492012-11-15 21:28:22 +01005111 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005112" call Dret("NetrwListHide")
5113endfun
5114
5115" ---------------------------------------------------------------------
5116" NetrwHideEdit: allows user to edit the file/directory hiding list
5117fun! s:NetrwHideEdit(islocal)
5118" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
5119
Bram Moolenaar97d62492012-11-15 21:28:22 +01005120 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005121 " save current cursor position
5122 let svpos= netrw#NetrwSavePosn()
5123
5124 " get new hiding list from user
5125 call inputsave()
5126 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
5127 call inputrestore()
5128 let g:netrw_list_hide= newhide
5129" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
5130
5131 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005132 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005133
5134 " restore cursor position
5135 call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005136 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005137
5138" call Dret("NetrwHideEdit")
5139endfun
5140
5141" ---------------------------------------------------------------------
5142" NetSortSequence: allows user to edit the sorting sequence
5143fun! s:NetSortSequence(islocal)
5144" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
5145
Bram Moolenaar97d62492012-11-15 21:28:22 +01005146 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005147 let svpos= netrw#NetrwSavePosn()
5148 call inputsave()
5149 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
5150 call inputrestore()
5151
5152 " refresh the listing
5153 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02005154 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5155 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005156 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005157
5158" call Dret("NetSortSequence")
5159endfun
5160
5161" ---------------------------------------------------------------------
5162" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
5163fun! s:NetrwMakeDir(usrhost)
5164" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
5165
Bram Moolenaar97d62492012-11-15 21:28:22 +01005166 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005167 " get name of new directory from user. A bare <CR> will skip.
5168 " if its currently a directory, also request will be skipped, but with
5169 " a message.
5170 call inputsave()
5171 let newdirname= input("Please give directory name: ")
5172 call inputrestore()
5173" call Decho("newdirname<".newdirname.">")
5174
5175 if newdirname == ""
Bram Moolenaar97d62492012-11-15 21:28:22 +01005176 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005177" call Dret("NetrwMakeDir : user aborted with bare <cr>")
5178 return
5179 endif
5180
5181 if a:usrhost == ""
5182" call Decho("local mkdir")
5183
5184 " Local mkdir:
5185 " sanity checks
5186 let fullnewdir= b:netrw_curdir.'/'.newdirname
5187" call Decho("fullnewdir<".fullnewdir.">")
5188 if isdirectory(fullnewdir)
5189 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005190 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005191 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005192 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005193" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
5194 return
5195 endif
5196 if s:FileReadable(fullnewdir)
5197 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005198 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005199 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005200 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005201" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
5202 return
5203 endif
5204
5205 " requested new local directory is neither a pre-existing file or
5206 " directory, so make it!
5207 if exists("*mkdir")
5208 call mkdir(fullnewdir,"p")
5209 else
5210 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005211 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005212" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005213" call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5214 exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005215 if v:shell_error != 0
5216 let @@= ykeep
5217 call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5218" call Dret("NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5219 return
5220 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005221 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005222 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005223" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
5224 endif
5225 endif
5226
5227 if v:shell_error == 0
5228 " refresh listing
5229" call Decho("refresh listing")
5230 let svpos= netrw#NetrwSavePosn()
5231 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
5232 call netrw#NetrwRestorePosn(svpos)
5233 elseif !exists("g:netrw_quiet")
5234 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
5235 endif
5236" redraw!
5237
5238 elseif !exists("b:netrw_method") || b:netrw_method == 4
5239 " Remote mkdir:
5240" call Decho("remote mkdir")
5241 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
5242 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02005243" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005244 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005245 if v:shell_error == 0
5246 " refresh listing
5247 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005248 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5249 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005250 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005251 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005252 endif
5253" redraw!
5254
5255 elseif b:netrw_method == 2
Bram Moolenaar15146672011-10-20 22:22:38 +02005256 let svpos= netrw#NetrwSavePosn()
5257 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5258 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5259 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005260 elseif b:netrw_method == 3
Bram Moolenaar15146672011-10-20 22:22:38 +02005261 let svpos= netrw#NetrwSavePosn()
5262 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5263 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5264 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005265 endif
5266
Bram Moolenaar97d62492012-11-15 21:28:22 +01005267 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00005268" call Dret("NetrwMakeDir")
5269endfun
5270
5271" ---------------------------------------------------------------------
5272" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
5273" mark and unmark files. If a markfile list exists,
5274" then the rename and delete functions will use it instead
5275" of whatever may happen to be under the cursor at that
5276" moment. When the mouse and gui are available,
5277" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005278"
5279" Creates two lists
5280" s:netrwmarkfilelist -- holds complete paths to all marked files
5281" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
5282"
5283" Creates a marked file match string
5284" s:netrwmarfilemtch_# -- used with 2match to display marked files
5285"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005286" Creates a buffer version of islocal
5287" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00005288fun! s:NetrwMarkFile(islocal,fname)
5289" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
Bram Moolenaarff034192013-04-24 18:51:19 +02005290
5291 " sanity check
5292 if empty(a:fname)
5293" call Dret("s:NetrwMarkFile : emtpy fname")
5294 return
5295 endif
5296
Bram Moolenaar97d62492012-11-15 21:28:22 +01005297 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00005298 let curbufnr= bufnr("%")
5299 let curdir = b:netrw_curdir
Bram Moolenaar97d62492012-11-15 21:28:22 +01005300 let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)'
Bram Moolenaaradc21822011-04-01 18:03:16 +02005301
Bram Moolenaar446cb832008-06-24 21:56:24 +00005302 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005303 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00005304" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5305" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005306 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00005307
5308 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005309 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005310" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5311 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005312 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005313
5314 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005315 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005316" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5317 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
5318 if s:netrwmarkfilelist_{curbufnr} == []
5319 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01005320" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005321 call s:NetrwUnmarkList(curbufnr,curdir)
5322 else
5323 " rebuild match list to display markings correctly
5324" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
5325 let s:netrwmarkfilemtch_{curbufnr}= ""
5326 let first = 1
5327 for fname in s:netrwmarkfilelist_{curbufnr}
5328 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01005329 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005330 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005331 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005332 endif
5333 let first= 0
5334 endfor
Bram Moolenaar15146672011-10-20 22:22:38 +02005335" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005336 endif
5337 endif
5338
5339 else
5340 " initialize new markfilelist
5341
5342" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
5343 let s:netrwmarkfilelist_{curbufnr}= []
5344 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
5345" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5346
5347 " build initial markfile matching pattern
5348 if a:fname =~ '/$'
5349 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
5350 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005351 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00005352 endif
5353" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
5354 endif
5355
5356 " handle global markfilelist
5357 if exists("s:netrwmarkfilelist")
5358 let dname= s:ComposePath(b:netrw_curdir,a:fname)
5359 if index(s:netrwmarkfilelist,dname) == -1
5360 " append new filename to global markfilelist
5361 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5362" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
5363 else
5364 " remove new filename from global markfilelist
5365" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
5366 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
5367" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
5368 if s:netrwmarkfilelist == []
5369 unlet s:netrwmarkfilelist
5370 endif
5371 endif
5372 else
5373 " initialize new global-directory markfilelist
5374 let s:netrwmarkfilelist= []
5375 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5376" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
5377 endif
5378
5379 " set up 2match'ing to netrwmarkfilemtch list
5380 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
5381" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005382 if exists("g:did_drchip_netrwlist_syntax")
5383 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
5384 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005385 else
5386" call Decho("2match none")
5387 2match none
5388 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01005389 let @@= ykeep
Bram Moolenaaradc21822011-04-01 18:03:16 +02005390" 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 +00005391endfun
5392
5393" ---------------------------------------------------------------------
5394" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
5395" compress/decompress files using the programs
5396" in g:netrw_compress and g:netrw_uncompress,
5397" using g:netrw_compress_suffix to know which to
5398" do. By default:
5399" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005400" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00005401fun! s:NetrwMarkFileCompress(islocal)
5402" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
5403 let svpos = netrw#NetrwSavePosn()
5404 let curdir = b:netrw_curdir
5405 let curbufnr = bufnr("%")
5406
Bram Moolenaarff034192013-04-24 18:51:19 +02005407 " sanity check
5408 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5409 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5410" call Dret("s:NetrwMarkFileCompress")
5411 return
5412 endif
5413" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5414
Bram Moolenaar446cb832008-06-24 21:56:24 +00005415 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
Bram Moolenaarff034192013-04-24 18:51:19 +02005416
5417 " for every filename in the marked list
Bram Moolenaar446cb832008-06-24 21:56:24 +00005418 for fname in s:netrwmarkfilelist_{curbufnr}
Bram Moolenaarff034192013-04-24 18:51:19 +02005419 let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
5420" call Decho("extracted sfx<".sfx.">")
5421 if exists("g:netrw_decompress['".sfx."']")
5422 " fname has a suffix indicating that its compressed; apply associated decompression routine
5423 let exe= g:netrw_decompress[sfx]
5424" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
5425 let exe= netrw#WinPath(exe)
5426 if a:islocal
5427 if g:netrw_keepdir
5428 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005429 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005430 else
5431 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005432 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005433 if executable(exe)
5434 if a:islocal
5435 call system(exe." ".fname)
5436 else
5437 keepj call s:RemoteSystem(exe." ".fname)
5438 endif
5439 else
5440 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
5441 endif
5442 endif
5443 unlet sfx
5444
Bram Moolenaar446cb832008-06-24 21:56:24 +00005445 if exists("exe")
5446 unlet exe
5447 elseif a:islocal
5448 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01005449 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005450 else
5451 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02005452 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005453 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005454 endfor " for every file in the marked list
5455
Bram Moolenaar446cb832008-06-24 21:56:24 +00005456 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005457 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5458 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005459 endif
5460" call Dret("s:NetrwMarkFileCompress")
5461endfun
5462
5463" ---------------------------------------------------------------------
5464" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
5465" If no marked files, then set up directory as the
5466" target. Currently does not support copying entire
5467" directories. Uses the local-buffer marked file list.
5468" Returns 1=success (used by NetrwMarkFileMove())
5469" 0=failure
5470fun! s:NetrwMarkFileCopy(islocal)
5471" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
Bram Moolenaarff034192013-04-24 18:51:19 +02005472 let curdir = b:netrw_curdir
5473 let curbufnr = bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005474
Bram Moolenaarff034192013-04-24 18:51:19 +02005475 " sanity check
5476 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5477 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5478" call Dret("s:NetrwMarkFileCopy")
5479 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005480 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005481" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5482
Bram Moolenaar446cb832008-06-24 21:56:24 +00005483 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02005484 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005485" call Dret("s:NetrwMarkFileCopy 0")
5486 return 0
5487 endif
5488" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005489
5490 if a:islocal && s:netrwmftgt_islocal
5491 " Copy marked files, local directory to local directory
5492" call Decho("copy from local to local")
Bram Moolenaarff034192013-04-24 18:51:19 +02005493 if !executable(g:netrw_localcopycmd) && g:netrw_localcopycmd !~ '\<cmd\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01005494 call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
5495" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
5496 return
5497 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005498 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaarff034192013-04-24 18:51:19 +02005499 let tgt = shellescape(s:netrwmftgt)
5500 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
5501 let args= substitute(args,'/','\\','g')
5502 let tgt = substitute(tgt, '/','\\','g')
5503 endif
5504 if g:netrw_localcopycmd =~ '\s'
5505 let copycmd = substitute(g:netrw_localcopycmd,'\s.*$','','')
5506 let copycmdargs = substitute(g:netrw_localcopycmd,'^.\{-}\(\s.*\)$','\1','')
5507 let copycmd = netrw#WinPath(copycmd).copycmdargs
5508 else
5509 let copycmd = netrw#WinPath(g:netrw_localcopycmd)
5510 endif
5511" call Decho("args <".args.">")
5512" call Decho("tgt <".tgt.">")
5513" call Decho("copycmd<".copycmd.">")
5514" call Decho("system(".copycmd." ".args." ".tgt.")")
5515 call system(copycmd." ".args." ".tgt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005516 if v:shell_error != 0
Bram Moolenaarff034192013-04-24 18:51:19 +02005517 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 +01005518" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt))
5519 return 0
5520 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005521
5522 elseif a:islocal && !s:netrwmftgt_islocal
5523 " Copy marked files, local directory to remote directory
5524" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005525 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005526
5527 elseif !a:islocal && s:netrwmftgt_islocal
5528" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005529 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005530
5531 elseif !a:islocal && !s:netrwmftgt_islocal
5532" call Decho("copy from remote to remote")
5533 let curdir = getcwd()
5534 let tmpdir = s:GetTempfile("")
5535 if tmpdir !~ '/'
5536 let tmpdir= curdir."/".tmpdir
5537 endif
5538 if exists("*mkdir")
5539 call mkdir(tmpdir)
5540 else
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005541 exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005542 if v:shell_error != 0
5543 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5544" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1) )
5545 return
5546 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005547 endif
5548 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005549 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005550 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005551 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02005552 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005553 if getcwd() == tmpdir
5554 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005555 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005556 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005557 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02005558 exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01005559 if v:shell_error != 0
5560 call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",80)
5561" call Dret("s:NetrwMarkFileCopy : failed: sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1) )
5562 return
5563 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005564 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005565 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005566 endif
5567 endif
5568 endif
5569
5570 " -------
5571 " cleanup
5572 " -------
5573" call Decho("cleanup")
5574
5575 " remove markings from local buffer
5576 call s:NetrwUnmarkList(curbufnr,curdir)
5577
5578 " refresh buffers
5579 if !s:netrwmftgt_islocal
5580 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
5581 endif
5582 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005583 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005584 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005585 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005586 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005587 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005588
5589" call Dret("s:NetrwMarkFileCopy 1")
5590 return 1
5591endfun
5592
5593" ---------------------------------------------------------------------
5594" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
5595" invoke vim's diff mode on the marked files.
5596" Either two or three files can be so handled.
5597" Uses the global marked file list.
5598fun! s:NetrwMarkFileDiff(islocal)
5599" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
5600 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005601
Bram Moolenaarff034192013-04-24 18:51:19 +02005602 " sanity check
5603 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5604 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5605" call Dret("s:NetrwMarkFileDiff")
5606 return
5607 endif
5608" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5609
5610 if exists("s:netrwmarkfilelist_{."curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005611 let cnt = 0
5612 let curdir = b:netrw_curdir
5613 for fname in s:netrwmarkfilelist
5614 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005615 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005616" call Decho("diffthis: fname<".fname.">")
5617 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005618 diffthis
5619 elseif cnt == 2 || cnt == 3
5620 vsplit
5621 wincmd l
5622" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005623 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005624 diffthis
5625 else
5626 break
5627 endif
5628 endfor
5629 call s:NetrwUnmarkList(curbufnr,curdir)
5630 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005631
Bram Moolenaar446cb832008-06-24 21:56:24 +00005632" call Dret("s:NetrwMarkFileDiff")
5633endfun
5634
5635" ---------------------------------------------------------------------
5636" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
5637" Uses global markfilelist
5638fun! s:NetrwMarkFileEdit(islocal)
5639" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
5640
5641 let curdir = b:netrw_curdir
5642 let curbufnr = bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02005643
5644 " sanity check
5645 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5646 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5647" call Dret("s:NetrwMarkFileEdit")
5648 return
5649 endif
5650" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5651
Bram Moolenaar446cb832008-06-24 21:56:24 +00005652 if exists("s:netrwmarkfilelist_{curbufnr}")
5653 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005654 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005655 " unmark markedfile list
5656" call s:NetrwUnmarkList(curbufnr,curdir)
5657 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02005658" call Decho("exe sil args ".flist)
5659 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00005660 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02005661 echo "(use :bn, :bp to navigate files; :Rex to return)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005662
5663" call Dret("s:NetrwMarkFileEdit")
5664endfun
5665
5666" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02005667" s:NetrwMarkFileQFEL: convert a quickfix-error list into a marked file list {{{2
5668fun! s:NetrwMarkFileQFEL(islocal,qfel)
5669" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
5670 call s:NetrwUnmarkAll()
5671 let curbufnr= bufnr("%")
5672
5673 if !empty(a:qfel)
5674 for entry in a:qfel
5675 let bufnmbr= entry["bufnr"]
5676" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"])
5677 if !exists("s:netrwmarkfilelist_{curbufnr}")
5678" call Decho("case: no marked file list")
5679 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5680 elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
5681 " s:NetrwMarkFile will remove duplicate entries from the marked file list.
5682 " So, this test lets two or more hits on the same pattern to be ignored.
5683" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list")
5684 call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5685 else
5686" call Decho("case: ".bufname(bufnmbr)." already in marked file list")
5687 endif
5688 endfor
5689 echo "(use me to edit marked files)"
5690 else
5691 call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
5692 endif
5693
5694" call Dret("s:NetrwMarkFileQFEL")
5695endfun
5696
5697" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005698" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005699" Uses the local marked-file list.
5700fun! s:NetrwMarkFileExe(islocal)
5701" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
5702 let svpos = netrw#NetrwSavePosn()
5703 let curdir = b:netrw_curdir
5704 let curbufnr = bufnr("%")
5705
Bram Moolenaarff034192013-04-24 18:51:19 +02005706 " sanity check
5707 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5708 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5709" call Dret("s:NetrwMarkFileExe")
5710 return
5711 endif
5712" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5713
Bram Moolenaar446cb832008-06-24 21:56:24 +00005714 if exists("s:netrwmarkfilelist_{curbufnr}")
5715 " get the command
5716 call inputsave()
5717 let cmd= input("Enter command: ","","file")
5718 call inputrestore()
5719" call Decho("cmd<".cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02005720 if cmd == ""
5721" " call Dret("s:NetrwMarkFileExe : early exit, empty command")
5722 return
5723 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005724
5725 " apply command to marked files. Substitute: filename -> %
5726 " If no %, then append a space and the filename to the command
5727 for fname in s:netrwmarkfilelist_{curbufnr}
5728 if a:islocal
5729 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01005730 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005731 endif
5732 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005733 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005734 endif
5735 if cmd =~ '%'
5736 let xcmd= substitute(cmd,'%',fname,'g')
5737 else
5738 let xcmd= cmd.' '.fname
5739 endif
5740 if a:islocal
5741" call Decho("local: xcmd<".xcmd.">")
5742 let ret= system(xcmd)
5743 else
5744" call Decho("remote: xcmd<".xcmd.">")
5745 let ret= s:RemoteSystem(xcmd)
5746 endif
5747 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02005748 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005749 break
5750 else
5751 echo ret
5752 endif
5753 endfor
5754
5755 " unmark marked file list
5756 call s:NetrwUnmarkList(curbufnr,curdir)
5757
5758 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005759 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5760 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005761 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005762 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005763 endif
5764
5765" call Dret("s:NetrwMarkFileExe")
5766endfun
5767
5768" ---------------------------------------------------------------------
5769" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5770" as the marked file(s) (toggles suffix presence)
5771" Uses the local marked file list.
5772fun! s:NetrwMarkHideSfx(islocal)
5773" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5774 let svpos = netrw#NetrwSavePosn()
5775 let curbufnr = bufnr("%")
5776
5777 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5778 if exists("s:netrwmarkfilelist_{curbufnr}")
5779
5780 for fname in s:netrwmarkfilelist_{curbufnr}
5781" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5782 " construct suffix pattern
5783 if fname =~ '\.'
5784 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5785 else
5786 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5787 endif
5788 " determine if its in the hiding list or not
5789 let inhidelist= 0
5790 if g:netrw_list_hide != ""
5791 let itemnum = 0
5792 let hidelist= split(g:netrw_list_hide,',')
5793 for hidepat in hidelist
5794 if sfxpat == hidepat
5795 let inhidelist= 1
5796 break
5797 endif
5798 let itemnum= itemnum + 1
5799 endfor
5800 endif
5801" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5802 if inhidelist
5803 " remove sfxpat from list
5804 call remove(hidelist,itemnum)
5805 let g:netrw_list_hide= join(hidelist,",")
5806 elseif g:netrw_list_hide != ""
5807 " append sfxpat to non-empty list
5808 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5809 else
5810 " set hiding list to sfxpat
5811 let g:netrw_list_hide= sfxpat
5812 endif
5813 endfor
5814
5815 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02005816 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5817 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005818 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005819 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005820 endif
5821
5822" call Dret("s:NetrwMarkHideSfx")
5823endfun
5824
5825" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02005826" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
5827" Uses the local marked-file list.
5828fun! s:NetrwMarkFileVimCmd(islocal)
5829" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
5830 let svpos = netrw#NetrwSavePosn()
5831 let curdir = b:netrw_curdir
5832 let curbufnr = bufnr("%")
5833
Bram Moolenaarff034192013-04-24 18:51:19 +02005834 " sanity check
5835 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5836 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5837" call Dret("s:NetrwMarkFileVimCmd")
5838 return
5839 endif
5840" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5841
Bram Moolenaar15146672011-10-20 22:22:38 +02005842 if exists("s:netrwmarkfilelist_{curbufnr}")
5843 " get the command
5844 call inputsave()
5845 let cmd= input("Enter vim command: ","","file")
5846 call inputrestore()
5847" call Decho("cmd<".cmd.">")
5848 if cmd == ""
5849" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
5850 return
5851 endif
5852
5853 " apply command to marked files. Substitute: filename -> %
5854 " If no %, then append a space and the filename to the command
5855 for fname in s:netrwmarkfilelist_{curbufnr}
5856" call Decho("fname<".fname.">")
5857 if a:islocal
5858 1split
5859 exe "sil! keepalt e ".fnameescape(fname)
5860" call Decho("local<".fname.">: exe ".cmd)
5861 exe cmd
5862 exe "sil! keepalt wq!"
5863 else
5864 " COMBAK -- not supported yet
5865" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
5866 echo "sorry, \"mX\" not supported yet for remote files"
5867 endif
5868 endfor
5869
5870 " unmark marked file list
5871 call s:NetrwUnmarkList(curbufnr,curdir)
5872
5873 " refresh the listing
5874 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5875 keepj call netrw#NetrwRestorePosn(svpos)
5876 else
5877 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5878 endif
5879
5880" call Dret("s:NetrwMarkFileVimCmd")
5881endfun
5882
5883" ---------------------------------------------------------------------
5884" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5885" as the marked file(s) (toggles suffix presence)
5886" Uses the local marked file list.
5887fun! s:NetrwMarkHideSfx(islocal)
5888" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5889 let svpos = netrw#NetrwSavePosn()
5890 let curbufnr = bufnr("%")
5891
5892 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5893 if exists("s:netrwmarkfilelist_{curbufnr}")
5894
5895 for fname in s:netrwmarkfilelist_{curbufnr}
5896" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5897 " construct suffix pattern
5898 if fname =~ '\.'
5899 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5900 else
5901 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5902 endif
5903 " determine if its in the hiding list or not
5904 let inhidelist= 0
5905 if g:netrw_list_hide != ""
5906 let itemnum = 0
5907 let hidelist= split(g:netrw_list_hide,',')
5908 for hidepat in hidelist
5909 if sfxpat == hidepat
5910 let inhidelist= 1
5911 break
5912 endif
5913 let itemnum= itemnum + 1
5914 endfor
5915 endif
5916" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5917 if inhidelist
5918 " remove sfxpat from list
5919 call remove(hidelist,itemnum)
5920 let g:netrw_list_hide= join(hidelist,",")
5921 elseif g:netrw_list_hide != ""
5922 " append sfxpat to non-empty list
5923 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5924 else
5925 " set hiding list to sfxpat
5926 let g:netrw_list_hide= sfxpat
5927 endif
5928 endfor
5929
5930 " refresh the listing
5931 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5932 keepj call netrw#NetrwRestorePosn(svpos)
5933 else
5934 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5935 endif
5936
5937" call Dret("s:NetrwMarkHideSfx")
5938endfun
5939
5940" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005941" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
5942" Uses the global markfilelist
5943fun! s:NetrwMarkFileGrep(islocal)
5944" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
5945 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005946 let curbufnr = bufnr("%")
5947
5948 if exists("s:netrwmarkfilelist")
5949" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005950 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005951 call s:NetrwUnmarkAll()
Bram Moolenaarff034192013-04-24 18:51:19 +02005952 else
5953" call Decho('no marked files, using "*"')
5954 let netrwmarkfilelist= "*"
5955 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005956
Bram Moolenaarff034192013-04-24 18:51:19 +02005957 " ask user for pattern
5958 call inputsave()
5959 let pat= input("Enter pattern: ","")
5960 call inputrestore()
5961 let patbang = ""
5962 if pat =~ '^!'
5963 let patbang = "!"
5964 let pat= strpart(pat,2)
5965 endif
5966 if pat =~ '^\i'
5967 let pat = escape(pat,'/')
5968 let pat = '/'.pat.'/'
5969 else
5970 let nonisi = pat[0]
5971 endif
5972
5973 " use vimgrep for both local and remote
5974" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist)
5975 try
5976 exe "keepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
5977 catch /^Vim\%((\a\+)\)\=:E480/
5978 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
5979" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
5980 return
5981 endtry
5982 echo "(use :cn, :cp to navigate, :Rex to return)"
5983
5984 2match none
5985 keepj call netrw#NetrwRestorePosn(svpos)
5986
5987 if exists("nonisi")
5988 " original, user-supplied pattern did not begin with a character from isident
5989" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg")
5990 if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
5991 call s:NetrwMarkFileQFEL(a:islocal,getqflist())
Bram Moolenaar446cb832008-06-24 21:56:24 +00005992 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005993 endif
5994
5995" call Dret("s:NetrwMarkFileGrep")
5996endfun
5997
5998" ---------------------------------------------------------------------
5999" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
6000" uses the global marked file list
6001" s:netrwmfloc= 0: target directory is remote
6002" = 1: target directory is local
6003fun! s:NetrwMarkFileMove(islocal)
6004" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
6005 let curdir = b:netrw_curdir
6006 let curbufnr = bufnr("%")
6007
6008 " sanity check
Bram Moolenaarff034192013-04-24 18:51:19 +02006009 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
Bram Moolenaaradc21822011-04-01 18:03:16 +02006010 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006011" call Dret("s:NetrwMarkFileMove")
6012 return
6013 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006014" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6015
Bram Moolenaar446cb832008-06-24 21:56:24 +00006016 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006017 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006018" call Dret("s:NetrwMarkFileCopy 0")
6019 return 0
6020 endif
6021" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
6022
6023 if a:islocal && s:netrwmftgt_islocal
6024 " move: local -> local
6025" call Decho("move from local to local")
6026" call Decho("(s:NetrwMarkFileMove) local to local move")
Bram Moolenaarff034192013-04-24 18:51:19 +02006027 if !executable(g:netrw_localmovecmd) && g:netrw_localmovecmd !~ '\<cmd\s'
Bram Moolenaar97d62492012-11-15 21:28:22 +01006028 call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
6029" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
6030 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006031 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006032 let tgt = shellescape(s:netrwmftgt)
6033" call Decho("tgt<".tgt.">")
6034 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6035 let tgt = substitute(tgt, '/','\\','g')
6036" call Decho("windows exception: tgt<".tgt.">")
6037 if g:netrw_localmovecmd =~ '\s'
6038 let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','')
6039 let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
6040 let movecmd = netrw#WinPath(movecmd).movecmdargs
6041" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)")
6042 else
6043 let movecmd = netrw#WinPath(movecmd)
6044" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)")
6045 endif
6046 else
6047 let movecmd = netrw#WinPath(g:netrw_localmovecmd)
6048" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)")
6049 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006050 for fname in s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaarff034192013-04-24 18:51:19 +02006051" call Decho("system(".movecmd." ".shellescape(fname)." ".tgt.")")
6052 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6053 let fname= substitute(fname,'/','\\','g')
6054 endif
6055 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".tgt)
6056 if v:shell_error != 0
6057 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 +01006058 break
6059 endif
6060 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00006061
6062 elseif a:islocal && !s:netrwmftgt_islocal
6063 " move: local -> remote
6064" call Decho("move from local to remote")
6065" call Decho("copy")
6066 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006067 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006068" call Decho("remove")
6069 for fname in mflist
6070 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6071 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
6072 endfor
6073 unlet mflist
6074
6075 elseif !a:islocal && s:netrwmftgt_islocal
6076 " move: remote -> local
6077" call Decho("move from remote to local")
6078" call Decho("copy")
6079 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006080 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006081" call Decho("remove")
6082 for fname in mflist
6083 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6084 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6085 endfor
6086 unlet mflist
6087
6088 elseif !a:islocal && !s:netrwmftgt_islocal
6089 " move: remote -> remote
6090" call Decho("move from remote to remote")
6091" call Decho("copy")
6092 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02006093 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006094" call Decho("remove")
6095 for fname in mflist
6096 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6097 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6098 endfor
6099 unlet mflist
6100 endif
6101
6102 " -------
6103 " cleanup
6104 " -------
6105" call Decho("cleanup")
6106
6107 " remove markings from local buffer
6108 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
6109
6110 " refresh buffers
6111 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006112" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
6113 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006114 endif
6115 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006116" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
6117 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006118 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006119 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006120" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
6121 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006122 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006123
6124" call Dret("s:NetrwMarkFileMove")
6125endfun
6126
6127" ---------------------------------------------------------------------
6128" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
6129" using the hardcopy command. Local marked-file list only.
6130fun! s:NetrwMarkFilePrint(islocal)
6131" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
6132 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006133
6134 " sanity check
6135 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6136 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6137" call Dret("s:NetrwMarkFilePrint")
6138 return
6139 endif
6140" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006141 if exists("s:netrwmarkfilelist_{curbufnr}")
6142 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
6143 let curdir = b:netrw_curdir
6144 call s:NetrwUnmarkList(curbufnr,curdir)
6145 for fname in netrwmarkfilelist
6146 if a:islocal
6147 if g:netrw_keepdir
6148 let fname= s:ComposePath(curdir,fname)
6149 endif
6150 else
6151 let fname= curdir.fname
6152 endif
6153 1split
6154 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02006155" call Decho("exe sil e ".escape(fname,' '))
6156 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006157" call Decho("hardcopy")
6158 hardcopy
6159 q
6160 endfor
6161 2match none
6162 endif
6163" call Dret("s:NetrwMarkFilePrint")
6164endfun
6165
6166" ---------------------------------------------------------------------
6167" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
6168" files when given a regexp (for which a prompt is
Bram Moolenaarff034192013-04-24 18:51:19 +02006169" issued) (matches to name of files).
Bram Moolenaar446cb832008-06-24 21:56:24 +00006170fun! s:NetrwMarkFileRegexp(islocal)
6171" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
6172
6173 " get the regular expression
6174 call inputsave()
6175 let regexp= input("Enter regexp: ","","file")
6176 call inputrestore()
6177
6178 if a:islocal
6179 " get the matching list of files using local glob()
6180" call Decho("handle local regexp")
Bram Moolenaarff034192013-04-24 18:51:19 +02006181 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6182 let files = glob(s:ComposePath(dirname,regexp))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006183" call Decho("files<".files.">")
6184 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006185
6186 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01006187 for fname in filelist
6188" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006189 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01006190 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00006191
6192 else
6193" call Decho("handle remote regexp")
6194
6195 " convert displayed listing into a filelist
6196 let eikeep = &ei
6197 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006198 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00006199 set ei=all ma
6200" call Decho("set ei=all ma")
6201 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02006202 keepj call s:NetrwEnew()
6203 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006204 sil keepj norm! "ap
6205 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006206 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006207 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006208 set bt=nofile
6209 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006210 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006211 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006212 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006213 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01006214 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006215 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006216 sil keepj %s/^| //e
6217 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006218 call histdel("/",-1)
6219 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006220 endif
6221 " convert regexp into the more usual glob-style format
6222 let regexp= substitute(regexp,'\*','.*','g')
6223" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006224 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01006225 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006226 let filelist= getline(1,line("$"))
6227 q!
6228 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02006229 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006230 endfor
6231 unlet filelist
6232 let @a = areg
6233 let &ei = eikeep
6234 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02006235 echo " (use me to edit marked files)"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006236
6237" call Dret("s:NetrwMarkFileRegexp")
6238endfun
6239
6240" ---------------------------------------------------------------------
6241" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
6242" Uses the local marked file list.
6243fun! s:NetrwMarkFileSource(islocal)
6244" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
6245 let curbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006246
6247 " sanity check
6248 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6249 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6250" call Dret("s:NetrwMarkFileSource")
6251 return
6252 endif
6253" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006254 if exists("s:netrwmarkfilelist_{curbufnr}")
6255 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
6256 let curdir = b:netrw_curdir
6257 call s:NetrwUnmarkList(curbufnr,curdir)
6258 for fname in netrwmarkfilelist
6259 if a:islocal
6260 if g:netrw_keepdir
6261 let fname= s:ComposePath(curdir,fname)
6262 endif
6263 else
6264 let fname= curdir.fname
6265 endif
6266 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00006267" call Decho("exe so ".fnameescape(fname))
6268 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006269 endfor
6270 2match none
6271 endif
6272" call Dret("s:NetrwMarkFileSource")
6273endfun
6274
6275" ---------------------------------------------------------------------
6276" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
6277" Uses the global markfilelist
6278fun! s:NetrwMarkFileTag(islocal)
6279" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
6280 let svpos = netrw#NetrwSavePosn()
6281 let curdir = b:netrw_curdir
6282 let curbufnr = bufnr("%")
6283
Bram Moolenaarff034192013-04-24 18:51:19 +02006284 " sanity check
6285 if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6286 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6287" call Dret("s:NetrwMarkFileTag")
6288 return
6289 endif
6290" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6291
Bram Moolenaar446cb832008-06-24 21:56:24 +00006292 if exists("s:netrwmarkfilelist")
6293" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006294 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006295 call s:NetrwUnmarkAll()
6296
6297 if a:islocal
6298 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006299" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
6300 call system(g:netrw_ctags." ".netrwmarkfilelist)
6301 else
6302 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
6303 endif
6304 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006305 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006306 call netrw#NetrwObtain(a:islocal,"tags")
6307 let curdir= b:netrw_curdir
6308 1split
6309 e tags
6310 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
6311" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006312 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006313 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006314 wq!
6315 endif
6316 2match none
6317 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6318 call netrw#NetrwRestorePosn(svpos)
6319 endif
6320
6321" call Dret("s:NetrwMarkFileTag")
6322endfun
6323
6324" ---------------------------------------------------------------------
6325" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
6326" Sets up two variables,
Bram Moolenaarff034192013-04-24 18:51:19 +02006327" s:netrwmftgt : holds the target directory
Bram Moolenaar446cb832008-06-24 21:56:24 +00006328" s:netrwmftgt_islocal : 0=target directory is remote
Bram Moolenaarff034192013-04-24 18:51:19 +02006329" 1=target directory is local
Bram Moolenaar446cb832008-06-24 21:56:24 +00006330fun! s:NetrwMarkFileTgt(islocal)
6331" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
6332 let svpos = netrw#NetrwSavePosn()
6333 let curdir = b:netrw_curdir
6334 let hadtgt = exists("s:netrwmftgt")
6335 if !exists("w:netrw_bannercnt")
6336 let w:netrw_bannercnt= b:netrw_bannercnt
6337 endif
6338
6339 " set up target
6340 if line(".") < w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02006341 " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
6342 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
6343" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target")
6344 unlet s:netrwmftgt s:netrwmftgt_islocal
6345 if g:netrw_fastbrowse <= 1
6346 call s:LocalBrowseShellCmdRefresh()
6347 endif
6348 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6349 call netrw#NetrwRestorePosn(svpos)
6350" call Dret("s:NetrwMarkFileTgt : removed target")
6351 return
6352 else
6353 let s:netrwmftgt= b:netrw_curdir
6354" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
6355 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006356
6357 else
6358 " get word under cursor.
6359 " * If directory, use it for the target.
6360 " * If file, use b:netrw_curdir for the target
6361 let curword= s:NetrwGetWord()
6362 let tgtdir = s:ComposePath(curdir,curword)
6363 if a:islocal && isdirectory(tgtdir)
6364 let s:netrwmftgt = tgtdir
6365" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
6366 elseif !a:islocal && tgtdir =~ '/$'
6367 let s:netrwmftgt = tgtdir
6368" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
6369 else
6370 let s:netrwmftgt = curdir
6371" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
6372 endif
6373 endif
6374 if a:islocal
6375 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
6376 let s:netrwmftgt= simplify(s:netrwmftgt)
6377" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
6378 endif
6379 if g:netrw_cygwin
6380 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
6381 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
6382 endif
6383 let s:netrwmftgt_islocal= a:islocal
6384
Bram Moolenaar5c736222010-01-06 20:54:52 +01006385 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006386 call s:LocalBrowseShellCmdRefresh()
6387 endif
6388 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6389 call netrw#NetrwRestorePosn(svpos)
6390 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006391 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00006392 endif
6393
6394" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
6395endfun
6396
6397" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00006398" s:NetrwOpenFile: query user for a filename and open it {{{2
6399fun! s:NetrwOpenFile(islocal)
6400" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006401 let ykeep= @@
Bram Moolenaarc236c162008-07-13 17:41:49 +00006402 call inputsave()
6403 let fname= input("Enter filename: ")
6404 call inputrestore()
6405 if fname !~ '[/\\]'
6406 if exists("b:netrw_curdir")
6407 if exists("g:netrw_quiet")
6408 let netrw_quiet_keep = g:netrw_quiet
6409 endif
6410 let g:netrw_quiet = 1
6411 if b:netrw_curdir =~ '/$'
6412 exe "e ".fnameescape(b:netrw_curdir.fname)
6413 else
6414 exe "e ".fnameescape(b:netrw_curdir."/".fname)
6415 endif
6416 if exists("netrw_quiet_keep")
6417 let g:netrw_quiet= netrw_quiet_keep
6418 else
6419 unlet g:netrw_quiet
6420 endif
6421 endif
6422 else
6423 exe "e ".fnameescape(fname)
6424 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006425 let @@= ykeep
Bram Moolenaarc236c162008-07-13 17:41:49 +00006426" call Dret("s:NetrwOpenFile")
6427endfun
6428
6429" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006430" 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 +02006431" User access provided by the <mu> mapping. (see :help netrw-mu)
6432" Used by many MarkFile functions.
Bram Moolenaar446cb832008-06-24 21:56:24 +00006433fun! s:NetrwUnmarkList(curbufnr,curdir)
6434" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
6435
6436 " remove all files in local marked-file list from global list
6437 if exists("s:netrwmarkfilelist_{a:curbufnr}")
6438 for mfile in s:netrwmarkfilelist_{a:curbufnr}
6439 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
6440 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
6441 call remove(s:netrwmarkfilelist,idx) " remove from global list
6442 endfor
6443 if s:netrwmarkfilelist == []
6444 unlet s:netrwmarkfilelist
6445 endif
6446
6447 " getting rid of the local marked-file lists is easy
6448 unlet s:netrwmarkfilelist_{a:curbufnr}
6449 endif
6450 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
6451 unlet s:netrwmarkfilemtch_{a:curbufnr}
6452 endif
6453 2match none
6454" call Dret("s:NetrwUnmarkList")
6455endfun
6456
6457" ---------------------------------------------------------------------
6458" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
6459fun! s:NetrwUnmarkAll()
6460" call Dfunc("s:NetrwUnmarkAll()")
6461 if exists("s:netrwmarkfilelist")
6462 unlet s:netrwmarkfilelist
6463 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006464 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006465 2match none
6466" call Dret("s:NetrwUnmarkAll")
6467endfun
6468
6469" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02006470" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006471fun! s:NetrwUnmarkAll2()
6472" call Dfunc("s:NetrwUnmarkAll2()")
6473 redir => netrwmarkfilelist_let
6474 let
6475 redir END
6476 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
6477 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
6478 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
6479 for flist in netrwmarkfilelist_list
6480 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
6481 unlet s:netrwmarkfilelist_{curbufnr}
6482 unlet s:netrwmarkfilemtch_{curbufnr}
6483 endfor
6484" call Dret("s:NetrwUnmarkAll2")
6485endfun
6486
6487" ---------------------------------------------------------------------
6488" s:NetrwUnMarkFile: {{{2
6489fun! s:NetrwUnMarkFile(islocal)
6490" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
6491 let svpos = netrw#NetrwSavePosn()
6492 let curbufnr = bufnr("%")
6493
6494 " unmark marked file list (although I expect s:NetrwUpload()
6495 " to do it, I'm just making sure)
6496 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6497" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
6498 unlet s:netrwmarkfilelist
6499 unlet s:netrwmarkfilelist_{curbufnr}
6500 unlet s:netrwmarkfilemtch_{curbufnr}
6501 2match none
6502 endif
6503
6504" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6505 call netrw#NetrwRestorePosn(svpos)
6506" call Dret("s:NetrwUnMarkFile")
6507endfun
6508
6509" ---------------------------------------------------------------------
6510" s:NetrwMenu: generates the menu for gvim and netrw {{{2
6511fun! s:NetrwMenu(domenu)
6512
6513 if !exists("g:NetrwMenuPriority")
6514 let g:NetrwMenuPriority= 80
6515 endif
6516
Bram Moolenaaradc21822011-04-01 18:03:16 +02006517 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00006518" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
6519
6520 if !exists("s:netrw_menu_enabled") && a:domenu
6521" call Decho("initialize menu")
6522 let s:netrw_menu_enabled= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02006523 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
6524 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
6525 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
6526 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
6527 if g:netrw_dirhistmax > 0
6528 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
6529 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
6530 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
6531 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
6532 else
6533 exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\<cr>"
6534 endif
6535 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o o'
6536 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v v'
6537 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
6538 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p p'
6539 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
6540 exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
6541 exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
6542 exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
6543 exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
6544 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
6545 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
6546 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
6547 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
6548 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
6549 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
6550 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
6551 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
6552 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
6553 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
6554 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
6555 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
6556 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
6557 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
6558 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
6559 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
6560 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
6561 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
6562 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
6563 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
6564 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
6565 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
6566 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
6567 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
6568 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
6569 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
6570 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
6571 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
6572 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
6573 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
6574 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
6575 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
6576 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
6577 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
6578 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
6579 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>'
6580 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>'
6581 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>'
6582 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
6583 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>'
6584 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>'
6585 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>'
6586 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
6587 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006588 let s:netrw_menucnt= 28
Bram Moolenaarff034192013-04-24 18:51:19 +02006589 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
6590 call s:NetrwTgtMenu() " let bookmarks and history be easy targets
Bram Moolenaar446cb832008-06-24 21:56:24 +00006591
6592 elseif !a:domenu
6593 let s:netrwcnt = 0
6594 let curwin = winnr()
6595 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
6596 exe curwin."wincmd w"
6597
6598 if s:netrwcnt <= 1
6599" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006600 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02006601" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006602 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00006603 endif
6604 endif
6605" call Dret("NetrwMenu")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006606 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006607 endif
6608
6609endfun
6610
6611" ---------------------------------------------------------------------
6612" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
6613" Used by the O maps (as <SID>NetrwObtain())
6614fun! s:NetrwObtain(islocal)
6615" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
6616
Bram Moolenaar97d62492012-11-15 21:28:22 +01006617 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006618 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006619 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
6620 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00006621 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
6622 else
6623 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
6624 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006625 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006626
6627" call Dret("NetrwObtain")
6628endfun
6629
6630" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006631" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
6632" If there's only one window, then the window will first be split.
6633" Returns:
6634" choice = 0 : didn't have to choose
6635" choice = 1 : saved modified file in window first
6636" choice = 2 : didn't save modified file, opened window
6637" choice = 3 : cancel open
6638fun! s:NetrwPrevWinOpen(islocal)
6639" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
6640
Bram Moolenaar97d62492012-11-15 21:28:22 +01006641 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00006642 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
6643 let curdir = b:netrw_curdir
6644
6645 " get last window number and the word currently under the cursor
6646 let lastwinnr = winnr("$")
6647 let curword = s:NetrwGetWord()
6648 let choice = 0
6649" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
6650
6651 let didsplit = 0
6652 if lastwinnr == 1
6653 " if only one window, open a new one first
6654" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
6655 if g:netrw_preview
Bram Moolenaar15146672011-10-20 22:22:38 +02006656 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6657" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
6658 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006659 else
Bram Moolenaar15146672011-10-20 22:22:38 +02006660 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6661" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
6662 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006663 endif
6664 let didsplit = 1
6665
6666 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006667 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006668" call Decho("wincmd p")
6669 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02006670 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006671 " if the previous window's buffer has been changed (is modified),
6672 " and it doesn't appear in any other extant window, then ask the
6673 " user if s/he wants to abandon modifications therein.
6674 let bnr = winbufnr(0)
6675 let bnrcnt = 0
6676 if &mod
6677" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
6678 let eikeep= &ei
6679 set ei=all
6680 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
6681 exe bnr."wincmd p"
6682 let &ei= eikeep
6683" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
6684 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006685 let bufname = bufname(winbufnr(winnr()))
6686 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006687" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
6688
6689 if choice == 1
6690 " Yes -- write file & then browse
6691 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006692 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00006693 if v:errmsg != ""
6694 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
6695 if didsplit
6696 q
6697 else
6698 wincmd p
6699 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006700 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006701" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
6702 return choice
6703 endif
6704
6705 elseif choice == 2
6706 " No -- don't worry about changed file, just browse anyway
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006707" call Decho("(NetrwPrevWinOpen) setl nomod")
6708 setl nomod
6709" 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 +02006710 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006711 wincmd p
6712
6713 else
6714 " Cancel -- don't do this
6715 if didsplit
6716 q
6717 else
6718 wincmd p
6719 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006720 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006721" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
6722 return choice
6723 endif
6724 endif
6725 endif
6726 endif
6727
6728 " restore b:netrw_curdir (window split/enew may have lost it)
6729 let b:netrw_curdir= curdir
6730 if a:islocal < 2
6731 if a:islocal
6732 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
6733 else
6734 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
6735 endif
6736 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006737 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006738" call Dret("NetrwPrevWinOpen ".choice)
6739 return choice
6740endfun
6741
6742" ---------------------------------------------------------------------
6743" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
6744" Always assumed to be local -> remote
6745" call s:NetrwUpload(filename, target)
6746" call s:NetrwUpload(filename, target, fromdirectory)
6747fun! s:NetrwUpload(fname,tgt,...)
6748" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6749
6750 if a:tgt =~ '^\a\+://'
6751 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
6752 else
6753 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
6754 endif
6755" call Decho("tgtdir<".tgtdir.">")
6756
6757 if a:0 > 0
6758 let fromdir= a:1
6759 else
6760 let fromdir= getcwd()
6761 endif
6762" call Decho("fromdir<".fromdir.">")
6763
6764 if type(a:fname) == 1
6765 " handle uploading a single file using NetWrite
6766" call Decho("handle uploading a single file via NetWrite")
6767 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006768" call Decho("exe e ".fnameescape(a:fname))
6769 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006770" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
6771 if a:tgt =~ '/$'
6772 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006773" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006774 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006775 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006776" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
6777 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006778" call Decho("done writing local->remote")
6779 endif
6780 q!
6781
6782 elseif type(a:fname) == 3
6783 " handle uploading a list of files via scp
6784" call Decho("handle uploading a list of files via scp")
6785 let curdir= getcwd()
6786 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006787 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006788 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
6789 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006790 if exists("g:netrw_port") && g:netrw_port != ""
6791 let useport= " ".g:netrw_scpport." ".g:netrw_port
6792 else
6793 let useport= ""
6794 endif
6795 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
6796 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006797" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
6798 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006799 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006800
6801 elseif a:tgt =~ '^ftp:'
6802 call s:NetrwMethod(a:tgt)
6803
6804 if b:netrw_method == 2
6805 " handle uploading a list of files via ftp+.netrc
6806 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006807 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00006808" call Decho("filter input window#".winnr())
6809
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006810 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006811" call Decho("filter input: ".getline('$'))
6812
6813 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006814 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006815" call Decho("filter input: ".getline('$'))
6816 endif
6817
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006818 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006819" call Decho("filter input: ".getline('$'))
6820
Bram Moolenaaradc21822011-04-01 18:03:16 +02006821 if tgtdir == ""
6822 let tgtdir= '/'
6823 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006824 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006825" call Decho("filter input: ".getline('$'))
6826
6827 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006828 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006829" call Decho("filter input: ".getline('$'))
6830 endfor
6831
6832 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006833" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6834 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 +00006835 else
6836" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02006837" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6838 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006839 endif
6840 " 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 +02006841 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006842 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006843 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6844 call netrw#ErrorMsg(s:ERROR,getline(1),14)
6845 else
6846 bw!|q
6847 endif
6848
6849 elseif b:netrw_method == 3
6850 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
6851 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02006852 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006853 let tmpbufnr= bufnr("%")
Bram Moolenaarff034192013-04-24 18:51:19 +02006854 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00006855
6856 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006857 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006858" call Decho("filter input: ".getline('$'))
6859 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006860 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006861" call Decho("filter input: ".getline('$'))
6862 endif
6863
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006864 if exists("g:netrw_uid") && g:netrw_uid != ""
6865 if exists("g:netrw_ftp") && g:netrw_ftp == 1
6866 keepj put =g:netrw_uid
6867" call Decho("filter input: ".getline('$'))
6868 if exists("s:netrw_passwd")
6869 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
6870 endif
6871" call Decho("filter input: ".getline('$'))
6872 elseif exists("s:netrw_passwd")
6873 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6874" call Decho("filter input: ".getline('$'))
6875 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006876 endif
6877
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006878 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006879" call Decho("filter input: ".getline('$'))
6880
6881 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006882 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006883" call Decho("filter input: ".getline('$'))
6884 endif
6885
6886 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006887 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006888" call Decho("filter input: ".getline('$'))
6889 endif
6890
6891 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006892 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006893" call Decho("filter input: ".getline('$'))
6894 endfor
6895
6896 " perform ftp:
6897 " -i : turns off interactive prompting from ftp
6898 " -n unix : DON'T use <.netrc>, even though it exists
6899 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006900 keepj norm! 1Gdd
Bram Moolenaar5b435d62012-04-05 17:33:26 +02006901" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6902 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006903 " 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 +02006904 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006905 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006906 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6907 let debugkeep= &debug
Bram Moolenaarff034192013-04-24 18:51:19 +02006908 setl debug=msg
Bram Moolenaar446cb832008-06-24 21:56:24 +00006909 call netrw#ErrorMsg(s:ERROR,getline(1),15)
6910 let &debug = debugkeep
6911 let mod = 1
6912 else
6913 bw!|q
6914 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006915 elseif !exists("b:netrw_method") || b:netrw_method < 0
6916" call Dfunc("netrw#NetrwUpload : unsupported method")
6917 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006918 endif
6919 else
6920 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
6921 endif
6922 endif
6923
6924" call Dret("s:NetrwUpload")
6925endfun
6926
6927" ---------------------------------------------------------------------
6928" s:NetrwPreview: {{{2
6929fun! s:NetrwPreview(path) range
6930" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006931 let ykeep= @@
Bram Moolenaaradc21822011-04-01 18:03:16 +02006932 keepj call s:NetrwOptionSave("s:")
6933 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006934 if has("quickfix")
6935 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006936 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02006937 let pvhkeep = &pvh
6938 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6939 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006940 endif
6941 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
6942 if exists("pvhkeep")
6943 let &pvh= pvhkeep
6944 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006945 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006946 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006947 endif
6948 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006949 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 +00006950 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006951 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006952 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006953" call Dret("NetrwPreview")
6954endfun
6955
6956" ---------------------------------------------------------------------
6957" s:NetrwRefresh: {{{2
6958fun! s:NetrwRefresh(islocal,dirname)
6959" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
6960 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
Bram Moolenaar97d62492012-11-15 21:28:22 +01006961 " (defunct) NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
6962 " (defunct) Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
Bram Moolenaarff034192013-04-24 18:51:19 +02006963 setl ma noro
6964" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006965" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar97d62492012-11-15 21:28:22 +01006966 let ykeep = @@
6967 let screenposn = netrw#NetrwSavePosn()
Bram Moolenaarff034192013-04-24 18:51:19 +02006968" call Decho("clearing buffer prior to refresh")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006969 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006970 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006971 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006972 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006973 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006974 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01006975 keepj call netrw#NetrwRestorePosn(screenposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006976
6977 " restore file marks
6978 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
6979" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
6980 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
6981 else
6982" call Decho("2match none")
6983 2match none
6984 endif
6985
Bram Moolenaar97d62492012-11-15 21:28:22 +01006986" restore
6987 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00006988" call Dret("NetrwRefresh")
6989endfun
6990
6991" ---------------------------------------------------------------------
6992" s:NetrwRefreshDir: refreshes a directory by name {{{2
6993" Called by NetrwMarkFileCopy()
6994" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
6995fun! s:NetrwRefreshDir(islocal,dirname)
Bram Moolenaar97d62492012-11-15 21:28:22 +01006996" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006997 if g:netrw_fastbrowse == 0
6998 " slowest mode (keep buffers refreshed, local or remote)
6999" call Decho("slowest mode: keep buffers refreshed, local or remote")
7000 let tgtwin= bufwinnr(a:dirname)
7001" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
7002
7003 if tgtwin > 0
7004 " tgtwin is being displayed, so refresh it
7005 let curwin= winnr()
7006" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
7007 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007008 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007009 exe curwin."wincmd w"
7010
7011 elseif bufnr(a:dirname) > 0
7012 let bn= bufnr(a:dirname)
7013" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007014 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00007015 endif
7016
7017 elseif g:netrw_fastbrowse <= 1
7018" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007019 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007020 endif
7021" call Dret("s:NetrwRefreshDir")
7022endfun
7023
7024" ---------------------------------------------------------------------
7025" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
7026" What this function does is to compute a priority for the patterns
7027" in the g:netrw_sort_sequence. It applies a substitute to any
7028" "files" that satisfy each pattern, putting the priority / in
7029" front. An "*" pattern handles the default priority.
7030fun! s:NetrwSetSort()
7031" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007032 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00007033 if w:netrw_liststyle == s:LONGLIST
7034 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
7035 else
7036 let seqlist = g:netrw_sort_sequence
7037 endif
7038 " sanity check -- insure that * appears somewhere
7039 if seqlist == ""
7040 let seqlist= '*'
7041 elseif seqlist !~ '\*'
7042 let seqlist= seqlist.',*'
7043 endif
7044 let priority = 1
7045 while seqlist != ""
7046 if seqlist =~ ','
7047 let seq = substitute(seqlist,',.*$','','e')
7048 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
7049 else
7050 let seq = seqlist
7051 let seqlist = ""
7052 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007053 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01007054 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007055 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01007056 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007057 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01007058 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007059 endif
7060" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
7061
7062 " sanity check
7063 if w:netrw_bannercnt > line("$")
7064 " apparently no files were left after a Hiding pattern was used
7065" call Dret("SetSort : no files left after hiding")
7066 return
7067 endif
7068 if seq == '*'
7069 let starpriority= spriority
7070 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007071 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007072 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007073 " sometimes multiple sorting patterns will match the same file or directory.
7074 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007075 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 +02007076 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007077 endif
7078 let priority = priority + 1
7079 endwhile
7080 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007081 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007082 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007083 endif
7084
7085 " Following line associated with priority -- items that satisfy a priority
7086 " pattern get prefixed by ###/ which permits easy sorting by priority.
7087 " Sometimes files can satisfy multiple priority patterns -- only the latest
7088 " priority pattern needs to be retained. So, at this point, these excess
7089 " priority prefixes need to be removed, but not directories that happen to
7090 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007091 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 +02007092 keepj call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01007093 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007094
7095" call Dret("SetSort")
7096endfun
7097
Bram Moolenaarff034192013-04-24 18:51:19 +02007098" ---------------------------------------------------------------------
7099" s:NetrwSetTgt: sets the target to the specified choice index {{{2
7100" Implements [count]Tb (bookhist<b>)
7101" [count]Th (bookhist<h>)
7102" See :help netrw-qb for how to make the choice.
7103fun! s:NetrwSetTgt(bookhist,choice)
7104" call Dfunc("s:NetrwSetTgt(bookhist<".a:bookhist."> choice#".a:choice.")")
7105
7106 if a:bookhist == 'b'
7107 " supports choosing a bookmark as a target using a qb-generated list
7108 let choice= a:choice - 1
7109 if exists("g:netrw_bookmarklist[".choice."]")
7110 call netrw#NetrwMakeTgt(g:netrw_bookmarklist[choice])
7111 else
7112 echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
7113 endif
7114
7115 elseif a:bookhist == 'h'
7116 " supports choosing a history stack entry as a target using a qb-generated list
7117 let choice= (a:choice % g:netrw_dirhistmax) + 1
7118 if exists("g:netrw_dirhist_".choice)
7119 let histentry = g:netrw_dirhist_{choice}
7120 call netrw#NetrwMakeTgt(histentry)
7121 else
7122 echomsg "Sorry, history#".a:choice." not available!"
7123 endif
7124 endif
7125
7126" call Dret("s:NetrwSetTgt")
7127endfun
7128
Bram Moolenaar446cb832008-06-24 21:56:24 +00007129" =====================================================================
7130" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
7131fun! s:NetrwSortStyle(islocal)
7132" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007133 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007134 let svpos= netrw#NetrwSavePosn()
7135
7136 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 +02007137 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007138 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
7139 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007140
7141" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
7142endfun
7143
7144" ---------------------------------------------------------------------
7145" s:NetrwSplit: mode {{{2
7146" =0 : net and o
7147" =1 : net and t
7148" =2 : net and v
7149" =3 : local and o
7150" =4 : local and t
7151" =5 : local and v
7152fun! s:NetrwSplit(mode)
7153" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
7154
Bram Moolenaar97d62492012-11-15 21:28:22 +01007155 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00007156 call s:SaveWinVars()
7157
7158 if a:mode == 0
7159 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02007160 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7161" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007162 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007163 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007164 keepj call s:RestoreWinVars()
7165 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007166 unlet s:didsplit
7167
7168 elseif a:mode == 1
7169 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01007170 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00007171" call Decho("tabnew")
7172 tabnew
7173 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007174 keepj call s:RestoreWinVars()
7175 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007176 unlet s:didsplit
7177
7178 elseif a:mode == 2
7179 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02007180 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7181" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007182 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007183 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007184 keepj call s:RestoreWinVars()
7185 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007186 unlet s:didsplit
7187
7188 elseif a:mode == 3
7189 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02007190 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7191" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007192 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007193 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007194 keepj call s:RestoreWinVars()
7195 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007196 unlet s:didsplit
7197
7198 elseif a:mode == 4
7199 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007200 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007201 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007202" call Decho("tabnew")
7203 tabnew
7204 let b:netrw_curdir= netrw_curdir
7205 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007206 keepj call s:RestoreWinVars()
7207 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007208 unlet s:didsplit
7209
7210 elseif a:mode == 5
7211 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02007212 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7213" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02007214 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007215 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007216 keepj call s:RestoreWinVars()
7217 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007218 unlet s:didsplit
7219
7220 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007221 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007222 endif
7223
Bram Moolenaar97d62492012-11-15 21:28:22 +01007224 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00007225" call Dret("s:NetrwSplit")
7226endfun
7227
7228" ---------------------------------------------------------------------
Bram Moolenaarff034192013-04-24 18:51:19 +02007229" s:NetrwTgtMenu: {{{2
7230fun! s:NetrwTgtMenu()
7231 if !exists("s:netrw_menucnt")
7232 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007233 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007234" call Dfunc("s:NetrwTgtMenu()")
7235
7236 " the following test assures that gvim is running, has menus available, and has menus enabled.
7237 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
7238 if exists("g:NetrwTopLvlMenu")
7239" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
7240 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
7241 endif
7242 if !exists("s:netrw_initbookhist")
7243 call s:NetrwBookHistRead()
7244 endif
7245
7246 " target bookmarked places
7247 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
7248" call Decho("installing bookmarks as easy targets")
7249 let cnt= 1
7250 for bmd in g:netrw_bookmarklist
7251 let ebmd= escape(bmd,g:netrw_menu_escape)
7252 " show bookmarks for goto menu
7253" call Decho("menu: Targets: ".bmd)
7254 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#NetrwMakeTgt('".bmd."')\<cr>"
7255 let cnt= cnt + 1
7256 endfor
7257 endif
7258
7259 " target directory browsing history
7260 if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
7261" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")")
7262 let histcnt = 1
7263 while histcnt <= g:netrw_dirhistmax
7264 let priority = g:netrw_dirhist_cnt + histcnt
7265 if exists("g:netrw_dirhist_{histcnt}")
7266 let histentry = g:netrw_dirhist_{histcnt}
7267 let ehistentry = escape(histentry,g:netrw_menu_escape)
7268" call Decho("menu: Targets: ".histentry)
7269 exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#NetrwMakeTgt('".histentry."')\<cr>"
7270 endif
7271 let histcnt = histcnt + 1
7272 endwhile
7273 endif
7274 endif
7275" call Dret("s:NetrwTgtMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007276endfun
7277
7278" ---------------------------------------------------------------------
7279" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
7280" (full path directory with trailing slash returned)
7281fun! s:NetrwTreeDir()
7282" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
7283
7284 let treedir= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02007285" call Decho("(NetrwTreeDir) set initial treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007286 let s:treecurpos= netrw#NetrwSavePosn()
7287
7288 if w:netrw_liststyle == s:TREELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02007289" call Decho("(NetrwTreeDir) w:netrw_liststyle is TREELIST:")
7290" call Decho("(NetrwTreeDir) line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007291
7292 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007293 if getline('.') =~ '/$'
7294 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
7295 else
7296 let treedir= ""
7297 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007298" call Decho("(NetrwTreeDir) treedir<".treedir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007299
7300 " detect user attempting to close treeroot
7301 if getline('.') !~ '|' && getline('.') != '..'
7302" call Decho("user attempted to close treeroot")
7303 " now force a refresh
Bram Moolenaarff034192013-04-24 18:51:19 +02007304" call Decho("(NetrwTreeDir) clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007305 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007306" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
7307 return b:netrw_curdir
7308 endif
7309
7310 " elide all non-depth information
7311 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaarff034192013-04-24 18:51:19 +02007312" call Decho("(NetrwTreeDir) depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007313
7314 " elide first depth
7315 let depth = substitute(depth,'^| ','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02007316" call Decho("(NetrwTreeDir) depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007317
7318 " construct treedir by searching backwards at correct depth
Bram Moolenaarff034192013-04-24 18:51:19 +02007319" call Decho("(NetrwTreeDir) constructing treedir<".treedir."> depth<".depth.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007320 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
7321 let dirname= substitute(getline('.'),'^\(| \)*','','e')
7322 let treedir= dirname.treedir
7323 let depth = substitute(depth,'^| ','','')
Bram Moolenaarff034192013-04-24 18:51:19 +02007324" call Decho("(NetrwTreeDir) constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007325 endwhile
7326 if w:netrw_treetop =~ '/$'
7327 let treedir= w:netrw_treetop.treedir
7328 else
7329 let treedir= w:netrw_treetop.'/'.treedir
7330 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007331" call Decho("(NetrwTreeDir) bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007332 endif
7333 let treedir= substitute(treedir,'//$','/','')
7334
Bram Moolenaar446cb832008-06-24 21:56:24 +00007335" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
7336 return treedir
7337endfun
7338
7339" ---------------------------------------------------------------------
7340" s:NetrwTreeDisplay: recursive tree display {{{2
7341fun! s:NetrwTreeDisplay(dir,depth)
7342" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
7343
7344 " insure that there are no folds
Bram Moolenaarff034192013-04-24 18:51:19 +02007345 setl nofen
Bram Moolenaar446cb832008-06-24 21:56:24 +00007346
7347 " install ../ and shortdir
7348 if a:depth == ""
7349 call setline(line("$")+1,'../')
7350" call Decho("setline#".line("$")." ../ (depth is zero)")
7351 endif
7352 if a:dir =~ '^\a\+://'
7353 if a:dir == w:netrw_treetop
7354 let shortdir= a:dir
7355 else
7356 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
7357 endif
7358 call setline(line("$")+1,a:depth.shortdir)
7359 else
7360 let shortdir= substitute(a:dir,'^.*/','','e')
7361 call setline(line("$")+1,a:depth.shortdir.'/')
7362 endif
7363" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
7364
7365 " append a / to dir if its missing one
7366 let dir= a:dir
7367 if dir !~ '/$'
7368 let dir= dir.'/'
7369 endif
7370
7371 " display subtrees (if any)
7372 let depth= "| ".a:depth
7373
7374" call Decho("display subtrees with depth<".depth."> and current leaves")
7375 for entry in w:netrw_treedict[a:dir]
7376 let direntry= substitute(dir.entry,'/$','','e')
7377" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
7378 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
7379" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007380 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007381 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
7382" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007383 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007384 else
7385" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007386 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007387 endif
7388 endfor
7389" call Dret("NetrwTreeDisplay")
7390endfun
7391
7392" ---------------------------------------------------------------------
7393" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
7394fun! s:NetrwTreeListing(dirname)
7395 if w:netrw_liststyle == s:TREELIST
7396" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
7397" call Decho("curdir<".a:dirname.">")
7398" 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"))
7399
7400 " update the treetop
7401" call Decho("update the treetop")
7402 if !exists("w:netrw_treetop")
7403 let w:netrw_treetop= a:dirname
7404" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
7405 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
7406 let w:netrw_treetop= a:dirname
7407" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
7408 endif
7409
7410 " insure that we have at least an empty treedict
7411 if !exists("w:netrw_treedict")
7412 let w:netrw_treedict= {}
7413 endif
7414
7415 " update the directory listing for the current directory
7416" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
7417" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007418 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007419 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007420" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007421 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007422
7423 " if past banner, record word
7424 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
7425 let fname= expand("<cword>")
7426 else
7427 let fname= ""
7428 endif
7429" call Decho("fname<".fname.">")
7430
7431 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02007432 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007433
7434" call Dret("NetrwTreeListing : bufname<".expand("%").">")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007435 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007436 endif
7437endfun
7438
7439" ---------------------------------------------------------------------
7440" s:NetrwWideListing: {{{2
7441fun! s:NetrwWideListing()
7442
7443 if w:netrw_liststyle == s:WIDELIST
7444" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
7445 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007446 " cpf: characters per filename
7447 " fpl: filenames per line
7448 " fpc: filenames per column
Bram Moolenaarff034192013-04-24 18:51:19 +02007449 setl ma noro
7450" call Decho("setl ma noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007451 let b:netrw_cpf= 0
7452 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007453 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 +02007454 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007455 else
7456" call Dret("NetrwWideListing")
7457 return
7458 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007459 let b:netrw_cpf= b:netrw_cpf + 2
7460" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007461
7462 " determine qty files per line (fpl)
7463 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
7464 if w:netrw_fpl <= 0
7465 let w:netrw_fpl= 1
7466 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007467" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007468
7469 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007470 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007471 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007472 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
7473 let newcolstart = w:netrw_bannercnt + fpc
7474 let newcolend = newcolstart + fpc - 1
7475" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007476 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00007477 while line("$") >= newcolstart
7478 if newcolend > line("$") | let newcolend= line("$") | endif
7479 let newcolqty= newcolend - newcolstart
7480 exe newcolstart
7481 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007482 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007483 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007484 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007485 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007486 exe "sil! keepj ".newcolstart.','.newcolend.'d'
7487 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007488 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02007489 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007490 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007491 keepj call histdel("/",-1)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007492" call Decho("NetrwWideListing) setl noma nomod ro")
7493 setl noma nomod ro
7494" 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 +00007495" call Dret("NetrwWideListing")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007496 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00007497 endif
7498
7499endfun
7500
7501" ---------------------------------------------------------------------
7502" s:PerformListing: {{{2
7503fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007504" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007505
Bram Moolenaar15146672011-10-20 22:22:38 +02007506 " set up syntax highlighting {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02007507" call Decho("(PerformListing) set up syntax highlighting")
Bram Moolenaar15146672011-10-20 22:22:38 +02007508 if has("syntax")
7509 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaarff034192013-04-24 18:51:19 +02007510" call Decho("(PerformListing) but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
7511 setl ft=
Bram Moolenaar15146672011-10-20 22:22:38 +02007512 elseif &ft != "netrw"
Bram Moolenaarff034192013-04-24 18:51:19 +02007513 setl ft=netrw
Bram Moolenaar15146672011-10-20 22:22:38 +02007514 endif
7515 endif
7516
Bram Moolenaaradc21822011-04-01 18:03:16 +02007517 keepj call s:NetrwSafeOptions()
Bram Moolenaarff034192013-04-24 18:51:19 +02007518 set noro ma
7519" call Decho("(PerformListing) setl noro ma bh=".&bh)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007520
7521" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
Bram Moolenaarff034192013-04-24 18:51:19 +02007522" call Decho("(PerformListing) (netrw) Processing your browsing request...")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007523" endif " Decho
7524
7525" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
7526 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
7527 " force a refresh for tree listings
Bram Moolenaarff034192013-04-24 18:51:19 +02007528" call Decho("(PerformListing) force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007529 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007530 endif
7531
7532 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02007533 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007534
7535 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007536 if g:netrw_banner
Bram Moolenaarff034192013-04-24 18:51:19 +02007537" call Decho("(PerformListing) set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007538 keepj call setline(1,'" ============================================================================')
7539 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
7540 keepj call setline(3,'" '.b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007541 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007542 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007543 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007544 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01007545 let w:netrw_bannercnt= 1
7546 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007547
7548 let sortby= g:netrw_sort_by
7549 if g:netrw_sort_direction =~ "^r"
7550 let sortby= sortby." reversed"
7551 endif
7552
7553 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007554 if g:netrw_banner
Bram Moolenaarff034192013-04-24 18:51:19 +02007555" call Decho("(PerformListing) handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007556 if g:netrw_sort_by =~ "^n"
Bram Moolenaarff034192013-04-24 18:51:19 +02007557" call Decho("(PerformListing) directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007558 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007559 keepj put ='\" Sorted by '.sortby
7560 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01007561 let w:netrw_bannercnt= w:netrw_bannercnt + 2
7562 else
Bram Moolenaarff034192013-04-24 18:51:19 +02007563" call Decho("(PerformListing) directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007564 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007565 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01007566 let w:netrw_bannercnt= w:netrw_bannercnt + 1
7567 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007568 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007569 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007570
7571 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01007572 if g:netrw_banner
7573 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
Bram Moolenaarff034192013-04-24 18:51:19 +02007574" call Decho("(PerformListing) show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007575 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01007576 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007577 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007578 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007579 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007580 endif
7581 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007582 else
Bram Moolenaarff034192013-04-24 18:51:19 +02007583" call Decho("(PerformListing) s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007584 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007585 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007586 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007587
7588 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01007589 if g:netrw_banner
Bram Moolenaarff034192013-04-24 18:51:19 +02007590" 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 +01007591 if g:netrw_list_hide != "" && g:netrw_hide
7592 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007593 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007594 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007595 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01007596 endif
7597 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00007598 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007599 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007600 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
7601 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01007602 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00007603 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007604
7605 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01007606 if g:netrw_banner
7607 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007608 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02007609" call Decho("(PerformListing) bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007610 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007611
Bram Moolenaar446cb832008-06-24 21:56:24 +00007612 " get list of files
Bram Moolenaarff034192013-04-24 18:51:19 +02007613" call Decho("(PerformListing) Get list of files - islocal=".a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007614 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02007615 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007616 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02007617 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007618 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02007619" call Decho("(PerformListing) g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007620
7621 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5b435d62012-04-05 17:33:26 +02007622 if !exists("w:netrw_bannercnt")
7623 let w:netrw_bannercnt= 0
7624 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007625 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02007626" call Decho("(PerformListing) manipulate directory listing (hide)")
7627" call Decho("(PerformListing) g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007628 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007629 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007630 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007631 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaarff034192013-04-24 18:51:19 +02007632" call Decho("(PerformListing) manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007633
7634 if g:netrw_sort_by =~ "^n"
7635 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02007636 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007637
Bram Moolenaar5c736222010-01-06 20:54:52 +01007638 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02007639" call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007640 if g:netrw_sort_direction =~ 'n'
7641 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007642 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007643 else
7644 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007645 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007646 endif
7647 endif
7648 " remove priority pattern prefix
Bram Moolenaarff034192013-04-24 18:51:19 +02007649" call Decho("(PerformListing) remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007650 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007651 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007652
7653 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01007654 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaarff034192013-04-24 18:51:19 +02007655" call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007656 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007657" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007658 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007659 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007660" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007661 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00007662 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007663 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007664 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007665 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007666 endif
7667
7668 elseif g:netrw_sort_direction =~ 'r'
7669" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007670 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007671 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01007672 call histdel("/",-1)
7673 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007674 endif
7675 endif
7676
7677 " convert to wide/tree listing {{{3
Bram Moolenaarff034192013-04-24 18:51:19 +02007678" call Decho("(PerformListing) modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007679 keepj call s:NetrwWideListing()
7680 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007681
Bram Moolenaar5c736222010-01-06 20:54:52 +01007682 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007683 " place cursor on the top-left corner of the file listing
Bram Moolenaarff034192013-04-24 18:51:19 +02007684" call Decho("(PerformListing) place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007685 exe 'sil! keepj '.w:netrw_bannercnt
7686 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007687 endif
7688
7689 " record previous current directory
7690 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaarff034192013-04-24 18:51:19 +02007691" call Decho("(PerformListing) record netrw_prvdir<".w:netrw_prvdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007692
7693 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02007694 keepj call s:SetBufWinVars()
7695 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007696
7697 " set display to netrw display settings
Bram Moolenaarff034192013-04-24 18:51:19 +02007698" call Decho("(PerformListing) set display to netrw display settings (".g:netrw_bufsettings.")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007699 exe "setl ".g:netrw_bufsettings
Bram Moolenaar97d62492012-11-15 21:28:22 +01007700 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaarff034192013-04-24 18:51:19 +02007701" call Decho("(PerformListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
Bram Moolenaar97d62492012-11-15 21:28:22 +01007702 exe "setl ts=".(g:netrw_maxfilenamelen+1)
7703 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007704 if exists("s:treecurpos")
7705
Bram Moolenaaradc21822011-04-01 18:03:16 +02007706 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007707 unlet s:treecurpos
7708 endif
7709
7710" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
7711endfun
7712
7713" ---------------------------------------------------------------------
7714" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007715fun! s:SetupNetrwStatusLine(statline)
7716" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
7717
7718 if !exists("s:netrw_setup_statline")
7719 let s:netrw_setup_statline= 1
7720" call Decho("do first-time status line setup")
7721
7722 if !exists("s:netrw_users_stl")
7723 let s:netrw_users_stl= &stl
7724 endif
7725 if !exists("s:netrw_users_ls")
7726 let s:netrw_users_ls= &laststatus
7727 endif
7728
7729 " set up User9 highlighting as needed
7730 let keepa= @a
7731 redir @a
7732 try
7733 hi User9
7734 catch /^Vim\%((\a\+)\)\=:E411/
7735 if &bg == "dark"
7736 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
7737 else
7738 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
7739 endif
7740 endtry
7741 redir END
7742 let @a= keepa
7743 endif
7744
7745 " set up status line (may use User9 highlighting)
7746 " insure that windows have a statusline
7747 " make sure statusline is displayed
7748 let &stl=a:statline
Bram Moolenaarff034192013-04-24 18:51:19 +02007749 setl laststatus=2
Bram Moolenaar9964e462007-05-05 17:54:07 +00007750" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007751 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00007752
7753" call Dret("SetupNetrwStatusLine : stl=".&stl)
7754endfun
7755
7756" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007757" Remote Directory Browsing Support: {{{1
7758" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00007759
7760" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00007761" s:NetrwRemoteListing: {{{2
7762fun! s:NetrwRemoteListing()
7763" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00007764
Bram Moolenaar446cb832008-06-24 21:56:24 +00007765 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007766
Bram Moolenaar446cb832008-06-24 21:56:24 +00007767 " sanity check:
7768 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
7769" call Decho("b:netrw_method=".b:netrw_method)
7770 if !executable("ftp")
7771 if !exists("g:netrw_quiet")
7772 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
7773 endif
7774 call s:NetrwOptionRestore("w:")
7775" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00007776 return
7777 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007778
7779 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
7780 if !exists("g:netrw_quiet")
7781 if g:netrw_list_cmd == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007782 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007783 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007784 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 +00007785 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007786 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007787
Bram Moolenaaradc21822011-04-01 18:03:16 +02007788 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007789" call Dret("s:NetrwRemoteListing")
7790 return
7791 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007792
Bram Moolenaar446cb832008-06-24 21:56:24 +00007793 if exists("b:netrw_method")
7794" call Decho("setting w:netrw_method<".b:netrw_method.">")
7795 let w:netrw_method= b:netrw_method
7796 endif
7797
7798 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007799 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007800" call Decho("use ftp to get remote file listing")
7801 let s:method = "ftp"
7802 let listcmd = g:netrw_ftp_list_cmd
7803 if g:netrw_sort_by =~ '^t'
7804 let listcmd= g:netrw_ftp_timelist_cmd
7805 elseif g:netrw_sort_by =~ '^s'
7806 let listcmd= g:netrw_ftp_sizelist_cmd
7807 endif
7808" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
7809 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007810" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007811
7812 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
7813 " shorten the listing
7814" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007815 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007816
7817 " cleanup
7818 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007819 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007820 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007821 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007822 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007823 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007824
7825 " if there's no ../ listed, then put ./ and ../ in
7826 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007827 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar97d62492012-11-15 21:28:22 +01007828 let line2= search('\.\.\/\%(\s\|$\)','cnW')
7829" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007830 if line2 == 0
7831" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007832 sil! keepj put='../'
7833 sil! keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007834 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007835 exe "sil! keepj ".line1
7836 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007837
7838" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
7839 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7840" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007841 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 +02007842 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007843 else " normal ftp cleanup
7844" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007845 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
7846 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
7847 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007848 keepj call histdel("/",-1)
7849 keepj call histdel("/",-1)
7850 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007851 endif
7852 endif
7853
7854 else
7855 " use ssh to get remote file listing {{{3
7856" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
7857 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
7858" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
7859 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007860" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007861 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007862 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007863 sil! keepj g/^Listing directory/keepj d
7864 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
7865 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007866 keepj call histdel("/",-1)
7867 keepj call histdel("/",-1)
7868 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007869 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007870 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007871 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007872 endif
7873 else
7874 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007875" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar15146672011-10-20 22:22:38 +02007876 exe "sil! keepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007877 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02007878" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007879 exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007880" call Decho("listcmd<".listcmd."> path<".s:path.">")
7881 endif
7882 endif
7883
7884 " cleanup
7885 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007886" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007887 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007888 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007889 endif
7890 endif
7891
7892 if w:netrw_liststyle == s:LONGLIST
7893 " do a long listing; these substitutions need to be done prior to sorting {{{3
7894" call Decho("fix long listing:")
7895
7896 if s:method == "ftp"
7897 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007898 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007899 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007900 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007901 endwhile
7902 " if there's no ../ listed, then put ./ and ../ in
7903 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007904 sil! keepj 1
7905 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007906 let line2= line(".")
7907 if line2 == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007908 exe 'sil! keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007909 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007910 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007911 endif
7912 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007913 exe "sil! keepj ".line1
7914 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007915 endif
7916
7917 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7918" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007919 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 +00007920 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
7921" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007922 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
7923 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
7924 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02007925 keepj call histdel("/",-1)
7926 keepj call histdel("/",-1)
7927 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007928 endif
7929 endif
7930
7931" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007932" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007933" endif " Decho
7934" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007935endfun
7936
Bram Moolenaar446cb832008-06-24 21:56:24 +00007937" ---------------------------------------------------------------------
7938" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
7939fun! s:NetrwRemoteRm(usrhost,path) range
7940" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
7941" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7942 let svpos= netrw#NetrwSavePosn()
7943
7944 let all= 0
7945 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7946 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01007947" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007948 for fname in s:netrwmarkfilelist_{bufnr("%")}
7949 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
7950 if ok =~ 'q\%[uit]'
7951 break
7952 elseif ok =~ 'a\%[ll]'
7953 let all= 1
7954 endif
7955 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007956 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007957
7958 else
7959 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01007960" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007961
7962 " preparation for removing multiple files/directories
7963 let ctr= a:firstline
7964
7965 " remove multiple files and directories
7966 while ctr <= a:lastline
Bram Moolenaar15146672011-10-20 22:22:38 +02007967 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007968 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
7969 if ok =~ 'q\%[uit]'
7970 break
7971 elseif ok =~ 'a\%[ll]'
7972 let all= 1
7973 endif
7974 let ctr= ctr + 1
7975 endwhile
7976 endif
7977
7978 " refresh the (remote) directory listing
7979" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007980 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7981 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007982
7983" call Dret("s:NetrwRemoteRm")
7984endfun
7985
7986" ---------------------------------------------------------------------
7987" s:NetrwRemoteRmFile: {{{2
7988fun! s:NetrwRemoteRmFile(path,rmfile,all)
7989" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
7990
7991 let all= a:all
7992 let ok = ""
7993
7994 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
7995 " attempt to remove file
7996" call Decho("attempt to remove file (all=".all.")")
7997 if !all
7998 echohl Statement
7999" call Decho("case all=0:")
8000 call inputsave()
8001 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8002 call inputrestore()
8003 echohl NONE
8004 if ok == ""
8005 let ok="no"
8006 endif
8007 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8008 if ok =~ 'a\%[ll]'
8009 let all= 1
8010 endif
8011 endif
8012
8013 if all || ok =~ 'y\%[es]' || ok == ""
8014" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
8015 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8016" call Decho("case ftp:")
8017 let path= a:path
8018 if path =~ '^\a\+://'
8019 let path= substitute(path,'^\a\+://[^/]\+/','','')
8020 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008021 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008022 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
8023 else
8024" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
8025 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
8026" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8027 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008028 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008029 let ok="q"
8030 else
8031 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8032" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8033" call Decho("remotedir<".remotedir.">")
8034" call Decho("rmfile<".a:rmfile.">")
8035 if remotedir != ""
8036 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
8037 else
8038 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
8039 endif
8040" call Decho("call system(".netrw_rm_cmd.")")
8041 let ret= system(netrw_rm_cmd)
8042 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008043 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008044 endif
8045" call Decho("returned=".ret." errcode=".v:shell_error)
8046 endif
8047 endif
8048 elseif ok =~ 'q\%[uit]'
8049" call Decho("ok==".ok)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008050 endif
8051
8052 else
8053 " attempt to remove directory
8054" call Decho("attempt to remove directory")
8055 if !all
8056 call inputsave()
8057 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8058 call inputrestore()
8059 if ok == ""
8060 let ok="no"
8061 endif
8062 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8063 if ok =~ 'a\%[ll]'
8064 let all= 1
8065 endif
8066 endif
8067
8068 if all || ok =~ 'y\%[es]' || ok == ""
8069 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008070 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008071 else
8072 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01008073 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008074" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008075 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008076" call Decho("returned=".ret." errcode=".v:shell_error)
8077
8078 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008079" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008080 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 +00008081" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
8082 let ret= system(netrw_rmf_cmd)
8083" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008084
8085 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008086 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008087 endif
8088 endif
8089 endif
8090
8091 elseif ok =~ 'q\%[uit]'
Bram Moolenaarff034192013-04-24 18:51:19 +02008092" call Decho("ok==".ok)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008093 endif
8094 endif
8095
8096" call Dret("s:NetrwRemoteRmFile ".ok)
8097 return ok
8098endfun
8099
8100" ---------------------------------------------------------------------
8101" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
8102" This function assumes that a long listing will be received. Size, time,
8103" and reverse sorts will be requested of the server but not otherwise
8104" enforced here.
8105fun! s:NetrwRemoteFtpCmd(path,listcmd)
8106" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
8107" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
8108
8109 " because WinXX ftp uses unix style input
8110 let ffkeep= &ff
Bram Moolenaarff034192013-04-24 18:51:19 +02008111 setl ma ff=unix noro
8112" call Decho("setl ma ff=unix noro")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008113
8114 " clear off any older non-banner lines
8115 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02008116" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
8117 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008118
8119 ".........................................
8120 if w:netrw_method == 2 || w:netrw_method == 5
8121 " ftp + <.netrc>: Method #2
8122 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008123 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008124 endif
8125 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008126 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008127" call Decho("filter input: ".getline('.'))
8128 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008129 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008130" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
8131 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008132" 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 +02008133 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 +00008134 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008135" 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 +02008136 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 +00008137 endif
8138
8139 ".........................................
8140 elseif w:netrw_method == 3
8141 " ftp + machine,id,passwd,filename: Method #3
Bram Moolenaarff034192013-04-24 18:51:19 +02008142 setl ff=unix
Bram Moolenaar446cb832008-06-24 21:56:24 +00008143 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008144 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00008145 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008146 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00008147 endif
8148
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008149 " handle userid and password
8150 let host= substitute(g:netrw_machine,'\..*$','','')
8151" call Decho("host<".host.">")
8152 if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
8153 call NetUserPass("ftp:".host)
8154 endif
8155 if exists("g:netrw_uid") && g:netrw_uid != ""
8156 if exists("g:netrw_ftp") && g:netrw_ftp == 1
8157 keepj put =g:netrw_uid
8158 if exists("s:netrw_passwd") && s:netrw_passwd != ""
8159 keepj put ='\"'.s:netrw_passwd.'\"'
8160 endif
8161 elseif exists("s:netrw_passwd")
8162 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
8163 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008164 endif
8165
8166 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008167 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008168 endif
8169 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008170 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00008171" call Decho("filter input: ".getline('.'))
8172 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008173 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008174
8175 " perform ftp:
8176 " -i : turns off interactive prompting from ftp
8177 " -n unix : DON'T use <.netrc>, even though it exists
8178 " -n win32: quit being obnoxious about password
8179" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008180" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
8181 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00008182
8183 ".........................................
8184 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008185 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008186 endif
8187
8188 " cleanup for Windows
8189 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008190 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02008191 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008192 endif
8193 if a:listcmd == "dir"
8194 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008195 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
8196 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02008197 keepj call histdel("/",-1)
8198 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008199 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008200 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008201 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008202 endif
8203 endif
8204
8205 " ftp's listing doesn't seem to include ./ or ../
8206 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008207 exe 'keepj '.w:netrw_bannercnt
8208 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008209 endif
8210 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008211 exe 'keepj '.w:netrw_bannercnt
8212 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008213 endif
8214
8215 " restore settings
8216 let &ff= ffkeep
8217" call Dret("NetrwRemoteFtpCmd")
8218endfun
8219
8220" ---------------------------------------------------------------------
8221" s:NetrwRemoteRename: rename a remote file or directory {{{2
8222fun! s:NetrwRemoteRename(usrhost,path) range
8223" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
8224
8225 " preparation for removing multiple files/directories
8226 let svpos = netrw#NetrwSavePosn()
8227 let ctr = a:firstline
8228 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
8229
8230 " rename files given by the markfilelist
8231 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8232 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8233" call Decho("oldname<".oldname.">")
8234 if exists("subfrom")
8235 let newname= substitute(oldname,subfrom,subto,'')
8236" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8237 else
8238 call inputsave()
8239 let newname= input("Moving ".oldname." to : ",oldname)
8240 call inputrestore()
8241 if newname =~ '^s/'
8242 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8243 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8244 let newname = substitute(oldname,subfrom,subto,'')
8245" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8246 endif
8247 endif
8248
8249 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008250 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008251 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008252 let oldname= shellescape(a:path.oldname)
8253 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008254" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8255 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008256 endif
8257
8258 endfor
8259 call s:NetrwUnMarkFile(1)
8260
8261 else
8262
8263 " attempt to rename files/directories
8264 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008265 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008266
8267 let oldname= s:NetrwGetWord()
8268" call Decho("oldname<".oldname.">")
8269
8270 call inputsave()
8271 let newname= input("Moving ".oldname." to : ",oldname)
8272 call inputrestore()
8273
8274 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8275 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
8276 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00008277 let oldname= shellescape(a:path.oldname)
8278 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008279" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8280 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008281 endif
8282
8283 let ctr= ctr + 1
8284 endwhile
8285 endif
8286
8287 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02008288 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8289 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008290
8291" call Dret("NetrwRemoteRename")
8292endfun
8293
8294" ---------------------------------------------------------------------
8295" Local Directory Browsing Support: {{{1
8296" ==========================================
8297
8298" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +01008299" netrw#FileUrlRead: handles reading file://* files {{{2
8300" Should accept: file://localhost/etc/fstab
8301" file:///etc/fstab
8302" file:///c:/WINDOWS/clock.avi
8303" file:///c|/WINDOWS/clock.avi
8304" file://localhost/c:/WINDOWS/clock.avi
8305" file://localhost/c|/WINDOWS/clock.avi
8306" file://c:/foo.txt
8307" file:///c:/foo.txt
8308" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
8309fun! netrw#FileUrlRead(fname)
8310" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8311 let fname = a:fname
8312 if fname =~ '^file://localhost/'
8313" call Decho('converting file://localhost/ -to- file:///')
8314 let fname= substitute(fname,'^file://localhost/','file:///','')
8315" call Decho("fname<".fname.">")
8316 endif
8317 if (has("win32") || has("win95") || has("win64") || has("win16"))
8318 if fname =~ '^file:///\=\a[|:]/'
8319" call Decho('converting file:///\a|/ -to- file://\a:/')
8320 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8321" call Decho("fname<".fname.">")
8322 endif
8323 endif
8324 let fname2396 = netrw#RFC2396(fname)
8325 let fname2396e= fnameescape(fname2396)
8326 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
8327 if (has("win32") || has("win95") || has("win64") || has("win16"))
8328" call Decho("windows exception for plainfname")
8329 if plainfname =~ '^/\+\a:'
8330" call Decho('removing leading "/"s')
8331 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8332 endif
8333 endif
8334" call Decho("fname2396<".fname2396.">")
8335" call Decho("plainfname<".plainfname.">")
8336 exe "sil doau BufReadPre ".fname2396e
8337 exe 'keepj r '.plainfname
Bram Moolenaarff034192013-04-24 18:51:19 +02008338 exe 'sil! bdelete '.plainfname
8339 exe 'keepalt file! '.plainfname
Bram Moolenaar97d62492012-11-15 21:28:22 +01008340 keepj 1d
8341" call Decho("(FileUrlRead) setl nomod")
8342 setl nomod
8343" call Decho("(FileUrlRead) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8344" call Dret("netrw#FileUrlRead")
8345 exe "sil doau BufReadPost ".fname2396e
8346endfun
8347
8348" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008349" netrw#LocalBrowseCheck: {{{2
8350fun! netrw#LocalBrowseCheck(dirname)
8351 " unfortunate interaction -- split window debugging can't be
8352 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
8353 " event triggers another call to LocalBrowseCheck() when attempts
8354 " to write to the DBG buffer are made.
8355 " The &ft == "netrw" test was installed because the BufEnter event
8356 " would hit when re-entering netrw windows, creating unexpected
8357 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaarff034192013-04-24 18:51:19 +02008358" call Decho("(LocalBrowseCheck) isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008359" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar97d62492012-11-15 21:28:22 +01008360 let ykeep= @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008361 if isdirectory(a:dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02008362" call Decho("(LocalBrowseCheck) 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 +01008363 let svposn= netrw#NetrwSavePosn()
8364 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008365 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8366 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008367 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008368 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8369 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008370 elseif exists("s:treeforceredraw")
8371 unlet s:treeforceredraw
Bram Moolenaarff034192013-04-24 18:51:19 +02008372 sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8373 keepalt call netrw#NetrwRestorePosn(svposn)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008374 endif
8375 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008376 " following code wipes out currently unused netrw buffers
8377 " IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
8378 " AND IF the listing style is not a tree listing
8379 if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
8380 let ibuf = 1
8381 let buflast = bufnr("$")
8382 while ibuf <= buflast
8383 if bufwinnr(ibuf) == -1 && isdirectory(bufname(ibuf))
Bram Moolenaarff034192013-04-24 18:51:19 +02008384 exe "sil! keepalt ".ibuf."bw!"
Bram Moolenaar97d62492012-11-15 21:28:22 +01008385 endif
8386 let ibuf= ibuf + 1
8387 endwhile
8388 endif
8389 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008390 " not a directory, ignore it
8391endfun
8392
8393" ---------------------------------------------------------------------
8394" s:LocalListing: does the job of "ls" for local directories {{{2
8395fun! s:LocalListing()
8396" call Dfunc("s:LocalListing()")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008397" call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8398" call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008399
Bram Moolenaarff034192013-04-24 18:51:19 +02008400" 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
8401" 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 +00008402
8403 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02008404 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01008405 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaarff034192013-04-24 18:51:19 +02008406 let filelist = glob(s:ComposePath(dirname,"*"),0,1)
8407 let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1)
8408" call Decho("(LocalListing) filelist=".filelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008409
Bram Moolenaarff034192013-04-24 18:51:19 +02008410 if index(filelist,'..') == -1 && b:netrw_curdir != '/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008411 " include ../ in the glob() entry if its missing
Bram Moolenaarff034192013-04-24 18:51:19 +02008412" call Decho("(LocalListing) forcibly tacking on \"..\"")
8413 let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
8414" call Decho("(LocalListing) filelist=".string(filelist))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008415 endif
8416
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008417" call Decho("(LocalListing) (before while) dirname<".dirname.">")
8418" call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">")
Bram Moolenaarff034192013-04-24 18:51:19 +02008419" call Decho("(LocalListing) (before while) filelist=".string(filelist))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008420
8421 if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
Bram Moolenaarff034192013-04-24 18:51:19 +02008422 let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
8423 let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
8424" call Decho("(LocalListing) dynamic_maxfilenamelen: filenames =".string(filelistcopy))
8425" call Decho("(LocalListing) dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008426 endif
8427
Bram Moolenaarff034192013-04-24 18:51:19 +02008428 for filename in filelist
8429" call Decho("(LocalListing) ")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008430" call Decho("(LocalListing) (while) filename<".filename.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008431
8432 if getftype(filename) == "link"
8433 " indicate a symbolic link
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008434" call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008435 let pfile= filename."@"
8436
8437 elseif getftype(filename) == "socket"
8438 " indicate a socket
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008439" call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008440 let pfile= filename."="
8441
8442 elseif getftype(filename) == "fifo"
8443 " indicate a fifo
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008444" call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008445 let pfile= filename."|"
8446
8447 elseif isdirectory(filename)
8448 " indicate a directory
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008449" call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008450 let pfile= filename."/"
8451
8452 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
8453 if (has("win32") || has("win95") || has("win64") || has("win16"))
8454 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
8455 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008456" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008457 let pfile= filename."*"
8458 else
8459 " normal file
8460 let pfile= filename
8461 endif
8462 elseif executable(filename)
8463 " indicate an executable
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008464" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008465 let pfile= filename."*"
8466 else
8467 " normal file
8468 let pfile= filename
8469 endif
8470
8471 else
8472 " normal file
8473 let pfile= filename
8474 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008475" call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008476
8477 if pfile =~ '//$'
8478 let pfile= substitute(pfile,'//$','/','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008479" call Decho("(LocalListing) change // to /: pfile<".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008480 endif
8481 let pfile= strpart(pfile,dirnamelen)
8482 let pfile= substitute(pfile,'^[/\\]','','e')
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008483" call Decho("(LocalListing) filename<".filename.">")
8484" call Decho("(LocalListing) pfile <".pfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008485
8486 if w:netrw_liststyle == s:LONGLIST
8487 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008488 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00008489 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008490" call Decho("(LocalListing) sz=".sz." fsz=".fsz)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008491 endif
8492
8493 if g:netrw_sort_by =~ "^t"
8494 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaarff034192013-04-24 18:51:19 +02008495" call Decho("(LocalListing) getftime(".filename.")=".getftime(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008496 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008497 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008498" call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008499 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008500 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008501
8502 elseif g:netrw_sort_by =~ "^s"
8503 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008504" call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008505 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008506 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008507" call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008508 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008509 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008510
8511 else
8512 " sort by name
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008513" call Decho("(LocalListing) exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008514 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008515 endif
Bram Moolenaarff034192013-04-24 18:51:19 +02008516 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00008517
8518 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008519 sil! keepj g/^$/d
8520 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01008521 call histdel("/",-1)
Bram Moolenaar97d62492012-11-15 21:28:22 +01008522" call Decho("(LocalListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
8523 exe "setl ts=".(g:netrw_maxfilenamelen+1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008524
8525" call Dret("s:LocalListing")
8526endfun
8527
8528" ---------------------------------------------------------------------
8529" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
8530" performed any shell command. The idea is to cause all local-browsing
8531" buffers to be refreshed after a user has executed some shell command,
8532" on the chance that s/he removed/created a file/directory with it.
8533fun! s:LocalBrowseShellCmdRefresh()
8534" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
8535 " determine which buffers currently reside in a tab
8536 if !exists("s:netrw_browselist")
8537" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
8538 return
8539 endif
8540 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008541" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008542 return
8543 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008544 if exists("s:locbrowseshellcmd")
8545 if s:locbrowseshellcmd
8546 let s:locbrowseshellcmd= 0
8547" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
8548 return
8549 endif
8550 let s:locbrowseshellcmd= 0
8551 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008552 let itab = 1
8553 let buftablist = []
Bram Moolenaar97d62492012-11-15 21:28:22 +01008554 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008555 while itab <= tabpagenr("$")
8556 let buftablist = buftablist + tabpagebuflist()
8557 let itab = itab + 1
8558 tabn
8559 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +02008560" call Decho("(LocalBrowseShellCmdRefresh) buftablist".string(buftablist))
8561" call Decho("(LocalBrowseShellCmdRefresh) s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008562 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
8563 " | refresh any netrw window
8564 " | wipe out any non-displaying netrw buffer
8565 let curwin = winnr()
8566 let ibl = 0
8567 for ibuf in s:netrw_browselist
Bram Moolenaarff034192013-04-24 18:51:19 +02008568" call Decho("(LocalBrowseShellCmdRefresh) bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008569 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
8570 " wipe out any non-displaying netrw buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02008571" call Decho("(LocalBrowseShellCmdRefresh) wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008572 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008573 call remove(s:netrw_browselist,ibl)
Bram Moolenaarff034192013-04-24 18:51:19 +02008574" call Decho("(LocalBrowseShellCmdRefresh) browselist=".string(s:netrw_browselist))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008575 continue
8576 elseif index(tabpagebuflist(),ibuf) != -1
8577 " refresh any netrw buffer
Bram Moolenaarff034192013-04-24 18:51:19 +02008578" call Decho("(LocalBrowseShellCmdRefresh) refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008579 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008580 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008581 endif
8582 let ibl= ibl + 1
8583 endfor
8584 exe curwin."wincmd w"
Bram Moolenaar97d62492012-11-15 21:28:22 +01008585 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008586
8587" call Dret("LocalBrowseShellCmdRefresh")
8588endfun
8589
8590" ---------------------------------------------------------------------
Bram Moolenaar97d62492012-11-15 21:28:22 +01008591" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
8592"
8593" g:netrw_ Directory Is
8594" fastbrowse Local Remote
8595" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
8596" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
8597" fast 2 H H
8598"
8599" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
8600" Hiding a buffer means that it will be re-used when examined, hence "fast".
8601" (re-using a buffer may not be as accurate)
8602fun! s:LocalFastBrowser()
8603" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse." s:netrw_browser_shellcmd ".(exists("s:netrw_browser_shellcmd")? "exists" : "does not exist"))
8604
8605 " initialize browselist, a list of buffer numbers that the local browser has used
8606 if !exists("s:netrw_browselist")
Bram Moolenaarff034192013-04-24 18:51:19 +02008607" call Decho("(LocalFastBrowser) initialize s:netrw_browselist")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008608 let s:netrw_browselist= []
8609 endif
8610
8611 " append current buffer to fastbrowse list
8612 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
Bram Moolenaarff034192013-04-24 18:51:19 +02008613" call Decho("(LocalFastBrowser) appendng current buffer to browselist")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008614 call add(s:netrw_browselist,bufnr("%"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008615" call Decho("(LocalFastBrowser) browselist=".string(s:netrw_browselist))
Bram Moolenaar97d62492012-11-15 21:28:22 +01008616 endif
8617
8618 " enable autocmd events to handle refreshing/removing local browser buffers
8619 " If local browse buffer is currently showing: refresh it
8620 " If local browse buffer is currently hidden : wipe it
8621 " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing
8622 " =1 : medium speed, re-use directory listing for remote only
8623 " =2 : fast speed, always re-use directory listing when possible
8624 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
Bram Moolenaarff034192013-04-24 18:51:19 +02008625" call Decho("(LocalFastBrowser) setting up local-browser shell command refresh")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008626 let s:netrw_browser_shellcmd= 1
8627 augroup AuNetrwShellCmd
8628 au!
8629 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarff034192013-04-24 18:51:19 +02008630" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008631 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
8632 else
8633 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaarff034192013-04-24 18:51:19 +02008634" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008635 endif
8636 augroup END
8637 endif
8638
8639 " user must have changed fastbrowse to its fast setting, so remove
8640 " the associated autocmd events
8641 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
Bram Moolenaarff034192013-04-24 18:51:19 +02008642" call Decho("(LocalFastBrowser) remove AuNetrwShellCmd autcmd group")
Bram Moolenaar97d62492012-11-15 21:28:22 +01008643 unlet s:netrw_browser_shellcmd
8644 augroup AuNetrwShellCmd
8645 au!
8646 augroup END
8647 augroup! AuNetrwShellCmd
8648 endif
8649
8650" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
8651endfun
8652
8653" ---------------------------------------------------------------------
8654" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
8655fun! s:NetrwLocalExecute(cmd)
8656" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
8657 let ykeep= @@
8658 " sanity check
8659 if !executable(a:cmd)
8660 call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
8661 let @@= ykeep
8662" call Dret("s:NetrwLocalExecute")
8663 return
8664 endif
8665
8666 let optargs= input(":!".a:cmd,"","file")
8667" call Decho("optargs<".optargs.">")
8668 let result= system(a:cmd.optargs)
8669" call Decho(result)
8670
8671 " strip any ansi escape sequences off
8672 let result = substitute(result,"\e\\[[0-9;]*m","","g")
8673
8674 " show user the result(s)
8675 echomsg result
8676 let @@= ykeep
8677
8678" call Dret("s:NetrwLocalExecute")
8679endfun
8680
8681" ---------------------------------------------------------------------
8682" s:NetrwLocalRename: rename a remote file or directory {{{2
8683fun! s:NetrwLocalRename(path) range
8684" call Dfunc("NetrwLocalRename(path<".a:path.">)")
8685
8686 " preparation for removing multiple files/directories
8687 let ykeep = @@
8688 let ctr = a:firstline
8689 let svpos = netrw#NetrwSavePosn()
8690
8691 " rename files given by the markfilelist
8692 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8693 for oldname in s:netrwmarkfilelist_{bufnr("%")}
8694" call Decho("oldname<".oldname.">")
8695 if exists("subfrom")
8696 let newname= substitute(oldname,subfrom,subto,'')
8697" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8698 else
8699 call inputsave()
8700 let newname= input("Moving ".oldname." to : ",oldname)
8701 call inputrestore()
8702 if newname =~ '^s/'
8703 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8704 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8705" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8706 let newname = substitute(oldname,subfrom,subto,'')
8707 endif
8708 endif
8709 call rename(oldname,newname)
8710 endfor
8711 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
8712
8713 else
8714
8715 " attempt to rename files/directories
8716 while ctr <= a:lastline
8717 exe "keepj ".ctr
8718
8719 " sanity checks
8720 if line(".") < w:netrw_bannercnt
8721 let ctr= ctr + 1
8722 continue
8723 endif
8724 let curword= s:NetrwGetWord()
8725 if curword == "./" || curword == "../"
8726 let ctr= ctr + 1
8727 continue
8728 endif
8729
8730 keepj norm! 0
8731 let oldname= s:ComposePath(a:path,curword)
8732" call Decho("oldname<".oldname.">")
8733
8734 call inputsave()
8735 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
8736 call inputrestore()
8737
8738 call rename(oldname,newname)
8739" call Decho("renaming <".oldname."> to <".newname.">")
8740
8741 let ctr= ctr + 1
8742 endwhile
8743 endif
8744
8745 " refresh the directory
8746" call Decho("refresh the directory listing")
8747 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8748 keepj call netrw#NetrwRestorePosn(svpos)
8749 let @@= ykeep
8750
8751" call Dret("NetrwLocalRename")
8752endfun
8753
8754" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008755" s:NetrwLocalRm: {{{2
8756fun! s:NetrwLocalRm(path) range
8757" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
8758" call Decho("firstline=".a:firstline." lastline=".a:lastline)
8759
8760 " preparation for removing multiple files/directories
Bram Moolenaar97d62492012-11-15 21:28:22 +01008761 let ykeep = @@
Bram Moolenaar446cb832008-06-24 21:56:24 +00008762 let ret = 0
8763 let all = 0
8764 let svpos = netrw#NetrwSavePosn()
8765
8766 if exists("s:netrwmarkfilelist_{bufnr('%')}")
8767 " remove all marked files
8768" call Decho("remove all marked files")
8769 for fname in s:netrwmarkfilelist_{bufnr("%")}
8770 let ok= s:NetrwLocalRmFile(a:path,fname,all)
8771 if ok =~ 'q\%[uit]' || ok == "no"
8772 break
8773 elseif ok =~ 'a\%[ll]'
8774 let all= 1
8775 endif
8776 endfor
8777 call s:NetrwUnMarkFile(1)
8778
8779 else
8780 " remove (multiple) files and directories
8781" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
8782
8783 let ctr = a:firstline
8784 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008785 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00008786
8787 " sanity checks
8788 if line(".") < w:netrw_bannercnt
8789 let ctr= ctr + 1
8790 continue
8791 endif
8792 let curword= s:NetrwGetWord()
8793 if curword == "./" || curword == "../"
8794 let ctr= ctr + 1
8795 continue
8796 endif
8797 let ok= s:NetrwLocalRmFile(a:path,curword,all)
8798 if ok =~ 'q\%[uit]' || ok == "no"
8799 break
8800 elseif ok =~ 'a\%[ll]'
8801 let all= 1
8802 endif
8803 let ctr= ctr + 1
8804 endwhile
8805 endif
8806
8807 " refresh the directory
8808" call Decho("bufname<".bufname("%").">")
8809 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02008810 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8811 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008812 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01008813 let @@= ykeep
Bram Moolenaar446cb832008-06-24 21:56:24 +00008814
8815" call Dret("s:NetrwLocalRm")
8816endfun
8817
8818" ---------------------------------------------------------------------
8819" s:NetrwLocalRmFile: remove file fname given the path {{{2
8820" Give confirmation prompt unless all==1
8821fun! s:NetrwLocalRmFile(path,fname,all)
8822" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
8823
8824 let all= a:all
8825 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008826 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008827 let rmfile= s:ComposePath(a:path,a:fname)
8828" call Decho("rmfile<".rmfile.">")
8829
8830 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
8831 " attempt to remove file
8832" call Decho("attempt to remove file<".rmfile.">")
8833 if !all
8834 echohl Statement
8835 call inputsave()
8836 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8837 call inputrestore()
8838 echohl NONE
8839 if ok == ""
8840 let ok="no"
8841 endif
8842" call Decho("response: ok<".ok.">")
8843 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8844" call Decho("response: ok<".ok."> (after sub)")
8845 if ok =~ 'a\%[ll]'
8846 let all= 1
8847 endif
8848 endif
8849
8850 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00008851 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008852" call Decho("errcode=".v:shell_error." ret=".ret)
8853 endif
8854
8855 else
8856 " attempt to remove directory
8857 if !all
8858 echohl Statement
8859 call inputsave()
8860 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8861 call inputrestore()
8862 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8863 if ok == ""
8864 let ok="no"
8865 endif
8866 if ok =~ 'a\%[ll]'
8867 let all= 1
8868 endif
8869 endif
8870 let rmfile= substitute(rmfile,'[\/]$','','e')
8871
8872 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008873" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')')
8874 call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008875" call Decho("v:shell_error=".v:shell_error)
8876
8877 if v:shell_error != 0
8878" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008879 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008880" call Decho("errcode=".errcode)
8881
8882 if errcode != 0
8883 if has("unix")
8884" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008885 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008886 if v:shell_error != 0 && !exists("g:netrw_quiet")
8887 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
8888 let ok="no"
8889 endif
8890 elseif !exists("g:netrw_quiet")
8891 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
8892 let ok="no"
8893 endif
8894 endif
8895 endif
8896 endif
8897 endif
8898
8899" call Dret("s:NetrwLocalRmFile ".ok)
8900 return ok
8901endfun
8902
8903" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008904" Support Functions: {{{1
8905
Bram Moolenaar488c6512005-08-11 20:09:58 +00008906" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008907" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
8908fun! netrw#NetrwRestorePosn(...)
8909" 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))
8910 let eikeep= &ei
8911 set ei=all
8912 if expand("%") == "NetrwMessage"
Bram Moolenaarff034192013-04-24 18:51:19 +02008913 if exists("s:winBeforeErr")
8914 exe s:winBeforeErr."wincmd w"
8915 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00008916 endif
8917
8918 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02008919 exe "keepj ".a:1
Bram Moolenaarc236c162008-07-13 17:41:49 +00008920 endif
8921
8922 " restore window
8923 if exists("w:netrw_winnr")
Bram Moolenaarff034192013-04-24 18:51:19 +02008924" call Decho("(NetrwRestorePosn) restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008925 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008926 endif
8927 if v:shell_error == 0
8928 " as suggested by Bram M: redraw on no error
8929 " allows protocol error messages to remain visible
8930" redraw!
8931 endif
8932
8933 " restore top-of-screen line
8934 if exists("w:netrw_hline")
Bram Moolenaarff034192013-04-24 18:51:19 +02008935" call Decho("(NetrwRestorePosn) restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008936 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008937 endif
8938
8939 " restore position
8940 if exists("w:netrw_line") && exists("w:netrw_col")
Bram Moolenaarff034192013-04-24 18:51:19 +02008941" call Decho("(NetrwRestorePosn) restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008942 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008943 endif
8944
8945 let &ei= eikeep
Bram Moolenaarff034192013-04-24 18:51:19 +02008946" call Dret("netrw#NetrwRestorePosn : line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
Bram Moolenaarc236c162008-07-13 17:41:49 +00008947endfun
8948
8949" ---------------------------------------------------------------------
8950" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
8951fun! netrw#NetrwSavePosn()
Bram Moolenaarff034192013-04-24 18:51:19 +02008952" call Dfunc("netrw#NetrwSavePosn() line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
Bram Moolenaarc236c162008-07-13 17:41:49 +00008953 " Save current line and column
8954 let w:netrw_winnr= winnr()
8955 let w:netrw_line = line(".")
8956 let w:netrw_col = virtcol(".")
Bram Moolenaarff034192013-04-24 18:51:19 +02008957" call Decho("(NetrwSavePosn) currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008958
8959 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008960 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008961 let w:netrw_hline= line(".")
8962
8963 " set up string holding position parameters
8964 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
8965
Bram Moolenaaradc21822011-04-01 18:03:16 +02008966 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008967" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
8968 return ret
8969endfun
8970
8971" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008972" netrw#RFC2396: converts %xx into characters {{{2
8973fun! netrw#RFC2396(fname)
8974" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
8975 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
8976" call Dret("netrw#RFC2396 ".fname)
8977 return fname
8978endfun
8979
8980" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008981" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
8982fun! s:ComposePath(base,subdir)
8983" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
8984
Bram Moolenaar5b435d62012-04-05 17:33:26 +02008985 if has("amiga")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008986" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008987 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00008988 if ec != '/' && ec != ':'
8989 let ret = a:base . "/" . a:subdir
8990 else
8991 let ret = a:base . a:subdir
8992 endif
8993
8994 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8995" call Decho("windows")
8996 let ret= a:subdir
8997
Bram Moolenaar5c736222010-01-06 20:54:52 +01008998 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8999" call Decho("windows")
9000 if a:base =~ '[/\\]$'
9001 let ret= a:base.a:subdir
9002 else
9003 let ret= a:base."/".a:subdir
9004 endif
9005
Bram Moolenaarc236c162008-07-13 17:41:49 +00009006 elseif a:base =~ '^\a\+://'
9007" call Decho("remote linux/macos")
9008 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
9009 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
9010 if a:subdir == '../'
9011 if curpath =~ '[^/]/[^/]\+/$'
9012 let curpath= substitute(curpath,'[^/]\+/$','','')
9013 else
9014 let curpath=""
9015 endif
9016 let ret= urlbase.curpath
9017 else
9018 let ret= urlbase.curpath.a:subdir
9019 endif
9020" call Decho("urlbase<".urlbase.">")
9021" call Decho("curpath<".curpath.">")
9022" call Decho("ret<".ret.">")
9023
9024 else
9025" call Decho("local linux/macos")
9026 let ret = substitute(a:base."/".a:subdir,"//","/","g")
9027 if a:base =~ '^//'
9028 " keeping initial '//' for the benefit of network share listing support
9029 let ret= '/'.ret
9030 endif
9031 let ret= simplify(ret)
9032 endif
9033
9034" call Dret("s:ComposePath ".ret)
9035 return ret
9036endfun
9037
9038" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009039" s:FileReadable: o/s independent filereadable {{{2
9040fun! s:FileReadable(fname)
9041" call Dfunc("s:FileReadable(fname<".a:fname.">)")
9042
9043 if g:netrw_cygwin
9044 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
9045 else
9046 let ret= filereadable(a:fname)
9047 endif
9048
9049" call Dret("s:FileReadable ".ret)
9050 return ret
9051endfun
9052
9053" ---------------------------------------------------------------------
9054" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
9055" Places correct suffix on end of temporary filename,
9056" using the suffix provided with fname
9057fun! s:GetTempfile(fname)
9058" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
9059
9060 if !exists("b:netrw_tmpfile")
9061 " get a brand new temporary filename
9062 let tmpfile= tempname()
9063" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009064
Bram Moolenaarc236c162008-07-13 17:41:49 +00009065 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009066" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009067
Bram Moolenaar9964e462007-05-05 17:54:07 +00009068 " sanity check -- does the temporary file's directory exist?
9069 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009070" 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 +02009071 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00009072" call Dret("s:GetTempfile getcwd<".getcwd().">")
9073 return ""
9074 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009075
Bram Moolenaar9964e462007-05-05 17:54:07 +00009076 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01009077 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009078" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009079
Bram Moolenaar9964e462007-05-05 17:54:07 +00009080 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00009081 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00009082 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
9083 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009084 if !exists("+shellslash") || !&ssl
9085 let tmpfile = substitute(tmpfile,'/','\','g')
9086 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009087 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00009088 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00009089 endif
9090 let b:netrw_tmpfile= tmpfile
9091" call Decho("o/s dependent fixed tempname<".tmpfile.">")
9092 else
9093 " re-use temporary filename
9094 let tmpfile= b:netrw_tmpfile
9095" call Decho("tmpfile<".tmpfile."> re-using")
9096 endif
9097
9098 " use fname's suffix for the temporary file
9099 if a:fname != ""
9100 if a:fname =~ '\.[^./]\+$'
9101" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009102 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00009103 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009104 elseif a:fname =~ '.txz$'
9105 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009106 else
9107 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
9108 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009109" call Decho("suffix<".suffix.">")
9110 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
9111" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
9112 let tmpfile .= suffix
9113" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
9114 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
9115 endif
9116 endif
9117
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009118" 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 +00009119" call Dret("s:GetTempfile <".tmpfile.">")
9120 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00009121endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00009122
9123" ---------------------------------------------------------------------
9124" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00009125" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00009126fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009127" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009128 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
9129 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00009130 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009131 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00009132 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00009133 else
9134 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
9135 endif
9136" call Dret("s:MakeSshCmd <".sshcmd.">")
9137 return sshcmd
9138endfun
9139
9140" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009141" s:NetrwBMShow: {{{2
9142fun! s:NetrwBMShow()
9143" call Dfunc("s:NetrwBMShow()")
9144 redir => bmshowraw
9145 menu
9146 redir END
9147 let bmshowlist = split(bmshowraw,'\n')
9148 if bmshowlist != []
9149 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
9150 if bmshowfuncs != []
9151 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
9152 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02009153 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00009154 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009155 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009156 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00009157" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
9158endfun
9159
9160" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02009161" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
9162fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009163 if !exists("w:netrw_liststyle")
9164 let w:netrw_liststyle= g:netrw_liststyle
9165 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02009166" 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 +02009167
9168 if &ft != "netrw"
9169 " if the current window isn't a netrw directory listing window, then use user cursorline/column
9170 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaar15146672011-10-20 22:22:38 +02009171" call Decho("case ft!=netrw: use user cul,cuc")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009172 let &l:cursorline = s:netrw_usercul
9173 let &l:cursorcolumn = s:netrw_usercuc
9174
9175 elseif g:netrw_cursor == 4
9176 " all styles: cursorline, cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02009177" call Decho("case g:netrw_cursor==4: setl cul cuc")
9178 setl cursorline
9179 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02009180
9181 elseif g:netrw_cursor == 3
9182 " thin-long-tree: cursorline, user's cursorcolumn
9183 " wide : cursorline, cursorcolumn
9184 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02009185" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc")
Bram Moolenaar15146672011-10-20 22:22:38 +02009186 setl cursorline
9187 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02009188 else
Bram Moolenaarff034192013-04-24 18:51:19 +02009189" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)")
Bram Moolenaar15146672011-10-20 22:22:38 +02009190 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009191 let &l:cursorcolumn = s:netrw_usercuc
9192 endif
9193
9194 elseif g:netrw_cursor == 2
9195 " thin-long-tree: cursorline, user's cursorcolumn
9196 " wide : cursorline, user's cursorcolumn
Bram Moolenaarff034192013-04-24 18:51:19 +02009197" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009198 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +02009199 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009200
9201 elseif g:netrw_cursor == 1
9202 " thin-long-tree: user's cursorline, user's cursorcolumn
9203 " wide : cursorline, user's cursorcolumn
9204 let &l:cursorcolumn = s:netrw_usercuc
9205 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaarff034192013-04-24 18:51:19 +02009206" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)")
Bram Moolenaar15146672011-10-20 22:22:38 +02009207 set cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02009208 else
Bram Moolenaar15146672011-10-20 22:22:38 +02009209" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009210 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009211 endif
9212
9213 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02009214 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02009215" call Decho("default: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009216 let &l:cursorline = s:netrw_usercul
9217 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009218 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009219
9220" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009221endfun
9222
9223" ---------------------------------------------------------------------
9224" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
9225fun! s:RestoreCursorline()
9226" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02009227 if exists("s:netrw_usercul")
9228 let &l:cursorline = s:netrw_usercul
9229 endif
9230 if exists("s:netrw_usercuc")
9231 let &l:cursorcolumn = s:netrw_usercuc
9232 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009233" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
9234endfun
9235
9236" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009237" s:NetrwDelete: Deletes a file. {{{2
9238" Uses Steve Hall's idea to insure that Windows paths stay
9239" acceptable. No effect on Unix paths.
9240" Examples of use: let result= s:NetrwDelete(path)
9241fun! s:NetrwDelete(path)
9242" call Dfunc("s:NetrwDelete(path<".a:path.">)")
9243
Bram Moolenaar5c736222010-01-06 20:54:52 +01009244 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009245 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
9246 if exists("+shellslash")
9247 let sskeep= &shellslash
Bram Moolenaarff034192013-04-24 18:51:19 +02009248 setl noshellslash
Bram Moolenaarc236c162008-07-13 17:41:49 +00009249 let result = delete(path)
9250 let &shellslash = sskeep
9251 else
9252" call Decho("exe let result= ".a:cmd."('".path."')")
9253 let result= delete(path)
9254 endif
9255 else
9256" call Decho("let result= delete(".path.")")
9257 let result= delete(path)
9258 endif
9259 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02009260 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009261 endif
9262
9263" call Dret("s:NetrwDelete ".result)
9264 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00009265endfun
9266
9267" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009268" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01009269fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009270" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01009271" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009272
Bram Moolenaar446cb832008-06-24 21:56:24 +00009273 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009274" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009275 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
9276 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
9277 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
9278 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
9279 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9280 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
9281 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
9282 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
9283 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
9284 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9285 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
9286 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
9287 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
9288 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
9289 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
9290 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
9291
Bram Moolenaaradc21822011-04-01 18:03:16 +02009292 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009293" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009294 let netrw_keepdiff= &l:diff
Bram Moolenaaradc21822011-04-01 18:03:16 +02009295 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem goes away (beeps result, but who knows)
9296" call Dredir("Benzinger 1:","ls!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009297 keepj keepalt enew!
Bram Moolenaaradc21822011-04-01 18:03:16 +02009298" call Dredir("Benzinger 2:","ls!")
9299 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem remains.
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02009300 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009301" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02009302 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009303
Bram Moolenaar446cb832008-06-24 21:56:24 +00009304 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009305" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009306 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
9307 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
9308 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
9309 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
9310 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
9311 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
9312 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
9313 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
9314 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
9315 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
9316 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
9317 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
9318 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
9319 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
9320 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
9321 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
9322
Bram Moolenaar5c736222010-01-06 20:54:52 +01009323 if a:0 > 0
9324 let b:netrw_curdir= a:1
9325 if b:netrw_curdir =~ '/$'
9326 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
9327 file NetrwTreeListing
Bram Moolenaarff034192013-04-24 18:51:19 +02009328 set bt=nowrite noswf bh=hide
Bram Moolenaaradc21822011-04-01 18:03:16 +02009329 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
9330 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01009331 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009332 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009333 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009334 endif
9335 endif
9336
Bram Moolenaarff034192013-04-24 18:51:19 +02009337" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh)
Bram Moolenaar9964e462007-05-05 17:54:07 +00009338endfun
9339
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009340" ---------------------------------------------------------------------
9341" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
9342fun! s:NetrwInsureWinVars()
Bram Moolenaar97d62492012-11-15 21:28:22 +01009343" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009344 if !exists("w:netrw_liststyle")
9345 let curbuf = bufnr("%")
9346 let curwin = winnr()
9347 let iwin = 1
9348 while iwin <= winnr("$")
9349 exe iwin."wincmd w"
9350 if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
9351 " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
9352 let winvars= w:
9353 break
9354 endif
9355 let iwin= iwin + 1
9356 endwhile
Bram Moolenaarff034192013-04-24 18:51:19 +02009357 exe "keepalt ".curwin."wincmd w"
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009358 if exists("winvars")
9359" call Decho("copying w#".iwin." window variables to w#".curwin)
9360 for k in keys(winvars)
9361 let w:{k}= winvars[k]
9362 endfor
9363 endif
9364 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +01009365" call Dret("s:NetrwInsureWinVars win#".winnr())
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009366endfun
9367
Bram Moolenaar9964e462007-05-05 17:54:07 +00009368" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009369" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
9370" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
9371fun! s:NetrwSaveWordPosn()
9372" call Dfunc("NetrwSaveWordPosn()")
9373 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
9374" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
9375endfun
9376
9377" ---------------------------------------------------------------------
9378" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
9379" changed sorting, etc. Also see s:NetrwSaveWordPosn().
9380fun! s:NetrwRestoreWordPosn()
9381" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009382 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00009383" call Dret("NetrwRestoreWordPosn")
9384endfun
9385
9386" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009387" s:RestoreBufVars: {{{2
9388fun! s:RestoreBufVars()
9389" call Dfunc("s:RestoreBufVars()")
9390
9391 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
9392 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
9393 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
9394 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
9395 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
9396 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
9397
9398" call Dret("s:RestoreBufVars")
9399endfun
9400
9401" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009402" s:RemotePathAnalysis: {{{2
9403fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02009404" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00009405
9406 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
9407 let s:method = substitute(a:dirname,dirpat,'\1','')
9408 let s:user = substitute(a:dirname,dirpat,'\2','')
9409 let s:machine = substitute(a:dirname,dirpat,'\3','')
9410 let s:port = substitute(a:dirname,dirpat,'\4','')
9411 let s:path = substitute(a:dirname,dirpat,'\5','')
9412 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
9413
9414" call Decho("set up s:method <".s:method .">")
9415" call Decho("set up s:user <".s:user .">")
9416" call Decho("set up s:machine<".s:machine.">")
9417" call Decho("set up s:port <".s:port.">")
9418" call Decho("set up s:path <".s:path .">")
9419" call Decho("set up s:fname <".s:fname .">")
9420
9421" call Dret("s:RemotePathAnalysis")
9422endfun
9423
9424" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009425" s:RemoteSystem: runs a command on a remote host using ssh {{{2
9426" Returns status
9427" Runs system() on
9428" [cd REMOTEDIRPATH;] a:cmd
9429" Note that it doesn't do shellescape(a:cmd)!
9430fun! s:RemoteSystem(cmd)
9431" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
9432 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02009433 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 +00009434 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009435 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00009436 else
9437 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
9438 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
9439 if remotedir != ""
9440 let cmd= cmd.' cd '.shellescape(remotedir).";"
9441 else
9442 let cmd= cmd.' '
9443 endif
9444 let cmd= cmd.a:cmd
9445" call Decho("call system(".cmd.")")
9446 let ret= system(cmd)
9447 endif
9448" call Dret("s:RemoteSystem ".ret)
9449 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00009450endfun
9451
9452" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009453" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009454fun! s:RestoreWinVars()
9455" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00009456 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009457 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
9458 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
9459 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
9460 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
9461 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
9462 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
9463 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
9464 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
9465 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
9466 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
9467 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
9468 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00009469 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
9470 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00009471 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
9472 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
9473 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
9474" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00009475endfun
9476
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009477" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009478" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
9479"
9480" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
9481" is true) and a command, :Rexplore, which call this function.
9482"
9483" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
9484fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaarff034192013-04-24 18:51:19 +02009485 if exists("s:netrwdrag")
9486 return
9487 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009488" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02009489 if !exists("w:netrw_rexlocal")
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009490" " call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
Bram Moolenaar15146672011-10-20 22:22:38 +02009491 return
9492 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02009493 if w:netrw_rexlocal
9494 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009495 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02009496 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009497 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02009498 if exists("s:initbeval")
9499 set beval
9500 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +02009501 if exists("s:rexposn_".bufnr("%"))
9502" call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%'))
9503 keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')})
9504 unlet s:rexposn_{bufnr('%')}
9505 else
9506" call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist")
Bram Moolenaar446cb832008-06-24 21:56:24 +00009507 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009508 if exists("s:explore_match")
9509 exe "2match netrwMarkFile /".s:explore_match."/"
9510 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00009511" call Dret("s:NetrwRexplore")
9512endfun
9513
9514" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00009515" s:SaveBufVars: {{{2
9516fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009517" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00009518
9519 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
9520 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
9521 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
9522 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
9523 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
9524 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
9525
9526" call Dret("s:SaveBufVars")
9527endfun
9528
9529" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009530" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00009531fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009532" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00009533 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
9534 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
9535 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
9536 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
9537 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
9538 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
9539 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
9540 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
9541 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
9542 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
9543 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
9544 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
9545 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
9546 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
9547 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
9548 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
9549 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
9550 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
9551" call Dret("s:SaveWinVars")
9552endfun
9553
9554" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009555" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009556" To allow separate windows to have their own activities, such as
9557" Explore **/pattern, several variables have been made window-oriented.
9558" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009559" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009560" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009561fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01009562" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00009563 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
9564 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
9565 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
9566 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
9567 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
9568 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
9569 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
9570 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
9571 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
9572 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
9573" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009574endfun
9575
9576" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009577" s:SetRexDir: set directory for :Rexplore {{{2
9578fun! s:SetRexDir(islocal,dirname)
9579" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009580 let w:netrw_rexdir = a:dirname
9581 let w:netrw_rexlocal = a:islocal
Bram Moolenaar97d62492012-11-15 21:28:22 +01009582" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009583endfun
9584
9585" ---------------------------------------------------------------------
9586" s:Strlen: this function returns the length of a string, even if its {{{2
Bram Moolenaarff034192013-04-24 18:51:19 +02009587" using multiple-byte characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01009588" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
9589" and a bit from me.
9590" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00009591fun! s:Strlen(x)
9592" call Dfunc("s:Strlen(x<".a:x.">")
9593 if g:netrw_xstrlen == 1
9594 " number of codepoints (Latin a + combining circumflex is two codepoints)
9595 " (comment from TM, solution from NW)
9596 let ret= strlen(substitute(a:x,'.','c','g'))
9597
9598 elseif g:netrw_xstrlen == 2
9599 " number of spacing codepoints (Latin a + combining circumflex is one spacing
9600 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
9601 " (comment from TM, solution from TM)
9602 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
9603
9604 elseif g:netrw_xstrlen == 3
9605 " virtual length (counting, for instance, tabs as anything between 1 and
9606 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
9607 " preceded by lam, one otherwise, etc.)
9608 " (comment from TM, solution from me)
9609 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009610 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00009611 call setline(line("."),a:x)
9612 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009613 keepj d
Bram Moolenaarff034192013-04-24 18:51:19 +02009614 keepj norm! k
Bram Moolenaar446cb832008-06-24 21:56:24 +00009615 let &mod= modkeep
9616
9617 else
9618 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01009619 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00009620 endif
9621" call Dret("s:Strlen ".ret)
9622 return ret
9623endfun
9624
9625" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009626" s:TreeListMove: {{{2
9627fun! s:TreeListMove(dir)
9628" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
9629 let curline = getline('.')
9630 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
9631 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
9632 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
9633 let indentm1 = substitute(curindent,'^| ','','')
9634" call Decho("prvline <".prvline."> #".line(".")-1)
9635" call Decho("curline <".curline."> #".line("."))
9636" call Decho("nxtline <".nxtline."> #".line(".")+1)
9637" call Decho("curindent<".curindent.">")
9638" call Decho("indentm1 <".indentm1.">")
9639
9640 if curline !~ '/$'
9641" call Decho('regfile')
9642 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009643 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009644 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
9645" call Decho("regfile srch back: ".nl)
9646 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009647 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009648 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
9649" call Decho("regfile srch fwd: ".nl)
9650 endif
9651
9652 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009653 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00009654 let curline= line(".")
9655 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
9656" call Decho("dir srch back ind: ".nl)
9657 if nl != 0
9658 if line(".") == curline-1
9659 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
9660" call Decho("dir srch back ind-1: ".nl)
9661 endif
9662 endif
9663
9664 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02009665 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00009666 let curline = line(".")
9667 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
9668" call Decho("dir srch fwd ind: ".nl)
9669 if nl != 0
9670 if line(".") == curline+1
9671 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
9672" call Decho("dir srch fwd ind-1: ".nl)
9673 endif
9674 endif
9675
9676 endif
9677
9678" call Dret("s:TreeListMove")
9679endfun
9680
9681" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00009682" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
9683" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
9684" can't be called except via emenu. But due to locale, that menu line may not be called
9685" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
9686fun! s:UpdateBuffersMenu()
9687" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02009688 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009689 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02009690 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00009691 catch /^Vim\%((\a\+)\)\=:E/
9692 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02009693 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00009694 endtry
9695 endif
9696" call Dret("s:UpdateBuffersMenu")
9697endfun
9698
9699" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00009700" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02009701" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009702fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00009703" call Dfunc("s:UseBufWinVars()")
9704 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009705 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
9706 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
9707 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
9708 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
9709 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
9710 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9711 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
9712 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
9713 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 +00009714" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00009715endfun
9716
Bram Moolenaar1afcace2005-11-25 19:54:28 +00009717" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01009718" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
9719fun! netrw#WinPath(path)
9720" call Dfunc("netrw#WinPath(path<".a:path.">)")
9721 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
9722 " remove cygdrive prefix, if present
9723 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00009724 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01009725 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00009726 " remove escaped spaces
9727 let path = substitute(path, '\ ', ' ', 'g')
9728 " convert slashes to backslashes
9729 let path = substitute(path, '/', '\', 'g')
9730 else
9731 let path= a:path
9732 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01009733" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00009734 return path
9735endfun
9736
9737" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00009738" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00009739let &cpo= s:keepcpo
9740unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00009741
Bram Moolenaar071d4272004-06-13 20:20:40 +00009742" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00009743" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00009744" vim:ts=8 fdm=marker